Skip to contentSkip to conversation

ARM: ux500: Provide a means to obtain the SMSC9115 clock when DT is enabled

PATCH In review Lee Jones 6 participants 28 messages Dec 19, 2012 – Jan 17, 2013

Subsystems (8)
lore
Share & tools
lore

Lee Jones

author
#0 lore raw

PATCH 1/4 ARM: ux500: Provide a means to obtain the SMSC9115 clock when DT is enabled

Device Tree names devices differently to how some frameworks expect them. Until we can move a platform over to the new way of obtaining resources, we have to use the OF_DEV_AUXDATA() macros to craft a device name which can be used in searches during allocation time.

---
 arch/arm/mach-ux500/cpu-db8500.c |    1 +
 1 file changed, 1 insertion(+)
arch/arm/mach-ux500/cpu-db8500.c +1 -0
index db0bb75..dfb68ce 100644
@@ -284,6 +284,7 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
 	OF_DEV_AUXDATA("st,nomadik-i2c", 0x80128000, "nmk-i2c.2", NULL),
 	OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL),
 	OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL),
+	OF_DEV_AUXDATA("smsc,lan9115", 0x50000000, "smsc911x", NULL),
 	/* Requires device name bindings. */
 	OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL),
 	/* Requires clock name and DMA bindings. */
Signature · 1 line
1.7.9.5
author
#1 lore raw

PATCH 2/4 clk: ux500: Ensure the FMSC clock is obtainable

The FMSC clock is traditionally used for NAND flash devices when used on the ux500 series platforms. This patch makes it searchable during a clock-name search.

Cc Mike Turquette <[email protected]>
Cc Ulf Hansson <[email protected]>
---
 drivers/clk/ux500/u8500_clk.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/ux500/u8500_clk.c +1 -1
index 6b889a0..a601802 100644
@@ -324,7 +324,7 @@ void u8500_clk_init(void)
 
 	clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", U8500_CLKRST3_BASE,
 				BIT(0), 0);
-	clk_register_clkdev(clk, NULL, "fsmc");
+	clk_register_clkdev(clk, "fsmc", NULL);
 
 	clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE,
 				BIT(1), 0);
Signature · 1 line
1.7.9.5
Acked-by on v1 2/4
#2 lore raw

Re: [PATCH 2/4] clk: ux500: Ensure the FMSC clock is obtainable

Quoting Lee Jones (2012-12-19 09:19:45)

Quoted 7 lines

The FMSC clock is traditionally used for NAND flash devices when used on the ux500 series platforms. This patch makes it searchable during a clock-name search.

Cc Mike Turquette <[email protected]>
Cc Ulf Hansson <[email protected]>

Who do you want this series to go through?

Regards,
Mike

Quoted 19 lines
---
 drivers/clk/ux500/u8500_clk.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/ux500/u8500_clk.c +1 -1
index 6b889a0..a601802 100644
@@ -324,7 +324,7 @@ void u8500_clk_init(void)
 
        clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", U8500_CLKRST3_BASE,
                                BIT(0), 0);
-       clk_register_clkdev(clk, NULL, "fsmc");
+       clk_register_clkdev(clk, "fsmc", NULL);
 
        clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE,
                                BIT(1), 0);
Signature · 1 line
1.7.9.5
author
#3 lore raw

Re: [PATCH 2/4] clk: ux500: Ensure the FMSC clock is obtainable

Quoted 5 lines · Mike Turquette

Quoting Lee Jones (2012-12-19 09:19:45)

Quoted 4 lines

The FMSC clock is traditionally used for NAND flash devices when used on the ux500 series platforms. This patch makes it searchable during a clock-name search.

Quoted 7 lines
Quoted 3 lines
Cc Mike Turquette <[email protected]>
Cc Ulf Hansson <[email protected]>

Who do you want this series to go through?

To be honest I don't really mind. I can take them through the arm-soc tree with "[1/4] ARM ...", but I still need an Ack from the SMSC911x maintainer for "[4/4] ...", before I can do that.

