提交 a081c340 编写于 作者: H Hans de Goede 提交者: Mauro Carvalho Chehab

[media] pwc: Remove dev_hint module parameter

The code for this is rather crufty, and being able to tie a device
to a specific minor is not really something we want to support in
a modern udev based world.
Signed-off-by: NHans de Goede <hdegoede@redhat.com>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 24be689b
...@@ -133,12 +133,6 @@ static struct usb_driver pwc_driver = { ...@@ -133,12 +133,6 @@ static struct usb_driver pwc_driver = {
#endif #endif
static int power_save = -1; static int power_save = -1;
static int led_on = 100, led_off; /* defaults to LED that is on while in use */ static int led_on = 100, led_off; /* defaults to LED that is on while in use */
static struct {
int type;
char serial_number[30];
int device_node;
struct pwc_device *pdev;
} device_hint[MAX_DEV_HINTS];
/***/ /***/
...@@ -596,15 +590,8 @@ int pwc_test_n_set_capt_file(struct pwc_device *pdev, struct file *file) ...@@ -596,15 +590,8 @@ int pwc_test_n_set_capt_file(struct pwc_device *pdev, struct file *file)
static void pwc_video_release(struct v4l2_device *v) static void pwc_video_release(struct v4l2_device *v)
{ {
struct pwc_device *pdev = container_of(v, struct pwc_device, v4l2_dev); struct pwc_device *pdev = container_of(v, struct pwc_device, v4l2_dev);
int hint;
/* search device_hint[] table if we occupy a slot, by any chance */
for (hint = 0; hint < MAX_DEV_HINTS; hint++)
if (device_hint[hint].pdev == pdev)
device_hint[hint].pdev = NULL;
v4l2_ctrl_handler_free(&pdev->ctrl_handler); v4l2_ctrl_handler_free(&pdev->ctrl_handler);
kfree(pdev->ctrl_buf); kfree(pdev->ctrl_buf);
kfree(pdev); kfree(pdev);
} }
...@@ -805,10 +792,9 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id ...@@ -805,10 +792,9 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
struct usb_device *udev = interface_to_usbdev(intf); struct usb_device *udev = interface_to_usbdev(intf);
struct pwc_device *pdev = NULL; struct pwc_device *pdev = NULL;
int vendor_id, product_id, type_id; int vendor_id, product_id, type_id;
int hint, rc; int rc;
int features = 0; int features = 0;
int compression = 0; int compression = 0;
int video_nr = -1; /* default: use next available device */
int my_power_save = power_save; int my_power_save = power_save;
char serial_number[30], *name; char serial_number[30], *name;
...@@ -1098,24 +1084,6 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id ...@@ -1098,24 +1084,6 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
pdev->release = le16_to_cpu(udev->descriptor.bcdDevice); pdev->release = le16_to_cpu(udev->descriptor.bcdDevice);
PWC_DEBUG_PROBE("Release: %04x\n", pdev->release); PWC_DEBUG_PROBE("Release: %04x\n", pdev->release);
/* Now search device_hint[] table for a match, so we can hint a node number. */
for (hint = 0; hint < MAX_DEV_HINTS; hint++) {
if (((device_hint[hint].type == -1) || (device_hint[hint].type == pdev->type)) &&
(device_hint[hint].pdev == NULL)) {
/* so far, so good... try serial number */
if ((device_hint[hint].serial_number[0] == '*') || !strcmp(device_hint[hint].serial_number, serial_number)) {
/* match! */
video_nr = device_hint[hint].device_node;
PWC_DEBUG_PROBE("Found hint, will try to register as /dev/video%d\n", video_nr);
break;
}
}
}
/* occupy slot */
if (hint < MAX_DEV_HINTS)
device_hint[hint].pdev = pdev;
/* Allocate USB command buffers */ /* Allocate USB command buffers */
pdev->ctrl_buf = kmalloc(sizeof(pdev->cmd_buf), GFP_KERNEL); pdev->ctrl_buf = kmalloc(sizeof(pdev->cmd_buf), GFP_KERNEL);
if (!pdev->ctrl_buf) { if (!pdev->ctrl_buf) {
...@@ -1163,7 +1131,7 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id ...@@ -1163,7 +1131,7 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
pdev->v4l2_dev.ctrl_handler = &pdev->ctrl_handler; pdev->v4l2_dev.ctrl_handler = &pdev->ctrl_handler;
pdev->vdev.v4l2_dev = &pdev->v4l2_dev; pdev->vdev.v4l2_dev = &pdev->v4l2_dev;
rc = video_register_device(&pdev->vdev, VFL_TYPE_GRABBER, video_nr); rc = video_register_device(&pdev->vdev, VFL_TYPE_GRABBER, -1);
if (rc < 0) { if (rc < 0) {
PWC_ERROR("Failed to register as video device (%d).\n", rc); PWC_ERROR("Failed to register as video device (%d).\n", rc);
goto err_unregister_v4l2_dev; goto err_unregister_v4l2_dev;
...@@ -1206,8 +1174,6 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id ...@@ -1206,8 +1174,6 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
err_free_controls: err_free_controls:
v4l2_ctrl_handler_free(&pdev->ctrl_handler); v4l2_ctrl_handler_free(&pdev->ctrl_handler);
err_free_mem: err_free_mem:
if (hint < MAX_DEV_HINTS)
device_hint[hint].pdev = NULL;
kfree(pdev->ctrl_buf); kfree(pdev->ctrl_buf);
kfree(pdev); kfree(pdev);
return rc; return rc;
...@@ -1245,22 +1211,18 @@ static void usb_pwc_disconnect(struct usb_interface *intf) ...@@ -1245,22 +1211,18 @@ static void usb_pwc_disconnect(struct usb_interface *intf)
static int leds[2] = { -1, -1 }; static int leds[2] = { -1, -1 };
static unsigned int leds_nargs; static unsigned int leds_nargs;
static char *dev_hint[MAX_DEV_HINTS];
static unsigned int dev_hint_nargs;
#ifdef CONFIG_USB_PWC_DEBUG #ifdef CONFIG_USB_PWC_DEBUG
module_param_named(trace, pwc_trace, int, 0644); module_param_named(trace, pwc_trace, int, 0644);
#endif #endif
module_param(power_save, int, 0644); module_param(power_save, int, 0644);
module_param_array(leds, int, &leds_nargs, 0444); module_param_array(leds, int, &leds_nargs, 0444);
module_param_array(dev_hint, charp, &dev_hint_nargs, 0444);
#ifdef CONFIG_USB_PWC_DEBUG #ifdef CONFIG_USB_PWC_DEBUG
MODULE_PARM_DESC(trace, "For debugging purposes"); MODULE_PARM_DESC(trace, "For debugging purposes");
#endif #endif
MODULE_PARM_DESC(power_save, "Turn power saving for new cameras on or off"); MODULE_PARM_DESC(power_save, "Turn power saving for new cameras on or off");
MODULE_PARM_DESC(leds, "LED on,off time in milliseconds"); MODULE_PARM_DESC(leds, "LED on,off time in milliseconds");
MODULE_PARM_DESC(dev_hint, "Device node hints");
MODULE_DESCRIPTION("Philips & OEM USB webcam driver"); MODULE_DESCRIPTION("Philips & OEM USB webcam driver");
MODULE_AUTHOR("Luc Saillard <luc@saillard.org>"); MODULE_AUTHOR("Luc Saillard <luc@saillard.org>");
...@@ -1270,105 +1232,18 @@ MODULE_VERSION( PWC_VERSION ); ...@@ -1270,105 +1232,18 @@ MODULE_VERSION( PWC_VERSION );
static int __init usb_pwc_init(void) static int __init usb_pwc_init(void)
{ {
int i;
#ifdef CONFIG_USB_PWC_DEBUG
PWC_INFO("Philips webcam module version " PWC_VERSION " loaded.\n");
PWC_INFO("Supports Philips PCA645/646, PCVC675/680/690, PCVC720[40]/730/740/750 & PCVC830/840.\n");
PWC_INFO("Also supports the Askey VC010, various Logitech Quickcams, Samsung MPC-C10 and MPC-C30,\n");
PWC_INFO("the Creative WebCam 5 & Pro Ex, SOTEC Afina Eye and Visionite VCS-UC300 and VCS-UM100.\n");
if (pwc_trace >= 0) {
PWC_DEBUG_MODULE("Trace options: 0x%04x\n", pwc_trace);
}
#endif
if (leds[0] >= 0) if (leds[0] >= 0)
led_on = leds[0]; led_on = leds[0];
if (leds[1] >= 0) if (leds[1] >= 0)
led_off = leds[1]; led_off = leds[1];
/* Big device node whoopla. Basically, it allows you to assign a
device node (/dev/videoX) to a camera, based on its type
& serial number. The format is [type[.serialnumber]:]node.
Any camera that isn't matched by these rules gets the next
available free device node.
*/
for (i = 0; i < MAX_DEV_HINTS; i++) {
char *s, *colon, *dot;
/* This loop also initializes the array */
device_hint[i].pdev = NULL;
s = dev_hint[i];
if (s != NULL && *s != '\0') {
device_hint[i].type = -1; /* wildcard */
strcpy(device_hint[i].serial_number, "*");
/* parse string: chop at ':' & '/' */
colon = dot = s;
while (*colon != '\0' && *colon != ':')
colon++;
while (*dot != '\0' && *dot != '.')
dot++;
/* Few sanity checks */
if (*dot != '\0' && dot > colon) {
PWC_ERROR("Malformed camera hint: the colon must be after the dot.\n");
return -EINVAL;
}
if (*colon == '\0') {
/* No colon */
if (*dot != '\0') {
PWC_ERROR("Malformed camera hint: no colon + device node given.\n");
return -EINVAL;
}
else {
/* No type or serial number specified, just a number. */
device_hint[i].device_node =
simple_strtol(s, NULL, 10);
}
}
else {
/* There's a colon, so we have at least a type and a device node */
device_hint[i].type =
simple_strtol(s, NULL, 10);
device_hint[i].device_node =
simple_strtol(colon + 1, NULL, 10);
if (*dot != '\0') {
/* There's a serial number as well */
int k;
dot++;
k = 0;
while (*dot != ':' && k < 29) {
device_hint[i].serial_number[k++] = *dot;
dot++;
}
device_hint[i].serial_number[k] = '\0';
}
}
PWC_TRACE("device_hint[%d]:\n", i);
PWC_TRACE(" type : %d\n", device_hint[i].type);
PWC_TRACE(" serial# : %s\n", device_hint[i].serial_number);
PWC_TRACE(" node : %d\n", device_hint[i].device_node);
}
else
device_hint[i].type = 0; /* not filled */
} /* ..for MAX_DEV_HINTS */
PWC_DEBUG_PROBE("Registering driver at address 0x%p.\n", &pwc_driver);
return usb_register(&pwc_driver); return usb_register(&pwc_driver);
} }
static void __exit usb_pwc_exit(void) static void __exit usb_pwc_exit(void)
{ {
PWC_DEBUG_MODULE("Deregistering driver.\n");
usb_deregister(&pwc_driver); usb_deregister(&pwc_driver);
PWC_INFO("Philips webcam module removed.\n");
} }
module_init(usb_pwc_init); module_init(usb_pwc_init);
module_exit(usb_pwc_exit); module_exit(usb_pwc_exit);
/* vim: set cino= formatoptions=croql cindent shiftwidth=8 tabstop=8: */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册