Lines Matching +full:pulse +full:- +full:code
1 // SPDX-License-Identifier: GPL-2.0-only
20 * pulse or two on a direction change; the granularity is so fine that I never
88 struct powermate_device *pm = urb->context; in powermate_irq()
89 struct device *dev = &pm->intf->dev; in powermate_irq()
92 switch (urb->status) { in powermate_irq()
96 case -ECONNRESET: in powermate_irq()
97 case -ENOENT: in powermate_irq()
98 case -ESHUTDOWN: in powermate_irq()
100 dev_dbg(dev, "%s - urb shutting down with status: %d\n", in powermate_irq()
101 __func__, urb->status); in powermate_irq()
104 dev_dbg(dev, "%s - nonzero urb status received: %d\n", in powermate_irq()
105 __func__, urb->status); in powermate_irq()
110 input_report_key(pm->input, BTN_0, pm->data[0] & 0x01); in powermate_irq()
111 input_report_rel(pm->input, REL_DIAL, pm->data[1]); in powermate_irq()
112 input_sync(pm->input); in powermate_irq()
117 dev_err(dev, "%s - usb_submit_urb failed with result: %d\n", in powermate_irq()
121 /* Decide if we need to issue a control message and do so. Must be called with pm->lock taken */
124 if (pm->requires_update == 0) in powermate_sync_state()
126 if (pm->config->status == -EINPROGRESS) in powermate_sync_state()
129 if (pm->requires_update & UPDATE_PULSE_ASLEEP){ in powermate_sync_state()
130 pm->configcr->wValue = cpu_to_le16( SET_PULSE_ASLEEP ); in powermate_sync_state()
131 pm->configcr->wIndex = cpu_to_le16( pm->pulse_asleep ? 1 : 0 ); in powermate_sync_state()
132 pm->requires_update &= ~UPDATE_PULSE_ASLEEP; in powermate_sync_state()
133 }else if (pm->requires_update & UPDATE_PULSE_AWAKE){ in powermate_sync_state()
134 pm->configcr->wValue = cpu_to_le16( SET_PULSE_AWAKE ); in powermate_sync_state()
135 pm->configcr->wIndex = cpu_to_le16( pm->pulse_awake ? 1 : 0 ); in powermate_sync_state()
136 pm->requires_update &= ~UPDATE_PULSE_AWAKE; in powermate_sync_state()
137 }else if (pm->requires_update & UPDATE_PULSE_MODE){ in powermate_sync_state()
139 /* the powermate takes an operation and an argument for its pulse algorithm. in powermate_sync_state()
142 1: pulse at normal speed in powermate_sync_state()
150 0 -- 254 -- use divide (0 = slowest) in powermate_sync_state()
151 255 -- use normal speed in powermate_sync_state()
152 256 -- 510 -- use multiple (510 = fastest). in powermate_sync_state()
156 if (pm->pulse_speed < 255) { in powermate_sync_state()
158 arg = 255 - pm->pulse_speed; in powermate_sync_state()
159 } else if (pm->pulse_speed > 255) { in powermate_sync_state()
161 arg = pm->pulse_speed - 255; in powermate_sync_state()
166 pm->configcr->wValue = cpu_to_le16( (pm->pulse_table << 8) | SET_PULSE_MODE ); in powermate_sync_state()
167 pm->configcr->wIndex = cpu_to_le16( (arg << 8) | op ); in powermate_sync_state()
168 pm->requires_update &= ~UPDATE_PULSE_MODE; in powermate_sync_state()
169 } else if (pm->requires_update & UPDATE_STATIC_BRIGHTNESS) { in powermate_sync_state()
170 pm->configcr->wValue = cpu_to_le16( SET_STATIC_BRIGHTNESS ); in powermate_sync_state()
171 pm->configcr->wIndex = cpu_to_le16( pm->static_brightness ); in powermate_sync_state()
172 pm->requires_update &= ~UPDATE_STATIC_BRIGHTNESS; in powermate_sync_state()
175 pm->requires_update = 0; /* fudge the bug */ in powermate_sync_state()
179 /* printk("powermate: %04x %04x\n", pm->configcr->wValue, pm->configcr->wIndex); */ in powermate_sync_state()
181 pm->configcr->bRequestType = 0x41; /* vendor request */ in powermate_sync_state()
182 pm->configcr->bRequest = 0x01; in powermate_sync_state()
183 pm->configcr->wLength = 0; in powermate_sync_state()
185 usb_fill_control_urb(pm->config, pm->udev, usb_sndctrlpipe(pm->udev, 0), in powermate_sync_state()
186 (void *) pm->configcr, NULL, 0, in powermate_sync_state()
189 if (usb_submit_urb(pm->config, GFP_ATOMIC)) in powermate_sync_state()
196 struct powermate_device *pm = urb->context; in powermate_config_complete()
199 if (urb->status) in powermate_config_complete()
200 printk(KERN_ERR "powermate: config urb returned %d\n", urb->status); in powermate_config_complete()
202 spin_lock_irqsave(&pm->lock, flags); in powermate_config_complete()
204 spin_unlock_irqrestore(&pm->lock, flags); in powermate_config_complete()
226 spin_lock_irqsave(&pm->lock, flags); in powermate_pulse_led()
229 if (static_brightness != pm->static_brightness) { in powermate_pulse_led()
230 pm->static_brightness = static_brightness; in powermate_pulse_led()
231 pm->requires_update |= UPDATE_STATIC_BRIGHTNESS; in powermate_pulse_led()
233 if (pulse_asleep != pm->pulse_asleep) { in powermate_pulse_led()
234 pm->pulse_asleep = pulse_asleep; in powermate_pulse_led()
235 pm->requires_update |= (UPDATE_PULSE_ASLEEP | UPDATE_STATIC_BRIGHTNESS); in powermate_pulse_led()
237 if (pulse_awake != pm->pulse_awake) { in powermate_pulse_led()
238 pm->pulse_awake = pulse_awake; in powermate_pulse_led()
239 pm->requires_update |= (UPDATE_PULSE_AWAKE | UPDATE_STATIC_BRIGHTNESS); in powermate_pulse_led()
241 if (pulse_speed != pm->pulse_speed || pulse_table != pm->pulse_table) { in powermate_pulse_led()
242 pm->pulse_speed = pulse_speed; in powermate_pulse_led()
243 pm->pulse_table = pulse_table; in powermate_pulse_led()
244 pm->requires_update |= UPDATE_PULSE_MODE; in powermate_pulse_led()
249 spin_unlock_irqrestore(&pm->lock, flags); in powermate_pulse_led()
253 static int powermate_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int _… in powermate_input_event() argument
258 if (type == EV_MSC && code == MSC_PULSELED){ in powermate_input_event()
260 bits 0- 7: 8 bits: LED brightness in powermate_input_event()
261 …bits 8-16: 9 bits: pulsing speed modifier (0 ... 510); 0-254 = slower, 255 = standard, 256-510 = … in powermate_input_event()
262 bits 17-18: 2 bits: pulse table (0, 1, 2 valid) in powermate_input_event()
263 bit 19: 1 bit : pulse whilst asleep? in powermate_input_event()
264 bit 20: 1 bit : pulse constantly? in powermate_input_event()
266 int static_brightness = command & 0xFF; // bits 0-7 in powermate_input_event()
267 int pulse_speed = (command >> 8) & 0x1FF; // bits 8-16 in powermate_input_event()
268 int pulse_table = (command >> 17) & 0x3; // bits 17-18 in powermate_input_event()
280 pm->data = usb_alloc_coherent(udev, POWERMATE_PAYLOAD_SIZE_MAX, in powermate_alloc_buffers()
281 GFP_KERNEL, &pm->data_dma); in powermate_alloc_buffers()
282 if (!pm->data) in powermate_alloc_buffers()
283 return -1; in powermate_alloc_buffers()
285 pm->configcr = kmalloc(sizeof(*(pm->configcr)), GFP_KERNEL); in powermate_alloc_buffers()
286 if (!pm->configcr) in powermate_alloc_buffers()
287 return -ENOMEM; in powermate_alloc_buffers()
295 pm->data, pm->data_dma); in powermate_free_buffers()
296 kfree(pm->configcr); in powermate_free_buffers()
308 int error = -ENOMEM; in powermate_probe()
310 interface = intf->cur_altsetting; in powermate_probe()
311 if (interface->desc.bNumEndpoints < 1) in powermate_probe()
312 return -EINVAL; in powermate_probe()
314 endpoint = &interface->endpoint[0].desc; in powermate_probe()
316 return -EIO; in powermate_probe()
320 0, interface->desc.bInterfaceNumber, NULL, 0, in powermate_probe()
331 pm->irq = usb_alloc_urb(0, GFP_KERNEL); in powermate_probe()
332 if (!pm->irq) in powermate_probe()
335 pm->config = usb_alloc_urb(0, GFP_KERNEL); in powermate_probe()
336 if (!pm->config) in powermate_probe()
339 pm->udev = udev; in powermate_probe()
340 pm->intf = intf; in powermate_probe()
341 pm->input = input_dev; in powermate_probe()
343 usb_make_path(udev, pm->phys, sizeof(pm->phys)); in powermate_probe()
344 strlcat(pm->phys, "/input0", sizeof(pm->phys)); in powermate_probe()
346 spin_lock_init(&pm->lock); in powermate_probe()
348 switch (le16_to_cpu(udev->descriptor.idProduct)) { in powermate_probe()
350 input_dev->name = pm_name_powermate; in powermate_probe()
353 input_dev->name = pm_name_soundknob; in powermate_probe()
356 input_dev->name = pm_name_soundknob; in powermate_probe()
358 le16_to_cpu(udev->descriptor.idProduct)); in powermate_probe()
361 input_dev->phys = pm->phys; in powermate_probe()
362 usb_to_input_id(udev, &input_dev->id); in powermate_probe()
363 input_dev->dev.parent = &intf->dev; in powermate_probe()
367 input_dev->event = powermate_input_event; in powermate_probe()
369 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) | in powermate_probe()
371 input_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0); in powermate_probe()
372 input_dev->relbit[BIT_WORD(REL_DIAL)] = BIT_MASK(REL_DIAL); in powermate_probe()
373 input_dev->mscbit[BIT_WORD(MSC_PULSELED)] = BIT_MASK(MSC_PULSELED); in powermate_probe()
376 pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); in powermate_probe()
380 printk(KERN_WARNING "powermate: Expected payload of %d--%d bytes, found %d bytes!\n", in powermate_probe()
385 usb_fill_int_urb(pm->irq, udev, pipe, pm->data, in powermate_probe()
387 pm, endpoint->bInterval); in powermate_probe()
388 pm->irq->transfer_dma = pm->data_dma; in powermate_probe()
389 pm->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in powermate_probe()
392 if (usb_submit_urb(pm->irq, GFP_KERNEL)) { in powermate_probe()
393 error = -EIO; in powermate_probe()
397 error = input_register_device(pm->input); in powermate_probe()
403 …pm->requires_update = UPDATE_PULSE_ASLEEP | UPDATE_PULSE_AWAKE | UPDATE_PULSE_MODE | UPDATE_STATIC… in powermate_probe()
404 powermate_pulse_led(pm, 0x80, 255, 0, 1, 0); // set default pulse parameters in powermate_probe()
409 fail5: usb_kill_urb(pm->irq); in powermate_probe()
410 fail4: usb_free_urb(pm->config); in powermate_probe()
411 fail3: usb_free_urb(pm->irq); in powermate_probe()
425 pm->requires_update = 0; in powermate_disconnect()
426 usb_kill_urb(pm->irq); in powermate_disconnect()
427 input_unregister_device(pm->input); in powermate_disconnect()
428 usb_kill_urb(pm->config); in powermate_disconnect()
429 usb_free_urb(pm->irq); in powermate_disconnect()
430 usb_free_urb(pm->config); in powermate_disconnect()