xref: /openbmc/linux/include/linux/isa.h (revision 85ebe0af)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2a5117ba7SRene Herman /*
3a5117ba7SRene Herman  * ISA bus.
4a5117ba7SRene Herman  */
5a5117ba7SRene Herman 
6a5117ba7SRene Herman #ifndef __LINUX_ISA_H
7a5117ba7SRene Herman #define __LINUX_ISA_H
8a5117ba7SRene Herman 
9a5117ba7SRene Herman #include <linux/device.h>
105e25db87SWilliam Breathitt Gray #include <linux/errno.h>
11a5117ba7SRene Herman #include <linux/kernel.h>
12a5117ba7SRene Herman 
13a5117ba7SRene Herman struct isa_driver {
14a5117ba7SRene Herman 	int (*match)(struct device *, unsigned int);
15a5117ba7SRene Herman 	int (*probe)(struct device *, unsigned int);
1630e88d01SUwe Kleine-König 	void (*remove)(struct device *, unsigned int);
17a5117ba7SRene Herman 	void (*shutdown)(struct device *, unsigned int);
18a5117ba7SRene Herman 	int (*suspend)(struct device *, unsigned int, pm_message_t);
19a5117ba7SRene Herman 	int (*resume)(struct device *, unsigned int);
20a5117ba7SRene Herman 
21a5117ba7SRene Herman 	struct device_driver driver;
22a5117ba7SRene Herman 	struct device *devices;
23a5117ba7SRene Herman };
24a5117ba7SRene Herman 
25a5117ba7SRene Herman #define to_isa_driver(x) container_of((x), struct isa_driver, driver)
26a5117ba7SRene Herman 
273a495511SWilliam Breathitt Gray #ifdef CONFIG_ISA_BUS_API
28a5117ba7SRene Herman int isa_register_driver(struct isa_driver *, unsigned int);
29a5117ba7SRene Herman void isa_unregister_driver(struct isa_driver *);
30fa890d58SMatthew Wilcox #else
isa_register_driver(struct isa_driver * d,unsigned int i)31fa890d58SMatthew Wilcox static inline int isa_register_driver(struct isa_driver *d, unsigned int i)
32fa890d58SMatthew Wilcox {
335e25db87SWilliam Breathitt Gray 	return -ENODEV;
34fa890d58SMatthew Wilcox }
35fa890d58SMatthew Wilcox 
isa_unregister_driver(struct isa_driver * d)36fa890d58SMatthew Wilcox static inline void isa_unregister_driver(struct isa_driver *d)
37fa890d58SMatthew Wilcox {
38fa890d58SMatthew Wilcox }
39fa890d58SMatthew Wilcox #endif
40a5117ba7SRene Herman 
41*85ebe0afSWilliam Breathitt Gray #define module_isa_driver_init(__isa_driver, __num_isa_dev) \
42*85ebe0afSWilliam Breathitt Gray static int __init __isa_driver##_init(void) \
43*85ebe0afSWilliam Breathitt Gray { \
44*85ebe0afSWilliam Breathitt Gray 	return isa_register_driver(&(__isa_driver), __num_isa_dev); \
45*85ebe0afSWilliam Breathitt Gray } \
46*85ebe0afSWilliam Breathitt Gray module_init(__isa_driver##_init)
47*85ebe0afSWilliam Breathitt Gray 
48*85ebe0afSWilliam Breathitt Gray #define module_isa_driver_with_irq_init(__isa_driver, __num_isa_dev, __num_irq) \
49*85ebe0afSWilliam Breathitt Gray static int __init __isa_driver##_init(void) \
50*85ebe0afSWilliam Breathitt Gray { \
51*85ebe0afSWilliam Breathitt Gray 	if (__num_irq != __num_isa_dev) { \
52*85ebe0afSWilliam Breathitt Gray 		pr_err("%s: Number of irq (%u) does not match number of base (%u)\n", \
53*85ebe0afSWilliam Breathitt Gray 		       __isa_driver.driver.name, __num_irq, __num_isa_dev); \
54*85ebe0afSWilliam Breathitt Gray 		return -EINVAL; \
55*85ebe0afSWilliam Breathitt Gray 	} \
56*85ebe0afSWilliam Breathitt Gray 	return isa_register_driver(&(__isa_driver), __num_isa_dev); \
57*85ebe0afSWilliam Breathitt Gray } \
58*85ebe0afSWilliam Breathitt Gray module_init(__isa_driver##_init)
59*85ebe0afSWilliam Breathitt Gray 
60*85ebe0afSWilliam Breathitt Gray #define module_isa_driver_exit(__isa_driver) \
61*85ebe0afSWilliam Breathitt Gray static void __exit __isa_driver##_exit(void) \
62*85ebe0afSWilliam Breathitt Gray { \
63*85ebe0afSWilliam Breathitt Gray 	isa_unregister_driver(&(__isa_driver)); \
64*85ebe0afSWilliam Breathitt Gray } \
65*85ebe0afSWilliam Breathitt Gray module_exit(__isa_driver##_exit)
66*85ebe0afSWilliam Breathitt Gray 
67339e6e31SWilliam Breathitt Gray /**
68339e6e31SWilliam Breathitt Gray  * module_isa_driver() - Helper macro for registering a ISA driver
69339e6e31SWilliam Breathitt Gray  * @__isa_driver: isa_driver struct
70339e6e31SWilliam Breathitt Gray  * @__num_isa_dev: number of devices to register
71339e6e31SWilliam Breathitt Gray  *
72339e6e31SWilliam Breathitt Gray  * Helper macro for ISA drivers which do not do anything special in module
73339e6e31SWilliam Breathitt Gray  * init/exit. This eliminates a lot of boilerplate code. Each module may only
74339e6e31SWilliam Breathitt Gray  * use this macro once, and calling it replaces module_init and module_exit.
75339e6e31SWilliam Breathitt Gray  */
76339e6e31SWilliam Breathitt Gray #define module_isa_driver(__isa_driver, __num_isa_dev) \
77*85ebe0afSWilliam Breathitt Gray module_isa_driver_init(__isa_driver, __num_isa_dev); \
78*85ebe0afSWilliam Breathitt Gray module_isa_driver_exit(__isa_driver)
79*85ebe0afSWilliam Breathitt Gray 
80*85ebe0afSWilliam Breathitt Gray /**
81*85ebe0afSWilliam Breathitt Gray  * module_isa_driver_with_irq() - Helper macro for registering an ISA driver with irq
82*85ebe0afSWilliam Breathitt Gray  * @__isa_driver: isa_driver struct
83*85ebe0afSWilliam Breathitt Gray  * @__num_isa_dev: number of devices to register
84*85ebe0afSWilliam Breathitt Gray  * @__num_irq: number of IRQ to register
85*85ebe0afSWilliam Breathitt Gray  *
86*85ebe0afSWilliam Breathitt Gray  * Helper macro for ISA drivers with irq that do not do anything special in
87*85ebe0afSWilliam Breathitt Gray  * module init/exit. Each module may only use this macro once, and calling it
88*85ebe0afSWilliam Breathitt Gray  * replaces module_init and module_exit.
89*85ebe0afSWilliam Breathitt Gray  */
90*85ebe0afSWilliam Breathitt Gray #define module_isa_driver_with_irq(__isa_driver, __num_isa_dev, __num_irq) \
91*85ebe0afSWilliam Breathitt Gray module_isa_driver_with_irq_init(__isa_driver, __num_isa_dev, __num_irq); \
92*85ebe0afSWilliam Breathitt Gray module_isa_driver_exit(__isa_driver)
93339e6e31SWilliam Breathitt Gray 
94d9a9c617SWilliam Breathitt Gray /**
95d9a9c617SWilliam Breathitt Gray  * max_num_isa_dev() - Maximum possible number registered of an ISA device
96d9a9c617SWilliam Breathitt Gray  * @__ida_dev_ext: ISA device address extent
97d9a9c617SWilliam Breathitt Gray  *
98d9a9c617SWilliam Breathitt Gray  * The highest base address possible for an ISA device is 0x3FF; this results in
99d9a9c617SWilliam Breathitt Gray  * 1024 possible base addresses. Dividing the number of possible base addresses
100d9a9c617SWilliam Breathitt Gray  * by the address extent taken by each device results in the maximum number of
101d9a9c617SWilliam Breathitt Gray  * devices on a system.
102d9a9c617SWilliam Breathitt Gray  */
103d9a9c617SWilliam Breathitt Gray #define max_num_isa_dev(__isa_dev_ext) (1024 / __isa_dev_ext)
104d9a9c617SWilliam Breathitt Gray 
105a5117ba7SRene Herman #endif /* __LINUX_ISA_H */
106