xref: /linux/drivers/ssb/ssb_private.h (revision 72a525cb)
161e115a5SMichael Buesch #ifndef LINUX_SSB_PRIVATE_H_
261e115a5SMichael Buesch #define LINUX_SSB_PRIVATE_H_
361e115a5SMichael Buesch 
461e115a5SMichael Buesch #include <linux/ssb/ssb.h>
561e115a5SMichael Buesch #include <linux/types.h>
67ffbffe3SHauke Mehrtens #include <linux/bcm47xx_wdt.h>
761e115a5SMichael Buesch 
861e115a5SMichael Buesch 
961e115a5SMichael Buesch #define PFX	"ssb: "
1061e115a5SMichael Buesch 
1161e115a5SMichael Buesch #ifdef CONFIG_SSB_SILENT
1261e115a5SMichael Buesch # define ssb_printk(fmt, x...)	do { /* nothing */ } while (0)
1361e115a5SMichael Buesch #else
1461e115a5SMichael Buesch # define ssb_printk		printk
1561e115a5SMichael Buesch #endif /* CONFIG_SSB_SILENT */
1661e115a5SMichael Buesch 
1761e115a5SMichael Buesch /* dprintk: Debugging printk; vanishes for non-debug compilation */
1861e115a5SMichael Buesch #ifdef CONFIG_SSB_DEBUG
1961e115a5SMichael Buesch # define ssb_dprintk(fmt, x...)	ssb_printk(fmt , ##x)
2061e115a5SMichael Buesch #else
2161e115a5SMichael Buesch # define ssb_dprintk(fmt, x...)	do { /* nothing */ } while (0)
2261e115a5SMichael Buesch #endif
2361e115a5SMichael Buesch 
2461e115a5SMichael Buesch #ifdef CONFIG_SSB_DEBUG
2561e115a5SMichael Buesch # define SSB_WARN_ON(x)		WARN_ON(x)
2661e115a5SMichael Buesch # define SSB_BUG_ON(x)		BUG_ON(x)
2761e115a5SMichael Buesch #else
2861e115a5SMichael Buesch static inline int __ssb_do_nothing(int x) { return x; }
2961e115a5SMichael Buesch # define SSB_WARN_ON(x)		__ssb_do_nothing(unlikely(!!(x)))
3061e115a5SMichael Buesch # define SSB_BUG_ON(x)		__ssb_do_nothing(unlikely(!!(x)))
3161e115a5SMichael Buesch #endif
3261e115a5SMichael Buesch 
3361e115a5SMichael Buesch 
3461e115a5SMichael Buesch /* pci.c */
3561e115a5SMichael Buesch #ifdef CONFIG_SSB_PCIHOST
3661e115a5SMichael Buesch extern int ssb_pci_switch_core(struct ssb_bus *bus,
3761e115a5SMichael Buesch 			       struct ssb_device *dev);
3861e115a5SMichael Buesch extern int ssb_pci_switch_coreidx(struct ssb_bus *bus,
3961e115a5SMichael Buesch 				  u8 coreidx);
4061e115a5SMichael Buesch extern int ssb_pci_xtal(struct ssb_bus *bus, u32 what,
4161e115a5SMichael Buesch 			int turn_on);
4261e115a5SMichael Buesch extern int ssb_pci_get_invariants(struct ssb_bus *bus,
4361e115a5SMichael Buesch 				  struct ssb_init_invariants *iv);
4461e115a5SMichael Buesch extern void ssb_pci_exit(struct ssb_bus *bus);
4561e115a5SMichael Buesch extern int ssb_pci_init(struct ssb_bus *bus);
4661e115a5SMichael Buesch extern const struct ssb_bus_ops ssb_pci_ops;
4761e115a5SMichael Buesch 
4861e115a5SMichael Buesch #else /* CONFIG_SSB_PCIHOST */
4961e115a5SMichael Buesch 
5061e115a5SMichael Buesch static inline int ssb_pci_switch_core(struct ssb_bus *bus,
5161e115a5SMichael Buesch 				      struct ssb_device *dev)
5261e115a5SMichael Buesch {
5361e115a5SMichael Buesch 	return 0;
5461e115a5SMichael Buesch }
5561e115a5SMichael Buesch static inline int ssb_pci_switch_coreidx(struct ssb_bus *bus,
5661e115a5SMichael Buesch 					 u8 coreidx)
5761e115a5SMichael Buesch {
5861e115a5SMichael Buesch 	return 0;
5961e115a5SMichael Buesch }
6061e115a5SMichael Buesch static inline int ssb_pci_xtal(struct ssb_bus *bus, u32 what,
6161e115a5SMichael Buesch 			       int turn_on)
6261e115a5SMichael Buesch {
6361e115a5SMichael Buesch 	return 0;
6461e115a5SMichael Buesch }
6561e115a5SMichael Buesch static inline void ssb_pci_exit(struct ssb_bus *bus)
6661e115a5SMichael Buesch {
6761e115a5SMichael Buesch }
6861e115a5SMichael Buesch static inline int ssb_pci_init(struct ssb_bus *bus)
6961e115a5SMichael Buesch {
7061e115a5SMichael Buesch 	return 0;
7161e115a5SMichael Buesch }
7261e115a5SMichael Buesch #endif /* CONFIG_SSB_PCIHOST */
7361e115a5SMichael Buesch 
7461e115a5SMichael Buesch 
7561e115a5SMichael Buesch /* pcmcia.c */
7661e115a5SMichael Buesch #ifdef CONFIG_SSB_PCMCIAHOST
7761e115a5SMichael Buesch extern int ssb_pcmcia_switch_core(struct ssb_bus *bus,
7861e115a5SMichael Buesch 				  struct ssb_device *dev);
7961e115a5SMichael Buesch extern int ssb_pcmcia_switch_coreidx(struct ssb_bus *bus,
8061e115a5SMichael Buesch 				     u8 coreidx);
8161e115a5SMichael Buesch extern int ssb_pcmcia_switch_segment(struct ssb_bus *bus,
8261e115a5SMichael Buesch 				     u8 seg);
8361e115a5SMichael Buesch extern int ssb_pcmcia_get_invariants(struct ssb_bus *bus,
8461e115a5SMichael Buesch 				     struct ssb_init_invariants *iv);
858fe2b65aSMichael Buesch extern int ssb_pcmcia_hardware_setup(struct ssb_bus *bus);
86e7ec2e32SMichael Buesch extern void ssb_pcmcia_exit(struct ssb_bus *bus);
8761e115a5SMichael Buesch extern int ssb_pcmcia_init(struct ssb_bus *bus);
8861e115a5SMichael Buesch extern const struct ssb_bus_ops ssb_pcmcia_ops;
8961e115a5SMichael Buesch #else /* CONFIG_SSB_PCMCIAHOST */
9061e115a5SMichael Buesch static inline int ssb_pcmcia_switch_core(struct ssb_bus *bus,
9161e115a5SMichael Buesch 					 struct ssb_device *dev)
9261e115a5SMichael Buesch {
9361e115a5SMichael Buesch 	return 0;
9461e115a5SMichael Buesch }
9561e115a5SMichael Buesch static inline int ssb_pcmcia_switch_coreidx(struct ssb_bus *bus,
9661e115a5SMichael Buesch 					    u8 coreidx)
9761e115a5SMichael Buesch {
9861e115a5SMichael Buesch 	return 0;
9961e115a5SMichael Buesch }
10061e115a5SMichael Buesch static inline int ssb_pcmcia_switch_segment(struct ssb_bus *bus,
10161e115a5SMichael Buesch 					    u8 seg)
10261e115a5SMichael Buesch {
10361e115a5SMichael Buesch 	return 0;
10461e115a5SMichael Buesch }
1058fe2b65aSMichael Buesch static inline int ssb_pcmcia_hardware_setup(struct ssb_bus *bus)
1068fe2b65aSMichael Buesch {
1078fe2b65aSMichael Buesch 	return 0;
1088fe2b65aSMichael Buesch }
109e7ec2e32SMichael Buesch static inline void ssb_pcmcia_exit(struct ssb_bus *bus)
110e7ec2e32SMichael Buesch {
111e7ec2e32SMichael Buesch }
11261e115a5SMichael Buesch static inline int ssb_pcmcia_init(struct ssb_bus *bus)
11361e115a5SMichael Buesch {
11461e115a5SMichael Buesch 	return 0;
11561e115a5SMichael Buesch }
11661e115a5SMichael Buesch #endif /* CONFIG_SSB_PCMCIAHOST */
11761e115a5SMichael Buesch 
11824ea602eSAlbert Herranz /* sdio.c */
11924ea602eSAlbert Herranz #ifdef CONFIG_SSB_SDIOHOST
12024ea602eSAlbert Herranz extern int ssb_sdio_get_invariants(struct ssb_bus *bus,
12124ea602eSAlbert Herranz 				     struct ssb_init_invariants *iv);
12224ea602eSAlbert Herranz 
12324ea602eSAlbert Herranz extern u32 ssb_sdio_scan_read32(struct ssb_bus *bus, u16 offset);
12424ea602eSAlbert Herranz extern int ssb_sdio_switch_core(struct ssb_bus *bus, struct ssb_device *dev);
12524ea602eSAlbert Herranz extern int ssb_sdio_scan_switch_coreidx(struct ssb_bus *bus, u8 coreidx);
12624ea602eSAlbert Herranz extern int ssb_sdio_hardware_setup(struct ssb_bus *bus);
12724ea602eSAlbert Herranz extern void ssb_sdio_exit(struct ssb_bus *bus);
12824ea602eSAlbert Herranz extern int ssb_sdio_init(struct ssb_bus *bus);
12924ea602eSAlbert Herranz 
13024ea602eSAlbert Herranz extern const struct ssb_bus_ops ssb_sdio_ops;
13124ea602eSAlbert Herranz #else /* CONFIG_SSB_SDIOHOST */
13224ea602eSAlbert Herranz static inline u32 ssb_sdio_scan_read32(struct ssb_bus *bus, u16 offset)
13324ea602eSAlbert Herranz {
13424ea602eSAlbert Herranz 	return 0;
13524ea602eSAlbert Herranz }
13624ea602eSAlbert Herranz static inline int ssb_sdio_switch_core(struct ssb_bus *bus,
13724ea602eSAlbert Herranz 					 struct ssb_device *dev)
13824ea602eSAlbert Herranz {
13924ea602eSAlbert Herranz 	return 0;
14024ea602eSAlbert Herranz }
14124ea602eSAlbert Herranz static inline int ssb_sdio_scan_switch_coreidx(struct ssb_bus *bus, u8 coreidx)
14224ea602eSAlbert Herranz {
14324ea602eSAlbert Herranz 	return 0;
14424ea602eSAlbert Herranz }
14524ea602eSAlbert Herranz static inline int ssb_sdio_hardware_setup(struct ssb_bus *bus)
14624ea602eSAlbert Herranz {
14724ea602eSAlbert Herranz 	return 0;
14824ea602eSAlbert Herranz }
14924ea602eSAlbert Herranz static inline void ssb_sdio_exit(struct ssb_bus *bus)
15024ea602eSAlbert Herranz {
15124ea602eSAlbert Herranz }
15224ea602eSAlbert Herranz static inline int ssb_sdio_init(struct ssb_bus *bus)
15324ea602eSAlbert Herranz {
15424ea602eSAlbert Herranz 	return 0;
15524ea602eSAlbert Herranz }
15624ea602eSAlbert Herranz #endif /* CONFIG_SSB_SDIOHOST */
15724ea602eSAlbert Herranz 
15861e115a5SMichael Buesch 
15961e115a5SMichael Buesch /* scan.c */
16061e115a5SMichael Buesch extern const char *ssb_core_name(u16 coreid);
16161e115a5SMichael Buesch extern int ssb_bus_scan(struct ssb_bus *bus,
16261e115a5SMichael Buesch 			unsigned long baseaddr);
16361e115a5SMichael Buesch extern void ssb_iounmap(struct ssb_bus *ssb);
16461e115a5SMichael Buesch 
16561e115a5SMichael Buesch 
166e7ec2e32SMichael Buesch /* sprom.c */
167e7ec2e32SMichael Buesch extern
168e7ec2e32SMichael Buesch ssize_t ssb_attr_sprom_show(struct ssb_bus *bus, char *buf,
169e7ec2e32SMichael Buesch 			    int (*sprom_read)(struct ssb_bus *bus, u16 *sprom));
170e7ec2e32SMichael Buesch extern
171e7ec2e32SMichael Buesch ssize_t ssb_attr_sprom_store(struct ssb_bus *bus,
172e7ec2e32SMichael Buesch 			     const char *buf, size_t count,
173e7ec2e32SMichael Buesch 			     int (*sprom_check_crc)(const u16 *sprom, size_t size),
174e7ec2e32SMichael Buesch 			     int (*sprom_write)(struct ssb_bus *bus, const u16 *sprom));
175b3ae52b6SHauke Mehrtens extern int ssb_fill_sprom_with_fallback(struct ssb_bus *bus,
176b3ae52b6SHauke Mehrtens 					struct ssb_sprom *out);
177e7ec2e32SMichael Buesch 
178e7ec2e32SMichael Buesch 
17961e115a5SMichael Buesch /* core.c */
18061e115a5SMichael Buesch extern u32 ssb_calc_clock_rate(u32 plltype, u32 n, u32 m);
18161e115a5SMichael Buesch extern struct ssb_bus *ssb_pci_dev_to_bus(struct pci_dev *pdev);
182aab547ceSMichael Buesch int ssb_for_each_bus_call(unsigned long data,
183aab547ceSMichael Buesch 			  int (*func)(struct ssb_bus *bus, unsigned long data));
184e7ec2e32SMichael Buesch extern struct ssb_bus *ssb_pcmcia_dev_to_bus(struct pcmcia_device *pdev);
185e7ec2e32SMichael Buesch 
1863ba6018aSMichael Buesch struct ssb_freeze_context {
1873ba6018aSMichael Buesch 	/* Pointer to the bus */
1883ba6018aSMichael Buesch 	struct ssb_bus *bus;
1893ba6018aSMichael Buesch 	/* Boolean list to indicate whether a device is frozen on this bus. */
1903ba6018aSMichael Buesch 	bool device_frozen[SSB_MAX_NR_CORES];
1913ba6018aSMichael Buesch };
1923ba6018aSMichael Buesch extern int ssb_devices_freeze(struct ssb_bus *bus, struct ssb_freeze_context *ctx);
1933ba6018aSMichael Buesch extern int ssb_devices_thaw(struct ssb_freeze_context *ctx);
1943ba6018aSMichael Buesch 
1953ba6018aSMichael Buesch 
19661e115a5SMichael Buesch 
19761e115a5SMichael Buesch /* b43_pci_bridge.c */
198c7084535SAlexey Zaytsev #ifdef CONFIG_SSB_B43_PCI_BRIDGE
19961e115a5SMichael Buesch extern int __init b43_pci_ssb_bridge_init(void);
20061e115a5SMichael Buesch extern void __exit b43_pci_ssb_bridge_exit(void);
2010052b8bbSHauke Mehrtens #else /* CONFIG_SSB_B43_PCI_BRIDGE */
20261e115a5SMichael Buesch static inline int b43_pci_ssb_bridge_init(void)
20361e115a5SMichael Buesch {
20461e115a5SMichael Buesch 	return 0;
20561e115a5SMichael Buesch }
20661e115a5SMichael Buesch static inline void b43_pci_ssb_bridge_exit(void)
20761e115a5SMichael Buesch {
20861e115a5SMichael Buesch }
2090052b8bbSHauke Mehrtens #endif /* CONFIG_SSB_B43_PCI_BRIDGE */
21061e115a5SMichael Buesch 
211d486a5b4SHauke Mehrtens /* driver_chipcommon_pmu.c */
212d486a5b4SHauke Mehrtens extern u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc);
213d486a5b4SHauke Mehrtens extern u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc);
214f924e1e9SHauke Mehrtens extern u32 ssb_pmu_get_alp_clock(struct ssb_chipcommon *cc);
215d486a5b4SHauke Mehrtens 
2167ffbffe3SHauke Mehrtens extern u32 ssb_chipco_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt,
2177ffbffe3SHauke Mehrtens 					     u32 ticks);
2187ffbffe3SHauke Mehrtens extern u32 ssb_chipco_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
2197ffbffe3SHauke Mehrtens 
220*72a525cbSRafał Miłecki /* driver_chipcommon_sflash.c */
221*72a525cbSRafał Miłecki #ifdef CONFIG_SSB_SFLASH
222*72a525cbSRafał Miłecki int ssb_sflash_init(struct ssb_chipcommon *cc);
223*72a525cbSRafał Miłecki #else
224*72a525cbSRafał Miłecki static inline int ssb_sflash_init(struct ssb_chipcommon *cc)
225*72a525cbSRafał Miłecki {
226*72a525cbSRafał Miłecki 	pr_err("Serial flash not supported\n");
227*72a525cbSRafał Miłecki 	return 0;
228*72a525cbSRafał Miłecki }
229*72a525cbSRafał Miłecki #endif /* CONFIG_SSB_SFLASH */
230*72a525cbSRafał Miłecki 
2319f640a63SHauke Mehrtens #ifdef CONFIG_SSB_DRIVER_EXTIF
2329f640a63SHauke Mehrtens extern u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks);
2339f640a63SHauke Mehrtens extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
2349f640a63SHauke Mehrtens #else
2359f640a63SHauke Mehrtens static inline u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt,
2369f640a63SHauke Mehrtens 						   u32 ticks)
2379f640a63SHauke Mehrtens {
2389f640a63SHauke Mehrtens 	return 0;
2399f640a63SHauke Mehrtens }
2409f640a63SHauke Mehrtens static inline u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt,
2419f640a63SHauke Mehrtens 						  u32 ms)
2429f640a63SHauke Mehrtens {
2439f640a63SHauke Mehrtens 	return 0;
2449f640a63SHauke Mehrtens }
2459f640a63SHauke Mehrtens #endif
246bde327efSHauke Mehrtens 
247bde327efSHauke Mehrtens #ifdef CONFIG_SSB_EMBEDDED
248bde327efSHauke Mehrtens extern int ssb_watchdog_register(struct ssb_bus *bus);
249bde327efSHauke Mehrtens #else /* CONFIG_SSB_EMBEDDED */
250bde327efSHauke Mehrtens static inline int ssb_watchdog_register(struct ssb_bus *bus)
251bde327efSHauke Mehrtens {
252bde327efSHauke Mehrtens 	return 0;
253bde327efSHauke Mehrtens }
254bde327efSHauke Mehrtens #endif /* CONFIG_SSB_EMBEDDED */
255bde327efSHauke Mehrtens 
256394bc7e3SHauke Mehrtens #ifdef CONFIG_SSB_DRIVER_EXTIF
257394bc7e3SHauke Mehrtens extern void ssb_extif_init(struct ssb_extif *extif);
258394bc7e3SHauke Mehrtens #else
259394bc7e3SHauke Mehrtens static inline void ssb_extif_init(struct ssb_extif *extif)
260394bc7e3SHauke Mehrtens {
261394bc7e3SHauke Mehrtens }
262394bc7e3SHauke Mehrtens #endif
263394bc7e3SHauke Mehrtens 
264ec43b08bSHauke Mehrtens #ifdef CONFIG_SSB_DRIVER_GPIO
265ec43b08bSHauke Mehrtens extern int ssb_gpio_init(struct ssb_bus *bus);
266ec43b08bSHauke Mehrtens #else /* CONFIG_SSB_DRIVER_GPIO */
267ec43b08bSHauke Mehrtens static inline int ssb_gpio_init(struct ssb_bus *bus)
268ec43b08bSHauke Mehrtens {
269ec43b08bSHauke Mehrtens 	return -ENOTSUPP;
270ec43b08bSHauke Mehrtens }
271ec43b08bSHauke Mehrtens #endif /* CONFIG_SSB_DRIVER_GPIO */
272ec43b08bSHauke Mehrtens 
27361e115a5SMichael Buesch #endif /* LINUX_SSB_PRIVATE_H_ */
274