[PATCH v5 0/4] media: s5p-tv: clean-up and fixes

2013-09-21 Thread Mateusz Krawczuk
This patch series add restoring previous vpll rate after driver offs stream 
or recives error.
It also replace mxr_info, mxr_dbg, mxr_warn and mxr_err macro 
by generic solution.

Mateusz Krawczuk (4):
  media: s5p-tv: Replace mxr_ macro by default dev_
  media: s5p-tv: Restore vpll clock rate
  media: s5p-tv: Fix sdo driver to work with CCF
  media: s5p-tv: Fix mixer driver to work with CCF

 drivers/media/platform/s5p-tv/mixer.h   |  12 ---
 drivers/media/platform/s5p-tv/mixer_drv.c   |  81 ---
 drivers/media/platform/s5p-tv/mixer_grp_layer.c |   2 +-
 drivers/media/platform/s5p-tv/mixer_reg.c   |   6 +-
 drivers/media/platform/s5p-tv/mixer_video.c | 100 
 drivers/media/platform/s5p-tv/mixer_vp_layer.c  |   2 +-
 drivers/media/platform/s5p-tv/sdo_drv.c |  39 +++--
 7 files changed, 137 insertions(+), 105 deletions(-)

-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v5 3/4] media: s5p-tv: Fix sdo driver to work with CCF

2013-09-21 Thread Mateusz Krawczuk
Replace clk_enable by clock_enable_prepare and clk_disable with 
clk_disable_unprepare.
Clock prepare is required by Clock Common Framework, and old clock driver 
didn`t support it.
Without it Common Clock Framework prints a warning.

Signed-off-by: Mateusz Krawczuk 
Signed-off-by: Kyungmin Park 
---
 drivers/media/platform/s5p-tv/sdo_drv.c | 20 
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/sdo_drv.c 
b/drivers/media/platform/s5p-tv/sdo_drv.c
index e49ac6c..17272e1 100644
--- a/drivers/media/platform/s5p-tv/sdo_drv.c
+++ b/drivers/media/platform/s5p-tv/sdo_drv.c
@@ -208,9 +208,9 @@ static int sdo_streamon(struct sdo_device *sdev)
clk_get_rate(sdev->fout_vpll));
/* enable clock in SDO */
sdo_write_mask(sdev, SDO_CLKCON, ~0, SDO_TVOUT_CLOCK_ON);
-   ret = clk_enable(sdev->dacphy);
+   ret = clk_prepare_enable(sdev->dacphy);
if (ret < 0) {
-   dev_err(sdev->dev, "clk_enable(dacphy) failed\n");
+   dev_err(sdev->dev, "clk_prepare_enable(dacphy) failed\n");
goto fail;
}
/* enable DAC */
@@ -229,7 +229,7 @@ static int sdo_streamoff(struct sdo_device *sdev)
int tries;
 
sdo_write_mask(sdev, SDO_DAC, 0, SDO_POWER_ON_DAC);
-   clk_disable(sdev->dacphy);
+   clk_disable_unprepare(sdev->dacphy);
sdo_write_mask(sdev, SDO_CLKCON, 0, SDO_TVOUT_CLOCK_ON);
for (tries = 100; tries; --tries) {
if (sdo_read(sdev, SDO_CLKCON) & SDO_TVOUT_CLOCK_READY)
@@ -273,7 +273,7 @@ static int sdo_runtime_suspend(struct device *dev)
dev_info(dev, "suspend\n");
regulator_disable(sdev->vdet);
regulator_disable(sdev->vdac);
-   clk_disable(sdev->sclk_dac);
+   clk_disable_unprepare(sdev->sclk_dac);
return 0;
 }
 
@@ -285,7 +285,7 @@ static int sdo_runtime_resume(struct device *dev)
 
dev_info(dev, "resume\n");
 
-   ret = clk_enable(sdev->sclk_dac);
+   ret = clk_prepare_enable(sdev->sclk_dac);
if (ret < 0)
return ret;
 
@@ -318,7 +318,7 @@ static int sdo_runtime_resume(struct device *dev)
 vdac_r_dis:
regulator_disable(sdev->vdac);
 dac_clk_dis:
-   clk_disable(sdev->sclk_dac);
+   clk_disable_unprepare(sdev->sclk_dac);
return ret;
 }
 
@@ -424,7 +424,11 @@ static int sdo_probe(struct platform_device *pdev)
}
 
/* enable gate for dac clock, because mixer uses it */
-   clk_enable(sdev->dac);
+   ret = clk_prepare_enable(sdev->dac);
+   if (ret < 0) {
+   dev_err(dev, "clk_prepare_enable(dac) failed\n");
+   goto fail_fout_vpll;
+   }
 
/* configure power management */
pm_runtime_enable(dev);
@@ -463,7 +467,7 @@ static int sdo_remove(struct platform_device *pdev)
struct sdo_device *sdev = sd_to_sdev(sd);
 
pm_runtime_disable(&pdev->dev);
-   clk_disable(sdev->dac);
+   clk_disable_unprepare(sdev->dac);
clk_put(sdev->fout_vpll);
clk_put(sdev->dacphy);
clk_put(sdev->dac);
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v5 1/4] media: s5p-tv: Replace mxr_ macro by default dev_

2013-09-21 Thread Mateusz Krawczuk
Replace mxr_dbg, mxr_info and mxr_warn by generic solution.

Signed-off-by: Mateusz Krawczuk 
Signed-off-by: Kyungmin Park 
---
 drivers/media/platform/s5p-tv/mixer.h   |  12 ---
 drivers/media/platform/s5p-tv/mixer_drv.c   |  47 ++-
 drivers/media/platform/s5p-tv/mixer_grp_layer.c |   2 +-
 drivers/media/platform/s5p-tv/mixer_reg.c   |   6 +-
 drivers/media/platform/s5p-tv/mixer_video.c | 100 
 drivers/media/platform/s5p-tv/mixer_vp_layer.c  |   2 +-
 6 files changed, 78 insertions(+), 91 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/mixer.h 
b/drivers/media/platform/s5p-tv/mixer.h
index 04e6490..c054106 100644
--- a/drivers/media/platform/s5p-tv/mixer.h
+++ b/drivers/media/platform/s5p-tv/mixer.h
@@ -327,18 +327,6 @@ void mxr_streamer_put(struct mxr_device *mdev);
 void mxr_get_mbus_fmt(struct mxr_device *mdev,
struct v4l2_mbus_framefmt *mbus_fmt);
 
-/* Debug */
-
-#define mxr_err(mdev, fmt, ...)  dev_err(mdev->dev, fmt, ##__VA_ARGS__)
-#define mxr_warn(mdev, fmt, ...) dev_warn(mdev->dev, fmt, ##__VA_ARGS__)
-#define mxr_info(mdev, fmt, ...) dev_info(mdev->dev, fmt, ##__VA_ARGS__)
-
-#ifdef CONFIG_VIDEO_SAMSUNG_S5P_MIXER_DEBUG
-   #define mxr_dbg(mdev, fmt, ...)  dev_dbg(mdev->dev, fmt, ##__VA_ARGS__)
-#else
-   #define mxr_dbg(mdev, fmt, ...)  do { (void) mdev; } while (0)
-#endif
-
 /* accessing Mixer's and Video Processor's registers */
 
 void mxr_vsync_set_update(struct mxr_device *mdev, int en);
diff --git a/drivers/media/platform/s5p-tv/mixer_drv.c 
b/drivers/media/platform/s5p-tv/mixer_drv.c
index 51805a5..8ce7c3e 100644
--- a/drivers/media/platform/s5p-tv/mixer_drv.c
+++ b/drivers/media/platform/s5p-tv/mixer_drv.c
@@ -59,7 +59,7 @@ void mxr_streamer_get(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
++mdev->n_streamer;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_streamer);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_streamer);
if (mdev->n_streamer == 1) {
struct v4l2_subdev *sd = to_outsd(mdev);
struct v4l2_mbus_framefmt mbus_fmt;
@@ -91,7 +91,7 @@ void mxr_streamer_put(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
--mdev->n_streamer;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_streamer);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_streamer);
if (mdev->n_streamer == 0) {
int ret;
struct v4l2_subdev *sd = to_outsd(mdev);
@@ -113,7 +113,7 @@ void mxr_output_get(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
++mdev->n_output;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_output);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_output);
/* turn on auxiliary driver */
if (mdev->n_output == 1)
v4l2_subdev_call(to_outsd(mdev), core, s_power, 1);
@@ -124,7 +124,7 @@ void mxr_output_put(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
--mdev->n_output;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_output);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_output);
/* turn on auxiliary driver */
if (mdev->n_output == 0)
v4l2_subdev_call(to_outsd(mdev), core, s_power, 0);
@@ -159,42 +159,42 @@ static int mxr_acquire_plat_resources(struct mxr_device 
*mdev,
 
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mxr");
if (res == NULL) {
-   mxr_err(mdev, "get memory resource failed.\n");
+   dev_err(mdev->dev, "get memory resource failed.\n");
ret = -ENXIO;
goto fail;
}
 
mdev->res.mxr_regs = ioremap(res->start, resource_size(res));
if (mdev->res.mxr_regs == NULL) {
-   mxr_err(mdev, "register mapping failed.\n");
+   dev_err(mdev->dev, "register mapping failed.\n");
ret = -ENXIO;
goto fail;
}
 
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vp");
if (res == NULL) {
-   mxr_err(mdev, "get memory resource failed.\n");
+   dev_err(mdev->dev, "get memory resource failed.\n");
ret = -ENXIO;
goto fail_mxr_regs;
}
 
mdev->res.vp_regs = ioremap(res->start, resource_size(res));
if (mdev->res.vp_regs == NULL) {
-   mxr_err(mdev, "register mapping failed.\n");
+   dev_err(mdev->dev, "register mapping failed.\n");
ret = -ENXIO;
goto fail_mxr_regs;
}
 
res = platform_get_resou

[PATCH v5 4/4] media: s5p-tv: Fix mixer driver to work with CCF

2013-09-21 Thread Mateusz Krawczuk
Replace clk_enable by clock_enable_prepare and clk_disable with 
clk_disable_unprepare.
Clock prepare is required by Clock Common Framework, and old clock driver 
didn`t support it.
Without it Common Clock Framework prints a warning.

