PageRenderTime 23ms CodeModel.GetById 11ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/include/linux/amba/bus.h

https://github.com/airy09/android_kernel_sony_apq8064
C Header | 130 lines | 82 code | 19 blank | 29 comment | 2 complexity | 4c2609bc49fb4beff0e4974be92341e0 MD5 | raw file
  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