lkml.org 
[lkml]   [2020]   [Aug]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v12 08/12] spi: imx: remove ERR009165 workaround on i.mx6ul
    Date
    ERR009165 fixed on i.mx6ul/6ull/6sll. All other i.mx6/7 and
    i.mx8m/8mm still need this errata. Please refer to nxp official
    errata document from https://www.nxp.com/ .

    For removing workaround on those chips. Add new i.mx6ul type.

    Signed-off-by: Robin Gong <yibin.gong@nxp.com>
    Acked-by: Mark Brown <broonie@kernel.org>
    ---
    drivers/spi/spi-imx.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++----
    1 file changed, 46 insertions(+), 4 deletions(-)

    diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
    index 873be5e..f3049c7 100644
    --- a/drivers/spi/spi-imx.c
    +++ b/drivers/spi/spi-imx.c
    @@ -57,6 +57,7 @@ enum spi_imx_devtype {
    IMX35_CSPI, /* CSPI on all i.mx except above */
    IMX51_ECSPI, /* ECSPI on i.mx51 */
    IMX53_ECSPI, /* ECSPI on i.mx53 and later */
    + IMX6UL_ECSPI, /* ERR009165 fix from i.mx6ul */
    };

    struct spi_imx_data;
    @@ -76,6 +77,11 @@ struct spi_imx_devtype_data {
    bool has_slavemode;
    unsigned int fifo_size;
    bool dynamic_burst;
    + /*
    + * ERR009165 fixed or not:
    + * https://www.nxp.com/docs/en/errata/IMX6DQCE.pdf
    + */
    + bool tx_glitch_fixed;
    enum spi_imx_devtype devtype;
    };

    @@ -132,6 +138,11 @@ static inline int is_imx51_ecspi(struct spi_imx_data *d)
    return d->devtype_data->devtype == IMX51_ECSPI;
    }

    +static inline int is_imx6ul_ecspi(struct spi_imx_data *d)
    +{
    + return d->devtype_data->devtype == IMX6UL_ECSPI;
    +}
    +
    static inline int is_imx53_ecspi(struct spi_imx_data *d)
    {
    return d->devtype_data->devtype == IMX53_ECSPI;
    @@ -591,8 +602,14 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
    ctrl |= mx51_ecspi_clkdiv(spi_imx, t->speed_hz, &clk);
    spi_imx->spi_bus_clk = clk;

    - /* ERR009165: work in XHC mode as PIO */
    - ctrl &= ~MX51_ECSPI_CTRL_SMC;
    + /*
    + * ERR009165: work in XHC mode instead of SMC as PIO on the chips
    + * before i.mx6ul.
    + */
    + if (spi_imx->usedma && spi_imx->devtype_data->tx_glitch_fixed)
    + ctrl |= MX51_ECSPI_CTRL_SMC;
    + else
    + ctrl &= ~MX51_ECSPI_CTRL_SMC;

    writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL);

    @@ -618,12 +635,16 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,

    static void mx51_setup_wml(struct spi_imx_data *spi_imx)
    {
    + u32 tx_wml = 0;
    +
    + if (spi_imx->devtype_data->tx_glitch_fixed)
    + tx_wml = spi_imx->wml;
    /*
    * Configure the DMA register: setup the watermark
    * and enable DMA request.
    */
    writel(MX51_ECSPI_DMA_RX_WML(spi_imx->wml - 1) |
    - MX51_ECSPI_DMA_TX_WML(0) |
    + MX51_ECSPI_DMA_TX_WML(tx_wml) |
    MX51_ECSPI_DMA_RXT_WML(spi_imx->wml) |
    MX51_ECSPI_DMA_TEDEN | MX51_ECSPI_DMA_RXDEN |
    MX51_ECSPI_DMA_RXTDEN, spi_imx->base + MX51_ECSPI_DMA);
    @@ -1017,6 +1038,23 @@ static struct spi_imx_devtype_data imx53_ecspi_devtype_data = {
    .devtype = IMX53_ECSPI,
    };

    +static struct spi_imx_devtype_data imx6ul_ecspi_devtype_data = {
    + .intctrl = mx51_ecspi_intctrl,
    + .prepare_message = mx51_ecspi_prepare_message,
    + .prepare_transfer = mx51_ecspi_prepare_transfer,
    + .trigger = mx51_ecspi_trigger,
    + .rx_available = mx51_ecspi_rx_available,
    + .reset = mx51_ecspi_reset,
    + .setup_wml = mx51_setup_wml,
    + .fifo_size = 64,
    + .has_dmamode = true,
    + .dynamic_burst = true,
    + .has_slavemode = true,
    + .tx_glitch_fixed = true,
    + .disable = mx51_ecspi_disable,
    + .devtype = IMX6UL_ECSPI,
    +};
    +
    static const struct platform_device_id spi_imx_devtype[] = {
    {
    .name = "imx1-cspi",
    @@ -1040,6 +1078,9 @@ static const struct platform_device_id spi_imx_devtype[] = {
    .name = "imx53-ecspi",
    .driver_data = (kernel_ulong_t) &imx53_ecspi_devtype_data,
    }, {
    + .name = "imx6ul-ecspi",
    + .driver_data = (kernel_ulong_t) &imx6ul_ecspi_devtype_data,
    + }, {
    /* sentinel */
    }
    };
    @@ -1052,6 +1093,7 @@ static const struct of_device_id spi_imx_dt_ids[] = {
    { .compatible = "fsl,imx35-cspi", .data = &imx35_cspi_devtype_data, },
    { .compatible = "fsl,imx51-ecspi", .data = &imx51_ecspi_devtype_data, },
    { .compatible = "fsl,imx53-ecspi", .data = &imx53_ecspi_devtype_data, },
    + { .compatible = "fsl,imx6ul-ecspi", .data = &imx6ul_ecspi_devtype_data, },
    { /* sentinel */ }
    };
    MODULE_DEVICE_TABLE(of, spi_imx_dt_ids);
    @@ -1671,7 +1713,7 @@ static int spi_imx_probe(struct platform_device *pdev)
    spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \
    | SPI_NO_CS;
    if (is_imx35_cspi(spi_imx) || is_imx51_ecspi(spi_imx) ||
    - is_imx53_ecspi(spi_imx))
    + is_imx53_ecspi(spi_imx) || is_imx6ul_ecspi(spi_imx))
    spi_imx->bitbang.master->mode_bits |= SPI_LOOP | SPI_READY;

    spi_imx->spi_drctl = spi_drctl;
    --
    2.7.4
    \
     
     \ /
      Last update: 2020-08-11 09:41    [W:3.089 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site