On 01/16/2015 10:08 PM, Rafał Miłecki wrote:
> Starting with kernel 3.19-rc1 early registration of bcma on MIPS is done
> a bit later, with memory allocator available. This allows us to simplify
> code by using standard bus scanning method.
> 
> Signed-off-by: Rafał Miłecki <[email protected]>

Thanks for changing the bcm47xx mips target and making this possible.
This patches looks good, just some small comments.
> ---
>  drivers/bcma/bcma_private.h   |  7 +----
>  drivers/bcma/host_soc.c       |  2 +-
>  drivers/bcma/main.c           | 33 +++++++----------------
>  drivers/bcma/scan.c           | 61 
> +++----------------------------------------
>  include/linux/bcma/bcma_soc.h |  2 --
>  5 files changed, 14 insertions(+), 91 deletions(-)
> 
> diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
> index 59422b5..3f314c9 100644
> --- a/drivers/bcma/bcma_private.h
> +++ b/drivers/bcma/bcma_private.h
> @@ -28,9 +28,7 @@ void bcma_prepare_core(struct bcma_bus *bus, struct 
> bcma_device *core);
>  void bcma_init_bus(struct bcma_bus *bus);
>  int bcma_bus_register(struct bcma_bus *bus);
>  void bcma_bus_unregister(struct bcma_bus *bus);
> -int __init bcma_bus_early_register(struct bcma_bus *bus,
> -                                struct bcma_device *core_cc,
> -                                struct bcma_device *core_mips);
> +int __init bcma_bus_early_register(struct bcma_bus *bus);
>  #ifdef CONFIG_PM
>  int bcma_bus_suspend(struct bcma_bus *bus);
>  int bcma_bus_resume(struct bcma_bus *bus);
> @@ -39,9 +37,6 @@ int bcma_bus_resume(struct bcma_bus *bus);
>  /* scan.c */
>  void bcma_detect_chip(struct bcma_bus *bus);
>  int bcma_bus_scan(struct bcma_bus *bus);
> -int __init bcma_bus_scan_early(struct bcma_bus *bus,
> -                            struct bcma_device_id *match,
> -                            struct bcma_device *core);
>  
>  /* sprom.c */
>  int bcma_sprom_get(struct bcma_bus *bus);
> diff --git a/drivers/bcma/host_soc.c b/drivers/bcma/host_soc.c
> index 335cbcf..2dce347 100644
> --- a/drivers/bcma/host_soc.c
> +++ b/drivers/bcma/host_soc.c
> @@ -193,7 +193,7 @@ int __init bcma_host_soc_init(struct bcma_soc *soc)
>       int err;
>  
>       /* Scan bus and initialize it */
> -     err = bcma_bus_early_register(bus, &soc->core_cc, &soc->core_mips);
> +     err = bcma_bus_early_register(bus);
>       if (err)
>               iounmap(bus->mmio);
>  
> diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
> index c166d44..c3c5e0a 100644
> --- a/drivers/bcma/main.c
> +++ b/drivers/bcma/main.c
> @@ -489,35 +489,20 @@ void bcma_bus_unregister(struct bcma_bus *bus)
>       kfree(cores[0]);
>  }
>  
> -int __init bcma_bus_early_register(struct bcma_bus *bus,
> -                                struct bcma_device *core_cc,
> -                                struct bcma_device *core_mips)
> +/*
> + * This is a special version of bus registration function designed for SoCs.
> + * It scans bus and performs basic initialization of main cores only.
> + * Please note it requires memory allocation, however it won't try to sleep.
> + */
> +int __init bcma_bus_early_register(struct bcma_bus *bus)
>  {
>       int err;
>       struct bcma_device *core;
> -     struct bcma_device_id match;
> -
> -     match.manuf = BCMA_MANUF_BCM;
> -     match.id = bcma_cc_core_id(bus);
> -     match.class = BCMA_CL_SIM;
> -     match.rev = BCMA_ANY_REV;
> -
> -     /* Scan for chip common core */
> -     err = bcma_bus_scan_early(bus, &match, core_cc);
> -     if (err) {
> -             bcma_err(bus, "Failed to scan for common core: %d\n", err);
> -             return -1;
> -     }
> -
> -     match.manuf = BCMA_MANUF_MIPS;
> -     match.id = BCMA_CORE_MIPS_74K;
> -     match.class = BCMA_CL_SIM;
> -     match.rev = BCMA_ANY_REV;
>  
> -     /* Scan for mips core */
> -     err = bcma_bus_scan_early(bus, &match, core_mips);
> +     /* Scan for devices (cores) */
> +     err = bcma_bus_scan(bus);
>       if (err) {
> -             bcma_err(bus, "Failed to scan for mips core: %d\n", err);
> +             bcma_err(bus, "Failed to scan bus: %d\n", err);
>               return -1;
>       }
>  
> diff --git a/drivers/bcma/scan.c b/drivers/bcma/scan.c
> index 5328ee5..1138226 100644
> --- a/drivers/bcma/scan.c
> +++ b/drivers/bcma/scan.c
> @@ -461,6 +461,9 @@ int bcma_bus_scan(struct bcma_bus *bus)
>  
>       int err, core_num = 0;
>  
add comment:
skip if the bus was already scanned
> +     if (bus->nr_cores)
> +             return 0;
> +
>       erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM);
>       if (bus->hosttype == BCMA_HOSTTYPE_SOC) {
>               eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE);
> @@ -519,61 +522,3 @@ out:
>  
>       return err;
>  }
> -
> -int __init bcma_bus_scan_early(struct bcma_bus *bus,
> -                            struct bcma_device_id *match,
> -                            struct bcma_device *core)
> -{
> -     u32 erombase;
> -     u32 __iomem *eromptr, *eromend;
> -
> -     int err = -ENODEV;
> -     int core_num = 0;
> -
> -     erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM);
> -     if (bus->hosttype == BCMA_HOSTTYPE_SOC) {
> -             eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE);
> -             if (!eromptr)
> -                     return -ENOMEM;
> -     } else {
> -             eromptr = bus->mmio;
> -     }
> -
> -     eromend = eromptr + BCMA_CORE_SIZE / sizeof(u32);
> -
> -     bcma_scan_switch_core(bus, erombase);
> -
> -     while (eromptr < eromend) {
> -             memset(core, 0, sizeof(*core));
> -             INIT_LIST_HEAD(&core->list);
> -             core->bus = bus;
> -
> -             err = bcma_get_next_core(bus, &eromptr, match, core_num, core);
> -             if (err == -ENODEV) {
> -                     core_num++;
> -                     continue;
> -             } else if (err == -ENXIO)
> -                     continue;
> -             else if (err == -ESPIPE)
> -                     break;
> -             else if (err < 0)
> -                     goto out;
> -
> -             core->core_index = core_num++;
> -             bus->nr_cores++;
> -             bcma_info(bus, "Core %d found: %s (manuf 0x%03X, id 0x%03X, rev 
> 0x%02X, class 0x%X)\n",
> -                       core->core_index, bcma_device_name(&core->id),
> -                       core->id.manuf, core->id.id, core->id.rev,
> -                       core->id.class);
> -
> -             list_add_tail(&core->list, &bus->cores);
> -             err = 0;
> -             break;
> -     }
> -
> -out:
> -     if (bus->hosttype == BCMA_HOSTTYPE_SOC)
> -             iounmap(eromptr);
> -
> -     return err;
> -}
> diff --git a/include/linux/bcma/bcma_soc.h b/include/linux/bcma/bcma_soc.h
> index f24d245..1b5fc0c 100644
> --- a/include/linux/bcma/bcma_soc.h
> +++ b/include/linux/bcma/bcma_soc.h
> @@ -5,8 +5,6 @@
>  
>  struct bcma_soc {
>       struct bcma_bus bus;
> -     struct bcma_device core_cc;
> -     struct bcma_device core_mips;
>  };

Why not remove struct bcma_soc completely? it was only created to hold
the bus and the two cores.

>  
>  int __init bcma_host_soc_register(struct bcma_soc *soc);
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to