ar71xx: build ALFA AP96 images with default profile as well
[oweals/openwrt.git] / target / linux / ar71xx / files / drivers / spi / ar71xx_spi.c
index ac60170ebf8f148462eb0b9d828979dcc88b719f..d1ed731c143b6fc35af4d8d008e30ac713e46460 100644 (file)
 #undef PER_BIT_READ
 
 struct ar71xx_spi {
-       struct  spi_bitbang     bitbang;
+       struct  spi_bitbang     bitbang;
        u32                     ioc_base;
        u32                     reg_ctrl;
 
-       void __iomem            *base;
+       void __iomem            *base;
 
        struct platform_device  *pdev;
        u32                     (*get_ioc_base)(u8 chip_select, int cs_high,
@@ -94,10 +94,8 @@ static void ar71xx_spi_chipselect(struct spi_device *spi, int value)
        }
 }
 
-static void ar71xx_spi_setup_regs(struct spi_device *spi)
+static void ar71xx_spi_setup_regs(struct ar71xx_spi *sp)
 {
-       struct ar71xx_spi *sp = spidev_to_sp(spi);
-
        /* enable GPIO mode */
        ar71xx_spi_wr(sp, SPI_REG_FS, SPI_FS_GPIO);
 
@@ -108,10 +106,8 @@ static void ar71xx_spi_setup_regs(struct spi_device *spi)
        ar71xx_spi_wr(sp, SPI_REG_CTRL, 0x43);
 }
 
-static void ar71xx_spi_restore_regs(struct spi_device *spi)
+static void ar71xx_spi_restore_regs(struct ar71xx_spi *sp)
 {
-       struct ar71xx_spi *sp = spidev_to_sp(spi);
-
        /* restore CTRL register */
        ar71xx_spi_wr(sp, SPI_REG_CTRL, sp->reg_ctrl);
        /* disable GPIO mode */
@@ -120,24 +116,14 @@ static void ar71xx_spi_restore_regs(struct spi_device *spi)
 
 static int ar71xx_spi_setup(struct spi_device *spi)
 {
-       int status;
-
        if (spi->bits_per_word > 32)
                return -EINVAL;
 
-       if (!spi->controller_state)
-               ar71xx_spi_setup_regs(spi);
-
-       status = spi_bitbang_setup(spi);
-       if (status && !spi->controller_state)
-               ar71xx_spi_restore_regs(spi);
-
-       return status;
+       return spi_bitbang_setup(spi);
 }
 
 static void ar71xx_spi_cleanup(struct spi_device *spi)
 {
-       ar71xx_spi_restore_regs(spi);
        spi_bitbang_cleanup(spi);
 }
 
@@ -229,12 +215,15 @@ static int ar71xx_spi_probe(struct platform_device *pdev)
                goto err1;
        }
 
+       ar71xx_spi_setup_regs(sp);
+
        ret = spi_bitbang_start(&sp->bitbang);
        if (!ret)
                return 0;
 
+       ar71xx_spi_restore_regs(sp);
        iounmap(sp->base);
- err1:
+err1:
        platform_set_drvdata(pdev, NULL);
        spi_master_put(sp->bitbang.master);
 
@@ -246,6 +235,7 @@ static int ar71xx_spi_remove(struct platform_device *pdev)
        struct ar71xx_spi *sp = platform_get_drvdata(pdev);
 
        spi_bitbang_stop(&sp->bitbang);
+       ar71xx_spi_restore_regs(sp);
        iounmap(sp->base);
        platform_set_drvdata(pdev, NULL);
        spi_master_put(sp->bitbang.master);
@@ -253,9 +243,19 @@ static int ar71xx_spi_remove(struct platform_device *pdev)
        return 0;
 }
 
+static void ar71xx_spi_shutdown(struct platform_device *pdev)
+{
+       int ret;
+
+       ret = ar71xx_spi_remove(pdev);
+       if (ret)
+               dev_err(&pdev->dev, "shutdown failed with %d\n", ret);
+}
+
 static struct platform_driver ar71xx_spi_drv = {
        .probe          = ar71xx_spi_probe,
        .remove         = ar71xx_spi_remove,
+       .shutdown       = ar71xx_spi_shutdown,
        .driver         = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,