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

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

 



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