RE: [PATCH - v1 1/2] V4L - vpfe capture - make clocks configurable

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hans,

Please hold on to this. I will send you an updated patch.

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:22 PM
>To: 'Hans Verkuil'
>Cc: Hiremath, Vaibhav; linux-media@xxxxxxxxxxxxxxx
>Subject: FW: [PATCH - v1 1/2] V4L - vpfe capture - make clocks configurable
>
>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

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux