Skip to contentSkip to conversation

gpio: gpio-dwapb: add optional reset

PATCH In review Alan Tull 3 participants 5 messages Oct 11, 2017 – Oct 12, 2017

Subsystems (2)
lore
Share & tools
lore

Alan Tull

author
#0 lore raw

PATCH 1/1 gpio: gpio-dwapb: add optional reset

Some platforms require reset to be released to allow register access.

---
v2: Request shared controller
return all errors from reset controller request drop conditions on asserting/deasserting reset

---
 drivers/gpio/gpio-dwapb.c | 9 +++++++++
 1 file changed, 9 insertions(+)
drivers/gpio/gpio-dwapb.c +9 -0
index f051c45..0df8cdf 100644
@@ -25,6 +25,7 @@
 #include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/property.h>
+#include <linux/reset.h>
 #include <linux/spinlock.h>
 #include <linux/platform_data/gpio-dwapb.h>
 #include <linux/slab.h>
@@ -97,6 +98,7 @@ struct dwapb_gpio {
 	unsigned int		nr_ports;
 	struct irq_domain	*domain;
 	unsigned int		flags;
+	struct reset_control	*rst;
 };
 
 static inline u32 gpio_reg_v2_convert(unsigned int offset)
@@ -608,6 +610,12 @@ static int dwapb_gpio_probe(struct platform_device *pdev)
 	gpio->dev = &pdev->dev;
 	gpio->nr_ports = pdata->nports;
 
+	gpio->rst = devm_reset_control_get_optional_shared(dev, NULL);
+	if (IS_ERR(gpio->rst))
+		return PTR_ERR(gpio->rst);
+
+	reset_control_deassert(gpio->rst);
+
 	gpio->ports = devm_kcalloc(&pdev->dev, gpio->nr_ports,
 				   sizeof(*gpio->ports), GFP_KERNEL);
 	if (!gpio->ports)
@@ -659,6 +667,7 @@ static int dwapb_gpio_remove(struct platform_device *pdev)
 
 	dwapb_gpio_unregister(gpio);
 	dwapb_irq_teardown(gpio);
+	reset_control_assert(gpio->rst);
 
 	return 0;
 }
Signature · 1 line
2.7.4
author
#1 lore raw

On Wed, Oct 11, 2017 at 11:34 AM, Alan Tull <[email protected]> wrote:

Sorry, I forgot to specify PATCH v2 in the subject.

Alan

Quoted 56 lines

Some platforms require reset to be released to allow register access.

---
v2: Request shared controller
return all errors from reset controller request drop conditions on asserting/deasserting reset

---
 drivers/gpio/gpio-dwapb.c | 9 +++++++++
 1 file changed, 9 insertions(+)
drivers/gpio/gpio-dwapb.c +9 -1
index f051c45..0df8cdf 100644
@@ -25,6 +25,7 @@
 #include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/property.h>
+#include <linux/reset.h>
 #include <linux/spinlock.h>
 #include <linux/platform_data/gpio-dwapb.h>
 #include <linux/slab.h>
@@ -97,6 +98,7 @@ struct dwapb_gpio {
        unsigned int            nr_ports;
        struct irq_domain       *domain;
        unsigned int            flags;
+       struct reset_control    *rst;
 };
 
 static inline u32 gpio_reg_v2_convert(unsigned int offset)
@@ -608,6 +610,12 @@ static int dwapb_gpio_probe(struct platform_device *pdev)
        gpio->dev = &pdev->dev;
        gpio->nr_ports = pdata->nports;
 
+       gpio->rst = devm_reset_control_get_optional_shared(dev, NULL);
+       if (IS_ERR(gpio->rst))
+               return PTR_ERR(gpio->rst);
+
+       reset_control_deassert(gpio->rst);
+
        gpio->ports = devm_kcalloc(&pdev->dev, gpio->nr_ports,
                                   sizeof(*gpio->ports), GFP_KERNEL);
        if (!gpio->ports)
@@ -659,6 +667,7 @@ static int dwapb_gpio_remove(struct platform_device *pdev)
 
        dwapb_gpio_unregister(gpio);
        dwapb_irq_teardown(gpio);
+       reset_control_assert(gpio->rst);
 
        return 0;
 }
--

2.7.4

Reviewed-by on v1 1/1
#2 lore raw
In reply to Alan Tull
Quoted 8 lines · Alan Tull

Some platforms require reset to be released to allow register access.

---
v2: Request shared controller
return all errors from reset controller request drop conditions on asserting/deasserting reset

Could you also update the device tree binding docs [1] to mention the optional resets phandle?

[1] Documentation/devicetree/bindings/gpio/snps-dwapb-gpio.txt

regards
Philipp

Quoted 45 lines
---
 drivers/gpio/gpio-dwapb.c | 9 +++++++++
 1 file changed, 9 insertions(+)
drivers/gpio/gpio-dwapb.c +9 -0
index f051c45..0df8cdf 100644
@@ -25,6 +25,7 @@
 #include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/property.h>
+#include <linux/reset.h>
 #include <linux/spinlock.h>
 #include <linux/platform_data/gpio-dwapb.h>
 #include <linux/slab.h>
@@ -97,6 +98,7 @@ struct dwapb_gpio {
 	unsigned int		nr_ports;
 	struct irq_domain	*domain;
 	unsigned int		flags;
+	struct reset_control	*rst;
 };
 
 static inline u32 gpio_reg_v2_convert(unsigned int offset)
@@ -608,6 +610,12 @@ static int dwapb_gpio_probe(struct platform_device *pdev)
 	gpio->dev = &pdev->dev;
 	gpio->nr_ports = pdata->nports;
 
+	gpio->rst = devm_reset_control_get_optional_shared(dev, NULL);
+	if (IS_ERR(gpio->rst))
+		return PTR_ERR(gpio->rst);
+
+	reset_control_deassert(gpio->rst);
+
 	gpio->ports = devm_kcalloc(&pdev->dev, gpio->nr_ports,
 				   sizeof(*gpio->ports), GFP_KERNEL);
 	if (!gpio->ports)
@@ -659,6 +667,7 @@ static int dwapb_gpio_remove(struct platform_device *pdev)
 
 	dwapb_gpio_unregister(gpio);
 	dwapb_irq_teardown(gpio);
+	reset_control_assert(gpio->rst);
 
 	return 0;
 }
#3 lore raw
In reply to Alan Tull
Quoted 8 lines · Alan Tull

Some platforms require reset to be released to allow register access.

---
v2: Request shared controller
return all errors from reset controller request drop conditions on asserting/deasserting reset

This v2 version applied with Philipp's review tag, I also added a blurb to the DT binding as Philipp asked so no need to fix that separately.

Yours,
Linus Walleij

author
#4 lore raw

On Thu, Oct 12, 2017 at 3:26 AM, Linus Walleij <[email protected]> wrote:

Hi Linus, Phillipp,

Quoted 6 lines

This v2 version applied with Philipp's review tag, I also added a blurb to the DT binding as Philipp asked so no need to fix that separately.

Yours,
Linus Walleij

Thanks!

Alan Tull