* Re: [PATCH 2/2] mtd: nand: sunxi: add reset line support [not found] ` <20160619113739.30362-2-icenowy@aosc.xyz> @ 2016-06-19 12:06 ` Boris Brezillon [not found] ` <2686901466340069@web27g.yandex.ru> 2016-06-20 12:05 ` Philipp Zabel 0 siblings, 2 replies; 5+ messages in thread From: Boris Brezillon @ 2016-06-19 12:06 UTC (permalink / raw) To: Icenowy Zheng Cc: maxime.ripard, wens, robh+dt, richard, dwmw2, computersforpeace, devicetree, linux-kernel, linux-mtd, linux-sunxi, Philipp Zabel +Philipp On Sun, 19 Jun 2016 19:37:39 +0800 Icenowy Zheng <icenowy@aosc.xyz> wrote: > The NAND controller on some sun8i chips needs its reset line to be deasserted > before they can enter working state. This commit added the reset line process > to the driver. > > Signed-off-by: Icenowy Zheng <icenowy@aosc.xyz> > --- > drivers/mtd/nand/sunxi_nand.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c > index a83a690..1502748 100644 > --- a/drivers/mtd/nand/sunxi_nand.c > +++ b/drivers/mtd/nand/sunxi_nand.c > @@ -39,6 +39,7 @@ > #include <linux/gpio.h> > #include <linux/interrupt.h> > #include <linux/iopoll.h> > +#include <linux/reset.h> > > #define NFC_REG_CTL 0x0000 > #define NFC_REG_ST 0x0004 > @@ -269,6 +270,7 @@ struct sunxi_nfc { > void __iomem *regs; > struct clk *ahb_clk; > struct clk *mod_clk; > + struct reset_control *reset; > unsigned long assigned_cs; > unsigned long clk_rate; > struct list_head chips; > @@ -1871,6 +1873,18 @@ static int sunxi_nfc_probe(struct platform_device *pdev) > if (ret) > goto out_ahb_clk_unprepare; > > + nfc->reset = devm_reset_control_get_optional(dev, "ahb"); > + if (PTR_ERR(nfc->reset) == -EPROBE_DEFER) > + return PTR_ERR(nfc->reset); Actually you should test for != -ENOENT, because all error codes except this one should stop the ->probe(). BTW, this devm_reset_control_get_optional() is really weird. While most _optional() methods return NULL when the element is not defined in the DT, this one returns -ENOTENT, which makes it impossible to differentiate a real error from a undefined reset line (which is a valid case for _optional()). Philipp, is there a good reason for doing that? > + > + if (!IS_ERR(nfc->reset)) { > + ret = reset_control_deassert(nfc->reset); > + if (ret) { > + dev_err(dev, "reset err %d\n", ret); > + goto out_mod_clk_unprepare; > + } > + } > + ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <2686901466340069@web27g.yandex.ru>]
* Re: [PATCH 2/2] mtd: nand: sunxi: add reset line support [not found] ` <2686901466340069@web27g.yandex.ru> @ 2016-06-19 12:53 ` Boris Brezillon [not found] ` <2748041466341860@web7m.yandex.ru> 0 siblings, 1 reply; 5+ messages in thread From: Boris Brezillon @ 2016-06-19 12:53 UTC (permalink / raw) To: icenowy Cc: maxime.ripard@free-electrons.com, wens@csie.org, robh+dt@kernel.org, richard@nod.at, dwmw2@infradead.org, computersforpeace@gmail.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org, linux-sunxi@googlegroups.com, Philipp Zabel On Sun, 19 Jun 2016 20:41:09 +0800 icenowy@aosc.xyz wrote: > To be honest, I copied them from sunxi-mmc.c. > > What function should be chosen better? You did the right thing (except for the error detection part). My question was addressed to Philipp (the reset subsystem maintainer). > > > 19.06.2016, 20:06, "Boris Brezillon" <boris.brezillon@free-electrons.com>: > > +Philipp > > > > On Sun, 19 Jun 2016 19:37:39 +0800 > > Icenowy Zheng <icenowy@aosc.xyz> wrote: > > > >> The NAND controller on some sun8i chips needs its reset line to be deasserted > >> before they can enter working state. This commit added the reset line process > >> to the driver. > >> > >> Signed-off-by: Icenowy Zheng <icenowy@aosc.xyz> > >> --- > >> drivers/mtd/nand/sunxi_nand.c | 14 ++++++++++++++ > >> 1 file changed, 14 insertions(+) > >> > >> diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c > >> index a83a690..1502748 100644 > >> --- a/drivers/mtd/nand/sunxi_nand.c > >> +++ b/drivers/mtd/nand/sunxi_nand.c > >> @@ -39,6 +39,7 @@ > >> #include <linux/gpio.h> > >> #include <linux/interrupt.h> > >> #include <linux/iopoll.h> > >> +#include <linux/reset.h> > >> > >> #define NFC_REG_CTL 0x0000 > >> #define NFC_REG_ST 0x0004 > >> @@ -269,6 +270,7 @@ struct sunxi_nfc { > >> void __iomem *regs; > >> struct clk *ahb_clk; > >> struct clk *mod_clk; > >> + struct reset_control *reset; > >> unsigned long assigned_cs; > >> unsigned long clk_rate; > >> struct list_head chips; > >> @@ -1871,6 +1873,18 @@ static int sunxi_nfc_probe(struct platform_device *pdev) > >> if (ret) > >> goto out_ahb_clk_unprepare; > >> > >> + nfc->reset = devm_reset_control_get_optional(dev, "ahb"); > >> + if (PTR_ERR(nfc->reset) == -EPROBE_DEFER) > >> + return PTR_ERR(nfc->reset); > > > > Actually you should test for != -ENOENT, because all error codes except > > this one should stop the ->probe(). > > > > BTW, this devm_reset_control_get_optional() is really weird. While most > > _optional() methods return NULL when the element is not defined in the > > DT, this one returns -ENOTENT, which makes it impossible to > > differentiate a real error from a undefined reset line (which is a > > valid case for _optional()). > > > > Philipp, is there a good reason for doing that? > > > >> + > >> + if (!IS_ERR(nfc->reset)) { > >> + ret = reset_control_deassert(nfc->reset); > >> + if (ret) { > >> + dev_err(dev, "reset err %d\n", ret); > >> + goto out_mod_clk_unprepare; > >> + } > >> + } > >> + ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <2748041466341860@web7m.yandex.ru>]
* Re: [PATCH 2/2] mtd: nand: sunxi: add reset line support [not found] ` <2748041466341860@web7m.yandex.ru> @ 2016-06-19 13:16 ` Boris Brezillon 0 siblings, 0 replies; 5+ messages in thread From: Boris Brezillon @ 2016-06-19 13:16 UTC (permalink / raw) To: icenowy Cc: maxime.ripard@free-electrons.com, wens@csie.org, robh+dt@kernel.org, richard@nod.at, dwmw2@infradead.org, computersforpeace@gmail.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org, linux-sunxi@googlegroups.com, Philipp Zabel On Sun, 19 Jun 2016 21:11:00 +0800 icenowy@aosc.xyz wrote: > Then I will soon make the v2 patch set, with the error detection part fixed. > > But why does sunxi-mmc check only EPROBE_DEFER? I guess someone had a probe-dependency problem and fixed this case but ignored all the possible errors. But there may be other reasons for devm_reset_control_get_optional() to fail. The only one that is really reflecting that the reset line is not defined in the DT is -ENOENT. > > 19.06.2016, 20:53, "Boris Brezillon" <boris.brezillon@free-electrons.com>: > > On Sun, 19 Jun 2016 20:41:09 +0800 > > icenowy@aosc.xyz wrote: > > > >> To be honest, I copied them from sunxi-mmc.c. > >> > >> What function should be chosen better? > > > > You did the right thing (except for the error detection part). My > > question was addressed to Philipp (the reset subsystem maintainer). > > > >> 19.06.2016, 20:06, "Boris Brezillon" <boris.brezillon@free-electrons.com>: > >> > +Philipp > >> > > >> > On Sun, 19 Jun 2016 19:37:39 +0800 > >> > Icenowy Zheng <icenowy@aosc.xyz> wrote: > >> > > >> >> The NAND controller on some sun8i chips needs its reset line to be deasserted > >> >> before they can enter working state. This commit added the reset line process > >> >> to the driver. > >> >> > >> >> Signed-off-by: Icenowy Zheng <icenowy@aosc.xyz> > >> >> --- > >> >> drivers/mtd/nand/sunxi_nand.c | 14 ++++++++++++++ > >> >> 1 file changed, 14 insertions(+) > >> >> > >> >> diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c > >> >> index a83a690..1502748 100644 > >> >> --- a/drivers/mtd/nand/sunxi_nand.c > >> >> +++ b/drivers/mtd/nand/sunxi_nand.c > >> >> @@ -39,6 +39,7 @@ > >> >> #include <linux/gpio.h> > >> >> #include <linux/interrupt.h> > >> >> #include <linux/iopoll.h> > >> >> +#include <linux/reset.h> > >> >> > >> >> #define NFC_REG_CTL 0x0000 > >> >> #define NFC_REG_ST 0x0004 > >> >> @@ -269,6 +270,7 @@ struct sunxi_nfc { > >> >> void __iomem *regs; > >> >> struct clk *ahb_clk; > >> >> struct clk *mod_clk; > >> >> + struct reset_control *reset; > >> >> unsigned long assigned_cs; > >> >> unsigned long clk_rate; > >> >> struct list_head chips; > >> >> @@ -1871,6 +1873,18 @@ static int sunxi_nfc_probe(struct platform_device *pdev) > >> >> if (ret) > >> >> goto out_ahb_clk_unprepare; > >> >> > >> >> + nfc->reset = devm_reset_control_get_optional(dev, "ahb"); > >> >> + if (PTR_ERR(nfc->reset) == -EPROBE_DEFER) > >> >> + return PTR_ERR(nfc->reset); > >> > > >> > Actually you should test for != -ENOENT, because all error codes except > >> > this one should stop the ->probe(). > >> > > >> > BTW, this devm_reset_control_get_optional() is really weird. While most > >> > _optional() methods return NULL when the element is not defined in the > >> > DT, this one returns -ENOTENT, which makes it impossible to > >> > differentiate a real error from a undefined reset line (which is a > >> > valid case for _optional()). > >> > > >> > Philipp, is there a good reason for doing that? > >> > > >> >> + > >> >> + if (!IS_ERR(nfc->reset)) { > >> >> + ret = reset_control_deassert(nfc->reset); > >> >> + if (ret) { > >> >> + dev_err(dev, "reset err %d\n", ret); > >> >> + goto out_mod_clk_unprepare; > >> >> + } > >> >> + } > >> >> + ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] mtd: nand: sunxi: add reset line support 2016-06-19 12:06 ` [PATCH 2/2] mtd: nand: sunxi: add reset line support Boris Brezillon [not found] ` <2686901466340069@web27g.yandex.ru> @ 2016-06-20 12:05 ` Philipp Zabel 2016-06-20 12:51 ` Boris Brezillon 1 sibling, 1 reply; 5+ messages in thread From: Philipp Zabel @ 2016-06-20 12:05 UTC (permalink / raw) To: Boris Brezillon Cc: Icenowy Zheng, maxime.ripard, wens, robh+dt, richard, dwmw2, computersforpeace, devicetree, linux-kernel, linux-mtd, linux-sunxi Am Sonntag, den 19.06.2016, 14:06 +0200 schrieb Boris Brezillon: > +Philipp > > On Sun, 19 Jun 2016 19:37:39 +0800 > Icenowy Zheng <icenowy@aosc.xyz> wrote: > > > The NAND controller on some sun8i chips needs its reset line to be deasserted > > before they can enter working state. This commit added the reset line process > > to the driver. > > > > Signed-off-by: Icenowy Zheng <icenowy@aosc.xyz> > > --- > > drivers/mtd/nand/sunxi_nand.c | 14 ++++++++++++++ > > 1 file changed, 14 insertions(+) > > > > diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c > > index a83a690..1502748 100644 > > --- a/drivers/mtd/nand/sunxi_nand.c > > +++ b/drivers/mtd/nand/sunxi_nand.c > > @@ -39,6 +39,7 @@ > > #include <linux/gpio.h> > > #include <linux/interrupt.h> > > #include <linux/iopoll.h> > > +#include <linux/reset.h> > > > > #define NFC_REG_CTL 0x0000 > > #define NFC_REG_ST 0x0004 > > @@ -269,6 +270,7 @@ struct sunxi_nfc { > > void __iomem *regs; > > struct clk *ahb_clk; > > struct clk *mod_clk; > > + struct reset_control *reset; > > unsigned long assigned_cs; > > unsigned long clk_rate; > > struct list_head chips; > > @@ -1871,6 +1873,18 @@ static int sunxi_nfc_probe(struct platform_device *pdev) > > if (ret) > > goto out_ahb_clk_unprepare; > > > > + nfc->reset = devm_reset_control_get_optional(dev, "ahb"); > > + if (PTR_ERR(nfc->reset) == -EPROBE_DEFER) > > + return PTR_ERR(nfc->reset); > > Actually you should test for != -ENOENT, because all error codes except > this one should stop the ->probe(). > > BTW, this devm_reset_control_get_optional() is really weird. While most > _optional() methods return NULL when the element is not defined in the > DT, this one returns -ENOTENT, which makes it impossible to > differentiate a real error from a undefined reset line (which is a > valid case for _optional()). Of course it's possible, -ENOENT is only returned if the reset line is not defined in the device tree. Note that gpiod_get_(index_)optional do nothing more that replacing -ENOENT with NULL. And phydev_optional_get replaces -ENODEV with NULL. And regulator_get_optional, if I understand it correctly, never returns NULL. > Philipp, is there a good reason for doing that? Historically, NULL has not been a valid value for rstc. I suppose we could add NULL checks to the reset_control_assert/deassert/reset/status functions and align the reset API a bit with gpiod. I just wouldn't want to see any IS_ERR_OR_NULL error handling in the drivers. regards Philipp ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] mtd: nand: sunxi: add reset line support 2016-06-20 12:05 ` Philipp Zabel @ 2016-06-20 12:51 ` Boris Brezillon 0 siblings, 0 replies; 5+ messages in thread From: Boris Brezillon @ 2016-06-20 12:51 UTC (permalink / raw) To: Philipp Zabel Cc: Icenowy Zheng, maxime.ripard, wens, robh+dt, richard, dwmw2, computersforpeace, devicetree, linux-kernel, linux-mtd, linux-sunxi Hi Philipp, On Mon, 20 Jun 2016 14:05:54 +0200 Philipp Zabel <p.zabel@pengutronix.de> wrote: > Am Sonntag, den 19.06.2016, 14:06 +0200 schrieb Boris Brezillon: > > +Philipp > > > > On Sun, 19 Jun 2016 19:37:39 +0800 > > Icenowy Zheng <icenowy@aosc.xyz> wrote: > > > > > The NAND controller on some sun8i chips needs its reset line to be deasserted > > > before they can enter working state. This commit added the reset line process > > > to the driver. > > > > > > Signed-off-by: Icenowy Zheng <icenowy@aosc.xyz> > > > --- > > > drivers/mtd/nand/sunxi_nand.c | 14 ++++++++++++++ > > > 1 file changed, 14 insertions(+) > > > > > > diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c > > > index a83a690..1502748 100644 > > > --- a/drivers/mtd/nand/sunxi_nand.c > > > +++ b/drivers/mtd/nand/sunxi_nand.c > > > @@ -39,6 +39,7 @@ > > > #include <linux/gpio.h> > > > #include <linux/interrupt.h> > > > #include <linux/iopoll.h> > > > +#include <linux/reset.h> > > > > > > #define NFC_REG_CTL 0x0000 > > > #define NFC_REG_ST 0x0004 > > > @@ -269,6 +270,7 @@ struct sunxi_nfc { > > > void __iomem *regs; > > > struct clk *ahb_clk; > > > struct clk *mod_clk; > > > + struct reset_control *reset; > > > unsigned long assigned_cs; > > > unsigned long clk_rate; > > > struct list_head chips; > > > @@ -1871,6 +1873,18 @@ static int sunxi_nfc_probe(struct platform_device *pdev) > > > if (ret) > > > goto out_ahb_clk_unprepare; > > > > > > + nfc->reset = devm_reset_control_get_optional(dev, "ahb"); > > > + if (PTR_ERR(nfc->reset) == -EPROBE_DEFER) > > > + return PTR_ERR(nfc->reset); > > > > Actually you should test for != -ENOENT, because all error codes except > > this one should stop the ->probe(). > > > > BTW, this devm_reset_control_get_optional() is really weird. While most > > _optional() methods return NULL when the element is not defined in the > > DT, this one returns -ENOTENT, which makes it impossible to > > differentiate a real error from a undefined reset line (which is a > > valid case for _optional()). > > Of course it's possible, -ENOENT is only returned if the reset line is > not defined in the device tree. Okay, testing for err != -ENOENT is the right thing to do here. Maybe this could be documented. > > Note that gpiod_get_(index_)optional do nothing more that replacing > -ENOENT with NULL. And phydev_optional_get replaces -ENODEV with NULL. > And regulator_get_optional, if I understand it correctly, never returns > NULL. > > > Philipp, is there a good reason for doing that? > > Historically, NULL has not been a valid value for rstc. I suppose we > could add NULL checks to the reset_control_assert/deassert/reset/status > functions and align the reset API a bit with gpiod. I just wouldn't want > to see any IS_ERR_OR_NULL error handling in the drivers. Well, returning NULL is mainly a convenient way to differentiate real errors from missing optional reset lines (which are not errors). Now, if you say checking for -ENOENT is the right thing to do here, I'm fine with that. Regards, Boris ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-06-20 12:52 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20160619113739.30362-1-icenowy@aosc.xyz>
[not found] ` <20160619113739.30362-2-icenowy@aosc.xyz>
2016-06-19 12:06 ` [PATCH 2/2] mtd: nand: sunxi: add reset line support Boris Brezillon
[not found] ` <2686901466340069@web27g.yandex.ru>
2016-06-19 12:53 ` Boris Brezillon
[not found] ` <2748041466341860@web7m.yandex.ru>
2016-06-19 13:16 ` Boris Brezillon
2016-06-20 12:05 ` Philipp Zabel
2016-06-20 12:51 ` Boris Brezillon
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox