Deleted Added
full compact
scd_isa.c (113581) scd_isa.c (119419)
1/*
1/*
2 * $FreeBSD: head/sys/dev/scd/scd_isa.c 113581 2003-04-16 20:57:35Z phk $
3 */
4
2 */
3
4#include <sys/cdefs.h>
5__FBSDID("$FreeBSD: head/sys/dev/scd/scd_isa.c 119419 2003-08-24 18:03:45Z obrien $");
6
5#include <sys/param.h>
6#include <sys/systm.h>
7#include <sys/kernel.h>
8#include <sys/module.h>
9#include <sys/conf.h>
10#include <sys/fcntl.h>
11#include <sys/bio.h>
12#include <sys/cdio.h>
13#include <sys/bus.h>
14
15#include <sys/mutex.h>
16
17#include <machine/bus_pio.h>
18#include <machine/bus.h>
19#include <machine/resource.h>
20#include <sys/rman.h>
21
22#include <isa/isavar.h>
23
24#include <dev/scd/scdreg.h>
25#include <dev/scd/scdvar.h>
26
27static int scd_isa_probe (device_t);
28static int scd_isa_attach (device_t);
29static int scd_isa_detach (device_t);
30
31static int scd_alloc_resources (device_t);
32static void scd_release_resources (device_t);
33
34static int
35scd_isa_probe (device_t dev)
36{
37 struct scd_softc * sc;
38 int error;
39
40 /* No pnp support */
41 if (isa_get_vendorid(dev))
42 return (ENXIO);
43
44 /* IO port must be configured. */
45 if (bus_get_resource_start(dev, SYS_RES_IOPORT, 0) == 0)
46 return (ENXIO);
47
48 sc = device_get_softc(dev);
49 sc->dev = dev;
50 sc->port_rid = 0;
51 sc->port_type = SYS_RES_IOPORT;
52 error = scd_alloc_resources(dev);
53 if (error)
54 goto fail;
55
56 error = scd_probe(sc);
57 if (error) {
58 device_printf(dev, "Probe failed.\n");
59 goto fail;
60 }
61
62 device_set_desc(dev, sc->data.name);
63
64fail:
65 scd_release_resources(dev);
66 return (error);
67}
68
69static int
70scd_isa_attach (device_t dev)
71{
72 struct scd_softc * sc;
73 int error;
74
75 sc = device_get_softc(dev);
76 error = 0;
77
78 sc->dev = dev;
79 sc->port_rid = 0;
80 sc->port_type = SYS_RES_IOPORT;
81 error = scd_alloc_resources(dev);
82 if (error)
83 goto fail;
84
85 error = scd_probe(sc);
86 if (error) {
87 device_printf(dev, "Re-Probe failed.\n");
88 goto fail;
89 }
90
91 error = scd_attach(sc);
92 if (error) {
93 device_printf(dev, "Attach failed.\n");
94 goto fail;
95 }
96
97 return (0);
98fail:
99 scd_release_resources(dev);
100 return (error);
101}
102
103static int
104scd_isa_detach (device_t dev)
105{
106 struct scd_softc * sc;
107 int error;
108
109 sc = device_get_softc(dev);
110 error = 0;
111
112 destroy_dev(sc->scd_dev_t);
113
114 scd_release_resources(dev);
115
116 return (error);
117}
118
119static int
120scd_alloc_resources (device_t dev)
121{
122 struct scd_softc * sc;
123 int error;
124
125 sc = device_get_softc(dev);
126 error = 0;
127
128 if (sc->port_type) {
129 sc->port = bus_alloc_resource(dev, sc->port_type, &sc->port_rid,
130 0, ~0, 1, RF_ACTIVE);
131 if (sc->port == NULL) {
132 device_printf(dev, "Unable to allocate PORT resource.\n");
133 error = ENOMEM;
134 goto bad;
135 }
136 sc->port_bst = rman_get_bustag(sc->port);
137 sc->port_bsh = rman_get_bushandle(sc->port);
138 }
139
140 mtx_init(&sc->mtx, device_get_nameunit(dev),
141 "Interrupt lock", MTX_DEF | MTX_RECURSE);
142
143bad:
144 return (error);
145}
146
147void
148scd_release_resources (device_t dev)
149{
150 struct scd_softc * sc;
151
152 sc = device_get_softc(dev);
153
154 if (sc->port) {
155 bus_release_resource(dev, sc->port_type, sc->port_rid, sc->port);
156 sc->port_bst = 0;
157 sc->port_bsh = 0;
158 }
159
160 if (mtx_initialized(&sc->mtx) != 0)
161 mtx_destroy(&sc->mtx);
162
163 return;
164}
165
166static device_method_t scd_isa_methods[] = {
167 DEVMETHOD(device_probe, scd_isa_probe),
168 DEVMETHOD(device_attach, scd_isa_attach),
169 DEVMETHOD(device_detach, scd_isa_detach),
170
171 { 0, 0 }
172};
173
174static driver_t scd_isa_driver = {
175 "scd",
176 scd_isa_methods,
177 sizeof(struct scd_softc)
178};
179
180static devclass_t scd_devclass;
181
182DRIVER_MODULE(scd, isa, scd_isa_driver, scd_devclass, NULL, 0);
7#include <sys/param.h>
8#include <sys/systm.h>
9#include <sys/kernel.h>
10#include <sys/module.h>
11#include <sys/conf.h>
12#include <sys/fcntl.h>
13#include <sys/bio.h>
14#include <sys/cdio.h>
15#include <sys/bus.h>
16
17#include <sys/mutex.h>
18
19#include <machine/bus_pio.h>
20#include <machine/bus.h>
21#include <machine/resource.h>
22#include <sys/rman.h>
23
24#include <isa/isavar.h>
25
26#include <dev/scd/scdreg.h>
27#include <dev/scd/scdvar.h>
28
29static int scd_isa_probe (device_t);
30static int scd_isa_attach (device_t);
31static int scd_isa_detach (device_t);
32
33static int scd_alloc_resources (device_t);
34static void scd_release_resources (device_t);
35
36static int
37scd_isa_probe (device_t dev)
38{
39 struct scd_softc * sc;
40 int error;
41
42 /* No pnp support */
43 if (isa_get_vendorid(dev))
44 return (ENXIO);
45
46 /* IO port must be configured. */
47 if (bus_get_resource_start(dev, SYS_RES_IOPORT, 0) == 0)
48 return (ENXIO);
49
50 sc = device_get_softc(dev);
51 sc->dev = dev;
52 sc->port_rid = 0;
53 sc->port_type = SYS_RES_IOPORT;
54 error = scd_alloc_resources(dev);
55 if (error)
56 goto fail;
57
58 error = scd_probe(sc);
59 if (error) {
60 device_printf(dev, "Probe failed.\n");
61 goto fail;
62 }
63
64 device_set_desc(dev, sc->data.name);
65
66fail:
67 scd_release_resources(dev);
68 return (error);
69}
70
71static int
72scd_isa_attach (device_t dev)
73{
74 struct scd_softc * sc;
75 int error;
76
77 sc = device_get_softc(dev);
78 error = 0;
79
80 sc->dev = dev;
81 sc->port_rid = 0;
82 sc->port_type = SYS_RES_IOPORT;
83 error = scd_alloc_resources(dev);
84 if (error)
85 goto fail;
86
87 error = scd_probe(sc);
88 if (error) {
89 device_printf(dev, "Re-Probe failed.\n");
90 goto fail;
91 }
92
93 error = scd_attach(sc);
94 if (error) {
95 device_printf(dev, "Attach failed.\n");
96 goto fail;
97 }
98
99 return (0);
100fail:
101 scd_release_resources(dev);
102 return (error);
103}
104
105static int
106scd_isa_detach (device_t dev)
107{
108 struct scd_softc * sc;
109 int error;
110
111 sc = device_get_softc(dev);
112 error = 0;
113
114 destroy_dev(sc->scd_dev_t);
115
116 scd_release_resources(dev);
117
118 return (error);
119}
120
121static int
122scd_alloc_resources (device_t dev)
123{
124 struct scd_softc * sc;
125 int error;
126
127 sc = device_get_softc(dev);
128 error = 0;
129
130 if (sc->port_type) {
131 sc->port = bus_alloc_resource(dev, sc->port_type, &sc->port_rid,
132 0, ~0, 1, RF_ACTIVE);
133 if (sc->port == NULL) {
134 device_printf(dev, "Unable to allocate PORT resource.\n");
135 error = ENOMEM;
136 goto bad;
137 }
138 sc->port_bst = rman_get_bustag(sc->port);
139 sc->port_bsh = rman_get_bushandle(sc->port);
140 }
141
142 mtx_init(&sc->mtx, device_get_nameunit(dev),
143 "Interrupt lock", MTX_DEF | MTX_RECURSE);
144
145bad:
146 return (error);
147}
148
149void
150scd_release_resources (device_t dev)
151{
152 struct scd_softc * sc;
153
154 sc = device_get_softc(dev);
155
156 if (sc->port) {
157 bus_release_resource(dev, sc->port_type, sc->port_rid, sc->port);
158 sc->port_bst = 0;
159 sc->port_bsh = 0;
160 }
161
162 if (mtx_initialized(&sc->mtx) != 0)
163 mtx_destroy(&sc->mtx);
164
165 return;
166}
167
168static device_method_t scd_isa_methods[] = {
169 DEVMETHOD(device_probe, scd_isa_probe),
170 DEVMETHOD(device_attach, scd_isa_attach),
171 DEVMETHOD(device_detach, scd_isa_detach),
172
173 { 0, 0 }
174};
175
176static driver_t scd_isa_driver = {
177 "scd",
178 scd_isa_methods,
179 sizeof(struct scd_softc)
180};
181
182static devclass_t scd_devclass;
183
184DRIVER_MODULE(scd, isa, scd_isa_driver, scd_devclass, NULL, 0);