USB: belkin_sa: minor clean-ups
[safe/jmp/linux-2.6] / drivers / spi / spi_s3c64xx.c
index 88a456d..9736581 100644 (file)
@@ -28,7 +28,7 @@
 #include <linux/spi/spi.h>
 
 #include <mach/dma.h>
-#include <plat/spi.h>
+#include <plat/s3c64xx-spi.h>
 
 /* Registers and bit-fields */
 
 /**
  * struct s3c64xx_spi_driver_data - Runtime info holder for SPI driver.
  * @clk: Pointer to the spi clock.
+ * @src_clk: Pointer to the clock used to generate SPI signals.
  * @master: Pointer to the SPI Protocol master.
  * @workqueue: Work queue for the SPI xfer requests.
  * @cntrlr_info: Platform specific data for the controller this driver manages.
 struct s3c64xx_spi_driver_data {
        void __iomem                    *regs;
        struct clk                      *clk;
+       struct clk                      *src_clk;
        struct platform_device          *pdev;
        struct spi_master               *master;
        struct workqueue_struct         *workqueue;
-       struct s3c64xx_spi_cntrlr_info  *cntrlr_info;
+       struct s3c64xx_spi_info  *cntrlr_info;
        struct spi_device               *tgl_spi;
        struct work_struct              work;
        struct list_head                queue;
@@ -180,7 +182,7 @@ static struct s3c2410_dma_client s3c64xx_spi_dma_client = {
 
 static void flush_fifo(struct s3c64xx_spi_driver_data *sdd)
 {
-       struct s3c64xx_spi_cntrlr_info *sci = sdd->cntrlr_info;
+       struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
        void __iomem *regs = sdd->regs;
        unsigned long loops;
        u32 val;
@@ -225,7 +227,7 @@ static void enable_datapath(struct s3c64xx_spi_driver_data *sdd,
                                struct spi_device *spi,
                                struct spi_transfer *xfer, int dma_mode)
 {
-       struct s3c64xx_spi_cntrlr_info *sci = sdd->cntrlr_info;
+       struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
        void __iomem *regs = sdd->regs;
        u32 modecfg, chcfg;
 
@@ -298,19 +300,20 @@ static inline void enable_cs(struct s3c64xx_spi_driver_data *sdd,
                if (sdd->tgl_spi != spi) { /* if last mssg on diff device */
                        /* Deselect the last toggled device */
                        cs = sdd->tgl_spi->controller_data;
-                       cs->set_level(spi->mode & SPI_CS_HIGH ? 0 : 1);
+                       cs->set_level(cs->line,
+                                       spi->mode & SPI_CS_HIGH ? 0 : 1);
                }
                sdd->tgl_spi = NULL;
        }
 
        cs = spi->controller_data;
-       cs->set_level(spi->mode & SPI_CS_HIGH ? 1 : 0);
+       cs->set_level(cs->line, spi->mode & SPI_CS_HIGH ? 1 : 0);
 }
 
 static int wait_for_xfer(struct s3c64xx_spi_driver_data *sdd,
                                struct spi_transfer *xfer, int dma_mode)
 {
-       struct s3c64xx_spi_cntrlr_info *sci = sdd->cntrlr_info;
+       struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
        void __iomem *regs = sdd->regs;
        unsigned long val;
        int ms;
@@ -384,12 +387,11 @@ static inline void disable_cs(struct s3c64xx_spi_driver_data *sdd,
        if (sdd->tgl_spi == spi)
                sdd->tgl_spi = NULL;
 
-       cs->set_level(spi->mode & SPI_CS_HIGH ? 0 : 1);
+       cs->set_level(cs->line, spi->mode & SPI_CS_HIGH ? 0 : 1);
 }
 
 static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd)
 {
-       struct s3c64xx_spi_cntrlr_info *sci = sdd->cntrlr_info;
        void __iomem *regs = sdd->regs;
        u32 val;
 
@@ -435,7 +437,7 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd)
        /* Configure Clock */
        val = readl(regs + S3C64XX_SPI_CLK_CFG);
        val &= ~S3C64XX_SPI_PSR_MASK;
