Commit 7d33ccbe authored by Philipp Zabel's avatar Philipp Zabel Committed by Samuel Ortiz
Browse files

mfd: remove DS1WM clock handling



This driver requests a clock that usually is supplied by the MFD in which
the DS1WM is contained. Currently, it is impossible for a MFD to register
their clocks with the generic clock API due to different implementations
across architectures.
For now, this patch removes the clock handling from DS1WM altogether,
trusting that the MFD enable/disable functions will switch the clock if
needed. The clock rate is obtained from a new parameter in driver_data.
Signed-off-by: default avatarPhilipp Zabel <philipp.zabel@gmail.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@openedhand.com>
parent b72019db
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
...@@ -93,7 +92,6 @@ struct ds1wm_data { ...@@ -93,7 +92,6 @@ struct ds1wm_data {
struct mfd_cell *cell; struct mfd_cell *cell;
int irq; int irq;
int active_high; int active_high;
struct clk *clk;
int slave_present; int slave_present;
void *reset_complete; void *reset_complete;
void *read_complete; void *read_complete;
...@@ -216,17 +214,17 @@ static int ds1wm_find_divisor(int gclk) ...@@ -216,17 +214,17 @@ static int ds1wm_find_divisor(int gclk)
static void ds1wm_up(struct ds1wm_data *ds1wm_data) static void ds1wm_up(struct ds1wm_data *ds1wm_data)
{ {
int gclk, divisor; int divisor;
struct ds1wm_driver_data *plat = ds1wm_data->cell->driver_data;
if (ds1wm_data->cell->enable) if (ds1wm_data->cell->enable)
ds1wm_data->cell->enable(ds1wm_data->pdev); ds1wm_data->cell->enable(ds1wm_data->pdev);
gclk = clk_get_rate(ds1wm_data->clk); divisor = ds1wm_find_divisor(plat->clock_rate);
clk_enable(ds1wm_data->clk);
divisor = ds1wm_find_divisor(gclk);
if (divisor == 0) { if (divisor == 0) {
dev_err(&ds1wm_data->pdev->dev, dev_err(&ds1wm_data->pdev->dev,
"no suitable divisor for %dHz clock\n", gclk); "no suitable divisor for %dHz clock\n",
plat->clock_rate);
return; return;
} }
ds1wm_write_register(ds1wm_data, DS1WM_CLKDIV, divisor); ds1wm_write_register(ds1wm_data, DS1WM_CLKDIV, divisor);
...@@ -247,8 +245,6 @@ static void ds1wm_down(struct ds1wm_data *ds1wm_data) ...@@ -247,8 +245,6 @@ static void ds1wm_down(struct ds1wm_data *ds1wm_data)
if (ds1wm_data->cell->disable) if (ds1wm_data->cell->disable)
ds1wm_data->cell->disable(ds1wm_data->pdev); ds1wm_data->cell->disable(ds1wm_data->pdev);
clk_disable(ds1wm_data->clk);
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
...@@ -385,26 +381,18 @@ static int ds1wm_probe(struct platform_device *pdev) ...@@ -385,26 +381,18 @@ static int ds1wm_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err1; goto err1;
ds1wm_data->clk = clk_get(&pdev->dev, "ds1wm");
if (IS_ERR(ds1wm_data->clk)) {
ret = PTR_ERR(ds1wm_data->clk);
goto err2;
}
ds1wm_up(ds1wm_data); ds1wm_up(ds1wm_data);
ds1wm_master.data = (void *)ds1wm_data; ds1wm_master.data = (void *)ds1wm_data;
ret = w1_add_master_device(&ds1wm_master); ret = w1_add_master_device(&ds1wm_master);
if (ret) if (ret)
goto err3; goto err2;
return 0; return 0;
err3:
ds1wm_down(ds1wm_data);
clk_put(ds1wm_data->clk);
err2: err2:
ds1wm_down(ds1wm_data);
free_irq(ds1wm_data->irq, ds1wm_data); free_irq(ds1wm_data->irq, ds1wm_data);
err1: err1:
iounmap(ds1wm_data->map); iounmap(ds1wm_data->map);
...@@ -443,7 +431,6 @@ static int ds1wm_remove(struct platform_device *pdev) ...@@ -443,7 +431,6 @@ static int ds1wm_remove(struct platform_device *pdev)
w1_remove_master_device(&ds1wm_master); w1_remove_master_device(&ds1wm_master);
ds1wm_down(ds1wm_data); ds1wm_down(ds1wm_data);
clk_put(ds1wm_data->clk);
free_irq(ds1wm_data->irq, ds1wm_data); free_irq(ds1wm_data->irq, ds1wm_data);
iounmap(ds1wm_data->map); iounmap(ds1wm_data->map);
kfree(ds1wm_data); kfree(ds1wm_data);
......
...@@ -2,4 +2,5 @@ ...@@ -2,4 +2,5 @@
struct ds1wm_driver_data { struct ds1wm_driver_data {
int active_high; int active_high;
int clock_rate;
}; };
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