Still waiting for that. :(

Quoted 19 lines
Quoted 19 lines
---
 drivers/clk/ux500/u8500_clk.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/ux500/u8500_clk.c +1 -1
index 6b889a0..a601802 100644
@@ -324,7 +324,7 @@ void u8500_clk_init(void)
 
        clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", U8500_CLKRST3_BASE,
                                BIT(0), 0);
-       clk_register_clkdev(clk, NULL, "fsmc");
+       clk_register_clkdev(clk, "fsmc", NULL);
 
        clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE,
                                BIT(1), 0);
Signature · 1 line
1.7.9.5
Signature · 4 lines
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
author
#4 lore raw

PATCH 3/4 clk: ux500: Provide an alias for the SMSC911x Ethernet chip

In reply to Lee Jones

In the case of some of the ux500 platforms, an Ethernet chip is placed on an extended bus which is traditionally used as a NAND flash chip placeholder. The p3_pclk0 clock is used to control it, so we are required to provide and easy way to access it from the SMSC911x driver. We do this using an alias provided by this patch.

Cc Mike Turquette <[email protected]>
Cc Ulf Hansson <[email protected]>
---
 drivers/clk/ux500/u8500_clk.c |    1 +
 1 file changed, 1 insertion(+)
drivers/clk/ux500/u8500_clk.c +1 -0
index a601802..9d9add1 100644
@@ -325,6 +325,7 @@ void u8500_clk_init(void)
 	clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", U8500_CLKRST3_BASE,
 				BIT(0), 0);
 	clk_register_clkdev(clk, "fsmc", NULL);
+	clk_register_clkdev(clk, NULL, "smsc911x");
 
 	clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE,
 				BIT(1), 0);
Signature · 1 line
1.7.9.5
author
#5 lore raw

Re: [PATCH 3/4] clk: ux500: Provide an alias for the SMSC911x Ethernet chip

Quoted 28 lines · Lee Jones

In the case of some of the ux500 platforms, an Ethernet chip is placed on an extended bus which is traditionally used as a NAND flash chip placeholder. The p3_pclk0 clock is used to control it, so we are required to provide and easy way to access it from the SMSC911x driver. We do this using an alias provided by this patch.

Cc Mike Turquette <[email protected]>
Cc Ulf Hansson <[email protected]>
---
 drivers/clk/ux500/u8500_clk.c |    1 +
 1 file changed, 1 insertion(+)
drivers/clk/ux500/u8500_clk.c +1 -0
index a601802..9d9add1 100644
@@ -325,6 +325,7 @@ void u8500_clk_init(void)
 	clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", U8500_CLKRST3_BASE,
 				BIT(0), 0);
 	clk_register_clkdev(clk, "fsmc", NULL);
+	clk_register_clkdev(clk, NULL, "smsc911x");
 
 	clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE,
 				BIT(1), 0);
Signature · 1 line
1.7.9.5

I still need a maintiner Ack for this before I can push it.

Mike?

Signature · 4 lines
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
Acked-by
#6 lore raw

Re: [PATCH 3/4] clk: ux500: Provide an alias for the SMSC911x Ethernet chip

Quoted 33 lines · Lee Jones
Quoted 26 lines · Lee Jones

In the case of some of the ux500 platforms, an Ethernet chip is placed on an extended bus which is traditionally used as a NAND flash chip placeholder. The p3_pclk0 clock is used to control it, so we are required to provide and easy way to access it from the SMSC911x driver. We do this using an alias provided by this patch.

Cc Mike Turquette <[email protected]>
Cc Ulf Hansson <[email protected]>
---
 drivers/clk/ux500/u8500_clk.c |    1 +
 1 file changed, 1 insertion(+)
drivers/clk/ux500/u8500_clk.c +1 -1
index a601802..9d9add1 100644
@@ -325,6 +325,7 @@ void u8500_clk_init(void)
      clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", U8500_CLKRST3_BASE,
                              BIT(0), 0);
      clk_register_clkdev(clk, "fsmc", NULL);
+     clk_register_clkdev(clk, NULL, "smsc911x");
 
      clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE,
                              BIT(1), 0);
