Re: [PATCH v2 1/2] [resend] radio-isa: PnP support for the new ISA radio framework

2012-03-30 Thread Hans Verkuil
Hi Ondrej,

Sorry for the delay, Real Life intervened and made it impossible for me to work
on this.

I finally had some time (and access to ISA hardware), so for both patches:

Reviewed-by: Hans Verkuil hans.verk...@cisco.com

I've also tested with with my non-PnP radio-gemtek board.

Regards,

Hans

On Thursday, March 22, 2012 19:53:01 Ondrej Zary wrote:
 Add PnP support to the new ISA radio framework.
 
 Signed-off-by: Ondrej Zary li...@rainbow-software.org
 
 diff --git a/drivers/media/radio/radio-isa.c b/drivers/media/radio/radio-isa.c
 index 02bcead..ed9039f 100644
 --- a/drivers/media/radio/radio-isa.c
 +++ b/drivers/media/radio/radio-isa.c
 @@ -26,6 +26,7 @@
  #include linux/delay.h
  #include linux/videodev2.h
  #include linux/io.h
 +#include linux/slab.h
  #include media/v4l2-device.h
  #include media/v4l2-ioctl.h
  #include media/v4l2-fh.h
 @@ -198,56 +199,31 @@ static bool radio_isa_valid_io(const struct 
 radio_isa_driver *drv, int io)
   return false;
  }
  
 -int radio_isa_probe(struct device *pdev, unsigned int dev)
 +struct radio_isa_card *radio_isa_alloc(struct radio_isa_driver *drv,
 + struct device *pdev)
  {
 - struct radio_isa_driver *drv = pdev-platform_data;
 - const struct radio_isa_ops *ops = drv-ops;
   struct v4l2_device *v4l2_dev;
 - struct radio_isa_card *isa;
 - int res;
 + struct radio_isa_card *isa = drv-ops-alloc();
 + if (!isa)
 + return NULL;
  
 - isa = drv-ops-alloc();
 - if (isa == NULL)
 - return -ENOMEM;
   dev_set_drvdata(pdev, isa);
   isa-drv = drv;
 - isa-io = drv-io_params[dev];
   v4l2_dev = isa-v4l2_dev;
   strlcpy(v4l2_dev-name, dev_name(pdev), sizeof(v4l2_dev-name));
  
 - if (drv-probe  ops-probe) {
 - int i;
 -
 - for (i = 0; i  drv-num_of_io_ports; ++i) {
 - int io = drv-io_ports[i];
 -
 - if (request_region(io, drv-region_size, 
 v4l2_dev-name)) {
 - bool found = ops-probe(isa, io);
 -
 - release_region(io, drv-region_size);
 - if (found) {
 - isa-io = io;
 - break;
 - }
 - }
 - }
 - }
 -
 - if (!radio_isa_valid_io(drv, isa-io)) {
 - int i;
 + return isa;
 +}
  
 - if (isa-io  0)
 - return -ENODEV;
 - v4l2_err(v4l2_dev, you must set an I/O address with io=0x%03x,
 - drv-io_ports[0]);
 - for (i = 1; i  drv-num_of_io_ports; i++)
 - printk(KERN_CONT /0x%03x, drv-io_ports[i]);
 - printk(KERN_CONT .\n);
 - kfree(isa);
 - return -EINVAL;
 - }
 +int radio_isa_common_probe(struct radio_isa_card *isa, struct device *pdev,
 + int radio_nr, unsigned region_size)
 +{
 + const struct radio_isa_driver *drv = isa-drv;
 + const struct radio_isa_ops *ops = drv-ops;
 + struct v4l2_device *v4l2_dev = isa-v4l2_dev;
 + int res;
  
 - if (!request_region(isa-io, drv-region_size, v4l2_dev-name)) {
 + if (!request_region(isa-io, region_size, v4l2_dev-name)) {
   v4l2_err(v4l2_dev, port 0x%x already in use\n, isa-io);
   kfree(isa);
   return -EBUSY;
 @@ -300,8 +276,8 @@ int radio_isa_probe(struct device *pdev, unsigned int dev)
   v4l2_err(v4l2_dev, Could not setup card\n);
   goto err_node_reg;
   }
 - res = video_register_device(isa-vdev, VFL_TYPE_RADIO,
 - drv-radio_nr_params[dev]);
 + res = video_register_device(isa-vdev, VFL_TYPE_RADIO, radio_nr);
 +
   if (res  0) {
   v4l2_err(v4l2_dev, Could not register device node\n);
   goto err_node_reg;
 @@ -316,24 +292,110 @@ err_node_reg:
  err_hdl:
   v4l2_device_unregister(isa-v4l2_dev);
  err_dev_reg:
 - release_region(isa-io, drv-region_size);
 + release_region(isa-io, region_size);
   kfree(isa);
   return res;
  }
 -EXPORT_SYMBOL_GPL(radio_isa_probe);
  
 -int radio_isa_remove(struct device *pdev, unsigned int dev)
 +int radio_isa_common_remove(struct radio_isa_card *isa, unsigned region_size)
  {
 - struct radio_isa_card *isa = dev_get_drvdata(pdev);
   const struct radio_isa_ops *ops = isa-drv-ops;
  
   ops-s_mute_volume(isa, true, isa-volume ? isa-volume-cur.val : 0);
   video_unregister_device(isa-vdev);
   v4l2_ctrl_handler_free(isa-hdl);
   v4l2_device_unregister(isa-v4l2_dev);
 - release_region(isa-io, isa-drv-region_size);
 + release_region(isa-io, region_size);
   v4l2_info(isa-v4l2_dev, Removed radio card %s\n, isa-drv-card);
   kfree(isa);
   return 0;
  }
 +
 +int radio_isa_probe(struct device *pdev, 

[PATCH v2 1/2] [resend] radio-isa: PnP support for the new ISA radio framework

2012-03-22 Thread Ondrej Zary
Add PnP support to the new ISA radio framework.

Signed-off-by: Ondrej Zary li...@rainbow-software.org

diff --git a/drivers/media/radio/radio-isa.c b/drivers/media/radio/radio-isa.c
index 02bcead..ed9039f 100644
--- a/drivers/media/radio/radio-isa.c
+++ b/drivers/media/radio/radio-isa.c
@@ -26,6 +26,7 @@
 #include linux/delay.h
 #include linux/videodev2.h
 #include linux/io.h
+#include linux/slab.h
 #include media/v4l2-device.h
 #include media/v4l2-ioctl.h
 #include media/v4l2-fh.h
@@ -198,56 +199,31 @@ static bool radio_isa_valid_io(const struct 
radio_isa_driver *drv, int io)
return false;
 }
 
-int radio_isa_probe(struct device *pdev, unsigned int dev)
+struct radio_isa_card *radio_isa_alloc(struct radio_isa_driver *drv,
+   struct device *pdev)
 {
-   struct radio_isa_driver *drv = pdev-platform_data;
-   const struct radio_isa_ops *ops = drv-ops;
struct v4l2_device *v4l2_dev;
-   struct radio_isa_card *isa;
-   int res;
+   struct radio_isa_card *isa = drv-ops-alloc();
+   if (!isa)
+   return NULL;
 
-   isa = drv-ops-alloc();
-   if (isa == NULL)
-   return -ENOMEM;
dev_set_drvdata(pdev, isa);
isa-drv = drv;
-   isa-io = drv-io_params[dev];
v4l2_dev = isa-v4l2_dev;
strlcpy(v4l2_dev-name, dev_name(pdev), sizeof(v4l2_dev-name));
 
-   if (drv-probe  ops-probe) {
-   int i;
-
-   for (i = 0; i  drv-num_of_io_ports; ++i) {
-   int io = drv-io_ports[i];
-
-   if (request_region(io, drv-region_size, 
v4l2_dev-name)) {
-   bool found = ops-probe(isa, io);
-
-   release_region(io, drv-region_size);
-   if (found) {
-   isa-io = io;
-   break;
-   }
-   }
-   }
-   }
-
-   if (!radio_isa_valid_io(drv, isa-io)) {
-   int i;
+   return isa;
+}
 
-   if (isa-io  0)
-   return -ENODEV;
-   v4l2_err(v4l2_dev, you must set an I/O address with io=0x%03x,
-   drv-io_ports[0]);
-   for (i = 1; i  drv-num_of_io_ports; i++)
-   printk(KERN_CONT /0x%03x, drv-io_ports[i]);
-   printk(KERN_CONT .\n);
-   kfree(isa);
-   return -EINVAL;
-   }
+int radio_isa_common_probe(struct radio_isa_card *isa, struct device *pdev,
+   int radio_nr, unsigned region_size)
+{
+   const struct radio_isa_driver *drv = isa-drv;
+   const struct radio_isa_ops *ops = drv-ops;
+   struct v4l2_device *v4l2_dev = isa-v4l2_dev;
+   int res;
 
-   if (!request_region(isa-io, drv-region_size, v4l2_dev-name)) {
+   if (!request_region(isa-io, region_size, v4l2_dev-name)) {
v4l2_err(v4l2_dev, port 0x%x already in use\n, isa-io);
kfree(isa);
return -EBUSY;
@@ -300,8 +276,8 @@ int radio_isa_probe(struct device *pdev, unsigned int dev)
v4l2_err(v4l2_dev, Could not setup card\n);
goto err_node_reg;
}
-   res = video_register_device(isa-vdev, VFL_TYPE_RADIO,
-   drv-radio_nr_params[dev]);
+   res = video_register_device(isa-vdev, VFL_TYPE_RADIO, radio_nr);
+
if (res  0) {
v4l2_err(v4l2_dev, Could not register device node\n);
goto err_node_reg;
@@ -316,24 +292,110 @@ err_node_reg:
 err_hdl:
v4l2_device_unregister(isa-v4l2_dev);
 err_dev_reg:
-   release_region(isa-io, drv-region_size);
+   release_region(isa-io, region_size);
kfree(isa);
return res;
 }
-EXPORT_SYMBOL_GPL(radio_isa_probe);
 
-int radio_isa_remove(struct device *pdev, unsigned int dev)
+int radio_isa_common_remove(struct radio_isa_card *isa, unsigned region_size)
 {
-   struct radio_isa_card *isa = dev_get_drvdata(pdev);
const struct radio_isa_ops *ops = isa-drv-ops;
 
ops-s_mute_volume(isa, true, isa-volume ? isa-volume-cur.val : 0);
video_unregister_device(isa-vdev);
v4l2_ctrl_handler_free(isa-hdl);
v4l2_device_unregister(isa-v4l2_dev);
-   release_region(isa-io, isa-drv-region_size);
+   release_region(isa-io, region_size);
v4l2_info(isa-v4l2_dev, Removed radio card %s\n, isa-drv-card);
kfree(isa);
return 0;
 }
+
+int radio_isa_probe(struct device *pdev, unsigned int dev)
+{
+   struct radio_isa_driver *drv = pdev-platform_data;
+   const struct radio_isa_ops *ops = drv-ops;
+   struct v4l2_device *v4l2_dev;
+   struct radio_isa_card *isa;
+
+   isa = radio_isa_alloc(drv, pdev);
+   if (!isa)
+   return -ENOMEM;
+   isa-io = drv-io_params[dev];
+