Vaibhav, Thanks for testing this. I will update the patch for your comments. Murali Karicheri Software Design Engineer Texas Instruments Inc. Germantown, MD 20874 phone: 301-407-9583 email: m-karicheri2@xxxxxx >-----Original Message----- >From: Hiremath, Vaibhav >Sent: Tuesday, November 24, 2009 11:25 PM >To: Karicheri, Muralidharan; linux-media@xxxxxxxxxxxxxxx; >hverkuil@xxxxxxxxx; khilman@xxxxxxxxxxxxxxxxxxx >Cc: davinci-linux-open-source@xxxxxxxxxxxxxxxxxxxx >Subject: RE: [PATCH - v0 1/2] V4L - vpfe capture - make clocks configurable > > >> -----Original Message----- >> From: davinci-linux-open-source-bounces@xxxxxxxxxxxxxxxxxxxx >> [mailto:davinci-linux-open-source-bounces@xxxxxxxxxxxxxxxxxxxx] On >> Behalf Of Karicheri, Muralidharan >> Sent: Wednesday, November 25, 2009 5:07 AM >> To: linux-media@xxxxxxxxxxxxxxx; hverkuil@xxxxxxxxx; >> khilman@xxxxxxxxxxxxxxxxxxx >> Cc: davinci-linux-open-source@xxxxxxxxxxxxxxxxxxxx >> Subject: [PATCH - v0 1/2] V4L - vpfe capture - make clocks >> configurable >> >> From: Muralidharan Karicheri <m-karicheri2@xxxxxx> >> >> On DM365 we use only vpss master clock, where as on DM355 and >> DM6446, we use vpss master and slave clocks for vpfe capture. >[Hiremath, Vaibhav] Adding one more platform here, AM3517, which uses 2 >clocks, internal clock used by internal logic and pixel clock. > >Some minor review comments below - > >Please note that I have validated these changes already on AM3517EVM, so >adding - > >Tested-by: Vaibhav Hiremath <hvaibhav@xxxxxx> >Acked-by: Vaibhav Hiremath <hvaibhav@xxxxxx> > >Thanks, >Vaibhav >> So >> this >> patch makes it configurable on a per platform basis. This is >> needed for supporting DM365 for which patches will be available >> soon. >> >> This is for review only. For merge to upstream, it will be >> re-crated against the v4l-dbv tree. >> >> 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 cad60e3..1ba9d07 100644 >> --- a/drivers/media/video/davinci/vpfe_capture.c >> +++ b/drivers/media/video/davinci/vpfe_capture.c >> @@ -1743,61 +1743,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 ret = -EFAULT, i; >[Hiremath, Vaibhav] No need of variable "ret", since we are not making use >of it. We can directly return -EFAULT from out: label. > > >Thanks, >Vaibhav >> >> - 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 ret; >> } >> >> + >> /* >> * 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 71d8982..d669e85 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 >> @@ -89,9 +87,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 { >> @@ -102,6 +105,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 >> >> _______________________________________________ >> Davinci-linux-open-source mailing list >> Davinci-linux-open-source@xxxxxxxxxxxxxxxxxxxx >> http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open- >> source -- 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