--
Quoted 2 lines

1.7.9.5

I still need a maintiner Ack for this before I can push it.

Quoted 7 lines

Mike?

--
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

#7 lore raw

Re: [PATCH 3/4] clk: ux500: Provide an alias for the SMSC911x Ethernet chip

In reply to Lee Jones

Quoting Lee Jones (2013-01-09 00:56:36)

Quoted 33 lines · Lee Jones
Quoted 29 lines

In the case of some of the ux500 platforms, an Ethernet chip is placed on an extended bus which is traditionally used as a NAND flash chip placeholder. The p3_pclk0 clock is used to control it, so we are required to provide and easy way to access it from the SMSC911x driver. We do this using an alias provided by this patch.

Cc Mike Turquette <[email protected]>
Cc Ulf Hansson <[email protected]>
---
 drivers/clk/ux500/u8500_clk.c |    1 +
 1 file changed, 1 insertion(+)
drivers/clk/ux500/u8500_clk.c +1 -0
index a601802..9d9add1 100644
@@ -325,6 +325,7 @@ void u8500_clk_init(void)
      clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", U8500_CLKRST3_BASE,
                              BIT(0), 0);
      clk_register_clkdev(clk, "fsmc", NULL);
+     clk_register_clkdev(clk, NULL, "smsc911x");
 
      clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE,
                              BIT(1), 0);
Signature · 1 line
1.7.9.5

I still need a maintiner Ack for this before I can push it.

Quoted 2 lines

Mike?

Quoted 5 lines
Signature · 4 lines
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
author
#8 lore raw

PATCH 4/4 net/smsc911x: Provide common clock functionality

In reply to Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org
---
 drivers/net/ethernet/smsc/smsc911x.c |   31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)
drivers/net/ethernet/smsc/smsc911x.c +30 -1
index 4616bf2..f6196cd 100644
@@ -33,6 +33,7 @@
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/crc32.h>
+#include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/etherdevice.h>
@@ -144,6 +145,9 @@ struct smsc911x_data {
 
 	/* regulators */
 	struct regulator_bulk_data supplies[SMSC911X_NUM_SUPPLIES];
+
+	/* clock */
+	struct clk *clk;
 };
 
 /* Easy access to information */
@@ -369,7 +373,7 @@ out:
 }
 
 /*
- * enable resources, currently just regulators.
+ * enable regulator and clock resources.
  */
 static int smsc911x_enable_resources(struct platform_device *pdev)
 {
@@ -382,6 +386,13 @@ static int smsc911x_enable_resources(struct platform_device *pdev)
 	if (ret)
 		netdev_err(ndev, "failed to enable regulators %d\n",
 				ret);
+
+	if (pdata->clk) {
+		ret = clk_prepare_enable(pdata->clk);
+		if (ret < 0)
+			netdev_err(ndev, "failed to enable clock %d\n", ret);
+	}
+
 	return ret;
 }
 
@@ -396,6 +407,10 @@ static int smsc911x_disable_resources(struct platform_device *pdev)
 
 	ret = regulator_bulk_disable(ARRAY_SIZE(pdata->supplies),
 			pdata->supplies);
+
+	if (pdata->clk)
+		clk_disable_unprepare(pdata->clk);
+
 	return ret;
 }
 
@@ -421,6 +436,14 @@ static int smsc911x_request_resources(struct platform_device *pdev)
 	if (ret)
 		netdev_err(ndev, "couldn't get regulators %d\n",
 				ret);
+
+	/* Request clock */
+	pdata->clk = clk_get(&pdev->dev, NULL);
+	if (IS_ERR(pdata->clk)) {
+		netdev_warn(ndev, "couldn't get clock %d\n", PTR_ERR(pdata->clk));
+		pdata->clk = NULL;
+	}
+
 	return ret;
 }
 
@@ -436,6 +459,12 @@ static void smsc911x_free_resources(struct platform_device *pdev)
 	/* Free regulators */
 	regulator_bulk_free(ARRAY_SIZE(pdata->supplies),
 			pdata->supplies);
