1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef B43_BUS_H_ 3 #define B43_BUS_H_ 4 5 enum b43_bus_type { 6 #ifdef CONFIG_B43_BCMA 7 B43_BUS_BCMA, 8 #endif 9 #ifdef CONFIG_B43_SSB 10 B43_BUS_SSB, 11 #endif 12 }; 13 14 struct b43_bus_dev { 15 enum b43_bus_type bus_type; 16 union { 17 struct bcma_device *bdev; 18 struct ssb_device *sdev; 19 }; 20 21 int (*bus_may_powerdown)(struct b43_bus_dev *dev); 22 int (*bus_powerup)(struct b43_bus_dev *dev, bool dynamic_pctl); 23 int (*device_is_enabled)(struct b43_bus_dev *dev); 24 void (*device_enable)(struct b43_bus_dev *dev, 25 u32 core_specific_flags); 26 void (*device_disable)(struct b43_bus_dev *dev, 27 u32 core_specific_flags); 28 29 u16 (*read16)(struct b43_bus_dev *dev, u16 offset); 30 u32 (*read32)(struct b43_bus_dev *dev, u16 offset); 31 void (*write16)(struct b43_bus_dev *dev, u16 offset, u16 value); 32 void (*write32)(struct b43_bus_dev *dev, u16 offset, u32 value); 33 void (*block_read)(struct b43_bus_dev *dev, void *buffer, 34 size_t count, u16 offset, u8 reg_width); 35 void (*block_write)(struct b43_bus_dev *dev, const void *buffer, 36 size_t count, u16 offset, u8 reg_width); 37 bool flush_writes; 38 39 struct device *dev; 40 struct device *dma_dev; 41 unsigned int irq; 42 43 u16 board_vendor; 44 u16 board_type; 45 u16 board_rev; 46 47 u16 chip_id; 48 u8 chip_rev; 49 u8 chip_pkg; 50 51 struct ssb_sprom *bus_sprom; 52 53 u16 core_id; 54 u8 core_rev; 55 }; 56 57 static inline bool b43_bus_host_is_pcmcia(struct b43_bus_dev *dev) 58 { 59 #ifdef CONFIG_B43_SSB 60 return (dev->bus_type == B43_BUS_SSB && 61 dev->sdev->bus->bustype == SSB_BUSTYPE_PCMCIA); 62 #else 63 return false; 64 #endif 65 }; 66 67 static inline bool b43_bus_host_is_pci(struct b43_bus_dev *dev) 68 { 69 #ifdef CONFIG_B43_BCMA 70 if (dev->bus_type == B43_BUS_BCMA) 71 return (dev->bdev->bus->hosttype == BCMA_HOSTTYPE_PCI); 72 #endif 73 #ifdef CONFIG_B43_SSB 74 if (dev->bus_type == B43_BUS_SSB) 75 return (dev->sdev->bus->bustype == SSB_BUSTYPE_PCI); 76 #endif 77 return false; 78 } 79 80 static inline bool b43_bus_host_is_sdio(struct b43_bus_dev *dev) 81 { 82 #ifdef CONFIG_B43_SSB 83 return (dev->bus_type == B43_BUS_SSB && 84 dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO); 85 #else 86 return false; 87 #endif 88 } 89 90 struct b43_bus_dev *b43_bus_dev_bcma_init(struct bcma_device *core); 91 struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev); 92 93 void *b43_bus_get_wldev(struct b43_bus_dev *dev); 94 void b43_bus_set_wldev(struct b43_bus_dev *dev, void *data); 95 96 #endif /* B43_BUS_H_ */ 97