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