+
+	/* Free clock */
+	if (pdata->clk) {
+		clk_put(pdata->clk);
+		pdata->clk = NULL;
+	}
 }
 
 /* waits for MAC not busy, with timeout.  Only called by smsc911x_mac_read
Signature · 1 line
1.7.9.5
Acked-by on v1 4/4
#9 lore raw

Re: [PATCH 4/4] net/smsc911x: Provide common clock functionality

Quoted 9 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org

Seems to me like it'll do the trick.

Yours,
Linus Walleij

#10 lore raw

Re: [PATCH 4/4] net/smsc911x: Provide common clock functionality

Quoted 8 lines · Linus Walleij
Quoted 6 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Quoted 6 lines
Quoted 3 lines
Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org

Seems to me like it'll do the trick.

This looks fairly dangerous. What about those platforms which use this driver, but don't provide a clock for it?

It looks like this will result in those platforms losing their ethernet support. There's at least a bunch of the ARM evaluation boards which make use of this driver...

author
#11 lore raw

Re: [PATCH 4/4] net/smsc911x: Provide common clock functionality

Quoted 16 lines · Russell King - ARM Linux
Quoted 8 lines · Linus Walleij
Quoted 6 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Quoted 6 lines
Quoted 3 lines
Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org

Seems to me like it'll do the trick.

Quoted 6 lines

This looks fairly dangerous. What about those platforms which use this driver, but don't provide a clock for it?

It looks like this will result in those platforms losing their ethernet support. There's at least a bunch of the ARM evaluation boards which make use of this driver...

Right, but nothing should regress. If no clock is provided the driver moves on during the request and will refuse to prepare, enable and disable there after.

Unless I've made a mistake somewhere? If so, I'd be happy to fixup.

Signature · 4 lines
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
#12 lore raw

Re: [PATCH 4/4] net/smsc911x: Provide common clock functionality

Quoted 25 lines · Lee Jones
Quoted 16 lines · Russell King - ARM Linux
Quoted 8 lines · Linus Walleij
Quoted 6 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Quoted 6 lines
Quoted 3 lines
Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org

Seems to me like it'll do the trick.

Quoted 6 lines

This looks fairly dangerous. What about those platforms which use this driver, but don't provide a clock for it?

It looks like this will result in those platforms losing their ethernet support. There's at least a bunch of the ARM evaluation boards which make use of this driver...

Quoted 5 lines

Right, but nothing should regress. If no clock is provided the driver moves on during the request and will refuse to prepare, enable and disable there after.

Unless I've made a mistake somewhere? If so, I'd be happy to fixup.

No, but... don't use NULL for that. Use IS_ERR(pdata->clk) instead.

author
#13 lore raw

Re: [PATCH 4/4] net/smsc911x: Provide common clock functionality

Quoted 26 lines · Russell King - ARM Linux
Quoted 25 lines · Lee Jones
Quoted 22 lines · Russell King - ARM Linux
Quoted 8 lines · Linus Walleij
Quoted 6 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Quoted 6 lines
Quoted 3 lines
Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org

Seems to me like it'll do the trick.

This looks fairly dangerous. What about those platforms which use this driver, but don't provide a clock for it?

It looks like this will result in those platforms losing their ethernet support. There's at least a bunch of the ARM evaluation boards which make use of this driver...

Quoted 7 lines
Quoted 5 lines

Right, but nothing should regress. If no clock is provided the driver moves on during the request and will refuse to prepare, enable and disable there after.

Unless I've made a mistake somewhere? If so, I'd be happy to fixup.

No, but... don't use NULL for that. Use IS_ERR(pdata->clk) instead.

I'm a bit confused. I do use IS_ERR, then if there was a problem pdata->clk is set to NULL, then we test for NULL thereafter:

Quoted 6 lines

/* Request clock */
pdata->clk = clk_get(&pdev->dev, NULL);

if (IS_ERR(pdata->clk)) {
        netdev_warn(ndev, "couldn't get clock %d\n", PTR_ERR(pdata->clk));
        pdata->clk = NULL;
}

Are you saying remove "pdata->clk = NULL;" and test for IS_ERR every time?

