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};
  57
  58extern struct bus_type amba_bustype;
  59
  60#define to_amba_device(d)       container_of(d, struct amba_device, dev)
  61
  62#define amba_get_drvdata(d)     dev_get_drvdata(&d->dev)
  63#define amba_set_drvdata(d,p)   dev_set_drvdata(&d->dev, p)
  64
  65int amba_driver_register(struct amba_driver *);
  66void amba_driver_unregister(struct amba_driver *);
  67struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
  68void amba_device_put(struct amba_device *);
  69int amba_device_add(struct amba_device *, struct resource *);
  70int amba_device_register(struct amba_device *, struct resource *);
  71struct amba_device *amba_apb_device_add(struct device *parent, const char *name,
  72                                        resource_size_t base, size_t size,
  73                                        int irq1, int irq2, void *pdata,
  74                                        unsigned int periphid);
  75struct amba_device *amba_ahb_device_add(struct device *parent, const char *name,
  76                                        resource_size_t base, size_t size,
  77                                        int irq1, int irq2, void *pdata,
  78                                        unsigned int periphid);
  79struct amba_device *
  80amba_apb_device_add_res(struct device *parent, const char *name,
  81                        resource_size_t base, size_t size, int irq1,
  82                        int irq2, void *pdata, unsigned int periphid,
  83                        struct resource *resbase);
  84struct amba_device *
  85amba_ahb_device_add_res(struct device *parent, const char *name,
  86                        resource_size_t base, size_t size, int irq1,
  87                        int irq2, void *pdata, unsigned int periphid,
  88                        struct resource *resbase);
  89void amba_device_unregister(struct amba_device *);
  90struct amba_device *amba_find_device(const char *, struct device *, unsigned int, unsigned int);
  91int amba_request_regions(struct amba_device *, const char *);
  92void amba_release_regions(struct amba_device *);
  93
  94static inline int amba_pclk_enable(struct amba_device *dev)
  95{
  96        return clk_enable(dev->pclk);
  97}
  98
  99static inline void amba_pclk_disable(struct amba_device *dev)
 100{
 101        clk_disable(dev->pclk);
 102}
 103
 104static inline int amba_pclk_prepare(struct amba_device *dev)
 105{
 106        return clk_prepare(dev->pclk);
 107}
 108
 109static inline void amba_pclk_unprepare(struct amba_device *dev)
 110{
 111        clk_unprepare(dev->pclk);
 112}
 113
 114/* Some drivers don't use the struct amba_device */
 115#define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
 116#define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
 117#define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff)
 118#define AMBA_PART_BITS(a) ((a) & 0xfff)
 119
 120#define amba_config(d)  AMBA_CONFIG_BITS((d)->periphid)
 121#define amba_rev(d)     AMBA_REV_BITS((d)->periphid)
 122#define amba_manf(d)    AMBA_MANF_BITS((d)->periphid)
 123#define amba_part(d)    AMBA_PART_BITS((d)->periphid)
 124
 125#define __AMBA_DEV(busid, data, mask)                           \
 126        {                                                       \
 127                .coherent_dma_mask = mask,                      \
 128                .init_name = busid,                             \
 129                .platform_data = data,                          \
 130        }
 131
 132/*
 133 * APB devices do not themselves have the ability to address memory,
 134 * so DMA masks should be zero (much like USB peripheral devices.)
 135 * The DMA controller DMA masks should be used instead (much like
 136 * USB host controllers in conventional PCs.)
 137 */
 138#define AMBA_APB_DEVICE(name, busid, id, base, irqs, data)      \
 139struct amba_device name##_device = {                            \
 140        .dev = __AMBA_DEV(busid, data, 0),                      \
 141        .res = DEFINE_RES_MEM(base, SZ_4K),                     \
 142        .irq = irqs,                                            \
 143        .periphid = id,                                         \
 144}
 145
 146/*
 147 * AHB devices are DMA capable, so set their DMA masks
 148 */
 149#define AMBA_AHB_DEVICE(name, busid, id, base, irqs, data)      \
 150struct amba_device name##_device = {                            \
 151        .dev = __AMBA_DEV(busid, data, ~0ULL),                  \
 152        .res = DEFINE_RES_MEM(base, SZ_4K),                     \
 153        .irq = irqs,                                            \
 154        .periphid = id,                                         \
 155}
 156
 157/*
 158 * module_amba_driver() - Helper macro for drivers that don't do anything
 159 * special in module init/exit.  This eliminates a lot of boilerplate.  Each
 160 * module may only use this macro once, and calling it replaces module_init()
 161 * and module_exit()
 162 */
 163#define module_amba_driver(__amba_drv) \
 164        module_driver(__amba_drv, amba_driver_register, amba_driver_unregister)
 165
 166/*
 167 * builtin_amba_driver() - Helper macro for drivers that don't do anything
 168 * special in driver initcall.  This eliminates a lot of boilerplate.  Each
 169 * driver may only use this macro once, and calling it replaces the instance
 170 * device_initcall().
 171 */
 172#define builtin_amba_driver(__amba_drv) \
 173        builtin_driver(__amba_drv, amba_driver_register)
 174
 175#endif
 176