Signed-off-by: Mateusz Krawczuk 
Signed-off-by: Kyungmin Park 
---
 drivers/media/platform/s5p-tv/mixer_drv.c | 34 +--
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/mixer_drv.c 
b/drivers/media/platform/s5p-tv/mixer_drv.c
index 8ce7c3e..7eea286 100644
--- a/drivers/media/platform/s5p-tv/mixer_drv.c
+++ b/drivers/media/platform/s5p-tv/mixer_drv.c
@@ -347,19 +347,41 @@ static int mxr_runtime_resume(struct device *dev)
 {
struct mxr_device *mdev = to_mdev(dev);
struct mxr_resources *res = &mdev->res;
+   int ret;
 
dev_dbg(mdev->dev, "resume - start\n");
mutex_lock(&mdev->mutex);
/* turn clocks on */
-   clk_enable(res->mixer);
-   clk_enable(res->vp);
-   clk_enable(res->sclk_mixer);
+   ret = clk_prepare_enable(res->mixer);
+   if (ret < 0) {
+   dev_err(mdev->dev, "clk_prepare_enable(mixer) failed\n");
+   goto fail;
+   }
+   ret = clk_prepare_enable(res->vp);
+   if (ret < 0) {
+   dev_err(mdev->dev, "clk_prepare_enable(vp) failed\n");
+   goto fail_mixer;
+   }
+   ret = clk_prepare_enable(res->sclk_mixer);
+   if (ret < 0) {
+   dev_err(mdev->dev, "clk_prepare_enable(sclk_mixer) failed\n");
+   goto fail_vp;
+   }
/* apply default configuration */
mxr_reg_reset(mdev);
dev_dbg(mdev->dev, "resume - finished\n");
 
mutex_unlock(&mdev->mutex);
return 0;
+
+fail_vp:
+   clk_disable_unprepare(res->vp);
+fail_mixer:
+   clk_disable_unprepare(res->mixer);
+fail:
+   mutex_unlock(&mdev->mutex);
+   dev_err(mdev->dev, "resume failed\n");
+   return ret;
 }
 
 static int mxr_runtime_suspend(struct device *dev)
@@ -369,9 +391,9 @@ static int mxr_runtime_suspend(struct device *dev)
dev_dbg(mdev->dev, "suspend - start\n");
mutex_lock(&mdev->mutex);
/* turn clocks off */
-   clk_disable(res->sclk_mixer);
-   clk_disable(res->vp);
-   clk_disable(res->mixer);
+   clk_disable_unprepare(res->sclk_mixer);
+   clk_disable_unprepare(res->vp);
+   clk_disable_unprepare(res->mixer);
mutex_unlock(&mdev->mutex);
dev_dbg(mdev->dev, "suspend - finished\n");
return 0;
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v5 2/4] media: s5p-tv: Restore vpll clock rate

2013-09-21 Thread Mateusz Krawczuk
Restore vpll clock rate if start stream fail or stream is off.

Signed-off-by: Mateusz Krawczuk 
Signed-off-by: Kyungmin Park 
---
 drivers/media/platform/s5p-tv/sdo_drv.c | 23 +--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/sdo_drv.c 
b/drivers/media/platform/s5p-tv/sdo_drv.c
index 0afa90f..e49ac6c 100644
--- a/drivers/media/platform/s5p-tv/sdo_drv.c
+++ b/drivers/media/platform/s5p-tv/sdo_drv.c
@@ -55,6 +55,8 @@ struct sdo_device {
struct clk *dacphy;
/** clock for control of VPLL */
struct clk *fout_vpll;
+   /** vpll rate before sdo stream was on */
+   unsigned long vpll_rate;
/** regulator for SDO IP power */
struct regulator *vdac;
/** regulator for SDO plug detection */
@@ -193,17 +195,33 @@ static int sdo_s_power(struct v4l2_subdev *sd, int on)
 
 static int sdo_streamon(struct sdo_device *sdev)
 {
+   int ret;
+
/* set proper clock for Timing Generator */
-   clk_set_rate(sdev->fout_vpll, 5400);
+   sdev->vpll_rate = clk_get_rate(sdev->fout_vpll);
+   ret = clk_set_rate(sdev->fout_vpll, 5400);
+   if (ret < 0) {
+   dev_err(sdev->dev, "Failed to set vpll rate\n");
+   return ret;
+   }
dev_info(sdev->dev, "fout_vpll.rate = %lu\n",
clk_get_rate(sdev->fout_vpll));
/* enable clock in SDO */
sdo_write_mask(sdev, SDO_CLKCON, ~0, SDO_TVOUT_CLOCK_ON);
-   clk_enable(sdev->dacphy);
+   ret = clk_enable(sdev->dacphy);
+   if (ret < 0) {
+   dev_err(sdev->dev, "clk_enable(dacphy) failed\n");
+   goto fail;
+   }
/* enable DAC */
sdo_write_mask(sdev, SDO_DAC, ~0, SDO_POWER_ON_DAC);
sdo_reg_debug(sdev);
return 0;
+   
+fail:
+   sdo_write_mask(sdev, SDO_CLKCON, 0, SDO_TVOUT_CLOCK_ON);
+   clk_set_rate(sdev->fout_vpll, sdev->vpll_rate);
+   return ret;
 }
 
 static int sdo_streamoff(struct sdo_device *sdev)
@@ -220,6 +238,7 @@ static int sdo_streamoff(struct sdo_device *sdev)
}
if (tries == 0)
dev_err(sdev->dev, "failed to stop streaming\n");
+   clk_set_rate(sdev->fout_vpll, sdev->vpll_rate);
return tries ? 0 : -EIO;
 }
 
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v4 2/2] media: s5p-tv: Restore vpll clock rate

2013-08-30 Thread Mateusz Krawczuk
Restore vpll clock rate if start stream fail or stream is off.

Signed-off-by: Mateusz Krawczuk 
---
 drivers/media/platform/s5p-tv/sdo_drv.c | 25 +++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/sdo_drv.c 
b/drivers/media/platform/s5p-tv/sdo_drv.c
index 0afa90f..73a0ca6 100644
--- a/drivers/media/platform/s5p-tv/sdo_drv.c
+++ b/drivers/media/platform/s5p-tv/sdo_drv.c
@@ -55,6 +55,8 @@ struct sdo_device {
struct clk *dacphy;
/** clock for control of VPLL */
struct clk *fout_vpll;
+   /** vpll rate before sdo stream was on */
+   unsigned long vpll_rate;
/** regulator for SDO IP power */
struct regulator *vdac;
/** regulator for SDO plug detection */
@@ -193,17 +195,35 @@ static int sdo_s_power(struct v4l2_subdev *sd, int on)
 
 static int sdo_streamon(struct sdo_device *sdev)
 {
+   int ret;
+
/* set proper clock for Timing Generator */
-   clk_set_rate(sdev->fout_vpll, 5400);
+   sdev->vpll_rate = clk_get_rate(sdev->fout_vpll);
+   ret = clk_set_rate(sdev->fout_vpll, 5400);
+   if (ret < 0) {
+   dev_err(sdev->dev,
+   "Failed to set vpll rate\n");
+   return ret;
+   }
dev_info(sdev->dev, "fout_vpll.rate = %lu\n",
clk_get_rate(sdev->fout_vpll));
/* enable clock in SDO */
sdo_write_mask(sdev, SDO_CLKCON, ~0, SDO_TVOUT_CLOCK_ON);
-   clk_enable(sdev->dacphy);
+   ret = clk_enable(sdev->dacphy);
+   if (ret < 0) {
+   dev_err(sdev->dev,
+   "clk_enable(dacphy) failed\n");
+   goto fail;
+   }
/* enable DAC */
sdo_write_mask(sdev, SDO_DAC, ~0, SDO_POWER_ON_DAC);
sdo_reg_debug(sdev);
return 0;
+   
+fail:
+   sdo_write_mask(sdev, SDO_CLKCON, 0, SDO_TVOUT_CLOCK_ON);
+   clk_set_rate(sdev->fout_vpll, sdev->vpll_rate);
+   return ret;
 }
 
 static int sdo_streamoff(struct sdo_device *sdev)
@@ -220,6 +240,7 @@ static int sdo_streamoff(struct sdo_device *sdev)
}
if (tries == 0)
dev_err(sdev->dev, "failed to stop streaming\n");
+   clk_set_rate(sdev->fout_vpll, sdev->vpll_rate);
return tries ? 0 : -EIO;
 }
 
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v4 1/2] media: s5p-tv: Replace mxr_ macro by default dev_

2013-08-30 Thread Mateusz Krawczuk
Replace mxr_dbg, mxr_info and mxr_warn by generic solution.

Signed-off-by: Mateusz Krawczuk 
---
 drivers/media/platform/s5p-tv/mixer.h   |  12 ---
 drivers/media/platform/s5p-tv/mixer_drv.c   |  47 ++-
 drivers/media/platform/s5p-tv/mixer_grp_layer.c |   2 +-
 drivers/media/platform/s5p-tv/mixer_reg.c   |   6 +-
 drivers/media/platform/s5p-tv/mixer_video.c | 100 
 drivers/media/platform/s5p-tv/mixer_vp_layer.c  |   2 +-
 6 files changed, 78 insertions(+), 91 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/mixer.h 
