spi: dw: add reset control
Subsystems (2)
PATCH v2 1/2 spi: dw: add reset control
Add mechanism to get the reset control and deassert it in order to bring the IP out of reset.
---
v2: use _get_optional_exclusive
put IP back into reset if there was an error in probe function
--- drivers/spi/spi-dw-mmio.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/spi/spi-dw-mmio.c +13 -0
@@ -20,6 +20,7 @@#include <linux/acpi.h> #include <linux/property.h> #include <linux/regmap.h> +#include <linux/reset.h> #include "spi-dw.h"
@@ -30,6 +31,7 @@ struct dw_spi_mmio {struct clk *clk;struct clk *pclk;void *priv; +struct reset_control *rstc; };#define MSCC_CPU_SYSTEM_CTRL_GENERAL_CTRL 0x24
@@ -175,6 +177,14 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)if (ret) goto out_clk; +/* find an optional reset controller */ + dwsmmio->rstc =devm_reset_control_get_optional_exclusive (&pdev->dev,"spi" ); +if (IS_ERR (dwsmmio->rstc)) { +if (PTR_ERR (dwsmmio->rstc) == -EPROBE_DEFER ) +return PTR_ERR (dwsmmio->rstc); + } +reset_control_deassert (dwsmmio->rstc); + dws->bus_num = pdev->id; dws->max_freq =clk_get_rate (dwsmmio->clk);
@@ -208,6 +218,8 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)clk_disable_unprepare (dwsmmio->pclk); out_clk:clk_disable_unprepare (dwsmmio->clk); +reset_control_assert (dwsmmio->rstc); +return ret; }
@@ -219,6 +231,7 @@ static int dw_spi_mmio_remove(struct platform_device *pdev)pm_runtime_disable (&pdev->dev);clk_disable_unprepare (dwsmmio->pclk);clk_disable_unprepare (dwsmmio->clk); +reset_control_assert (dwsmmio->rstc);return 0 ; }
Signature · 1 line
2.17.1
PATCH v2 2/2 dt-bindings: snps,dw-apb-ssi: add optional reset property
Add optional reset property.
---
v2: actually document the "resets" and "reset-names" optional properties
--- Documentation/devicetree/bindings/spi/snps,dw-apb-ssi.txt | 5 +++++ 1 file changed, 5 insertions(+)
Documentation/devicetree/bindings/spi/snps,dw-apb-ssi.txt +5 -0
@@ -22,6 +22,9 @@ Optional properties: - num-cs : The number of chipselects. If omitted, this will default to 4. - reg-io-width : The I/O register width (in bytes) implemented by this device. Supported values are 2 or 4 (the default). +- resets : contains an entry for each entry in reset-names. + See ../reset/reset.txt for details. +- reset-names : must contain "spi" Child nodes as per the generic SPI binding.
@@ -37,5 +40,7 @@ Example: num-cs = <2>; cs-gpios = <&gpio0 13 0>, <&gpio0 14 0>; + resets = <&rst SPIM0_RST>; + reset-names = "spi"; };
Signature · 1 line
2.17.1
Quoted 2 lines · Dinh Nguyen
Add mechanism to get the reset control and deassert it in order to bring the IP out of reset.
...
drivers/spi/spi-dw-mmio.c struct dw_spi_mmio { · line 34
Quoted 4 lines
drivers/spi/spi-dw-mmio.c +1
-0struct clk *clk;struct clk *pclk;void *priv; +struct reset_control *rstc;
I think either you make it one space or you align all the rest members accordingly. I would rather go with former.
...
drivers/spi/spi-dw-mmio.c static int dw_spi_mmio_probe(struct platform_device *pdev)
Quoted 6 lines
drivers/spi/spi-dw-mmio.c +5
-0+/* find an optional reset controller */ + dwsmmio->rstc =devm_reset_control_get_optional_exclusive (&pdev->dev,"spi" ); +if (IS_ERR (dwsmmio->rstc)) { +if (PTR_ERR (dwsmmio->rstc) == -EPROBE_DEFER ) +return PTR_ERR (dwsmmio->rstc);
If it's other type of errors when reset control, we ignore them...
Why?!
Quoted 1 line
drivers/spi/spi-dw-mmio.c +1
-0+ }
Signature · 2 lines
With Best Regards, Andy Shevchenko