Re: [PATCH net-next 8/9] net: dsa: bcm_sf2: Make it a real platform device driver

2016-06-05 Thread Florian Fainelli
Le 04/06/2016 13:55, Andrew Lunn a écrit :
>> -static struct dsa_switch_driver bcm_sf2_switch_driver = {
>> +static struct dsa_switch_driver bcm_sf2_switch_ops = {
>>  .tag_protocol   = DSA_TAG_PROTO_BRCM,
>>  .probe  = bcm_sf2_sw_drv_probe,
>>  .setup  = bcm_sf2_sw_setup,
> 
> Does this also allow you to kill bcm_sf2_sw_drv_probe?
> 
> dsa2 will never call it, and now you have your old binding parsed by
> the legacy code in dsa2, you might not need it at all.

Good point, yes, that can go away now, thanks!
-- 
Florian


Re: [PATCH net-next 8/9] net: dsa: bcm_sf2: Make it a real platform device driver

2016-06-04 Thread Andrew Lunn
> -static struct dsa_switch_driver bcm_sf2_switch_driver = {
> +static struct dsa_switch_driver bcm_sf2_switch_ops = {
>   .tag_protocol   = DSA_TAG_PROTO_BRCM,
>   .probe  = bcm_sf2_sw_drv_probe,
>   .setup  = bcm_sf2_sw_setup,

Does this also allow you to kill bcm_sf2_sw_drv_probe?

dsa2 will never call it, and now you have your old binding parsed by
the legacy code in dsa2, you might not need it at all.

 Andrew


[PATCH net-next 8/9] net: dsa: bcm_sf2: Make it a real platform device driver

2016-06-03 Thread Florian Fainelli
The Broadcom Starfighter 2 switch driver should be a proper platform
driver, now that the DSA code has been updated to allow that, register a
switch device, feed it with the proper configuration data coming from
Device Tree and register our switch device with DSA.

The bulk of the changes consist in moving what bcm_sf2_sw_setup() did
into the platform driver probe function.

Signed-off-by: Florian Fainelli 
---
 drivers/net/dsa/bcm_sf2.c | 251 --
 net/dsa/dsa.c |   1 -
 2 files changed, 151 insertions(+), 101 deletions(-)

diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
index 73df91bb0466..8dac74a6b5df 100644
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
@@ -934,77 +934,8 @@ static void bcm_sf2_identify_ports(struct bcm_sf2_priv 
*priv,
 
 static int bcm_sf2_sw_setup(struct dsa_switch *ds)
 {
-   const char *reg_names[BCM_SF2_REGS_NUM] = BCM_SF2_REGS_NAME;
struct bcm_sf2_priv *priv = ds_to_priv(ds);
-   struct device_node *dn;
-   void __iomem **base;
unsigned int port;
-   unsigned int i;
-   u32 reg, rev;
-   int ret;
-
-   spin_lock_init(>indir_lock);
-   mutex_init(>stats_mutex);
-
-   /* All the interesting properties are at the parent device_node
-* level
-*/
-   dn = ds->cd->of_node->parent;
-   bcm_sf2_identify_ports(priv, ds->cd->of_node);
-
-   priv->irq0 = irq_of_parse_and_map(dn, 0);
-   priv->irq1 = irq_of_parse_and_map(dn, 1);
-
-   base = >core;
-   for (i = 0; i < BCM_SF2_REGS_NUM; i++) {
-   *base = of_iomap(dn, i);
-   if (*base == NULL) {
-   pr_err("unable to find register: %s\n", reg_names[i]);
-   ret = -ENOMEM;
-   goto out_unmap;
-   }
-   base++;
-   }
-
-   ret = bcm_sf2_sw_rst(priv);
-   if (ret) {
-   pr_err("unable to software reset switch: %d\n", ret);
-   goto out_unmap;
-   }
-
-   /* Disable all interrupts and request them */
-   bcm_sf2_intr_disable(priv);
-
-   ret = request_irq(priv->irq0, bcm_sf2_switch_0_isr, 0,
- "switch_0", priv);
-   if (ret < 0) {
-   pr_err("failed to request switch_0 IRQ\n");
-   goto out_unmap;
-   }
-
-   ret = request_irq(priv->irq1, bcm_sf2_switch_1_isr, 0,
- "switch_1", priv);
-   if (ret < 0) {
-   pr_err("failed to request switch_1 IRQ\n");
-   goto out_free_irq0;
-   }
-
-   /* Reset the MIB counters */
-   reg = core_readl(priv, CORE_GMNCFGCFG);
-   reg |= RST_MIB_CNT;
-   core_writel(priv, reg, CORE_GMNCFGCFG);
-   reg &= ~RST_MIB_CNT;
-   core_writel(priv, reg, CORE_GMNCFGCFG);
-
-   /* Get the maximum number of ports for this switch */
-   priv->hw_params.num_ports = core_readl(priv, CORE_IMP0_PRT_ID) + 1;
-   if (priv->hw_params.num_ports > DSA_MAX_PORTS)
-   priv->hw_params.num_ports = DSA_MAX_PORTS;
-
-   /* Assume a single GPHY setup if we can't read that property */
-   if (of_property_read_u32(dn, "brcm,num-gphy",
->hw_params.num_gphy))
-   priv->hw_params.num_gphy = 1;
 
/* Enable all valid ports and disable those unused */
for (port = 0; port < priv->hw_params.num_ports; port++) {
@@ -1034,31 +965,7 @@ static int bcm_sf2_sw_setup(struct dsa_switch *ds)
else
ds->phys_mii_mask = 0;
 
-   rev = reg_readl(priv, REG_SWITCH_REVISION);
-   priv->hw_params.top_rev = (rev >> SWITCH_TOP_REV_SHIFT) &
-   SWITCH_TOP_REV_MASK;
-   priv->hw_params.core_rev = (rev & SF2_REV_MASK);
-
-   rev = reg_readl(priv, REG_PHY_REVISION);
-   priv->hw_params.gphy_rev = rev & PHY_REVISION_MASK;
-
-   pr_info("Starfighter 2 top: %x.%02x, core: %x.%02x base: 0x%p, IRQs: 
%d, %d\n",
-   priv->hw_params.top_rev >> 8, priv->hw_params.top_rev & 0xff,
-   priv->hw_params.core_rev >> 8, priv->hw_params.core_rev & 0xff,
-   priv->core, priv->irq0, priv->irq1);
-
return 0;
-
-out_free_irq0:
-   free_irq(priv->irq0, priv);
-out_unmap:
-   base = >core;
-   for (i = 0; i < BCM_SF2_REGS_NUM; i++) {
-   if (*base)
-   iounmap(*base);
-   base++;
-   }
-   return ret;
 }
 
 static int bcm_sf2_sw_set_addr(struct dsa_switch *ds, u8 *addr)
@@ -1370,7 +1277,7 @@ static int bcm_sf2_sw_set_wol(struct dsa_switch *ds, int 
port,
return p->ethtool_ops->set_wol(p, wol);
 }
 
-static struct dsa_switch_driver bcm_sf2_switch_driver = {
+static struct dsa_switch_driver bcm_sf2_switch_ops = {
.tag_protocol   = DSA_TAG_PROTO_BRCM,
.probe  =