From da7a0c9d99ac42332cab5fcc961006a56531e1c4 Mon Sep 17 00:00:00 2001 From: Tuukka Toivonen Date: Thu, 2 Jul 2009 16:17:55 +0200 Subject: [PATCH 17/71] omap3isp: set CAM_MCLK to 172.8 MHz, allows exact 9.6 MHz for camera xclka/b Camera cam_xclka and cam_xclkb clocks are generated by dividing CAM_MCLK with an integer. We want to use 9.6 MHz for cameras, so CAM_MCLK should be multiple of it. Otherwise the generated frequency is slightly off due to rounding. Signed-off-by: Tuukka Toivonen --- drivers/media/video/isp/isp.c | 14 ++++++++++++++ drivers/media/video/isp/isp.h | 1 + drivers/media/video/isp/ispreg.h | 2 +- 3 files changed, 16 insertions(+), 1 deletions(-) diff --git a/drivers/media/video/isp/isp.c b/drivers/media/video/isp/isp.c index ceed870..9d46c01 100644 --- a/drivers/media/video/isp/isp.c +++ b/drivers/media/video/isp/isp.c @@ -2333,6 +2333,11 @@ static int isp_enable_clocks(struct device *dev) dev_err(dev, "clk_enable cam_ick failed\n"); goto out_clk_enable_ick; } + r = clk_set_rate(isp->dpll4_m5_ck, CM_CAM_MCLK_HZ/2); + if (r) { + dev_err(dev, "clk_set_rate for dpll4_m5_ck failed\n"); + goto out_clk_enable_mclk; + } r = clk_enable(isp->cam_mclk); if (r) { dev_err(dev, "clk_enable cam_mclk failed\n"); @@ -2499,6 +2504,7 @@ static int isp_remove(struct platform_device *pdev) clk_put(isp->cam_ick); clk_put(isp->cam_mclk); + clk_put(isp->dpll4_m5_ck); clk_put(isp->csi2_fck); clk_put(isp->l3_ick); @@ -2674,6 +2680,12 @@ static int isp_probe(struct platform_device *pdev) ret_err = PTR_ERR(isp->cam_mclk); goto out_clk_get_mclk; } + isp->dpll4_m5_ck = clk_get(&camera_dev, "dpll4_m5_ck"); + if (IS_ERR(isp->dpll4_m5_ck)) { + dev_err(isp->dev, "clk_get dpll4_m5_ck failed\n"); + ret_err = PTR_ERR(isp->dpll4_m5_ck); + goto out_clk_get_dpll4_m5_ck; + } isp->csi2_fck = clk_get(&camera_dev, "csi2_96m_fck"); if (IS_ERR(isp->csi2_fck)) { dev_err(isp->dev, "clk_get csi2_96m_fck failed\n"); @@ -2734,6 +2746,8 @@ out_request_irq: out_clk_get_l3_ick: clk_put(isp->csi2_fck); out_clk_get_csi2_fclk: + clk_put(isp->dpll4_m5_ck); +out_clk_get_dpll4_m5_ck: clk_put(isp->cam_mclk); out_clk_get_mclk: clk_put(isp->cam_ick); diff --git a/drivers/media/video/isp/isp.h b/drivers/media/video/isp/isp.h index dc85d61..6b100b6 100644 --- a/drivers/media/video/isp/isp.h +++ b/drivers/media/video/isp/isp.h @@ -414,6 +414,7 @@ struct isp_device { int ref_count; struct clk *cam_ick; struct clk *cam_mclk; + struct clk *dpll4_m5_ck; struct clk *csi2_fck; struct clk *l3_ick; struct isp_interface_config *config; diff --git a/drivers/media/video/isp/ispreg.h b/drivers/media/video/isp/ispreg.h index 676a33d..1240e0e 100644 --- a/drivers/media/video/isp/ispreg.h +++ b/drivers/media/video/isp/ispreg.h @@ -116,7 +116,7 @@ #define ISP_32B_BOUNDARY_BUF 0xFFFFFFE0 #define ISP_32B_BOUNDARY_OFFSET 0x0000FFE0 -#define CM_CAM_MCLK_HZ 216000000 +#define CM_CAM_MCLK_HZ 172800000 /* Hz */ /* ISP Submodules offset */ -- 1.6.6.1