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

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

 



Kevin,

After sending out my last patch (moving clocks to ccdc driver), I thought of reworking it in similar lines. I will re-send the patch after incorporating
this.

Murali Karicheri
Software Design Engineer
Texas Instruments Inc.
Germantown, MD 20874
phone: 301-407-9583
email: m-karicheri2@xxxxxx

>-----Original Message-----
>From: Kevin Hilman [mailto:khilman@xxxxxxxxxxxxxxxxxxx]
>Sent: Wednesday, December 09, 2009 11:00 AM
>To: Karicheri, Muralidharan
>Cc: linux-media@xxxxxxxxxxxxxxx; hverkuil@xxxxxxxxx; davinci-linux-open-
>source@xxxxxxxxxxxxxxxxxxxx; Hiremath, Vaibhav
>Subject: Re: [PATCH - v1 1/2] V4L - vpfe capture - make clocks configurable
>
>m-karicheri2@xxxxxx writes:
>
>> 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>
>
>Sorry for jumping late into this thread, but I have a couple comments.
>
>First, we should *never* pass clock names from platform code to driver
>code.  We have the clkdevs for this.  Using clkdev, the right clock
>is determined from the driver being used and any additional info.
>
>Rather than passing the strings along, you should add the driver name
>to the 'dev_id' field of the clkdev node, and then use the 'con_id' field
>to distinguish between the two clocks:
>
>-	CLK(NULL, "vpss_master", &vpss_master_clk),
>-	CLK(NULL, "vpss_slave", &vpss_slave_clk),
>+	CLK("vpfe-capture", "master", &vpss_master_clk),
>+	CLK("vpfe-capture", "slave", &vpss_slave_clk),
>
>NOTE: this assumes clks are used from VPFE.  When you move to CCDC, this
>should change accordingly.
>
>More on the usage below...
>
>
>
>> ---
>>  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]);
>
>While cleaning this up, you should move the clk_put() to module
>disable/unload time.  You dont' need to put he clock on every disable.
>The same for clk_get(). You don't need to get the clock for every
>enable.  Just do a clk_get() at init time.
>
>> +	}
>> +	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");
>
>Using my clkdevs from above, you just need to change this to:
>
>	vpfe_cfg->vpssclk = clk_get(vpfe_dev->pdev, "master");
>
>Now that the device name is in the clkdev node, clk_get() will
>find the right clock based on the device name.
>
>> -	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");
>
>And here:
>
>	vpfe_cfg->slaveclk = clk_get(vpfe_dev->pdev, "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 */
>
>I'd drop these comment additions and just comment in the follow up patch
>why they were removed.
>
>>  	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
>
>Kevin
--
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