Commit 2b60d727 authored by Mark Brown's avatar Mark Brown

Merge branch 'for-5.4' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi into spi-5.5

parents d6b71dfa f6910679
...@@ -938,7 +938,7 @@ static int fsl_lpspi_probe(struct platform_device *pdev) ...@@ -938,7 +938,7 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
ret = pm_runtime_get_sync(fsl_lpspi->dev); ret = pm_runtime_get_sync(fsl_lpspi->dev);
if (ret < 0) { if (ret < 0) {
dev_err(fsl_lpspi->dev, "failed to enable clock\n"); dev_err(fsl_lpspi->dev, "failed to enable clock\n");
return ret; goto out_controller_put;
} }
temp = readl(fsl_lpspi->base + IMX7ULP_PARAM); temp = readl(fsl_lpspi->base + IMX7ULP_PARAM);
......
...@@ -63,6 +63,11 @@ ...@@ -63,6 +63,11 @@
#define QUADSPI_IPCR 0x08 #define QUADSPI_IPCR 0x08
#define QUADSPI_IPCR_SEQID(x) ((x) << 24) #define QUADSPI_IPCR_SEQID(x) ((x) << 24)
#define QUADSPI_FLSHCR 0x0c
#define QUADSPI_FLSHCR_TCSS_MASK GENMASK(3, 0)
#define QUADSPI_FLSHCR_TCSH_MASK GENMASK(11, 8)
#define QUADSPI_FLSHCR_TDH_MASK GENMASK(17, 16)
#define QUADSPI_BUF0CR 0x10 #define QUADSPI_BUF0CR 0x10
#define QUADSPI_BUF1CR 0x14 #define QUADSPI_BUF1CR 0x14
#define QUADSPI_BUF2CR 0x18 #define QUADSPI_BUF2CR 0x18
...@@ -100,6 +105,9 @@ ...@@ -100,6 +105,9 @@
#define QUADSPI_FR 0x160 #define QUADSPI_FR 0x160
#define QUADSPI_FR_TFF_MASK BIT(0) #define QUADSPI_FR_TFF_MASK BIT(0)
#define QUADSPI_RSER 0x164
#define QUADSPI_RSER_TFIE BIT(0)
#define QUADSPI_SPTRCLR 0x16c #define QUADSPI_SPTRCLR 0x16c
#define QUADSPI_SPTRCLR_IPPTRC BIT(8) #define QUADSPI_SPTRCLR_IPPTRC BIT(8)
#define QUADSPI_SPTRCLR_BFPTRC BIT(0) #define QUADSPI_SPTRCLR_BFPTRC BIT(0)
...@@ -117,9 +125,6 @@ ...@@ -117,9 +125,6 @@
#define QUADSPI_LCKER_LOCK BIT(0) #define QUADSPI_LCKER_LOCK BIT(0)
#define QUADSPI_LCKER_UNLOCK BIT(1) #define QUADSPI_LCKER_UNLOCK BIT(1)
#define QUADSPI_RSER 0x164
#define QUADSPI_RSER_TFIE BIT(0)
#define QUADSPI_LUT_BASE 0x310 #define QUADSPI_LUT_BASE 0x310
#define QUADSPI_LUT_OFFSET (SEQID_LUT * 4 * 4) #define QUADSPI_LUT_OFFSET (SEQID_LUT * 4 * 4)
#define QUADSPI_LUT_REG(idx) \ #define QUADSPI_LUT_REG(idx) \
...@@ -186,6 +191,12 @@ ...@@ -186,6 +191,12 @@
*/ */
#define QUADSPI_QUIRK_BASE_INTERNAL BIT(4) #define QUADSPI_QUIRK_BASE_INTERNAL BIT(4)
/*
* Controller uses TDH bits in register QUADSPI_FLSHCR.
* They need to be set in accordance with the DDR/SDR mode.
*/
#define QUADSPI_QUIRK_USE_TDH_SETTING BIT(5)
struct fsl_qspi_devtype_data { struct fsl_qspi_devtype_data {
unsigned int rxfifo; unsigned int rxfifo;
unsigned int txfifo; unsigned int txfifo;
...@@ -218,7 +229,8 @@ static const struct fsl_qspi_devtype_data imx7d_data = { ...@@ -218,7 +229,8 @@ static const struct fsl_qspi_devtype_data imx7d_data = {
.txfifo = SZ_512, .txfifo = SZ_512,
.invalid_mstrid = QUADSPI_BUFXCR_INVALID_MSTRID, .invalid_mstrid = QUADSPI_BUFXCR_INVALID_MSTRID,
.ahb_buf_size = SZ_1K, .ahb_buf_size = SZ_1K,
.quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_4X_INT_CLK, .quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_4X_INT_CLK |
QUADSPI_QUIRK_USE_TDH_SETTING,
.little_endian = true, .little_endian = true,
}; };
...@@ -227,7 +239,8 @@ static const struct fsl_qspi_devtype_data imx6ul_data = { ...@@ -227,7 +239,8 @@ static const struct fsl_qspi_devtype_data imx6ul_data = {
.txfifo = SZ_512, .txfifo = SZ_512,
.invalid_mstrid = QUADSPI_BUFXCR_INVALID_MSTRID, .invalid_mstrid = QUADSPI_BUFXCR_INVALID_MSTRID,
.ahb_buf_size = SZ_1K, .ahb_buf_size = SZ_1K,
.quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_4X_INT_CLK, .quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_4X_INT_CLK |
QUADSPI_QUIRK_USE_TDH_SETTING,
.little_endian = true, .little_endian = true,
}; };
...@@ -287,6 +300,11 @@ static inline int needs_amba_base_offset(struct fsl_qspi *q) ...@@ -287,6 +300,11 @@ static inline int needs_amba_base_offset(struct fsl_qspi *q)
return !(q->devtype_data->quirks & QUADSPI_QUIRK_BASE_INTERNAL); return !(q->devtype_data->quirks & QUADSPI_QUIRK_BASE_INTERNAL);
} }
static inline int needs_tdh_setting(struct fsl_qspi *q)
{
return q->devtype_data->quirks & QUADSPI_QUIRK_USE_TDH_SETTING;
}
/* /*
* An IC bug makes it necessary to rearrange the 32-bit data. * An IC bug makes it necessary to rearrange the 32-bit data.
* Later chips, such as IMX6SLX, have fixed this bug. * Later chips, such as IMX6SLX, have fixed this bug.
...@@ -727,6 +745,16 @@ static int fsl_qspi_default_setup(struct fsl_qspi *q) ...@@ -727,6 +745,16 @@ static int fsl_qspi_default_setup(struct fsl_qspi *q)
qspi_writel(q, QUADSPI_MCR_MDIS_MASK | QUADSPI_MCR_RESERVED_MASK, qspi_writel(q, QUADSPI_MCR_MDIS_MASK | QUADSPI_MCR_RESERVED_MASK,
base + QUADSPI_MCR); base + QUADSPI_MCR);
/*
* Previous boot stages (BootROM, bootloader) might have used DDR
* mode and did not clear the TDH bits. As we currently use SDR mode
* only, clear the TDH bits if necessary.
*/
if (needs_tdh_setting(q))
qspi_writel(q, qspi_readl(q, base + QUADSPI_FLSHCR) &
~QUADSPI_FLSHCR_TDH_MASK,
base + QUADSPI_FLSHCR);
reg = qspi_readl(q, base + QUADSPI_SMPR); reg = qspi_readl(q, base + QUADSPI_SMPR);
qspi_writel(q, reg & ~(QUADSPI_SMPR_FSDLY_MASK qspi_writel(q, reg & ~(QUADSPI_SMPR_FSDLY_MASK
| QUADSPI_SMPR_FSPHS_MASK | QUADSPI_SMPR_FSPHS_MASK
......
...@@ -368,8 +368,10 @@ static int spi_gpio_probe(struct platform_device *pdev) ...@@ -368,8 +368,10 @@ static int spi_gpio_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
status = devm_add_action_or_reset(&pdev->dev, spi_gpio_put, master); status = devm_add_action_or_reset(&pdev->dev, spi_gpio_put, master);
if (status) if (status) {
spi_master_put(master);
return status; return status;
}
if (pdev->dev.of_node) if (pdev->dev.of_node)
status = spi_gpio_probe_dt(pdev, master); status = spi_gpio_probe_dt(pdev, master);
......
...@@ -145,8 +145,8 @@ ...@@ -145,8 +145,8 @@
#define LWR_SUSP_CTRL_EN BIT(31) #define LWR_SUSP_CTRL_EN BIT(31)
#define DMAS_CTRL 0x9c #define DMAS_CTRL 0x9c
#define DMAS_CTRL_DIR_READ BIT(31) #define DMAS_CTRL_EN BIT(31)
#define DMAS_CTRL_EN BIT(30) #define DMAS_CTRL_DIR_READ BIT(30)
#define DATA_STROB 0xa0 #define DATA_STROB 0xa0
#define DATA_STROB_EDO_EN BIT(2) #define DATA_STROB_EDO_EN BIT(2)
...@@ -275,7 +275,7 @@ static void mxic_spi_hw_init(struct mxic_spi *mxic) ...@@ -275,7 +275,7 @@ static void mxic_spi_hw_init(struct mxic_spi *mxic)
writel(0, mxic->regs + HC_EN); writel(0, mxic->regs + HC_EN);
writel(0, mxic->regs + LRD_CFG); writel(0, mxic->regs + LRD_CFG);
writel(0, mxic->regs + LRD_CTRL); writel(0, mxic->regs + LRD_CTRL);
writel(HC_CFG_NIO(1) | HC_CFG_TYPE(0, HC_CFG_TYPE_SPI_NAND) | writel(HC_CFG_NIO(1) | HC_CFG_TYPE(0, HC_CFG_TYPE_SPI_NOR) |
HC_CFG_SLV_ACT(0) | HC_CFG_MAN_CS_EN | HC_CFG_IDLE_SIO_LVL(1), HC_CFG_SLV_ACT(0) | HC_CFG_MAN_CS_EN | HC_CFG_IDLE_SIO_LVL(1),
mxic->regs + HC_CFG); mxic->regs + HC_CFG);
} }
......
...@@ -772,9 +772,6 @@ static int orion_spi_probe(struct platform_device *pdev) ...@@ -772,9 +772,6 @@ static int orion_spi_probe(struct platform_device *pdev)
if (status < 0) if (status < 0)
goto out_rel_pm; goto out_rel_pm;
pm_runtime_mark_last_busy(&pdev->dev);
pm_runtime_put_autosuspend(&pdev->dev);
master->dev.of_node = pdev->dev.of_node; master->dev.of_node = pdev->dev.of_node;
status = spi_register_master(master); status = spi_register_master(master);
if (status < 0) if (status < 0)
......
...@@ -528,7 +528,6 @@ static void stm32_qspi_release(struct stm32_qspi *qspi) ...@@ -528,7 +528,6 @@ static void stm32_qspi_release(struct stm32_qspi *qspi)
stm32_qspi_dma_free(qspi); stm32_qspi_dma_free(qspi);
mutex_destroy(&qspi->lock); mutex_destroy(&qspi->lock);
clk_disable_unprepare(qspi->clk); clk_disable_unprepare(qspi->clk);
spi_master_put(qspi->ctrl);
} }
static int stm32_qspi_probe(struct platform_device *pdev) static int stm32_qspi_probe(struct platform_device *pdev)
...@@ -626,6 +625,8 @@ static int stm32_qspi_probe(struct platform_device *pdev) ...@@ -626,6 +625,8 @@ static int stm32_qspi_probe(struct platform_device *pdev)
err: err:
stm32_qspi_release(qspi); stm32_qspi_release(qspi);
spi_master_put(qspi->ctrl);
return ret; return ret;
} }
......
...@@ -627,6 +627,9 @@ static int spidev_release(struct inode *inode, struct file *filp) ...@@ -627,6 +627,9 @@ static int spidev_release(struct inode *inode, struct file *filp)
if (dofree) if (dofree)
kfree(spidev); kfree(spidev);
} }
#ifdef CONFIG_SPI_SLAVE
spi_slave_abort(spidev->spi);
#endif
mutex_unlock(&device_list_lock); mutex_unlock(&device_list_lock);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment