Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88789672 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Greg Kroah-Hartman
Browse files

[PATCH] Input: convert onetouch to dynamic input_dev allocation



Input: convert onetouch to dynamic input_dev allocation

This is required for input_dev sysfs integration

Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent b416f2e4
Loading
Loading
Loading
Loading
+50 −49
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ void onetouch_release_input(void *onetouch_);
struct usb_onetouch {
	char name[128];
	char phys[64];
	struct input_dev dev;	/* input device interface */
	struct input_dev *dev;	/* input device interface */
	struct usb_device *udev;	/* usb device */

	struct urb *irq;	/* urb for interrupt in report */
@@ -58,7 +58,7 @@ static void usb_onetouch_irq(struct urb *urb, struct pt_regs *regs)
{
	struct usb_onetouch *onetouch = urb->context;
	signed char *data = onetouch->data;
	struct input_dev *dev = &onetouch->dev;
	struct input_dev *dev = onetouch->dev;
	int status;

	switch (urb->status) {
@@ -74,11 +74,9 @@ static void usb_onetouch_irq(struct urb *urb, struct pt_regs *regs)
	}

	input_regs(dev, regs);

	input_report_key(&onetouch->dev, ONETOUCH_BUTTON,
			 data[0] & 0x02);

	input_report_key(dev, ONETOUCH_BUTTON, data[0] & 0x02);
	input_sync(dev);

resubmit:
	status = usb_submit_urb (urb, SLAB_ATOMIC);
	if (status)
@@ -113,8 +111,8 @@ int onetouch_connect_input(struct us_data *ss)
	struct usb_host_interface *interface;
	struct usb_endpoint_descriptor *endpoint;
	struct usb_onetouch *onetouch;
	struct input_dev *input_dev;
	int pipe, maxp;
	char path[64];

	interface = ss->pusb_intf->cur_altsetting;

@@ -131,53 +129,53 @@ int onetouch_connect_input(struct us_data *ss)
	pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
	maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));

	if (!(onetouch = kcalloc(1, sizeof(struct usb_onetouch), GFP_KERNEL)))
		return -ENOMEM;
	onetouch = kzalloc(sizeof(struct usb_onetouch), GFP_KERNEL);
	input_dev = input_allocate_device();
	if (!onetouch || !input_dev)
		goto fail1;

	onetouch->data = usb_buffer_alloc(udev, ONETOUCH_PKT_LEN,
					  SLAB_ATOMIC, &onetouch->data_dma);
	if (!onetouch->data){
		kfree(onetouch);
		return -ENOMEM;
	}
	if (!onetouch->data)
		goto fail1;

	onetouch->irq = usb_alloc_urb(0, GFP_KERNEL);
	if (!onetouch->irq){
		kfree(onetouch);
		usb_buffer_free(udev, ONETOUCH_PKT_LEN,
				onetouch->data, onetouch->data_dma);
		return -ENODEV;
	}

	if (!onetouch->irq)
		goto fail2;

	onetouch->udev = udev;
	onetouch->dev = input_dev;

	set_bit(EV_KEY, onetouch->dev.evbit);
	set_bit(ONETOUCH_BUTTON, onetouch->dev.keybit);
	clear_bit(0, onetouch->dev.keybit);

	onetouch->dev.private = onetouch;
	onetouch->dev.open = usb_onetouch_open;
	onetouch->dev.close = usb_onetouch_close;
	if (udev->manufacturer)
		strlcpy(onetouch->name, udev->manufacturer,
			sizeof(onetouch->name));
	if (udev->product) {
		if (udev->manufacturer)
			strlcat(onetouch->name, " ", sizeof(onetouch->name));
		strlcat(onetouch->name, udev->product, sizeof(onetouch->name));
	}

	usb_make_path(udev, path, sizeof(path));
	sprintf(onetouch->phys, "%s/input0", path);
	if (!strlen(onetouch->name))
		snprintf(onetouch->name, sizeof(onetouch->name),
			 "Maxtor Onetouch %04x:%04x",
			 le16_to_cpu(udev->descriptor.idVendor),
			 le16_to_cpu(udev->descriptor.idProduct));

	onetouch->dev.name = onetouch->name;
	onetouch->dev.phys = onetouch->phys;
	usb_make_path(udev, onetouch->phys, sizeof(onetouch->phys));
	strlcat(onetouch->phys, "/input0", sizeof(onetouch->phys));

	usb_to_input_id(udev, &onetouch->dev.id);
	input_dev->name = onetouch->name;
	input_dev->phys = onetouch->phys;
	usb_to_input_id(udev, &input_dev->id);
	input_dev->cdev.dev = &udev->dev;

	onetouch->dev.dev = &udev->dev;
	set_bit(EV_KEY, input_dev->evbit);
	set_bit(ONETOUCH_BUTTON, input_dev->keybit);
	clear_bit(0, input_dev->keybit);

	if (udev->manufacturer)
		strcat(onetouch->name, udev->manufacturer);
	if (udev->product)
		sprintf(onetouch->name, "%s %s", onetouch->name,
			udev->product);
	if (!strlen(onetouch->name))
		sprintf(onetouch->name, "Maxtor Onetouch %04x:%04x",
			onetouch->dev.id.vendor, onetouch->dev.id.product);
	input_dev->private = onetouch;
	input_dev->open = usb_onetouch_open;
	input_dev->close = usb_onetouch_close;

	usb_fill_int_urb(onetouch->irq, udev, pipe, onetouch->data,
			 (maxp > 8 ? 8 : maxp),
@@ -188,10 +186,15 @@ int onetouch_connect_input(struct us_data *ss)
	ss->extra_destructor = onetouch_release_input;
	ss->extra = onetouch;

	input_register_device(&onetouch->dev);
	printk(KERN_INFO "usb-input: %s on %s\n", onetouch->dev.name, path);
	input_register_device(onetouch->dev);

	return 0;

 fail2:	usb_buffer_free(udev, ONETOUCH_PKT_LEN,
			onetouch->data, onetouch->data_dma);
 fail1:	kfree(onetouch);
	input_free_device(input_dev);
	return -ENOMEM;
}

void onetouch_release_input(void *onetouch_)
@@ -200,11 +203,9 @@ void onetouch_release_input(void *onetouch_)

	if (onetouch) {
		usb_kill_urb(onetouch->irq);
		input_unregister_device(&onetouch->dev);
		input_unregister_device(onetouch->dev);
		usb_free_urb(onetouch->irq);
		usb_buffer_free(onetouch->udev, ONETOUCH_PKT_LEN,
				onetouch->data, onetouch->data_dma);
		printk(KERN_INFO "usb-input: deregistering %s\n",
				onetouch->dev.name);
	}
}