b/drivers/media/platform/s5p-tv/mixer.h
index 04e6490..c054106 100644
--- a/drivers/media/platform/s5p-tv/mixer.h
+++ b/drivers/media/platform/s5p-tv/mixer.h
@@ -327,18 +327,6 @@ void mxr_streamer_put(struct mxr_device *mdev);
 void mxr_get_mbus_fmt(struct mxr_device *mdev,
struct v4l2_mbus_framefmt *mbus_fmt);
 
-/* Debug */
-
-#define mxr_err(mdev, fmt, ...)  dev_err(mdev->dev, fmt, ##__VA_ARGS__)
-#define mxr_warn(mdev, fmt, ...) dev_warn(mdev->dev, fmt, ##__VA_ARGS__)
-#define mxr_info(mdev, fmt, ...) dev_info(mdev->dev, fmt, ##__VA_ARGS__)
-
-#ifdef CONFIG_VIDEO_SAMSUNG_S5P_MIXER_DEBUG
-   #define mxr_dbg(mdev, fmt, ...)  dev_dbg(mdev->dev, fmt, ##__VA_ARGS__)
-#else
-   #define mxr_dbg(mdev, fmt, ...)  do { (void) mdev; } while (0)
-#endif
-
 /* accessing Mixer's and Video Processor's registers */
 
 void mxr_vsync_set_update(struct mxr_device *mdev, int en);
diff --git a/drivers/media/platform/s5p-tv/mixer_drv.c 
b/drivers/media/platform/s5p-tv/mixer_drv.c
index 51805a5..8ce7c3e 100644
--- a/drivers/media/platform/s5p-tv/mixer_drv.c
+++ b/drivers/media/platform/s5p-tv/mixer_drv.c
@@ -59,7 +59,7 @@ void mxr_streamer_get(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
++mdev->n_streamer;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_streamer);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_streamer);
if (mdev->n_streamer == 1) {
struct v4l2_subdev *sd = to_outsd(mdev);
struct v4l2_mbus_framefmt mbus_fmt;
@@ -91,7 +91,7 @@ void mxr_streamer_put(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
--mdev->n_streamer;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_streamer);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_streamer);
if (mdev->n_streamer == 0) {
int ret;
struct v4l2_subdev *sd = to_outsd(mdev);
@@ -113,7 +113,7 @@ void mxr_output_get(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
++mdev->n_output;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_output);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_output);
/* turn on auxiliary driver */
if (mdev->n_output == 1)
v4l2_subdev_call(to_outsd(mdev), core, s_power, 1);
@@ -124,7 +124,7 @@ void mxr_output_put(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
--mdev->n_output;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_output);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_output);
/* turn on auxiliary driver */
if (mdev->n_output == 0)
v4l2_subdev_call(to_outsd(mdev), core, s_power, 0);
@@ -159,42 +159,42 @@ static int mxr_acquire_plat_resources(struct mxr_device 
*mdev,
 
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mxr");
if (res == NULL) {
-   mxr_err(mdev, "get memory resource failed.\n");
+   dev_err(mdev->dev, "get memory resource failed.\n");
ret = -ENXIO;
goto fail;
}
 
mdev->res.mxr_regs = ioremap(res->start, resource_size(res));
if (mdev->res.mxr_regs == NULL) {
-   mxr_err(mdev, "register mapping failed.\n");
+   dev_err(mdev->dev, "register mapping failed.\n");
ret = -ENXIO;
goto fail;
}
 
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vp");
if (res == NULL) {
-   mxr_err(mdev, "get memory resource failed.\n");
+   dev_err(mdev->dev, "get memory resource failed.\n");
ret = -ENXIO;
goto fail_mxr_regs;
}
 
mdev->res.vp_regs = ioremap(res->start, resource_size(res));
if (mdev->res.vp_regs == NULL) {
-   mxr_err(mdev, "register mapping failed.\n");
+   dev_err(mdev->dev, "register mapping failed.\n");
ret = -ENXIO;
goto fail_mxr_regs;
}
 
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "

[PATCH v4 0/2] media: s5p-tv: clean-up and fixes

2013-08-30 Thread Mateusz Krawczuk
This patch series add restoring previous vpll rate after driver offs stream 
or recives error.
It also replace mxr_info, mxr_dbg, mxr_warn and mxr_err macro 
by generic solution.

Mateusz Krawczuk (2):
  media: s5p-tv: Replace mxr_ macro by default dev_
  media: s5p-tv: Restore vpll clock rate

 drivers/media/platform/s5p-tv/mixer.h   |  12 ---
 drivers/media/platform/s5p-tv/mixer_drv.c   |  47 ++-
 drivers/media/platform/s5p-tv/mixer_grp_layer.c |   2 +-
 drivers/media/platform/s5p-tv/mixer_reg.c   |   6 +-
 drivers/media/platform/s5p-tv/mixer_video.c | 100 
 drivers/media/platform/s5p-tv/mixer_vp_layer.c  |   2 +-
 drivers/media/platform/s5p-tv/sdo_drv.c |  25 +-
 7 files changed, 101 insertions(+), 93 deletions(-)

-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 1/6] media: s5p-tv: Replace mxr_ macro by default dev_

2013-08-28 Thread Mateusz Krawczuk
Replace mxr_dbg, mxr_info and mxr_warn by generic solution.

Signed-off-by: Mateusz Krawczuk 
---
 drivers/media/platform/s5p-tv/mixer.h   |  12 ---
 drivers/media/platform/s5p-tv/mixer_drv.c   |  47 ++-
 drivers/media/platform/s5p-tv/mixer_grp_layer.c |   2 +-
 drivers/media/platform/s5p-tv/mixer_reg.c   |   6 +-
 drivers/media/platform/s5p-tv/mixer_video.c | 100 
 drivers/media/platform/s5p-tv/mixer_vp_layer.c  |   2 +-
 6 files changed, 78 insertions(+), 91 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/mixer.h 
b/drivers/media/platform/s5p-tv/mixer.h
index 04e6490..c054106 100644
--- a/drivers/media/platform/s5p-tv/mixer.h
+++ b/drivers/media/platform/s5p-tv/mixer.h
@@ -327,18 +327,6 @@ void mxr_streamer_put(struct mxr_device *mdev);
 void mxr_get_mbus_fmt(struct mxr_device *mdev,
struct v4l2_mbus_framefmt *mbus_fmt);
 
-/* Debug */
-
-#define mxr_err(mdev, fmt, ...)  dev_err(mdev->dev, fmt, ##__VA_ARGS__)
-#define mxr_warn(mdev, fmt, ...) dev_warn(mdev->dev, fmt, ##__VA_ARGS__)
-#define mxr_info(mdev, fmt, ...) dev_info(mdev->dev, fmt, ##__VA_ARGS__)
-
-#ifdef CONFIG_VIDEO_SAMSUNG_S5P_MIXER_DEBUG
-   #define mxr_dbg(mdev, fmt, ...)  dev_dbg(mdev->dev, fmt, ##__VA_ARGS__)
-#else
-   #define mxr_dbg(mdev, fmt, ...)  do { (void) mdev; } while (0)
-#endif
-
 /* accessing Mixer's and Video Processor's registers */
 
 void mxr_vsync_set_update(struct mxr_device *mdev, int en);
