xref: /linux/drivers/net/wireless/broadcom/b43/bus.h (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2482f0538SRafał Miłecki #ifndef B43_BUS_H_
3482f0538SRafał Miłecki #define B43_BUS_H_
4482f0538SRafał Miłecki 
5482f0538SRafał Miłecki enum b43_bus_type {
66cbab0d9SRafał Miłecki #ifdef CONFIG_B43_BCMA
7397915c3SRafał Miłecki 	B43_BUS_BCMA,
86cbab0d9SRafał Miłecki #endif
9bd7c8a59SRafał Miłecki #ifdef CONFIG_B43_SSB
10482f0538SRafał Miłecki 	B43_BUS_SSB,
11bd7c8a59SRafał Miłecki #endif
12482f0538SRafał Miłecki };
13482f0538SRafał Miłecki 
14482f0538SRafał Miłecki struct b43_bus_dev {
15482f0538SRafał Miłecki 	enum b43_bus_type bus_type;
16482f0538SRafał Miłecki 	union {
17397915c3SRafał Miłecki 		struct bcma_device *bdev;
18482f0538SRafał Miłecki 		struct ssb_device *sdev;
19482f0538SRafał Miłecki 	};
20c0b4c009SRafał Miłecki 
2124ca39d6SRafał Miłecki 	int (*bus_may_powerdown)(struct b43_bus_dev *dev);
2224ca39d6SRafał Miłecki 	int (*bus_powerup)(struct b43_bus_dev *dev, bool dynamic_pctl);
2324ca39d6SRafał Miłecki 	int (*device_is_enabled)(struct b43_bus_dev *dev);
2424ca39d6SRafał Miłecki 	void (*device_enable)(struct b43_bus_dev *dev,
2524ca39d6SRafał Miłecki 			      u32 core_specific_flags);
2624ca39d6SRafał Miłecki 	void (*device_disable)(struct b43_bus_dev *dev,
2724ca39d6SRafał Miłecki 			       u32 core_specific_flags);
2824ca39d6SRafał Miłecki 
29c0b4c009SRafał Miłecki 	u16 (*read16)(struct b43_bus_dev *dev, u16 offset);
30c0b4c009SRafał Miłecki 	u32 (*read32)(struct b43_bus_dev *dev, u16 offset);
31c0b4c009SRafał Miłecki 	void (*write16)(struct b43_bus_dev *dev, u16 offset, u16 value);
32c0b4c009SRafał Miłecki 	void (*write32)(struct b43_bus_dev *dev, u16 offset, u32 value);
33c0b4c009SRafał Miłecki 	void (*block_read)(struct b43_bus_dev *dev, void *buffer,
34c0b4c009SRafał Miłecki 			   size_t count, u16 offset, u8 reg_width);
35c0b4c009SRafał Miłecki 	void (*block_write)(struct b43_bus_dev *dev, const void *buffer,
36c0b4c009SRafał Miłecki 			    size_t count, u16 offset, u8 reg_width);
3725c15566SRafał Miłecki 	bool flush_writes;
3821d889d4SRafał Miłecki 
39a18c715eSRafał Miłecki 	struct device *dev;
40a18c715eSRafał Miłecki 	struct device *dma_dev;
41a18c715eSRafał Miłecki 	unsigned int irq;
42a18c715eSRafał Miłecki 
4379d2232fSRafał Miłecki 	u16 board_vendor;
4479d2232fSRafał Miłecki 	u16 board_type;
4579d2232fSRafał Miłecki 	u16 board_rev;
4679d2232fSRafał Miłecki 
47c244e08cSRafał Miłecki 	u16 chip_id;
48c244e08cSRafał Miłecki 	u8 chip_rev;
49c244e08cSRafał Miłecki 	u8 chip_pkg;
50c244e08cSRafał Miłecki 
510581483aSRafał Miłecki 	struct ssb_sprom *bus_sprom;
520581483aSRafał Miłecki 
5321d889d4SRafał Miłecki 	u16 core_id;
5421d889d4SRafał Miłecki 	u8 core_rev;
55482f0538SRafał Miłecki };
56482f0538SRafał Miłecki 
b43_bus_host_is_pcmcia(struct b43_bus_dev * dev)57505fb019SRafał Miłecki static inline bool b43_bus_host_is_pcmcia(struct b43_bus_dev *dev)
58505fb019SRafał Miłecki {
59bd7c8a59SRafał Miłecki #ifdef CONFIG_B43_SSB
60505fb019SRafał Miłecki 	return (dev->bus_type == B43_BUS_SSB &&
61505fb019SRafał Miłecki 		dev->sdev->bus->bustype == SSB_BUSTYPE_PCMCIA);
62bd7c8a59SRafał Miłecki #else
63bd7c8a59SRafał Miłecki 	return false;
64bd7c8a59SRafał Miłecki #endif
656247d2aaSRafał Miłecki };
666247d2aaSRafał Miłecki 
b43_bus_host_is_pci(struct b43_bus_dev * dev)676247d2aaSRafał Miłecki static inline bool b43_bus_host_is_pci(struct b43_bus_dev *dev)
686247d2aaSRafał Miłecki {
696247d2aaSRafał Miłecki #ifdef CONFIG_B43_BCMA
706247d2aaSRafał Miłecki 	if (dev->bus_type == B43_BUS_BCMA)
716247d2aaSRafał Miłecki 		return (dev->bdev->bus->hosttype == BCMA_HOSTTYPE_PCI);
726247d2aaSRafał Miłecki #endif
736247d2aaSRafał Miłecki #ifdef CONFIG_B43_SSB
746247d2aaSRafał Miłecki 	if (dev->bus_type == B43_BUS_SSB)
756247d2aaSRafał Miłecki 		return (dev->sdev->bus->bustype == SSB_BUSTYPE_PCI);
766247d2aaSRafał Miłecki #endif
776247d2aaSRafał Miłecki 	return false;
78505fb019SRafał Miłecki }
796247d2aaSRafał Miłecki 
b43_bus_host_is_sdio(struct b43_bus_dev * dev)80505fb019SRafał Miłecki static inline bool b43_bus_host_is_sdio(struct b43_bus_dev *dev)
81505fb019SRafał Miłecki {
82bd7c8a59SRafał Miłecki #ifdef CONFIG_B43_SSB
83505fb019SRafał Miłecki 	return (dev->bus_type == B43_BUS_SSB &&
84505fb019SRafał Miłecki 		dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO);
85bd7c8a59SRafał Miłecki #else
86bd7c8a59SRafał Miłecki 	return false;
87bd7c8a59SRafał Miłecki #endif
88505fb019SRafał Miłecki }
89505fb019SRafał Miłecki 
90397915c3SRafał Miłecki struct b43_bus_dev *b43_bus_dev_bcma_init(struct bcma_device *core);
91482f0538SRafał Miłecki struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev);
92482f0538SRafał Miłecki 
9374abacb6SRafał Miłecki void *b43_bus_get_wldev(struct b43_bus_dev *dev);
9474abacb6SRafał Miłecki void b43_bus_set_wldev(struct b43_bus_dev *dev, void *data);
9574abacb6SRafał Miłecki 
96482f0538SRafał Miłecki #endif /* B43_BUS_H_ */
97