]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
spi: fsl-qspi: add optional reset support
authorAlex Elder <elder@riscstar.com>
Mon, 27 Oct 2025 13:30:01 +0000 (08:30 -0500)
committerMark Brown <broonie@kernel.org>
Thu, 6 Nov 2025 16:57:32 +0000 (16:57 +0000)
Add support for one or more optional exclusive resets.  These simply need
to be deasserted at probe time, and can remain that way for the life of the
device.

Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Alex Elder <elder@riscstar.com>
Link: https://patch.msgid.link/20251027133008.360237-4-elder@riscstar.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-fsl-qspi.c

index c887abb028d7758f574587707d8328c1c0aad42b..1e27647dd2a092c540f5535cd83205a5e8e99ab1 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/pm_qos.h>
+#include <linux/reset.h>
 #include <linux/sizes.h>
 
 #include <linux/spi/spi.h>
@@ -267,6 +268,7 @@ struct fsl_qspi {
        const struct fsl_qspi_devtype_data *devtype_data;
        struct mutex lock;
        struct completion c;
+       struct reset_control *resets;
        struct clk *clk, *clk_en;
        struct pm_qos_request pm_qos_req;
        struct device *dev;
@@ -857,6 +859,8 @@ static void fsl_qspi_cleanup(void *data)
 {
        struct fsl_qspi *q = data;
 
+       reset_control_assert(q->resets);
+
        fsl_qspi_clk_disable_unprep(q);
 
        mutex_destroy(&q->lock);
@@ -902,6 +906,10 @@ static int fsl_qspi_probe(struct platform_device *pdev)
        if (!q->ahb_addr)
                return -ENOMEM;
 
+       q->resets = devm_reset_control_array_get_optional_exclusive(dev);
+       if (IS_ERR(q->resets))
+               return PTR_ERR(q->resets);
+
        /* find the clocks */
        q->clk_en = devm_clk_get(dev, "qspi_en");
        if (IS_ERR(q->clk_en))
@@ -923,6 +931,10 @@ static int fsl_qspi_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       ret = reset_control_deassert(q->resets);
+       if (ret)
+               return ret;
+
        /* find the irq */
        ret = platform_get_irq(pdev, 0);
        if (ret < 0)