diff --git a/drivers/media/platform/s5p-tv/mixer_drv.c 
b/drivers/media/platform/s5p-tv/mixer_drv.c
index 51805a5..8ce7c3e 100644
--- a/drivers/media/platform/s5p-tv/mixer_drv.c
+++ b/drivers/media/platform/s5p-tv/mixer_drv.c
@@ -59,7 +59,7 @@ void mxr_streamer_get(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
++mdev->n_streamer;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_streamer);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_streamer);
if (mdev->n_streamer == 1) {
struct v4l2_subdev *sd = to_outsd(mdev);
struct v4l2_mbus_framefmt mbus_fmt;
@@ -91,7 +91,7 @@ void mxr_streamer_put(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
--mdev->n_streamer;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_streamer);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_streamer);
if (mdev->n_streamer == 0) {
int ret;
struct v4l2_subdev *sd = to_outsd(mdev);
@@ -113,7 +113,7 @@ void mxr_output_get(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
++mdev->n_output;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_output);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_output);
/* turn on auxiliary driver */
if (mdev->n_output == 1)
v4l2_subdev_call(to_outsd(mdev), core, s_power, 1);
@@ -124,7 +124,7 @@ void mxr_output_put(struct mxr_device *mdev)
 {
mutex_lock(&mdev->mutex);
--mdev->n_output;
-   mxr_dbg(mdev, "%s(%d)\n", __func__, mdev->n_output);
+   dev_dbg(mdev->dev, "%s(%d)\n", __func__, mdev->n_output);
/* turn on auxiliary driver */
if (mdev->n_output == 0)
v4l2_subdev_call(to_outsd(mdev), core, s_power, 0);
@@ -159,42 +159,42 @@ static int mxr_acquire_plat_resources(struct mxr_device 
*mdev,
 
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mxr");
if (res == NULL) {
-   mxr_err(mdev, "get memory resource failed.\n");
+   dev_err(mdev->dev, "get memory resource failed.\n");
ret = -ENXIO;
goto fail;
}
 
mdev->res.mxr_regs = ioremap(res->start, resource_size(res));
if (mdev->res.mxr_regs == NULL) {
-   mxr_err(mdev, "register mapping failed.\n");
+   dev_err(mdev->dev, "register mapping failed.\n");
ret = -ENXIO;
goto fail;
}
 
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vp");
if (res == NULL) {
-   mxr_err(mdev, "get memory resource failed.\n");
+   dev_err(mdev->dev, "get memory resource failed.\n");
ret = -ENXIO;
goto fail_mxr_regs;
}
 
mdev->res.vp_regs = ioremap(res->start, resource_size(res));
if (mdev->res.vp_regs == NULL) {
-   mxr_err(mdev, "register mapping failed.\n");
+   dev_err(mdev->dev, "register mapping failed.\n");
ret = -ENXIO;
goto fail_mxr_regs;
}
 
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "

[PATCH v3 5/6] clk: samsung: Add clock driver for s5pc110/s5pv210

2013-08-28 Thread Mateusz Krawczuk
This patch adds new, Common Clock Framework-based clock driver for Samsung
S5PV210 SoCs. The driver is just added, without enabling it yet.

Signed-off-by: Mateusz Krawczuk 
---
 .../bindings/clock/samsung,s5pv210-clock.txt   |  72 ++
 drivers/clk/samsung/Makefile   |   3 +
 drivers/clk/samsung/clk-s5pv210.c  | 732 +
 include/dt-bindings/clock/samsung,s5pv210-clock.h  | 221 +++
 4 files changed, 1028 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt
 create mode 100644 drivers/clk/samsung/clk-s5pv210.c
 create mode 100644 include/dt-bindings/clock/samsung,s5pv210-clock.h

diff --git a/Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt 
b/Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt
new file mode 100644
index 000..753c8f9
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt
@@ -0,0 +1,72 @@
+* Samsung S5PC110/S5PV210 Clock Controller
+
+The S5PV210 clock controller generates and supplies clock to various 
controllers
+within the SoC. The clock binding described here is applicable to all SoCs in
+the S5PC110/S5PV210 family.
+
+Required Properties:
+
+- compatible: should be one of the following.
+  - "samsung,s5pv210-clock" - controller compatible with S5PC110/S5PV210 SoC.
+
+- reg: physical base address of the controller and length of memory mapped
+  region.
+
+- #clock-cells: should be 1.
+
+Each clock is assigned an identifier and client nodes can use this identifier
+to specify the clock which they consume. Some of the clocks are available only
+on a particular S5PC110/S5PV210 SoC and this is specified where applicable.
+
+All available clocks are defined as preprocessor macros in
+dt-bindings/clock/samsung,s5pv210-clock.h header and can be used in device
+tree sources.
+
+External clocks:
+
+There are several clocks that are generated outside the SoC. It is expected
+that they are defined using standard clock bindings with following
+clock-output-names:
+ - "xxti"- xtal - required
+ - "xusbxti" - USB xtal - required,
+
+
+Example: Clock controller node:
+
+   clock: clock-controller@7e00f000 {
+   compatible = "samsung,s5pv210-clock";
+   reg = <0x7e00f000 0x1000>;
+   #clock-cells = <1>;
+   };
+
+Example: Required external clocks:
+
+   fin_pll: clock-xxti {
+   compatible = "fixed-clock";
+   clock-output-names = "xxti";
+   clock-frequency = <1200>;
+   #clock-cells = <0>;
+   };
+
+   xusbxti: clock-xusbxti {
+   compatible = "fixed-clock";
+   clock-output-names = "xusbxti";
+   clock-frequency = <4800>;
+   #clock-cells = <0>;
+   };
+
+Example: UART controller node that consumes the clock generated by the clock
+  controller (refer to the standard clock bindings for information about
+  "clocks" and "clock-names" properties):
+
+   uart0: serial@7f005000 {
+   compatible = "samsung,s5pv210-uart";
+   reg = <0x7f005000 0x100>;
+   interrupt-parent = <&vic1>;
+   interrupts = <5>;
+   clock-names = "uart", "clk_uart_baud2",
+   "clk_uart_baud3";
+   clocks = <&clock PCLK_UART0>, <&clocks PCLK_UART0>,
+   <&clock SCLK_UART>;
+   status = "disabled";
+   };
\ No newline at end of file
diff --git a/drivers/clk/samsung/Makefile b/drivers/clk/samsung/Makefile
index 8eb4799..e08c45e 100644
--- a/drivers/clk/samsung/Makefile
+++ b/drivers/clk/samsung/Makefile
@@ -9,3 +9,6 @@ obj-$(CONFIG_SOC_EXYNOS5420)+= clk-exynos5420.o
 obj-$(CONFIG_SOC_EXYNOS5440)   += clk-exynos5440.o
 obj-$(CONFIG_ARCH_EXYNOS)  += clk-exynos-audss.o
 obj-$(CONFIG_ARCH_S3C64XX) += clk-s3c64xx.o
+ifeq ($(CONFIG_COMMON_CLK), y)
+obj-$(CONFIG_ARCH_S5PV210) += clk-s5pv210.o
+endif
\ No newline at end of file
diff --git a/drivers/clk/samsung/clk-s5pv210.c 
b/drivers/clk/samsung/clk-s5pv210.c
new file mode 100644
index 000..1c5ea5c
--- /dev/null
+++ b/drivers/clk/samsung/clk-s5pv210.c
@@ -0,0 +1,732 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ * Author: Mateusz Krawczuk 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Common Clock Framework support for all S5PC110/S5PV210 SoCs.
+*/
+
+#include 
+#include 
+#include 
+#inc

[PATCH v3 4/6] media: s5p-tv: Fix mixer driver to work with CCF

2013-08-28 Thread Mateusz Krawczuk
Replace clk_enable by clock_enable_prepare and clk_disable with 
clk_disable_unprepare.
Clock prepare is required by Clock Common Framework, and old clock driver 
didn`t support it.
Without it Common Clock Framework prints a warning.

Signed-off-by: Mateusz Krawczuk 
---
 drivers/media/platform/s5p-tv/mixer_drv.c | 35 ---
 1 file changed, 28 insertions(+), 7 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/mixer_drv.c 
b/drivers/media/platform/s5p-tv/mixer_drv.c
index 8ce7c3e..3b2b305 100644
--- a/drivers/media/platform/s5p-tv/mixer_drv.c
+++ b/drivers/media/platform/s5p-tv/mixer_drv.c
@@ -347,19 +347,40 @@ static int mxr_runtime_resume(struct device *dev)
 {
struct mxr_device *mdev = to_mdev(dev);
struct mxr_resources *res = &mdev->res;
+   int ret;
 
dev_dbg(mdev->dev, "resume - start\n");
mutex_lock(&mdev->mutex);
/* turn clocks on */
-   clk_enable(res->mixer);
-   clk_enable(res->vp);
-   clk_enable(res->sclk_mixer);
+   ret = clk_prepare_enable(res->mixer);
+   if (ret < 0) {
+   dev_err(mdev->dev, "clk_prepare_enable(mixer) failed\n");
+   goto fail;
+   }
+   ret = clk_prepare_enable(res->vp);
+   if (ret < 0) {
+   dev_err(mdev->dev, "clk_prepare_enable(vp) failed\n");
+   goto fail_mixer;
+   }
+   ret = clk_prepare_enable(res->sclk_mixer);
+   if (ret < 0) {
+   dev_err(mdev->dev, "clk_prepare_enable(sclk_mixer) failed\n");
+   goto fail_vp;
+   }
/* apply default configuration */
mxr_reg_reset(mdev);
-   dev_dbg(mdev->dev, "resume - finished\n");
 
mutex_unlock(&mdev->mutex);
+   dev_dbg(mdev->dev, "resume - finished\n");
return 0;
+fail_vp:
+   clk_disable_unprepare(res->vp);
+fail_mixer:
+   clk_disable_unprepare(res->mixer);
+fail:
+   mutex_unlock(&mdev->mutex);
+   dev_info(mdev->dev, "resume failed\n");
+   return ret;
 }
 
 static int mxr_runtime_suspend(struct device *dev)
@@ -369,9 +390,9 @@ static int mxr_runtime_suspend(struct device *dev)
dev_dbg(mdev->dev, "suspend - start\n");
mutex_lock(&mdev->mutex);
/* turn clocks off */
-   clk_disable(res->sclk_mixer);
-   clk_disable(res->vp);
-   clk_disable(res->mixer);
+   clk_disable_unprepare(res->sclk_mixer);
+   clk_disable_unprepare(res->vp);
+   clk_disable_unprepare(res->mixer);
mutex_unlock(&mdev->mutex);
dev_dbg(mdev->dev, "suspend - finished\n");
return 0;
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 3/6] media: s5p-tv: Fix sdo driver to work with CCF

2013-08-28 Thread Mateusz Krawczuk
Replace clk_enable by clock_enable_prepare and clk_disable with 
clk_disable_unprepare.
Clock prepare is required by Clock Common Framework, and old clock driver 
didn`t support it.
Without it Common Clock Framework prints a warning.

Signed-off-by: Mateusz Krawczuk 
---
 drivers/media/platform/s5p-tv/sdo_drv.c | 25 +++--
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/sdo_drv.c 
b/drivers/media/platform/s5p-tv/sdo_drv.c
index 9dbdfe6..a79e620 100644
--- a/drivers/media/platform/s5p-tv/sdo_drv.c
+++ b/drivers/media/platform/s5p-tv/sdo_drv.c
@@ -209,10 +209,10 @@ static int sdo_streamon(struct sdo_device *sdev)
clk_get_rate(sdev->fout_vpll));
/* enable clock in SDO */
sdo_write_mask(sdev, SDO_CLKCON, ~0, SDO_TVOUT_CLOCK_ON);
-   ret = clk_enable(sdev->dacphy);
+   ret = clk_prepare_enable(sdev->dacphy);
if (ret < 0) {
dev_err(sdev->dev,
-   "clk_enable(dacphy) failed !\n");
+   "clk_prepare_enable(dacphy) failed !\n");
goto fail;
}
/* enable DAC */
@@ -230,7 +230,7 @@ static int sdo_streamoff(struct sdo_device *sdev)
int tries;
 
