* [PATCH 0/2] gpio-rochchip @ 2022-03-03 6:22 Jianqun Xu 2022-03-03 6:22 ` [PATCH 1/2] gpio: rockchip: make gpio work without cru module Jianqun Xu 2022-03-03 6:22 ` [PATCH 2/2] gpio: rockchip: get pinctrl node from 'gpio-ranges' property Jianqun Xu 0 siblings, 2 replies; 6+ messages in thread From: Jianqun Xu @ 2022-03-03 6:22 UTC (permalink / raw) To: heiko; +Cc: linus.walleij, linux-rockchip, linux-gpio, Jianqun Xu The first patch fixes gpio driver to support works without cru, and the second patch try to support different dt node format. Jianqun Xu (2): gpio: rockchip: make gpio work without cru module gpio: rockchip: get pinctrl node from 'gpio-ranges' property drivers/gpio/gpio-rockchip.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) -- 2.25.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] gpio: rockchip: make gpio work without cru module 2022-03-03 6:22 [PATCH 0/2] gpio-rochchip Jianqun Xu @ 2022-03-03 6:22 ` Jianqun Xu 2022-03-03 11:28 ` Heiko Stübner 2022-03-03 6:22 ` [PATCH 2/2] gpio: rockchip: get pinctrl node from 'gpio-ranges' property Jianqun Xu 1 sibling, 1 reply; 6+ messages in thread From: Jianqun Xu @ 2022-03-03 6:22 UTC (permalink / raw) To: heiko; +Cc: linus.walleij, linux-rockchip, linux-gpio, Jianqun Xu In some case the system may has no builtin cru module, the gpio driver will fail to get periph clock and debounce clock. On rockchip SoCs, the pclk and dbg clk are default to be enabled and ungated, the gpio possible to work without cru module. This patch makes gpio work fine without cru module. Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> --- drivers/gpio/gpio-rockchip.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/gpio/gpio-rockchip.c b/drivers/gpio/gpio-rockchip.c index a4c4e4584f5b..1da0324445cc 100644 --- a/drivers/gpio/gpio-rockchip.c +++ b/drivers/gpio/gpio-rockchip.c @@ -195,6 +195,9 @@ static int rockchip_gpio_set_debounce(struct gpio_chip *gc, unsigned int cur_div_reg; u64 div; + if (!bank->db_clk) + return -ENOENT; + if (bank->gpio_type == GPIO_TYPE_V2 && !IS_ERR(bank->db_clk)) { div_debounce_support = true; freq = clk_get_rate(bank->db_clk); @@ -654,8 +657,10 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank) return -EINVAL; bank->clk = of_clk_get(bank->of_node, 0); - if (IS_ERR(bank->clk)) - return PTR_ERR(bank->clk); + if (IS_ERR(bank->clk)) { + bank->clk = NULL; + dev_warn(bank->dev, "works without clk pm\n"); + } clk_prepare_enable(bank->clk); id = readl(bank->reg_base + gpio_regs_v2.version_id); @@ -666,9 +671,8 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank) bank->gpio_type = GPIO_TYPE_V2; bank->db_clk = of_clk_get(bank->of_node, 1); if (IS_ERR(bank->db_clk)) { - dev_err(bank->dev, "cannot find debounce clk\n"); - clk_disable_unprepare(bank->clk); - return -EINVAL; + bank->db_clk = NULL; + dev_warn(bank->dev, "works without debounce clk pm\n"); } } else { bank->gpio_regs = &gpio_regs_v1; -- 2.25.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] gpio: rockchip: make gpio work without cru module 2022-03-03 6:22 ` [PATCH 1/2] gpio: rockchip: make gpio work without cru module Jianqun Xu @ 2022-03-03 11:28 ` Heiko Stübner 0 siblings, 0 replies; 6+ messages in thread From: Heiko Stübner @ 2022-03-03 11:28 UTC (permalink / raw) To: Jianqun Xu; +Cc: linus.walleij, linux-rockchip, linux-gpio, Jianqun Xu Hi Jianqun, Am Donnerstag, 3. März 2022, 07:22:10 CET schrieb Jianqun Xu: > In some case the system may has no builtin cru module, the gpio driver > will fail to get periph clock and debounce clock. can you elaborate a bit on what these cases are? > On rockchip SoCs, the pclk and dbg clk are default to be enabled and > ungated, the gpio possible to work without cru module. > > This patch makes gpio work fine without cru module. > > Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> > --- > drivers/gpio/gpio-rockchip.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpio/gpio-rockchip.c b/drivers/gpio/gpio-rockchip.c > index a4c4e4584f5b..1da0324445cc 100644 > --- a/drivers/gpio/gpio-rockchip.c > +++ b/drivers/gpio/gpio-rockchip.c > @@ -195,6 +195,9 @@ static int rockchip_gpio_set_debounce(struct gpio_chip *gc, > unsigned int cur_div_reg; > u64 div; > > + if (!bank->db_clk) > + return -ENOENT; > + > if (bank->gpio_type == GPIO_TYPE_V2 && !IS_ERR(bank->db_clk)) { > div_debounce_support = true; > freq = clk_get_rate(bank->db_clk); > @@ -654,8 +657,10 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank) > return -EINVAL; > > bank->clk = of_clk_get(bank->of_node, 0); > - if (IS_ERR(bank->clk)) > - return PTR_ERR(bank->clk); > + if (IS_ERR(bank->clk)) { > + bank->clk = NULL; > + dev_warn(bank->dev, "works without clk pm\n"); I'd definitly expect a more sensitive handling here (and below). I.e. the change right now, simply disables all error handling. But I do expect a handling difference between: - clock described in DT, but not available - should fail - clock not described in DT - can be allowed to go to NULL Heiko > + } > > clk_prepare_enable(bank->clk); > id = readl(bank->reg_base + gpio_regs_v2.version_id); > @@ -666,9 +671,8 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank) > bank->gpio_type = GPIO_TYPE_V2; > bank->db_clk = of_clk_get(bank->of_node, 1); > if (IS_ERR(bank->db_clk)) { > - dev_err(bank->dev, "cannot find debounce clk\n"); > - clk_disable_unprepare(bank->clk); > - return -EINVAL; > + bank->db_clk = NULL; > + dev_warn(bank->dev, "works without debounce clk pm\n"); > } > } else { > bank->gpio_regs = &gpio_regs_v1; > ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] gpio: rockchip: get pinctrl node from 'gpio-ranges' property 2022-03-03 6:22 [PATCH 0/2] gpio-rochchip Jianqun Xu 2022-03-03 6:22 ` [PATCH 1/2] gpio: rockchip: make gpio work without cru module Jianqun Xu @ 2022-03-03 6:22 ` Jianqun Xu 2022-03-03 11:40 ` Heiko Stübner 2022-03-15 1:15 ` Linus Walleij 1 sibling, 2 replies; 6+ messages in thread From: Jianqun Xu @ 2022-03-03 6:22 UTC (permalink / raw) To: heiko; +Cc: linus.walleij, linux-rockchip, linux-gpio, Jianqun Xu The dt nodes for rockchip soc designes as pinctrl: pinctrl { gpio { gpio-ranges = <&pinctrl xxx>; }; }; Currently, we get the pinctrl dt node from parent of gpio, this patch try to get pinctrl dt node from 'gpio-ranges' property. After this patch, the dt nodes possible to be gpio { gpio-ranges = <&pinctrl xxx>; }; pinctrl: pinctrl { }; then the gpio driver could register as platform device itself, but not populate from pinctrl driver. Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> --- drivers/gpio/gpio-rockchip.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/gpio/gpio-rockchip.c b/drivers/gpio/gpio-rockchip.c index 1da0324445cc..46c54dff92db 100644 --- a/drivers/gpio/gpio-rockchip.c +++ b/drivers/gpio/gpio-rockchip.c @@ -690,6 +690,9 @@ rockchip_gpio_find_bank(struct pinctrl_dev *pctldev, int id) int i, found = 0; info = pinctrl_dev_get_drvdata(pctldev); + if (!info) + return NULL; + bank = info->ctrl->pin_banks; for (i = 0; i < info->ctrl->nr_banks; i++, bank++) { if (bank->bank_num == id) { @@ -705,15 +708,16 @@ static int rockchip_gpio_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; - struct device_node *pctlnp = of_get_parent(np); + struct device_node *pctlnp = NULL; struct pinctrl_dev *pctldev = NULL; struct rockchip_pin_bank *bank = NULL; struct rockchip_pin_output_deferred *cfg; static int gpio; int id, ret; - if (!np || !pctlnp) - return -ENODEV; + pctlnp = of_parse_phandle(np, "gpio-ranges", 0); + if (!pctlnp) + pctlnp = of_get_parent(np); pctldev = of_pinctrl_get(pctlnp); if (!pctldev) -- 2.25.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] gpio: rockchip: get pinctrl node from 'gpio-ranges' property 2022-03-03 6:22 ` [PATCH 2/2] gpio: rockchip: get pinctrl node from 'gpio-ranges' property Jianqun Xu @ 2022-03-03 11:40 ` Heiko Stübner 2022-03-15 1:15 ` Linus Walleij 1 sibling, 0 replies; 6+ messages in thread From: Heiko Stübner @ 2022-03-03 11:40 UTC (permalink / raw) To: Jianqun Xu; +Cc: linus.walleij, linux-rockchip, linux-gpio, Jianqun Xu Hi Jianqun, Am Donnerstag, 3. März 2022, 07:22:11 CET schrieb Jianqun Xu: > The dt nodes for rockchip soc designes as > > pinctrl: pinctrl { > gpio { > gpio-ranges = <&pinctrl xxx>; > }; > }; > > Currently, we get the pinctrl dt node from parent of gpio, this patch > try to get pinctrl dt node from 'gpio-ranges' property. > > After this patch, the dt nodes possible to be > > gpio { > gpio-ranges = <&pinctrl xxx>; > }; > > pinctrl: pinctrl { > > }; > > then the gpio driver could register as platform device itself, but not > populate from pinctrl driver. The change looks interesting, as it would solve that long-standing design-issue I "created" back in 2013 ;-) . Though you need to keep some things in mind: (1) Such a change should be reflected in the devicetree binding as it involves a different form of nodes and introduces. Looking at the binding description, using gpio-ranges to map to specific pinctrl pins really seems to be a valid use for this. (2) Keep things backwards compatible. Old devicetrees should stay working with new kernel versions A common pattern is to try the new approach and if that fails try the "deprecated" method, which should be nicely doable when looking at the code change below. Heiko > Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> > --- > drivers/gpio/gpio-rockchip.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpio/gpio-rockchip.c b/drivers/gpio/gpio-rockchip.c > index 1da0324445cc..46c54dff92db 100644 > --- a/drivers/gpio/gpio-rockchip.c > +++ b/drivers/gpio/gpio-rockchip.c > @@ -690,6 +690,9 @@ rockchip_gpio_find_bank(struct pinctrl_dev *pctldev, int id) > int i, found = 0; > > info = pinctrl_dev_get_drvdata(pctldev); > + if (!info) > + return NULL; > + > bank = info->ctrl->pin_banks; > for (i = 0; i < info->ctrl->nr_banks; i++, bank++) { > if (bank->bank_num == id) { > @@ -705,15 +708,16 @@ static int rockchip_gpio_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > struct device_node *np = dev->of_node; > - struct device_node *pctlnp = of_get_parent(np); > + struct device_node *pctlnp = NULL; > struct pinctrl_dev *pctldev = NULL; > struct rockchip_pin_bank *bank = NULL; > struct rockchip_pin_output_deferred *cfg; > static int gpio; > int id, ret; > > - if (!np || !pctlnp) > - return -ENODEV; > + pctlnp = of_parse_phandle(np, "gpio-ranges", 0); > + if (!pctlnp) > + pctlnp = of_get_parent(np); > > pctldev = of_pinctrl_get(pctlnp); > if (!pctldev) > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] gpio: rockchip: get pinctrl node from 'gpio-ranges' property 2022-03-03 6:22 ` [PATCH 2/2] gpio: rockchip: get pinctrl node from 'gpio-ranges' property Jianqun Xu 2022-03-03 11:40 ` Heiko Stübner @ 2022-03-15 1:15 ` Linus Walleij 1 sibling, 0 replies; 6+ messages in thread From: Linus Walleij @ 2022-03-15 1:15 UTC (permalink / raw) To: Jianqun Xu; +Cc: heiko, linux-rockchip, linux-gpio On Thu, Mar 3, 2022 at 7:22 AM Jianqun Xu <jay.xu@rock-chips.com> wrote: > The dt nodes for rockchip soc designes as > > pinctrl: pinctrl { > gpio { > gpio-ranges = <&pinctrl xxx>; > }; > }; > > Currently, we get the pinctrl dt node from parent of gpio, this patch > try to get pinctrl dt node from 'gpio-ranges' property. > > After this patch, the dt nodes possible to be > > gpio { > gpio-ranges = <&pinctrl xxx>; > }; > > pinctrl: pinctrl { > > }; > > then the gpio driver could register as platform device itself, but not > populate from pinctrl driver. > > Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> (...) > - if (!np || !pctlnp) > - return -ENODEV; > + pctlnp = of_parse_phandle(np, "gpio-ranges", 0); > + if (!pctlnp) > + pctlnp = of_get_parent(np); GPIO ranges can be several and point to several different pin controllers. I understand it does not in your case, so I guess it is fine if Heiko is fine with it. Yours, Linus Walleij ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-03-15 1:15 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-03-03 6:22 [PATCH 0/2] gpio-rochchip Jianqun Xu 2022-03-03 6:22 ` [PATCH 1/2] gpio: rockchip: make gpio work without cru module Jianqun Xu 2022-03-03 11:28 ` Heiko Stübner 2022-03-03 6:22 ` [PATCH 2/2] gpio: rockchip: get pinctrl node from 'gpio-ranges' property Jianqun Xu 2022-03-03 11:40 ` Heiko Stübner 2022-03-15 1:15 ` Linus Walleij
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).