Signature · 4 lines
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
#14 lore raw

Re: [PATCH 4/4] net/smsc911x: Provide common clock functionality

Quoted 2 lines · Lee Jones

Are you saying remove "pdata->clk = NULL;" and test for IS_ERR every time?

Exactly.

author
#15 lore raw

PATCH v2 4/4 net/smsc911x: Provide common clock functionality

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org
---
 drivers/net/ethernet/smsc/smsc911x.c |   29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)
drivers/net/ethernet/smsc/smsc911x.c +28 -1
index e112877..afa4d62 100644
@@ -33,6 +33,7 @@
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/crc32.h>
+#include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/etherdevice.h>
@@ -144,6 +145,9 @@ struct smsc911x_data {
 
 	/* regulators */
 	struct regulator_bulk_data supplies[SMSC911X_NUM_SUPPLIES];
+
+	/* clock */
+	struct clk *clk;
 };
 
 /* Easy access to information */
@@ -369,7 +373,7 @@ out:
 }
 
 /*
- * enable resources, currently just regulators.
+ * enable regulator and clock resources.
  */
 static int smsc911x_enable_resources(struct platform_device *pdev)
 {
@@ -382,6 +386,13 @@ static int smsc911x_enable_resources(struct platform_device *pdev)
 	if (ret)
 		netdev_err(ndev, "failed to enable regulators %d\n",
 				ret);
+
+	if (IS_ERR(pdata->clk)) {
+		ret = clk_prepare_enable(pdata->clk);
+		if (ret < 0)
+			netdev_err(ndev, "failed to enable clock %d\n", ret);
+	}
+
 	return ret;
 }
 
@@ -396,6 +407,10 @@ static int smsc911x_disable_resources(struct platform_device *pdev)
 
 	ret = regulator_bulk_disable(ARRAY_SIZE(pdata->supplies),
 			pdata->supplies);
+
+	if (IS_ERR(pdata->clk))
+		clk_disable_unprepare(pdata->clk);
+
 	return ret;
 }
 
@@ -421,6 +436,12 @@ static int smsc911x_request_resources(struct platform_device *pdev)
 	if (ret)
 		netdev_err(ndev, "couldn't get regulators %d\n",
 				ret);
+
+	/* Request clock */
+	pdata->clk = clk_get(&pdev->dev, NULL);
+	if (IS_ERR(pdata->clk))
+		netdev_warn(ndev, "couldn't get clock %li\n", PTR_ERR(pdata->clk));
+
 	return ret;
 }
 
@@ -436,6 +457,12 @@ static void smsc911x_free_resources(struct platform_device *pdev)
 	/* Free regulators */
 	regulator_bulk_free(ARRAY_SIZE(pdata->supplies),
 			pdata->supplies);
+
+	/* Free clock */
+	if (IS_ERR(pdata->clk)) {
+		clk_put(pdata->clk);
+		pdata->clk = NULL;
+	}
 }
 
 /* waits for MAC not busy, with timeout.  Only called by smsc911x_mac_read
Signature · 1 line
1.7.9.5
#16 lore raw

Re: [PATCH 4/4 v2] net/smsc911x: Provide common clock functionality

drivers/net/ethernet/smsc/smsc911x.c static int smsc911x_enable_resources(struct platform_device *pdev) · line 394

Quoted 5 lines · Lee Jones
drivers/net/ethernet/smsc/smsc911x.c +5 -0
+       if (IS_ERR(pdata->clk)) {
+               ret = clk_prepare_enable(pdata->clk);
+               if (ret < 0)
+                       netdev_err(ndev, "failed to enable clock %d\n", ret);
+       }

I think you got all of these backwards now, shouldn't it be if (!IS_ERR(pdata->clk)) { } ...?

It's late here but enlighten me if I don't get it.

drivers/net/ethernet/smsc/smsc911x.c static int smsc911x_disable_resources(struct platform_device *pdev) · line 412

Quoted 2 lines
drivers/net/ethernet/smsc/smsc911x.c +2 -0
+       if (IS_ERR(pdata->clk))
+               clk_disable_unprepare(pdata->clk);

Dito.

drivers/net/ethernet/smsc/smsc911x.c static int smsc911x_request_resources(struct platform_device *pdev) · line 443

Quoted 4 lines
drivers/net/ethernet/smsc/smsc911x.c +4 -0
+       /* Request clock */
+       pdata->clk = clk_get(&pdev->dev, NULL);
+       if (IS_ERR(pdata->clk))
+               netdev_warn(ndev, "couldn't get clock %li\n", PTR_ERR(pdata->clk));

