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 unsigned int periphid;
69 unsigned int cid;
70 struct amba_cs_uci_id uci;
71 unsigned int irq[AMBA_NR_IRQS];
72 char *driver_override;
73};
74
75struct amba_driver {
76 struct device_driver drv;
77 int (*probe)(struct amba_device *, const struct amba_id *);
78 int (*remove)(struct amba_device *);
79 void (*shutdown)(struct amba_device *);
80 const struct amba_id *id_table;
81};
82
83
84
85
86
87enum amba_vendor {
88 AMBA_VENDOR_ARM = 0x41,
89 AMBA_VENDOR_ST = 0x80,
90 AMBA_VENDOR_QCOM = 0x51,
91 AMBA_VENDOR_LSI = 0xb6,
92 AMBA_VENDOR_LINUX = 0xfe,
93};
94
95
96#define AMBA_LINUX_ID(conf, rev, part) \
97 (((conf) & 0xff) << 24 | ((rev) & 0xf) << 20 | \
98 AMBA_VENDOR_LINUX << 12 | ((part) & 0xfff))
99
100extern struct bus_type amba_bustype;
101
102#define to_amba_device(d) container_of(d, struct amba_device, dev)
103
104#define amba_get_drvdata(d) dev_get_drvdata(&d->dev)
105#define amba_set_drvdata(d,p) dev_set_drvdata(&d->dev, p)
106
107int amba_driver_register(struct amba_driver *);
108void amba_driver_unregister(struct amba_driver *);
109struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
110void amba_device_put(struct amba_device *);
111int amba_device_add(struct amba_device *, struct resource *);
112int amba_device_register(struct amba_device *, struct resource *);
113struct amba_device *amba_apb_device_add(struct device *parent, const char *name,
114 resource_size_t base, size_t size,
115 int irq1, int irq2, void *pdata,
116 unsigned int periphid);
117struct amba_device *amba_ahb_device_add(struct device *parent, const char *name,
118 resource_size_t base, size_t size,
119 int irq1, int irq2, void *pdata,
120 unsigned int periphid);
121struct amba_device *
122amba_apb_device_add_res(struct device *parent, const char *name,
123 resource_size_t base, size_t size, int irq1,
124 int irq2, void *pdata, unsigned int periphid,
125 struct resource *resbase);
126struct amba_device *
127amba_ahb_device_add_res(struct device *parent, const char *name,
128 resource_size_t base, size_t size, int irq1,
129 int irq2, void *pdata, unsigned int periphid,
130 struct resource *resbase);
131void amba_device_unregister(struct amba_device *);
132struct amba_device *amba_find_device(const char *, struct device *, unsigned int, unsigned int);
133int amba_request_regions(struct amba_device *, const char *);
134void amba_release_regions(struct amba_device *);
135
136static inline int amba_pclk_enable(struct amba_device *dev)
137{
138 return clk_enable(dev->pclk);
139}
140
141static inline void amba_pclk_disable(struct amba_device *dev)
142{
143 clk_disable(dev->pclk);
144}
145
146static inline int amba_pclk_prepare(struct amba_device *dev)
147{
148 return clk_prepare(dev->pclk);
149}
150
151static inline void amba_pclk_unprepare(struct amba_device *dev)
152{
153 clk_unprepare(dev->pclk);
154}
155
156
157#define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
158#define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
159#define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff)
160#define AMBA_PART_BITS(a) ((a) & 0xfff)
161
162#define amba_config(d) AMBA_CONFIG_BITS((d)->periphid)
163#define amba_rev(d) AMBA_REV_BITS((d)->periphid)
164#define amba_manf(d) AMBA_MANF_BITS((d)->periphid)
165#define amba_part(d) AMBA_PART_BITS((d)->periphid)
166
167#define __AMBA_DEV(busid, data, mask) \
168 { \
169 .coherent_dma_mask = mask, \
170 .init_name = busid, \
171 .platform_data = data, \
172 }
173
174
175
176
177
178
179
180#define AMBA_APB_DEVICE(name, busid, id, base, irqs, data) \
181struct amba_device name##_device = { \
182 .dev = __AMBA_DEV(busid, data, 0), \
183 .res = DEFINE_RES_MEM(base, SZ_4K), \
184 .irq = irqs, \
185 .periphid = id, \
186}
187
188
189
190
191#define AMBA_AHB_DEVICE(name, busid, id, base, irqs, data) \
192struct amba_device name##_device = { \
193 .dev = __AMBA_DEV(busid, data, ~0ULL), \
194 .res = DEFINE_RES_MEM(base, SZ_4K), \
195 .irq = irqs, \
196 .periphid = id, \
197}
198
199
200
201
202
203
204
205#define module_amba_driver(__amba_drv) \
206 module_driver(__amba_drv, amba_driver_register, amba_driver_unregister)
207
208
209
210
211
212
213
214#define builtin_amba_driver(__amba_drv) \
215 builtin_driver(__amba_drv, amba_driver_register)
216
217#endif
218