RE: [PATCH v1 - 4/5] V4L : vpif updates for DM6467 vpif capture driver

2009-08-17 Thread Karicheri, Muralidharan
Vaibhav,

I don't see any serious issues raised here. I can send another patch to fix 
this if needed. 

Regards,
Murali
 +#include linux/spinlock.h
  #include linux/kernel.h
 +#include linux/io.h
[Hiremath, Vaibhav] You may want to put one line gap here.
Ok. Just editorial.
 +#include mach/hardware.h

  #include vpif.h

 @@ -31,6 +35,12 @@ MODULE_LICENSE(GPL);
  #define VPIF_CH2_MAX_MODES  (15)
  #define VPIF_CH3_MAX_MODES  (02)

 +static resource_size_t  res_len;
 +static struct resource  *res;
[Hiremath, Vaibhav] Do we really require this to be static variable?
I think we can manage it to be local variable.
Yes. We could. Probably change it with a new patch. Don't want to hold up merge 
because of this.

 +spinlock_t vpif_lock;
 +
 +void __iomem *vpif_base;
 +
  static inline void vpif_wr_bit(u32 reg, u32 bit, u32 val)
  {
  if (val)
 @@ -151,17 +161,17 @@ static void config_vpif_params(struct
 vpif_params *vpifparams,
  else if (config-capture_format) {
  /* Set the polarity of various pins */
  vpif_wr_bit(reg, VPIF_CH_FID_POLARITY_BIT,
 -vpifparams-
 params.raw_params.fid_pol);
 +vpifparams-iface.fid_pol);
  vpif_wr_bit(reg, VPIF_CH_V_VALID_POLARITY_BIT,
 -vpifparams-params.raw_params.vd_pol);
 +vpifparams-iface.vd_pol);
  vpif_wr_bit(reg, VPIF_CH_H_VALID_POLARITY_BIT,
 -vpifparams-params.raw_params.hd_pol);
 +vpifparams-iface.hd_pol);

  value = regr(reg);
  /* Set data width */
  value = ((~(unsigned int)(0x3)) 
  VPIF_CH_DATA_WIDTH_BIT);
 -value |= ((vpifparams-params.raw_params.data_sz)
 
 +value |= ((vpifparams-params.data_sz) 
   VPIF_CH_DATA_WIDTH_BIT);
  regw(value, reg);
  }
 @@ -227,8 +237,60 @@ int vpif_channel_getfid(u8 channel_id)
  }
  EXPORT_SYMBOL(vpif_channel_getfid);

 -void vpif_base_addr_init(void __iomem *base)
 +static int __init vpif_probe(struct platform_device *pdev)
 +{
 +int status = 0;
 +
 +res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 +if (!res)
 +return -ENOENT;
 +
 +res_len = res-end - res-start + 1;
 +
 +res = request_mem_region(res-start, res_len, res-name);
 +if (!res)
 +return -EBUSY;
 +
 +vpif_base = ioremap(res-start, res_len);
 +if (!vpif_base) {
 +status = -EBUSY;
 +goto fail;
 +}
 +
 +spin_lock_init(vpif_lock);
 +dev_info(pdev-dev, vpif probe success\n);
 +return 0;
 +
 +fail:
 +release_mem_region(res-start, res_len);
 +return status;
 +}
 +
 +static int vpif_remove(struct platform_device *pdev)
  {
 -vpif_base = base;
 +iounmap(vpif_base);
 +release_mem_region(res-start, res_len);
 +return 0;
  }
 -EXPORT_SYMBOL(vpif_base_addr_init);
 +
 +static struct platform_driver vpif_driver = {
 +.driver = {
 +.name   = vpif,
 +.owner = THIS_MODULE,
 +},
 +.remove = __devexit_p(vpif_remove),
 +.probe = vpif_probe,
 +};
 +
 +static void vpif_exit(void)
 +{
 +platform_driver_unregister(vpif_driver);
 +}
 +
 +static int __init vpif_init(void)
 +{
 +return platform_driver_register(vpif_driver);
 +}
 +subsys_initcall(vpif_init);
 +module_exit(vpif_exit);
 +
 diff --git a/drivers/media/video/davinci/vpif.h
 b/drivers/media/video/davinci/vpif.h
 index fca26dc..188841b 100644
 --- a/drivers/media/video/davinci/vpif.h
 +++ b/drivers/media/video/davinci/vpif.h
 @@ -19,6 +19,7 @@
  #include linux/io.h
  #include linux/videodev2.h
