Lines Matching +full:zero +full:- +full:initialised
1 // SPDX-License-Identifier: GPL-2.0
3 * U2F Zero LED and RNG driver
6 * Loosely based on drivers/hid/hid-led.c
23 #include "hid-ids.h"
29 /* We only use broadcast (CID-less) messages */
39 u8 data[HID_REPORT_SIZE - 7];
43 u8 data[HID_REPORT_SIZE - 5];
76 mutex_lock(&dev->lock); in u2fzero_send()
78 memcpy(dev->buf_out, req, sizeof(struct u2f_hid_report)); in u2fzero_send()
80 ret = hid_hw_output_report(dev->hdev, dev->buf_out, in u2fzero_send()
83 mutex_unlock(&dev->lock); in u2fzero_send()
88 return ret == sizeof(struct u2f_hid_msg) ? 0 : -EMSGSIZE; in u2fzero_send()
98 struct u2fzero_transfer_context *ctx = urb->context; in u2fzero_read_callback()
100 ctx->status = urb->status; in u2fzero_read_callback()
101 complete(&ctx->done); in u2fzero_read_callback()
109 struct hid_device *hdev = dev->hdev; in u2fzero_recv()
112 mutex_lock(&dev->lock); in u2fzero_recv()
114 memcpy(dev->buf_out, req, sizeof(struct u2f_hid_report)); in u2fzero_recv()
116 dev->urb->context = &ctx; in u2fzero_recv()
119 ret = usb_submit_urb(dev->urb, GFP_NOIO); in u2fzero_recv()
125 ret = hid_hw_output_report(dev->hdev, dev->buf_out, in u2fzero_recv()
136 usb_kill_urb(dev->urb); in u2fzero_recv()
139 ret = dev->urb->actual_length; in u2fzero_recv()
140 memcpy(resp, dev->buf_in, ret); in u2fzero_recv()
144 mutex_unlock(&dev->lock); in u2fzero_recv()
169 ldev->brightness = LED_OFF; in u2fzero_brightness_set()
197 if (!dev->present) { in u2fzero_rng_read()
198 hid_dbg(dev->hdev, "device not present"); in u2fzero_rng_read()
209 actual_length = min3((size_t)ret - min_length, in u2fzero_rng_read()
220 dev->led_name = devm_kasprintf(&dev->hdev->dev, GFP_KERNEL, in u2fzero_init_led()
222 if (dev->led_name == NULL) in u2fzero_init_led()
223 return -ENOMEM; in u2fzero_init_led()
225 dev->ldev.name = dev->led_name; in u2fzero_init_led()
226 dev->ldev.max_brightness = LED_ON; in u2fzero_init_led()
227 dev->ldev.flags = LED_HW_PLUGGABLE; in u2fzero_init_led()
228 dev->ldev.brightness_set_blocking = u2fzero_brightness_set; in u2fzero_init_led()
230 return devm_led_classdev_register(&dev->hdev->dev, &dev->ldev); in u2fzero_init_led()
236 dev->rng_name = devm_kasprintf(&dev->hdev->dev, GFP_KERNEL, in u2fzero_init_hwrng()
237 "%s-rng%u", DRIVER_SHORT, minor); in u2fzero_init_hwrng()
238 if (dev->rng_name == NULL) in u2fzero_init_hwrng()
239 return -ENOMEM; in u2fzero_init_hwrng()
241 dev->hwrng.name = dev->rng_name; in u2fzero_init_hwrng()
242 dev->hwrng.read = u2fzero_rng_read; in u2fzero_init_hwrng()
243 dev->hwrng.quality = 1; in u2fzero_init_hwrng()
245 return devm_hwrng_register(&dev->hdev->dev, &dev->hwrng); in u2fzero_init_hwrng()
250 struct hid_device *hdev = dev->hdev; in u2fzero_fill_in_urb()
252 struct usbhid_device *usbhid = hdev->driver_data; in u2fzero_fill_in_urb()
256 if (dev->hdev->bus != BUS_USB) in u2fzero_fill_in_urb()
257 return -EINVAL; in u2fzero_fill_in_urb()
261 if (!usbhid->urbout || !usbhid->urbin) in u2fzero_fill_in_urb()
262 return -ENODEV; in u2fzero_fill_in_urb()
264 ep = usb_pipe_endpoint(udev, usbhid->urbin->pipe); in u2fzero_fill_in_urb()
266 return -ENODEV; in u2fzero_fill_in_urb()
268 dev->urb = usb_alloc_urb(0, GFP_KERNEL); in u2fzero_fill_in_urb()
269 if (!dev->urb) in u2fzero_fill_in_urb()
270 return -ENOMEM; in u2fzero_fill_in_urb()
272 pipe_in = (usbhid->urbin->pipe & ~(3 << 30)) | (PIPE_INTERRUPT << 30); in u2fzero_fill_in_urb()
274 usb_fill_int_urb(dev->urb, in u2fzero_fill_in_urb()
277 dev->buf_in, in u2fzero_fill_in_urb()
281 ep->desc.bInterval); in u2fzero_fill_in_urb()
294 return -EINVAL; in u2fzero_probe()
296 dev = devm_kzalloc(&hdev->dev, sizeof(*dev), GFP_KERNEL); in u2fzero_probe()
298 return -ENOMEM; in u2fzero_probe()
300 dev->buf_out = devm_kmalloc(&hdev->dev, in u2fzero_probe()
302 if (dev->buf_out == NULL) in u2fzero_probe()
303 return -ENOMEM; in u2fzero_probe()
305 dev->buf_in = devm_kmalloc(&hdev->dev, in u2fzero_probe()
307 if (dev->buf_in == NULL) in u2fzero_probe()
308 return -ENOMEM; in u2fzero_probe()
314 dev->hdev = hdev; in u2fzero_probe()
316 mutex_init(&dev->lock); in u2fzero_probe()
324 dev->present = true; in u2fzero_probe()
326 minor = ((struct hidraw *) hdev->hidraw)->minor; in u2fzero_probe()
334 hid_info(hdev, "U2F Zero LED initialised\n"); in u2fzero_probe()
342 hid_info(hdev, "U2F Zero RNG initialised\n"); in u2fzero_probe()
351 mutex_lock(&dev->lock); in u2fzero_remove()
352 dev->present = false; in u2fzero_remove()
353 mutex_unlock(&dev->lock); in u2fzero_remove()
356 usb_poison_urb(dev->urb); in u2fzero_remove()
357 usb_free_urb(dev->urb); in u2fzero_remove()
368 .name = "hid-" DRIVER_SHORT,
378 MODULE_DESCRIPTION("U2F Zero LED and RNG driver");