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