1*61e115a5SMichael Buesch #ifndef LINUX_SSB_H_ 2*61e115a5SMichael Buesch #define LINUX_SSB_H_ 3*61e115a5SMichael Buesch 4*61e115a5SMichael Buesch #include <linux/device.h> 5*61e115a5SMichael Buesch #include <linux/list.h> 6*61e115a5SMichael Buesch #include <linux/types.h> 7*61e115a5SMichael Buesch #include <linux/spinlock.h> 8*61e115a5SMichael Buesch #include <linux/pci.h> 9*61e115a5SMichael Buesch #include <linux/mod_devicetable.h> 10*61e115a5SMichael Buesch 11*61e115a5SMichael Buesch #include <linux/ssb/ssb_regs.h> 12*61e115a5SMichael Buesch 13*61e115a5SMichael Buesch 14*61e115a5SMichael Buesch struct pcmcia_device; 15*61e115a5SMichael Buesch struct ssb_bus; 16*61e115a5SMichael Buesch struct ssb_driver; 17*61e115a5SMichael Buesch 18*61e115a5SMichael Buesch 19*61e115a5SMichael Buesch struct ssb_sprom_r1 { 20*61e115a5SMichael Buesch u16 pci_spid; /* Subsystem Product ID for PCI */ 21*61e115a5SMichael Buesch u16 pci_svid; /* Subsystem Vendor ID for PCI */ 22*61e115a5SMichael Buesch u16 pci_pid; /* Product ID for PCI */ 23*61e115a5SMichael Buesch u8 il0mac[6]; /* MAC address for 802.11b/g */ 24*61e115a5SMichael Buesch u8 et0mac[6]; /* MAC address for Ethernet */ 25*61e115a5SMichael Buesch u8 et1mac[6]; /* MAC address for 802.11a */ 26*61e115a5SMichael Buesch u8 et0phyaddr:5; /* MII address for enet0 */ 27*61e115a5SMichael Buesch u8 et1phyaddr:5; /* MII address for enet1 */ 28*61e115a5SMichael Buesch u8 et0mdcport:1; /* MDIO for enet0 */ 29*61e115a5SMichael Buesch u8 et1mdcport:1; /* MDIO for enet1 */ 30*61e115a5SMichael Buesch u8 board_rev; /* Board revision */ 31*61e115a5SMichael Buesch u8 country_code:4; /* Country Code */ 32*61e115a5SMichael Buesch u8 antenna_a:2; /* Antenna 0/1 available for A-PHY */ 33*61e115a5SMichael Buesch u8 antenna_bg:2; /* Antenna 0/1 available for B-PHY and G-PHY */ 34*61e115a5SMichael Buesch u16 pa0b0; 35*61e115a5SMichael Buesch u16 pa0b1; 36*61e115a5SMichael Buesch u16 pa0b2; 37*61e115a5SMichael Buesch u16 pa1b0; 38*61e115a5SMichael Buesch u16 pa1b1; 39*61e115a5SMichael Buesch u16 pa1b2; 40*61e115a5SMichael Buesch u8 gpio0; /* GPIO pin 0 */ 41*61e115a5SMichael Buesch u8 gpio1; /* GPIO pin 1 */ 42*61e115a5SMichael Buesch u8 gpio2; /* GPIO pin 2 */ 43*61e115a5SMichael Buesch u8 gpio3; /* GPIO pin 3 */ 44*61e115a5SMichael Buesch u16 maxpwr_a; /* A-PHY Power Amplifier Max Power (in dBm Q5.2) */ 45*61e115a5SMichael Buesch u16 maxpwr_bg; /* B/G-PHY Power Amplifier Max Power (in dBm Q5.2) */ 46*61e115a5SMichael Buesch u8 itssi_a; /* Idle TSSI Target for A-PHY */ 47*61e115a5SMichael Buesch u8 itssi_bg; /* Idle TSSI Target for B/G-PHY */ 48*61e115a5SMichael Buesch u16 boardflags_lo; /* Boardflags (low 16 bits) */ 49*61e115a5SMichael Buesch u8 antenna_gain_a; /* A-PHY Antenna gain (in dBm Q5.2) */ 50*61e115a5SMichael Buesch u8 antenna_gain_bg; /* B/G-PHY Antenna gain (in dBm Q5.2) */ 51*61e115a5SMichael Buesch u8 oem[8]; /* OEM string (rev 1 only) */ 52*61e115a5SMichael Buesch }; 53*61e115a5SMichael Buesch 54*61e115a5SMichael Buesch struct ssb_sprom_r2 { 55*61e115a5SMichael Buesch u16 boardflags_hi; /* Boardflags (high 16 bits) */ 56*61e115a5SMichael Buesch u8 maxpwr_a_lo; /* A-PHY Max Power Low */ 57*61e115a5SMichael Buesch u8 maxpwr_a_hi; /* A-PHY Max Power High */ 58*61e115a5SMichael Buesch u16 pa1lob0; /* A-PHY PA Low Settings */ 59*61e115a5SMichael Buesch u16 pa1lob1; /* A-PHY PA Low Settings */ 60*61e115a5SMichael Buesch u16 pa1lob2; /* A-PHY PA Low Settings */ 61*61e115a5SMichael Buesch u16 pa1hib0; /* A-PHY PA High Settings */ 62*61e115a5SMichael Buesch u16 pa1hib1; /* A-PHY PA High Settings */ 63*61e115a5SMichael Buesch u16 pa1hib2; /* A-PHY PA High Settings */ 64*61e115a5SMichael Buesch u8 ofdm_pwr_off; /* OFDM Power Offset from CCK Level */ 65*61e115a5SMichael Buesch u8 country_str[2]; /* Two char Country Code */ 66*61e115a5SMichael Buesch }; 67*61e115a5SMichael Buesch 68*61e115a5SMichael Buesch struct ssb_sprom_r3 { 69*61e115a5SMichael Buesch u32 ofdmapo; /* A-PHY OFDM Mid Power Offset */ 70*61e115a5SMichael Buesch u32 ofdmalpo; /* A-PHY OFDM Low Power Offset */ 71*61e115a5SMichael Buesch u32 ofdmahpo; /* A-PHY OFDM High Power Offset */ 72*61e115a5SMichael Buesch u8 gpioldc_on_cnt; /* GPIO LED Powersave Duty Cycle ON count */ 73*61e115a5SMichael Buesch u8 gpioldc_off_cnt; /* GPIO LED Powersave Duty Cycle OFF count */ 74*61e115a5SMichael Buesch u8 cckpo_1M:4; /* CCK Power Offset for Rate 1M */ 75*61e115a5SMichael Buesch u8 cckpo_2M:4; /* CCK Power Offset for Rate 2M */ 76*61e115a5SMichael Buesch u8 cckpo_55M:4; /* CCK Power Offset for Rate 5.5M */ 77*61e115a5SMichael Buesch u8 cckpo_11M:4; /* CCK Power Offset for Rate 11M */ 78*61e115a5SMichael Buesch u32 ofdmgpo; /* G-PHY OFDM Power Offset */ 79*61e115a5SMichael Buesch }; 80*61e115a5SMichael Buesch 81*61e115a5SMichael Buesch struct ssb_sprom_r4 { 82*61e115a5SMichael Buesch /* TODO */ 83*61e115a5SMichael Buesch }; 84*61e115a5SMichael Buesch 85*61e115a5SMichael Buesch struct ssb_sprom { 86*61e115a5SMichael Buesch u8 revision; 87*61e115a5SMichael Buesch u8 crc; 88*61e115a5SMichael Buesch /* The valid r# fields are selected by the "revision". 89*61e115a5SMichael Buesch * Revision 3 and lower inherit from lower revisions. 90*61e115a5SMichael Buesch */ 91*61e115a5SMichael Buesch union { 92*61e115a5SMichael Buesch struct { 93*61e115a5SMichael Buesch struct ssb_sprom_r1 r1; 94*61e115a5SMichael Buesch struct ssb_sprom_r2 r2; 95*61e115a5SMichael Buesch struct ssb_sprom_r3 r3; 96*61e115a5SMichael Buesch }; 97*61e115a5SMichael Buesch struct ssb_sprom_r4 r4; 98*61e115a5SMichael Buesch }; 99*61e115a5SMichael Buesch }; 100*61e115a5SMichael Buesch 101*61e115a5SMichael Buesch /* Information about the PCB the circuitry is soldered on. */ 102*61e115a5SMichael Buesch struct ssb_boardinfo { 103*61e115a5SMichael Buesch u16 vendor; 104*61e115a5SMichael Buesch u16 type; 105*61e115a5SMichael Buesch u16 rev; 106*61e115a5SMichael Buesch }; 107*61e115a5SMichael Buesch 108*61e115a5SMichael Buesch 109*61e115a5SMichael Buesch struct ssb_device; 110*61e115a5SMichael Buesch /* Lowlevel read/write operations on the device MMIO. 111*61e115a5SMichael Buesch * Internal, don't use that outside of ssb. */ 112*61e115a5SMichael Buesch struct ssb_bus_ops { 113*61e115a5SMichael Buesch u16 (*read16)(struct ssb_device *dev, u16 offset); 114*61e115a5SMichael Buesch u32 (*read32)(struct ssb_device *dev, u16 offset); 115*61e115a5SMichael Buesch void (*write16)(struct ssb_device *dev, u16 offset, u16 value); 116*61e115a5SMichael Buesch void (*write32)(struct ssb_device *dev, u16 offset, u32 value); 117*61e115a5SMichael Buesch }; 118*61e115a5SMichael Buesch 119*61e115a5SMichael Buesch 120*61e115a5SMichael Buesch /* Core-ID values. */ 121*61e115a5SMichael Buesch #define SSB_DEV_CHIPCOMMON 0x800 122*61e115a5SMichael Buesch #define SSB_DEV_ILINE20 0x801 123*61e115a5SMichael Buesch #define SSB_DEV_SDRAM 0x803 124*61e115a5SMichael Buesch #define SSB_DEV_PCI 0x804 125*61e115a5SMichael Buesch #define SSB_DEV_MIPS 0x805 126*61e115a5SMichael Buesch #define SSB_DEV_ETHERNET 0x806 127*61e115a5SMichael Buesch #define SSB_DEV_V90 0x807 128*61e115a5SMichael Buesch #define SSB_DEV_USB11_HOSTDEV 0x808 129*61e115a5SMichael Buesch #define SSB_DEV_ADSL 0x809 130*61e115a5SMichael Buesch #define SSB_DEV_ILINE100 0x80A 131*61e115a5SMichael Buesch #define SSB_DEV_IPSEC 0x80B 132*61e115a5SMichael Buesch #define SSB_DEV_PCMCIA 0x80D 133*61e115a5SMichael Buesch #define SSB_DEV_INTERNAL_MEM 0x80E 134*61e115a5SMichael Buesch #define SSB_DEV_MEMC_SDRAM 0x80F 135*61e115a5SMichael Buesch #define SSB_DEV_EXTIF 0x811 136*61e115a5SMichael Buesch #define SSB_DEV_80211 0x812 137*61e115a5SMichael Buesch #define SSB_DEV_MIPS_3302 0x816 138*61e115a5SMichael Buesch #define SSB_DEV_USB11_HOST 0x817 139*61e115a5SMichael Buesch #define SSB_DEV_USB11_DEV 0x818 140*61e115a5SMichael Buesch #define SSB_DEV_USB20_HOST 0x819 141*61e115a5SMichael Buesch #define SSB_DEV_USB20_DEV 0x81A 142*61e115a5SMichael Buesch #define SSB_DEV_SDIO_HOST 0x81B 143*61e115a5SMichael Buesch #define SSB_DEV_ROBOSWITCH 0x81C 144*61e115a5SMichael Buesch #define SSB_DEV_PARA_ATA 0x81D 145*61e115a5SMichael Buesch #define SSB_DEV_SATA_XORDMA 0x81E 146*61e115a5SMichael Buesch #define SSB_DEV_ETHERNET_GBIT 0x81F 147*61e115a5SMichael Buesch #define SSB_DEV_PCIE 0x820 148*61e115a5SMichael Buesch #define SSB_DEV_MIMO_PHY 0x821 149*61e115a5SMichael Buesch #define SSB_DEV_SRAM_CTRLR 0x822 150*61e115a5SMichael Buesch #define SSB_DEV_MINI_MACPHY 0x823 151*61e115a5SMichael Buesch #define SSB_DEV_ARM_1176 0x824 152*61e115a5SMichael Buesch #define SSB_DEV_ARM_7TDMI 0x825 153*61e115a5SMichael Buesch 154*61e115a5SMichael Buesch /* Vendor-ID values */ 155*61e115a5SMichael Buesch #define SSB_VENDOR_BROADCOM 0x4243 156*61e115a5SMichael Buesch 157*61e115a5SMichael Buesch /* Some kernel subsystems poke with dev->drvdata, so we must use the 158*61e115a5SMichael Buesch * following ugly workaround to get from struct device to struct ssb_device */ 159*61e115a5SMichael Buesch struct __ssb_dev_wrapper { 160*61e115a5SMichael Buesch struct device dev; 161*61e115a5SMichael Buesch struct ssb_device *sdev; 162*61e115a5SMichael Buesch }; 163*61e115a5SMichael Buesch 164*61e115a5SMichael Buesch struct ssb_device { 165*61e115a5SMichael Buesch /* Having a copy of the ops pointer in each dev struct 166*61e115a5SMichael Buesch * is an optimization. */ 167*61e115a5SMichael Buesch const struct ssb_bus_ops *ops; 168*61e115a5SMichael Buesch 169*61e115a5SMichael Buesch struct device *dev; 170*61e115a5SMichael Buesch struct ssb_bus *bus; 171*61e115a5SMichael Buesch struct ssb_device_id id; 172*61e115a5SMichael Buesch 173*61e115a5SMichael Buesch u8 core_index; 174*61e115a5SMichael Buesch unsigned int irq; 175*61e115a5SMichael Buesch 176*61e115a5SMichael Buesch /* Internal-only stuff follows. */ 177*61e115a5SMichael Buesch void *drvdata; /* Per-device data */ 178*61e115a5SMichael Buesch void *devtypedata; /* Per-devicetype (eg 802.11) data */ 179*61e115a5SMichael Buesch }; 180*61e115a5SMichael Buesch 181*61e115a5SMichael Buesch /* Go from struct device to struct ssb_device. */ 182*61e115a5SMichael Buesch static inline 183*61e115a5SMichael Buesch struct ssb_device * dev_to_ssb_dev(struct device *dev) 184*61e115a5SMichael Buesch { 185*61e115a5SMichael Buesch struct __ssb_dev_wrapper *wrap; 186*61e115a5SMichael Buesch wrap = container_of(dev, struct __ssb_dev_wrapper, dev); 187*61e115a5SMichael Buesch return wrap->sdev; 188*61e115a5SMichael Buesch } 189*61e115a5SMichael Buesch 190*61e115a5SMichael Buesch /* Device specific user data */ 191*61e115a5SMichael Buesch static inline 192*61e115a5SMichael Buesch void ssb_set_drvdata(struct ssb_device *dev, void *data) 193*61e115a5SMichael Buesch { 194*61e115a5SMichael Buesch dev->drvdata = data; 195*61e115a5SMichael Buesch } 196*61e115a5SMichael Buesch static inline 197*61e115a5SMichael Buesch void * ssb_get_drvdata(struct ssb_device *dev) 198*61e115a5SMichael Buesch { 199*61e115a5SMichael Buesch return dev->drvdata; 200*61e115a5SMichael Buesch } 201*61e115a5SMichael Buesch 202*61e115a5SMichael Buesch /* Devicetype specific user data. This is per device-type (not per device) */ 203*61e115a5SMichael Buesch void ssb_set_devtypedata(struct ssb_device *dev, void *data); 204*61e115a5SMichael Buesch static inline 205*61e115a5SMichael Buesch void * ssb_get_devtypedata(struct ssb_device *dev) 206*61e115a5SMichael Buesch { 207*61e115a5SMichael Buesch return dev->devtypedata; 208*61e115a5SMichael Buesch } 209*61e115a5SMichael Buesch 210*61e115a5SMichael Buesch 211*61e115a5SMichael Buesch struct ssb_driver { 212*61e115a5SMichael Buesch const char *name; 213*61e115a5SMichael Buesch const struct ssb_device_id *id_table; 214*61e115a5SMichael Buesch 215*61e115a5SMichael Buesch int (*probe)(struct ssb_device *dev, const struct ssb_device_id *id); 216*61e115a5SMichael Buesch void (*remove)(struct ssb_device *dev); 217*61e115a5SMichael Buesch int (*suspend)(struct ssb_device *dev, pm_message_t state); 218*61e115a5SMichael Buesch int (*resume)(struct ssb_device *dev); 219*61e115a5SMichael Buesch void (*shutdown)(struct ssb_device *dev); 220*61e115a5SMichael Buesch 221*61e115a5SMichael Buesch struct device_driver drv; 222*61e115a5SMichael Buesch }; 223*61e115a5SMichael Buesch #define drv_to_ssb_drv(_drv) container_of(_drv, struct ssb_driver, drv) 224*61e115a5SMichael Buesch 225*61e115a5SMichael Buesch extern int __ssb_driver_register(struct ssb_driver *drv, struct module *owner); 226*61e115a5SMichael Buesch static inline int ssb_driver_register(struct ssb_driver *drv) 227*61e115a5SMichael Buesch { 228*61e115a5SMichael Buesch return __ssb_driver_register(drv, THIS_MODULE); 229*61e115a5SMichael Buesch } 230*61e115a5SMichael Buesch extern void ssb_driver_unregister(struct ssb_driver *drv); 231*61e115a5SMichael Buesch 232*61e115a5SMichael Buesch 233*61e115a5SMichael Buesch 234*61e115a5SMichael Buesch 235*61e115a5SMichael Buesch enum ssb_bustype { 236*61e115a5SMichael Buesch SSB_BUSTYPE_SSB, /* This SSB bus is the system bus */ 237*61e115a5SMichael Buesch SSB_BUSTYPE_PCI, /* SSB is connected to PCI bus */ 238*61e115a5SMichael Buesch SSB_BUSTYPE_PCMCIA, /* SSB is connected to PCMCIA bus */ 239*61e115a5SMichael Buesch }; 240*61e115a5SMichael Buesch 241*61e115a5SMichael Buesch /* board_vendor */ 242*61e115a5SMichael Buesch #define SSB_BOARDVENDOR_BCM 0x14E4 /* Broadcom */ 243*61e115a5SMichael Buesch #define SSB_BOARDVENDOR_DELL 0x1028 /* Dell */ 244*61e115a5SMichael Buesch #define SSB_BOARDVENDOR_HP 0x0E11 /* HP */ 245*61e115a5SMichael Buesch /* board_type */ 246*61e115a5SMichael Buesch #define SSB_BOARD_BCM94306MP 0x0418 247*61e115a5SMichael Buesch #define SSB_BOARD_BCM4309G 0x0421 248*61e115a5SMichael Buesch #define SSB_BOARD_BCM4306CB 0x0417 249*61e115a5SMichael Buesch #define SSB_BOARD_BCM4309MP 0x040C 250*61e115a5SMichael Buesch #define SSB_BOARD_MP4318 0x044A 251*61e115a5SMichael Buesch #define SSB_BOARD_BU4306 0x0416 252*61e115a5SMichael Buesch #define SSB_BOARD_BU4309 0x040A 253*61e115a5SMichael Buesch /* chip_package */ 254*61e115a5SMichael Buesch #define SSB_CHIPPACK_BCM4712S 1 /* Small 200pin 4712 */ 255*61e115a5SMichael Buesch #define SSB_CHIPPACK_BCM4712M 2 /* Medium 225pin 4712 */ 256*61e115a5SMichael Buesch #define SSB_CHIPPACK_BCM4712L 0 /* Large 340pin 4712 */ 257*61e115a5SMichael Buesch 258*61e115a5SMichael Buesch #include <linux/ssb/ssb_driver_chipcommon.h> 259*61e115a5SMichael Buesch #include <linux/ssb/ssb_driver_mips.h> 260*61e115a5SMichael Buesch #include <linux/ssb/ssb_driver_extif.h> 261*61e115a5SMichael Buesch #include <linux/ssb/ssb_driver_pci.h> 262*61e115a5SMichael Buesch 263*61e115a5SMichael Buesch struct ssb_bus { 264*61e115a5SMichael Buesch /* The MMIO area. */ 265*61e115a5SMichael Buesch void __iomem *mmio; 266*61e115a5SMichael Buesch 267*61e115a5SMichael Buesch const struct ssb_bus_ops *ops; 268*61e115a5SMichael Buesch 269*61e115a5SMichael Buesch /* The core in the basic address register window. (PCI bus only) */ 270*61e115a5SMichael Buesch struct ssb_device *mapped_device; 271*61e115a5SMichael Buesch /* Currently mapped PCMCIA segment. (bustype == SSB_BUSTYPE_PCMCIA only) */ 272*61e115a5SMichael Buesch u8 mapped_pcmcia_seg; 273*61e115a5SMichael Buesch /* Lock for core and segment switching. */ 274*61e115a5SMichael Buesch spinlock_t bar_lock; 275*61e115a5SMichael Buesch 276*61e115a5SMichael Buesch /* The bus this backplane is running on. */ 277*61e115a5SMichael Buesch enum ssb_bustype bustype; 278*61e115a5SMichael Buesch /* Pointer to the PCI bus (only valid if bustype == SSB_BUSTYPE_PCI). */ 279*61e115a5SMichael Buesch struct pci_dev *host_pci; 280*61e115a5SMichael Buesch /* Pointer to the PCMCIA device (only if bustype == SSB_BUSTYPE_PCMCIA). */ 281*61e115a5SMichael Buesch struct pcmcia_device *host_pcmcia; 282*61e115a5SMichael Buesch 283*61e115a5SMichael Buesch #ifdef CONFIG_SSB_PCIHOST 284*61e115a5SMichael Buesch /* Mutex to protect the SPROM writing. */ 285*61e115a5SMichael Buesch struct mutex pci_sprom_mutex; 286*61e115a5SMichael Buesch #endif 287*61e115a5SMichael Buesch 288*61e115a5SMichael Buesch /* ID information about the Chip. */ 289*61e115a5SMichael Buesch u16 chip_id; 290*61e115a5SMichael Buesch u16 chip_rev; 291*61e115a5SMichael Buesch u8 chip_package; 292*61e115a5SMichael Buesch 293*61e115a5SMichael Buesch /* List of devices (cores) on the backplane. */ 294*61e115a5SMichael Buesch struct ssb_device devices[SSB_MAX_NR_CORES]; 295*61e115a5SMichael Buesch u8 nr_devices; 296*61e115a5SMichael Buesch 297*61e115a5SMichael Buesch /* Reference count. Number of suspended devices. */ 298*61e115a5SMichael Buesch u8 suspend_cnt; 299*61e115a5SMichael Buesch 300*61e115a5SMichael Buesch /* Software ID number for this bus. */ 301*61e115a5SMichael Buesch unsigned int busnumber; 302*61e115a5SMichael Buesch 303*61e115a5SMichael Buesch /* The ChipCommon device (if available). */ 304*61e115a5SMichael Buesch struct ssb_chipcommon chipco; 305*61e115a5SMichael Buesch /* The PCI-core device (if available). */ 306*61e115a5SMichael Buesch struct ssb_pcicore pcicore; 307*61e115a5SMichael Buesch /* The MIPS-core device (if available). */ 308*61e115a5SMichael Buesch struct ssb_mipscore mipscore; 309*61e115a5SMichael Buesch /* The EXTif-core device (if available). */ 310*61e115a5SMichael Buesch struct ssb_extif extif; 311*61e115a5SMichael Buesch 312*61e115a5SMichael Buesch /* The following structure elements are not available in early 313*61e115a5SMichael Buesch * SSB initialization. Though, they are available for regular 314*61e115a5SMichael Buesch * registered drivers at any stage. So be careful when 315*61e115a5SMichael Buesch * using them in the ssb core code. */ 316*61e115a5SMichael Buesch 317*61e115a5SMichael Buesch /* ID information about the PCB. */ 318*61e115a5SMichael Buesch struct ssb_boardinfo boardinfo; 319*61e115a5SMichael Buesch /* Contents of the SPROM. */ 320*61e115a5SMichael Buesch struct ssb_sprom sprom; 321*61e115a5SMichael Buesch 322*61e115a5SMichael Buesch /* Internal-only stuff follows. Do not touch. */ 323*61e115a5SMichael Buesch struct list_head list; 324*61e115a5SMichael Buesch #ifdef CONFIG_SSB_DEBUG 325*61e115a5SMichael Buesch /* Is the bus already powered up? */ 326*61e115a5SMichael Buesch bool powered_up; 327*61e115a5SMichael Buesch int power_warn_count; 328*61e115a5SMichael Buesch #endif /* DEBUG */ 329*61e115a5SMichael Buesch }; 330*61e115a5SMichael Buesch 331*61e115a5SMichael Buesch /* The initialization-invariants. */ 332*61e115a5SMichael Buesch struct ssb_init_invariants { 333*61e115a5SMichael Buesch struct ssb_boardinfo boardinfo; 334*61e115a5SMichael Buesch struct ssb_sprom sprom; 335*61e115a5SMichael Buesch }; 336*61e115a5SMichael Buesch /* Type of function to fetch the invariants. */ 337*61e115a5SMichael Buesch typedef int (*ssb_invariants_func_t)(struct ssb_bus *bus, 338*61e115a5SMichael Buesch struct ssb_init_invariants *iv); 339*61e115a5SMichael Buesch 340*61e115a5SMichael Buesch /* Register a SSB system bus. get_invariants() is called after the 341*61e115a5SMichael Buesch * basic system devices are initialized. 342*61e115a5SMichael Buesch * The invariants are usually fetched from some NVRAM. 343*61e115a5SMichael Buesch * Put the invariants into the struct pointed to by iv. */ 344*61e115a5SMichael Buesch extern int ssb_bus_ssbbus_register(struct ssb_bus *bus, 345*61e115a5SMichael Buesch unsigned long baseaddr, 346*61e115a5SMichael Buesch ssb_invariants_func_t get_invariants); 347*61e115a5SMichael Buesch #ifdef CONFIG_SSB_PCIHOST 348*61e115a5SMichael Buesch extern int ssb_bus_pcibus_register(struct ssb_bus *bus, 349*61e115a5SMichael Buesch struct pci_dev *host_pci); 350*61e115a5SMichael Buesch #endif /* CONFIG_SSB_PCIHOST */ 351*61e115a5SMichael Buesch #ifdef CONFIG_SSB_PCMCIAHOST 352*61e115a5SMichael Buesch extern int ssb_bus_pcmciabus_register(struct ssb_bus *bus, 353*61e115a5SMichael Buesch struct pcmcia_device *pcmcia_dev, 354*61e115a5SMichael Buesch unsigned long baseaddr); 355*61e115a5SMichael Buesch #endif /* CONFIG_SSB_PCMCIAHOST */ 356*61e115a5SMichael Buesch 357*61e115a5SMichael Buesch extern void ssb_bus_unregister(struct ssb_bus *bus); 358*61e115a5SMichael Buesch 359*61e115a5SMichael Buesch extern u32 ssb_clockspeed(struct ssb_bus *bus); 360*61e115a5SMichael Buesch 361*61e115a5SMichael Buesch /* Is the device enabled in hardware? */ 362*61e115a5SMichael Buesch int ssb_device_is_enabled(struct ssb_device *dev); 363*61e115a5SMichael Buesch /* Enable a device and pass device-specific SSB_TMSLOW flags. 364*61e115a5SMichael Buesch * If no device-specific flags are available, use 0. */ 365*61e115a5SMichael Buesch void ssb_device_enable(struct ssb_device *dev, u32 core_specific_flags); 366*61e115a5SMichael Buesch /* Disable a device in hardware and pass SSB_TMSLOW flags (if any). */ 367*61e115a5SMichael Buesch void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags); 368*61e115a5SMichael Buesch 369*61e115a5SMichael Buesch 370*61e115a5SMichael Buesch /* Device MMIO register read/write functions. */ 371*61e115a5SMichael Buesch static inline u16 ssb_read16(struct ssb_device *dev, u16 offset) 372*61e115a5SMichael Buesch { 373*61e115a5SMichael Buesch return dev->ops->read16(dev, offset); 374*61e115a5SMichael Buesch } 375*61e115a5SMichael Buesch static inline u32 ssb_read32(struct ssb_device *dev, u16 offset) 376*61e115a5SMichael Buesch { 377*61e115a5SMichael Buesch return dev->ops->read32(dev, offset); 378*61e115a5SMichael Buesch } 379*61e115a5SMichael Buesch static inline void ssb_write16(struct ssb_device *dev, u16 offset, u16 value) 380*61e115a5SMichael Buesch { 381*61e115a5SMichael Buesch dev->ops->write16(dev, offset, value); 382*61e115a5SMichael Buesch } 383*61e115a5SMichael Buesch static inline void ssb_write32(struct ssb_device *dev, u16 offset, u32 value) 384*61e115a5SMichael Buesch { 385*61e115a5SMichael Buesch dev->ops->write32(dev, offset, value); 386*61e115a5SMichael Buesch } 387*61e115a5SMichael Buesch 388*61e115a5SMichael Buesch 389*61e115a5SMichael Buesch /* Translation (routing) bits that need to be ORed to DMA 390*61e115a5SMichael Buesch * addresses before they are given to a device. */ 391*61e115a5SMichael Buesch extern u32 ssb_dma_translation(struct ssb_device *dev); 392*61e115a5SMichael Buesch #define SSB_DMA_TRANSLATION_MASK 0xC0000000 393*61e115a5SMichael Buesch #define SSB_DMA_TRANSLATION_SHIFT 30 394*61e115a5SMichael Buesch 395*61e115a5SMichael Buesch extern int ssb_dma_set_mask(struct ssb_device *ssb_dev, u64 mask); 396*61e115a5SMichael Buesch 397*61e115a5SMichael Buesch 398*61e115a5SMichael Buesch #ifdef CONFIG_SSB_PCIHOST 399*61e115a5SMichael Buesch /* PCI-host wrapper driver */ 400*61e115a5SMichael Buesch extern int ssb_pcihost_register(struct pci_driver *driver); 401*61e115a5SMichael Buesch static inline void ssb_pcihost_unregister(struct pci_driver *driver) 402*61e115a5SMichael Buesch { 403*61e115a5SMichael Buesch pci_unregister_driver(driver); 404*61e115a5SMichael Buesch } 405*61e115a5SMichael Buesch #endif /* CONFIG_SSB_PCIHOST */ 406*61e115a5SMichael Buesch 407*61e115a5SMichael Buesch 408*61e115a5SMichael Buesch /* If a driver is shutdown or suspended, call this to signal 409*61e115a5SMichael Buesch * that the bus may be completely powered down. SSB will decide, 410*61e115a5SMichael Buesch * if it's really time to power down the bus, based on if there 411*61e115a5SMichael Buesch * are other devices that want to run. */ 412*61e115a5SMichael Buesch extern int ssb_bus_may_powerdown(struct ssb_bus *bus); 413*61e115a5SMichael Buesch /* Before initializing and enabling a device, call this to power-up the bus. 414*61e115a5SMichael Buesch * If you want to allow use of dynamic-power-control, pass the flag. 415*61e115a5SMichael Buesch * Otherwise static always-on powercontrol will be used. */ 416*61e115a5SMichael Buesch extern int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl); 417*61e115a5SMichael Buesch 418*61e115a5SMichael Buesch 419*61e115a5SMichael Buesch /* Various helper functions */ 420*61e115a5SMichael Buesch extern u32 ssb_admatch_base(u32 adm); 421*61e115a5SMichael Buesch extern u32 ssb_admatch_size(u32 adm); 422*61e115a5SMichael Buesch 423*61e115a5SMichael Buesch 424*61e115a5SMichael Buesch #endif /* LINUX_SSB_H_ */ 425