123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- From a59da8fb3b2a1f2df5f871464e43cd5b6ca6ceb1 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
- Date: Tue, 28 Oct 2014 12:52:02 +0100
- Subject: [PATCH 157/158] MIPS: BCM47XX: Move SPROM fallback code into sprom.c
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- This is some general cleanup as well as preparing sprom.c to become a
- standalone driver. We will need this for bcm53xx ARM arch support.
- Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
- Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
- Cc: linux-mips@linux-mips.org
- Patchwork: https://patchwork.linux-mips.org/patch/8232/
- Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
- ---
- arch/mips/bcm47xx/bcm47xx_private.h | 3 ++
- arch/mips/bcm47xx/setup.c | 58 ++-----------------------------
- arch/mips/bcm47xx/sprom.c | 68 +++++++++++++++++++++++++++++++++++++
- 3 files changed, 73 insertions(+), 56 deletions(-)
- --- a/arch/mips/bcm47xx/bcm47xx_private.h
- +++ b/arch/mips/bcm47xx/bcm47xx_private.h
- @@ -6,6 +6,9 @@
- /* prom.c */
- void __init bcm47xx_prom_highmem_init(void);
-
- +/* sprom.c */
- +void bcm47xx_sprom_register_fallbacks(void);
- +
- /* buttons.c */
- int __init bcm47xx_buttons_register(void);
-
- --- a/arch/mips/bcm47xx/setup.c
- +++ b/arch/mips/bcm47xx/setup.c
- @@ -102,23 +102,6 @@ static void bcm47xx_machine_halt(void)
- }
-
- #ifdef CONFIG_BCM47XX_SSB
- -static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
- -{
- - char prefix[10];
- -
- - if (bus->bustype == SSB_BUSTYPE_PCI) {
- - memset(out, 0, sizeof(struct ssb_sprom));
- - snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
- - bus->host_pci->bus->number + 1,
- - PCI_SLOT(bus->host_pci->devfn));
- - bcm47xx_fill_sprom(out, prefix, false);
- - return 0;
- - } else {
- - printk(KERN_WARNING "bcm47xx: unable to fill SPROM for given bustype.\n");
- - return -EINVAL;
- - }
- -}
- -
- static int bcm47xx_get_invariants(struct ssb_bus *bus,
- struct ssb_init_invariants *iv)
- {
- @@ -144,11 +127,6 @@ static void __init bcm47xx_register_ssb(
- char buf[100];
- struct ssb_mipscore *mcore;
-
- - err = ssb_arch_register_fallback_sprom(&bcm47xx_get_sprom_ssb);
- - if (err)
- - printk(KERN_WARNING "bcm47xx: someone else already registered"
- - " a ssb SPROM callback handler (err %d)\n", err);
- -
- err = ssb_bus_ssbbus_register(&(bcm47xx_bus.ssb), SSB_ENUM_BASE,
- bcm47xx_get_invariants);
- if (err)
- @@ -171,44 +149,10 @@ static void __init bcm47xx_register_ssb(
- #endif
-
- #ifdef CONFIG_BCM47XX_BCMA
- -static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
- -{
- - char prefix[10];
- - struct bcma_device *core;
- -
- - switch (bus->hosttype) {
- - case BCMA_HOSTTYPE_PCI:
- - memset(out, 0, sizeof(struct ssb_sprom));
- - snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
- - bus->host_pci->bus->number + 1,
- - PCI_SLOT(bus->host_pci->devfn));
- - bcm47xx_fill_sprom(out, prefix, false);
- - return 0;
- - case BCMA_HOSTTYPE_SOC:
- - memset(out, 0, sizeof(struct ssb_sprom));
- - core = bcma_find_core(bus, BCMA_CORE_80211);
- - if (core) {
- - snprintf(prefix, sizeof(prefix), "sb/%u/",
- - core->core_index);
- - bcm47xx_fill_sprom(out, prefix, true);
- - } else {
- - bcm47xx_fill_sprom(out, NULL, false);
- - }
- - return 0;
- - default:
- - pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n");
- - return -EINVAL;
- - }
- -}
- -
- static void __init bcm47xx_register_bcma(void)
- {
- int err;
-
- - err = bcma_arch_register_fallback_sprom(&bcm47xx_get_sprom_bcma);
- - if (err)
- - pr_warn("bcm47xx: someone else already registered a bcma SPROM callback handler (err %d)\n", err);
- -
- err = bcma_host_soc_register(&bcm47xx_bus.bcma);
- if (err)
- panic("Failed to register BCMA bus (err %d)", err);
- @@ -229,6 +173,7 @@ void __init plat_mem_setup(void)
- printk(KERN_INFO "bcm47xx: using bcma bus\n");
- #ifdef CONFIG_BCM47XX_BCMA
- bcm47xx_bus_type = BCM47XX_BUS_TYPE_BCMA;
- + bcm47xx_sprom_register_fallbacks();
- bcm47xx_register_bcma();
- bcm47xx_set_system_type(bcm47xx_bus.bcma.bus.chipinfo.id);
- #ifdef CONFIG_HIGHMEM
- @@ -239,6 +184,7 @@ void __init plat_mem_setup(void)
- printk(KERN_INFO "bcm47xx: using ssb bus\n");
- #ifdef CONFIG_BCM47XX_SSB
- bcm47xx_bus_type = BCM47XX_BUS_TYPE_SSB;
- + bcm47xx_sprom_register_fallbacks();
- bcm47xx_register_ssb();
- bcm47xx_set_system_type(bcm47xx_bus.ssb.chip_id);
- #endif
- --- a/arch/mips/bcm47xx/sprom.c
- +++ b/arch/mips/bcm47xx/sprom.c
- @@ -801,3 +801,71 @@ void bcm47xx_fill_bcma_boardinfo(struct
- nvram_read_u16(prefix, NULL, "boardtype", &boardinfo->type, 0, true);
- }
- #endif
- +
- +#if defined(CONFIG_BCM47XX_SSB)
- +static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
- +{
- + char prefix[10];
- +
- + if (bus->bustype == SSB_BUSTYPE_PCI) {
- + memset(out, 0, sizeof(struct ssb_sprom));
- + snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
- + bus->host_pci->bus->number + 1,
- + PCI_SLOT(bus->host_pci->devfn));
- + bcm47xx_fill_sprom(out, prefix, false);
- + return 0;
- + } else {
- + pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n");
- + return -EINVAL;
- + }
- +}
- +#endif
- +
- +#if defined(CONFIG_BCM47XX_BCMA)
- +static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
- +{
- + char prefix[10];
- + struct bcma_device *core;
- +
- + switch (bus->hosttype) {
- + case BCMA_HOSTTYPE_PCI:
- + memset(out, 0, sizeof(struct ssb_sprom));
- + snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
- + bus->host_pci->bus->number + 1,
- + PCI_SLOT(bus->host_pci->devfn));
- + bcm47xx_fill_sprom(out, prefix, false);
- + return 0;
- + case BCMA_HOSTTYPE_SOC:
- + memset(out, 0, sizeof(struct ssb_sprom));
- + core = bcma_find_core(bus, BCMA_CORE_80211);
- + if (core) {
- + snprintf(prefix, sizeof(prefix), "sb/%u/",
- + core->core_index);
- + bcm47xx_fill_sprom(out, prefix, true);
- + } else {
- + bcm47xx_fill_sprom(out, NULL, false);
- + }
- + return 0;
- + default:
- + pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n");
- + return -EINVAL;
- + }
- +}
- +#endif
- +
- +/*
- + * On bcm47xx we need to register SPROM fallback handler very early, so we can't
- + * use anything like platform device / driver for this.
- + */
- +void bcm47xx_sprom_register_fallbacks(void)
- +{
- +#if defined(CONFIG_BCM47XX_SSB)
- + if (ssb_arch_register_fallback_sprom(&bcm47xx_get_sprom_ssb))
- + pr_warn("Failed to registered ssb SPROM handler\n");
- +#endif
- +
- +#if defined(CONFIG_BCM47XX_BCMA)
- + if (bcma_arch_register_fallback_sprom(&bcm47xx_get_sprom_bcma))
- + pr_warn("Failed to registered bcma SPROM handler\n");
- +#endif
- +}
|