This one seems correct though.

drivers/net/ethernet/smsc/smsc911x.c static void smsc911x_free_resources(struct platform_device *pdev) · line 465

Quoted 5 lines
drivers/net/ethernet/smsc/smsc911x.c +5 -0
+       /* Free clock */
+       if (IS_ERR(pdata->clk)) {
+               clk_put(pdata->clk);
+               pdata->clk = NULL;
+       }

Should be !IS_ERR()

Yours,
Linus Walleij

author
#17 lore raw

Re: [PATCH 4/4 v2] net/smsc911x: Provide common clock functionality

No, you're right, I'm a moron.

Will fix up and resend when I'm back to work.

Sent from my mobile Linux device.

Quoted 33 lines · Linus Walleij

drivers/net/ethernet/smsc/smsc911x.c static int smsc911x_enable_resources(struct platform_device *pdev)

Quoted 4 lines · Lee Jones
drivers/net/ethernet/smsc/smsc911x.c +4 -0
+       if (IS_ERR(pdata->clk)) {
+               ret = clk_prepare_enable(pdata->clk);
+               if (ret < 0)
+                       netdev_err(ndev, "failed to enable clock %d\n",

ret);

Quoted 1 line

+ }

I think you got all of these backwards now, shouldn't it be if (!IS_ERR(pdata->clk)) { } ...?

It's late here but enlighten me if I don't get it.

drivers/net/ethernet/smsc/smsc911x.c static int smsc911x_disable_resources(struct platform_device *pdev) · line 412

Quoted 2 lines
drivers/net/ethernet/smsc/smsc911x.c +2 -0
+       if (IS_ERR(pdata->clk))
+               clk_disable_unprepare(pdata->clk);

Dito.

drivers/net/ethernet/smsc/smsc911x.c static int smsc911x_request_resources(struct platform_device *pdev)

Quoted 4 lines
drivers/net/ethernet/smsc/smsc911x.c +4 -0
+       /* Request clock */
+       pdata->clk = clk_get(&pdev->dev, NULL);
+       if (IS_ERR(pdata->clk))
+               netdev_warn(ndev, "couldn't get clock %li\n",

PTR_ERR(pdata->clk));

This one seems correct though.

drivers/net/ethernet/smsc/smsc911x.c static void smsc911x_free_resources(struct platform_device *pdev) · line 465

Quoted 5 lines
drivers/net/ethernet/smsc/smsc911x.c +5 -0
+       /* Free clock */
+       if (IS_ERR(pdata->clk)) {
+               clk_put(pdata->clk);
+               pdata->clk = NULL;
+       }
Quoted 5 lines

Should be !IS_ERR()

Yours,
Linus Walleij

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20121227/73803030/attachment-0001.html>

author
#18 lore raw

PATCH v3 4/4 net/smsc911x: Provide common clock functionality

In reply to Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org
---
 drivers/net/ethernet/smsc/smsc911x.c |   29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)
drivers/net/ethernet/smsc/smsc911x.c +28 -1
index e112877..f9b6bb7 100644
@@ -33,6 +33,7 @@
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/crc32.h>
+#include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/etherdevice.h>
@@ -144,6 +145,9 @@ struct smsc911x_data {
 
 	/* regulators */
 	struct regulator_bulk_data supplies[SMSC911X_NUM_SUPPLIES];
+
+	/* clock */
+	struct clk *clk;
 };
 
 /* Easy access to information */
