Hans, Could you please add this to your hg tree and send a pull request to Mauro? This was reviewed by Vaibhav and tested on DM355, DM6446, AM3517 & DM365. I will request Kevin to pull the Architecture part of this patch. Thanks. Murali Karicheri Software Design Engineer Texas Instruments Inc. Germantown, MD 20874 phone: 301-407-9583 email: m-karicheri2@xxxxxx >-----Original Message----- >From: Karicheri, Muralidharan >Sent: Tuesday, December 01, 2009 12:19 PM >To: linux-media@xxxxxxxxxxxxxxx; hverkuil@xxxxxxxxx; >khilman@xxxxxxxxxxxxxxxxxxx >Cc: davinci-linux-open-source@xxxxxxxxxxxxxxxxxxxx; Hiremath, Vaibhav; >Karicheri, Muralidharan >Subject: [PATCH - v1 1/2] V4L - vpfe capture - make clocks configurable > >From: Muralidharan Karicheri <m-karicheri2@xxxxxx> > >v1 - updated based on comments from Vaibhav Hiremath. > >On DM365 we use only vpss master clock, where as on DM355 and >DM6446, we use vpss master and slave clocks for vpfe capture and AM3517 >we use internal clock and pixel clock. So this patch makes it configurable >on a per platform basis. This is needed for supporting DM365 for which >patches >will be available soon. > >Tested-by: Vaibhav Hiremath <hvaibhav@xxxxxx>, Muralidharan Karicheri <m- >karicheri2@xxxxxx> >Acked-by: Vaibhav Hiremath <hvaibhav@xxxxxx> >Signed-off-by: Muralidharan Karicheri <m-karicheri2@xxxxxx> >--- > drivers/media/video/davinci/vpfe_capture.c | 98 +++++++++++++++++------- >--- > include/media/davinci/vpfe_capture.h | 11 ++- > 2 files changed, 70 insertions(+), 39 deletions(-) > >diff --git a/drivers/media/video/davinci/vpfe_capture.c >b/drivers/media/video/davinci/vpfe_capture.c >index 12a1b3d..c3468ee 100644 >--- a/drivers/media/video/davinci/vpfe_capture.c >+++ b/drivers/media/video/davinci/vpfe_capture.c >@@ -1787,61 +1787,87 @@ static struct vpfe_device *vpfe_initialize(void) > return vpfe_dev; > } > >+/** >+ * vpfe_disable_clock() - Disable clocks for vpfe capture driver >+ * @vpfe_dev - ptr to vpfe capture device >+ * >+ * Disables clocks defined in vpfe configuration. >+ */ > static void vpfe_disable_clock(struct vpfe_device *vpfe_dev) > { > struct vpfe_config *vpfe_cfg = vpfe_dev->cfg; >+ int i; > >- clk_disable(vpfe_cfg->vpssclk); >- clk_put(vpfe_cfg->vpssclk); >- clk_disable(vpfe_cfg->slaveclk); >- clk_put(vpfe_cfg->slaveclk); >- v4l2_info(vpfe_dev->pdev->driver, >- "vpfe vpss master & slave clocks disabled\n"); >+ for (i = 0; i < vpfe_cfg->num_clocks; i++) { >+ clk_disable(vpfe_dev->clks[i]); >+ clk_put(vpfe_dev->clks[i]); >+ } >+ kfree(vpfe_dev->clks); >+ v4l2_info(vpfe_dev->pdev->driver, "vpfe capture clocks disabled\n"); > } > >+/** >+ * vpfe_enable_clock() - Enable clocks for vpfe capture driver >+ * @vpfe_dev - ptr to vpfe capture device >+ * >+ * Enables clocks defined in vpfe configuration. The function >+ * assumes that at least one clock is to be defined which is >+ * true as of now. re-visit this if this assumption is not true >+ */ > static int vpfe_enable_clock(struct vpfe_device *vpfe_dev) > { > struct vpfe_config *vpfe_cfg = vpfe_dev->cfg; >- int ret = -ENOENT; >+ int i; > >- vpfe_cfg->vpssclk = clk_get(vpfe_dev->pdev, "vpss_master"); >- if (NULL == vpfe_cfg->vpssclk) { >- v4l2_err(vpfe_dev->pdev->driver, "No clock defined for" >- "vpss_master\n"); >- return ret; >- } >+ if (!vpfe_cfg->num_clocks) >+ return 0; > >- if (clk_enable(vpfe_cfg->vpssclk)) { >- v4l2_err(vpfe_dev->pdev->driver, >- "vpfe vpss master clock not enabled\n"); >- goto out; >- } >- v4l2_info(vpfe_dev->pdev->driver, >- "vpfe vpss master clock enabled\n"); >+ vpfe_dev->clks = kzalloc(vpfe_cfg->num_clocks * >+ sizeof(struct clock *), GFP_KERNEL); > >- vpfe_cfg->slaveclk = clk_get(vpfe_dev->pdev, "vpss_slave"); >- if (NULL == vpfe_cfg->slaveclk) { >- v4l2_err(vpfe_dev->pdev->driver, >- "No clock defined for vpss slave\n"); >- goto out; >+ if (NULL == vpfe_dev->clks) { >+ v4l2_err(vpfe_dev->pdev->driver, "Memory allocation failed\n"); >+ return -ENOMEM; > } > >- if (clk_enable(vpfe_cfg->slaveclk)) { >- v4l2_err(vpfe_dev->pdev->driver, >- "vpfe vpss slave clock not enabled\n"); >- goto out; >+ for (i = 0; i < vpfe_cfg->num_clocks; i++) { >+ if (NULL == vpfe_cfg->clocks[i]) { >+ v4l2_err(vpfe_dev->pdev->driver, >+ "clock %s is not defined in vpfe config\n", >+ vpfe_cfg->clocks[i]); >+ goto out; >+ } >+ >+ vpfe_dev->clks[i] = clk_get(vpfe_dev->pdev, >+ vpfe_cfg->clocks[i]); >+ if (NULL == vpfe_dev->clks[i]) { >+ v4l2_err(vpfe_dev->pdev->driver, >+ "Failed to get clock %s\n", >+ vpfe_cfg->clocks[i]); >+ goto out; >+ } >+ >+ if (clk_enable(vpfe_dev->clks[i])) { >+ v4l2_err(vpfe_dev->pdev->driver, >+ "vpfe clock %s not enabled\n", >+ vpfe_cfg->clocks[i]); >+ goto out; >+ } >+ >+ v4l2_info(vpfe_dev->pdev->driver, "vpss clock %s enabled", >+ vpfe_cfg->clocks[i]); > } >- v4l2_info(vpfe_dev->pdev->driver, "vpfe vpss slave clock enabled\n"); > return 0; > out: >- if (vpfe_cfg->vpssclk) >- clk_put(vpfe_cfg->vpssclk); >- if (vpfe_cfg->slaveclk) >- clk_put(vpfe_cfg->slaveclk); >- >- return -1; >+ for (i = 0; i < vpfe_cfg->num_clocks; i++) { >+ if (vpfe_dev->clks[i]) >+ clk_put(vpfe_dev->clks[i]); >+ } >+ kfree(vpfe_dev->clks); >+ return -EFAULT; > } > >+ > /* > * vpfe_probe : This function creates device entries by register > * itself to the V4L2 driver and initializes fields of each >diff --git a/include/media/davinci/vpfe_capture.h >b/include/media/davinci/vpfe_capture.h >index d863e5e..7b62a5c 100644 >--- a/include/media/davinci/vpfe_capture.h >+++ b/include/media/davinci/vpfe_capture.h >@@ -31,8 +31,6 @@ > #include <media/videobuf-dma-contig.h> > #include <media/davinci/vpfe_types.h> > >-#define VPFE_CAPTURE_NUM_DECODERS 5 >- > /* Macros */ > #define VPFE_MAJOR_RELEASE 0 > #define VPFE_MINOR_RELEASE 0 >@@ -91,9 +89,14 @@ struct vpfe_config { > char *card_name; > /* ccdc name */ > char *ccdc; >- /* vpfe clock */ >+ /* vpfe clock. Obsolete! Will be removed in next patch */ > struct clk *vpssclk; >+ /* Obsolete! Will be removed in next patch */ > struct clk *slaveclk; >+ /* number of clocks */ >+ int num_clocks; >+ /* clocks used for vpfe capture */ >+ char *clocks[]; > }; > > struct vpfe_device { >@@ -104,6 +107,8 @@ struct vpfe_device { > struct v4l2_subdev **sd; > /* vpfe cfg */ > struct vpfe_config *cfg; >+ /* clock ptrs for vpfe capture */ >+ struct clk **clks; > /* V4l2 device */ > struct v4l2_device v4l2_dev; > /* parent device */ >-- >1.6.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html