# Conflicts:
#	include/linux/soc/qcom/geni-se.h
This commit is contained in:
Mark Brown
2026-07-31 15:29:46 +01:00
34 changed files with 843 additions and 309 deletions
@@ -22,6 +22,7 @@ properties:
- microchip,sama7d65-ospi
- microchip,sama7g5-qspi
- microchip,sama7g5-ospi
- microchip,lan9691-qspi
reg:
items:
@@ -0,0 +1,61 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/spi/cavium,octeon-3010-spi.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Cavium, Inc. OCTEON SoC SPI master controller
description:
The Cavium OCTEON SPI controller is an SPI master controller found in
OCTEON SoCs.
maintainers:
- Rob Herring <robh@kernel.org>
allOf:
- $ref: spi-controller.yaml#
properties:
compatible:
const: cavium,octeon-3010-spi
reg:
maxItems: 1
interrupts:
maxItems: 1
required:
- compatible
- reg
- interrupts
unevaluatedProperties: false
examples:
- |
soc {
#address-cells = <2>;
#size-cells = <2>;
spi@1070000001000 {
compatible = "cavium,octeon-3010-spi";
reg = <0x10700 0x00001000 0x0 0x100>;
interrupts = <0 58>;
#address-cells = <1>;
#size-cells = <0>;
eeprom@0 {
compatible = "st,m95256", "atmel,at25";
reg = <0>;
spi-max-frequency = <5000000>;
spi-cpha;
spi-cpol;
pagesize = <64>;
size = <32768>;
address-width = <16>;
};
};
};
...
@@ -30,6 +30,16 @@ properties:
- const: base
- const: mmap
dmas:
items:
- description: Transmit DMA
- description: Receive DMA
dma-names:
items:
- const: tx
- const: rx
interrupts:
items:
- description: interrupt for EENV0
@@ -0,0 +1,68 @@
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/spi/qcom,sa8255p-geni-spi.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: GENI based Qualcomm Universal Peripheral (QUP) Serial Peripheral Interface (SPI)
maintainers:
- Praveen Talari <praveen.talari@oss.qualcomm.com>
properties:
compatible:
oneOf:
- const: qcom,sa8255p-geni-spi
- items:
- const: qcom,sa8797p-geni-spi
- const: qcom,sa8255p-geni-spi
reg:
maxItems: 1
dmas:
maxItems: 2
dma-names:
items:
- const: tx
- const: rx
interrupts:
maxItems: 1
power-domains:
maxItems: 2
power-domain-names:
items:
- const: power
- const: perf
required:
- compatible
- reg
- interrupts
- power-domains
- power-domain-names
allOf:
- $ref: /schemas/spi/spi-controller.yaml#
unevaluatedProperties: false
examples:
- |
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/dma/qcom-gpi.h>
spi@888000 {
compatible = "qcom,sa8255p-geni-spi";
reg = <0x888000 0x4000>;
interrupts = <GIC_SPI 584 IRQ_TYPE_LEVEL_HIGH>;
dmas = <&gpi_dma0 0 0 QCOM_GPI_SPI>,
<&gpi_dma0 1 0 QCOM_GPI_SPI>;
dma-names = "tx", "rx";
power-domains = <&scmi0_pd 0>, <&scmi0_dvfs 0>;
power-domain-names = "power", "perf";
};
@@ -1,33 +0,0 @@
Cavium, Inc. OCTEON SOC SPI master controller.
Required properties:
- compatible : "cavium,octeon-3010-spi"
- reg : The register base for the controller.
- interrupts : One interrupt, used by the controller.
- #address-cells : <1>, as required by generic SPI binding.
- #size-cells : <0>, also as required by generic SPI binding.
Child nodes as per the generic SPI binding.
Example:
spi@1070000001000 {
compatible = "cavium,octeon-3010-spi";
reg = <0x10700 0x00001000 0x0 0x100>;
interrupts = <0 58>;
#address-cells = <1>;
#size-cells = <0>;
eeprom@0 {
compatible = "st,m95256", "atmel,at25";
reg = <0>;
spi-max-frequency = <5000000>;
spi-cpha;
spi-cpol;
pagesize = <64>;
size = <32768>;
address-width = <16>;
};
};
@@ -50,6 +50,9 @@ properties:
minItems: 1
maxItems: 2
power-domains:
maxItems: 1
required:
- compatible
- reg
+5
View File
@@ -7,6 +7,11 @@
/* Disable MMIO tracing to prevent excessive logging of unwanted MMIO traces */
#define __DISABLE_TRACE_MMIO__
#define CREATE_TRACE_POINTS
#include <trace/events/qcom_geni_se.h>
EXPORT_TRACEPOINT_SYMBOL_GPL(geni_se_regs);
#include <linux/acpi.h>
#include <linux/bitfield.h>
#include <linux/clk.h>
+1 -1
View File
@@ -189,7 +189,7 @@ config SPI_AT91_USART
config SPI_ATMEL_QUADSPI
tristate "Atmel Quad SPI Controller"
depends on ARCH_AT91 || COMPILE_TEST
depends on ARCH_MICROCHIP || COMPILE_TEST
depends on OF && HAS_IOMEM
help
This enables support for the Quad SPI controller in master mode.
+100 -32
View File
@@ -256,8 +256,11 @@ static const struct atmel_qspi_pcal pcal[ATMEL_QSPI_PCAL_ARRAY_SIZE] = {
{200000000, 7},
};
struct atmel_qspi;
struct atmel_qspi_caps {
u32 max_speed_hz;
int (*init)(struct atmel_qspi *aq);
bool has_qspick;
bool has_gclk;
bool has_ricr;
@@ -1149,6 +1152,58 @@ static int atmel_qspi_sama7g5_init(struct atmel_qspi *aq)
return ret;
}
static int atmel_qspi_lan969x_init(struct atmel_qspi *aq)
{
u32 val;
int ret;
atmel_qspi_write(QSPI_CR_DLLOFF, aq, QSPI_CR);
ret = readl_poll_timeout(aq->regs + QSPI_SR2, val,
!(val & QSPI_SR2_DLOCK), 40,
ATMEL_QSPI_TIMEOUT);
if (ret)
return ret;
ret = atmel_qspi_set_gclk(aq);
if (ret)
return ret;
/* Start the DLL before resetting the controller. */
atmel_qspi_write(QSPI_CR_DLLON | QSPI_CR_STPCAL, aq, QSPI_CR);
ret = readl_poll_timeout(aq->regs + QSPI_SR2, val,
(val & QSPI_SR2_DLOCK) &&
!(val & QSPI_SR2_CALBSY), 40,
ATMEL_QSPI_TIMEOUT);
if (ret)
return ret;
atmel_qspi_write(QSPI_CR_QSPIDIS, aq, QSPI_CR);
ret = atmel_qspi_reg_sync(aq);
if (ret)
return ret;
atmel_qspi_write(QSPI_CR_SWRST, aq, QSPI_CR);
ret = atmel_qspi_reg_sync(aq);
if (ret)
return ret;
ret = atmel_qspi_set_pad_calibration(aq);
if (ret)
return ret;
aq->mr = 0;
aq->scr = 0;
ret = atmel_qspi_set_serial_memory_mode(aq);
if (ret)
return ret;
atmel_qspi_write(QSPI_CR_QSPIEN, aq, QSPI_CR);
return readl_poll_timeout(aq->regs + QSPI_SR2, val,
(val & QSPI_SR2_QSPIENS), 40,
ATMEL_QSPI_TIMEOUT);
}
static int atmel_qspi_sama7g5_setup(struct spi_device *spi)
{
struct atmel_qspi *aq = spi_controller_get_devdata(spi->controller);
@@ -1156,7 +1211,7 @@ static int atmel_qspi_sama7g5_setup(struct spi_device *spi)
/* The controller can communicate with a single peripheral device (target). */
aq->target_max_speed_hz = spi->max_speed_hz;
return atmel_qspi_sama7g5_init(aq);
return aq->caps->init(aq);
}
static int atmel_qspi_setup(struct spi_device *spi)
@@ -1347,20 +1402,21 @@ static const struct atmel_qspi_ops atmel_qspi_sama7g5_ops = {
static int atmel_qspi_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct spi_controller *ctrl;
struct atmel_qspi *aq;
struct resource *res;
int irq, err = 0;
ctrl = devm_spi_alloc_host(&pdev->dev, sizeof(*aq));
ctrl = devm_spi_alloc_host(dev, sizeof(*aq));
if (!ctrl)
return -ENOMEM;
aq = spi_controller_get_devdata(ctrl);
aq->caps = of_device_get_match_data(&pdev->dev);
aq->caps = of_device_get_match_data(dev);
if (!aq->caps) {
dev_err(&pdev->dev, "Could not retrieve QSPI caps\n");
dev_err(dev, "Could not retrieve QSPI caps\n");
return -EINVAL;
}
@@ -1387,45 +1443,40 @@ static int atmel_qspi_probe(struct platform_device *pdev)
/* Map the registers */
aq->regs = devm_platform_ioremap_resource_byname(pdev, "qspi_base");
if (IS_ERR(aq->regs))
return dev_err_probe(&pdev->dev, PTR_ERR(aq->regs),
return dev_err_probe(dev, PTR_ERR(aq->regs),
"missing registers\n");
/* Map the AHB memory */
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi_mmap");
aq->mem = devm_ioremap_resource(&pdev->dev, res);
aq->mem = devm_ioremap_resource(dev, res);
if (IS_ERR(aq->mem))
return dev_err_probe(&pdev->dev, PTR_ERR(aq->mem),
return dev_err_probe(dev, PTR_ERR(aq->mem),
"missing AHB memory\n");
aq->mmap_size = resource_size(res);
aq->mmap_phys_base = (dma_addr_t)res->start;
/* Get the peripheral clock */
aq->pclk = devm_clk_get_enabled(&pdev->dev, "pclk");
aq->pclk = devm_clk_get_enabled(dev, "pclk");
if (IS_ERR(aq->pclk))
aq->pclk = devm_clk_get_enabled(&pdev->dev, NULL);
aq->pclk = devm_clk_get_enabled(dev, NULL);
if (IS_ERR(aq->pclk))
return dev_err_probe(&pdev->dev, PTR_ERR(aq->pclk),
return dev_err_probe(dev, PTR_ERR(aq->pclk),
"missing peripheral clock\n");
if (aq->caps->has_qspick) {
/* Get the QSPI system clock */
aq->qspick = devm_clk_get_enabled(&pdev->dev, "qspick");
if (IS_ERR(aq->qspick)) {
dev_err(&pdev->dev, "missing system clock\n");
err = PTR_ERR(aq->qspick);
return err;
}
aq->qspick = devm_clk_get_enabled(dev, "qspick");
if (IS_ERR(aq->qspick))
return dev_err_probe(dev, PTR_ERR(aq->qspick),
"missing system clock\n");
} else if (aq->caps->has_gclk) {
/* Get the QSPI generic clock */
aq->gclk = devm_clk_get(&pdev->dev, "gclk");
if (IS_ERR(aq->gclk)) {
dev_err(&pdev->dev, "missing Generic clock\n");
err = PTR_ERR(aq->gclk);
return err;
}
aq->gclk = devm_clk_get(dev, "gclk");
if (IS_ERR(aq->gclk))
return dev_err_probe(dev, PTR_ERR(aq->gclk),
"missing Generic clock\n");
}
if (aq->caps->has_dma) {
@@ -1439,15 +1490,15 @@ static int atmel_qspi_probe(struct platform_device *pdev)
if (irq < 0)
return irq;
err = devm_request_irq(&pdev->dev, irq, atmel_qspi_interrupt,
0, dev_name(&pdev->dev), aq);
err = devm_request_irq(dev, irq, atmel_qspi_interrupt,
0, dev_name(dev), aq);
if (err)
return err;
pm_runtime_set_autosuspend_delay(&pdev->dev, 500);
pm_runtime_use_autosuspend(&pdev->dev);
devm_pm_runtime_set_active_enabled(&pdev->dev);
devm_pm_runtime_get_noresume(&pdev->dev);
pm_runtime_set_autosuspend_delay(dev, 500);
pm_runtime_use_autosuspend(dev);
devm_pm_runtime_set_active_enabled(dev);
devm_pm_runtime_get_noresume(dev);
err = atmel_qspi_init(aq);
if (err)
@@ -1457,7 +1508,7 @@ static int atmel_qspi_probe(struct platform_device *pdev)
if (err)
return err;
pm_runtime_put_autosuspend(&pdev->dev);
pm_runtime_put_autosuspend(dev);
return 0;
}
@@ -1571,7 +1622,7 @@ static int __maybe_unused atmel_qspi_resume(struct device *dev)
}
if (aq->caps->has_gclk)
return atmel_qspi_sama7g5_init(aq);
return aq->caps->init(aq);
ret = pm_runtime_force_resume(dev);
if (ret < 0)
@@ -1629,6 +1680,7 @@ static const struct atmel_qspi_caps atmel_sam9x60_qspi_caps = {
static const struct atmel_qspi_caps atmel_sam9x7_ospi_caps = {
.max_speed_hz = SAM9X7_QSPI_MAX_SPEED_HZ,
.init = atmel_qspi_sama7g5_init,
.has_gclk = true,
.octal = true,
.has_dma = true,
@@ -1639,6 +1691,7 @@ static const struct atmel_qspi_caps atmel_sam9x7_ospi_caps = {
static const struct atmel_qspi_caps atmel_sama7d65_ospi_caps = {
.max_speed_hz = SAMA7G5_QSPI0_MAX_SPEED_HZ,
.init = atmel_qspi_sama7g5_init,
.has_gclk = true,
.octal = true,
.has_dma = true,
@@ -1649,6 +1702,7 @@ static const struct atmel_qspi_caps atmel_sama7d65_ospi_caps = {
static const struct atmel_qspi_caps atmel_sama7d65_qspi_caps = {
.max_speed_hz = SAMA7G5_QSPI1_SDR_MAX_SPEED_HZ,
.init = atmel_qspi_sama7g5_init,
.has_gclk = true,
.has_dma = true,
.has_2xgclk = true,
@@ -1657,6 +1711,7 @@ static const struct atmel_qspi_caps atmel_sama7d65_qspi_caps = {
static const struct atmel_qspi_caps atmel_sama7g5_ospi_caps = {
.max_speed_hz = SAMA7G5_QSPI0_MAX_SPEED_HZ,
.init = atmel_qspi_sama7g5_init,
.has_gclk = true,
.octal = true,
.has_dma = true,
@@ -1666,11 +1721,21 @@ static const struct atmel_qspi_caps atmel_sama7g5_ospi_caps = {
static const struct atmel_qspi_caps atmel_sama7g5_qspi_caps = {
.max_speed_hz = SAMA7G5_QSPI1_SDR_MAX_SPEED_HZ,
.init = atmel_qspi_sama7g5_init,
.has_gclk = true,
.has_dma = true,
.has_dllon = true,
};
static const struct atmel_qspi_caps atmel_lan969x_qspi_caps = {
.max_speed_hz = SAM9X7_QSPI_MAX_SPEED_HZ,
.init = atmel_qspi_lan969x_init,
.has_gclk = true,
.has_dma = true,
.has_padcalib = true,
.has_dllon = true,
};
static const struct of_device_id atmel_qspi_dt_ids[] = {
{
.compatible = "atmel,sama5d2-qspi",
@@ -1700,7 +1765,10 @@ static const struct of_device_id atmel_qspi_dt_ids[] = {
.compatible = "microchip,sama7d65-qspi",
.data = &atmel_sama7d65_qspi_caps,
},
{
.compatible = "microchip,lan9691-qspi",
.data = &atmel_lan969x_qspi_caps,
},
{ /* sentinel */ }
};
+5 -8
View File
@@ -77,10 +77,8 @@ static int altera_spi_probe(struct platform_device *pdev)
struct resource *regoff;
hw->regmap = dev_get_regmap(pdev->dev.parent, NULL);
if (!hw->regmap) {
dev_err(&pdev->dev, "get regmap failed\n");
return -ENODEV;
}
if (!hw->regmap)
return dev_err_probe(&pdev->dev, -ENODEV, "get regmap failed\n");
regoff = platform_get_resource(pdev, IORESOURCE_REG, 0);
if (regoff)
@@ -94,10 +92,9 @@ static int altera_spi_probe(struct platform_device *pdev)
hw->regmap = devm_regmap_init_mmio(&pdev->dev, res,
&spi_altera_config);
if (IS_ERR(hw->regmap)) {
dev_err(&pdev->dev, "regmap mmio init failed\n");
return PTR_ERR(hw->regmap);
}
if (IS_ERR(hw->regmap))
return dev_err_probe(&pdev->dev, PTR_ERR(hw->regmap),
"regmap mmio init failed\n");
}
altera_spi_init_host(host);
+4 -1
View File
@@ -598,8 +598,11 @@ static int atcspi_suspend(struct device *dev)
{
struct spi_controller *host = dev_get_drvdata(dev);
struct atcspi_dev *spi = spi_controller_get_devdata(host);
int ret;
spi_controller_suspend(host);
ret = spi_controller_suspend(host);
if (ret)
return ret;
clk_disable_unprepare(spi->clk);
+10 -10
View File
@@ -213,7 +213,7 @@ static void ax_spi_fill_tx_fifo(struct ax_spi *xspi)
}
/**
* ax_spi_get_rx_byte - Gets a byte from the RX FIFO buffer
* ax_spi_get_rx_byte_for_irq - Gets a byte from the RX FIFO buffer
* @xspi: Controller private data (struct ax_spi *)
*
* This function handles the logic of extracting bytes from the 32-bit RX FIFO.
@@ -246,9 +246,13 @@ static u8 ax_spi_get_rx_byte_for_irq(struct ax_spi *xspi)
}
/**
* ax_spi_process_rx_and_finalize - Process RX bytes and check for completion
* @ctlr: Pointer to spi_controller structure
*
* Helper function to process received bytes and check for transfer completion.
* This avoids code duplication and centralizes the completion logic.
* Returns true if the transfer was finalized.
*
* Return: true if the transfer was finalized.
*/
static bool ax_spi_process_rx_and_finalize(struct spi_controller *ctlr)
{
@@ -430,15 +434,11 @@ static int ax_transfer_one(struct spi_controller *ctlr,
/* TX mode: discard all received data */
xspi->rx_discard = transfer->len;
xspi->rx_copy_remaining = 0;
} else if ((!transfer->tx_buf && transfer->rx_buf) ||
(transfer->tx_buf && transfer->rx_buf)) {
/* RX mode: generate clock by filling TX FIFO with dummy bytes
* Full-duplex mode: generate clock by filling TX FIFO
*/
xspi->rx_discard = 0;
xspi->rx_copy_remaining = transfer->len;
} else {
/* No TX and RX */
/* RX-only or full-duplex mode: copy received data, with the
* clock generated by filling the TX FIFO (with dummy bytes
* in RX-only mode)
*/
xspi->rx_discard = 0;
xspi->rx_copy_remaining = transfer->len;
}
+3 -2
View File
@@ -98,9 +98,10 @@
* @regs: Virtual address of the SPI controller registers
* @ref_clk: Pointer to the peripheral clock
* @pclk: Pointer to the APB clock
* @clk_rate: Reference clock rate in Hz
* @speed_hz: Current SPI bus clock speed in Hz
* @txbuf: Pointer to the TX buffer
* @rxbuf: Pointer to the RX buffer
* @tx_buf: Pointer to the TX buffer
* @rx_buf: Pointer to the RX buffer
* @tx_bytes: Number of bytes left to transfer
* @rx_bytes: Number of bytes requested
* @tx_fifo_depth: Depth of the TX FIFO
+5 -1
View File
@@ -1692,13 +1692,17 @@ EXPORT_SYMBOL_GPL(bcm_qspi_remove);
static int __maybe_unused bcm_qspi_suspend(struct device *dev)
{
struct bcm_qspi *qspi = dev_get_drvdata(dev);
int ret;
/* store the override strap value */
if (!bcm_qspi_bspi_ver_three(qspi))
qspi->s3_strap_override_ctrl =
bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL);
spi_controller_suspend(qspi->host);
ret = spi_controller_suspend(qspi->host);
if (ret)
return ret;
clk_disable_unprepare(qspi->clk);
bcm_qspi_hw_uninit(qspi);
+1 -1
View File
@@ -1226,7 +1226,7 @@ static int bcm2835_spi_setup(struct spi_device *spi)
struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr);
struct bcm2835_spidev *target = spi_get_ctldata(spi);
struct gpiod_lookup_table *lookup __free(kfree) = NULL;
const char *pinctrl_compats[] = {
static const char * const pinctrl_compats[] = {
"brcm,bcm2835-gpio",
"brcm,bcm2711-gpio",
"brcm,bcm7211-gpio",
+5 -1
View File
@@ -889,8 +889,12 @@ static int bcm63xx_hsspi_suspend(struct device *dev)
{
struct spi_controller *host = dev_get_drvdata(dev);
struct bcm63xx_hsspi *bs = spi_controller_get_devdata(host);
int ret;
ret = spi_controller_suspend(host);
if (ret)
return ret;
spi_controller_suspend(host);
clk_disable_unprepare(bs->pll_clk);
clk_disable_unprepare(bs->clk);
+4 -1
View File
@@ -632,8 +632,11 @@ static int bcm63xx_spi_suspend(struct device *dev)
{
struct spi_controller *host = dev_get_drvdata(dev);
struct bcm63xx_spi *bs = spi_controller_get_devdata(host);
int ret;
spi_controller_suspend(host);
ret = spi_controller_suspend(host);
if (ret)
return ret;
clk_disable_unprepare(bs->clk);
+5 -1
View File
@@ -568,8 +568,12 @@ static int bcmbca_hsspi_suspend(struct device *dev)
{
struct spi_controller *host = dev_get_drvdata(dev);
struct bcmbca_hsspi *bs = spi_controller_get_devdata(host);
int ret;
ret = spi_controller_suspend(host);
if (ret)
return ret;
spi_controller_suspend(host);
clk_disable_unprepare(bs->pll_clk);
clk_disable_unprepare(bs->clk);
+3 -4
View File
@@ -928,7 +928,7 @@ static int davinci_spi_probe(struct platform_device *pdev)
int ret = 0;
u32 spipc0;
host = spi_alloc_host(&pdev->dev, sizeof(struct davinci_spi));
host = devm_spi_alloc_host(&pdev->dev, sizeof(struct davinci_spi));
if (host == NULL) {
ret = -ENOMEM;
goto err;
@@ -1057,7 +1057,6 @@ free_dma:
dma_release_channel(dspi->dma_tx);
}
free_host:
spi_controller_put(host);
err:
return ret;
}
@@ -1081,6 +1080,8 @@ static void davinci_spi_remove(struct platform_device *pdev)
spi_bitbang_stop(&dspi->bitbang);
devm_free_irq(&pdev->dev, dspi->irq, dspi);
/* This bit needs to be cleared to disable dpsi->clk */
clear_io_bits(dspi->base + SPIGCR1, SPIGCR1_POWERDOWN_MASK);
@@ -1088,8 +1089,6 @@ static void davinci_spi_remove(struct platform_device *pdev)
dma_release_channel(dspi->dma_rx);
dma_release_channel(dspi->dma_tx);
}
spi_controller_put(host);
}
static struct platform_driver davinci_spi_driver = {
+18 -3
View File
@@ -1464,10 +1464,18 @@ static int dspi_init(struct fsl_dspi *dspi)
static int dspi_suspend(struct device *dev)
{
struct fsl_dspi *dspi = dev_get_drvdata(dev);
int ret;
if (dspi->irq)
disable_irq(dspi->irq);
spi_controller_suspend(dspi->ctlr);
ret = spi_controller_suspend(dspi->ctlr);
if (ret) {
if (dspi->irq)
enable_irq(dspi->irq);
return ret;
}
clk_disable_unprepare(dspi->clk);
pinctrl_pm_select_sleep_state(dev);
@@ -1485,12 +1493,15 @@ static int dspi_resume(struct device *dev)
ret = clk_prepare_enable(dspi->clk);
if (ret)
return ret;
spi_controller_resume(dspi->ctlr);
ret = spi_controller_resume(dspi->ctlr);
if (ret)
goto disable_clk;
ret = dspi_init(dspi);
if (ret) {
dev_err(dev, "failed to initialize dspi during resume\n");
return ret;
goto disable_clk;
}
dspi_set_mtf(dspi);
@@ -1499,6 +1510,10 @@ static int dspi_resume(struct device *dev)
enable_irq(dspi->irq);
return 0;
disable_clk:
clk_disable_unprepare(dspi->clk);
return ret;
}
#endif /* CONFIG_PM_SLEEP */

Some files were not shown because too many files have changed in this diff Show More