Commit b0d5d6e5 authored by Jassi Brar's avatar Jassi Brar Committed by Grant Likely

spi/s3c64xx: Move src_clk to local driver data

The pointer to SPI rate source clock had better be the member of
driver local data structure rather than platform specific.
Also, remove definitions of variable 'sci' that are rendered
useless as a consequence.
Signed-off-by: default avatarJassi Brar <jassi.brar@samsung.com>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent ee64a377
...@@ -137,6 +137,7 @@ ...@@ -137,6 +137,7 @@
/** /**
* struct s3c64xx_spi_driver_data - Runtime info holder for SPI driver. * struct s3c64xx_spi_driver_data - Runtime info holder for SPI driver.
* @clk: Pointer to the spi clock. * @clk: Pointer to the spi clock.
* @src_clk: Pointer to the clock used to generate SPI signals.
* @master: Pointer to the SPI Protocol master. * @master: Pointer to the SPI Protocol master.
* @workqueue: Work queue for the SPI xfer requests. * @workqueue: Work queue for the SPI xfer requests.
* @cntrlr_info: Platform specific data for the controller this driver manages. * @cntrlr_info: Platform specific data for the controller this driver manages.
...@@ -157,6 +158,7 @@ ...@@ -157,6 +158,7 @@
struct s3c64xx_spi_driver_data { struct s3c64xx_spi_driver_data {
void __iomem *regs; void __iomem *regs;
struct clk *clk; struct clk *clk;
struct clk *src_clk;
struct platform_device *pdev; struct platform_device *pdev;
struct spi_master *master; struct spi_master *master;
struct workqueue_struct *workqueue; struct workqueue_struct *workqueue;
...@@ -389,7 +391,6 @@ static inline void disable_cs(struct s3c64xx_spi_driver_data *sdd, ...@@ -389,7 +391,6 @@ static inline void disable_cs(struct s3c64xx_spi_driver_data *sdd,
static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd)
{ {
struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
void __iomem *regs = sdd->regs; void __iomem *regs = sdd->regs;
u32 val; u32 val;
...@@ -435,7 +436,7 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) ...@@ -435,7 +436,7 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd)
/* Configure Clock */ /* Configure Clock */
val = readl(regs + S3C64XX_SPI_CLK_CFG); val = readl(regs + S3C64XX_SPI_CLK_CFG);
val &= ~S3C64XX_SPI_PSR_MASK; 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); & S3C64XX_SPI_PSR_MASK);
writel(val, regs + S3C64XX_SPI_CLK_CFG); writel(val, regs + S3C64XX_SPI_CLK_CFG);
...@@ -831,17 +832,17 @@ static int s3c64xx_spi_setup(struct spi_device *spi) ...@@ -831,17 +832,17 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
} }
/* Check if we can provide the requested rate */ /* 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) if (spi->max_speed_hz > speed)
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; psr &= S3C64XX_SPI_PSR_MASK;
if (psr == S3C64XX_SPI_PSR_MASK) if (psr == S3C64XX_SPI_PSR_MASK)
psr--; 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 (spi->max_speed_hz < speed) {
if (psr+1 < S3C64XX_SPI_PSR_MASK) { if (psr+1 < S3C64XX_SPI_PSR_MASK) {
psr++; psr++;
...@@ -851,7 +852,7 @@ static int s3c64xx_spi_setup(struct spi_device *spi) ...@@ -851,7 +852,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) if (spi->max_speed_hz >= speed)
spi->max_speed_hz = speed; spi->max_speed_hz = speed;
else else
...@@ -1000,15 +1001,15 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev) ...@@ -1000,15 +1001,15 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
goto err4; goto err4;
} }
sci->src_clk = clk_get(&pdev->dev, sci->src_clk_name); sdd->src_clk = clk_get(&pdev->dev, sci->src_clk_name);
if (IS_ERR(sci->src_clk)) { if (IS_ERR(sdd->src_clk)) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Unable to acquire clock '%s'\n", sci->src_clk_name); "Unable to acquire clock '%s'\n", sci->src_clk_name);
ret = PTR_ERR(sci->src_clk); ret = PTR_ERR(sdd->src_clk);
goto err5; goto err5;
} }
if (clk_enable(sci->src_clk)) { if (clk_enable(sdd->src_clk)) {
dev_err(&pdev->dev, "Couldn't enable clock '%s'\n", dev_err(&pdev->dev, "Couldn't enable clock '%s'\n",
sci->src_clk_name); sci->src_clk_name);
ret = -EBUSY; ret = -EBUSY;
...@@ -1050,9 +1051,9 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev) ...@@ -1050,9 +1051,9 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
err8: err8:
destroy_workqueue(sdd->workqueue); destroy_workqueue(sdd->workqueue);
err7: err7:
clk_disable(sci->src_clk); clk_disable(sdd->src_clk);
err6: err6:
clk_put(sci->src_clk); clk_put(sdd->src_clk);
err5: err5:
clk_disable(sdd->clk); clk_disable(sdd->clk);
err4: err4:
...@@ -1073,7 +1074,6 @@ static int s3c64xx_spi_remove(struct platform_device *pdev) ...@@ -1073,7 +1074,6 @@ static int s3c64xx_spi_remove(struct platform_device *pdev)
{ {
struct spi_master *master = spi_master_get(platform_get_drvdata(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_driver_data *sdd = spi_master_get_devdata(master);
struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
struct resource *mem_res; struct resource *mem_res;
unsigned long flags; unsigned long flags;
...@@ -1088,8 +1088,8 @@ static int s3c64xx_spi_remove(struct platform_device *pdev) ...@@ -1088,8 +1088,8 @@ static int s3c64xx_spi_remove(struct platform_device *pdev)
destroy_workqueue(sdd->workqueue); destroy_workqueue(sdd->workqueue);
clk_disable(sci->src_clk); clk_disable(sdd->src_clk);
clk_put(sci->src_clk); clk_put(sdd->src_clk);
clk_disable(sdd->clk); clk_disable(sdd->clk);
clk_put(sdd->clk); clk_put(sdd->clk);
...@@ -1110,8 +1110,6 @@ static int s3c64xx_spi_suspend(struct platform_device *pdev, pm_message_t state) ...@@ -1110,8 +1110,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 spi_master *master = spi_master_get(platform_get_drvdata(pdev));
struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master); struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
struct s3c64xx_spi_csinfo *cs;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&sdd->lock, flags); spin_lock_irqsave(&sdd->lock, flags);
...@@ -1122,7 +1120,7 @@ static int s3c64xx_spi_suspend(struct platform_device *pdev, pm_message_t state) ...@@ -1122,7 +1120,7 @@ static int s3c64xx_spi_suspend(struct platform_device *pdev, pm_message_t state)
msleep(10); msleep(10);
/* Disable the clock */ /* Disable the clock */
clk_disable(sci->src_clk); clk_disable(sdd->src_clk);
clk_disable(sdd->clk); clk_disable(sdd->clk);
sdd->cur_speed = 0; /* Output Clock is stopped */ sdd->cur_speed = 0; /* Output Clock is stopped */
...@@ -1140,7 +1138,7 @@ static int s3c64xx_spi_resume(struct platform_device *pdev) ...@@ -1140,7 +1138,7 @@ static int s3c64xx_spi_resume(struct platform_device *pdev)
sci->cfg_gpio(pdev); sci->cfg_gpio(pdev);
/* Enable the clock */ /* Enable the clock */
clk_enable(sci->src_clk); clk_enable(sdd->src_clk);
clk_enable(sdd->clk); clk_enable(sdd->clk);
s3c64xx_spi_hwinit(sdd, pdev->id); s3c64xx_spi_hwinit(sdd, pdev->id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment