[PATCH v3 2/6] media: s5p-tv: Restore vpll clock rate
From: Tomasz Figa <hidden>
Date: 2013-08-29 13:08:01
Also in:
linux-devicetree, linux-media, linux-samsung-soc, lkml
Hi Mateusz, Generally this patch looks good, but I have some minor nitpicks, that I would like to be fixed. On Wednesday 28 of August 2013 18:13:00 Mateusz Krawczuk wrote:
quoted hunk ↗ jump to hunk
Restore vpll clock rate if start stream fail or stream is off. Signed-off-by: Mateusz Krawczuk <redacted> --- 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.cb/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;
Clock frequency should be stored in an unsigned long. (See the return type of clk_get_rate().)
quoted hunk ↗ jump to hunk
/** 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, inton) static int sdo_streamon(struct sdo_device *sdev) { + int ret; + /* set proper clock for Timing Generator */ - clk_set_rate(sdev->fout_vpll, 54000000); + sdev->vpll_rate = clk_get_rate(sdev->fout_vpll); + ret = clk_set_rate(sdev->fout_vpll, 54000000); + 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;
nit: Please insert a blank line here. Best regards, Tomasz
quoted hunk ↗ jump to hunk
+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; }