sdo_write_mask(sdev, SDO_DAC, 0, SDO_POWER_ON_DAC);
-   clk_disable(sdev->dacphy);
+   clk_disable_unprepare(sdev->dacphy);
sdo_write_mask(sdev, SDO_CLKCON, 0, SDO_TVOUT_CLOCK_ON);
for (tries = 100; tries; --tries) {
if (sdo_read(sdev, SDO_CLKCON) & SDO_TVOUT_CLOCK_READY)
@@ -274,7 +274,7 @@ static int sdo_runtime_suspend(struct device *dev)
dev_info(dev, "suspend\n");
regulator_disable(sdev->vdet);
regulator_disable(sdev->vdac);
-   clk_disable(sdev->sclk_dac);
+   clk_disable_unprepare(sdev->sclk_dac);
return 0;
 }
 
@@ -286,7 +286,7 @@ static int sdo_runtime_resume(struct device *dev)
 
dev_info(dev, "resume\n");
 
-   ret = clk_enable(sdev->sclk_dac);
+   ret = clk_prepare_enable(sdev->sclk_dac);
if (ret < 0)
return ret;
 
@@ -319,7 +319,7 @@ static int sdo_runtime_resume(struct device *dev)
 vdac_r_dis:
regulator_disable(sdev->vdac);
 dac_clk_dis:
-   clk_disable(sdev->sclk_dac);
+   clk_disable_unprepare(sdev->sclk_dac);
return ret;
 }
 
@@ -333,7 +333,7 @@ static int sdo_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct sdo_device *sdev;
struct resource *res;
-   int ret = 0;
+   int ret;
struct clk *sclk_vpll;
 
dev_info(dev, "probe start\n");
@@ -425,8 +425,13 @@ static int sdo_probe(struct platform_device *pdev)
}
 
/* enable gate for dac clock, because mixer uses it */
-   clk_enable(sdev->dac);
-
+   ret = clk_prepare_enable(sdev->dac);
+   if (ret < 0) {
+   dev_err(dev,
+   "clk_prepare_enable_enable(dac) failed !\n");
+   ret = PTR_ERR(sdev->dac);
+   goto fail_fout_vpll;
+   }
/* configure power management */
pm_runtime_enable(dev);
 
@@ -464,7 +469,7 @@ static int sdo_remove(struct platform_device *pdev)
struct sdo_device *sdev = sd_to_sdev(sd);
 
pm_runtime_disable(&pdev->dev);
-   clk_disable(sdev->dac);
+   clk_disable_unprepare(sdev->dac);
clk_put(sdev->fout_vpll);
clk_put(sdev->dacphy);
clk_put(sdev->dac);
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 6/6] ARM: s5pv210: Migrate clock handling to Common Clock Framework

2013-08-28 Thread Mateusz Krawczuk
This patch migrates the s5pv210 platform to use new clock driver
using Common Clock Framework.

Signed-off-by: Mateusz Krawczuk 
---
 arch/arm/mach-s5pv210/Kconfig |  9 +
 arch/arm/mach-s5pv210/Makefile|  4 ++--
 arch/arm/mach-s5pv210/common.c| 17 +
 arch/arm/mach-s5pv210/common.h| 13 +
 arch/arm/mach-s5pv210/mach-aquila.c   |  1 +
 arch/arm/mach-s5pv210/mach-goni.c |  3 ++-
 arch/arm/mach-s5pv210/mach-smdkc110.c |  1 +
 arch/arm/mach-s5pv210/mach-smdkv210.c |  1 +
 arch/arm/mach-s5pv210/mach-torbreck.c |  1 +
 arch/arm/plat-samsung/Kconfig |  2 +-
 arch/arm/plat-samsung/init.c  |  2 --
 11 files changed, 48 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-s5pv210/Kconfig b/arch/arm/mach-s5pv210/Kconfig
index caaedaf..ad4546e 100644
--- a/arch/arm/mach-s5pv210/Kconfig
+++ b/arch/arm/mach-s5pv210/Kconfig
@@ -15,6 +15,7 @@ config CPU_S5PV210
select S5P_PM if PM
select S5P_SLEEP if PM
select SAMSUNG_DMADEV
+   select S5P_CLOCK if !COMMON_CLK
help
  Enable S5PV210 CPU support
 
@@ -69,6 +70,14 @@ config S5PV210_SETUP_USB_PHY
help
  Common setup code for USB PHY controller
 
+config COMMON_CLK_S5PV210
+   bool "Common Clock Framework support"
+   default y
+   select COMMON_CLK
+   help
+ Enable this option to use new clock driver
+ based on Common Clock Framework.
+
 menu "S5PC110 Machines"
 
 config MACH_AQUILA
diff --git a/arch/arm/mach-s5pv210/Makefile b/arch/arm/mach-s5pv210/Makefile
index 1c4e419..0c67fe2 100644
--- a/arch/arm/mach-s5pv210/Makefile
+++ b/arch/arm/mach-s5pv210/Makefile
@@ -12,8 +12,8 @@ obj-  :=
 
 # Core
 
-obj-y  += common.o clock.o
-
+obj-y  += common.o
+obj-$(CONFIG_S5P_CLOCK)+= clock.o
 obj-$(CONFIG_PM)   += pm.o
 
 obj-y  += dma.o
diff --git a/arch/arm/mach-s5pv210/common.c b/arch/arm/mach-s5pv210/common.c
index 26027a2..a1d86a1 100644
--- a/arch/arm/mach-s5pv210/common.c
+++ b/arch/arm/mach-s5pv210/common.c
@@ -34,7 +34,13 @@
 #include 
 
 #include 
+
+#ifdef CONFIG_S5P_CLOCK
 #include 
+#else
+#include 
+#endif
+
 #include 
 #include 
 #include 
@@ -50,6 +56,14 @@
 
 #include "common.h"
 
