OSDN Git Service

Merge remote-tracking branches 'spi/topic/fsl-dspi', 'spi/topic/imx', 'spi/topic...
authorMark Brown <broonie@kernel.org>
Fri, 26 Jan 2018 17:57:27 +0000 (17:57 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 26 Jan 2018 17:57:27 +0000 (17:57 +0000)
1  2  3  4  5  6 
drivers/spi/spi-imx.c

diff --combined drivers/spi/spi-imx.c
@@@@@@@ -1523,25 -1523,25 -1523,16 -1523,25 -1523,25 -1523,25 +1523,25 @@@@@@@ static int spi_imx_probe(struct platfor
      
        spi_imx->devtype_data = devtype_data;
      
  +     /* Get number of chip selects, either platform data or OF */
        if (mxc_platform_info) {
                master->num_chipselect = mxc_platform_info->num_chipselect;
  -             master->cs_gpios = devm_kzalloc(&master->dev,
  -                     sizeof(int) * master->num_chipselect, GFP_KERNEL);
  -             if (!master->cs_gpios)
  -                     return -ENOMEM;
  +             if (mxc_platform_info->chipselect) {
  +                     master->cs_gpios = devm_kzalloc(&master->dev,
  +                             sizeof(int) * master->num_chipselect, GFP_KERNEL);
  +                     if (!master->cs_gpios)
  +                             return -ENOMEM;
  +   
  +                     for (i = 0; i < master->num_chipselect; i++)
  +                             master->cs_gpios[i] = mxc_platform_info->chipselect[i];
  +             }
  +     } else {
  +             u32 num_cs;
      
  -             for (i = 0; i < master->num_chipselect; i++)
  -                     master->cs_gpios[i] = mxc_platform_info->chipselect[i];
  -     }
  +             if (!of_property_read_u32(np, "num-cs", &num_cs))
  +                     master->num_chipselect = num_cs;
  +             /* If not preset, default value of 1 is used */
  +     }
      
        spi_imx->bitbang.chipselect = spi_imx_chipselect;
        spi_imx->bitbang.setup_transfer = spi_imx_setupxfer;
        spi_imx->devtype_data->intctrl(spi_imx, 0);
      
        master->dev.of_node = pdev->dev.of_node;
++ +++  ret = spi_bitbang_start(&spi_imx->bitbang);
++ +++  if (ret) {
++ +++          dev_err(&pdev->dev, "bitbang start failed with %d\n", ret);
++ +++          goto out_clk_put;
++ +++  }
      
  -     if (!spi_imx->slave_mode) {
  -             if (!master->cs_gpios) {
  -                     dev_err(&pdev->dev, "No CS GPIOs available\n");
  -                     ret = -EINVAL;
  -                     goto out_clk_put;
  -             }
  -   
  +     /* Request GPIO CS lines, if any */
  +     if (!spi_imx->slave_mode && master->cs_gpios) {
                for (i = 0; i < master->num_chipselect; i++) {
                        if (!gpio_is_valid(master->cs_gpios[i]))
                                continue;
                }
        }
      
-- ---  ret = spi_bitbang_start(&spi_imx->bitbang);
-- ---  if (ret) {
-- ---          dev_err(&pdev->dev, "bitbang start failed with %d\n", ret);
-- ---          goto out_clk_put;
-- ---  }
-- ---
        dev_info(&pdev->dev, "probed\n");
      
        clk_disable(spi_imx->clk_ipg);
@@@@@@@ -1668,23 -1668,12 -1663,12 -1668,12 -1668,12 -1668,12 +1667,23 @@@@@@@ static int spi_imx_remove(struct platfo
      {
        struct spi_master *master = platform_get_drvdata(pdev);
        struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
 +++++  int ret;
      
        spi_bitbang_stop(&spi_imx->bitbang);
      
 +++++  ret = clk_enable(spi_imx->clk_per);
 +++++  if (ret)
 +++++          return ret;
 +++++
 +++++  ret = clk_enable(spi_imx->clk_ipg);
 +++++  if (ret) {
 +++++          clk_disable(spi_imx->clk_per);
 +++++          return ret;
 +++++  }
 +++++
        writel(0, spi_imx->base + MXC_CSPICTRL);
 -----  clk_unprepare(spi_imx->clk_ipg);
 -----  clk_unprepare(spi_imx->clk_per);
 +++++  clk_disable_unprepare(spi_imx->clk_ipg);
 +++++  clk_disable_unprepare(spi_imx->clk_per);
        spi_imx_sdma_exit(spi_imx);
        spi_master_put(master);