提交 0259567a 编写于 作者: D Dmitry Torokhov 提交者: Greg Kroah-Hartman

[PATCH] Input: convert konicawc to dynamic input_dev allocation

Input: convert konicawc to dynamic input_dev allocation

This is required for input_dev sysfs integration
Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 c7f7a569
...@@ -119,7 +119,7 @@ struct konicawc { ...@@ -119,7 +119,7 @@ struct konicawc {
int yplanesz; /* Number of bytes in the Y plane */ int yplanesz; /* Number of bytes in the Y plane */
unsigned int buttonsts:1; unsigned int buttonsts:1;
#ifdef CONFIG_INPUT #ifdef CONFIG_INPUT
struct input_dev input; struct input_dev *input;
char input_physname[64]; char input_physname[64];
#endif #endif
}; };
...@@ -218,6 +218,57 @@ static void konicawc_adjust_picture(struct uvd *uvd) ...@@ -218,6 +218,57 @@ static void konicawc_adjust_picture(struct uvd *uvd)
konicawc_camera_on(uvd); konicawc_camera_on(uvd);
} }
#ifdef CONFIG_INPUT
static void konicawc_register_input(struct konicawc *cam, struct usb_device *dev)
{
struct input_dev *input_dev;
usb_make_path(dev, cam->input_physname, sizeof(cam->input_physname));
strncat(cam->input_physname, "/input0", sizeof(cam->input_physname));
cam->input = input_dev = input_allocate_device();
if (!input_dev) {
warn("Not enough memory for camera's input device\n");
return;
}
input_dev->name = "Konicawc snapshot button";
input_dev->phys = cam->input_physname;
usb_to_input_id(dev, &input_dev->id);
input_dev->cdev.dev = &dev->dev;
input_dev->evbit[0] = BIT(EV_KEY);
input_dev->keybit[LONG(BTN_0)] = BIT(BTN_0);
input_dev->private = cam;
input_register_device(cam->input);
}
static void konicawc_unregister_input(struct konicawc *cam)
{
if (cam->input) {
input_unregister_device(cam->input);
cam->input = NULL;
}
}
static void konicawc_report_buttonstat(struct konicawc *cam)
{
if (cam->input) {
input_report_key(cam->input, BTN_0, cam->buttonsts);
input_sync(cam->input);
}
}
#else
static inline void konicawc_register_input(struct konicawc *cam, struct usb_device *dev) { }
static inline void konicawc_unregister_input(struct konicawc *cam) { }
static inline void konicawc_report_buttonstat(struct konicawc *cam) { }
#endif /* CONFIG_INPUT */
static int konicawc_compress_iso(struct uvd *uvd, struct urb *dataurb, struct urb *stsurb) static int konicawc_compress_iso(struct uvd *uvd, struct urb *dataurb, struct urb *stsurb)
{ {
...@@ -273,10 +324,7 @@ static int konicawc_compress_iso(struct uvd *uvd, struct urb *dataurb, struct ur ...@@ -273,10 +324,7 @@ static int konicawc_compress_iso(struct uvd *uvd, struct urb *dataurb, struct ur
if(button != cam->buttonsts) { if(button != cam->buttonsts) {
DEBUG(2, "button: %sclicked", button ? "" : "un"); DEBUG(2, "button: %sclicked", button ? "" : "un");
cam->buttonsts = button; cam->buttonsts = button;
#ifdef CONFIG_INPUT konicawc_report_buttonstat(cam);
input_report_key(&cam->input, BTN_0, cam->buttonsts);
input_sync(&cam->input);
#endif
} }
if(sts == 0x01) { /* drop frame */ if(sts == 0x01) { /* drop frame */
...@@ -645,9 +693,9 @@ static int konicawc_set_video_mode(struct uvd *uvd, struct video_window *vw) ...@@ -645,9 +693,9 @@ static int konicawc_set_video_mode(struct uvd *uvd, struct video_window *vw)
RingQueue_Flush(&uvd->dp); RingQueue_Flush(&uvd->dp);
cam->lastframe = -2; cam->lastframe = -2;
if(uvd->curframe != -1) { if(uvd->curframe != -1) {
uvd->frame[uvd->curframe].curline = 0; uvd->frame[uvd->curframe].curline = 0;
uvd->frame[uvd->curframe].seqRead_Length = 0; uvd->frame[uvd->curframe].seqRead_Length = 0;
uvd->frame[uvd->curframe].seqRead_Index = 0; uvd->frame[uvd->curframe].seqRead_Index = 0;
} }
konicawc_start_data(uvd); konicawc_start_data(uvd);
...@@ -718,7 +766,6 @@ static void konicawc_configure_video(struct uvd *uvd) ...@@ -718,7 +766,6 @@ static void konicawc_configure_video(struct uvd *uvd)
DEBUG(1, "setting initial values"); DEBUG(1, "setting initial values");
} }
static int konicawc_probe(struct usb_interface *intf, const struct usb_device_id *devid) static int konicawc_probe(struct usb_interface *intf, const struct usb_device_id *devid)
{ {
struct usb_device *dev = interface_to_usbdev(intf); struct usb_device *dev = interface_to_usbdev(intf);
...@@ -839,21 +886,8 @@ static int konicawc_probe(struct usb_interface *intf, const struct usb_device_id ...@@ -839,21 +886,8 @@ static int konicawc_probe(struct usb_interface *intf, const struct usb_device_id
err("usbvideo_RegisterVideoDevice() failed."); err("usbvideo_RegisterVideoDevice() failed.");
uvd = NULL; uvd = NULL;
} }
#ifdef CONFIG_INPUT
/* Register input device for button */ konicawc_register_input(cam, dev);
memset(&cam->input, 0, sizeof(struct input_dev));
cam->input.name = "Konicawc snapshot button";
cam->input.private = cam;
cam->input.evbit[0] = BIT(EV_KEY);
cam->input.keybit[LONG(BTN_0)] = BIT(BTN_0);
usb_to_input_id(dev, &cam->input.id);
input_register_device(&cam->input);
usb_make_path(dev, cam->input_physname, 56);
strcat(cam->input_physname, "/input0");
cam->input.phys = cam->input_physname;
info("konicawc: %s on %s\n", cam->input.name, cam->input.phys);
#endif
} }
if (uvd) { if (uvd) {
...@@ -869,10 +903,9 @@ static void konicawc_free_uvd(struct uvd *uvd) ...@@ -869,10 +903,9 @@ static void konicawc_free_uvd(struct uvd *uvd)
int i; int i;
struct konicawc *cam = (struct konicawc *)uvd->user_data; struct konicawc *cam = (struct konicawc *)uvd->user_data;
#ifdef CONFIG_INPUT konicawc_unregister_input(cam);
input_unregister_device(&cam->input);
#endif for (i = 0; i < USBVIDEO_NUMSBUF; i++) {
for (i=0; i < USBVIDEO_NUMSBUF; i++) {
usb_free_urb(cam->sts_urb[i]); usb_free_urb(cam->sts_urb[i]);
cam->sts_urb[i] = NULL; cam->sts_urb[i] = NULL;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册