xref: /linux/drivers/ssb/ssb_private.h (revision 209b4375)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
261e115a5SMichael Buesch #ifndef LINUX_SSB_PRIVATE_H_
361e115a5SMichael Buesch #define LINUX_SSB_PRIVATE_H_
461e115a5SMichael Buesch 
5*b8b6069cSMichael Büsch #define PFX		"ssb: "
6*b8b6069cSMichael Büsch #define pr_fmt(fmt)	PFX fmt
7*b8b6069cSMichael Büsch 
861e115a5SMichael Buesch #include <linux/ssb/ssb.h>
961e115a5SMichael Buesch #include <linux/types.h>
107ffbffe3SHauke Mehrtens #include <linux/bcm47xx_wdt.h>
1161e115a5SMichael Buesch 
1261e115a5SMichael Buesch 
1361e115a5SMichael Buesch /* pci.c */
1461e115a5SMichael Buesch #ifdef CONFIG_SSB_PCIHOST
1561e115a5SMichael Buesch extern int ssb_pci_switch_core(struct ssb_bus *bus,
1661e115a5SMichael Buesch 			       struct ssb_device *dev);
1761e115a5SMichael Buesch extern int ssb_pci_switch_coreidx(struct ssb_bus *bus,
1861e115a5SMichael Buesch 				  u8 coreidx);
1961e115a5SMichael Buesch extern int ssb_pci_xtal(struct ssb_bus *bus, u32 what,
2061e115a5SMichael Buesch 			int turn_on);
2161e115a5SMichael Buesch extern int ssb_pci_get_invariants(struct ssb_bus *bus,
2261e115a5SMichael Buesch 				  struct ssb_init_invariants *iv);
2361e115a5SMichael Buesch extern void ssb_pci_exit(struct ssb_bus *bus);
2461e115a5SMichael Buesch extern int ssb_pci_init(struct ssb_bus *bus);
2561e115a5SMichael Buesch extern const struct ssb_bus_ops ssb_pci_ops;
2661e115a5SMichael Buesch 
2761e115a5SMichael Buesch #else /* CONFIG_SSB_PCIHOST */
2861e115a5SMichael Buesch 
ssb_pci_switch_core(struct ssb_bus * bus,struct ssb_device * dev)2961e115a5SMichael Buesch static inline int ssb_pci_switch_core(struct ssb_bus *bus,
3061e115a5SMichael Buesch 				      struct ssb_device *dev)
3161e115a5SMichael Buesch {
3261e115a5SMichael Buesch 	return 0;
3361e115a5SMichael Buesch }
ssb_pci_switch_coreidx(struct ssb_bus * bus,u8 coreidx)3461e115a5SMichael Buesch static inline int ssb_pci_switch_coreidx(struct ssb_bus *bus,
3561e115a5SMichael Buesch 					 u8 coreidx)
3661e115a5SMichael Buesch {
3761e115a5SMichael Buesch 	return 0;
3861e115a5SMichael Buesch }
ssb_pci_xtal(struct ssb_bus * bus,u32 what,int turn_on)3961e115a5SMichael Buesch static inline int ssb_pci_xtal(struct ssb_bus *bus, u32 what,
4061e115a5SMichael Buesch 			       int turn_on)
4161e115a5SMichael Buesch {
4261e115a5SMichael Buesch 	return 0;
4361e115a5SMichael Buesch }
ssb_pci_exit(struct ssb_bus * bus)4461e115a5SMichael Buesch static inline void ssb_pci_exit(struct ssb_bus *bus)
4561e115a5SMichael Buesch {
4661e115a5SMichael Buesch }
ssb_pci_init(struct ssb_bus * bus)4761e115a5SMichael Buesch static inline int ssb_pci_init(struct ssb_bus *bus)
4861e115a5SMichael Buesch {
4961e115a5SMichael Buesch 	return 0;
5061e115a5SMichael Buesch }
5161e115a5SMichael Buesch #endif /* CONFIG_SSB_PCIHOST */
5261e115a5SMichael Buesch 
5361e115a5SMichael Buesch 
5461e115a5SMichael Buesch /* pcmcia.c */
5561e115a5SMichael Buesch #ifdef CONFIG_SSB_PCMCIAHOST
5661e115a5SMichael Buesch extern int ssb_pcmcia_switch_coreidx(struct ssb_bus *bus,
5761e115a5SMichael Buesch 				     u8 coreidx);
5861e115a5SMichael Buesch extern int ssb_pcmcia_switch_segment(struct ssb_bus *bus,
5961e115a5SMichael Buesch 				     u8 seg);
6061e115a5SMichael Buesch extern int ssb_pcmcia_get_invariants(struct ssb_bus *bus,
6161e115a5SMichael Buesch 				     struct ssb_init_invariants *iv);
628fe2b65aSMichael Buesch extern int ssb_pcmcia_hardware_setup(struct ssb_bus *bus);
63e7ec2e32SMichael Buesch extern void ssb_pcmcia_exit(struct ssb_bus *bus);
6461e115a5SMichael Buesch extern int ssb_pcmcia_init(struct ssb_bus *bus);
65399500daSRafał Miłecki extern int ssb_host_pcmcia_init(void);
66399500daSRafał Miłecki extern void ssb_host_pcmcia_exit(void);
6761e115a5SMichael Buesch extern const struct ssb_bus_ops ssb_pcmcia_ops;
6861e115a5SMichael Buesch #else /* CONFIG_SSB_PCMCIAHOST */
ssb_pcmcia_switch_coreidx(struct ssb_bus * bus,u8 coreidx)6961e115a5SMichael Buesch static inline int ssb_pcmcia_switch_coreidx(struct ssb_bus *bus,
7061e115a5SMichael Buesch 					    u8 coreidx)
7161e115a5SMichael Buesch {
7261e115a5SMichael Buesch 	return 0;
7361e115a5SMichael Buesch }
ssb_pcmcia_switch_segment(struct ssb_bus * bus,u8 seg)7461e115a5SMichael Buesch static inline int ssb_pcmcia_switch_segment(struct ssb_bus *bus,
7561e115a5SMichael Buesch 					    u8 seg)
7661e115a5SMichael Buesch {
7761e115a5SMichael Buesch 	return 0;
7861e115a5SMichael Buesch }
ssb_pcmcia_hardware_setup(struct ssb_bus * bus)798fe2b65aSMichael Buesch static inline int ssb_pcmcia_hardware_setup(struct ssb_bus *bus)
808fe2b65aSMichael Buesch {
818fe2b65aSMichael Buesch 	return 0;
828fe2b65aSMichael Buesch }
ssb_pcmcia_exit(struct ssb_bus * bus)83e7ec2e32SMichael Buesch static inline void ssb_pcmcia_exit(struct ssb_bus *bus)
84e7ec2e32SMichael Buesch {
85e7ec2e32SMichael Buesch }
ssb_pcmcia_init(struct ssb_bus * bus)8661e115a5SMichael Buesch static inline int ssb_pcmcia_init(struct ssb_bus *bus)
8761e115a5SMichael Buesch {
8861e115a5SMichael Buesch 	return 0;
8961e115a5SMichael Buesch }
ssb_host_pcmcia_init(void)90399500daSRafał Miłecki static inline int ssb_host_pcmcia_init(void)
91399500daSRafał Miłecki {
92399500daSRafał Miłecki 	return 0;
93399500daSRafał Miłecki }
ssb_host_pcmcia_exit(void)94399500daSRafał Miłecki static inline void ssb_host_pcmcia_exit(void)
95399500daSRafał Miłecki {
96399500daSRafał Miłecki }
9761e115a5SMichael Buesch #endif /* CONFIG_SSB_PCMCIAHOST */
9861e115a5SMichael Buesch 
9924ea602eSAlbert Herranz /* sdio.c */
10024ea602eSAlbert Herranz #ifdef CONFIG_SSB_SDIOHOST
10124ea602eSAlbert Herranz extern int ssb_sdio_get_invariants(struct ssb_bus *bus,
10224ea602eSAlbert Herranz 				     struct ssb_init_invariants *iv);
10324ea602eSAlbert Herranz 
10424ea602eSAlbert Herranz extern u32 ssb_sdio_scan_read32(struct ssb_bus *bus, u16 offset);
10524ea602eSAlbert Herranz extern int ssb_sdio_scan_switch_coreidx(struct ssb_bus *bus, u8 coreidx);
10624ea602eSAlbert Herranz extern void ssb_sdio_exit(struct ssb_bus *bus);
10724ea602eSAlbert Herranz extern int ssb_sdio_init(struct ssb_bus *bus);
10824ea602eSAlbert Herranz 
10924ea602eSAlbert Herranz extern const struct ssb_bus_ops ssb_sdio_ops;
11024ea602eSAlbert Herranz #else /* CONFIG_SSB_SDIOHOST */
ssb_sdio_scan_read32(struct ssb_bus * bus,u16 offset)11124ea602eSAlbert Herranz static inline u32 ssb_sdio_scan_read32(struct ssb_bus *bus, u16 offset)
11224ea602eSAlbert Herranz {
11324ea602eSAlbert Herranz 	return 0;
11424ea602eSAlbert Herranz }
ssb_sdio_scan_switch_coreidx(struct ssb_bus * bus,u8 coreidx)11524ea602eSAlbert Herranz static inline int ssb_sdio_scan_switch_coreidx(struct ssb_bus *bus, u8 coreidx)
11624ea602eSAlbert Herranz {
11724ea602eSAlbert Herranz 	return 0;
11824ea602eSAlbert Herranz }
ssb_sdio_exit(struct ssb_bus * bus)11924ea602eSAlbert Herranz static inline void ssb_sdio_exit(struct ssb_bus *bus)
12024ea602eSAlbert Herranz {
12124ea602eSAlbert Herranz }
ssb_sdio_init(struct ssb_bus * bus)12224ea602eSAlbert Herranz static inline int ssb_sdio_init(struct ssb_bus *bus)
12324ea602eSAlbert Herranz {
12424ea602eSAlbert Herranz 	return 0;
12524ea602eSAlbert Herranz }
12624ea602eSAlbert Herranz #endif /* CONFIG_SSB_SDIOHOST */
12724ea602eSAlbert Herranz 
128830c7df4SRafał Miłecki /**************************************************
129830c7df4SRafał Miłecki  * host_soc.c
130830c7df4SRafał Miłecki  **************************************************/
131830c7df4SRafał Miłecki 
132845da6e5SRafał Miłecki #ifdef CONFIG_SSB_HOST_SOC
133830c7df4SRafał Miłecki extern const struct ssb_bus_ops ssb_host_soc_ops;
134541c9a84SRafał Miłecki 
135541c9a84SRafał Miłecki extern int ssb_host_soc_get_invariants(struct ssb_bus *bus,
136541c9a84SRafał Miłecki 				       struct ssb_init_invariants *iv);
137845da6e5SRafał Miłecki #endif
13861e115a5SMichael Buesch 
13961e115a5SMichael Buesch /* scan.c */
14061e115a5SMichael Buesch extern const char *ssb_core_name(u16 coreid);
14161e115a5SMichael Buesch extern int ssb_bus_scan(struct ssb_bus *bus,
14261e115a5SMichael Buesch 			unsigned long baseaddr);
14361e115a5SMichael Buesch extern void ssb_iounmap(struct ssb_bus *ssb);
14461e115a5SMichael Buesch 
14561e115a5SMichael Buesch 
146e7ec2e32SMichael Buesch /* sprom.c */
147e7ec2e32SMichael Buesch extern
148e7ec2e32SMichael Buesch ssize_t ssb_attr_sprom_show(struct ssb_bus *bus, char *buf,
149e7ec2e32SMichael Buesch 			    int (*sprom_read)(struct ssb_bus *bus, u16 *sprom));
150e7ec2e32SMichael Buesch extern
151e7ec2e32SMichael Buesch ssize_t ssb_attr_sprom_store(struct ssb_bus *bus,
152e7ec2e32SMichael Buesch 			     const char *buf, size_t count,
153e7ec2e32SMichael Buesch 			     int (*sprom_check_crc)(const u16 *sprom, size_t size),
154e7ec2e32SMichael Buesch 			     int (*sprom_write)(struct ssb_bus *bus, const u16 *sprom));
155b3ae52b6SHauke Mehrtens extern int ssb_fill_sprom_with_fallback(struct ssb_bus *bus,
156b3ae52b6SHauke Mehrtens 					struct ssb_sprom *out);
157e7ec2e32SMichael Buesch 
158e7ec2e32SMichael Buesch 
15961e115a5SMichael Buesch /* core.c */
16061e115a5SMichael Buesch extern u32 ssb_calc_clock_rate(u32 plltype, u32 n, u32 m);
16161e115a5SMichael Buesch extern struct ssb_bus *ssb_pci_dev_to_bus(struct pci_dev *pdev);
162aab547ceSMichael Buesch int ssb_for_each_bus_call(unsigned long data,
163aab547ceSMichael Buesch 			  int (*func)(struct ssb_bus *bus, unsigned long data));
164e7ec2e32SMichael Buesch extern struct ssb_bus *ssb_pcmcia_dev_to_bus(struct pcmcia_device *pdev);
165e7ec2e32SMichael Buesch 
1663ba6018aSMichael Buesch struct ssb_freeze_context {
1673ba6018aSMichael Buesch 	/* Pointer to the bus */
1683ba6018aSMichael Buesch 	struct ssb_bus *bus;
1693ba6018aSMichael Buesch 	/* Boolean list to indicate whether a device is frozen on this bus. */
1703ba6018aSMichael Buesch 	bool device_frozen[SSB_MAX_NR_CORES];
1713ba6018aSMichael Buesch };
1723ba6018aSMichael Buesch extern int ssb_devices_freeze(struct ssb_bus *bus, struct ssb_freeze_context *ctx);
1733ba6018aSMichael Buesch extern int ssb_devices_thaw(struct ssb_freeze_context *ctx);
1743ba6018aSMichael Buesch 
1753ba6018aSMichael Buesch 
17661e115a5SMichael Buesch 
17761e115a5SMichael Buesch /* b43_pci_bridge.c */
178c7084535SAlexey Zaytsev #ifdef CONFIG_SSB_B43_PCI_BRIDGE
17961e115a5SMichael Buesch extern int __init b43_pci_ssb_bridge_init(void);
18061e115a5SMichael Buesch extern void __exit b43_pci_ssb_bridge_exit(void);
1810052b8bbSHauke Mehrtens #else /* CONFIG_SSB_B43_PCI_BRIDGE */
b43_pci_ssb_bridge_init(void)18261e115a5SMichael Buesch static inline int b43_pci_ssb_bridge_init(void)
18361e115a5SMichael Buesch {
18461e115a5SMichael Buesch 	return 0;
18561e115a5SMichael Buesch }
b43_pci_ssb_bridge_exit(void)18661e115a5SMichael Buesch static inline void b43_pci_ssb_bridge_exit(void)
18761e115a5SMichael Buesch {
18861e115a5SMichael Buesch }
1890052b8bbSHauke Mehrtens #endif /* CONFIG_SSB_B43_PCI_BRIDGE */
19061e115a5SMichael Buesch 
191d486a5b4SHauke Mehrtens /* driver_chipcommon_pmu.c */
192d486a5b4SHauke Mehrtens extern u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc);
193d486a5b4SHauke Mehrtens extern u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc);
194f924e1e9SHauke Mehrtens extern u32 ssb_pmu_get_alp_clock(struct ssb_chipcommon *cc);
195d486a5b4SHauke Mehrtens 
1967ffbffe3SHauke Mehrtens extern u32 ssb_chipco_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt,
1977ffbffe3SHauke Mehrtens 					     u32 ticks);
1987ffbffe3SHauke Mehrtens extern u32 ssb_chipco_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
1997ffbffe3SHauke Mehrtens 
20072a525cbSRafał Miłecki /* driver_chipcommon_sflash.c */
20172a525cbSRafał Miłecki #ifdef CONFIG_SSB_SFLASH
20272a525cbSRafał Miłecki int ssb_sflash_init(struct ssb_chipcommon *cc);
20372a525cbSRafał Miłecki #else
ssb_sflash_init(struct ssb_chipcommon * cc)20472a525cbSRafał Miłecki static inline int ssb_sflash_init(struct ssb_chipcommon *cc)
20572a525cbSRafał Miłecki {
20672a525cbSRafał Miłecki 	pr_err("Serial flash not supported\n");
20772a525cbSRafał Miłecki 	return 0;
20872a525cbSRafał Miłecki }
20972a525cbSRafał Miłecki #endif /* CONFIG_SSB_SFLASH */
21072a525cbSRafał Miłecki 
211c7a4a9e3SRafał Miłecki #ifdef CONFIG_SSB_DRIVER_MIPS
212c7a4a9e3SRafał Miłecki extern struct platform_device ssb_pflash_dev;
213c7a4a9e3SRafał Miłecki #endif
214c7a4a9e3SRafał Miłecki 
2157b5d6043SRafał Miłecki #ifdef CONFIG_SSB_SFLASH
2167b5d6043SRafał Miłecki extern struct platform_device ssb_sflash_dev;
2177b5d6043SRafał Miłecki #endif
2187b5d6043SRafał Miłecki 
2199f640a63SHauke Mehrtens #ifdef CONFIG_SSB_DRIVER_EXTIF
2209f640a63SHauke Mehrtens extern u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks);
2219f640a63SHauke Mehrtens extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
2229f640a63SHauke Mehrtens #else
ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt * wdt,u32 ticks)2239f640a63SHauke Mehrtens static inline u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt,
2249f640a63SHauke Mehrtens 						   u32 ticks)
2259f640a63SHauke Mehrtens {
2269f640a63SHauke Mehrtens 	return 0;
2279f640a63SHauke Mehrtens }
ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt * wdt,u32 ms)2289f640a63SHauke Mehrtens static inline u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt,
2299f640a63SHauke Mehrtens 						  u32 ms)
2309f640a63SHauke Mehrtens {
2319f640a63SHauke Mehrtens 	return 0;
2329f640a63SHauke Mehrtens }
2339f640a63SHauke Mehrtens #endif
234bde327efSHauke Mehrtens 
235bde327efSHauke Mehrtens #ifdef CONFIG_SSB_EMBEDDED
236bde327efSHauke Mehrtens extern int ssb_watchdog_register(struct ssb_bus *bus);
237bde327efSHauke Mehrtens #else /* CONFIG_SSB_EMBEDDED */
ssb_watchdog_register(struct ssb_bus * bus)238bde327efSHauke Mehrtens static inline int ssb_watchdog_register(struct ssb_bus *bus)
239bde327efSHauke Mehrtens {
240bde327efSHauke Mehrtens 	return 0;
241bde327efSHauke Mehrtens }
242bde327efSHauke Mehrtens #endif /* CONFIG_SSB_EMBEDDED */
243bde327efSHauke Mehrtens 
244394bc7e3SHauke Mehrtens #ifdef CONFIG_SSB_DRIVER_EXTIF
245394bc7e3SHauke Mehrtens extern void ssb_extif_init(struct ssb_extif *extif);
246394bc7e3SHauke Mehrtens #else
ssb_extif_init(struct ssb_extif * extif)247394bc7e3SHauke Mehrtens static inline void ssb_extif_init(struct ssb_extif *extif)
248394bc7e3SHauke Mehrtens {
249394bc7e3SHauke Mehrtens }
250394bc7e3SHauke Mehrtens #endif
251394bc7e3SHauke Mehrtens 
252ec43b08bSHauke Mehrtens #ifdef CONFIG_SSB_DRIVER_GPIO
253ec43b08bSHauke Mehrtens extern int ssb_gpio_init(struct ssb_bus *bus);
254600485edSHauke Mehrtens extern int ssb_gpio_unregister(struct ssb_bus *bus);
255ec43b08bSHauke Mehrtens #else /* CONFIG_SSB_DRIVER_GPIO */
ssb_gpio_init(struct ssb_bus * bus)256ec43b08bSHauke Mehrtens static inline int ssb_gpio_init(struct ssb_bus *bus)
257ec43b08bSHauke Mehrtens {
258ec43b08bSHauke Mehrtens 	return -ENOTSUPP;
259ec43b08bSHauke Mehrtens }
ssb_gpio_unregister(struct ssb_bus * bus)260600485edSHauke Mehrtens static inline int ssb_gpio_unregister(struct ssb_bus *bus)
261600485edSHauke Mehrtens {
262600485edSHauke Mehrtens 	return 0;
263600485edSHauke Mehrtens }
264ec43b08bSHauke Mehrtens #endif /* CONFIG_SSB_DRIVER_GPIO */
265ec43b08bSHauke Mehrtens 
26661e115a5SMichael Buesch #endif /* LINUX_SSB_PRIVATE_H_ */
267