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    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 *);
  66struct amba_device *amba_apb_device_add(struct device *parent, const char *name,
  67                                        resource_size_t base, size_t size,
  68                                        int irq1, int irq2, void *pdata,
  69                                        unsigned int periphid);
  70struct amba_device *amba_ahb_device_add(struct device *parent, const char *name,
  71                                        resource_size_t base, size_t size,
  72                                        int irq1, int irq2, void *pdata,
  73                                        unsigned int periphid);
  74struct amba_device *
  75amba_apb_device_add_res(struct device *parent, const char *name,
  76                        resource_size_t base, size_t size, int irq1,
  77                        int irq2, void *pdata, unsigned int periphid,
  78                        struct resource *resbase);
  79struct amba_device *
  80amba_ahb_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);
  84void amba_device_unregister(struct amba_device *);
  85struct amba_device *amba_find_device(const char *, struct device *, unsigned int, unsigned int);
  86int amba_request_regions(struct amba_device *, const char *);
  87void amba_release_regions(struct amba_device *);
  88
  89#define amba_pclk_enable(d)     \
  90        (IS_ERR((d)->pclk) ? 0 : clk_enable((d)->pclk))
  91
  92#define amba_pclk_disable(d)    \
  93        do { if (!IS_ERR((d)->pclk)) clk_disable((d)->pclk); } while (0)
  94
  95/* Some drivers don't use the struct amba_device */
  96#define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
  97#define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
  98#define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff)
  99#define AMBA_PART_BITS(a) ((a) & 0xfff)
 100
 101#define amba_config(d)  AMBA_CONFIG_BITS((d)->periphid)
 102#define amba_rev(d)     AMBA_REV_BITS((d)->periphid)
 103#define amba_manf(d)    AMBA_MANF_BITS((d)->periphid)
 104#define amba_part(d)    AMBA_PART_BITS((d)->periphid)
 105
 106#define __AMBA_DEV(busid, data, mask)                           \
 107        {                                                       \
 108                .coherent_dma_mask = mask,                      \
 109                .init_name = busid,                             \
 110                .platform_data = data,                          \
 111        }
 112
 113/*
 114 * APB devices do not themselves have the ability to address memory,
 115 * so DMA masks should be zero (much like USB peripheral devices.)
 116 * The DMA controller DMA masks should be used instead (much like
 117 * USB host controllers in conventional PCs.)
 118 */
 119#define AMBA_APB_DEVICE(name, busid, id, base, irqs, data)      \
 120struct amba_device name##_device = {                            \
 121        .dev = __AMBA_DEV(busid, data, 0),                      \
 122        .res = DEFINE_RES_MEM(base, SZ_4K),                     \
 123        .irq = irqs,                                            \
 124        .periphid = id,                                         \
 125}
 126
 127/*
 128 * AHB devices are DMA capable, so set their DMA masks
 129 */
 130#define AMBA_AHB_DEVICE(name, busid, id, base, irqs, data)      \
 131struct amba_device name##_device = {                            \
 132        .dev = __AMBA_DEV(busid, data, ~0ULL),                  \
 133        .res = DEFINE_RES_MEM(base, SZ_4K),                     \
 134        .dma_mask = ~0ULL,                                      \
 135        .irq = irqs,                                            \
 136        .periphid = id,                                         \
 137}
 138
 139/*
 140 * module_amba_driver() - Helper macro for drivers that don't do anything
 141 * special in module init/exit.  This eliminates a lot of boilerplate.  Each
 142 * module may only use this macro once, and calling it replaces module_init()
 143 * and module_exit()
 144 */
 145#define module_amba_driver(__amba_drv) \
 146        module_driver(__amba_drv, amba_driver_register, amba_driver_unregister)
 147
 148#endif
 149