@@ -369,7 +373,7 @@ out:
 }
 
 /*
- * enable resources, currently just regulators.
+ * enable regulator and clock resources.
  */
 static int smsc911x_enable_resources(struct platform_device *pdev)
 {
@@ -382,6 +386,13 @@ static int smsc911x_enable_resources(struct platform_device *pdev)
 	if (ret)
 		netdev_err(ndev, "failed to enable regulators %d\n",
 				ret);
+
+	if (!IS_ERR(pdata->clk)) {
+		ret = clk_prepare_enable(pdata->clk);
+		if (ret < 0)
+			netdev_err(ndev, "failed to enable clock %d\n", ret);
+	}
+
 	return ret;
 }
 
@@ -396,6 +407,10 @@ static int smsc911x_disable_resources(struct platform_device *pdev)
 
 	ret = regulator_bulk_disable(ARRAY_SIZE(pdata->supplies),
 			pdata->supplies);
+
+	if (!IS_ERR(pdata->clk))
+		clk_disable_unprepare(pdata->clk);
+
 	return ret;
 }
 
@@ -421,6 +436,12 @@ static int smsc911x_request_resources(struct platform_device *pdev)
 	if (ret)
 		netdev_err(ndev, "couldn't get regulators %d\n",
 				ret);
+
+	/* Request clock */
+	pdata->clk = clk_get(&pdev->dev, NULL);
+	if (IS_ERR(pdata->clk))
+		netdev_warn(ndev, "couldn't get clock %li\n", PTR_ERR(pdata->clk));
+
 	return ret;
 }
 
@@ -436,6 +457,12 @@ static void smsc911x_free_resources(struct platform_device *pdev)
 	/* Free regulators */
 	regulator_bulk_free(ARRAY_SIZE(pdata->supplies),
 			pdata->supplies);
+
+	/* Free clock */
+	if (!IS_ERR(pdata->clk)) {
+		clk_put(pdata->clk);
+		pdata->clk = NULL;
+	}
 }
 
 /* waits for MAC not busy, with timeout.  Only called by smsc911x_mac_read
Signature · 1 line
1.7.9.5
Reviewed-by on v3 4/4
#19 lore raw

Re: [PATCH 4/4 v3] net/smsc911x: Provide common clock functionality

Quoted 9 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org

Looks all right to me now:

Yours,
Linus Walleij

author
#20 lore raw

Re: [PATCH 4/4 v3] net/smsc911x: Provide common clock functionality

Quoted 8 lines · Linus Walleij
Quoted 6 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Quoted 6 lines
Quoted 3 lines
Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org

Looks all right to me now:

Great, thanks Linus.

Who will take this patch now?

Signature · 4 lines
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
author
#21 lore raw

Re: [PATCH 4/4 v3] net/smsc911x: Provide common clock functionality

In reply to Linus Walleij
Quoted 8 lines · Linus Walleij
Quoted 6 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Quoted 6 lines
Quoted 3 lines
Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org

Looks all right to me now:

I still need a maintiner Ack for this before I can push it.

Anyone?

Signature · 4 lines
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
Reviewed-by
#22 lore raw

Re: [PATCH 4/4 v3] net/smsc911x: Provide common clock functionality

Quoted 21 lines · Lee Jones
Quoted 8 lines · Linus Walleij
Quoted 6 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Quoted 6 lines
Quoted 3 lines
Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org

Looks all right to me now:

I still need a maintiner Ack for this before I can push it.

Anyone?

Quoted 10 lines

--
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

#23 lore raw

Re: [PATCH 4/4 v3] net/smsc911x: Provide common clock functionality

In reply to Lee Jones
Quoted 14 lines · Lee Jones
Quoted 12 lines · Linus Walleij
Quoted 9 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org
Quoted 6 lines
Quoted 2 lines

Looks all right to me now:

I still need a maintiner Ack for this before I can push it.

Anyone?

Steve is there sometimes. But I'd ask David Miller to ACK it if he's OK with the change.

Yours,
Linus Walleij

author
#24 lore raw

Re: [PATCH 4/4 v3] net/smsc911x: Provide common clock functionality

Quoted 16 lines
Quoted 16 lines
Quoted 7 lines
Quoted 7 lines

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Quoted 6 lines
Quoted 3 lines
Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org

Looks all right to me now:

I still need a maintiner Ack for this before I can push it.

Quoted 7 lines
Quoted 1 line

Anyone?

Steve is there sometimes. But I'd ask David Miller to ACK it if he's OK with the change.

Yours,
Linus Walleij

Hi David,

Does this [1] patch look okay to you too?

It's the last Ack I require before I can push the set.

[1] https://patchwork.kernel.org/patch/1926971/

Signature · 4 lines
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
author
#26 lore raw

Re: [PATCH 4/4] net/smsc911x: Provide common clock functionality

In reply to Lee Jones
Quoted 100 lines · Lee Jones

Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully.

Cc Steve Glendinning <[email protected]>
Cc netdev at vger.kernel.org
---
 drivers/net/ethernet/smsc/smsc911x.c |   31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)
drivers/net/ethernet/smsc/smsc911x.c +30 -1
index 4616bf2..f6196cd 100644
@@ -33,6 +33,7 @@
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/crc32.h>
+#include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/etherdevice.h>
@@ -144,6 +145,9 @@ struct smsc911x_data {
 
 	/* regulators */
 	struct regulator_bulk_data supplies[SMSC911X_NUM_SUPPLIES];
