Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003 
0004   Broadcom B43 wireless driver
0005   Bus abstraction layer
0006 
0007   Copyright (c) 2011 Rafał Miłecki <zajec5@gmail.com>
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 /* BCMA */
0020 #ifdef CONFIG_B43_BCMA
0021 static int b43_bus_bcma_bus_may_powerdown(struct b43_bus_dev *dev)
0022 {
0023     return 0; /* bcma_bus_may_powerdown(dev->bdev->bus); */
0024 }
0025 static int b43_bus_bcma_bus_powerup(struct b43_bus_dev *dev,
0026                       bool dynamic_pctl)
0027 {
0028     return 0; /* bcma_bus_powerup(dev->sdev->bus, dynamic_pctl); */
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 /* CONFIG_B43_BCMA */
0123 
0124 /* SSB */
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 /* CONFIG_B43_SSB */
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 }