[Hiremath, Vaibhav] one line gap here.
Again editorial.
  #include mach/hardware.h
 +#include mach/dm646x.h

  /* Maximum channel allowed */
  #define VPIF_NUM_CHANNELS   (4)
 @@ -26,7 +27,9 @@
  #define VPIF_DISPLAY_NUM_CHANNELS   (2)

  /* Macros to read/write registers */
 -static void __iomem *vpif_base;
 +extern void __iomem *vpif_base;
 +extern spinlock_t vpif_lock;
[Hiremath, Vaibhav] I think I would want to check compete driver. How these
extern variables have been used.

Let me know if you find some thing wrong in the driver. At this time, I just 
don't see any issues with this.
 +
  #define regr(reg)   readl((reg) + vpif_base)
  #define regw(value, reg)writel(value, (reg + vpif_base))

 @@ -280,6 +283,10 @@ static inline void enable_channel1(int enable)
  /* inline function to enable interrupt for channel0 */
  static inline void channel0_intr_enable(int enable)
  {
 +unsigned long flags;
 +
 +spin_lock_irqsave(vpif_lock, flags);
 +
  if (enable) {
  regw((regr(VPIF_INTEN) | 0x10), VPIF_INTEN);
 

RE: [PATCH v1 - 4/5] V4L : vpif updates for DM6467 vpif capture driver

2009-08-17 Thread Karicheri, Muralidharan
Yes. I will send another patch later to fix the static variables.

Murali Karicheri
Software Design Engineer
Texas Instruments Inc.
Germantown, MD 20874
new phone: 301-407-9583
Old Phone : 301-515-3736 (will be deprecated)
email: m-kariche...@ti.com

-Original Message-
From: Hiremath, Vaibhav
Sent: Monday, August 17, 2009 12:35 PM
To: Karicheri, Muralidharan; linux-media@vger.kernel.org
Cc: davinci-linux-open-sou...@linux.davincidsp.com; hverk...@xs4all.nl
Subject: RE: [PATCH v1 - 4/5] V4L : vpif updates for DM6467 vpif capture
driver

H Murali,

 -Original Message-
 From: Karicheri, Muralidharan
 Sent: Monday, August 17, 2009 9:38 PM
 To: Hiremath, Vaibhav; linux-media@vger.kernel.org
 Cc: davinci-linux-open-sou...@linux.davincidsp.com;
 hverk...@xs4all.nl
 Subject: RE: [PATCH v1 - 4/5] V4L : vpif updates for DM6467 vpif
 capture driver

 Vaibhav,

 I don't see any serious issues raised here. I can send another patch
 to fix this if needed.
[Hiremath, Vaibhav] yes most of them are editorial, as I mentioned I just
reviewed it quickly.

But as far as static variables are concerned I still think we can avoid
them completely, again it's not critical though.

As I mentioned I will have to look for extern variables, how they have been
used and stuff like that.
As of now, I am ok if it gets merged.


 Regards,
 Murali
  +#include linux/spinlock.h
   #include linux/kernel.h
  +#include linux/io.h
 [Hiremath, Vaibhav] You may want to put one line gap here.
 Ok. Just editorial.
  +#include mach/hardware.h
 
   #include vpif.h
 
  @@ -31,6 +35,12 @@ MODULE_LICENSE(GPL);
   #define VPIF_CH2_MAX_MODES   (15)
   #define VPIF_CH3_MAX_MODES   (02)
 
  +static resource_size_t   res_len;
  +static struct resource   *res;
 [Hiremath, Vaibhav] Do we really require this to be static
 variable?
 I think we can manage it to be local variable.
 Yes. We could. Probably change it with a new patch. Don't want to
 hold up merge because of this.
 
  +spinlock_t vpif_lock;
  +
  +void __iomem *vpif_base;
  +
   static inline void vpif_wr_bit(u32 reg, u32 bit, u32 val)
   {
if (val)
  @@ -151,17 +161,17 @@ static void config_vpif_params(struct
  vpif_params *vpifparams,
else if (config-capture_format) {
/* Set the polarity of various pins */
vpif_wr_bit(reg, VPIF_CH_FID_POLARITY_BIT,
  - vpifparams-
  params.raw_params.fid_pol);
  + vpifparams-iface.fid_pol);
vpif_wr_bit(reg, VPIF_CH_V_VALID_POLARITY_BIT,
  - vpifparams-params.raw_params.vd_pol);
  + vpifparams-iface.vd_pol);
vpif_wr_bit(reg, VPIF_CH_H_VALID_POLARITY_BIT,
  - vpifparams-params.raw_params.hd_pol);
  + vpifparams-iface.hd_pol);
 
value = regr(reg);
/* Set data width */
value = ((~(unsigned int)(0x3)) 
VPIF_CH_DATA_WIDTH_BIT);
  - value |= ((vpifparams-params.raw_params.data_sz)
  
  + value |= ((vpifparams-params.data_sz) 
 VPIF_CH_DATA_WIDTH_BIT);
regw(value, reg);
}
  @@ -227,8 +237,60 @@ int vpif_channel_getfid(u8 channel_id)
   }
   EXPORT_SYMBOL(vpif_channel_getfid);
 
  -void vpif_base_addr_init(void __iomem *base)
  +static int __init vpif_probe(struct platform_device *pdev)
  +{
  + int status = 0;
  +
  + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  + if (!res)
  + return -ENOENT;
  +
  + res_len = res-end - res-start + 1;
  +
  + res = request_mem_region(res-start, res_len, res-name);
  + if (!res)
  + return -EBUSY;
  +
  + vpif_base = ioremap(res-start, res_len);
  + if (!vpif_base) {
  + status = -EBUSY;
  + goto fail;
  + }
  +
  + spin_lock_init(vpif_lock);
  + dev_info(pdev-dev, vpif probe success\n);
  + return 0;
  +
  +fail:
  + release_mem_region(res-start, res_len);
  + return status;
  +}
  +
  +static int vpif_remove(struct platform_device *pdev)
   {
  - vpif_base = base;
  + iounmap(vpif_base);
  + release_mem_region(res-start, res_len);
  + return 0;
   }
  -EXPORT_SYMBOL(vpif_base_addr_init);
  +
  +static struct platform_driver vpif_driver = {
  + .driver = {
  + .name   = vpif,
  + .owner = THIS_MODULE,
  + },
  + .remove = __devexit_p(vpif_remove),
  + .probe = vpif_probe,
  +};
  +
  +static void vpif_exit(void)
  +{
  + platform_driver_unregister(vpif_driver);
  +}
  +
  +static int __init vpif_init(void)
  +{
  + return platform_driver_register(vpif_driver);
  +}
  +subsys_initcall(vpif_init);
  +module_exit(vpif_exit);
  +
  diff --git a/drivers/media/video/davinci/vpif.h
  b/drivers/media/video/davinci/vpif.h
  index fca26dc..188841b 100644
  --- a/drivers/media/video

RE: [PATCH v1 - 4/5] V4L : vpif updates for DM6467 vpif capture driver

2009-08-16 Thread Hiremath, Vaibhav
Quick review comments below -

 -Original Message-
 From: linux-media-ow...@vger.kernel.org [mailto:linux-media-
 ow...@vger.kernel.org] On Behalf Of Karicheri, Muralidharan
 Sent: Saturday, August 15, 2009 2:32 AM
 To: linux-media@vger.kernel.org
 Cc: davinci-linux-open-sou...@linux.davincidsp.com;
 hverk...@xs4all.nl; Karicheri, Muralidharan
 Subject: [PATCH v1 - 4/5] V4L : vpif updates for DM6467 vpif capture
 driver
 
 From: Muralidharan Karicheri m-kariche...@ti.com
 
 Following changes done for vpif driver to support vpif capture:-
   1) Current version of display driver defined vpif register
  space as part for vpif display platform driver resource
  This is not correct since vpif is common across capture
  and display drivers. So the resource iomap function is
  moved to this module
   2) Since there are common registers, a spinlock is added for
  mutual exclusion.
 
 This has incorporated comments against version v0 of the patch
 series
 
 Reviewed-by: Hans Verkuil hverk...@xs4all.nl
 
 Signed-off-by: Muralidharan Karicheri m-kariche...@ti.com
 ---
 Applies to V4L-DVB linux-next repository
  drivers/media/video/davinci/vpif.c |   76
 ---
  drivers/media/video/davinci/vpif.h |   48 ++-
  2 files changed, 98 insertions(+), 26 deletions(-)
 
 diff --git a/drivers/media/video/davinci/vpif.c
 b/drivers/media/video/davinci/vpif.c
 index aa77126..3b8eac3 100644
 --- a/drivers/media/video/davinci/vpif.c
 +++ b/drivers/media/video/davinci/vpif.c
 @@ -19,7 +19,11 @@
 
  #include linux/init.h
  #include linux/module.h
 +#include linux/platform_device.h
 +#include linux/spinlock.h
  #include linux/kernel.h
 +#include linux/io.h
