Lines Matching +full:usb +full:- +full:ss

1 // SPDX-License-Identifier: GPL-2.0+
3 * Support for the Maxtor OneTouch USB hard drive's button
18 #include <linux/usb/input.h>
19 #include "usb.h"
23 #define DRV_NAME "ums-onetouch"
25 MODULE_DESCRIPTION("Maxtor USB OneTouch hard drive button driver");
33 static int onetouch_connect_input(struct us_data *ss);
40 struct usb_device *udev; /* usb device */
62 MODULE_DEVICE_TABLE(usb, onetouch_usb_ids);
90 struct usb_onetouch *onetouch = urb->context; in usb_onetouch_irq()
91 signed char *data = onetouch->data; in usb_onetouch_irq()
92 struct input_dev *dev = onetouch->dev; in usb_onetouch_irq()
93 int status = urb->status; in usb_onetouch_irq()
99 case -ECONNRESET: /* unlink */ in usb_onetouch_irq()
100 case -ENOENT: in usb_onetouch_irq()
101 case -ESHUTDOWN: in usb_onetouch_irq()
103 /* -EPIPE: should clear the halt */ in usb_onetouch_irq()
114 dev_err(&dev->dev, "can't resubmit intr, %s-%s/input0, " in usb_onetouch_irq()
115 "retval %d\n", onetouch->udev->bus->bus_name, in usb_onetouch_irq()
116 onetouch->udev->devpath, retval); in usb_onetouch_irq()
123 onetouch->is_open = 1; in usb_onetouch_open()
124 onetouch->irq->dev = onetouch->udev; in usb_onetouch_open()
125 if (usb_submit_urb(onetouch->irq, GFP_KERNEL)) { in usb_onetouch_open()
126 dev_err(&dev->dev, "usb_submit_urb failed\n"); in usb_onetouch_open()
127 return -EIO; in usb_onetouch_open()
137 usb_kill_urb(onetouch->irq); in usb_onetouch_close()
138 onetouch->is_open = 0; in usb_onetouch_close()
144 struct usb_onetouch *onetouch = (struct usb_onetouch *) us->extra; in usb_onetouch_pm_hook()
146 if (onetouch->is_open) { in usb_onetouch_pm_hook()
149 usb_kill_urb(onetouch->irq); in usb_onetouch_pm_hook()
152 if (usb_submit_urb(onetouch->irq, GFP_NOIO) != 0) in usb_onetouch_pm_hook()
153 dev_err(&onetouch->irq->dev->dev, in usb_onetouch_pm_hook()
163 static int onetouch_connect_input(struct us_data *ss) in onetouch_connect_input() argument
165 struct usb_device *udev = ss->pusb_dev; in onetouch_connect_input()
171 int error = -ENOMEM; in onetouch_connect_input()
173 interface = ss->pusb_intf->cur_altsetting; in onetouch_connect_input()
175 if (interface->desc.bNumEndpoints != 3) in onetouch_connect_input()
176 return -ENODEV; in onetouch_connect_input()
178 endpoint = &interface->endpoint[2].desc; in onetouch_connect_input()
180 return -ENODEV; in onetouch_connect_input()
182 pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); in onetouch_connect_input()
191 onetouch->data = usb_alloc_coherent(udev, ONETOUCH_PKT_LEN, in onetouch_connect_input()
192 GFP_KERNEL, &onetouch->data_dma); in onetouch_connect_input()
193 if (!onetouch->data) in onetouch_connect_input()
196 onetouch->irq = usb_alloc_urb(0, GFP_KERNEL); in onetouch_connect_input()
197 if (!onetouch->irq) in onetouch_connect_input()
200 onetouch->udev = udev; in onetouch_connect_input()
201 onetouch->dev = input_dev; in onetouch_connect_input()
203 if (udev->manufacturer) in onetouch_connect_input()
204 strscpy(onetouch->name, udev->manufacturer, in onetouch_connect_input()
205 sizeof(onetouch->name)); in onetouch_connect_input()
206 if (udev->product) { in onetouch_connect_input()
207 if (udev->manufacturer) in onetouch_connect_input()
208 strlcat(onetouch->name, " ", sizeof(onetouch->name)); in onetouch_connect_input()
209 strlcat(onetouch->name, udev->product, sizeof(onetouch->name)); in onetouch_connect_input()
212 if (!strlen(onetouch->name)) in onetouch_connect_input()
213 snprintf(onetouch->name, sizeof(onetouch->name), in onetouch_connect_input()
215 le16_to_cpu(udev->descriptor.idVendor), in onetouch_connect_input()
216 le16_to_cpu(udev->descriptor.idProduct)); in onetouch_connect_input()
218 usb_make_path(udev, onetouch->phys, sizeof(onetouch->phys)); in onetouch_connect_input()
219 strlcat(onetouch->phys, "/input0", sizeof(onetouch->phys)); in onetouch_connect_input()
221 input_dev->name = onetouch->name; in onetouch_connect_input()
222 input_dev->phys = onetouch->phys; in onetouch_connect_input()
223 usb_to_input_id(udev, &input_dev->id); in onetouch_connect_input()
224 input_dev->dev.parent = &udev->dev; in onetouch_connect_input()
226 set_bit(EV_KEY, input_dev->evbit); in onetouch_connect_input()
227 set_bit(ONETOUCH_BUTTON, input_dev->keybit); in onetouch_connect_input()
228 clear_bit(0, input_dev->keybit); in onetouch_connect_input()
232 input_dev->open = usb_onetouch_open; in onetouch_connect_input()
233 input_dev->close = usb_onetouch_close; in onetouch_connect_input()
235 usb_fill_int_urb(onetouch->irq, udev, pipe, onetouch->data, maxp, in onetouch_connect_input()
236 usb_onetouch_irq, onetouch, endpoint->bInterval); in onetouch_connect_input()
237 onetouch->irq->transfer_dma = onetouch->data_dma; in onetouch_connect_input()
238 onetouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in onetouch_connect_input()
240 ss->extra_destructor = onetouch_release_input; in onetouch_connect_input()
241 ss->extra = onetouch; in onetouch_connect_input()
243 ss->suspend_resume_hook = usb_onetouch_pm_hook; in onetouch_connect_input()
246 error = input_register_device(onetouch->dev); in onetouch_connect_input()
252 fail3: usb_free_urb(onetouch->irq); in onetouch_connect_input()
254 onetouch->data, onetouch->data_dma); in onetouch_connect_input()
265 usb_kill_urb(onetouch->irq); in onetouch_release_input()
266 input_unregister_device(onetouch->dev); in onetouch_release_input()
267 usb_free_urb(onetouch->irq); in onetouch_release_input()
268 usb_free_coherent(onetouch->udev, ONETOUCH_PKT_LEN, in onetouch_release_input()
269 onetouch->data, onetouch->data_dma); in onetouch_release_input()
282 (id - onetouch_usb_ids) + onetouch_unusual_dev_list, in onetouch_probe()