-       val |= ((clk_get_rate(sci->src_clk) / sdd->cur_speed / 2 - 1)
+       val |= ((clk_get_rate(sdd->src_clk) / sdd->cur_speed / 2 - 1)
                        & S3C64XX_SPI_PSR_MASK);
        writel(val, regs + S3C64XX_SPI_CLK_CFG);
 
@@ -558,7 +560,7 @@ static void s3c64xx_spi_unmap_mssg(struct s3c64xx_spi_driver_data *sdd,
 static void handle_msg(struct s3c64xx_spi_driver_data *sdd,
                                        struct spi_message *msg)
 {
-       struct s3c64xx_spi_cntrlr_info *sci = sdd->cntrlr_info;
+       struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
        struct spi_device *spi = msg->spi;
        struct s3c64xx_spi_csinfo *cs = spi->controller_data;
        struct spi_transfer *xfer;
@@ -632,8 +634,8 @@ static void handle_msg(struct s3c64xx_spi_driver_data *sdd,
                S3C64XX_SPI_DEACT(sdd);
 
                if (status) {
-                       dev_err(&spi->dev, "I/O Error: \
-                               rx-%d tx-%d res:rx-%c tx-%c len-%d\n",
+                       dev_err(&spi->dev, "I/O Error: "
+                               "rx-%d tx-%d res:rx-%c tx-%c len-%d\n",
                                xfer->rx_buf ? 1 : 0, xfer->tx_buf ? 1 : 0,
                                (sdd->state & RXBUSY) ? 'f' : 'p',
                                (sdd->state & TXBUSY) ? 'f' : 'p',
@@ -786,7 +788,7 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
 {
        struct s3c64xx_spi_csinfo *cs = spi->controller_data;
        struct s3c64xx_spi_driver_data *sdd;
-       struct s3c64xx_spi_cntrlr_info *sci;
+       struct s3c64xx_spi_info *sci;
        struct spi_message *msg;
        u32 psr, speed;
        unsigned long flags;
@@ -831,17 +833,17 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
        }
 
        /* Check if we can provide the requested rate */
-       speed = clk_get_rate(sci->src_clk) / 2 / (0 + 1); /* Max possible */
+       speed = clk_get_rate(sdd->src_clk) / 2 / (0 + 1); /* Max possible */
 
        if (spi->max_speed_hz > speed)
                spi->max_speed_hz = speed;
 
-       psr = clk_get_rate(sci->src_clk) / 2 / spi->max_speed_hz - 1;
+       psr = clk_get_rate(sdd->src_clk) / 2 / spi->max_speed_hz - 1;
        psr &= S3C64XX_SPI_PSR_MASK;
        if (psr == S3C64XX_SPI_PSR_MASK)
                psr--;
 
-       speed = clk_get_rate(sci->src_clk) / 2 / (psr + 1);
+       speed = clk_get_rate(sdd->src_clk) / 2 / (psr + 1);
        if (spi->max_speed_hz < speed) {
                if (psr+1 < S3C64XX_SPI_PSR_MASK) {
                        psr++;
@@ -851,7 +853,7 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
                }
        }
 
-       speed = clk_get_rate(sci->src_clk) / 2 / (psr + 1);
+       speed = clk_get_rate(sdd->src_clk) / 2 / (psr + 1);
        if (spi->max_speed_hz >= speed)
                spi->max_speed_hz = speed;
        else
@@ -867,7 +869,7 @@ setup_exit:
 
 static void s3c64xx_spi_hwinit(struct s3c64xx_spi_driver_data *sdd, int channel)
 {
-       struct s3c64xx_spi_cntrlr_info *sci = sdd->cntrlr_info;
+       struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
        void __iomem *regs = sdd->regs;
        unsigned int val;
 
@@ -902,7 +904,7 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
 {
        struct resource *mem_res, *dmatx_res, *dmarx_res;
        struct s3c64xx_spi_driver_data *sdd;
-       struct s3c64xx_spi_cntrlr_info *sci;
+       struct s3c64xx_spi_info *sci;
        struct spi_master *master;
        int ret;
 
@@ -1000,18 +1002,15 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
                goto err4;
        }
 
-       if (sci->src_clk_nr == S3C64XX_SPI_SRCCLK_PCLK)
-               sci->src_clk = sdd->clk;
-       else
-               sci->src_clk = clk_get(&pdev->dev, sci->src_clk_name);
-       if (IS_ERR(sci->src_clk)) {
+       sdd->src_clk = clk_get(&pdev->dev, sci->src_clk_name);
+       if (IS_ERR(sdd->src_clk)) {
                dev_err(&pdev->dev,
                        "Unable to acquire clock '%s'\n", sci->src_clk_name);
-               ret = PTR_ERR(sci->src_clk);
+               ret = PTR_ERR(sdd->src_clk);
                goto err5;
        }
 
-       if (sci->src_clk != sdd->clk && clk_enable(sci->src_clk)) {
+       if (clk_enable(sdd->src_clk)) {
                dev_err(&pdev->dev, "Couldn't enable clock '%s'\n",
                                                        sci->src_clk_name);
                ret = -EBUSY;
@@ -1040,11 +1039,10 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
                goto err8;
        }
 
-       dev_dbg(&pdev->dev, "Samsung SoC SPI Driver loaded for Bus SPI-%d \
-                                       with %d Slaves attached\n",
+       dev_dbg(&pdev->dev, "Samsung SoC SPI Driver loaded for Bus SPI-%d "
+                                       "with %d Slaves attached\n",
                                        pdev->id, master->num_chipselect);
-       dev_dbg(&pdev->dev, "\tIOmem=[0x%x-0x%x]\
-                                       \tDMA=[Rx-%d, Tx-%d]\n",
+       dev_dbg(&pdev->dev, "\tIOmem=[0x%x-0x%x]\tDMA=[Rx-%d, Tx-%d]\n",
                                        mem_res->end, mem_res->start,
                                        sdd->rx_dmach, sdd->tx_dmach);
 
@@ -1053,11 +1051,9 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
 err8:
        destroy_workqueue(sdd->workqueue);
 err7:
-       if (sci->src_clk != sdd->clk)
-               clk_disable(sci->src_clk);
+       clk_disable(sdd->src_clk);
 err6:
-       if (sci->src_clk != sdd->clk)
-               clk_put(sci->src_clk);
+       clk_put(sdd->src_clk);
 err5:
        clk_disable(sdd->clk);
 err4:
@@ -1078,7 +1074,6 @@ static int s3c64xx_spi_remove(struct platform_device *pdev)
 {
        struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
        struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
-       struct s3c64xx_spi_cntrlr_info *sci = sdd->cntrlr_info;
        struct resource *mem_res;
        unsigned long flags;
 
@@ -1093,11 +1088,8 @@ static int s3c64xx_spi_remove(struct platform_device *pdev)
 
        destroy_workqueue(sdd->workqueue);
 
-       if (sci->src_clk != sdd->clk)
-               clk_disable(sci->src_clk);
-
-       if (sci->src_clk != sdd->clk)
-               clk_put(sci->src_clk);
+       clk_disable(sdd->src_clk);
+       clk_put(sdd->src_clk);
 
        clk_disable(sdd->clk);
        clk_put(sdd->clk);
@@ -1105,7 +1097,8 @@ static int s3c64xx_spi_remove(struct platform_device *pdev)
        iounmap((void *) sdd->regs);
 
        mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       release_mem_region(mem_res->start, resource_size(mem_res));
+       if (mem_res != NULL)
+               release_mem_region(mem_res->start, resource_size(mem_res));
 
        platform_set_drvdata(pdev, NULL);
        spi_master_put(master);
@@ -1118,8 +1111,6 @@ static int s3c64xx_spi_suspend(struct platform_device *pdev, pm_message_t state)
 {
        struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
        struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
-       struct s3c64xx_spi_cntrlr_info *sci = sdd->cntrlr_info;
-       struct s3c64xx_spi_csinfo *cs;
        unsigned long flags;
 
        spin_lock_irqsave(&sdd->lock, flags);
@@ -1130,9 +1121,7 @@ static int s3c64xx_spi_suspend(struct platform_device *pdev, pm_message_t state)
                msleep(10);
 
        /* Disable the clock */
-       if (sci->src_clk != sdd->clk)
-               clk_disable(sci->src_clk);
-
+       clk_disable(sdd->src_clk);
        clk_disable(sdd->clk);
 
        sdd->cur_speed = 0; /* Output Clock is stopped */
@@ -1144,15 +1133,13 @@ static int s3c64xx_spi_resume(struct platform_device *pdev)
 {
        struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
        struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
-       struct s3c64xx_spi_cntrlr_info *sci = sdd->cntrlr_info;
+       struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
        unsigned long flags;
 
        sci->cfg_gpio(pdev);
 
        /* Enable the clock */
-       if (sci->src_clk != sdd->clk)
-               clk_enable(sci->src_clk);
-
+       clk_enable(sdd->src_clk);
        clk_enable(sdd->clk);
 
        s3c64xx_spi_hwinit(sdd, pdev->id);