Message ID | 1536041098-50561-1-git-send-email-ley.foon.tan@intel.com |
---|---|
State | Accepted |
Commit | db6a158bc3fbf44fa71d18bf92f48961a500b4cc |
Delegated to: | Marek Vasut |
Headers | show |
Series | [U-Boot,v5] gpio: dwapb_gpio: Add reset ctrl to driver | expand |
On 09/04/2018 08:04 AM, Ley Foon Tan wrote: > Add code to reset all reset signals as in gpio DT node. A reset property > is an optional feature, so only print out a warning and do not fail if a > reset property is not present. > > If a reset property is discovered, then use it to deassert, thus > bringing the IP out of reset. > > Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com> Acked-by: Marek Vasut <marex@denx.de> > --- > v5: > - Move dev_warn() when return error. > > v4: > - Add struct gpio_dwapb_priv > > v3: > - Add .remove function. > - Add error handling when return non-zero from reset_get_bulk(). > > v2: > - Move reset to probe() function. > --- > drivers/gpio/dwapb_gpio.c | 51 +++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 49 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c > index 7cf2d47..0f6574d 100644 > --- a/drivers/gpio/dwapb_gpio.c > +++ b/drivers/gpio/dwapb_gpio.c > @@ -15,6 +15,7 @@ > #include <dm/lists.h> > #include <dm/root.h> > #include <errno.h> > +#include <reset.h> > > DECLARE_GLOBAL_DATA_PTR; > > @@ -29,6 +30,10 @@ DECLARE_GLOBAL_DATA_PTR; > #define GPIO_PORTA_EOI 0x4c > #define GPIO_EXT_PORT(p) (0x50 + (p) * 4) > > +struct gpio_dwapb_priv { > + struct reset_ctl_bulk resets; > +}; > + > struct gpio_dwapb_platdata { > const char *name; > int bank; > @@ -99,13 +104,42 @@ static const struct dm_gpio_ops gpio_dwapb_ops = { > .get_function = dwapb_gpio_get_function, > }; ^ Am I missing some patch ? I don't have this stuff in my tree and it causes fuzz/failure while applying this patch. > +static int gpio_dwapb_reset(struct udevice *dev) [...]
On Tue, Sep 4, 2018 at 3:36 PM Marek Vasut <marex@denx.de> wrote: > > On 09/04/2018 08:04 AM, Ley Foon Tan wrote: > > Add code to reset all reset signals as in gpio DT node. A reset property > > is an optional feature, so only print out a warning and do not fail if a > > reset property is not present. > > > > If a reset property is discovered, then use it to deassert, thus > > bringing the IP out of reset. > > > > Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com> > > Acked-by: Marek Vasut <marex@denx.de> > > > --- > > v5: > > - Move dev_warn() when return error. > > > > v4: > > - Add struct gpio_dwapb_priv > > > > v3: > > - Add .remove function. > > - Add error handling when return non-zero from reset_get_bulk(). > > > > v2: > > - Move reset to probe() function. > > --- > > drivers/gpio/dwapb_gpio.c | 51 +++++++++++++++++++++++++++++++++++++++++++- > > 1 files changed, 49 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c > > index 7cf2d47..0f6574d 100644 > > --- a/drivers/gpio/dwapb_gpio.c > > +++ b/drivers/gpio/dwapb_gpio.c > > @@ -15,6 +15,7 @@ > > #include <dm/lists.h> > > #include <dm/root.h> > > #include <errno.h> > > +#include <reset.h> > > > > DECLARE_GLOBAL_DATA_PTR; > > > > @@ -29,6 +30,10 @@ DECLARE_GLOBAL_DATA_PTR; > > #define GPIO_PORTA_EOI 0x4c > > #define GPIO_EXT_PORT(p) (0x50 + (p) * 4) > > > > +struct gpio_dwapb_priv { > > + struct reset_ctl_bulk resets; > > +}; > > + > > struct gpio_dwapb_platdata { > > const char *name; > > int bank; > > @@ -99,13 +104,42 @@ static const struct dm_gpio_ops gpio_dwapb_ops = { > > .get_function = dwapb_gpio_get_function, > > }; > > ^ Am I missing some patch ? I don't have this stuff in my tree and it > causes fuzz/failure while applying this patch. You need apply this patch first: https://patchwork.ozlabs.org/patch/958108/ Regards Ley Foon
On 09/04/2018 09:40 AM, Ley Foon Tan wrote: > On Tue, Sep 4, 2018 at 3:36 PM Marek Vasut <marex@denx.de> wrote: >> >> On 09/04/2018 08:04 AM, Ley Foon Tan wrote: >>> Add code to reset all reset signals as in gpio DT node. A reset property >>> is an optional feature, so only print out a warning and do not fail if a >>> reset property is not present. >>> >>> If a reset property is discovered, then use it to deassert, thus >>> bringing the IP out of reset. >>> >>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com> >> >> Acked-by: Marek Vasut <marex@denx.de> >> >>> --- >>> v5: >>> - Move dev_warn() when return error. >>> >>> v4: >>> - Add struct gpio_dwapb_priv >>> >>> v3: >>> - Add .remove function. >>> - Add error handling when return non-zero from reset_get_bulk(). >>> >>> v2: >>> - Move reset to probe() function. >>> --- >>> drivers/gpio/dwapb_gpio.c | 51 +++++++++++++++++++++++++++++++++++++++++++- >>> 1 files changed, 49 insertions(+), 2 deletions(-) >>> >>> diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c >>> index 7cf2d47..0f6574d 100644 >>> --- a/drivers/gpio/dwapb_gpio.c >>> +++ b/drivers/gpio/dwapb_gpio.c >>> @@ -15,6 +15,7 @@ >>> #include <dm/lists.h> >>> #include <dm/root.h> >>> #include <errno.h> >>> +#include <reset.h> >>> >>> DECLARE_GLOBAL_DATA_PTR; >>> >>> @@ -29,6 +30,10 @@ DECLARE_GLOBAL_DATA_PTR; >>> #define GPIO_PORTA_EOI 0x4c >>> #define GPIO_EXT_PORT(p) (0x50 + (p) * 4) >>> >>> +struct gpio_dwapb_priv { >>> + struct reset_ctl_bulk resets; >>> +}; >>> + >>> struct gpio_dwapb_platdata { >>> const char *name; >>> int bank; >>> @@ -99,13 +104,42 @@ static const struct dm_gpio_ops gpio_dwapb_ops = { >>> .get_function = dwapb_gpio_get_function, >>> }; >> >> ^ Am I missing some patch ? I don't have this stuff in my tree and it >> causes fuzz/failure while applying this patch. > You need apply this patch first: https://patchwork.ozlabs.org/patch/958108/ Applied both to socfpga/next, thanks!
On Tue, Sep 4, 2018 at 3:42 PM Marek Vasut <marex@denx.de> wrote: > > On 09/04/2018 09:40 AM, Ley Foon Tan wrote: > > On Tue, Sep 4, 2018 at 3:36 PM Marek Vasut <marex@denx.de> wrote: > >> > >> On 09/04/2018 08:04 AM, Ley Foon Tan wrote: > >>> Add code to reset all reset signals as in gpio DT node. A reset property > >>> is an optional feature, so only print out a warning and do not fail if a > >>> reset property is not present. > >>> > >>> If a reset property is discovered, then use it to deassert, thus > >>> bringing the IP out of reset. > >>> > >>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com> > >> > >> Acked-by: Marek Vasut <marex@denx.de> > >> > >>> --- > >>> v5: > >>> - Move dev_warn() when return error. > >>> > >>> v4: > >>> - Add struct gpio_dwapb_priv > >>> > >>> v3: > >>> - Add .remove function. > >>> - Add error handling when return non-zero from reset_get_bulk(). > >>> > >>> v2: > >>> - Move reset to probe() function. > >>> --- > >>> drivers/gpio/dwapb_gpio.c | 51 +++++++++++++++++++++++++++++++++++++++++++- > >>> 1 files changed, 49 insertions(+), 2 deletions(-) > >>> > >>> diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c > >>> index 7cf2d47..0f6574d 100644 > >>> --- a/drivers/gpio/dwapb_gpio.c > >>> +++ b/drivers/gpio/dwapb_gpio.c > >>> @@ -15,6 +15,7 @@ > >>> #include <dm/lists.h> > >>> #include <dm/root.h> > >>> #include <errno.h> > >>> +#include <reset.h> > >>> > >>> DECLARE_GLOBAL_DATA_PTR; > >>> > >>> @@ -29,6 +30,10 @@ DECLARE_GLOBAL_DATA_PTR; > >>> #define GPIO_PORTA_EOI 0x4c > >>> #define GPIO_EXT_PORT(p) (0x50 + (p) * 4) > >>> > >>> +struct gpio_dwapb_priv { > >>> + struct reset_ctl_bulk resets; > >>> +}; > >>> + > >>> struct gpio_dwapb_platdata { > >>> const char *name; > >>> int bank; > >>> @@ -99,13 +104,42 @@ static const struct dm_gpio_ops gpio_dwapb_ops = { > >>> .get_function = dwapb_gpio_get_function, > >>> }; > >> > >> ^ Am I missing some patch ? I don't have this stuff in my tree and it > >> causes fuzz/failure while applying this patch. > > You need apply this patch first: https://patchwork.ozlabs.org/patch/958108/ > > Applied both to socfpga/next, thanks! > Thanks! Regards Ley Foon
diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c index 7cf2d47..0f6574d 100644 --- a/drivers/gpio/dwapb_gpio.c +++ b/drivers/gpio/dwapb_gpio.c @@ -15,6 +15,7 @@ #include <dm/lists.h> #include <dm/root.h> #include <errno.h> +#include <reset.h> DECLARE_GLOBAL_DATA_PTR; @@ -29,6 +30,10 @@ DECLARE_GLOBAL_DATA_PTR; #define GPIO_PORTA_EOI 0x4c #define GPIO_EXT_PORT(p) (0x50 + (p) * 4) +struct gpio_dwapb_priv { + struct reset_ctl_bulk resets; +}; + struct gpio_dwapb_platdata { const char *name; int bank; @@ -99,13 +104,42 @@ static const struct dm_gpio_ops gpio_dwapb_ops = { .get_function = dwapb_gpio_get_function, }; +static int gpio_dwapb_reset(struct udevice *dev) +{ + int ret; + struct gpio_dwapb_priv *priv = dev_get_priv(dev); + + ret = reset_get_bulk(dev, &priv->resets); + if (ret) { + /* Return 0 if error due to !CONFIG_DM_RESET and reset + * DT property is not present. + */ + if (ret == -ENOENT || ret == -ENOTSUPP) + return 0; + + dev_warn(dev, "Can't get reset: %d\n", ret); + return ret; + } + + ret = reset_deassert_bulk(&priv->resets); + if (ret) { + reset_release_bulk(&priv->resets); + dev_err(dev, "Failed to reset: %d\n", ret); + return ret; + } + + return 0; +} + static int gpio_dwapb_probe(struct udevice *dev) { struct gpio_dev_priv *priv = dev_get_uclass_priv(dev); struct gpio_dwapb_platdata *plat = dev->platdata; - if (!plat) - return 0; + if (!plat) { + /* Reset on parent device only */ + return gpio_dwapb_reset(dev); + } priv->gpio_count = plat->pins; priv->bank_name = plat->name; @@ -166,6 +200,17 @@ err: return ret; } +static int gpio_dwapb_remove(struct udevice *dev) +{ + struct gpio_dwapb_platdata *plat = dev_get_platdata(dev); + struct gpio_dwapb_priv *priv = dev_get_priv(dev); + + if (!plat && priv) + return reset_release_bulk(&priv->resets); + + return 0; +} + static const struct udevice_id gpio_dwapb_ids[] = { { .compatible = "snps,dw-apb-gpio" }, { } @@ -178,4 +223,6 @@ U_BOOT_DRIVER(gpio_dwapb) = { .ops = &gpio_dwapb_ops, .bind = gpio_dwapb_bind, .probe = gpio_dwapb_probe, + .remove = gpio_dwapb_remove, + .priv_auto_alloc_size = sizeof(struct gpio_dwapb_priv), };
Add code to reset all reset signals as in gpio DT node. A reset property is an optional feature, so only print out a warning and do not fail if a reset property is not present. If a reset property is discovered, then use it to deassert, thus bringing the IP out of reset. Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com> --- v5: - Move dev_warn() when return error. v4: - Add struct gpio_dwapb_priv v3: - Add .remove function. - Add error handling when return non-zero from reset_get_bulk(). v2: - Move reset to probe() function. --- drivers/gpio/dwapb_gpio.c | 51 +++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 49 insertions(+), 2 deletions(-)