diff mbox series

[1/2] spi: atmel: factorize reusable code for SPI controller init

Message ID 20170414082243.23002-1-quentin.schulz@free-electrons.com
State Accepted
Commit 05514c86965f98f9b0e57f73700771fa267050a7
Headers show
Series [1/2] spi: atmel: factorize reusable code for SPI controller init | expand

Commit Message

Quentin Schulz April 14, 2017, 8:22 a.m. UTC
The SPI controller configuration during the init can be reused, for the
resume function for example.

Let's move this configuration to a separate function.

Signed-off-by: Quentin Schulz <quentin.schulz@free-electrons.com>

Acked-by: Nicolas Ferre <nicolas.ferre@microchip.com>

---
 drivers/spi/spi-atmel.c | 35 +++++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 14 deletions(-)

-- 
2.9.3

Comments

Mark Brown April 14, 2017, 5:03 p.m. UTC | #1
On Fri, Apr 14, 2017 at 10:22:42AM +0200, Quentin Schulz wrote:
> The SPI controller configuration during the init can be reused, for the

> resume function for example.


Please don't resubmit patches that have already been applied, you should
submit patches against current code in the tree you're expecting things
to be applied to.  If any updates are needed to a patch that's already
been applied you should submit incremental patches which make those
updates.  This avoids having to change published git commits which could
cause problems for people working against git.
Nicolas Ferre April 18, 2017, 8:50 a.m. UTC | #2
(sorry for malformed email but I didn't want to hold this patch longer)

On 14/04/2017 at 10:22:43 +0200, Quentin Schulz wrote:
> This adds deepest (Backup+Self-Refresh) PM support to the ATMEL SAMA5D2

> SoC's SPI controller.

>

> When resuming from deepest state, it is required to restore MR register

> as the registers are lost since VDD core has been shut down when

> entering deepest state on the SAMA5D2.

>

> Signed-off-by: Quentin Schulz <quentin.schulz@free-electrons.com>

Acked-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>


Acked-by: Nicolas Ferre <nicolas.ferre@microchip.com>


> ---

>

> v2:

>   - fix commit log explanation on why restoring the registers is required

>   after resuming from deepest state,

>

>  drivers/spi/spi-atmel.c | 9 +++++++++

>  1 file changed, 9 insertions(+)

>

> diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c

> index 247d920..1eb83c9 100644

> --- a/drivers/spi/spi-atmel.c

> +++ b/drivers/spi/spi-atmel.c

> @@ -1702,8 +1702,17 @@ static int atmel_spi_suspend(struct device *dev)

>  static int atmel_spi_resume(struct device *dev)

>  {

>       struct spi_master *master = dev_get_drvdata(dev);

> +     struct atmel_spi *as = spi_master_get_devdata(master);

>       int ret;

>

> +     ret = clk_prepare_enable(as->clk);

> +     if (ret)

> +             return ret;

> +

> +     atmel_spi_init(as);

> +

> +     clk_disable_unprepare(as->clk);

> +

>       if (!pm_runtime_suspended(dev)) {

>               ret = atmel_spi_runtime_resume(dev);

>               if (ret)

> --

> 2.9.3

>


--
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
diff mbox series

Patch

diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c
index 0e7712b..247d920 100644
--- a/drivers/spi/spi-atmel.c
+++ b/drivers/spi/spi-atmel.c
@@ -1464,6 +1464,25 @@  static int atmel_spi_gpio_cs(struct platform_device *pdev)
 	return 0;
 }
 
+static void atmel_spi_init(struct atmel_spi *as)
+{
+	spi_writel(as, CR, SPI_BIT(SWRST));
+	spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */
+	if (as->caps.has_wdrbt) {
+		spi_writel(as, MR, SPI_BIT(WDRBT) | SPI_BIT(MODFDIS)
+				| SPI_BIT(MSTR));
+	} else {
+		spi_writel(as, MR, SPI_BIT(MSTR) | SPI_BIT(MODFDIS));
+	}
+
+	if (as->use_pdc)
+		spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS));
+	spi_writel(as, CR, SPI_BIT(SPIEN));
+
+	if (as->fifo_size)
+		spi_writel(as, CR, SPI_BIT(FIFOEN));
+}
+
 static int atmel_spi_probe(struct platform_device *pdev)
 {
 	struct resource		*regs;
@@ -1572,26 +1591,14 @@  static int atmel_spi_probe(struct platform_device *pdev)
 
 	as->spi_clk = clk_get_rate(clk);
 
-	spi_writel(as, CR, SPI_BIT(SWRST));
-	spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */
-	if (as->caps.has_wdrbt) {
-		spi_writel(as, MR, SPI_BIT(WDRBT) | SPI_BIT(MODFDIS)
-				| SPI_BIT(MSTR));
-	} else {
-		spi_writel(as, MR, SPI_BIT(MSTR) | SPI_BIT(MODFDIS));
-	}
-
-	if (as->use_pdc)
-		spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS));
-	spi_writel(as, CR, SPI_BIT(SPIEN));
-
 	as->fifo_size = 0;
 	if (!of_property_read_u32(pdev->dev.of_node, "atmel,fifo-size",
 				  &as->fifo_size)) {
 		dev_info(&pdev->dev, "Using FIFO (%u data)\n", as->fifo_size);
-		spi_writel(as, CR, SPI_BIT(FIFOEN));
 	}
 
+	atmel_spi_init(as);
+
 	pm_runtime_set_autosuspend_delay(&pdev->dev, AUTOSUSPEND_TIMEOUT);
 	pm_runtime_use_autosuspend(&pdev->dev);
 	pm_runtime_set_active(&pdev->dev);