lkml.org 
[lkml]   [2020]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.5 064/399] spi: fsl-lpspi: fix only one cs-gpio working
    Date
    From: Philippe Schenker <philippe.schenker@toradex.com>

    [ Upstream commit bc3a8b295e5bca9d1ec2622a6ba38289f9fd3d8a ]

    Why it does not work at the moment:
    - num_chipselect sets the number of cs-gpios that are in the DT.
    This comes from drivers/spi/spi.c
    - num_chipselect gets set with devm_spi_register_controller, that is
    called in drivers/spi/spi.c
    - devm_spi_register_controller got called after num_chipselect has
    been used.

    How this commit fixes the issue:
    - devm_spi_register_controller gets called before num_chipselect is
    being used.

    Fixes: c7a402599504 ("spi: lpspi: use the core way to implement cs-gpio function")
    Signed-off-by: Philippe Schenker <philippe.schenker@toradex.com>
    Link: https://lore.kernel.org/r/20191204141312.1411251-1-philippe.schenker@toradex.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/spi/spi-fsl-lpspi.c | 32 ++++++++++++++++----------------
    1 file changed, 16 insertions(+), 16 deletions(-)

    diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c
    index 2cc0ddb4a9889..1375bdfc587bf 100644
    --- a/drivers/spi/spi-fsl-lpspi.c
    +++ b/drivers/spi/spi-fsl-lpspi.c
    @@ -862,6 +862,22 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
    fsl_lpspi->dev = &pdev->dev;
    fsl_lpspi->is_slave = is_slave;

    + controller->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 32);
    + controller->transfer_one = fsl_lpspi_transfer_one;
    + controller->prepare_transfer_hardware = lpspi_prepare_xfer_hardware;
    + controller->unprepare_transfer_hardware = lpspi_unprepare_xfer_hardware;
    + controller->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
    + controller->flags = SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX;
    + controller->dev.of_node = pdev->dev.of_node;
    + controller->bus_num = pdev->id;
    + controller->slave_abort = fsl_lpspi_slave_abort;
    +
    + ret = devm_spi_register_controller(&pdev->dev, controller);
    + if (ret < 0) {
    + dev_err(&pdev->dev, "spi_register_controller error.\n");
    + goto out_controller_put;
    + }
    +
    if (!fsl_lpspi->is_slave) {
    for (i = 0; i < controller->num_chipselect; i++) {
    int cs_gpio = of_get_named_gpio(np, "cs-gpios", i);
    @@ -885,16 +901,6 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
    controller->prepare_message = fsl_lpspi_prepare_message;
    }

    - controller->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 32);
    - controller->transfer_one = fsl_lpspi_transfer_one;
    - controller->prepare_transfer_hardware = lpspi_prepare_xfer_hardware;
    - controller->unprepare_transfer_hardware = lpspi_unprepare_xfer_hardware;
    - controller->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
    - controller->flags = SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX;
    - controller->dev.of_node = pdev->dev.of_node;
    - controller->bus_num = pdev->id;
    - controller->slave_abort = fsl_lpspi_slave_abort;
    -
    init_completion(&fsl_lpspi->xfer_done);

    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    @@ -952,12 +958,6 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
    if (ret < 0)
    dev_err(&pdev->dev, "dma setup error %d, use pio\n", ret);

    - ret = devm_spi_register_controller(&pdev->dev, controller);
    - if (ret < 0) {
    - dev_err(&pdev->dev, "spi_register_controller error.\n");
    - goto out_controller_put;
    - }
    -
    return 0;

    out_controller_put:
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-02-21 09:49    [W:2.085 / U:1.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site