linux/include/linux/bcma/bcma.h
<<
>>
Prefs
   1#ifndef LINUX_BCMA_H_
   2#define LINUX_BCMA_H_
   3
   4#include <linux/pci.h>
   5#include <linux/mod_devicetable.h>
   6
   7#include <linux/bcma/bcma_driver_chipcommon.h>
   8#include <linux/bcma/bcma_driver_pci.h>
   9#include <linux/bcma/bcma_driver_mips.h>
  10#include <linux/ssb/ssb.h> /* SPROM sharing */
  11
  12#include "bcma_regs.h"
  13
  14struct bcma_device;
  15struct bcma_bus;
  16
  17enum bcma_hosttype {
  18        BCMA_HOSTTYPE_PCI,
  19        BCMA_HOSTTYPE_SDIO,
  20        BCMA_HOSTTYPE_SOC,
  21};
  22
  23struct bcma_chipinfo {
  24        u16 id;
  25        u8 rev;
  26        u8 pkg;
  27};
  28
  29struct bcma_boardinfo {
  30        u16 vendor;
  31        u16 type;
  32};
  33
  34enum bcma_clkmode {
  35        BCMA_CLKMODE_FAST,
  36        BCMA_CLKMODE_DYNAMIC,
  37};
  38
  39struct bcma_host_ops {
  40        u8 (*read8)(struct bcma_device *core, u16 offset);
  41        u16 (*read16)(struct bcma_device *core, u16 offset);
  42        u32 (*read32)(struct bcma_device *core, u16 offset);
  43        void (*write8)(struct bcma_device *core, u16 offset, u8 value);
  44        void (*write16)(struct bcma_device *core, u16 offset, u16 value);
  45        void (*write32)(struct bcma_device *core, u16 offset, u32 value);
  46#ifdef CONFIG_BCMA_BLOCKIO
  47        void (*block_read)(struct bcma_device *core, void *buffer,
  48                           size_t count, u16 offset, u8 reg_width);
  49        void (*block_write)(struct bcma_device *core, const void *buffer,
  50                            size_t count, u16 offset, u8 reg_width);
  51#endif
  52        /* Agent ops */
  53        u32 (*aread32)(struct bcma_device *core, u16 offset);
  54        void (*awrite32)(struct bcma_device *core, u16 offset, u32 value);
  55};
  56
  57/* Core manufacturers */
  58#define BCMA_MANUF_ARM                  0x43B
  59#define BCMA_MANUF_MIPS                 0x4A7
  60#define BCMA_MANUF_BCM                  0x4BF
  61
  62/* Core class values. */
  63#define BCMA_CL_SIM                     0x0
  64#define BCMA_CL_EROM                    0x1
  65#define BCMA_CL_CORESIGHT               0x9
  66#define BCMA_CL_VERIF                   0xB
  67#define BCMA_CL_OPTIMO                  0xD
  68#define BCMA_CL_GEN                     0xE
  69#define BCMA_CL_PRIMECELL               0xF
  70
  71/* Core-ID values. */
  72#define BCMA_CORE_OOB_ROUTER            0x367   /* Out of band */
  73#define BCMA_CORE_INVALID               0x700
  74#define BCMA_CORE_CHIPCOMMON            0x800
  75#define BCMA_CORE_ILINE20               0x801
  76#define BCMA_CORE_SRAM                  0x802
  77#define BCMA_CORE_SDRAM                 0x803
  78#define BCMA_CORE_PCI                   0x804
  79#define BCMA_CORE_MIPS                  0x805
  80#define BCMA_CORE_ETHERNET              0x806
  81#define BCMA_CORE_V90                   0x807
  82#define BCMA_CORE_USB11_HOSTDEV         0x808
  83#define BCMA_CORE_ADSL                  0x809
  84#define BCMA_CORE_ILINE100              0x80A
  85#define BCMA_CORE_IPSEC                 0x80B
  86#define BCMA_CORE_UTOPIA                0x80C
  87#define BCMA_CORE_PCMCIA                0x80D
  88#define BCMA_CORE_INTERNAL_MEM          0x80E
  89#define BCMA_CORE_MEMC_SDRAM            0x80F
  90#define BCMA_CORE_OFDM                  0x810
  91#define BCMA_CORE_EXTIF                 0x811
  92#define BCMA_CORE_80211                 0x812
  93#define BCMA_CORE_PHY_A                 0x813
  94#define BCMA_CORE_PHY_B                 0x814
  95#define BCMA_CORE_PHY_G                 0x815
  96#define BCMA_CORE_MIPS_3302             0x816
  97#define BCMA_CORE_USB11_HOST            0x817
  98#define BCMA_CORE_USB11_DEV             0x818
  99#define BCMA_CORE_USB20_HOST            0x819
 100#define BCMA_CORE_USB20_DEV             0x81A
 101#define BCMA_CORE_SDIO_HOST             0x81B
 102#define BCMA_CORE_ROBOSWITCH            0x81C
 103#define BCMA_CORE_PARA_ATA              0x81D
 104#define BCMA_CORE_SATA_XORDMA           0x81E
 105#define BCMA_CORE_ETHERNET_GBIT         0x81F
 106#define BCMA_CORE_PCIE                  0x820
 107#define BCMA_CORE_PHY_N                 0x821
 108#define BCMA_CORE_SRAM_CTL              0x822
 109#define BCMA_CORE_MINI_MACPHY           0x823
 110#define BCMA_CORE_ARM_1176              0x824
 111#define BCMA_CORE_ARM_7TDMI             0x825
 112#define BCMA_CORE_PHY_LP                0x826
 113#define BCMA_CORE_PMU                   0x827
 114#define BCMA_CORE_PHY_SSN               0x828
 115#define BCMA_CORE_SDIO_DEV              0x829
 116#define BCMA_CORE_ARM_CM3               0x82A
 117#define BCMA_CORE_PHY_HT                0x82B
 118#define BCMA_CORE_MIPS_74K              0x82C
 119#define BCMA_CORE_MAC_GBIT              0x82D
 120#define BCMA_CORE_DDR12_MEM_CTL         0x82E
 121#define BCMA_CORE_PCIE_RC               0x82F   /* PCIe Root Complex */
 122#define BCMA_CORE_OCP_OCP_BRIDGE        0x830
 123#define BCMA_CORE_SHARED_COMMON         0x831
 124#define BCMA_CORE_OCP_AHB_BRIDGE        0x832
 125#define BCMA_CORE_SPI_HOST              0x833
 126#define BCMA_CORE_I2S                   0x834
 127#define BCMA_CORE_SDR_DDR1_MEM_CTL      0x835   /* SDR/DDR1 memory controller core */
 128#define BCMA_CORE_SHIM                  0x837   /* SHIM component in ubus/6362 */
 129#define BCMA_CORE_DEFAULT               0xFFF
 130
 131#define BCMA_MAX_NR_CORES               16
 132
 133struct bcma_device {
 134        struct bcma_bus *bus;
 135        struct bcma_device_id id;
 136
 137        struct device dev;
 138        struct device *dma_dev;
 139
 140        unsigned int irq;
 141        bool dev_registered;
 142
 143        u8 core_index;
 144        u8 core_unit;
 145
 146        u32 addr;
 147        u32 addr1;
 148        u32 wrap;
 149
 150        void __iomem *io_addr;
 151        void __iomem *io_wrap;
 152
 153        void *drvdata;
 154        struct list_head list;
 155};
 156
 157static inline void *bcma_get_drvdata(struct bcma_device *core)
 158{
 159        return core->drvdata;
 160}
 161static inline void bcma_set_drvdata(struct bcma_device *core, void *drvdata)
 162{
 163        core->drvdata = drvdata;
 164}
 165
 166struct bcma_driver {
 167        const char *name;
 168        const struct bcma_device_id *id_table;
 169
 170        int (*probe)(struct bcma_device *dev);
 171        void (*remove)(struct bcma_device *dev);
 172        int (*suspend)(struct bcma_device *dev);
 173        int (*resume)(struct bcma_device *dev);
 174        void (*shutdown)(struct bcma_device *dev);
 175
 176        struct device_driver drv;
 177};
 178extern
 179int __bcma_driver_register(struct bcma_driver *drv, struct module *owner);
 180#define bcma_driver_register(drv) \
 181        __bcma_driver_register(drv, THIS_MODULE)
 182
 183extern void bcma_driver_unregister(struct bcma_driver *drv);
 184
 185/* Set a fallback SPROM.
 186 * See kdoc at the function definition for complete documentation. */
 187extern int bcma_arch_register_fallback_sprom(
 188                int (*sprom_callback)(struct bcma_bus *bus,
 189                struct ssb_sprom *out));
 190
 191struct bcma_bus {
 192        /* The MMIO area. */
 193        void __iomem *mmio;
 194
 195        const struct bcma_host_ops *ops;
 196
 197        enum bcma_hosttype hosttype;
 198        union {
 199                /* Pointer to the PCI bus (only for BCMA_HOSTTYPE_PCI) */
 200                struct pci_dev *host_pci;
 201                /* Pointer to the SDIO device (only for BCMA_HOSTTYPE_SDIO) */
 202                struct sdio_func *host_sdio;
 203        };
 204
 205        struct bcma_chipinfo chipinfo;
 206
 207        struct bcma_boardinfo boardinfo;
 208
 209        struct bcma_device *mapped_core;
 210        struct list_head cores;
 211        u8 nr_cores;
 212        u8 init_done:1;
 213        u8 num;
 214
 215        struct bcma_drv_cc drv_cc;
 216        struct bcma_drv_pci drv_pci;
 217        struct bcma_drv_mips drv_mips;
 218
 219        /* We decided to share SPROM struct with SSB as long as we do not need
 220         * any hacks for BCMA. This simplifies drivers code. */
 221        struct ssb_sprom sprom;
 222};
 223
 224static inline u32 bcma_read8(struct bcma_device *core, u16 offset)
 225{
 226        return core->bus->ops->read8(core, offset);
 227}
 228static inline u32 bcma_read16(struct bcma_device *core, u16 offset)
 229{
 230        return core->bus->ops->read16(core, offset);
 231}
 232static inline u32 bcma_read32(struct bcma_device *core, u16 offset)
 233{
 234        return core->bus->ops->read32(core, offset);
 235}
 236static inline
 237void bcma_write8(struct bcma_device *core, u16 offset, u32 value)
 238{
 239        core->bus->ops->write8(core, offset, value);
 240}
 241static inline
 242void bcma_write16(struct bcma_device *core, u16 offset, u32 value)
 243{
 244        core->bus->ops->write16(core, offset, value);
 245}
 246static inline
 247void bcma_write32(struct bcma_device *core, u16 offset, u32 value)
 248{
 249        core->bus->ops->write32(core, offset, value);
 250}
 251#ifdef CONFIG_BCMA_BLOCKIO
 252static inline void bcma_block_read(struct bcma_device *core, void *buffer,
 253                                   size_t count, u16 offset, u8 reg_width)
 254{
 255        core->bus->ops->block_read(core, buffer, count, offset, reg_width);
 256}
 257static inline void bcma_block_write(struct bcma_device *core,
 258                                    const void *buffer, size_t count,
 259                                    u16 offset, u8 reg_width)
 260{
 261        core->bus->ops->block_write(core, buffer, count, offset, reg_width);
 262}
 263#endif
 264static inline u32 bcma_aread32(struct bcma_device *core, u16 offset)
 265{
 266        return core->bus->ops->aread32(core, offset);
 267}
 268static inline
 269void bcma_awrite32(struct bcma_device *core, u16 offset, u32 value)
 270{
 271        core->bus->ops->awrite32(core, offset, value);
 272}
 273
 274static inline void bcma_mask32(struct bcma_device *cc, u16 offset, u32 mask)
 275{
 276        bcma_write32(cc, offset, bcma_read32(cc, offset) & mask);
 277}
 278static inline void bcma_set32(struct bcma_device *cc, u16 offset, u32 set)
 279{
 280        bcma_write32(cc, offset, bcma_read32(cc, offset) | set);
 281}
 282static inline void bcma_maskset32(struct bcma_device *cc,
 283                                  u16 offset, u32 mask, u32 set)
 284{
 285        bcma_write32(cc, offset, (bcma_read32(cc, offset) & mask) | set);
 286}
 287static inline void bcma_mask16(struct bcma_device *cc, u16 offset, u16 mask)
 288{
 289        bcma_write16(cc, offset, bcma_read16(cc, offset) & mask);
 290}
 291static inline void bcma_set16(struct bcma_device *cc, u16 offset, u16 set)
 292{
 293        bcma_write16(cc, offset, bcma_read16(cc, offset) | set);
 294}
 295static inline void bcma_maskset16(struct bcma_device *cc,
 296                                  u16 offset, u16 mask, u16 set)
 297{
 298        bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set);
 299}
 300
 301extern struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid);
 302extern bool bcma_core_is_enabled(struct bcma_device *core);
 303extern void bcma_core_disable(struct bcma_device *core, u32 flags);
 304extern int bcma_core_enable(struct bcma_device *core, u32 flags);
 305extern void bcma_core_set_clockmode(struct bcma_device *core,
 306                                    enum bcma_clkmode clkmode);
 307extern void bcma_core_pll_ctl(struct bcma_device *core, u32 req, u32 status,
 308                              bool on);
 309#define BCMA_DMA_TRANSLATION_MASK       0xC0000000
 310#define  BCMA_DMA_TRANSLATION_NONE      0x00000000
 311#define  BCMA_DMA_TRANSLATION_DMA32_CMT 0x40000000 /* Client Mode Translation for 32-bit DMA */
 312#define  BCMA_DMA_TRANSLATION_DMA64_CMT 0x80000000 /* Client Mode Translation for 64-bit DMA */
 313extern u32 bcma_core_dma_translation(struct bcma_device *core);
 314
 315#endif /* LINUX_BCMA_H_ */
 316