[Hiremath, Vaibhav] You may want to put one line gap here.
 +#include mach/hardware.h
 
  #include vpif.h
 
 @@ -31,6 +35,12 @@ MODULE_LICENSE(GPL);
  #define VPIF_CH2_MAX_MODES   (15)
  #define VPIF_CH3_MAX_MODES   (02)
 
 +static resource_size_t   res_len;
 +static struct resource   *res;
[Hiremath, Vaibhav] Do we really require this to be static variable?
I think we can manage it to be local variable.

 +spinlock_t vpif_lock;
 +
 +void __iomem *vpif_base;
 +
  static inline void vpif_wr_bit(u32 reg, u32 bit, u32 val)
  {
   if (val)
 @@ -151,17 +161,17 @@ static void config_vpif_params(struct
 vpif_params *vpifparams,
   else if (config-capture_format) {
   /* Set the polarity of various pins */
   vpif_wr_bit(reg, VPIF_CH_FID_POLARITY_BIT,
 - vpifparams-
 params.raw_params.fid_pol);
 + vpifparams-iface.fid_pol);
   vpif_wr_bit(reg, VPIF_CH_V_VALID_POLARITY_BIT,
 - vpifparams-params.raw_params.vd_pol);
 + vpifparams-iface.vd_pol);
   vpif_wr_bit(reg, VPIF_CH_H_VALID_POLARITY_BIT,
 - vpifparams-params.raw_params.hd_pol);
 + vpifparams-iface.hd_pol);
 
   value = regr(reg);
   /* Set data width */
   value = ((~(unsigned int)(0x3)) 
   VPIF_CH_DATA_WIDTH_BIT);
 - value |= ((vpifparams-params.raw_params.data_sz)
 
 + value |= ((vpifparams-params.data_sz) 
VPIF_CH_DATA_WIDTH_BIT);
   regw(value, reg);
   }
 @@ -227,8 +237,60 @@ int vpif_channel_getfid(u8 channel_id)
  }
  EXPORT_SYMBOL(vpif_channel_getfid);
 
 -void vpif_base_addr_init(void __iomem *base)
 +static int __init vpif_probe(struct platform_device *pdev)
 +{
 + int status = 0;
 +
 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 + if (!res)
 + return -ENOENT;
 +
 + res_len = res-end - res-start + 1;
 +
 + res = request_mem_region(res-start, res_len, res-name);
 + if (!res)
 + return -EBUSY;
 +
 + vpif_base = ioremap(res-start, res_len);
 + if (!vpif_base) {
 + status = -EBUSY;
 + goto fail;
 + }
 +
 + spin_lock_init(vpif_lock);
 + dev_info(pdev-dev, vpif probe success\n);
 + return 0;
 +
 +fail:
 + release_mem_region(res-start, res_len);
 + return status;
 +}
 +
 +static int vpif_remove(struct platform_device *pdev)
  {
 - vpif_base = base;
 + iounmap(vpif_base);
 + release_mem_region(res-start, res_len);
 + return 0;
  }
 -EXPORT_SYMBOL(vpif_base_addr_init);
 +
 +static struct platform_driver vpif_driver = {
 + .driver = {
 + .name   = vpif,
 + .owner = THIS_MODULE,
 + },
 + .remove = __devexit_p(vpif_remove),
 + .probe = vpif_probe,
 +};
 +
 +static void vpif_exit(void)
 +{
 + platform_driver_unregister(vpif_driver);