1
2
3
4
5
6
7
8#ifndef _LINUX_MCB_H
9#define _LINUX_MCB_H
10
11#include <linux/mod_devicetable.h>
12#include <linux/device.h>
13#include <linux/irqreturn.h>
14
15#define CHAMELEON_FILENAME_LEN 12
16
17struct mcb_driver;
18struct mcb_device;
19
20
21
22
23
24
25
26
27
28
29
30
31struct mcb_bus {
32 struct device dev;
33 struct device *carrier;
34 int bus_nr;
35 u8 revision;
36 char model;
37 u8 minor;
38 char name[CHAMELEON_FILENAME_LEN + 1];
39 int (*get_irq)(struct mcb_device *dev);
40};
41
42static inline struct mcb_bus *to_mcb_bus(struct device *dev)
43{
44 return container_of(dev, struct mcb_bus, dev);
45}
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63struct mcb_device {
64 struct device dev;
65 struct mcb_bus *bus;
66 bool is_added;
67 struct mcb_driver *driver;
68 u16 id;
69 int inst;
70 int group;
71 int var;
72 int bar;
73 int rev;
74 struct resource irq;
75 struct resource mem;
76 struct device *dma_dev;
77};
78
79static inline struct mcb_device *to_mcb_device(struct device *dev)
80{
81 return container_of(dev, struct mcb_device, dev);
82}
83
84
85
86
87
88
89
90
91
92
93struct mcb_driver {
94 struct device_driver driver;
95 const struct mcb_device_id *id_table;
96 int (*probe)(struct mcb_device *mdev, const struct mcb_device_id *id);
97 void (*remove)(struct mcb_device *mdev);
98 void (*shutdown)(struct mcb_device *mdev);
99};
100
101static inline struct mcb_driver *to_mcb_driver(struct device_driver *drv)
102{
103 return container_of(drv, struct mcb_driver, driver);
104}
105
106static inline void *mcb_get_drvdata(struct mcb_device *dev)
107{
108 return dev_get_drvdata(&dev->dev);
109}
110
111static inline void mcb_set_drvdata(struct mcb_device *dev, void *data)
112{
113 dev_set_drvdata(&dev->dev, data);
114}
115
116extern int __must_check __mcb_register_driver(struct mcb_driver *drv,
117 struct module *owner,
118 const char *mod_name);
119#define mcb_register_driver(driver) \
120 __mcb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
121extern void mcb_unregister_driver(struct mcb_driver *driver);
122#define module_mcb_driver(__mcb_driver) \
123 module_driver(__mcb_driver, mcb_register_driver, mcb_unregister_driver);
124extern void mcb_bus_add_devices(const struct mcb_bus *bus);
125extern int mcb_device_register(struct mcb_bus *bus, struct mcb_device *dev);
126extern struct mcb_bus *mcb_alloc_bus(struct device *carrier);
127extern struct mcb_bus *mcb_bus_get(struct mcb_bus *bus);
128extern void mcb_bus_put(struct mcb_bus *bus);
129extern struct mcb_device *mcb_alloc_dev(struct mcb_bus *bus);
130extern void mcb_free_dev(struct mcb_device *dev);
131extern void mcb_release_bus(struct mcb_bus *bus);
132extern struct resource *mcb_request_mem(struct mcb_device *dev,
133 const char *name);
134extern void mcb_release_mem(struct resource *mem);
135extern int mcb_get_irq(struct mcb_device *dev);
136extern struct resource *mcb_get_resource(struct mcb_device *dev,
137 unsigned int type);
138
139#endif
140