5 #include <linux/device.h>
6 #include <linux/kernel.h>
7 #include <linux/slab.h>
8 #include <linux/module.h>
9 #include <linux/init.h>
10 #include <linux/isa.h>
12 static struct device isa_bus
= {
22 #define to_isa_dev(x) container_of((x), struct isa_dev, dev)
24 static int isa_bus_match(struct device
*dev
, struct device_driver
*driver
)
26 struct isa_driver
*isa_driver
= to_isa_driver(driver
);
28 if (dev
->platform_data
== isa_driver
) {
29 if (!isa_driver
->match
||
30 isa_driver
->match(dev
, to_isa_dev(dev
)->id
))
32 dev
->platform_data
= NULL
;
37 static int isa_bus_probe(struct device
*dev
)
39 struct isa_driver
*isa_driver
= dev
->platform_data
;
41 if (isa_driver
->probe
)
42 return isa_driver
->probe(dev
, to_isa_dev(dev
)->id
);
47 static int isa_bus_remove(struct device
*dev
)
49 struct isa_driver
*isa_driver
= dev
->platform_data
;
51 if (isa_driver
->remove
)
52 return isa_driver
->remove(dev
, to_isa_dev(dev
)->id
);
57 static void isa_bus_shutdown(struct device
*dev
)
59 struct isa_driver
*isa_driver
= dev
->platform_data
;
61 if (isa_driver
->shutdown
)
62 isa_driver
->shutdown(dev
, to_isa_dev(dev
)->id
);
65 static int isa_bus_suspend(struct device
*dev
, pm_message_t state
)
67 struct isa_driver
*isa_driver
= dev
->platform_data
;
69 if (isa_driver
->suspend
)
70 return isa_driver
->suspend(dev
, to_isa_dev(dev
)->id
, state
);
75 static int isa_bus_resume(struct device
*dev
)
77 struct isa_driver
*isa_driver
= dev
->platform_data
;
79 if (isa_driver
->resume
)
80 return isa_driver
->resume(dev
, to_isa_dev(dev
)->id
);
85 static struct bus_type isa_bus_type
= {
87 .match
= isa_bus_match
,
88 .probe
= isa_bus_probe
,
89 .remove
= isa_bus_remove
,
90 .shutdown
= isa_bus_shutdown
,
91 .suspend
= isa_bus_suspend
,
92 .resume
= isa_bus_resume
95 static void isa_dev_release(struct device
*dev
)
97 kfree(to_isa_dev(dev
));
100 void isa_unregister_driver(struct isa_driver
*isa_driver
)
102 struct device
*dev
= isa_driver
->devices
;
105 struct device
*tmp
= to_isa_dev(dev
)->next
;
106 device_unregister(dev
);
109 driver_unregister(&isa_driver
->driver
);
111 EXPORT_SYMBOL_GPL(isa_unregister_driver
);
113 int isa_register_driver(struct isa_driver
*isa_driver
, unsigned int ndev
)
118 isa_driver
->driver
.bus
= &isa_bus_type
;
119 isa_driver
->devices
= NULL
;
121 error
= driver_register(&isa_driver
->driver
);
125 for (id
= 0; id
< ndev
; id
++) {
126 struct isa_dev
*isa_dev
;
128 isa_dev
= kzalloc(sizeof *isa_dev
, GFP_KERNEL
);
134 isa_dev
->dev
.parent
= &isa_bus
;
135 isa_dev
->dev
.bus
= &isa_bus_type
;
137 snprintf(isa_dev
->dev
.bus_id
, BUS_ID_SIZE
, "%s.%u",
138 isa_driver
->driver
.name
, id
);
140 isa_dev
->dev
.platform_data
= isa_driver
;
141 isa_dev
->dev
.release
= isa_dev_release
;
144 error
= device_register(&isa_dev
->dev
);
146 put_device(&isa_dev
->dev
);
150 if (isa_dev
->dev
.platform_data
) {
151 isa_dev
->next
= isa_driver
->devices
;
152 isa_driver
->devices
= &isa_dev
->dev
;
154 device_unregister(&isa_dev
->dev
);
157 if (!error
&& !isa_driver
->devices
)
161 isa_unregister_driver(isa_driver
);
165 EXPORT_SYMBOL_GPL(isa_register_driver
);
167 static int __init
isa_bus_init(void)
171 error
= bus_register(&isa_bus_type
);
173 error
= device_register(&isa_bus
);
175 bus_unregister(&isa_bus_type
);
180 device_initcall(isa_bus_init
);