Message ID | 1469629447-544-1-git-send-email-wxt@rock-chips.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
> SARADC controller needs to be reset before programming it, otherwise > it will not function properly. nitpicking on wording below > Signed-off-by: Caesar Wang <wxt@rock-chips.com> > Cc: Jonathan Cameron <jic23@kernel.org> > Cc: Heiko Stuebner <heiko@sntech.de> > Cc: Rob Herring <robh+dt@kernel.org> > Cc: linux-iio@vger.kernel.org > Cc: linux-rockchip@lists.infradead.org > Tested-by: Guenter Roeck <linux@roeck-us.net> > > --- > > Changes in v3: > - %s/devm_reset_control_get_optional()/devm_reset_control_get() > - add Guente's test tag. > > Changes in v2: > - Make the reset as an optional property, since it should work > with old devicetrees as well. > > .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ > drivers/iio/adc/Kconfig | 1 + > drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++++++++++++++ > 3 files changed, 38 insertions(+) > > diff --git a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt > index bf99e2f..205593f 100644 > --- a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt > +++ b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt > @@ -16,6 +16,11 @@ Required properties: > - vref-supply: The regulator supply ADC reference voltage. > - #io-channel-cells: Should be 1, see ../iio-bindings.txt > > +Optional properties: > +- resets: Must contain an entry for each entry in reset-names if need support > + this option. See ../reset/reset.txt for details. '... if need support this option.' doesn't sound right, maybe simply: '... if needed.' or drop this clause. > +- reset-names: Must include the name "saradc-apb". > + > Example: > saradc: saradc@2006c000 { > compatible = "rockchip,saradc"; > @@ -23,6 +28,8 @@ Example: > interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; > clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; > clock-names = "saradc", "apb_pclk"; > + resets = <&cru SRST_SARADC>; > + reset-names = "saradc-apb"; > #io-channel-cells = <1>; > vref-supply = <&vcc18>; > }; > diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig > index 1de31bd..7675772 100644 > --- a/drivers/iio/adc/Kconfig > +++ b/drivers/iio/adc/Kconfig > @@ -389,6 +389,7 @@ config QCOM_SPMI_VADC > config ROCKCHIP_SARADC > tristate "Rockchip SARADC driver" > depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) > + depends on RESET_CONTROLLER > help > Say yes here to build support for the SARADC found in SoCs from > Rockchip. > diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c > index f9ad6c2..85d7012 100644 > --- a/drivers/iio/adc/rockchip_saradc.c > +++ b/drivers/iio/adc/rockchip_saradc.c > @@ -21,6 +21,8 @@ > #include <linux/of_device.h> > #include <linux/clk.h> > #include <linux/completion.h> > +#include <linux/delay.h> > +#include <linux/reset.h> > #include <linux/regulator/consumer.h> > #include <linux/iio/iio.h> > > @@ -53,6 +55,7 @@ struct rockchip_saradc { > struct clk *clk; > struct completion completion; > struct regulator *vref; > + struct reset_control *reset; > const struct rockchip_saradc_data *data; > u16 last_val; > }; > @@ -190,6 +193,16 @@ static const struct of_device_id rockchip_saradc_match[] = { > }; > MODULE_DEVICE_TABLE(of, rockchip_saradc_match); > > +/** > + * Reset SARADC Controller. > + */ > +static void rockchip_saradc_reset_controller(struct reset_control *reset) > +{ > + reset_control_assert(reset); > + usleep_range(10, 20); > + reset_control_deassert(reset); > +} > + > static int rockchip_saradc_probe(struct platform_device *pdev) > { > struct rockchip_saradc *info = NULL; > @@ -218,6 +231,20 @@ static int rockchip_saradc_probe(struct platform_device *pdev) > if (IS_ERR(info->regs)) > return PTR_ERR(info->regs); > > + /* > + * The reset should be an optional property, as it should work > + * with old devicetrees as well > + */ > + info->reset = devm_reset_control_get(&pdev->dev, "saradc-apb"); > + if (IS_ERR(info->reset)) { > + ret = PTR_ERR(info->reset); > + if (ret != -ENOENT) > + return ret; > + > + dev_dbg(&pdev->dev, "no reset control found\n"); > + info->reset = NULL; > + } > + > init_completion(&info->completion); > > irq = platform_get_irq(pdev, 0); > @@ -252,6 +279,9 @@ static int rockchip_saradc_probe(struct platform_device *pdev) > return PTR_ERR(info->vref); > } > > + if (info->reset) > + rockchip_saradc_reset_controller(info->reset); > + > /* > * Use a default value for the converter clock. > * This may become user-configurable in the future. >
On 07/27/2016 07:24 AM, Caesar Wang wrote: > SARADC controller needs to be reset before programming it, otherwise > it will not function properly. > > Signed-off-by: Caesar Wang <wxt@rock-chips.com> > Cc: Jonathan Cameron <jic23@kernel.org> > Cc: Heiko Stuebner <heiko@sntech.de> > Cc: Rob Herring <robh+dt@kernel.org> > Cc: linux-iio@vger.kernel.org > Cc: linux-rockchip@lists.infradead.org > Tested-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Guenter Roeck <linux@roeck-us.net> > > --- > > Changes in v3: > - %s/devm_reset_control_get_optional()/devm_reset_control_get() > - add Guente's test tag. > > Changes in v2: > - Make the reset as an optional property, since it should work > with old devicetrees as well. > > .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ > drivers/iio/adc/Kconfig | 1 + > drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++++++++++++++ > 3 files changed, 38 insertions(+) > > diff --git a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt > index bf99e2f..205593f 100644 > --- a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt > +++ b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt > @@ -16,6 +16,11 @@ Required properties: > - vref-supply: The regulator supply ADC reference voltage. > - #io-channel-cells: Should be 1, see ../iio-bindings.txt > > +Optional properties: > +- resets: Must contain an entry for each entry in reset-names if need support > + this option. See ../reset/reset.txt for details. > +- reset-names: Must include the name "saradc-apb". > + > Example: > saradc: saradc@2006c000 { > compatible = "rockchip,saradc"; > @@ -23,6 +28,8 @@ Example: > interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; > clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; > clock-names = "saradc", "apb_pclk"; > + resets = <&cru SRST_SARADC>; > + reset-names = "saradc-apb"; > #io-channel-cells = <1>; > vref-supply = <&vcc18>; > }; > diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig > index 1de31bd..7675772 100644 > --- a/drivers/iio/adc/Kconfig > +++ b/drivers/iio/adc/Kconfig > @@ -389,6 +389,7 @@ config QCOM_SPMI_VADC > config ROCKCHIP_SARADC > tristate "Rockchip SARADC driver" > depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) > + depends on RESET_CONTROLLER > help > Say yes here to build support for the SARADC found in SoCs from > Rockchip. > diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c > index f9ad6c2..85d7012 100644 > --- a/drivers/iio/adc/rockchip_saradc.c > +++ b/drivers/iio/adc/rockchip_saradc.c > @@ -21,6 +21,8 @@ > #include <linux/of_device.h> > #include <linux/clk.h> > #include <linux/completion.h> > +#include <linux/delay.h> > +#include <linux/reset.h> > #include <linux/regulator/consumer.h> > #include <linux/iio/iio.h> > > @@ -53,6 +55,7 @@ struct rockchip_saradc { > struct clk *clk; > struct completion completion; > struct regulator *vref; > + struct reset_control *reset; > const struct rockchip_saradc_data *data; > u16 last_val; > }; > @@ -190,6 +193,16 @@ static const struct of_device_id rockchip_saradc_match[] = { > }; > MODULE_DEVICE_TABLE(of, rockchip_saradc_match); > > +/** > + * Reset SARADC Controller. > + */ > +static void rockchip_saradc_reset_controller(struct reset_control *reset) > +{ > + reset_control_assert(reset); > + usleep_range(10, 20); > + reset_control_deassert(reset); > +} > + > static int rockchip_saradc_probe(struct platform_device *pdev) > { > struct rockchip_saradc *info = NULL; > @@ -218,6 +231,20 @@ static int rockchip_saradc_probe(struct platform_device *pdev) > if (IS_ERR(info->regs)) > return PTR_ERR(info->regs); > > + /* > + * The reset should be an optional property, as it should work > + * with old devicetrees as well > + */ > + info->reset = devm_reset_control_get(&pdev->dev, "saradc-apb"); > + if (IS_ERR(info->reset)) { > + ret = PTR_ERR(info->reset); > + if (ret != -ENOENT) > + return ret; > + > + dev_dbg(&pdev->dev, "no reset control found\n"); > + info->reset = NULL; > + } > + > init_completion(&info->completion); > > irq = platform_get_irq(pdev, 0); > @@ -252,6 +279,9 @@ static int rockchip_saradc_probe(struct platform_device *pdev) > return PTR_ERR(info->vref); > } > > + if (info->reset) > + rockchip_saradc_reset_controller(info->reset); > + > /* > * Use a default value for the converter clock. > * This may become user-configurable in the future. >
On Wed, Jul 27, 2016 at 10:24:04PM +0800, Caesar Wang wrote: > SARADC controller needs to be reset before programming it, otherwise > it will not function properly. > > Signed-off-by: Caesar Wang <wxt@rock-chips.com> > Cc: Jonathan Cameron <jic23@kernel.org> > Cc: Heiko Stuebner <heiko@sntech.de> > Cc: Rob Herring <robh+dt@kernel.org> > Cc: linux-iio@vger.kernel.org > Cc: linux-rockchip@lists.infradead.org > Tested-by: Guenter Roeck <linux@roeck-us.net> > > --- > > Changes in v3: > - %s/devm_reset_control_get_optional()/devm_reset_control_get() > - add Guente's test tag. > > Changes in v2: > - Make the reset as an optional property, since it should work > with old devicetrees as well. > > .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ > drivers/iio/adc/Kconfig | 1 + > drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++++++++++++++ > 3 files changed, 38 insertions(+) Please add acks when posting new versions. Rob
On 2016年07月30日 05:28, Rob Herring wrote: > On Wed, Jul 27, 2016 at 10:24:04PM +0800, Caesar Wang wrote: >> SARADC controller needs to be reset before programming it, otherwise >> it will not function properly. >> >> Signed-off-by: Caesar Wang <wxt@rock-chips.com> >> Cc: Jonathan Cameron <jic23@kernel.org> >> Cc: Heiko Stuebner <heiko@sntech.de> >> Cc: Rob Herring <robh+dt@kernel.org> >> Cc: linux-iio@vger.kernel.org >> Cc: linux-rockchip@lists.infradead.org >> Tested-by: Guenter Roeck <linux@roeck-us.net> >> >> --- >> >> Changes in v3: >> - %s/devm_reset_control_get_optional()/devm_reset_control_get() >> - add Guente's test tag. >> >> Changes in v2: >> - Make the reset as an optional property, since it should work >> with old devicetrees as well. >> >> .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ >> drivers/iio/adc/Kconfig | 1 + >> drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++++++++++++++ >> 3 files changed, 38 insertions(+) > Please add acks when posting new versions. I didn't get your ACK when posting the V3. :-P --- Your ack on 2016-07-27 23:12 .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ Acked-by: Rob Herring<robh@kernel.org> > > Rob > > _______________________________________________ > Linux-rockchip mailing list > Linux-rockchip@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-rockchip
On 2016年07月30日 05:28, Rob Herring wrote: > On Wed, Jul 27, 2016 at 10:24:04PM +0800, Caesar Wang wrote: >> SARADC controller needs to be reset before programming it, otherwise >> it will not function properly. >> >> Signed-off-by: Caesar Wang <wxt@rock-chips.com> >> Cc: Jonathan Cameron <jic23@kernel.org> >> Cc: Heiko Stuebner <heiko@sntech.de> >> Cc: Rob Herring <robh+dt@kernel.org> >> Cc: linux-iio@vger.kernel.org >> Cc: linux-rockchip@lists.infradead.org >> Tested-by: Guenter Roeck <linux@roeck-us.net> >> >> --- >> >> Changes in v3: >> - %s/devm_reset_control_get_optional()/devm_reset_control_get() >> - add Guente's test tag. >> >> Changes in v2: >> - Make the reset as an optional property, since it should work >> with old devicetrees as well. >> >> .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ >> drivers/iio/adc/Kconfig | 1 + >> drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++++++++++++++ >> 3 files changed, 38 insertions(+) > Please add acks when posting new versions. I didn't get your ACK when posting the V3. :-P --- Your ack on 2016-07-27 23:12 .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ Acked-by: Rob Herring<robh@kernel.org> > > Rob > > _______________________________________________ > Linux-rockchip mailing list > Linux-rockchip@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-rockchip
On 2016年07月27日 22:47, Peter Meerwald-Stadler wrote: >> SARADC controller needs to be reset before programming it, otherwise >> it will not function properly. > nitpicking on wording below > >> Signed-off-by: Caesar Wang <wxt@rock-chips.com> >> Cc: Jonathan Cameron <jic23@kernel.org> >> Cc: Heiko Stuebner <heiko@sntech.de> >> Cc: Rob Herring <robh+dt@kernel.org> >> Cc: linux-iio@vger.kernel.org >> Cc: linux-rockchip@lists.infradead.org >> Tested-by: Guenter Roeck <linux@roeck-us.net> >> >> --- >> >> Changes in v3: >> - %s/devm_reset_control_get_optional()/devm_reset_control_get() >> - add Guente's test tag. >> >> Changes in v2: >> - Make the reset as an optional property, since it should work >> with old devicetrees as well. >> >> .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ >> drivers/iio/adc/Kconfig | 1 + >> drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++++++++++++++ >> 3 files changed, 38 insertions(+) >> >> diff --git a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >> index bf99e2f..205593f 100644 >> --- a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >> +++ b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >> @@ -16,6 +16,11 @@ Required properties: >> - vref-supply: The regulator supply ADC reference voltage. >> - #io-channel-cells: Should be 1, see ../iio-bindings.txt >> >> +Optional properties: >> +- resets: Must contain an entry for each entry in reset-names if need support >> + this option. See ../reset/reset.txt for details. > '... if need support this option.' doesn't sound right, maybe > simply: '... if needed.' or drop this clause. I don't plan to resend this series patches. I'm assuming that Jonathan will help me fix it when ready to apply it.:-) Glad to resend this series patches if Jonathan boss ask me to do. Thanks, Caesar > >> +- reset-names: Must include the name "saradc-apb". >> + >> Example: >> saradc: saradc@2006c000 { >> compatible = "rockchip,saradc"; >> @@ -23,6 +28,8 @@ Example: >> interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; >> clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; >> clock-names = "saradc", "apb_pclk"; >> + resets = <&cru SRST_SARADC>; >> + reset-names = "saradc-apb"; >> #io-channel-cells = <1>; >> vref-supply = <&vcc18>; >> }; >> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig >> index 1de31bd..7675772 100644 >> --- a/drivers/iio/adc/Kconfig >> +++ b/drivers/iio/adc/Kconfig >> @@ -389,6 +389,7 @@ config QCOM_SPMI_VADC >> config ROCKCHIP_SARADC >> tristate "Rockchip SARADC driver" >> depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) >> + depends on RESET_CONTROLLER >> help >> Say yes here to build support for the SARADC found in SoCs from >> Rockchip. >> diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c >> index f9ad6c2..85d7012 100644 >> --- a/drivers/iio/adc/rockchip_saradc.c >> +++ b/drivers/iio/adc/rockchip_saradc.c >> @@ -21,6 +21,8 @@ >> #include <linux/of_device.h> >> #include <linux/clk.h> >> #include <linux/completion.h> >> +#include <linux/delay.h> >> +#include <linux/reset.h> >> #include <linux/regulator/consumer.h> >> #include <linux/iio/iio.h> >> >> @@ -53,6 +55,7 @@ struct rockchip_saradc { >> struct clk *clk; >> struct completion completion; >> struct regulator *vref; >> + struct reset_control *reset; >> const struct rockchip_saradc_data *data; >> u16 last_val; >> }; >> @@ -190,6 +193,16 @@ static const struct of_device_id rockchip_saradc_match[] = { >> }; >> MODULE_DEVICE_TABLE(of, rockchip_saradc_match); >> >> +/** >> + * Reset SARADC Controller. >> + */ >> +static void rockchip_saradc_reset_controller(struct reset_control *reset) >> +{ >> + reset_control_assert(reset); >> + usleep_range(10, 20); >> + reset_control_deassert(reset); >> +} >> + >> static int rockchip_saradc_probe(struct platform_device *pdev) >> { >> struct rockchip_saradc *info = NULL; >> @@ -218,6 +231,20 @@ static int rockchip_saradc_probe(struct platform_device *pdev) >> if (IS_ERR(info->regs)) >> return PTR_ERR(info->regs); >> >> + /* >> + * The reset should be an optional property, as it should work >> + * with old devicetrees as well >> + */ >> + info->reset = devm_reset_control_get(&pdev->dev, "saradc-apb"); >> + if (IS_ERR(info->reset)) { >> + ret = PTR_ERR(info->reset); >> + if (ret != -ENOENT) >> + return ret; >> + >> + dev_dbg(&pdev->dev, "no reset control found\n"); >> + info->reset = NULL; >> + } >> + >> init_completion(&info->completion); >> >> irq = platform_get_irq(pdev, 0); >> @@ -252,6 +279,9 @@ static int rockchip_saradc_probe(struct platform_device *pdev) >> return PTR_ERR(info->vref); >> } >> >> + if (info->reset) >> + rockchip_saradc_reset_controller(info->reset); >> + >> /* >> * Use a default value for the converter clock. >> * This may become user-configurable in the future. >>
On 27/07/16 15:24, Caesar Wang wrote: > SARADC controller needs to be reset before programming it, otherwise > it will not function properly. > > Signed-off-by: Caesar Wang <wxt@rock-chips.com> > Cc: Jonathan Cameron <jic23@kernel.org> > Cc: Heiko Stuebner <heiko@sntech.de> > Cc: Rob Herring <robh+dt@kernel.org> > Cc: linux-iio@vger.kernel.org > Cc: linux-rockchip@lists.infradead.org > Tested-by: Guenter Roeck <linux@roeck-us.net> > Hi Patch is fine (I'll fix up the wording issue) however... I'm not clear on the severity of the issue. Is this something we should be pushing for stable? Jonathan > --- > > Changes in v3: > - %s/devm_reset_control_get_optional()/devm_reset_control_get() > - add Guente's test tag. > > Changes in v2: > - Make the reset as an optional property, since it should work > with old devicetrees as well. > > .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ > drivers/iio/adc/Kconfig | 1 + > drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++++++++++++++ > 3 files changed, 38 insertions(+) > > diff --git a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt > index bf99e2f..205593f 100644 > --- a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt > +++ b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt > @@ -16,6 +16,11 @@ Required properties: > - vref-supply: The regulator supply ADC reference voltage. > - #io-channel-cells: Should be 1, see ../iio-bindings.txt > > +Optional properties: > +- resets: Must contain an entry for each entry in reset-names if need support > + this option. See ../reset/reset.txt for details. > +- reset-names: Must include the name "saradc-apb". > + > Example: > saradc: saradc@2006c000 { > compatible = "rockchip,saradc"; > @@ -23,6 +28,8 @@ Example: > interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; > clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; > clock-names = "saradc", "apb_pclk"; > + resets = <&cru SRST_SARADC>; > + reset-names = "saradc-apb"; > #io-channel-cells = <1>; > vref-supply = <&vcc18>; > }; > diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig > index 1de31bd..7675772 100644 > --- a/drivers/iio/adc/Kconfig > +++ b/drivers/iio/adc/Kconfig > @@ -389,6 +389,7 @@ config QCOM_SPMI_VADC > config ROCKCHIP_SARADC > tristate "Rockchip SARADC driver" > depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) > + depends on RESET_CONTROLLER > help > Say yes here to build support for the SARADC found in SoCs from > Rockchip. > diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c > index f9ad6c2..85d7012 100644 > --- a/drivers/iio/adc/rockchip_saradc.c > +++ b/drivers/iio/adc/rockchip_saradc.c > @@ -21,6 +21,8 @@ > #include <linux/of_device.h> > #include <linux/clk.h> > #include <linux/completion.h> > +#include <linux/delay.h> > +#include <linux/reset.h> > #include <linux/regulator/consumer.h> > #include <linux/iio/iio.h> > > @@ -53,6 +55,7 @@ struct rockchip_saradc { > struct clk *clk; > struct completion completion; > struct regulator *vref; > + struct reset_control *reset; > const struct rockchip_saradc_data *data; > u16 last_val; > }; > @@ -190,6 +193,16 @@ static const struct of_device_id rockchip_saradc_match[] = { > }; > MODULE_DEVICE_TABLE(of, rockchip_saradc_match); > > +/** > + * Reset SARADC Controller. > + */ > +static void rockchip_saradc_reset_controller(struct reset_control *reset) > +{ > + reset_control_assert(reset); > + usleep_range(10, 20); > + reset_control_deassert(reset); > +} > + > static int rockchip_saradc_probe(struct platform_device *pdev) > { > struct rockchip_saradc *info = NULL; > @@ -218,6 +231,20 @@ static int rockchip_saradc_probe(struct platform_device *pdev) > if (IS_ERR(info->regs)) > return PTR_ERR(info->regs); > > + /* > + * The reset should be an optional property, as it should work > + * with old devicetrees as well > + */ > + info->reset = devm_reset_control_get(&pdev->dev, "saradc-apb"); > + if (IS_ERR(info->reset)) { > + ret = PTR_ERR(info->reset); > + if (ret != -ENOENT) > + return ret; > + > + dev_dbg(&pdev->dev, "no reset control found\n"); > + info->reset = NULL; > + } > + > init_completion(&info->completion); > > irq = platform_get_irq(pdev, 0); > @@ -252,6 +279,9 @@ static int rockchip_saradc_probe(struct platform_device *pdev) > return PTR_ERR(info->vref); > } > > + if (info->reset) > + rockchip_saradc_reset_controller(info->reset); > + > /* > * Use a default value for the converter clock. > * This may become user-configurable in the future. >
On 15/08/16 18:41, Jonathan Cameron wrote: > On 27/07/16 15:24, Caesar Wang wrote: >> SARADC controller needs to be reset before programming it, otherwise >> it will not function properly. >> >> Signed-off-by: Caesar Wang <wxt@rock-chips.com> >> Cc: Jonathan Cameron <jic23@kernel.org> >> Cc: Heiko Stuebner <heiko@sntech.de> >> Cc: Rob Herring <robh+dt@kernel.org> >> Cc: linux-iio@vger.kernel.org >> Cc: linux-rockchip@lists.infradead.org >> Tested-by: Guenter Roeck <linux@roeck-us.net> >> > Hi > > Patch is fine (I'll fix up the wording issue) however... > > I'm not clear on the severity of the issue. Is this something > we should be pushing for stable? To add to this, it's only useful to take this for stable if we are also fine taking the device tree updates to make it actually do something! > > Jonathan >> --- >> >> Changes in v3: >> - %s/devm_reset_control_get_optional()/devm_reset_control_get() >> - add Guente's test tag. >> >> Changes in v2: >> - Make the reset as an optional property, since it should work >> with old devicetrees as well. >> >> .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ >> drivers/iio/adc/Kconfig | 1 + >> drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++++++++++++++ >> 3 files changed, 38 insertions(+) >> >> diff --git a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >> index bf99e2f..205593f 100644 >> --- a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >> +++ b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >> @@ -16,6 +16,11 @@ Required properties: >> - vref-supply: The regulator supply ADC reference voltage. >> - #io-channel-cells: Should be 1, see ../iio-bindings.txt >> >> +Optional properties: >> +- resets: Must contain an entry for each entry in reset-names if need support >> + this option. See ../reset/reset.txt for details. >> +- reset-names: Must include the name "saradc-apb". >> + >> Example: >> saradc: saradc@2006c000 { >> compatible = "rockchip,saradc"; >> @@ -23,6 +28,8 @@ Example: >> interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; >> clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; >> clock-names = "saradc", "apb_pclk"; >> + resets = <&cru SRST_SARADC>; >> + reset-names = "saradc-apb"; >> #io-channel-cells = <1>; >> vref-supply = <&vcc18>; >> }; >> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig >> index 1de31bd..7675772 100644 >> --- a/drivers/iio/adc/Kconfig >> +++ b/drivers/iio/adc/Kconfig >> @@ -389,6 +389,7 @@ config QCOM_SPMI_VADC >> config ROCKCHIP_SARADC >> tristate "Rockchip SARADC driver" >> depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) >> + depends on RESET_CONTROLLER >> help >> Say yes here to build support for the SARADC found in SoCs from >> Rockchip. >> diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c >> index f9ad6c2..85d7012 100644 >> --- a/drivers/iio/adc/rockchip_saradc.c >> +++ b/drivers/iio/adc/rockchip_saradc.c >> @@ -21,6 +21,8 @@ >> #include <linux/of_device.h> >> #include <linux/clk.h> >> #include <linux/completion.h> >> +#include <linux/delay.h> >> +#include <linux/reset.h> >> #include <linux/regulator/consumer.h> >> #include <linux/iio/iio.h> >> >> @@ -53,6 +55,7 @@ struct rockchip_saradc { >> struct clk *clk; >> struct completion completion; >> struct regulator *vref; >> + struct reset_control *reset; >> const struct rockchip_saradc_data *data; >> u16 last_val; >> }; >> @@ -190,6 +193,16 @@ static const struct of_device_id rockchip_saradc_match[] = { >> }; >> MODULE_DEVICE_TABLE(of, rockchip_saradc_match); >> >> +/** >> + * Reset SARADC Controller. >> + */ >> +static void rockchip_saradc_reset_controller(struct reset_control *reset) >> +{ >> + reset_control_assert(reset); >> + usleep_range(10, 20); >> + reset_control_deassert(reset); >> +} >> + >> static int rockchip_saradc_probe(struct platform_device *pdev) >> { >> struct rockchip_saradc *info = NULL; >> @@ -218,6 +231,20 @@ static int rockchip_saradc_probe(struct platform_device *pdev) >> if (IS_ERR(info->regs)) >> return PTR_ERR(info->regs); >> >> + /* >> + * The reset should be an optional property, as it should work >> + * with old devicetrees as well >> + */ >> + info->reset = devm_reset_control_get(&pdev->dev, "saradc-apb"); >> + if (IS_ERR(info->reset)) { >> + ret = PTR_ERR(info->reset); >> + if (ret != -ENOENT) >> + return ret; >> + >> + dev_dbg(&pdev->dev, "no reset control found\n"); >> + info->reset = NULL; >> + } >> + >> init_completion(&info->completion); >> >> irq = platform_get_irq(pdev, 0); >> @@ -252,6 +279,9 @@ static int rockchip_saradc_probe(struct platform_device *pdev) >> return PTR_ERR(info->vref); >> } >> >> + if (info->reset) >> + rockchip_saradc_reset_controller(info->reset); >> + >> /* >> * Use a default value for the converter clock. >> * This may become user-configurable in the future. >> > > -- > To unsubscribe from this list: send the line "unsubscribe linux-iio" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >
On 15/08/16 19:10, Caesar Wang wrote: > > On 2016年08月16日 01:41, Jonathan Cameron wrote: >> On 27/07/16 15:24, Caesar Wang wrote: >>> SARADC controller needs to be reset before programming it, otherwise >>> it will not function properly. >>> >>> Signed-off-by: Caesar Wang <wxt@rock-chips.com> >>> Cc: Jonathan Cameron <jic23@kernel.org> >>> Cc: Heiko Stuebner <heiko@sntech.de> >>> Cc: Rob Herring <robh+dt@kernel.org> >>> Cc: linux-iio@vger.kernel.org >>> Cc: linux-rockchip@lists.infradead.org >>> Tested-by: Guenter Roeck <linux@roeck-us.net> >>> >> Hi >> >> Patch is fine (I'll fix up the wording issue) however... >> >> I'm not clear on the severity of the issue. Is this something >> we should be pushing for stable? > > I think that should be pushing for stable, since the common isssue for the ADC is initially enabled on loader, > and only disabled after the first read. > > cat /sys/class/hwmon/hwmon1/device/temp1_input > cat: /sys/class/hwmon/hwmon1/device/temp1_input: Connection timed out > > The kernel log shows: > > [ 32.209451] read channel() error: -110 > .. > > Also, for my experience. Some other reasons caused the adc (controller) glitch for the kernel side. Fine. So now the only question is who is handling it. The fix is useless (I think) without the dts changes to support it. Normally we'd route the dts and driver changes separately as it should not matter, but here I think I'd prefer it if the whole thing went via rockchip -> arm-soc tree so it goes in together. Hence (with wording fixed) Acked-by: Jonathan Cameron <jic23@kernel.org> Cc: <Stable@vger.kernel.org> (for the driver patch). If people want me to take it via IIO then I'll need acks for the dts changes with explicit agreement that they can be marked for stable. Would image Heiko, these would come from you. Thanks, Jonathan > > - > Caesar > >> Jonathan >>> --- >>> >>> Changes in v3: >>> - %s/devm_reset_control_get_optional()/devm_reset_control_get() >>> - add Guente's test tag. >>> >>> Changes in v2: >>> - Make the reset as an optional property, since it should work >>> with old devicetrees as well. >>> >>> .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ >>> drivers/iio/adc/Kconfig | 1 + >>> drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++++++++++++++ >>> 3 files changed, 38 insertions(+) >>> >>> diff --git a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >>> index bf99e2f..205593f 100644 >>> --- a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >>> +++ b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >>> @@ -16,6 +16,11 @@ Required properties: >>> - vref-supply: The regulator supply ADC reference voltage. >>> - #io-channel-cells: Should be 1, see ../iio-bindings.txt >>> >>> +Optional properties: >>> +- resets: Must contain an entry for each entry in reset-names if need support >>> + this option. See ../reset/reset.txt for details. >>> +- reset-names: Must include the name "saradc-apb". >>> + >>> Example: >>> saradc: saradc@2006c000 { >>> compatible = "rockchip,saradc"; >>> @@ -23,6 +28,8 @@ Example: >>> interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; >>> clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; >>> clock-names = "saradc", "apb_pclk"; >>> + resets = <&cru SRST_SARADC>; >>> + reset-names = "saradc-apb"; >>> #io-channel-cells = <1>; >>> vref-supply = <&vcc18>; >>> }; >>> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig >>> index 1de31bd..7675772 100644 >>> --- a/drivers/iio/adc/Kconfig >>> +++ b/drivers/iio/adc/Kconfig >>> @@ -389,6 +389,7 @@ config QCOM_SPMI_VADC >>> config ROCKCHIP_SARADC >>> tristate "Rockchip SARADC driver" >>> depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) >>> + depends on RESET_CONTROLLER >>> help >>> Say yes here to build support for the SARADC found in SoCs from >>> Rockchip. >>> diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c >>> index f9ad6c2..85d7012 100644 >>> --- a/drivers/iio/adc/rockchip_saradc.c >>> +++ b/drivers/iio/adc/rockchip_saradc.c >>> @@ -21,6 +21,8 @@ >>> #include <linux/of_device.h> >>> #include <linux/clk.h> >>> #include <linux/completion.h> >>> +#include <linux/delay.h> >>> +#include <linux/reset.h> >>> #include <linux/regulator/consumer.h> >>> #include <linux/iio/iio.h> >>> >>> @@ -53,6 +55,7 @@ struct rockchip_saradc { >>> struct clk *clk; >>> struct completion completion; >>> struct regulator *vref; >>> + struct reset_control *reset; >>> const struct rockchip_saradc_data *data; >>> u16 last_val; >>> }; >>> @@ -190,6 +193,16 @@ static const struct of_device_id rockchip_saradc_match[] = { >>> }; >>> MODULE_DEVICE_TABLE(of, rockchip_saradc_match); >>> >>> +/** >>> + * Reset SARADC Controller. >>> + */ >>> +static void rockchip_saradc_reset_controller(struct reset_control *reset) >>> +{ >>> + reset_control_assert(reset); >>> + usleep_range(10, 20); >>> + reset_control_deassert(reset); >>> +} >>> + >>> static int rockchip_saradc_probe(struct platform_device *pdev) >>> { >>> struct rockchip_saradc *info = NULL; >>> @@ -218,6 +231,20 @@ static int rockchip_saradc_probe(struct platform_device *pdev) >>> if (IS_ERR(info->regs)) >>> return PTR_ERR(info->regs); >>> >>> + /* >>> + * The reset should be an optional property, as it should work >>> + * with old devicetrees as well >>> + */ >>> + info->reset = devm_reset_control_get(&pdev->dev, "saradc-apb"); >>> + if (IS_ERR(info->reset)) { >>> + ret = PTR_ERR(info->reset); >>> + if (ret != -ENOENT) >>> + return ret; >>> + >>> + dev_dbg(&pdev->dev, "no reset control found\n"); >>> + info->reset = NULL; >>> + } >>> + >>> init_completion(&info->completion); >>> >>> irq = platform_get_irq(pdev, 0); >>> @@ -252,6 +279,9 @@ static int rockchip_saradc_probe(struct platform_device *pdev) >>> return PTR_ERR(info->vref); >>> } >>> >>> + if (info->reset) >>> + rockchip_saradc_reset_controller(info->reset); >>> + >>> /* >>> * Use a default value for the converter clock. >>> * This may become user-configurable in the future. >>> >> >> _______________________________________________ >> Linux-rockchip mailing list >> Linux-rockchip@lists.infradead.org >> http://lists.infradead.org/mailman/listinfo/linux-rockchip > > > -- > caesar wang | software engineer | wxt@rock-chip.com >
Something in here got it blocked by the lists. I'm guessing it was the characters my email client didn't like so trying again with them dropped. Jonathan On 21/08/16 20:11, Jonathan Cameron wrote: > On 15/08/16 19:10, Caesar Wang wrote: >> >>> On 27/07/16 15:24, Caesar Wang wrote: >>>> SARADC controller needs to be reset before programming it, otherwise >>>> it will not function properly. >>>> >>>> Signed-off-by: Caesar Wang <wxt@rock-chips.com> >>>> Cc: Jonathan Cameron <jic23@kernel.org> >>>> Cc: Heiko Stuebner <heiko@sntech.de> >>>> Cc: Rob Herring <robh+dt@kernel.org> >>>> Cc: linux-iio@vger.kernel.org >>>> Cc: linux-rockchip@lists.infradead.org >>>> Tested-by: Guenter Roeck <linux@roeck-us.net> >>>> >>> Hi >>> >>> Patch is fine (I'll fix up the wording issue) however... >>> >>> I'm not clear on the severity of the issue. Is this something >>> we should be pushing for stable? >> >> I think that should be pushing for stable, since the common isssue for the ADC is initially enabled on loader, >> and only disabled after the first read. >> >> cat /sys/class/hwmon/hwmon1/device/temp1_input >> cat: /sys/class/hwmon/hwmon1/device/temp1_input: Connection timed out >> >> The kernel log shows: >> >> [ 32.209451] read channel() error: -110 >> .. >> >> Also, for my experience. Some other reasons caused the adc (controller) glitch for the kernel side. > Fine. So now the only question is who is handling it. The > fix is useless (I think) without the dts changes to support it. > Normally we'd route the dts and driver changes separately as it > should not matter, but here I think I'd prefer it if the whole > thing went via rockchip -> arm-soc tree so it goes in together. > > Hence (with wording fixed) > > Acked-by: Jonathan Cameron <jic23@kernel.org> > Cc: <Stable@vger.kernel.org> > (for the driver patch). > > If people want me to take it via IIO then I'll need acks for > the dts changes with explicit agreement that they can be marked > for stable. Would image Heiko, these would come from you. > > Thanks, > > Jonathan >> >> - >> Caesar >> >>> Jonathan >>>> --- >>>> >>>> Changes in v3: >>>> - %s/devm_reset_control_get_optional()/devm_reset_control_get() >>>> - add Guente's test tag. >>>> >>>> Changes in v2: >>>> - Make the reset as an optional property, since it should work >>>> with old devicetrees as well. >>>> >>>> .../bindings/iio/adc/rockchip-saradc.txt | 7 +++++ >>>> drivers/iio/adc/Kconfig | 1 + >>>> drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++++++++++++++ >>>> 3 files changed, 38 insertions(+) >>>> >>>> diff --git a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >>>> index bf99e2f..205593f 100644 >>>> --- a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >>>> +++ b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt >>>> @@ -16,6 +16,11 @@ Required properties: >>>> - vref-supply: The regulator supply ADC reference voltage. >>>> - #io-channel-cells: Should be 1, see ../iio-bindings.txt >>>> >>>> +Optional properties: >>>> +- resets: Must contain an entry for each entry in reset-names if need support >>>> + this option. See ../reset/reset.txt for details. >>>> +- reset-names: Must include the name "saradc-apb". >>>> + >>>> Example: >>>> saradc: saradc@2006c000 { >>>> compatible = "rockchip,saradc"; >>>> @@ -23,6 +28,8 @@ Example: >>>> interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; >>>> clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; >>>> clock-names = "saradc", "apb_pclk"; >>>> + resets = <&cru SRST_SARADC>; >>>> + reset-names = "saradc-apb"; >>>> #io-channel-cells = <1>; >>>> vref-supply = <&vcc18>; >>>> }; >>>> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig >>>> index 1de31bd..7675772 100644 >>>> --- a/drivers/iio/adc/Kconfig >>>> +++ b/drivers/iio/adc/Kconfig >>>> @@ -389,6 +389,7 @@ config QCOM_SPMI_VADC >>>> config ROCKCHIP_SARADC >>>> tristate "Rockchip SARADC driver" >>>> depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) >>>> + depends on RESET_CONTROLLER >>>> help >>>> Say yes here to build support for the SARADC found in SoCs from >>>> Rockchip. >>>> diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c >>>> index f9ad6c2..85d7012 100644 >>>> --- a/drivers/iio/adc/rockchip_saradc.c >>>> +++ b/drivers/iio/adc/rockchip_saradc.c >>>> @@ -21,6 +21,8 @@ >>>> #include <linux/of_device.h> >>>> #include <linux/clk.h> >>>> #include <linux/completion.h> >>>> +#include <linux/delay.h> >>>> +#include <linux/reset.h> >>>> #include <linux/regulator/consumer.h> >>>> #include <linux/iio/iio.h> >>>> >>>> @@ -53,6 +55,7 @@ struct rockchip_saradc { >>>> struct clk *clk; >>>> struct completion completion; >>>> struct regulator *vref; >>>> + struct reset_control *reset; >>>> const struct rockchip_saradc_data *data; >>>> u16 last_val; >>>> }; >>>> @@ -190,6 +193,16 @@ static const struct of_device_id rockchip_saradc_match[] = { >>>> }; >>>> MODULE_DEVICE_TABLE(of, rockchip_saradc_match); >>>> >>>> +/** >>>> + * Reset SARADC Controller. >>>> + */ >>>> +static void rockchip_saradc_reset_controller(struct reset_control *reset) >>>> +{ >>>> + reset_control_assert(reset); >>>> + usleep_range(10, 20); >>>> + reset_control_deassert(reset); >>>> +} >>>> + >>>> static int rockchip_saradc_probe(struct platform_device *pdev) >>>> { >>>> struct rockchip_saradc *info = NULL; >>>> @@ -218,6 +231,20 @@ static int rockchip_saradc_probe(struct platform_device *pdev) >>>> if (IS_ERR(info->regs)) >>>> return PTR_ERR(info->regs); >>>> >>>> + /* >>>> + * The reset should be an optional property, as it should work >>>> + * with old devicetrees as well >>>> + */ >>>> + info->reset = devm_reset_control_get(&pdev->dev, "saradc-apb"); >>>> + if (IS_ERR(info->reset)) { >>>> + ret = PTR_ERR(info->reset); >>>> + if (ret != -ENOENT) >>>> + return ret; >>>> + >>>> + dev_dbg(&pdev->dev, "no reset control found\n"); >>>> + info->reset = NULL; >>>> + } >>>> + >>>> init_completion(&info->completion); >>>> >>>> irq = platform_get_irq(pdev, 0); >>>> @@ -252,6 +279,9 @@ static int rockchip_saradc_probe(struct platform_device *pdev) >>>> return PTR_ERR(info->vref); >>>> } >>>> >>>> + if (info->reset) >>>> + rockchip_saradc_reset_controller(info->reset); >>>> + >>>> /* >>>> * Use a default value for the converter clock. >>>> * This may become user-configurable in the future. >>>> >>> >>> _______________________________________________ >>> Linux-rockchip mailing list >>> Linux-rockchip@lists.infradead.org >>> http://lists.infradead.org/mailman/listinfo/linux-rockchip >> >> >> -- >> caesar wang | software engineer | wxt@rock-chip.com >> >
Am Sonntag, 21. August 2016, 21:01:19 CEST schrieb Jonathan Cameron: > Something in here got it blocked by the lists. I'm guessing it > was the characters my email client didn't like so trying again > with them dropped. > > Jonathan > > On 21/08/16 20:11, Jonathan Cameron wrote: > > On 15/08/16 19:10, Caesar Wang wrote: > >>> On 27/07/16 15:24, Caesar Wang wrote: > >>>> SARADC controller needs to be reset before programming it, otherwise > >>>> it will not function properly. > >>>> > >>>> Signed-off-by: Caesar Wang <wxt@rock-chips.com> > >>>> Cc: Jonathan Cameron <jic23@kernel.org> > >>>> Cc: Heiko Stuebner <heiko@sntech.de> > >>>> Cc: Rob Herring <robh+dt@kernel.org> > >>>> Cc: linux-iio@vger.kernel.org > >>>> Cc: linux-rockchip@lists.infradead.org > >>>> Tested-by: Guenter Roeck <linux@roeck-us.net> > >>> > >>> Hi > >>> > >>> Patch is fine (I'll fix up the wording issue) however... > >>> > >>> I'm not clear on the severity of the issue. Is this something > >>> we should be pushing for stable? > >> > >> I think that should be pushing for stable, since the common isssue for > >> the ADC is initially enabled on loader, and only disabled after the > >> first read. > >> > >> cat /sys/class/hwmon/hwmon1/device/temp1_input > >> cat: /sys/class/hwmon/hwmon1/device/temp1_input: Connection timed out > >> > >> The kernel log shows: > >> > >> [ 32.209451] read channel() error: -110 > >> .. > >> > >> Also, for my experience. Some other reasons caused the adc (controller) > >> glitch for the kernel side.> > > Fine. So now the only question is who is handling it. The > > fix is useless (I think) without the dts changes to support it. > > Normally we'd route the dts and driver changes separately as it > > should not matter, but here I think I'd prefer it if the whole > > thing went via rockchip -> arm-soc tree so it goes in together. > > > > Hence (with wording fixed) > > > > Acked-by: Jonathan Cameron <jic23@kernel.org> > > Cc: <Stable@vger.kernel.org> > > (for the driver patch). > > > > If people want me to take it via IIO then I'll need acks for > > the dts changes with explicit agreement that they can be marked > > for stable. Would image Heiko, these would come from you. I don't know how the armsoc people feel about routing other subsystem changes through armsoc, but I think small dts changes coming through driver trees is the more common case, so personally I'd think patches 1,3 and 4 could go through the iio tree. Patch 2 of course isn't material for stable, as it adds new functionality, so I'd pick that up directly, especially as we see numerous rk3399 changes, so that would be prone to conflict. Heiko
On 22/08/16 18:19, Heiko Stuebner wrote: > Am Sonntag, 21. August 2016, 21:01:19 CEST schrieb Jonathan Cameron: >> Something in here got it blocked by the lists. I'm guessing it >> was the characters my email client didn't like so trying again >> with them dropped. >> >> Jonathan >> >> On 21/08/16 20:11, Jonathan Cameron wrote: >>> On 15/08/16 19:10, Caesar Wang wrote: >>>>> On 27/07/16 15:24, Caesar Wang wrote: >>>>>> SARADC controller needs to be reset before programming it, otherwise >>>>>> it will not function properly. >>>>>> >>>>>> Signed-off-by: Caesar Wang <wxt@rock-chips.com> >>>>>> Cc: Jonathan Cameron <jic23@kernel.org> >>>>>> Cc: Heiko Stuebner <heiko@sntech.de> >>>>>> Cc: Rob Herring <robh+dt@kernel.org> >>>>>> Cc: linux-iio@vger.kernel.org >>>>>> Cc: linux-rockchip@lists.infradead.org >>>>>> Tested-by: Guenter Roeck <linux@roeck-us.net> >>>>> >>>>> Hi >>>>> >>>>> Patch is fine (I'll fix up the wording issue) however... >>>>> >>>>> I'm not clear on the severity of the issue. Is this something >>>>> we should be pushing for stable? >>>> >>>> I think that should be pushing for stable, since the common isssue for >>>> the ADC is initially enabled on loader, and only disabled after the >>>> first read. >>>> >>>> cat /sys/class/hwmon/hwmon1/device/temp1_input >>>> cat: /sys/class/hwmon/hwmon1/device/temp1_input: Connection timed out >>>> >>>> The kernel log shows: >>>> >>>> [ 32.209451] read channel() error: -110 >>>> .. >>>> >>>> Also, for my experience. Some other reasons caused the adc (controller) >>>> glitch for the kernel side.> >>> Fine. So now the only question is who is handling it. The >>> fix is useless (I think) without the dts changes to support it. >>> Normally we'd route the dts and driver changes separately as it >>> should not matter, but here I think I'd prefer it if the whole >>> thing went via rockchip -> arm-soc tree so it goes in together. >>> >>> Hence (with wording fixed) >>> >>> Acked-by: Jonathan Cameron <jic23@kernel.org> >>> Cc: <Stable@vger.kernel.org> >>> (for the driver patch). >>> >>> If people want me to take it via IIO then I'll need acks for >>> the dts changes with explicit agreement that they can be marked >>> for stable. Would image Heiko, these would come from you. > > I don't know how the armsoc people feel about routing other subsystem changes > through armsoc, but I think small dts changes coming through driver trees is > the more common case, so personally I'd think patches 1,3 and 4 could go > through the iio tree. > > Patch 2 of course isn't material for stable, as it adds new functionality, so > I'd pick that up directly, especially as we see numerous rk3399 changes, so > that would be prone to conflict. Absolutely. This one applied to the fixes-togreg branch of iio.git Thanks, Jonathan > > > Heiko >
diff --git a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt index bf99e2f..205593f 100644 --- a/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt +++ b/Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt @@ -16,6 +16,11 @@ Required properties: - vref-supply: The regulator supply ADC reference voltage. - #io-channel-cells: Should be 1, see ../iio-bindings.txt +Optional properties: +- resets: Must contain an entry for each entry in reset-names if need support + this option. See ../reset/reset.txt for details. +- reset-names: Must include the name "saradc-apb". + Example: saradc: saradc@2006c000 { compatible = "rockchip,saradc"; @@ -23,6 +28,8 @@ Example: interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; clock-names = "saradc", "apb_pclk"; + resets = <&cru SRST_SARADC>; + reset-names = "saradc-apb"; #io-channel-cells = <1>; vref-supply = <&vcc18>; }; diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 1de31bd..7675772 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -389,6 +389,7 @@ config QCOM_SPMI_VADC config ROCKCHIP_SARADC tristate "Rockchip SARADC driver" depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) + depends on RESET_CONTROLLER help Say yes here to build support for the SARADC found in SoCs from Rockchip. diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c index f9ad6c2..85d7012 100644 --- a/drivers/iio/adc/rockchip_saradc.c +++ b/drivers/iio/adc/rockchip_saradc.c @@ -21,6 +21,8 @@ #include <linux/of_device.h> #include <linux/clk.h> #include <linux/completion.h> +#include <linux/delay.h> +#include <linux/reset.h> #include <linux/regulator/consumer.h> #include <linux/iio/iio.h> @@ -53,6 +55,7 @@ struct rockchip_saradc { struct clk *clk; struct completion completion; struct regulator *vref; + struct reset_control *reset; const struct rockchip_saradc_data *data; u16 last_val; }; @@ -190,6 +193,16 @@ static const struct of_device_id rockchip_saradc_match[] = { }; MODULE_DEVICE_TABLE(of, rockchip_saradc_match); +/** + * Reset SARADC Controller. + */ +static void rockchip_saradc_reset_controller(struct reset_control *reset) +{ + reset_control_assert(reset); + usleep_range(10, 20); + reset_control_deassert(reset); +} + static int rockchip_saradc_probe(struct platform_device *pdev) { struct rockchip_saradc *info = NULL; @@ -218,6 +231,20 @@ static int rockchip_saradc_probe(struct platform_device *pdev) if (IS_ERR(info->regs)) return PTR_ERR(info->regs); + /* + * The reset should be an optional property, as it should work + * with old devicetrees as well + */ + info->reset = devm_reset_control_get(&pdev->dev, "saradc-apb"); + if (IS_ERR(info->reset)) { + ret = PTR_ERR(info->reset); + if (ret != -ENOENT) + return ret; + + dev_dbg(&pdev->dev, "no reset control found\n"); + info->reset = NULL; + } + init_completion(&info->completion); irq = platform_get_irq(pdev, 0); @@ -252,6 +279,9 @@ static int rockchip_saradc_probe(struct platform_device *pdev) return PTR_ERR(info->vref); } + if (info->reset) + rockchip_saradc_reset_controller(info->reset); + /* * Use a default value for the converter clock. * This may become user-configurable in the future.