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 int (*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
108int amba_driver_register(struct amba_driver *);
109void amba_driver_unregister(struct amba_driver *);
110struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
111void amba_device_put(struct amba_device *);
112int amba_device_add(struct amba_device *, struct resource *);
113int amba_device_register(struct amba_device *, struct resource *);
114struct amba_device *amba_apb_device_add(struct device *parent, const char *name,
115 resource_size_t base, size_t size,
116 int irq1, int irq2, void *pdata,
117 unsigned int periphid);
118struct amba_device *amba_ahb_device_add(struct device *parent, const char *name,
119 resource_size_t base, size_t size,
120 int irq1, int irq2, void *pdata,
121 unsigned int periphid);
122struct amba_device *
123amba_apb_device_add_res(struct device *parent, const char *name,
124 resource_size_t base, size_t size, int irq1,
125 int irq2, void *pdata, unsigned int periphid,
126 struct resource *resbase);
127struct amba_device *
128amba_ahb_device_add_res(struct device *parent, const char *name,
129 resource_size_t base, size_t size, int irq1,
130 int irq2, void *pdata, unsigned int periphid,
131 struct resource *resbase);
132void amba_device_unregister(struct amba_device *);
133struct amba_device *amba_find_device(const char *, struct device *, unsigned int, unsigned int);
134int amba_request_regions(struct amba_device *, const char *);
135void amba_release_regions(struct amba_device *);
136
137static inline int amba_pclk_enable(struct amba_device *dev)
138{
139 return clk_enable(dev->pclk);
140}
141
142static inline void amba_pclk_disable(struct amba_device *dev)
143{
144 clk_disable(dev->pclk);
145}
146
147static inline int amba_pclk_prepare(struct amba_device *dev)
148{
149 return clk_prepare(dev->pclk);
150}
151
152static inline void amba_pclk_unprepare(struct amba_device *dev)
153{
154 clk_unprepare(dev->pclk);
155}
156
157
158#define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
159#define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
160#define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff)
161#define AMBA_PART_BITS(a) ((a) & 0xfff)
162
163#define amba_config(d) AMBA_CONFIG_BITS((d)->periphid)
164#define amba_rev(d) AMBA_REV_BITS((d)->periphid)
165#define amba_manf(d) AMBA_MANF_BITS((d)->periphid)
166#define amba_part(d) AMBA_PART_BITS((d)->periphid)
167
168#define __AMBA_DEV(busid, data, mask) \
169 { \
170 .coherent_dma_mask = mask, \
171 .init_name = busid, \
172 .platform_data = data, \
173 }
174
175
176
177
178
179
180
181#define AMBA_APB_DEVICE(name, busid, id, base, irqs, data) \
182struct amba_device name##_device = { \
183 .dev = __AMBA_DEV(busid, data, 0), \
184 .res = DEFINE_RES_MEM(base, SZ_4K), \
185 .irq = irqs, \
186 .periphid = id, \
187}
188
189
190
191
192#define AMBA_AHB_DEVICE(name, busid, id, base, irqs, data) \
193struct amba_device name##_device = { \
194 .dev = __AMBA_DEV(busid, data, ~0ULL), \
195 .res = DEFINE_RES_MEM(base, SZ_4K), \
196 .irq = irqs, \
197 .periphid = id, \
198}
199
200
201
202
203
204
205
206#define module_amba_driver(__amba_drv) \
207 module_driver(__amba_drv, amba_driver_register, amba_driver_unregister)
208
209
210
211
212
213
214
215#define builtin_amba_driver(__amba_drv) \
216 builtin_driver(__amba_drv, amba_driver_register)
217
218#endif
219