+
+	/* clock */
+	struct clk *clk;
 };
 
 /* Easy access to information */
@@ -369,7 +373,7 @@ out:
 }
 
 /*
- * enable resources, currently just regulators.
+ * enable regulator and clock resources.
  */
 static int smsc911x_enable_resources(struct platform_device *pdev)
 {
@@ -382,6 +386,13 @@ static int smsc911x_enable_resources(struct platform_device *pdev)
 	if (ret)
 		netdev_err(ndev, "failed to enable regulators %d\n",
 				ret);
+
+	if (pdata->clk) {
+		ret = clk_prepare_enable(pdata->clk);
+		if (ret < 0)
+			netdev_err(ndev, "failed to enable clock %d\n", ret);
+	}
+
 	return ret;
 }
 
@@ -396,6 +407,10 @@ static int smsc911x_disable_resources(struct platform_device *pdev)
 
 	ret = regulator_bulk_disable(ARRAY_SIZE(pdata->supplies),
 			pdata->supplies);
+
+	if (pdata->clk)
+		clk_disable_unprepare(pdata->clk);
+
 	return ret;
 }
 
@@ -421,6 +436,14 @@ static int smsc911x_request_resources(struct platform_device *pdev)
 	if (ret)
 		netdev_err(ndev, "couldn't get regulators %d\n",
 				ret);
+
+	/* Request clock */
+	pdata->clk = clk_get(&pdev->dev, NULL);
+	if (IS_ERR(pdata->clk)) {
+		netdev_warn(ndev, "couldn't get clock %d\n", PTR_ERR(pdata->clk));
+		pdata->clk = NULL;
+	}
+
 	return ret;
 }
 
@@ -436,6 +459,12 @@ static void smsc911x_free_resources(struct platform_device *pdev)
 	/* Free regulators */
 	regulator_bulk_free(ARRAY_SIZE(pdata->supplies),
 			pdata->supplies);
+
+	/* Free clock */
+	if (pdata->clk) {
+		clk_put(pdata->clk);
+		pdata->clk = NULL;
+	}
 }
 
 /* waits for MAC not busy, with timeout.  Only called by smsc911x_mac_read
Signature · 1 line
1.7.9.5

I still need a maintiner Ack for this before I can push it.

Mike?

Signature · 4 lines
Lee Jones
Linaro ST-Ericsson Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
Acked-by on v1 1/4
#27 lore raw
In reply to Lee Jones
Quoted 6 lines · Lee Jones

Device Tree names devices differently to how some frameworks expect them. Until we can move a platform over to the new way of obtaining resources, we have to use the OF_DEV_AUXDATA() macros to craft a device name which can be used in searches during allocation time.

I think that the best way to fix this regression is to gather ACKs from the involved subsystems and push it throug ARM SoC directly.

I thing Cc: stable at kernel.org needs to be added to all patches in this set as well.

Yours,
Linus Walleij