ssb: Add SPROM/invariants support for PCMCIA devices
PATCH 1/1 ssb: Add SPROM/invariants support for PCMCIA devices
This adds support for reading/writing the SPROM invariants for PCMCIA based devices.
Signed-off-by Michael Buesch <[email protected]>
---
For 2.6.26.
drivers/ssb/Kconfig +6 -0
@@ -17,20 +17,25 @@ config SSB environments. The module will be called ssb. If unsure, say N. +# Common SPROM support routines +config SSB_SPROM + bool + config SSB_PCIHOST_POSSIBLE bool depends on SSB && (PCI = y || PCI = SSB) default y config SSB_PCIHOST bool "Support for SSB on PCI-bus host" depends on SSB_PCIHOST_POSSIBLE + select SSB_SPROM default y help Support for a Sonics Silicon Backplane on top of a PCI device. If unsure, say Y
@@ -45,12 +50,13 @@ config SSB_PCMCIAHOST_POSSIBLE depends on SSB && (PCMCIA = y || PCMCIA = SSB) && EXPERIMENTAL default y config SSB_PCMCIAHOST bool "Support for SSB on PCMCIA-bus host (EXPERIMENTAL)" depends on SSB_PCMCIAHOST_POSSIBLE + select SSB_SPROM help Support for a Sonics Silicon Backplane on top of a PCMCIA device. If unsure, say N
drivers/ssb/Makefile +1 -0
@@ -1,9 +1,10 @@ # core ssb-y += main.o scan.o ssb-$(CONFIG_SSB_EMBEDDED) += embedded.o +ssb-$(CONFIG_SSB_SPROM) += sprom.o # host support ssb-$(CONFIG_SSB_PCIHOST) += pci.o pcihost_wrapper.o ssb-$(CONFIG_SSB_PCMCIAHOST) += pcmcia.o # built-in drivers
drivers/ssb/main.c +21 -2
@@ -65,12 +65,31 @@ found:ssb_buses_unlock (); return bus; }#endif /* CONFIG_SSB_PCIHOST */ +#ifdef CONFIG_SSB_PCMCIAHOST +struct ssb_bus *ssb_pcmcia_dev_to_bus (struct pcmcia_device *pdev) +{ +struct ssb_bus *bus; + +ssb_buses_lock (); +list_for_each_entry (bus, &buses, list) { +if (bus->bustype ==SSB_BUSTYPE_PCMCIA && + bus->host_pcmcia == pdev) + goto found; + } + bus =NULL ; +found: +ssb_buses_unlock (); + +return bus; +} +#endif /* CONFIG_SSB_PCMCIAHOST */ +static struct ssb_device *ssb_device_get (struct ssb_device *dev) {if (dev)get_device (dev->dev);return dev; }
@@ -375,13 +394,13 @@ void ssb_bus_unregister(struct ssb_bus * {ssb_buses_lock ();ssb_devices_unregister (bus);list_del (&bus->list);ssb_buses_unlock (); -/* ssb_pcmcia_exit(bus); */ +ssb_pcmcia_exit (bus);ssb_pci_exit (bus);ssb_iounmap (bus); }EXPORT_SYMBOL (ssb_bus_unregister);static void ssb_release_dev (struct device *dev)
@@ -640,13 +659,13 @@ static int ssb_bus_register(struct ssb_b out:return err; err_dequeue:list_del (&bus->list); err_pcmcia_exit: -/* ssb_pcmcia_exit(bus); */ +ssb_pcmcia_exit (bus); err_pci_exit:ssb_pci_exit (bus); err_unmap:ssb_iounmap (bus); err_disable_xtal:ssb_buses_unlock ();
drivers/ssb/pci.c +10 -103
188 lines not on this page · raw message
drivers/ssb/pcmcia.c +458 -60
641 lines not on this page · raw message
drivers/ssb/sprom.c new file +133 -0
133 lines not on this page · raw message
drivers/ssb/ssb_private.h +17 -0
@@ -78,12 +78,13 @@ extern int ssb_pcmcia_switch_core(structextern int ssb_pcmcia_switch_coreidx (struct ssb_bus *bus,u8 coreidx);extern int ssb_pcmcia_switch_segment (struct ssb_bus *bus,u8 seg);extern int ssb_pcmcia_get_invariants (struct ssb_bus *bus,struct ssb_init_invariants *iv); +extern void ssb_pcmcia_exit (struct ssb_bus *bus);extern int ssb_pcmcia_init (struct ssb_bus *bus);extern const struct ssb_bus_ops ssb_pcmcia_ops;#else /* CONFIG_SSB_PCMCIAHOST */ static inline int ssb_pcmcia_switch_core (struct ssb_bus *bus,struct ssb_device *dev) {
@@ -96,12 +97,15 @@ static inline int ssb_pcmcia_switch_core }static inline int ssb_pcmcia_switch_segment (struct ssb_bus *bus,u8 seg) {return 0 ; } +static inline void ssb_pcmcia_exit (struct ssb_bus *bus) +{ +}static inline int ssb_pcmcia_init (struct ssb_bus *bus) {return 0 ; }#endif /* CONFIG_SSB_PCMCIAHOST */
@@ -110,17 +114,30 @@ static inline int ssb_pcmcia_init(structextern const char *ssb_core_name (u16 coreid);extern int ssb_bus_scan (struct ssb_bus *bus,unsigned long baseaddr);extern void ssb_iounmap (struct ssb_bus *ssb); +/* sprom.c */ +extern +ssize_t ssb_attr_sprom_show (struct ssb_bus *bus,char *buf, +int (*sprom_read)(struct ssb_bus *bus,u16 *sprom)); +extern +ssize_t ssb_attr_sprom_store (struct ssb_bus *bus, +const char *buf,size_t count, +int (*sprom_check_crc)(const u16 *sprom,size_t size), +int (*sprom_write)(struct ssb_bus *bus,const u16 *sprom)); + +/* core.c */ extern u32 ssb_calc_clock_rate (u32 plltype,u32 n,u32 m);extern int ssb_devices_freeze (struct ssb_bus *bus);extern int ssb_devices_thaw (struct ssb_bus *bus);extern struct ssb_bus *ssb_pci_dev_to_bus (struct pci_dev *pdev); +extern struct ssb_bus *ssb_pcmcia_dev_to_bus (struct pcmcia_device *pdev); +/* b43_pci_bridge.c */ #ifdef CONFIG_SSB_B43_PCI_BRIDGE extern int __init b43_pci_ssb_bridge_init (void ); extern void __exit b43_pci_ssb_bridge_exit(void);#else /* CONFIG_SSB_B43_PCI_BRIDGR */
include/linux/ssb/ssb.h +2 -2
@@ -242,15 +242,15 @@ struct ssb_bus {enum ssb_bustype bustype;/* Pointer to the PCI bus (only valid if bustype == SSB_BUSTYPE_PCI). */ struct pci_dev *host_pci;/* Pointer to the PCMCIA device (only if bustype == SSB_BUSTYPE_PCMCIA). */ struct pcmcia_device *host_pcmcia; -#ifdef CONFIG_SSB_PCIHOST +#ifdef CONFIG_SSB_SPROM /* Mutex to protect the SPROM writing. */ -struct mutex pci_sprom_mutex; +struct mutex sprom_mutex;#endif /* ID information about the Chip. */ u16 chip_id;u16 chip_rev;u16 sprom_size;/* number of words in sprom */