+/* External clock frequency */
+static unsigned long xusbxti_f, xxti_f;
+
+void __init s5pv210_set_xusbxti_freq(unsigned long freq)
+{
+   xusbxti_f = freq;
+}
+
 static const char name_s5pv210[] = "S5PV210/S5PC110";
 
 static struct cpu_table cpu_ids[] __initdata = {
@@ -229,12 +243,14 @@ void __init s5pv210_map_io(void)
 
 void __init s5pv210_init_clocks(int xtal)
 {
+#ifdef CONFIG_S5P_CLOCK
printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
 
s3c24xx_register_baseclocks(xtal);
s5p_register_clocks(xtal);
s5pv210_register_clocks();
s5pv210_setup_clocks();
+#endif
 }
 
 void __init s5pv210_init_irq(void)
@@ -248,6 +264,7 @@ void __init s5pv210_init_irq(void)
vic[3] = ~0;
 
s5p_init_irq(vic, ARRAY_SIZE(vic));
+   s5pv210_clk_init(NULL, xxti_f, xusbxti_f, S3C_VA_SYS);
 }
 
 struct bus_type s5pv210_subsys = {
diff --git a/arch/arm/mach-s5pv210/common.h b/arch/arm/mach-s5pv210/common.h
index fe1beb5..2db2a15 100644
--- a/arch/arm/mach-s5pv210/common.h
+++ b/arch/arm/mach-s5pv210/common.h
@@ -14,6 +14,19 @@
 
 #include 
 
+void s5pv210_set_xxti_freq(unsigned long freq);
+void s5pv210_set_xusbxti_freq(unsigned long freq);
+
+#ifdef CONFIG_COMMON_CLK_S5PV210
+void s5pv210_clk_init(struct device_node *np,
+   unsigned long xxti_f, unsigned long xusbxti_f,
+   void __iomem *reg_base);
+#else
+static inline void s5pv210_clk_init(struct device_node *np,
+   unsigned long xxti_f, unsigned long xusbxti_f,
+   void __iomem *reg_base) {}
+#endif
+
 void s5pv210_init_io(struct map_desc *mach_desc, int size);
 void s5pv210_init_irq(void);
 
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c 
b/arch/arm/mach-s5pv210/mach-aquila.c
index ad40ab0..e37a311 100644
--- a/arch/arm/mach-s5pv210/mach-aquila.c
+++ b/arch/arm/mach-s5pv210/mach-aquila.c
@@ -646,6 +646,7 @@ static void __init aquila_map_io(void)
 {
s5pv210_init_io(NULL, 0);
s3c24xx_init_clocks(2400);
+   s5pv210_set_xusbxti_freq(2400);
s3c24xx_init_uarts(aquila_uartcfgs, ARRAY_SIZE(aquila_uartcfgs));
samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
 }
diff --git a/arch/arm/mach-s5pv210/mach-goni.c 
b/arch/arm/mach-s5pv210/mach-goni.c
index 282d714..a1955e9 100644
--- a/arch/arm/mach-s5pv210/mach-goni.c
+++ b/arch/arm/mach-s5pv210/mach-goni.c
@@ -966,7 +966,8 @@ static void __init goni_sound_init(void)
 static void __init goni_map_io(void)
 {
s5pv210_init_io(NULL

[PATCH v3 2/6] media: s5p-tv: Restore vpll clock rate

2013-08-28 Thread Mateusz Krawczuk
Restore vpll clock rate if start stream fail or stream is off.

Signed-off-by: Mateusz Krawczuk 
---
 drivers/media/platform/s5p-tv/sdo_drv.c | 24 ++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/sdo_drv.c 
b/drivers/media/platform/s5p-tv/sdo_drv.c
index 0afa90f..9dbdfe6 100644
--- a/drivers/media/platform/s5p-tv/sdo_drv.c
+++ b/drivers/media/platform/s5p-tv/sdo_drv.c
@@ -55,6 +55,8 @@ struct sdo_device {
struct clk *dacphy;
/** clock for control of VPLL */
struct clk *fout_vpll;
+   /** vpll rate before sdo stream was on */
+   int vpll_rate;
/** regulator for SDO IP power */
struct regulator *vdac;
/** regulator for SDO plug detection */
@@ -193,17 +195,34 @@ static int sdo_s_power(struct v4l2_subdev *sd, int on)
 
 static int sdo_streamon(struct sdo_device *sdev)
 {
+   int ret;
+
/* set proper clock for Timing Generator */
-   clk_set_rate(sdev->fout_vpll, 5400);
+   sdev->vpll_rate = clk_get_rate(sdev->fout_vpll);
+   ret = clk_set_rate(sdev->fout_vpll, 5400);
+   if (ret < 0) {
+   dev_err(sdev->dev,
+   "Failed to set vpll rate!\n");
+   return ret;
+   }
dev_info(sdev->dev, "fout_vpll.rate = %lu\n",
clk_get_rate(sdev->fout_vpll));
/* enable clock in SDO */
sdo_write_mask(sdev, SDO_CLKCON, ~0, SDO_TVOUT_CLOCK_ON);
-   clk_enable(sdev->dacphy);
+   ret = clk_enable(sdev->dacphy);
+   if (ret < 0) {
+   dev_err(sdev->dev,
+   "clk_enable(dacphy) failed !\n");
+   goto fail;
+   }
/* enable DAC */
sdo_write_mask(sdev, SDO_DAC, ~0, SDO_POWER_ON_DAC);
sdo_reg_debug(sdev);
return 0;
+fail:
+   sdo_write_mask(sdev, SDO_CLKCON, 0, SDO_TVOUT_CLOCK_ON);
+   clk_set_rate(sdev->fout_vpll, sdev->vpll_rate);
+   return ret;
 }
 
 static int sdo_streamoff(struct sdo_device *sdev)
@@ -220,6 +239,7 @@ static int sdo_streamoff(struct sdo_device *sdev)
}
if (tries == 0)
dev_err(sdev->dev, "failed to stop streaming\n");
+   clk_set_rate(sdev->fout_vpll, sdev->vpll_rate);
return tries ? 0 : -EIO;
 }
 
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 0/6] ARM: S5PV210: move to common clk framework

2013-08-28 Thread Mateusz Krawczuk
This patch series is the new s5pv210 clock implementation
(using common clk framework).

This implementation is compatible with device tree definition and board files.

This patch series is based on linux-next and has been tested on goni and aquila 
boards using board file.

This patch series require adding new registration method
for PLL45xx and PLL46xx, which is included in this patch series:
clk: samsung: pll: Use new registration method for PLL46xx
http://www.mail-archive.com/linux-samsung-soc@vger.kernel.org/msg21653.html
clk: samsung: pll: Use new registration method for PLL45xx
http://www.mail-archive.com/linux-samsung-soc@vger.kernel.org/msg21652.html
clk: samsung: exynos4: Rename exynos4_plls to exynos4x12_plls
http://www.spinics.net/lists/arm-kernel/msg268486.html

Mateusz Krawczuk (6):
  media: s5p-tv: Replace mxr_ macro by default dev_
  media: s5p-tv: Restore vpll clock rate
  media: s5p-tv: Fix sdo driver to work with CCF
  media: s5p-tv: Fix mixer driver to work with CCF
  clk: samsung: Add clock driver for s5pc110/s5pv210
  ARM: s5pv210: Migrate clock handling to Common Clock Framework

 .../bindings/clock/samsung,s5pv210-clock.txt   |  72 ++
 arch/arm/mach-s5pv210/Kconfig  |   9 +
 arch/arm/mach-s5pv210/Makefile |   4 +-
 arch/arm/mach-s5pv210/common.c |  17 +
 arch/arm/mach-s5pv210/common.h |  13 +
 arch/arm/mach-s5pv210/mach-aquila.c|   1 +
 arch/arm/mach-s5pv210/mach-goni.c  |   3 +-
 arch/arm/mach-s5pv210/mach-smdkc110.c  |   1 +
 arch/arm/mach-s5pv210/mach-smdkv210.c  |   1 +
 arch/arm/mach-s5pv210/mach-torbreck.c  |   1 +
 arch/arm/plat-samsung/Kconfig  |   2 +-
 arch/arm/plat-samsung/init.c   |   2 -
 drivers/clk/samsung/Makefile   |   3 +
 drivers/clk/samsung/clk-s5pv210.c  | 732 +
 drivers/media/platform/s5p-tv/mixer.h  |  12 -
 drivers/media/platform/s5p-tv/mixer_drv.c  |  80 ++-
 drivers/media/platform/s5p-tv/mixer_grp_layer.c|   2 +-
 drivers/media/platform/s5p-tv/mixer_reg.c  |   6 +-
 drivers/media/platform/s5p-tv/mixer_video.c| 100 +--
 drivers/media/platform/s5p-tv/mixer_vp_layer.c |   2 +-
 drivers/media/platform/s5p-tv/sdo_drv.c|  45 +-
 include/dt-bindings/clock/samsung,s5pv210-clock.h  | 221 +++
 22 files changed, 1216 insertions(+), 113 deletions(-)
 create mode 100644 
Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt
 create mode 100644 drivers/clk/samsung/clk-s5pv210.c
 create mode 100644 include/dt-bindings/clock/samsung,s5pv210-clock.h

-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 0/5] ARM: S5PV210: move to common clk framework

2013-08-28 Thread Mateusz Krawczuk
This patch series is the new s5pv210 clock implementation
(using common clk framework).

This implementation is compatible with device tree definition and board files.

This patch series is based on linux-next and has been tested on goni and aquila 
boards using board file.

This patch series require adding new registration method
for PLL45xx and PLL46xx, which is included in this patch series:
clk: samsung: pll: Use new registration method for PLL46xx
http://www.mail-archive.com/linux-samsung-soc@vger.kernel.org/msg21653.html
clk: samsung: pll: Use new registration method for PLL45xx
http://www.mail-archive.com/linux-samsung-soc@vger.kernel.org/msg21652.html
clk: samsung: exynos4: Rename exynos4_plls to exynos4x12_plls
http://www.spinics.net/lists/arm-kernel/msg268486.html

Mateusz Krawczuk (5):
  media: s5p-tv: Restore vpll clock rate
  media: s5p-tv: Fix sdo driver to work with CCF
  media: s5p-tv: Fix mixer driver to work with CCF
  clk: samsung: Add clock driver for s5pc110/s5pv210
  ARM: s5pv210: Migrate clock handling to Common Clock Framework

 .../bindings/clock/samsung,s5pv210-clock.txt   |  72 ++
 arch/arm/mach-s5pv210/Kconfig  |   9 +
 arch/arm/mach-s5pv210/Makefile |   4 +-
 arch/arm/mach-s5pv210/common.c |  17 +
 arch/arm/mach-s5pv210/common.h |  13 +
 arch/arm/mach-s5pv210/mach-aquila.c|   1 +
 arch/arm/mach-s5pv210/mach-goni.c  |   3 +-
 arch/arm/mach-s5pv210/mach-smdkc110.c  |   1 +
 arch/arm/mach-s5pv210/mach-smdkv210.c  |   1 +
 arch/arm/mach-s5pv210/mach-torbreck.c  |   1 +
 arch/arm/plat-samsung/Kconfig  |   2 +-
 arch/arm/plat-samsung/init.c   |   2 -
 drivers/clk/samsung/Makefile   |   3 +
 drivers/clk/samsung/clk-s5pv210.c  | 733 +
 drivers/media/platform/s5p-tv/mixer_drv.c  |  35 +-
 drivers/media/platform/s5p-tv/sdo_drv.c|  45 +-
 include/dt-bindings/clock/samsung,s5pv210-clock.h  | 221 +++
 17 files changed, 1140 insertions(+), 23 deletions(-)
 create mode 100644 
Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt
 create mode 100644 drivers/clk/samsung/clk-s5pv210.c
 create mode 100644 include/dt-bindings/clock/samsung,s5pv210-clock.h

-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 1/5] media: s5p-tv: Restore vpll clock rate

2013-08-28 Thread Mateusz Krawczuk
Restore vpll clock rate if start stream fail or stream is off.

Signed-off-by: Mateusz Krawczuk 
---
 drivers/media/platform/s5p-tv/sdo_drv.c | 24 ++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/sdo_drv.c 
b/drivers/media/platform/s5p-tv/sdo_drv.c
index 0afa90f..b919008 100644
--- a/drivers/media/platform/s5p-tv/sdo_drv.c
+++ b/drivers/media/platform/s5p-tv/sdo_drv.c
@@ -55,6 +55,8 @@ struct sdo_device {
struct clk *dacphy;
/** clock for control of VPLL */
struct clk *fout_vpll;
+   /** vpll rate before sdo stream was on */
+   int vpll_rate;
/** regulator for SDO IP power */
struct regulator *vdac;
/** regulator for SDO plug detection */
@@ -193,17 +195,34 @@ static int sdo_s_power(struct v4l2_subdev *sd, int on)
 
 static int sdo_streamon(struct sdo_device *sdev)
 {
+   int ret;
+
/* set proper clock for Timing Generator */
-   clk_set_rate(sdev->fout_vpll, 5400);
+   sdev->vpll_rate = clk_get_rate(sdev->fout_vpll);
+   ret = clk_set_rate(sdev->fout_vpll, 5400);
+   if (ret < 0) {
+   dev_err(sdev->dev,
+   "%s: Failed to set vpll rate!\n", __func__);
+   return ret;
+   }
dev_info(sdev->dev, "fout_vpll.rate = %lu\n",
clk_get_rate(sdev->fout_vpll));
/* enable clock in SDO */
sdo_write_mask(sdev, SDO_CLKCON, ~0, SDO_TVOUT_CLOCK_ON);
-   clk_enable(sdev->dacphy);
+   ret = clk_prepare_enable(sdev->dacphy);
+   if (ret < 0) {
+   dev_err(sdev->dev,
+   "%s: Failed to prepare and enable clock !\n", __func__);
+   goto fail;
+   }
/* enable DAC */
sdo_write_mask(sdev, SDO_DAC, ~0, SDO_POWER_ON_DAC);
sdo_reg_debug(sdev);
return 0;
+fail:
+   sdo_write_mask(sdev, SDO_CLKCON, 0, SDO_TVOUT_CLOCK_ON);
+   clk_set_rate(sdev->fout_vpll, sdev->vpll_rate);
+   return ret;
 }
 
 static int sdo_streamoff(struct sdo_device *sdev)
@@ -220,6 +239,7 @@ static int sdo_streamoff(struct sdo_device *sdev)
}
if (tries == 0)
dev_err(sdev->dev, "failed to stop streaming\n");
+   clk_set_rate(sdev->fout_vpll, sdev->vpll_rate);
return tries ? 0 : -EIO;
 }
 
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 2/5] media: s5p-tv: Fix sdo driver to work with CCF

