summaryrefslogtreecommitdiff
path: root/drivers/mxc
diff options
context:
space:
mode:
authorLuwei Zhou <b45643@freescale.com>2013-11-11 16:56:57 +0800
committerLuwei Zhou <b45643@freescale.com>2013-11-12 16:18:06 +0800
commit187ed795362d51bca7eb22a81e17c9f41b34785d (patch)
treef1452a0b7267d7d35a85267f50ff87019a59f3ea /drivers/mxc
parent5d36f01c46450b7c50af02e13dc32d8a15cf777b (diff)
ENGR00287278 mxc: mlb: Enable the clock when open MLB device.
The driver enalbe/disable the clock in probe()/remove(). It should be done in open()/close() hook function in fact. Signed-off-by: Luwei Zhou <b45643@freescale.com>
Diffstat (limited to 'drivers/mxc')
-rwxr-xr-xdrivers/mxc/mlb/mxc_mlb150.c52
1 files changed, 37 insertions, 15 deletions
diff --git a/drivers/mxc/mlb/mxc_mlb150.c b/drivers/mxc/mlb/mxc_mlb150.c
index f0701e52693d..daf578299601 100755
--- a/drivers/mxc/mlb/mxc_mlb150.c
+++ b/drivers/mxc/mlb/mxc_mlb150.c
@@ -1908,6 +1908,8 @@ static int mxc_mlb150_open(struct inode *inode, struct file *filp)
return -EBUSY;
}
+ clk_prepare_enable(drvdata->clk_mlb3p);
+
/* initial MLB module */
mlb150_dev_init();
@@ -1978,15 +1980,23 @@ static int mxc_mlb150_release(struct inode *inode, struct file *filp)
mlb150_dev_dump_ctr_tbl(0, pdevinfo->channels[TX_CHANNEL].cl + 1);
#endif
- /* clear channel settings and info */
- mlb_channel_enable(drvdata, minor, 0);
-
gen_pool_free(drvdata->iram_pool,
(ulong)pdevinfo->rbuf_base_virt, drvdata->iram_size);
+ mlb150_dev_exit();
+
+ if (pdevinfo && atomic_read(&pdevinfo->on)
+ && (pdevinfo->fps >= CLK_2048FS))
+ clk_disable_unprepare(drvdata->clk_mlb6p);
+
+ atomic_set(&pdevinfo->on, 0);
+
+ clk_disable_unprepare(drvdata->clk_mlb3p);
/* decrease the open count */
atomic_set(&pdevinfo->opencnt, 0);
+ drvdata->devinfo = NULL;
+
return 0;
}
@@ -2596,30 +2606,28 @@ static int mxc_mlb150_probe(struct platform_device *pdev)
if (IS_ERR(drvdata->clk_mlb3p)) {
dev_err(&pdev->dev, "unable to get mlb clock\n");
ret = PTR_ERR(drvdata->clk_mlb3p);
- goto err_clk;
+ goto err_dev;
}
- clk_prepare_enable(drvdata->clk_mlb3p);
drvdata->clk_mlb6p = devm_clk_get(&pdev->dev, "pll8_mlb");
if (IS_ERR(drvdata->clk_mlb6p)) {
dev_err(&pdev->dev, "unable to get mlb pll clock\n");
ret = PTR_ERR(drvdata->clk_mlb6p);
- goto err_clk;
+ goto err_dev;
}
+
drvdata->iram_pool = of_get_named_gen_pool(np, "iram", 0);
if (!drvdata->iram_pool) {
dev_err(&pdev->dev, "iram pool not available\n");
ret = -ENOMEM;
- goto err_clk;
+ goto err_dev;
}
+ drvdata->devinfo = NULL;
platform_set_drvdata(pdev, drvdata);
return 0;
-err_clk:
- if (!IS_ERR(drvdata->clk_mlb3p))
- clk_disable_unprepare(drvdata->clk_mlb3p);
err_dev:
for (--i; i >= 0; i--)
device_destroy(drvdata->class, MKDEV(mlb_major, i));
@@ -2637,11 +2645,13 @@ static int mxc_mlb150_remove(struct platform_device *pdev)
{
int i;
struct mlb_data *drvdata = platform_get_drvdata(pdev);
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
- mlb150_dev_exit();
+ if (pdevinfo && atomic_read(&pdevinfo->on)
+ && (pdevinfo->fps >= CLK_2048FS))
+ clk_disable_unprepare(drvdata->clk_mlb6p);
- /* disable mlb clock */
- if (!IS_ERR(drvdata->clk_mlb3p))
+ if (pdevinfo && atomic_read(&pdevinfo->opencnt))
clk_disable_unprepare(drvdata->clk_mlb3p);
/* disable mlb power */
@@ -2668,10 +2678,16 @@ static int mxc_mlb150_remove(struct platform_device *pdev)
static int mxc_mlb150_suspend(struct platform_device *pdev, pm_message_t state)
{
struct mlb_data *drvdata = platform_get_drvdata(pdev);
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
mlb150_dev_exit();
- clk_disable_unprepare(drvdata->clk_mlb3p);
+ if (pdevinfo && atomic_read(&pdevinfo->on)
+ && (pdevinfo->fps >= CLK_2048FS))
+ clk_disable_unprepare(drvdata->clk_mlb6p);
+
+ if (pdevinfo && atomic_read(&pdevinfo->opencnt))
+ clk_disable_unprepare(drvdata->clk_mlb3p);
return 0;
}
@@ -2679,8 +2695,14 @@ static int mxc_mlb150_suspend(struct platform_device *pdev, pm_message_t state)
static int mxc_mlb150_resume(struct platform_device *pdev)
{
struct mlb_data *drvdata = platform_get_drvdata(pdev);
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
- clk_prepare_enable(drvdata->clk_mlb6p);
+ if (pdevinfo && atomic_read(&pdevinfo->opencnt))
+ clk_prepare_enable(drvdata->clk_mlb3p);
+
+ if (pdevinfo && atomic_read(&pdevinfo->on) &&
+ (pdevinfo->fps >= CLK_2048FS))
+ clk_prepare_enable(drvdata->clk_mlb6p);
mlb150_dev_init();