7ce5eb59cfb04ea82181a22c62768d74320ed310
[openwrt/openwrt.git] / target / linux / brcm63xx / patches-4.4 / 001-4.13-02-mdio_bus-handle-only-single-PHY-reset-GPIO.patch
1 From d396e84c56047b303cac378dde4b2e5cc430b336 Mon Sep 17 00:00:00 2001
2 From: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
3 Date: Mon, 12 Jun 2017 23:55:38 +0300
4 Subject: [PATCH] mdio_bus: handle only single PHY reset GPIO
5
6 Commit 4c5e7a2c0501 ("dt-bindings: mdio: Clarify binding document")
7 declared that a MDIO reset GPIO property should have only a single GPIO
8 reference/specifier, however the supporting code was left intact, still
9 burdening the kernel with now apparently useless loops -- get rid of them.
10
11 Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
12 Signed-off-by: David S. Miller <davem@davemloft.net>
13 ---
14 drivers/net/phy/mdio_bus.c | 53 +++++++++++++++++-----------------------------
15 drivers/of/of_mdio.c | 1 -
16 include/linux/phy.h | 6 ++----
17 3 files changed, 21 insertions(+), 39 deletions(-)
18
19 --- a/drivers/net/phy/mdio_bus.c
20 +++ b/drivers/net/phy/mdio_bus.c
21 @@ -279,33 +279,22 @@ int __mdiobus_register(struct mii_bus *b
22
23 mutex_init(&bus->mdio_lock);
24
25 - /* de-assert bus level PHY GPIO resets */
26 - if (bus->num_reset_gpios > 0) {
27 - bus->reset_gpiod = devm_kcalloc(&bus->dev,
28 - bus->num_reset_gpios,
29 - sizeof(struct gpio_desc *),
30 - GFP_KERNEL);
31 - if (!bus->reset_gpiod)
32 - return -ENOMEM;
33 - }
34 -
35 - for (i = 0; i < bus->num_reset_gpios; i++) {
36 - gpiod = devm_gpiod_get_index(&bus->dev, "reset", i,
37 - GPIOD_OUT_LOW);
38 - if (IS_ERR(gpiod)) {
39 - err = PTR_ERR(gpiod);
40 - if (err != -ENOENT) {
41 - dev_err(&bus->dev,
42 - "mii_bus %s couldn't get reset GPIO\n",
43 - bus->id);
44 - return err;
45 - }
46 - } else {
47 - bus->reset_gpiod[i] = gpiod;
48 - gpiod_set_value_cansleep(gpiod, 1);
49 - udelay(bus->reset_delay_us);
50 - gpiod_set_value_cansleep(gpiod, 0);
51 + /* de-assert bus level PHY GPIO reset */
52 + gpiod = devm_gpiod_get(&bus->dev, "reset", GPIOD_OUT_LOW);
53 + if (IS_ERR(gpiod)) {
54 + err = PTR_ERR(gpiod);
55 + if (err != -ENOENT) {
56 + dev_err(&bus->dev,
57 + "mii_bus %s couldn't get reset GPIO\n",
58 + bus->id);
59 + return err;
60 }
61 + } else {
62 + bus->reset_gpiod = gpiod;
63 +
64 + gpiod_set_value_cansleep(gpiod, 1);
65 + udelay(bus->reset_delay_us);
66 + gpiod_set_value_cansleep(gpiod, 0);
67 }
68
69 if (bus->reset)
70 @@ -337,10 +326,8 @@ error:
71 }
72
73 /* Put PHYs in RESET to save power */
74 - for (i = 0; i < bus->num_reset_gpios; i++) {
75 - if (bus->reset_gpiod[i])
76 - gpiod_set_value_cansleep(bus->reset_gpiod[i], 1);
77 - }
78 + if (bus->reset_gpiod)
79 + gpiod_set_value_cansleep(bus->reset_gpiod, 1);
80
81 device_del(&bus->dev);
82 return err;
83 @@ -363,10 +350,8 @@ void mdiobus_unregister(struct mii_bus *
84 }
85
86 /* Put PHYs in RESET to save power */
87 - for (i = 0; i < bus->num_reset_gpios; i++) {
88 - if (bus->reset_gpiod[i])
89 - gpiod_set_value_cansleep(bus->reset_gpiod[i], 1);
90 - }
91 + if (bus->reset_gpiod)
92 + gpiod_set_value_cansleep(bus->reset_gpiod, 1);
93
94 device_del(&bus->dev);
95 }
96 --- a/drivers/of/of_mdio.c
97 +++ b/drivers/of/of_mdio.c
98 @@ -145,7 +145,6 @@ int of_mdiobus_register(struct mii_bus *
99 /* Get bus level PHY reset GPIO details */
100 mdio->reset_delay_us = DEFAULT_GPIO_RESET_DELAY;
101 of_property_read_u32(np, "reset-delay-us", &mdio->reset_delay_us);
102 - mdio->num_reset_gpios = of_gpio_named_count(np, "reset-gpios");
103
104 /* Register the MDIO bus */
105 rc = mdiobus_register(mdio);
106 --- a/include/linux/phy.h
107 +++ b/include/linux/phy.h
108 @@ -190,10 +190,8 @@ struct mii_bus {
109
110 /* GPIO reset pulse width in microseconds */
111 int reset_delay_us;
112 - /* Number of reset GPIOs */
113 - int num_reset_gpios;
114 - /* Array of RESET GPIO descriptors */
115 - struct gpio_desc **reset_gpiod;
116 + /* RESET GPIO descriptor pointer */
117 + struct gpio_desc *reset_gpiod;
118 };
119 #define to_mii_bus(d) container_of(d, struct mii_bus, dev)
120