These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / spi / spi-ath79.c
index b02eb4a..6165bf2 100644 (file)
@@ -79,10 +79,8 @@ static void ath79_spi_chipselect(struct spi_device *spi, int is_active)
        }
 
        if (spi->chip_select) {
-               struct ath79_spi_controller_data *cdata = spi->controller_data;
-
                /* SPI is normally active-low */
-               gpio_set_value(cdata->gpio, cs_high);
+               gpio_set_value(spi->cs_gpio, cs_high);
        } else {
                if (cs_high)
                        sp->ioc_base |= AR71XX_SPI_IOC_CS0;
@@ -117,11 +115,10 @@ static void ath79_spi_disable(struct ath79_spi *sp)
 
 static int ath79_spi_setup_cs(struct spi_device *spi)
 {
-       struct ath79_spi_controller_data *cdata;
+       struct ath79_spi *sp = ath79_spidev_to_sp(spi);
        int status;
 
-       cdata = spi->controller_data;
-       if (spi->chip_select && !cdata)
+       if (spi->chip_select && !gpio_is_valid(spi->cs_gpio))
                return -EINVAL;
 
        status = 0;
@@ -134,8 +131,15 @@ static int ath79_spi_setup_cs(struct spi_device *spi)
                else
                        flags |= GPIOF_INIT_HIGH;
 
-               status = gpio_request_one(cdata->gpio, flags,
+               status = gpio_request_one(spi->cs_gpio, flags,
                                          dev_name(&spi->dev));
+       } else {
+               if (spi->mode & SPI_CS_HIGH)
+                       sp->ioc_base &= ~AR71XX_SPI_IOC_CS0;
+               else
+                       sp->ioc_base |= AR71XX_SPI_IOC_CS0;
+
+               ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
        }
 
        return status;
@@ -144,8 +148,7 @@ static int ath79_spi_setup_cs(struct spi_device *spi)
 static void ath79_spi_cleanup_cs(struct spi_device *spi)
 {
        if (spi->chip_select) {
-               struct ath79_spi_controller_data *cdata = spi->controller_data;
-               gpio_free(cdata->gpio);
+               gpio_free(spi->cs_gpio);
        }
 }
 
@@ -217,6 +220,7 @@ static int ath79_spi_probe(struct platform_device *pdev)
        }
 
        sp = spi_master_get_devdata(master);
+       master->dev.of_node = pdev->dev.of_node;
        platform_set_drvdata(pdev, sp);
 
        pdata = dev_get_platdata(&pdev->dev);
@@ -236,14 +240,9 @@ static int ath79_spi_probe(struct platform_device *pdev)
        sp->bitbang.flags = SPI_CS_HIGH;
 
        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (r == NULL) {
-               ret = -ENOENT;
-               goto err_put_master;
-       }
-
-       sp->base = devm_ioremap(&pdev->dev, r->start, resource_size(r));
-       if (!sp->base) {
-               ret = -ENXIO;
+       sp->base = devm_ioremap_resource(&pdev->dev, r);
+       if (IS_ERR(sp->base)) {
+               ret = PTR_ERR(sp->base);
                goto err_put_master;
        }
 
@@ -253,7 +252,7 @@ static int ath79_spi_probe(struct platform_device *pdev)
                goto err_put_master;
        }
 
-       ret = clk_enable(sp->clk);
+       ret = clk_prepare_enable(sp->clk);
        if (ret)
                goto err_put_master;
 
@@ -277,7 +276,7 @@ static int ath79_spi_probe(struct platform_device *pdev)
 err_disable:
        ath79_spi_disable(sp);
 err_clk_disable:
-       clk_disable(sp->clk);
+       clk_disable_unprepare(sp->clk);
 err_put_master:
        spi_master_put(sp->bitbang.master);
 
@@ -290,7 +289,7 @@ static int ath79_spi_remove(struct platform_device *pdev)
 
        spi_bitbang_stop(&sp->bitbang);
        ath79_spi_disable(sp);
-       clk_disable(sp->clk);
+       clk_disable_unprepare(sp->clk);
        spi_master_put(sp->bitbang.master);
 
        return 0;
@@ -301,12 +300,18 @@ static void ath79_spi_shutdown(struct platform_device *pdev)
        ath79_spi_remove(pdev);
 }
 
+static const struct of_device_id ath79_spi_of_match[] = {
+       { .compatible = "qca,ar7100-spi", },
+       { },
+};
+
 static struct platform_driver ath79_spi_driver = {
        .probe          = ath79_spi_probe,
        .remove         = ath79_spi_remove,
        .shutdown       = ath79_spi_shutdown,
        .driver         = {
                .name   = DRV_NAME,
+               .of_match_table = ath79_spi_of_match,
        },
 };
 module_platform_driver(ath79_spi_driver);