123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686 |
- --- a/arch/mips/bcm47xx/Kconfig
- +++ b/arch/mips/bcm47xx/Kconfig
- @@ -4,6 +4,7 @@ config BCM47XX_SSB
- bool "SSB Support for Broadcom BCM47XX"
- select SYS_HAS_CPU_BMIPS32_3300
- select SSB
- + select SSB_HOST_SOC
- select SSB_DRIVER_MIPS
- select SSB_DRIVER_EXTIF
- select SSB_EMBEDDED
- --- a/drivers/ssb/Kconfig
- +++ b/drivers/ssb/Kconfig
- @@ -80,6 +80,15 @@ config SSB_SDIOHOST
-
- If unsure, say N
-
- +config SSB_HOST_SOC
- + bool "Support for SSB bus on SoC"
- + depends on SSB
- + help
- + Host interface for a SSB directly mapped into memory. This is
- + for some Broadcom SoCs from the BCM47xx and BCM53xx lines.
- +
- + If unsure, say N
- +
- config SSB_SILENT
- bool "No SSB kernel messages"
- depends on SSB && EXPERT
- --- a/drivers/ssb/Makefile
- +++ b/drivers/ssb/Makefile
- @@ -5,8 +5,9 @@ ssb-$(CONFIG_SSB_SPROM) += sprom.o
-
- # host support
- ssb-$(CONFIG_SSB_PCIHOST) += pci.o pcihost_wrapper.o
- -ssb-$(CONFIG_SSB_PCMCIAHOST) += pcmcia.o
- +ssb-$(CONFIG_SSB_PCMCIAHOST) += pcmcia.o bridge_pcmcia_80211.o
- ssb-$(CONFIG_SSB_SDIOHOST) += sdio.o
- +ssb-$(CONFIG_SSB_HOST_SOC) += host_soc.o
-
- # built-in drivers
- ssb-y += driver_chipcommon.o
- --- /dev/null
- +++ b/drivers/ssb/bridge_pcmcia_80211.c
- @@ -0,0 +1,128 @@
- +/*
- + * Broadcom 43xx PCMCIA-SSB bridge module
- + *
- + * Copyright (c) 2007 Michael Buesch <m@bues.ch>
- + *
- + * Licensed under the GNU/GPL. See COPYING for details.
- + */
- +
- +#include <linux/ssb/ssb.h>
- +#include <linux/slab.h>
- +#include <linux/module.h>
- +
- +#include <pcmcia/cistpl.h>
- +#include <pcmcia/ciscode.h>
- +#include <pcmcia/ds.h>
- +#include <pcmcia/cisreg.h>
- +
- +#include "ssb_private.h"
- +
- +static const struct pcmcia_device_id ssb_host_pcmcia_tbl[] = {
- + PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x448),
- + PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x476),
- + PCMCIA_DEVICE_NULL,
- +};
- +
- +MODULE_DEVICE_TABLE(pcmcia, ssb_host_pcmcia_tbl);
- +
- +static int ssb_host_pcmcia_probe(struct pcmcia_device *dev)
- +{
- + struct ssb_bus *ssb;
- + int err = -ENOMEM;
- + int res = 0;
- +
- + ssb = kzalloc(sizeof(*ssb), GFP_KERNEL);
- + if (!ssb)
- + goto out_error;
- +
- + err = -ENODEV;
- +
- + dev->config_flags |= CONF_ENABLE_IRQ;
- +
- + dev->resource[2]->flags |= WIN_ENABLE | WIN_DATA_WIDTH_16 |
- + WIN_USE_WAIT;
- + dev->resource[2]->start = 0;
- + dev->resource[2]->end = SSB_CORE_SIZE;
- + res = pcmcia_request_window(dev, dev->resource[2], 250);
- + if (res != 0)
- + goto err_kfree_ssb;
- +
- + res = pcmcia_map_mem_page(dev, dev->resource[2], 0);
- + if (res != 0)
- + goto err_disable;
- +
- + if (!dev->irq)
- + goto err_disable;
- +
- + res = pcmcia_enable_device(dev);
- + if (res != 0)
- + goto err_disable;
- +
- + err = ssb_bus_pcmciabus_register(ssb, dev, dev->resource[2]->start);
- + if (err)
- + goto err_disable;
- + dev->priv = ssb;
- +
- + return 0;
- +
- +err_disable:
- + pcmcia_disable_device(dev);
- +err_kfree_ssb:
- + kfree(ssb);
- +out_error:
- + ssb_err("Initialization failed (%d, %d)\n", res, err);
- + return err;
- +}
- +
- +static void ssb_host_pcmcia_remove(struct pcmcia_device *dev)
- +{
- + struct ssb_bus *ssb = dev->priv;
- +
- + ssb_bus_unregister(ssb);
- + pcmcia_disable_device(dev);
- + kfree(ssb);
- + dev->priv = NULL;
- +}
- +
- +#ifdef CONFIG_PM
- +static int ssb_host_pcmcia_suspend(struct pcmcia_device *dev)
- +{
- + struct ssb_bus *ssb = dev->priv;
- +
- + return ssb_bus_suspend(ssb);
- +}
- +
- +static int ssb_host_pcmcia_resume(struct pcmcia_device *dev)
- +{
- + struct ssb_bus *ssb = dev->priv;
- +
- + return ssb_bus_resume(ssb);
- +}
- +#else /* CONFIG_PM */
- +# define ssb_host_pcmcia_suspend NULL
- +# define ssb_host_pcmcia_resume NULL
- +#endif /* CONFIG_PM */
- +
- +static struct pcmcia_driver ssb_host_pcmcia_driver = {
- + .owner = THIS_MODULE,
- + .name = "ssb-pcmcia",
- + .id_table = ssb_host_pcmcia_tbl,
- + .probe = ssb_host_pcmcia_probe,
- + .remove = ssb_host_pcmcia_remove,
- + .suspend = ssb_host_pcmcia_suspend,
- + .resume = ssb_host_pcmcia_resume,
- +};
- +
- +/*
- + * These are not module init/exit functions!
- + * The module_pcmcia_driver() helper cannot be used here.
- + */
- +int ssb_host_pcmcia_init(void)
- +{
- + return pcmcia_register_driver(&ssb_host_pcmcia_driver);
- +}
- +
- +void ssb_host_pcmcia_exit(void)
- +{
- + pcmcia_unregister_driver(&ssb_host_pcmcia_driver);
- +}
- --- /dev/null
- +++ b/drivers/ssb/host_soc.c
- @@ -0,0 +1,173 @@
- +/*
- + * Sonics Silicon Backplane SoC host related functions.
- + * Subsystem core
- + *
- + * Copyright 2005, Broadcom Corporation
- + * Copyright 2006, 2007, Michael Buesch <m@bues.ch>
- + *
- + * Licensed under the GNU/GPL. See COPYING for details.
- + */
- +
- +#include <linux/ssb/ssb.h>
- +
- +#include "ssb_private.h"
- +
- +static u8 ssb_host_soc_read8(struct ssb_device *dev, u16 offset)
- +{
- + struct ssb_bus *bus = dev->bus;
- +
- + offset += dev->core_index * SSB_CORE_SIZE;
- + return readb(bus->mmio + offset);
- +}
- +
- +static u16 ssb_host_soc_read16(struct ssb_device *dev, u16 offset)
- +{
- + struct ssb_bus *bus = dev->bus;
- +
- + offset += dev->core_index * SSB_CORE_SIZE;
- + return readw(bus->mmio + offset);
- +}
- +
- +static u32 ssb_host_soc_read32(struct ssb_device *dev, u16 offset)
- +{
- + struct ssb_bus *bus = dev->bus;
- +
- + offset += dev->core_index * SSB_CORE_SIZE;
- + return readl(bus->mmio + offset);
- +}
- +
- +#ifdef CONFIG_SSB_BLOCKIO
- +static void ssb_host_soc_block_read(struct ssb_device *dev, void *buffer,
- + size_t count, u16 offset, u8 reg_width)
- +{
- + struct ssb_bus *bus = dev->bus;
- + void __iomem *addr;
- +
- + offset += dev->core_index * SSB_CORE_SIZE;
- + addr = bus->mmio + offset;
- +
- + switch (reg_width) {
- + case sizeof(u8): {
- + u8 *buf = buffer;
- +
- + while (count) {
- + *buf = __raw_readb(addr);
- + buf++;
- + count--;
- + }
- + break;
- + }
- + case sizeof(u16): {
- + __le16 *buf = buffer;
- +
- + SSB_WARN_ON(count & 1);
- + while (count) {
- + *buf = (__force __le16)__raw_readw(addr);
- + buf++;
- + count -= 2;
- + }
- + break;
- + }
- + case sizeof(u32): {
- + __le32 *buf = buffer;
- +
- + SSB_WARN_ON(count & 3);
- + while (count) {
- + *buf = (__force __le32)__raw_readl(addr);
- + buf++;
- + count -= 4;
- + }
- + break;
- + }
- + default:
- + SSB_WARN_ON(1);
- + }
- +}
- +#endif /* CONFIG_SSB_BLOCKIO */
- +
- +static void ssb_host_soc_write8(struct ssb_device *dev, u16 offset, u8 value)
- +{
- + struct ssb_bus *bus = dev->bus;
- +
- + offset += dev->core_index * SSB_CORE_SIZE;
- + writeb(value, bus->mmio + offset);
- +}
- +
- +static void ssb_host_soc_write16(struct ssb_device *dev, u16 offset, u16 value)
- +{
- + struct ssb_bus *bus = dev->bus;
- +
- + offset += dev->core_index * SSB_CORE_SIZE;
- + writew(value, bus->mmio + offset);
- +}
- +
- +static void ssb_host_soc_write32(struct ssb_device *dev, u16 offset, u32 value)
- +{
- + struct ssb_bus *bus = dev->bus;
- +
- + offset += dev->core_index * SSB_CORE_SIZE;
- + writel(value, bus->mmio + offset);
- +}
- +
- +#ifdef CONFIG_SSB_BLOCKIO
- +static void ssb_host_soc_block_write(struct ssb_device *dev, const void *buffer,
- + size_t count, u16 offset, u8 reg_width)
- +{
- + struct ssb_bus *bus = dev->bus;
- + void __iomem *addr;
- +
- + offset += dev->core_index * SSB_CORE_SIZE;
- + addr = bus->mmio + offset;
- +
- + switch (reg_width) {
- + case sizeof(u8): {
- + const u8 *buf = buffer;
- +
- + while (count) {
- + __raw_writeb(*buf, addr);
- + buf++;
- + count--;
- + }
- + break;
- + }
- + case sizeof(u16): {
- + const __le16 *buf = buffer;
- +
- + SSB_WARN_ON(count & 1);
- + while (count) {
- + __raw_writew((__force u16)(*buf), addr);
- + buf++;
- + count -= 2;
- + }
- + break;
- + }
- + case sizeof(u32): {
- + const __le32 *buf = buffer;
- +
- + SSB_WARN_ON(count & 3);
- + while (count) {
- + __raw_writel((__force u32)(*buf), addr);
- + buf++;
- + count -= 4;
- + }
- + break;
- + }
- + default:
- + SSB_WARN_ON(1);
- + }
- +}
- +#endif /* CONFIG_SSB_BLOCKIO */
- +
- +/* Ops for the plain SSB bus without a host-device (no PCI or PCMCIA). */
- +const struct ssb_bus_ops ssb_host_soc_ops = {
- + .read8 = ssb_host_soc_read8,
- + .read16 = ssb_host_soc_read16,
- + .read32 = ssb_host_soc_read32,
- + .write8 = ssb_host_soc_write8,
- + .write16 = ssb_host_soc_write16,
- + .write32 = ssb_host_soc_write32,
- +#ifdef CONFIG_SSB_BLOCKIO
- + .block_read = ssb_host_soc_block_read,
- + .block_write = ssb_host_soc_block_write,
- +#endif
- +};
- --- a/drivers/ssb/main.c
- +++ b/drivers/ssb/main.c
- @@ -596,166 +596,6 @@ error:
- return err;
- }
-
- -static u8 ssb_ssb_read8(struct ssb_device *dev, u16 offset)
- -{
- - struct ssb_bus *bus = dev->bus;
- -
- - offset += dev->core_index * SSB_CORE_SIZE;
- - return readb(bus->mmio + offset);
- -}
- -
- -static u16 ssb_ssb_read16(struct ssb_device *dev, u16 offset)
- -{
- - struct ssb_bus *bus = dev->bus;
- -
- - offset += dev->core_index * SSB_CORE_SIZE;
- - return readw(bus->mmio + offset);
- -}
- -
- -static u32 ssb_ssb_read32(struct ssb_device *dev, u16 offset)
- -{
- - struct ssb_bus *bus = dev->bus;
- -
- - offset += dev->core_index * SSB_CORE_SIZE;
- - return readl(bus->mmio + offset);
- -}
- -
- -#ifdef CONFIG_SSB_BLOCKIO
- -static void ssb_ssb_block_read(struct ssb_device *dev, void *buffer,
- - size_t count, u16 offset, u8 reg_width)
- -{
- - struct ssb_bus *bus = dev->bus;
- - void __iomem *addr;
- -
- - offset += dev->core_index * SSB_CORE_SIZE;
- - addr = bus->mmio + offset;
- -
- - switch (reg_width) {
- - case sizeof(u8): {
- - u8 *buf = buffer;
- -
- - while (count) {
- - *buf = __raw_readb(addr);
- - buf++;
- - count--;
- - }
- - break;
- - }
- - case sizeof(u16): {
- - __le16 *buf = buffer;
- -
- - SSB_WARN_ON(count & 1);
- - while (count) {
- - *buf = (__force __le16)__raw_readw(addr);
- - buf++;
- - count -= 2;
- - }
- - break;
- - }
- - case sizeof(u32): {
- - __le32 *buf = buffer;
- -
- - SSB_WARN_ON(count & 3);
- - while (count) {
- - *buf = (__force __le32)__raw_readl(addr);
- - buf++;
- - count -= 4;
- - }
- - break;
- - }
- - default:
- - SSB_WARN_ON(1);
- - }
- -}
- -#endif /* CONFIG_SSB_BLOCKIO */
- -
- -static void ssb_ssb_write8(struct ssb_device *dev, u16 offset, u8 value)
- -{
- - struct ssb_bus *bus = dev->bus;
- -
- - offset += dev->core_index * SSB_CORE_SIZE;
- - writeb(value, bus->mmio + offset);
- -}
- -
- -static void ssb_ssb_write16(struct ssb_device *dev, u16 offset, u16 value)
- -{
- - struct ssb_bus *bus = dev->bus;
- -
- - offset += dev->core_index * SSB_CORE_SIZE;
- - writew(value, bus->mmio + offset);
- -}
- -
- -static void ssb_ssb_write32(struct ssb_device *dev, u16 offset, u32 value)
- -{
- - struct ssb_bus *bus = dev->bus;
- -
- - offset += dev->core_index * SSB_CORE_SIZE;
- - writel(value, bus->mmio + offset);
- -}
- -
- -#ifdef CONFIG_SSB_BLOCKIO
- -static void ssb_ssb_block_write(struct ssb_device *dev, const void *buffer,
- - size_t count, u16 offset, u8 reg_width)
- -{
- - struct ssb_bus *bus = dev->bus;
- - void __iomem *addr;
- -
- - offset += dev->core_index * SSB_CORE_SIZE;
- - addr = bus->mmio + offset;
- -
- - switch (reg_width) {
- - case sizeof(u8): {
- - const u8 *buf = buffer;
- -
- - while (count) {
- - __raw_writeb(*buf, addr);
- - buf++;
- - count--;
- - }
- - break;
- - }
- - case sizeof(u16): {
- - const __le16 *buf = buffer;
- -
- - SSB_WARN_ON(count & 1);
- - while (count) {
- - __raw_writew((__force u16)(*buf), addr);
- - buf++;
- - count -= 2;
- - }
- - break;
- - }
- - case sizeof(u32): {
- - const __le32 *buf = buffer;
- -
- - SSB_WARN_ON(count & 3);
- - while (count) {
- - __raw_writel((__force u32)(*buf), addr);
- - buf++;
- - count -= 4;
- - }
- - break;
- - }
- - default:
- - SSB_WARN_ON(1);
- - }
- -}
- -#endif /* CONFIG_SSB_BLOCKIO */
- -
- -/* Ops for the plain SSB bus without a host-device (no PCI or PCMCIA). */
- -static const struct ssb_bus_ops ssb_ssb_ops = {
- - .read8 = ssb_ssb_read8,
- - .read16 = ssb_ssb_read16,
- - .read32 = ssb_ssb_read32,
- - .write8 = ssb_ssb_write8,
- - .write16 = ssb_ssb_write16,
- - .write32 = ssb_ssb_write32,
- -#ifdef CONFIG_SSB_BLOCKIO
- - .block_read = ssb_ssb_block_read,
- - .block_write = ssb_ssb_block_write,
- -#endif
- -};
- -
- static int ssb_fetch_invariants(struct ssb_bus *bus,
- ssb_invariants_func_t get_invariants)
- {
- @@ -876,7 +716,6 @@ int ssb_bus_pcibus_register(struct ssb_b
-
- return err;
- }
- -EXPORT_SYMBOL(ssb_bus_pcibus_register);
- #endif /* CONFIG_SSB_PCIHOST */
-
- #ifdef CONFIG_SSB_PCMCIAHOST
- @@ -898,7 +737,6 @@ int ssb_bus_pcmciabus_register(struct ss
-
- return err;
- }
- -EXPORT_SYMBOL(ssb_bus_pcmciabus_register);
- #endif /* CONFIG_SSB_PCMCIAHOST */
-
- #ifdef CONFIG_SSB_SDIOHOST
- @@ -923,13 +761,14 @@ int ssb_bus_sdiobus_register(struct ssb_
- EXPORT_SYMBOL(ssb_bus_sdiobus_register);
- #endif /* CONFIG_SSB_PCMCIAHOST */
-
- +#ifdef CONFIG_SSB_HOST_SOC
- int ssb_bus_ssbbus_register(struct ssb_bus *bus, unsigned long baseaddr,
- ssb_invariants_func_t get_invariants)
- {
- int err;
-
- bus->bustype = SSB_BUSTYPE_SSB;
- - bus->ops = &ssb_ssb_ops;
- + bus->ops = &ssb_host_soc_ops;
-
- err = ssb_bus_register(bus, get_invariants, baseaddr);
- if (!err) {
- @@ -939,6 +778,7 @@ int ssb_bus_ssbbus_register(struct ssb_b
-
- return err;
- }
- +#endif
-
- int __ssb_driver_register(struct ssb_driver *drv, struct module *owner)
- {
- @@ -1465,6 +1305,12 @@ static int __init ssb_modinit(void)
- /* don't fail SSB init because of this */
- err = 0;
- }
- + err = ssb_host_pcmcia_init();
- + if (err) {
- + ssb_err("PCMCIA host initialization failed\n");
- + /* don't fail SSB init because of this */
- + err = 0;
- + }
- err = ssb_gige_init();
- if (err) {
- ssb_err("SSB Broadcom Gigabit Ethernet driver initialization failed\n");
- @@ -1482,6 +1328,7 @@ fs_initcall(ssb_modinit);
- static void __exit ssb_modexit(void)
- {
- ssb_gige_exit();
- + ssb_host_pcmcia_exit();
- b43_pci_ssb_bridge_exit();
- bus_unregister(&ssb_bustype);
- }
- --- a/drivers/ssb/pcmcia.c
- +++ b/drivers/ssb/pcmcia.c
- @@ -147,8 +147,7 @@ error:
- return err;
- }
-
- -int ssb_pcmcia_switch_core(struct ssb_bus *bus,
- - struct ssb_device *dev)
- +static int ssb_pcmcia_switch_core(struct ssb_bus *bus, struct ssb_device *dev)
- {
- int err;
-
- --- a/drivers/ssb/sdio.c
- +++ b/drivers/ssb/sdio.c
- @@ -200,7 +200,7 @@ out:
- }
-
- /* host must be already claimed */
- -int ssb_sdio_switch_core(struct ssb_bus *bus, struct ssb_device *dev)
- +static int ssb_sdio_switch_core(struct ssb_bus *bus, struct ssb_device *dev)
- {
- u8 coreidx = dev->core_index;
- u32 sbaddr;
- --- a/drivers/ssb/ssb_private.h
- +++ b/drivers/ssb/ssb_private.h
- @@ -85,8 +85,6 @@ static inline int ssb_pci_init(struct ss
-
- /* pcmcia.c */
- #ifdef CONFIG_SSB_PCMCIAHOST
- -extern int ssb_pcmcia_switch_core(struct ssb_bus *bus,
- - struct ssb_device *dev);
- extern int ssb_pcmcia_switch_coreidx(struct ssb_bus *bus,
- u8 coreidx);
- extern int ssb_pcmcia_switch_segment(struct ssb_bus *bus,
- @@ -96,13 +94,10 @@ extern int ssb_pcmcia_get_invariants(str
- extern int ssb_pcmcia_hardware_setup(struct ssb_bus *bus);
- extern void ssb_pcmcia_exit(struct ssb_bus *bus);
- extern int ssb_pcmcia_init(struct ssb_bus *bus);
- +extern int ssb_host_pcmcia_init(void);
- +extern void ssb_host_pcmcia_exit(void);
- 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)
- -{
- - return 0;
- -}
- static inline int ssb_pcmcia_switch_coreidx(struct ssb_bus *bus,
- u8 coreidx)
- {
- @@ -124,6 +119,13 @@ static inline int ssb_pcmcia_init(struct
- {
- return 0;
- }
- +static inline int ssb_host_pcmcia_init(void)
- +{
- + return 0;
- +}
- +static inline void ssb_host_pcmcia_exit(void)
- +{
- +}
- #endif /* CONFIG_SSB_PCMCIAHOST */
-
- /* sdio.c */
- @@ -132,9 +134,7 @@ extern int ssb_sdio_get_invariants(struc
- struct ssb_init_invariants *iv);
-
- extern u32 ssb_sdio_scan_read32(struct ssb_bus *bus, u16 offset);
- -extern int ssb_sdio_switch_core(struct ssb_bus *bus, struct ssb_device *dev);
- extern int ssb_sdio_scan_switch_coreidx(struct ssb_bus *bus, u8 coreidx);
- -extern int ssb_sdio_hardware_setup(struct ssb_bus *bus);
- extern void ssb_sdio_exit(struct ssb_bus *bus);
- extern int ssb_sdio_init(struct ssb_bus *bus);
-
- @@ -144,19 +144,10 @@ static inline u32 ssb_sdio_scan_read32(s
- {
- return 0;
- }
- -static inline int ssb_sdio_switch_core(struct ssb_bus *bus,
- - struct ssb_device *dev)
- -{
- - return 0;
- -}
- static inline int ssb_sdio_scan_switch_coreidx(struct ssb_bus *bus, u8 coreidx)
- {
- return 0;
- }
- -static inline int ssb_sdio_hardware_setup(struct ssb_bus *bus)
- -{
- - return 0;
- -}
- static inline void ssb_sdio_exit(struct ssb_bus *bus)
- {
- }
- @@ -166,6 +157,13 @@ static inline int ssb_sdio_init(struct s
- }
- #endif /* CONFIG_SSB_SDIOHOST */
-
- +/**************************************************
- + * host_soc.c
- + **************************************************/
- +
- +#ifdef CONFIG_SSB_HOST_SOC
- +extern const struct ssb_bus_ops ssb_host_soc_ops;
- +#endif
-
- /* scan.c */
- extern const char *ssb_core_name(u16 coreid);
|