0001
0002 #ifndef B43_BUS_H_
0003 #define B43_BUS_H_
0004
0005 enum b43_bus_type {
0006 #ifdef CONFIG_B43_BCMA
0007 B43_BUS_BCMA,
0008 #endif
0009 #ifdef CONFIG_B43_SSB
0010 B43_BUS_SSB,
0011 #endif
0012 };
0013
0014 struct b43_bus_dev {
0015 enum b43_bus_type bus_type;
0016 union {
0017 struct bcma_device *bdev;
0018 struct ssb_device *sdev;
0019 };
0020
0021 int (*bus_may_powerdown)(struct b43_bus_dev *dev);
0022 int (*bus_powerup)(struct b43_bus_dev *dev, bool dynamic_pctl);
0023 int (*device_is_enabled)(struct b43_bus_dev *dev);
0024 void (*device_enable)(struct b43_bus_dev *dev,
0025 u32 core_specific_flags);
0026 void (*device_disable)(struct b43_bus_dev *dev,
0027 u32 core_specific_flags);
0028
0029 u16 (*read16)(struct b43_bus_dev *dev, u16 offset);
0030 u32 (*read32)(struct b43_bus_dev *dev, u16 offset);
0031 void (*write16)(struct b43_bus_dev *dev, u16 offset, u16 value);
0032 void (*write32)(struct b43_bus_dev *dev, u16 offset, u32 value);
0033 void (*block_read)(struct b43_bus_dev *dev, void *buffer,
0034 size_t count, u16 offset, u8 reg_width);
0035 void (*block_write)(struct b43_bus_dev *dev, const void *buffer,
0036 size_t count, u16 offset, u8 reg_width);
0037 bool flush_writes;
0038
0039 struct device *dev;
0040 struct device *dma_dev;
0041 unsigned int irq;
0042
0043 u16 board_vendor;
0044 u16 board_type;
0045 u16 board_rev;
0046
0047 u16 chip_id;
0048 u8 chip_rev;
0049 u8 chip_pkg;
0050
0051 struct ssb_sprom *bus_sprom;
0052
0053 u16 core_id;
0054 u8 core_rev;
0055 };
0056
0057 static inline bool b43_bus_host_is_pcmcia(struct b43_bus_dev *dev)
0058 {
0059 #ifdef CONFIG_B43_SSB
0060 return (dev->bus_type == B43_BUS_SSB &&
0061 dev->sdev->bus->bustype == SSB_BUSTYPE_PCMCIA);
0062 #else
0063 return false;
0064 #endif
0065 };
0066
0067 static inline bool b43_bus_host_is_pci(struct b43_bus_dev *dev)
0068 {
0069 #ifdef CONFIG_B43_BCMA
0070 if (dev->bus_type == B43_BUS_BCMA)
0071 return (dev->bdev->bus->hosttype == BCMA_HOSTTYPE_PCI);
0072 #endif
0073 #ifdef CONFIG_B43_SSB
0074 if (dev->bus_type == B43_BUS_SSB)
0075 return (dev->sdev->bus->bustype == SSB_BUSTYPE_PCI);
0076 #endif
0077 return false;
0078 }
0079
0080 static inline bool b43_bus_host_is_sdio(struct b43_bus_dev *dev)
0081 {
0082 #ifdef CONFIG_B43_SSB
0083 return (dev->bus_type == B43_BUS_SSB &&
0084 dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO);
0085 #else
0086 return false;
0087 #endif
0088 }
0089
0090 struct b43_bus_dev *b43_bus_dev_bcma_init(struct bcma_device *core);
0091 struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev);
0092
0093 void *b43_bus_get_wldev(struct b43_bus_dev *dev);
0094 void b43_bus_set_wldev(struct b43_bus_dev *dev, void *data);
0095
0096 #endif