1
2
3
4
5
6
7
8
9
10
11#ifndef ASMARM_AMBA_H
12#define ASMARM_AMBA_H
13
14#include <linux/clk.h>
15#include <linux/device.h>
16#include <linux/mod_devicetable.h>
17#include <linux/err.h>
18#include <linux/resource.h>
19#include <linux/regulator/consumer.h>
20
21#define AMBA_NR_IRQS 9
22#define AMBA_CID 0xb105f00d
23#define CORESIGHT_CID 0xb105900d
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51struct amba_cs_uci_id {
52 unsigned int devarch;
53 unsigned int devarch_mask;
54 unsigned int devtype;
55 void *data;
56};
57
58
59#define UCI_REG_DEVTYPE_OFFSET 0xFCC
60#define UCI_REG_DEVARCH_OFFSET 0xFBC
61
62struct clk;
63
64struct amba_device {
65 struct device dev;
66 struct resource res;
67 struct clk *pclk;
68 struct device_dma_parameters dma_parms;
69 unsigned int periphid;
70 unsigned int cid;
71 struct amba_cs_uci_id uci;
72 unsigned int irq[AMBA_NR_IRQS];
73 char *driver_override;
74};
75
76struct amba_driver {
77 struct device_driver drv;
78 int (*probe)(struct amba_device *, const struct amba_id *);
79 void (*remove)(struct amba_device *);
80 void (*shutdown)(struct amba_device *);
81 const struct amba_id *id_table;
82};
83
84
85
86
87
88enum amba_vendor {
89 AMBA_VENDOR_ARM = 0x41,
90 AMBA_VENDOR_ST = 0x80,
91 AMBA_VENDOR_QCOM = 0x51,
92 AMBA_VENDOR_LSI = 0xb6,
93 AMBA_VENDOR_LINUX = 0xfe,
94};
95
96
97#define AMBA_LINUX_ID(conf, rev, part) \
98 (((conf) & 0xff) << 24 | ((rev) & 0xf) << 20 | \
99 AMBA_VENDOR_LINUX << 12 | ((part) & 0xfff))
100
101extern struct bus_type amba_bustype;
102
103#define to_amba_device(d) container_of(d, struct amba_device, dev)
104
105#define amba_get_drvdata(d) dev_get_drvdata(&d->dev)
106#define amba_set_drvdata(d,p) dev_set_drvdata(&d->dev, p)
107
108#ifdef CONFIG_ARM_AMBA
109int amba_driver_register(struct amba_driver *);
110void amba_driver_unregister(struct amba_driver *);
111#else
112static inline int amba_driver_register(struct amba_driver *drv)
113{
114 return -EINVAL;
115}
116static inline void amba_driver_unregister(struct amba_driver *drv)
117{
118}
119#endif
120
121struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
122void amba_device_put(struct amba_device *);
123int amba_device_add(struct amba_device *, struct resource *);
124int amba_device_register(struct amba_device *, struct resource *);
125struct amba_device *amba_apb_device_add(struct device *parent, const char *name,
126 resource_size_t base, size_t size,
127 int irq1, int irq2, void *pdata,
128 unsigned int periphid);
129struct amba_device *amba_ahb_device_add(struct device *parent, const char *name,
130 resource_size_t base, size_t size,
131 int irq1, int irq2, void *pdata,
132 unsigned int periphid);
133struct amba_device *
134amba_apb_device_add_res(struct device *parent, const char *name,
135 resource_size_t base, size_t size, int irq1,
136 int irq2, void *pdata, unsigned int periphid,
137 struct resource *resbase);
138struct amba_device *
139amba_ahb_device_add_res(struct device *parent, const char *name,
140 resource_size_t base, size_t size, int irq1,
141 int irq2, void *pdata, unsigned int periphid,
142 struct resource *resbase);
143void amba_device_unregister(struct amba_device *);
144struct amba_device *amba_find_device(const char *, struct device *, unsigned int, unsigned int);
145int amba_request_regions(struct amba_device *, const char *);
146void amba_release_regions(struct amba_device *);
147
148static inline int amba_pclk_enable(struct amba_device *dev)
149{
150 return clk_enable(dev->pclk);
151}
152
153static inline void amba_pclk_disable(struct amba_device *dev)
154{
155 clk_disable(dev->pclk);
156}
157
158static inline int amba_pclk_prepare(struct amba_device *dev)
159{
160 return clk_prepare(dev->pclk);
161}
162
163static inline void amba_pclk_unprepare(struct amba_device *dev)
164{
165 clk_unprepare(dev->pclk);
166}
167
168
169#define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
170#define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
171#define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff)
172#define AMBA_PART_BITS(a) ((a) & 0xfff)
173
174#define amba_config(d) AMBA_CONFIG_BITS((d)->periphid)
175#define amba_rev(d) AMBA_REV_BITS((d)->periphid)
176#define amba_manf(d) AMBA_MANF_BITS((d)->periphid)
177#define amba_part(d) AMBA_PART_BITS((d)->periphid)
178
179#define __AMBA_DEV(busid, data, mask) \
180 { \
181 .coherent_dma_mask = mask, \
182 .init_name = busid, \
183 .platform_data = data, \
184 }
185
186
187
188
189
190
191
192#define AMBA_APB_DEVICE(name, busid, id, base, irqs, data) \
193struct amba_device name##_device = { \
194 .dev = __AMBA_DEV(busid, data, 0), \
195 .res = DEFINE_RES_MEM(base, SZ_4K), \
196 .irq = irqs, \
197 .periphid = id, \
198}
199
200
201
202
203#define AMBA_AHB_DEVICE(name, busid, id, base, irqs, data) \
204struct amba_device name##_device = { \
205 .dev = __AMBA_DEV(busid, data, ~0ULL), \
206 .res = DEFINE_RES_MEM(base, SZ_4K), \
207 .irq = irqs, \
208 .periphid = id, \
209}
210
211
212
213
214
215
216
217#define module_amba_driver(__amba_drv) \
218 module_driver(__amba_drv, amba_driver_register, amba_driver_unregister)
219
220
221
222
223
224
225
226#define builtin_amba_driver(__amba_drv) \
227 builtin_driver(__amba_drv, amba_driver_register)
228
229#endif
230