1/*
2 *  linux/include/amba/bus.h
3 *
4 *  This device type deals with ARM PrimeCells and anything else that
5 *  presents a proper CID (0xB105F00D) at the end of the I/O register
6 *  region or that is derived from a PrimeCell.
7 *
8 *  Copyright (C) 2003 Deep Blue Solutions Ltd, All Rights Reserved.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14#ifndef ASMARM_AMBA_H
15#define ASMARM_AMBA_H
16
17#include <linux/clk.h>
18#include <linux/device.h>
19#include <linux/mod_devicetable.h>
20#include <linux/err.h>
21#include <linux/resource.h>
22#include <linux/regulator/consumer.h>
23
24#define AMBA_NR_IRQS	2
25#define AMBA_CID	0xb105f00d
26
27struct clk;
28
29struct amba_device {
30	struct device		dev;
31	struct resource		res;
32	struct clk		*pclk;
33	u64			dma_mask;
34	unsigned int		periphid;
35	unsigned int		irq[AMBA_NR_IRQS];
36};
37
38struct amba_driver {
39	struct device_driver	drv;
40	int			(*probe)(struct amba_device *, const struct amba_id *);
41	int			(*remove)(struct amba_device *);
42	void			(*shutdown)(struct amba_device *);
43	int			(*suspend)(struct amba_device *, pm_message_t);
44	int			(*resume)(struct amba_device *);
45	const struct amba_id	*id_table;
46};
47
48enum amba_vendor {
49	AMBA_VENDOR_ARM = 0x41,
50	AMBA_VENDOR_ST = 0x80,
51};
52
53extern struct bus_type amba_bustype;
54
55#define to_amba_device(d)	container_of(d, struct amba_device, dev)
56
57#define amba_get_drvdata(d)	dev_get_drvdata(&d->dev)
58#define amba_set_drvdata(d,p)	dev_set_drvdata(&d->dev, p)
59
60int amba_driver_register(struct amba_driver *);
61void amba_driver_unregister(struct amba_driver *);
62struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
63void amba_device_put(struct amba_device *);
64int amba_device_add(struct amba_device *, struct resource *);
65int amba_device_register(struct amba_device *, struct resource *);
66void amba_device_unregister(struct amba_device *);
67struct amba_device *amba_find_device(const char *, struct device *, unsigned int, unsigned int);
68int amba_request_regions(struct amba_device *, const char *);
69void amba_release_regions(struct amba_device *);
70
71#define amba_pclk_enable(d)	\
72	(IS_ERR((d)->pclk) ? 0 : clk_enable((d)->pclk))
73
74#define amba_pclk_disable(d)	\
75	do { if (!IS_ERR((d)->pclk)) clk_disable((d)->pclk); } while (0)
76
77/* Some drivers don't use the struct amba_device */
78#define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
79#define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
80#define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff)
81#define AMBA_PART_BITS(a) ((a) & 0xfff)
82
83#define amba_config(d)	AMBA_CONFIG_BITS((d)->periphid)
84#define amba_rev(d)	AMBA_REV_BITS((d)->periphid)
85#define amba_manf(d)	AMBA_MANF_BITS((d)->periphid)
86#define amba_part(d)	AMBA_PART_BITS((d)->periphid)
87
88#define __AMBA_DEV(busid, data, mask)				\
89	{							\
90		.coherent_dma_mask = mask,			\
91		.init_name = busid,				\
92		.platform_data = data,				\
93	}
94
95/*
96 * APB devices do not themselves have the ability to address memory,
97 * so DMA masks should be zero (much like USB peripheral devices.)
98 * The DMA controller DMA masks should be used instead (much like
99 * USB host controllers in conventional PCs.)
100 */
101#define AMBA_APB_DEVICE(name, busid, id, base, irqs, data)	\
102struct amba_device name##_device = {				\
103	.dev = __AMBA_DEV(busid, data, 0),			\
104	.res = DEFINE_RES_MEM(base, SZ_4K),			\
105	.irq = irqs,						\
106	.periphid = id,						\
107}
108
109/*
110 * AHB devices are DMA capable, so set their DMA masks
111 */
112#define AMBA_AHB_DEVICE(name, busid, id, base, irqs, data)	\
113struct amba_device name##_device = {				\
114	.dev = __AMBA_DEV(busid, data, ~0ULL),			\
115	.res = DEFINE_RES_MEM(base, SZ_4K),			\
116	.dma_mask = ~0ULL,					\
117	.irq = irqs,						\
118	.periphid = id,						\
119}
120
121/*
122 * module_amba_driver() - Helper macro for drivers that don't do anything
123 * special in module init/exit.  This eliminates a lot of boilerplate.  Each
124 * module may only use this macro once, and calling it replaces module_init()
125 * and module_exit()
126 */
127#define module_amba_driver(__amba_drv) \
128	module_driver(__amba_drv, amba_driver_register, amba_driver_unregister)
129
130#endif
131