spi: cadence_qspi: add reset handling
authorSimon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
Fri, 1 Mar 2019 19:12:35 +0000 (20:12 +0100)
committerMarek Vasut <marex@denx.de>
Wed, 17 Apr 2019 20:20:17 +0000 (22:20 +0200)
This adds reset handling to the cadence qspi driver.

For backwards compatibility, only a warning is printed when failing to
get reset handles.

Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
drivers/spi/cadence_qspi.c
drivers/spi/cadence_qspi.h

index efdb178450e1cf6477024d5e8286ff9a43e992f1..41c87004d8cb8050e4907b11b0c37e9949bafda1 100644 (file)
@@ -8,6 +8,7 @@
 #include <dm.h>
 #include <fdtdec.h>
 #include <malloc.h>
+#include <reset.h>
 #include <spi.h>
 #include <linux/errno.h>
 #include "cadence_qspi.h"
@@ -154,10 +155,17 @@ static int cadence_spi_probe(struct udevice *bus)
 {
        struct cadence_spi_platdata *plat = bus->platdata;
        struct cadence_spi_priv *priv = dev_get_priv(bus);
+       int ret;
 
        priv->regbase = plat->regbase;
        priv->ahbbase = plat->ahbbase;
 
+       ret = reset_get_bulk(bus, &priv->resets);
+       if (ret)
+               dev_warn(bus, "Can't get reset: %d\n", ret);
+       else
+               reset_deassert_bulk(&priv->resets);
+
        if (!priv->qspi_is_init) {
                cadence_qspi_apb_controller_init(plat);
                priv->qspi_is_init = 1;
@@ -166,6 +174,13 @@ static int cadence_spi_probe(struct udevice *bus)
        return 0;
 }
 
+static int cadence_spi_remove(struct udevice *dev)
+{
+       struct cadence_spi_priv *priv = dev_get_priv(dev);
+
+       return reset_release_bulk(&priv->resets);
+}
+
 static int cadence_spi_set_mode(struct udevice *bus, uint mode)
 {
        struct cadence_spi_priv *priv = dev_get_priv(bus);
@@ -342,4 +357,6 @@ U_BOOT_DRIVER(cadence_spi) = {
        .platdata_auto_alloc_size = sizeof(struct cadence_spi_platdata),
        .priv_auto_alloc_size = sizeof(struct cadence_spi_priv),
        .probe = cadence_spi_probe,
+       .remove = cadence_spi_remove,
+       .flags = DM_FLAG_OS_PREPARE,
 };
index b4914071308d95419ef63c3a3b49b33af328161d..20cceca239f8e59a95bac5620dda781c6d6003c9 100644 (file)
@@ -7,6 +7,8 @@
 #ifndef __CADENCE_QSPI_H__
 #define __CADENCE_QSPI_H__
 
+#include <reset.h>
+
 #define CQSPI_IS_ADDR(cmd_len)         (cmd_len > 1 ? 1 : 0)
 
 #define CQSPI_NO_DECODER_MAX_CS                4
@@ -42,6 +44,8 @@ struct cadence_spi_priv {
        unsigned int    qspi_calibrated_hz;
        unsigned int    qspi_calibrated_cs;
        unsigned int    previous_hz;
+
+       struct reset_ctl_bulk resets;
 };
 
 /* Functions call declaration */