0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifdef CONFIG_BCM47XX_BCMA
0013 #include <asm/mach-bcm47xx/bcm47xx.h>
0014 #endif
0015
0016 #include "b43.h"
0017 #include "bus.h"
0018
0019
0020 #ifdef CONFIG_B43_BCMA
0021 static int b43_bus_bcma_bus_may_powerdown(struct b43_bus_dev *dev)
0022 {
0023 return 0;
0024 }
0025 static int b43_bus_bcma_bus_powerup(struct b43_bus_dev *dev,
0026 bool dynamic_pctl)
0027 {
0028 return 0;
0029 }
0030 static int b43_bus_bcma_device_is_enabled(struct b43_bus_dev *dev)
0031 {
0032 return bcma_core_is_enabled(dev->bdev);
0033 }
0034 static void b43_bus_bcma_device_enable(struct b43_bus_dev *dev,
0035 u32 core_specific_flags)
0036 {
0037 bcma_core_enable(dev->bdev, core_specific_flags);
0038 }
0039 static void b43_bus_bcma_device_disable(struct b43_bus_dev *dev,
0040 u32 core_specific_flags)
0041 {
0042 bcma_core_disable(dev->bdev, core_specific_flags);
0043 }
0044 static u16 b43_bus_bcma_read16(struct b43_bus_dev *dev, u16 offset)
0045 {
0046 return bcma_read16(dev->bdev, offset);
0047 }
0048 static u32 b43_bus_bcma_read32(struct b43_bus_dev *dev, u16 offset)
0049 {
0050 return bcma_read32(dev->bdev, offset);
0051 }
0052 static
0053 void b43_bus_bcma_write16(struct b43_bus_dev *dev, u16 offset, u16 value)
0054 {
0055 bcma_write16(dev->bdev, offset, value);
0056 }
0057 static
0058 void b43_bus_bcma_write32(struct b43_bus_dev *dev, u16 offset, u32 value)
0059 {
0060 bcma_write32(dev->bdev, offset, value);
0061 }
0062 static
0063 void b43_bus_bcma_block_read(struct b43_bus_dev *dev, void *buffer,
0064 size_t count, u16 offset, u8 reg_width)
0065 {
0066 bcma_block_read(dev->bdev, buffer, count, offset, reg_width);
0067 }
0068 static
0069 void b43_bus_bcma_block_write(struct b43_bus_dev *dev, const void *buffer,
0070 size_t count, u16 offset, u8 reg_width)
0071 {
0072 bcma_block_write(dev->bdev, buffer, count, offset, reg_width);
0073 }
0074
0075 struct b43_bus_dev *b43_bus_dev_bcma_init(struct bcma_device *core)
0076 {
0077 struct b43_bus_dev *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
0078 if (!dev)
0079 return NULL;
0080
0081 dev->bus_type = B43_BUS_BCMA;
0082 dev->bdev = core;
0083
0084 dev->bus_may_powerdown = b43_bus_bcma_bus_may_powerdown;
0085 dev->bus_powerup = b43_bus_bcma_bus_powerup;
0086 dev->device_is_enabled = b43_bus_bcma_device_is_enabled;
0087 dev->device_enable = b43_bus_bcma_device_enable;
0088 dev->device_disable = b43_bus_bcma_device_disable;
0089
0090 dev->read16 = b43_bus_bcma_read16;
0091 dev->read32 = b43_bus_bcma_read32;
0092 dev->write16 = b43_bus_bcma_write16;
0093 dev->write32 = b43_bus_bcma_write32;
0094 dev->block_read = b43_bus_bcma_block_read;
0095 dev->block_write = b43_bus_bcma_block_write;
0096 #ifdef CONFIG_BCM47XX_BCMA
0097 if (b43_bus_host_is_pci(dev) &&
0098 bcm47xx_bus_type == BCM47XX_BUS_TYPE_BCMA &&
0099 bcm47xx_bus.bcma.bus.chipinfo.id == BCMA_CHIP_ID_BCM4716)
0100 dev->flush_writes = true;
0101 #endif
0102
0103 dev->dev = &core->dev;
0104 dev->dma_dev = core->dma_dev;
0105 dev->irq = core->irq;
0106
0107 dev->board_vendor = core->bus->boardinfo.vendor;
0108 dev->board_type = core->bus->boardinfo.type;
0109 dev->board_rev = core->bus->sprom.board_rev;
0110
0111 dev->chip_id = core->bus->chipinfo.id;
0112 dev->chip_rev = core->bus->chipinfo.rev;
0113 dev->chip_pkg = core->bus->chipinfo.pkg;
0114
0115 dev->bus_sprom = &core->bus->sprom;
0116
0117 dev->core_id = core->id.id;
0118 dev->core_rev = core->id.rev;
0119
0120 return dev;
0121 }
0122 #endif
0123
0124
0125 #ifdef CONFIG_B43_SSB
0126 static int b43_bus_ssb_bus_may_powerdown(struct b43_bus_dev *dev)
0127 {
0128 return ssb_bus_may_powerdown(dev->sdev->bus);
0129 }
0130 static int b43_bus_ssb_bus_powerup(struct b43_bus_dev *dev,
0131 bool dynamic_pctl)
0132 {
0133 return ssb_bus_powerup(dev->sdev->bus, dynamic_pctl);
0134 }
0135 static int b43_bus_ssb_device_is_enabled(struct b43_bus_dev *dev)
0136 {
0137 return ssb_device_is_enabled(dev->sdev);
0138 }
0139 static void b43_bus_ssb_device_enable(struct b43_bus_dev *dev,
0140 u32 core_specific_flags)
0141 {
0142 ssb_device_enable(dev->sdev, core_specific_flags);
0143 }
0144 static void b43_bus_ssb_device_disable(struct b43_bus_dev *dev,
0145 u32 core_specific_flags)
0146 {
0147 ssb_device_disable(dev->sdev, core_specific_flags);
0148 }
0149
0150 static u16 b43_bus_ssb_read16(struct b43_bus_dev *dev, u16 offset)
0151 {
0152 return ssb_read16(dev->sdev, offset);
0153 }
0154 static u32 b43_bus_ssb_read32(struct b43_bus_dev *dev, u16 offset)
0155 {
0156 return ssb_read32(dev->sdev, offset);
0157 }
0158 static void b43_bus_ssb_write16(struct b43_bus_dev *dev, u16 offset, u16 value)
0159 {
0160 ssb_write16(dev->sdev, offset, value);
0161 }
0162 static void b43_bus_ssb_write32(struct b43_bus_dev *dev, u16 offset, u32 value)
0163 {
0164 ssb_write32(dev->sdev, offset, value);
0165 }
0166 static void b43_bus_ssb_block_read(struct b43_bus_dev *dev, void *buffer,
0167 size_t count, u16 offset, u8 reg_width)
0168 {
0169 ssb_block_read(dev->sdev, buffer, count, offset, reg_width);
0170 }
0171 static
0172 void b43_bus_ssb_block_write(struct b43_bus_dev *dev, const void *buffer,
0173 size_t count, u16 offset, u8 reg_width)
0174 {
0175 ssb_block_write(dev->sdev, buffer, count, offset, reg_width);
0176 }
0177
0178 struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev)
0179 {
0180 struct b43_bus_dev *dev;
0181
0182 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
0183 if (!dev)
0184 return NULL;
0185
0186 dev->bus_type = B43_BUS_SSB;
0187 dev->sdev = sdev;
0188
0189 dev->bus_may_powerdown = b43_bus_ssb_bus_may_powerdown;
0190 dev->bus_powerup = b43_bus_ssb_bus_powerup;
0191 dev->device_is_enabled = b43_bus_ssb_device_is_enabled;
0192 dev->device_enable = b43_bus_ssb_device_enable;
0193 dev->device_disable = b43_bus_ssb_device_disable;
0194
0195 dev->read16 = b43_bus_ssb_read16;
0196 dev->read32 = b43_bus_ssb_read32;
0197 dev->write16 = b43_bus_ssb_write16;
0198 dev->write32 = b43_bus_ssb_write32;
0199 dev->block_read = b43_bus_ssb_block_read;
0200 dev->block_write = b43_bus_ssb_block_write;
0201
0202 dev->dev = sdev->dev;
0203 dev->dma_dev = sdev->dma_dev;
0204 dev->irq = sdev->irq;
0205
0206 dev->board_vendor = sdev->bus->boardinfo.vendor;
0207 dev->board_type = sdev->bus->boardinfo.type;
0208 dev->board_rev = sdev->bus->sprom.board_rev;
0209
0210 dev->chip_id = sdev->bus->chip_id;
0211 dev->chip_rev = sdev->bus->chip_rev;
0212 dev->chip_pkg = sdev->bus->chip_package;
0213
0214 dev->bus_sprom = &sdev->bus->sprom;
0215
0216 dev->core_id = sdev->id.coreid;
0217 dev->core_rev = sdev->id.revision;
0218
0219 return dev;
0220 }
0221 #endif
0222
0223 void *b43_bus_get_wldev(struct b43_bus_dev *dev)
0224 {
0225 switch (dev->bus_type) {
0226 #ifdef CONFIG_B43_BCMA
0227 case B43_BUS_BCMA:
0228 return bcma_get_drvdata(dev->bdev);
0229 #endif
0230 #ifdef CONFIG_B43_SSB
0231 case B43_BUS_SSB:
0232 return ssb_get_drvdata(dev->sdev);
0233 #endif
0234 }
0235 return NULL;
0236 }
0237
0238 void b43_bus_set_wldev(struct b43_bus_dev *dev, void *wldev)
0239 {
0240 switch (dev->bus_type) {
0241 #ifdef CONFIG_B43_BCMA
0242 case B43_BUS_BCMA:
0243 bcma_set_drvdata(dev->bdev, wldev);
0244 break;
0245 #endif
0246 #ifdef CONFIG_B43_SSB
0247 case B43_BUS_SSB:
0248 ssb_set_drvdata(dev->sdev, wldev);
0249 break;
0250 #endif
0251 }
0252 }