Commit | Line | Data |
---|---|---|
fd534e9b | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
55e331cf FF |
2 | /* |
3 | * Copyright (C) 2006, 2007 Eugene Konev <ejka@openwrt.org> | |
55e331cf FF |
4 | */ |
5 | ||
6 | #ifndef __VLYNQ_H__ | |
7 | #define __VLYNQ_H__ | |
8 | ||
9 | #include <linux/device.h> | |
55e331cf FF |
10 | #include <linux/types.h> |
11 | ||
de477254 PG |
12 | struct module; |
13 | ||
55e331cf FF |
14 | #define VLYNQ_NUM_IRQS 32 |
15 | ||
16 | struct vlynq_mapping { | |
17 | u32 size; | |
18 | u32 offset; | |
19 | }; | |
20 | ||
21 | enum vlynq_divisor { | |
22 | vlynq_div_auto = 0, | |
23 | vlynq_ldiv1, | |
24 | vlynq_ldiv2, | |
25 | vlynq_ldiv3, | |
26 | vlynq_ldiv4, | |
27 | vlynq_ldiv5, | |
28 | vlynq_ldiv6, | |
29 | vlynq_ldiv7, | |
30 | vlynq_ldiv8, | |
31 | vlynq_rdiv1, | |
32 | vlynq_rdiv2, | |
33 | vlynq_rdiv3, | |
34 | vlynq_rdiv4, | |
35 | vlynq_rdiv5, | |
36 | vlynq_rdiv6, | |
37 | vlynq_rdiv7, | |
38 | vlynq_rdiv8, | |
39 | vlynq_div_external | |
40 | }; | |
41 | ||
42 | struct vlynq_device_id { | |
43 | u32 id; | |
44 | enum vlynq_divisor divisor; | |
45 | unsigned long driver_data; | |
46 | }; | |
47 | ||
48 | struct vlynq_regs; | |
49 | struct vlynq_device { | |
50 | u32 id, dev_id; | |
51 | int local_irq; | |
52 | int remote_irq; | |
53 | enum vlynq_divisor divisor; | |
54 | u32 regs_start, regs_end; | |
55 | u32 mem_start, mem_end; | |
56 | u32 irq_start, irq_end; | |
57 | int irq; | |
58 | int enabled; | |
59 | struct vlynq_regs *local; | |
60 | struct vlynq_regs *remote; | |
61 | struct device dev; | |
62 | }; | |
63 | ||
64 | struct vlynq_driver { | |
65 | char *name; | |
66 | struct vlynq_device_id *id_table; | |
67 | int (*probe)(struct vlynq_device *dev, struct vlynq_device_id *id); | |
68 | void (*remove)(struct vlynq_device *dev); | |
69 | struct device_driver driver; | |
70 | }; | |
71 | ||
72 | struct plat_vlynq_ops { | |
73 | int (*on)(struct vlynq_device *dev); | |
74 | void (*off)(struct vlynq_device *dev); | |
75 | }; | |
76 | ||
77 | static inline struct vlynq_driver *to_vlynq_driver(struct device_driver *drv) | |
78 | { | |
79 | return container_of(drv, struct vlynq_driver, driver); | |
80 | } | |
81 | ||
82 | static inline struct vlynq_device *to_vlynq_device(struct device *device) | |
83 | { | |
84 | return container_of(device, struct vlynq_device, dev); | |
85 | } | |
86 | ||
87 | extern struct bus_type vlynq_bus_type; | |
88 | ||
89 | extern int __vlynq_register_driver(struct vlynq_driver *driver, | |
90 | struct module *owner); | |
91 | ||
92 | static inline int vlynq_register_driver(struct vlynq_driver *driver) | |
93 | { | |
94 | return __vlynq_register_driver(driver, THIS_MODULE); | |
95 | } | |
96 | ||
97 | static inline void *vlynq_get_drvdata(struct vlynq_device *dev) | |
98 | { | |
99 | return dev_get_drvdata(&dev->dev); | |
100 | } | |
101 | ||
102 | static inline void vlynq_set_drvdata(struct vlynq_device *dev, void *data) | |
103 | { | |
104 | dev_set_drvdata(&dev->dev, data); | |
105 | } | |
106 | ||
107 | static inline u32 vlynq_mem_start(struct vlynq_device *dev) | |
108 | { | |
109 | return dev->mem_start; | |
110 | } | |
111 | ||
112 | static inline u32 vlynq_mem_end(struct vlynq_device *dev) | |
113 | { | |
114 | return dev->mem_end; | |
115 | } | |
116 | ||
117 | static inline u32 vlynq_mem_len(struct vlynq_device *dev) | |
118 | { | |
119 | return dev->mem_end - dev->mem_start + 1; | |
120 | } | |
121 | ||
122 | static inline int vlynq_virq_to_irq(struct vlynq_device *dev, int virq) | |
123 | { | |
124 | int irq = dev->irq_start + virq; | |
125 | if ((irq < dev->irq_start) || (irq > dev->irq_end)) | |
126 | return -EINVAL; | |
127 | ||
128 | return irq; | |
129 | } | |
130 | ||
131 | static inline int vlynq_irq_to_virq(struct vlynq_device *dev, int irq) | |
132 | { | |
133 | if ((irq < dev->irq_start) || (irq > dev->irq_end)) | |
134 | return -EINVAL; | |
135 | ||
136 | return irq - dev->irq_start; | |
137 | } | |
138 | ||
139 | extern void vlynq_unregister_driver(struct vlynq_driver *driver); | |
140 | extern int vlynq_enable_device(struct vlynq_device *dev); | |
141 | extern void vlynq_disable_device(struct vlynq_device *dev); | |
142 | extern int vlynq_set_local_mapping(struct vlynq_device *dev, u32 tx_offset, | |
143 | struct vlynq_mapping *mapping); | |
144 | extern int vlynq_set_remote_mapping(struct vlynq_device *dev, u32 tx_offset, | |
145 | struct vlynq_mapping *mapping); | |
146 | extern int vlynq_set_local_irq(struct vlynq_device *dev, int virq); | |
147 | extern int vlynq_set_remote_irq(struct vlynq_device *dev, int virq); | |
148 | ||
149 | #endif /* __VLYNQ_H__ */ |