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