2013-08-28 Thread Mateusz Krawczuk
Replace clk_enable by clock_enable_prepare and clk_disable with 
clk_disable_unprepare.
Clock prepare is required by Clock Common Framework, and old clock driver 
didn`t support it.
Without it Common Clock Framework prints a warning.

Signed-off-by: Mateusz Krawczuk 
---
 drivers/media/platform/s5p-tv/sdo_drv.c | 21 +
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/sdo_drv.c 
b/drivers/media/platform/s5p-tv/sdo_drv.c
index b919008..acdae6b 100644
--- a/drivers/media/platform/s5p-tv/sdo_drv.c
+++ b/drivers/media/platform/s5p-tv/sdo_drv.c
@@ -230,7 +230,7 @@ static int sdo_streamoff(struct sdo_device *sdev)
int tries;
 
sdo_write_mask(sdev, SDO_DAC, 0, SDO_POWER_ON_DAC);
-   clk_disable(sdev->dacphy);
+   clk_disable_unprepare(sdev->dacphy);
sdo_write_mask(sdev, SDO_CLKCON, 0, SDO_TVOUT_CLOCK_ON);
for (tries = 100; tries; --tries) {
if (sdo_read(sdev, SDO_CLKCON) & SDO_TVOUT_CLOCK_READY)
@@ -274,7 +274,7 @@ static int sdo_runtime_suspend(struct device *dev)
dev_info(dev, "suspend\n");
regulator_disable(sdev->vdet);
regulator_disable(sdev->vdac);
-   clk_disable(sdev->sclk_dac);
+   clk_disable_unprepare(sdev->sclk_dac);
return 0;
 }
 
@@ -286,7 +286,7 @@ static int sdo_runtime_resume(struct device *dev)
 
dev_info(dev, "resume\n");
 
-   ret = clk_enable(sdev->sclk_dac);
+   ret = clk_prepare_enable(sdev->sclk_dac);
if (ret < 0)
return ret;
 
@@ -319,7 +319,7 @@ static int sdo_runtime_resume(struct device *dev)
 vdac_r_dis:
regulator_disable(sdev->vdac);
 dac_clk_dis:
-   clk_disable(sdev->sclk_dac);
+   clk_disable_unprepare(sdev->sclk_dac);
return ret;
 }
 
@@ -333,7 +333,7 @@ static int sdo_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct sdo_device *sdev;
struct resource *res;
-   int ret = 0;
+   int ret;
struct clk *sclk_vpll;
 
dev_info(dev, "probe start\n");
@@ -425,8 +425,13 @@ static int sdo_probe(struct platform_device *pdev)
}
 
/* enable gate for dac clock, because mixer uses it */
-   clk_enable(sdev->dac);
-
+   clk_prepare_enable(sdev->dac);
+   if (IS_ERR(sdev->dac)) {
+   dev_err(dev,
+   "%s: Failed to prepare and enable clock !\n", __func__);
+   ret = PTR_ERR(sdev->dac);
+   goto fail_fout_vpll;
+   }
/* configure power management */
pm_runtime_enable(dev);
 
@@ -464,7 +469,7 @@ static int sdo_remove(struct platform_device *pdev)
struct sdo_device *sdev = sd_to_sdev(sd);
 
pm_runtime_disable(&pdev->dev);
-   clk_disable(sdev->dac);
+   clk_disable_unprepare(sdev->dac);
clk_put(sdev->fout_vpll);
clk_put(sdev->dacphy);
clk_put(sdev->dac);
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 3/5] media: s5p-tv: Fix mixer driver to work with CCF

2013-08-28 Thread Mateusz Krawczuk
Replace clk_enable by clock_enable_prepare and clk_disable with 
clk_disable_unprepare.
Clock prepare is required by Clock Common Framework, and old clock driver 
didn`t support it.
Without it Common Clock Framework prints a warning.

Signed-off-by: Mateusz Krawczuk 
---
 drivers/media/platform/s5p-tv/mixer_drv.c | 35 ---
 1 file changed, 28 insertions(+), 7 deletions(-)

diff --git a/drivers/media/platform/s5p-tv/mixer_drv.c 
b/drivers/media/platform/s5p-tv/mixer_drv.c
index 51805a5..435c8c0 100644
--- a/drivers/media/platform/s5p-tv/mixer_drv.c
+++ b/drivers/media/platform/s5p-tv/mixer_drv.c
@@ -345,21 +345,42 @@ fail:
 
 static int mxr_runtime_resume(struct device *dev)
 {
+   int ret;
struct mxr_device *mdev = to_mdev(dev);
struct mxr_resources *res = &mdev->res;
 
mxr_dbg(mdev, "resume - start\n");
mutex_lock(&mdev->mutex);
/* turn clocks on */
-   clk_enable(res->mixer);
-   clk_enable(res->vp);
-   clk_enable(res->sclk_mixer);
+   ret = clk_prepare_enable(res->mixer);
+   if (ret < 0) {
+   mxr_err(mdev, "clk_prepare_enable(mixer) failed\n");
+   goto fail;
+   }
+   ret = clk_prepare_enable(res->vp);
+   if (ret < 0) {
+   mxr_err(mdev, "clk_prepare_enable(vp) failed\n");
+   goto fail_mixer;
+   }
+   ret = clk_prepare_enable(res->sclk_mixer);
+   if (ret < 0) {
+   mxr_err(mdev, "clk_prepare_enable(sclk_mixer) failed\n");
+   goto fail_vp;
+   }
/* apply default configuration */
mxr_reg_reset(mdev);
-   mxr_dbg(mdev, "resume - finished\n");
 
mutex_unlock(&mdev->mutex);
+   mxr_dbg(mdev, "resume - finished\n");
return 0;
+fail_vp:
+   clk_disable_unprepare(res->vp);
+fail_mixer:
+   clk_disable_unprepare(res->mixer);
+fail:
+   mutex_unlock(&mdev->mutex);
+   mxr_info(mdev, "resume failed\n");
+   return ret;
 }
 
 static int mxr_runtime_suspend(struct device *dev)
@@ -369,9 +390,9 @@ static int mxr_runtime_suspend(struct device *dev)
mxr_dbg(mdev, "suspend - start\n");
mutex_lock(&mdev->mutex);
/* turn clocks off */
-   clk_disable(res->sclk_mixer);
-   clk_disable(res->vp);
-   clk_disable(res->mixer);
+   clk_disable_unprepare(res->sclk_mixer);
+   clk_disable_unprepare(res->vp);
+   clk_disable_unprepare(res->mixer);
mutex_unlock(&mdev->mutex);
mxr_dbg(mdev, "suspend - finished\n");
return 0;
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 5/5] ARM: s5pv210: Migrate clock handling to Common Clock Framework

2013-08-28 Thread Mateusz Krawczuk
This patch migrates the s5pv210 platform to use new clock driver
using Common Clock Framework.

Signed-off-by: Mateusz Krawczuk 
---
 arch/arm/mach-s5pv210/Kconfig |  9 +
 arch/arm/mach-s5pv210/Makefile|  4 ++--
 arch/arm/mach-s5pv210/common.c| 17 +
 arch/arm/mach-s5pv210/common.h| 13 +
 arch/arm/mach-s5pv210/mach-aquila.c   |  1 +
 arch/arm/mach-s5pv210/mach-goni.c |  3 ++-
 arch/arm/mach-s5pv210/mach-smdkc110.c |  1 +
 arch/arm/mach-s5pv210/mach-smdkv210.c |  1 +
 arch/arm/mach-s5pv210/mach-torbreck.c |  1 +
 arch/arm/plat-samsung/Kconfig |  2 +-
 arch/arm/plat-samsung/init.c  |  2 --
 11 files changed, 48 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-s5pv210/Kconfig b/arch/arm/mach-s5pv210/Kconfig
index caaedaf..ad4546e 100644
--- a/arch/arm/mach-s5pv210/Kconfig
+++ b/arch/arm/mach-s5pv210/Kconfig
@@ -15,6 +15,7 @@ config CPU_S5PV210
select S5P_PM if PM
select S5P_SLEEP if PM
select SAMSUNG_DMADEV
+   select S5P_CLOCK if !COMMON_CLK
help
  Enable S5PV210 CPU support
 
@@ -69,6 +70,14 @@ config S5PV210_SETUP_USB_PHY
help
  Common setup code for USB PHY controller
 
+config COMMON_CLK_S5PV210
+   bool "Common Clock Framework support"
+   default y
+   select COMMON_CLK
+   help
+ Enable this option to use new clock driver
+ based on Common Clock Framework.
+
 menu "S5PC110 Machines"
 
 config MACH_AQUILA
diff --git a/arch/arm/mach-s5pv210/Makefile b/arch/arm/mach-s5pv210/Makefile
index 1c4e419..0c67fe2 100644
--- a/arch/arm/mach-s5pv210/Makefile
+++ b/arch/arm/mach-s5pv210/Makefile
@@ -12,8 +12,8 @@ obj-  :=
 
 # Core
 
-obj-y  += common.o clock.o
-
+obj-y  += common.o
+obj-$(CONFIG_S5P_CLOCK)+= clock.o
 obj-$(CONFIG_PM)   += pm.o
 
 obj-y  += dma.o
