linux/include/linux/amba/bus.h
<<
>>
Prefs
   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    9
  25#define AMBA_CID        0xb105f00d
  26#define CORESIGHT_CID   0xb105900d
  27
  28struct clk;
  29
  30struct amba_device {
  31        struct device           dev;
  32        struct resource         res;
  33        struct clk              *pclk;
  34        unsigned int            periphid;
  35        unsigned int            irq[AMBA_NR_IRQS];
  36        char                    *driver_override;
  37};
  38
  39struct amba_driver {
  40        struct device_driver    drv;
  41        int                     (*probe)(struct amba_device *, const struct amba_id *);
  42        int                     (*remove)(struct amba_device *);
  43        void                    (*shutdown)(struct amba_device *);
  44        const struct amba_id    *id_table;
  45};
  46
  47/*
  48 * Constants for the designer field of the Peripheral ID register. When bit 7
  49 * is set to '1', bits [6:0] should be the JEP106 manufacturer identity code.
  50 */
  51enum amba_vendor {
  52        AMBA_VENDOR_ARM = 0x41,
  53        AMBA_VENDOR_ST = 0x80,
  54        AMBA_VENDOR_QCOM = 0x51,
  55        AMBA_VENDOR_LSI = 0xb6,
  56        AMBA_VENDOR_LINUX = 0xfe,       /* This value is not official */
  57};
  58
  59/* This is used to generate pseudo-ID for AMBA device */
  60#define AMBA_LINUX_ID(conf, rev, part) \
  61        (((conf) & 0xff) << 24 | ((rev) & 0xf) << 20 | \
  62        AMBA_VENDOR_LINUX << 12 | ((part) & 0xfff))
  63
  64extern struct bus_type amba_bustype;
  65
  66#define to_amba_device(d)       container_of(d, struct amba_device, dev)
  67
  68#define amba_get_drvdata(d)     dev_get_drvdata(&d->dev)
  69#define amba_set_drvdata(d,p)   dev_set_drvdata(&d->dev, p)
  70
  71int amba_driver_register(struct amba_driver *);
  72void amba_driver_unregister(struct amba_driver *);
  73struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
  74void amba_device_put(struct amba_device *);
  75int amba_device_add(struct amba_device *, struct resource *);
  76int amba_device_register(struct amba_device *, struct resource *);
  77struct amba_device *amba_apb_device_add(struct device *parent, const char *name,
  78                                        resource_size_t base, size_t size,
  79                                        int irq1, int irq2, void *pdata,
  80                                        unsigned int periphid);
  81struct amba_device *amba_ahb_device_add(struct device *parent, const char *name,
  82                                        resource_size_t base, size_t size,
  83                                        int irq1, int irq2, void *pdata,
  84                                        unsigned int periphid);
  85struct amba_device *
  86amba_apb_device_add_res(struct device *parent, const char *name,
  87                        resource_size_t base, size_t size, int irq1,
  88                        int irq2, void *pdata, unsigned int periphid,
  89                        struct resource *resbase);
  90struct amba_device *
  91amba_ahb_device_add_res(struct device *parent, const char *name,
  92                        resource_size_t base, size_t size, int irq1,
  93                        int irq2, void *pdata, unsigned int periphid,
  94                        struct resource *resbase);
  95void amba_device_unregister(struct amba_device *);
  96struct amba_device *amba_find_device(const char *, struct device *, unsigned int, unsigned int);
  97int amba_request_regions(struct amba_device *, const char *);
  98void amba_release_regions(struct amba_device *);
  99
 100static inline int amba_pclk_enable(struct amba_device *dev)
 101{
 102        return clk_enable(dev->pclk);
 103}
 104
 105static inline void amba_pclk_disable(struct amba_device *dev)
 106{
 107        clk_disable(dev->pclk);
 108}
 109
 110static inline int amba_pclk_prepare(struct amba_device *dev)
 111{
 112        return clk_prepare(dev->pclk);
 113}
 114
 115static inline void amba_pclk_unprepare(struct amba_device *dev)
 116{
 117        clk_unprepare(dev->pclk);
 118}
 119
 120/* Some drivers don't use the struct amba_device */
 121#define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
 122#define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
 123#define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff)
 124#define AMBA_PART_BITS(a) ((a) & 0xfff)
 125
 126#define amba_config(d)  AMBA_CONFIG_BITS((d)->periphid)
 127#define amba_rev(d)     AMBA_REV_BITS((d)->periphid)
 128#define amba_manf(d)    AMBA_MANF_BITS((d)->periphid)
 129#define amba_part(d)    AMBA_PART_BITS((d)->periphid)
 130
 131#define __AMBA_DEV(busid, data, mask)                           \
 132        {                                                       \
 133                .coherent_dma_mask = mask,                      \
 134                .init_name = busid,                             \
 135                .platform_data = data,                          \
 136        }
 137
 138/*
 139 * APB devices do not themselves have the ability to address memory,
 140 * so DMA masks should be zero (much like USB peripheral devices.)
 141 * The DMA controller DMA masks should be used instead (much like
 142 * USB host controllers in conventional PCs.)
 143 */
 144#define AMBA_APB_DEVICE(name, busid, id, base, irqs, data)      \
 145struct amba_device name##_device = {                            \
 146        .dev = __AMBA_DEV(busid, data, 0),                      \
 147        .res = DEFINE_RES_MEM(base, SZ_4K),                     \
 148        .irq = irqs,                                            \
 149        .periphid = id,                                         \
 150}
 151
 152/*
 153 * AHB devices are DMA capable, so set their DMA masks
 154 */
 155#define AMBA_AHB_DEVICE(name, busid, id, base, irqs, data)      \
 156struct amba_device name##_device = {                            \
 157        .dev = __AMBA_DEV(busid, data, ~0ULL),                  \
 158        .res = DEFINE_RES_MEM(base, SZ_4K),                     \
 159        .irq = irqs,                                            \
 160        .periphid = id,                                         \
 161}
 162
 163/*
 164 * module_amba_driver() - Helper macro for drivers that don't do anything
 165 * special in module init/exit.  This eliminates a lot of boilerplate.  Each
 166 * module may only use this macro once, and calling it replaces module_init()
 167 * and module_exit()
 168 */
 169#define module_amba_driver(__amba_drv) \
 170        module_driver(__amba_drv, amba_driver_register, amba_driver_unregister)
 171
 172/*
 173 * builtin_amba_driver() - Helper macro for drivers that don't do anything
 174 * special in driver initcall.  This eliminates a lot of boilerplate.  Each
 175 * driver may only use this macro once, and calling it replaces the instance
 176 * device_initcall().
 177 */
 178#define builtin_amba_driver(__amba_drv) \
 179        builtin_driver(__amba_drv, amba_driver_register)
 180
 181#endif
 182