0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef ASMARM_AMBA_H
0012 #define ASMARM_AMBA_H
0013
0014 #include <linux/clk.h>
0015 #include <linux/device.h>
0016 #include <linux/mod_devicetable.h>
0017 #include <linux/err.h>
0018 #include <linux/resource.h>
0019 #include <linux/regulator/consumer.h>
0020
0021 #define AMBA_NR_IRQS 9
0022 #define AMBA_CID 0xb105f00d
0023 #define CORESIGHT_CID 0xb105900d
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 struct amba_cs_uci_id {
0052 unsigned int devarch;
0053 unsigned int devarch_mask;
0054 unsigned int devtype;
0055 void *data;
0056 };
0057
0058
0059 #define UCI_REG_DEVTYPE_OFFSET 0xFCC
0060 #define UCI_REG_DEVARCH_OFFSET 0xFBC
0061
0062 struct clk;
0063
0064 struct amba_device {
0065 struct device dev;
0066 struct resource res;
0067 struct clk *pclk;
0068 struct device_dma_parameters dma_parms;
0069 unsigned int periphid;
0070 struct mutex periphid_lock;
0071 unsigned int cid;
0072 struct amba_cs_uci_id uci;
0073 unsigned int irq[AMBA_NR_IRQS];
0074
0075
0076
0077
0078 const char *driver_override;
0079 };
0080
0081 struct amba_driver {
0082 struct device_driver drv;
0083 int (*probe)(struct amba_device *, const struct amba_id *);
0084 void (*remove)(struct amba_device *);
0085 void (*shutdown)(struct amba_device *);
0086 const struct amba_id *id_table;
0087
0088
0089
0090
0091
0092
0093
0094 bool driver_managed_dma;
0095 };
0096
0097
0098
0099
0100
0101 enum amba_vendor {
0102 AMBA_VENDOR_ARM = 0x41,
0103 AMBA_VENDOR_ST = 0x80,
0104 AMBA_VENDOR_QCOM = 0x51,
0105 AMBA_VENDOR_LSI = 0xb6,
0106 };
0107
0108 extern struct bus_type amba_bustype;
0109
0110 #define to_amba_device(d) container_of(d, struct amba_device, dev)
0111
0112 #define amba_get_drvdata(d) dev_get_drvdata(&d->dev)
0113 #define amba_set_drvdata(d,p) dev_set_drvdata(&d->dev, p)
0114
0115 #ifdef CONFIG_ARM_AMBA
0116 int amba_driver_register(struct amba_driver *);
0117 void amba_driver_unregister(struct amba_driver *);
0118 #else
0119 static inline int amba_driver_register(struct amba_driver *drv)
0120 {
0121 return -EINVAL;
0122 }
0123 static inline void amba_driver_unregister(struct amba_driver *drv)
0124 {
0125 }
0126 #endif
0127
0128 struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
0129 void amba_device_put(struct amba_device *);
0130 int amba_device_add(struct amba_device *, struct resource *);
0131 int amba_device_register(struct amba_device *, struct resource *);
0132 void amba_device_unregister(struct amba_device *);
0133 int amba_request_regions(struct amba_device *, const char *);
0134 void amba_release_regions(struct amba_device *);
0135
0136
0137 #define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
0138 #define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
0139 #define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff)
0140 #define AMBA_PART_BITS(a) ((a) & 0xfff)
0141
0142 #define amba_config(d) AMBA_CONFIG_BITS((d)->periphid)
0143 #define amba_rev(d) AMBA_REV_BITS((d)->periphid)
0144 #define amba_manf(d) AMBA_MANF_BITS((d)->periphid)
0145 #define amba_part(d) AMBA_PART_BITS((d)->periphid)
0146
0147 #define __AMBA_DEV(busid, data, mask) \
0148 { \
0149 .coherent_dma_mask = mask, \
0150 .init_name = busid, \
0151 .platform_data = data, \
0152 }
0153
0154
0155
0156
0157
0158
0159
0160 #define AMBA_APB_DEVICE(name, busid, id, base, irqs, data) \
0161 struct amba_device name##_device = { \
0162 .dev = __AMBA_DEV(busid, data, 0), \
0163 .res = DEFINE_RES_MEM(base, SZ_4K), \
0164 .irq = irqs, \
0165 .periphid = id, \
0166 }
0167
0168
0169
0170
0171 #define AMBA_AHB_DEVICE(name, busid, id, base, irqs, data) \
0172 struct amba_device name##_device = { \
0173 .dev = __AMBA_DEV(busid, data, ~0ULL), \
0174 .res = DEFINE_RES_MEM(base, SZ_4K), \
0175 .irq = irqs, \
0176 .periphid = id, \
0177 }
0178
0179
0180
0181
0182
0183
0184
0185 #define module_amba_driver(__amba_drv) \
0186 module_driver(__amba_drv, amba_driver_register, amba_driver_unregister)
0187
0188
0189
0190
0191
0192
0193
0194 #define builtin_amba_driver(__amba_drv) \
0195 builtin_driver(__amba_drv, amba_driver_register)
0196
0197 #endif