diff --git a/arch/arm/mach-s5pv210/common.c b/arch/arm/mach-s5pv210/common.c
index 26027a2..19165c8 100644
--- a/arch/arm/mach-s5pv210/common.c
+++ b/arch/arm/mach-s5pv210/common.c
@@ -34,7 +34,13 @@
 #include 
 
 #include 
+
+#ifdef CONFIG_S5P_CLOCK
 #include 
+#else
+#include 
+#endif
+
 #include 
 #include 
 #include 
@@ -50,6 +56,14 @@
 
 #include "common.h"
 
+/* External clock frequency */
+static unsigned long xxti_f, xusbxti_f;
+
+void __init s5pv210_set_xxti_freq(unsigned long freq)
+{
+   xxti_f = freq;
+}
+
 static const char name_s5pv210[] = "S5PV210/S5PC110";
 
 static struct cpu_table cpu_ids[] __initdata = {
@@ -229,12 +243,14 @@ void __init s5pv210_map_io(void)
 
 void __init s5pv210_init_clocks(int xtal)
 {
+#ifdef CONFIG_S5P_CLOCK
printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
 
s3c24xx_register_baseclocks(xtal);
s5p_register_clocks(xtal);
s5pv210_register_clocks();
s5pv210_setup_clocks();
+#endif
 }
 
 void __init s5pv210_init_irq(void)
@@ -248,6 +264,7 @@ void __init s5pv210_init_irq(void)
vic[3] = ~0;
 
s5p_init_irq(vic, ARRAY_SIZE(vic));
+   s5pv210_clk_init(NULL, xxti_f, xusbxti_f, S3C_VA_SYS);
 }
 
 struct bus_type s5pv210_subsys = {
diff --git a/arch/arm/mach-s5pv210/common.h b/arch/arm/mach-s5pv210/common.h
index fe1beb5..2db2a15 100644
--- a/arch/arm/mach-s5pv210/common.h
+++ b/arch/arm/mach-s5pv210/common.h
@@ -14,6 +14,19 @@
 
 #include 
 
+void s5pv210_set_xxti_freq(unsigned long freq);
+void s5pv210_set_xusbxti_freq(unsigned long freq);
+
+#ifdef CONFIG_COMMON_CLK_S5PV210
+void s5pv210_clk_init(struct device_node *np,
+   unsigned long xxti_f, unsigned long xusbxti_f,
+   void __iomem *reg_base);
+#else
+static inline void s5pv210_clk_init(struct device_node *np,
+   unsigned long xxti_f, unsigned long xusbxti_f,
+   void __iomem *reg_base) {}
+#endif
+
 void s5pv210_init_io(struct map_desc *mach_desc, int size);
 void s5pv210_init_irq(void);
 
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c 
b/arch/arm/mach-s5pv210/mach-aquila.c
index ad40ab0..e37a311 100644
--- a/arch/arm/mach-s5pv210/mach-aquila.c
+++ b/arch/arm/mach-s5pv210/mach-aquila.c
@@ -646,6 +646,7 @@ static void __init aquila_map_io(void)
 {
s5pv210_init_io(NULL, 0);
s3c24xx_init_clocks(2400);
+   s5pv210_set_xusbxti_freq(2400);
s3c24xx_init_uarts(aquila_uartcfgs, ARRAY_SIZE(aquila_uartcfgs));
samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
 }
diff --git a/arch/arm/mach-s5pv210/mach-goni.c 
b/arch/arm/mach-s5pv210/mach-goni.c
index 282d714..a1955e9 100644
--- a/arch/arm/mach-s5pv210/mach-goni.c
+++ b/arch/arm/mach-s5pv210/mach-goni.c
@@ -966,7 +966,8 @@ static void __init goni_sound_init(void)
 static void __init goni_map_io(void)
 {
s5pv210_init_io(NULL

[PATCH v2 4/5] clk: samsung: Add clock driver for s5pc110/s5pv210

2013-08-28 Thread Mateusz Krawczuk
This patch adds new, Common Clock Framework-based clock driver for Samsung
S5PV210 SoCs. The driver is just added, without enabling it yet.

Signed-off-by: Mateusz Krawczuk 
---
 .../bindings/clock/samsung,s5pv210-clock.txt   |  72 ++
 drivers/clk/samsung/Makefile   |   3 +
 drivers/clk/samsung/clk-s5pv210.c  | 733 +
 include/dt-bindings/clock/samsung,s5pv210-clock.h  | 221 +++
 4 files changed, 1029 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt
 create mode 100644 drivers/clk/samsung/clk-s5pv210.c
 create mode 100644 include/dt-bindings/clock/samsung,s5pv210-clock.h

diff --git a/Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt 
b/Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt
new file mode 100644
index 000..753c8f9
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt
@@ -0,0 +1,72 @@
+* Samsung S5PC110/S5PV210 Clock Controller
+
+The S5PV210 clock controller generates and supplies clock to various 
controllers
+within the SoC. The clock binding described here is applicable to all SoCs in
+the S5PC110/S5PV210 family.
+
+Required Properties:
+
+- compatible: should be one of the following.
+  - "samsung,s5pv210-clock" - controller compatible with S5PC110/S5PV210 SoC.
+
+- reg: physical base address of the controller and length of memory mapped
+  region.
+
+- #clock-cells: should be 1.
+
+Each clock is assigned an identifier and client nodes can use this identifier
+to specify the clock which they consume. Some of the clocks are available only
+on a particular S5PC110/S5PV210 SoC and this is specified where applicable.
+
+All available clocks are defined as preprocessor macros in
+dt-bindings/clock/samsung,s5pv210-clock.h header and can be used in device
+tree sources.
+
+External clocks:
+
+There are several clocks that are generated outside the SoC. It is expected
+that they are defined using standard clock bindings with following
+clock-output-names:
+ - "xxti"- xtal - required
+ - "xusbxti" - USB xtal - required,
+
+
+Example: Clock controller node:
+
+   clock: clock-controller@7e00f000 {
+   compatible = "samsung,s5pv210-clock";
+   reg = <0x7e00f000 0x1000>;
+   #clock-cells = <1>;
+   };
+
+Example: Required external clocks:
+
+   fin_pll: clock-xxti {
+   compatible = "fixed-clock";
+   clock-output-names = "xxti";
+   clock-frequency = <1200>;
+   #clock-cells = <0>;
+   };
+
+   xusbxti: clock-xusbxti {
+   compatible = "fixed-clock";
+   clock-output-names = "xusbxti";
+   clock-frequency = <4800>;
+   #clock-cells = <0>;
+   };
+
+Example: UART controller node that consumes the clock generated by the clock
+  controller (refer to the standard clock bindings for information about
+  "clocks" and "clock-names" properties):
+
+   uart0: serial@7f005000 {
+   compatible = "samsung,s5pv210-uart";
+   reg = <0x7f005000 0x100>;
+   interrupt-parent = <&vic1>;
+   interrupts = <5>;
+   clock-names = "uart", "clk_uart_baud2",
+   "clk_uart_baud3";
+   clocks = <&clock PCLK_UART0>, <&clocks PCLK_UART0>,
+   <&clock SCLK_UART>;
+   status = "disabled";
+   };
\ No newline at end of file
diff --git a/drivers/clk/samsung/Makefile b/drivers/clk/samsung/Makefile
index 8eb4799..c51f2bb 100644
--- a/drivers/clk/samsung/Makefile
+++ b/drivers/clk/samsung/Makefile
@@ -9,3 +9,6 @@ obj-$(CONFIG_SOC_EXYNOS5420)+= clk-exynos5420.o
 obj-$(CONFIG_SOC_EXYNOS5440)   += clk-exynos5440.o
 obj-$(CONFIG_ARCH_EXYNOS)  += clk-exynos-audss.o
 obj-$(CONFIG_ARCH_S3C64XX) += clk-s3c64xx.o
+ifdef CONFIG_COMMON_CLK
+obj-$(CONFIG_ARCH_S5PV210) += clk-s5pv210.o
+endif
\ No newline at end of file
diff --git a/drivers/clk/samsung/clk-s5pv210.c 
b/drivers/clk/samsung/clk-s5pv210.c
new file mode 100644
index 000..d1b86c3
--- /dev/null
+++ b/drivers/clk/samsung/clk-s5pv210.c
@@ -0,0 +1,733 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ * Author: Mateusz Krawczuk 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Common Clock Framework support for all S5PC110/S5PV210 SoCs.
+*/
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#i

[PATCH] media: s5p-tv: Fix Warn on driver probe

2013-07-05 Thread Mateusz Krawczuk

From 2cbf0f259fe24d0e3fe9f5b45036dcae3ffb6213 Mon Sep 17 00:00:00 2001
From: Mateusz Krawczuk
Date: Wed, 3 Jul 2013 14:51:45 +0200
Subject: [PATCH] media: s5p-tv: Fix Warn on driver probe

The timestamp_type field in struct vb2_queue wasn`t initalized at s5p-tv probe.
This caused warn on message at boot. This patch fixed this issue.

Signed-off-by: Mateusz Krawczuk
Acked-by: Tomasz Stanislawski
---
 drivers/media/platform/s5p-tv/mixer_video.c |1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/media/platform/s5p-tv/mixer_video.c 
b/drivers/media/platform/s5p-tv/mixer_video.c
index 641b1f0..87e3b0a 100644
--- a/drivers/media/platform/s5p-tv/mixer_video.c
+++ b/drivers/media/platform/s5p-tv/mixer_video.c
@@ -1125,6 +1125,7 @@ struct mxr_layer *mxr_base_layer_create(struct mxr_device 
*mdev,
.buf_struct_size = sizeof(struct mxr_buffer),
.ops = &mxr_video_qops,
.mem_ops = &vb2_dma_contig_memops,
+   .timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC,
};
 
 	return layer;

-- 1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html