Blame view
drivers/hid/hid-picolcd_cir.c
3.86 KB
24c9d96dd treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-only |
fabdbf2fd HID: picoLCD: spl... |
2 3 4 5 6 7 |
/*************************************************************************** * Copyright (C) 2010-2012 by Bruno Prémont <bonbons@linux-vserver.org> * * * * Based on Logitech G13 driver (v0.4) * * Copyright (C) 2009 by Rick L. Vinyard, Jr. <rvinyard@cs.nmsu.edu> * * * |
fabdbf2fd HID: picoLCD: spl... |
8 9 10 11 12 13 |
***************************************************************************/ #include <linux/hid.h> #include <linux/hid-debug.h> #include <linux/input.h> #include "hid-ids.h" |
fabdbf2fd HID: picoLCD: spl... |
14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <linux/fb.h> #include <linux/vmalloc.h> #include <linux/backlight.h> #include <linux/lcd.h> #include <linux/leds.h> #include <linux/seq_file.h> #include <linux/debugfs.h> #include <linux/completion.h> #include <linux/uaccess.h> #include <linux/module.h> |
ae08e3241 HID: picoLCD: Add... |
28 |
#include <media/rc-core.h> |
fabdbf2fd HID: picoLCD: spl... |
29 30 31 32 33 34 35 |
#include "hid-picolcd.h" int picolcd_raw_cir(struct picolcd_data *data, struct hid_report *report, u8 *raw_data, int size) { |
ae08e3241 HID: picoLCD: Add... |
36 37 |
unsigned long flags; int i, w, sz; |
183e19f5b media: rc: Remove... |
38 |
struct ir_raw_event rawir = {}; |
ae08e3241 HID: picoLCD: Add... |
39 40 41 |
/* ignore if rc_dev is NULL or status is shunned */ spin_lock_irqsave(&data->lock, flags); |
02d9be1aa HID: picoLCD: fix... |
42 |
if (!data->rc_dev || (data->status & PICOLCD_CIR_SHUN)) { |
ae08e3241 HID: picoLCD: Add... |
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
spin_unlock_irqrestore(&data->lock, flags); return 1; } spin_unlock_irqrestore(&data->lock, flags); /* PicoLCD USB packets contain 16-bit intervals in network order, * with value negated for pulse. Intervals are in microseconds. * * Note: some userspace LIRC code for PicoLCD says negated values * for space - is it a matter of IR chip? (pulse for my TSOP2236) * * In addition, the first interval seems to be around 15000 + base * interval for non-first report of IR data - thus the quirk below * to get RC_CODE to understand Sony and JVC remotes I have at hand */ sz = size > 0 ? min((int)raw_data[0], size-1) : 0; for (i = 0; i+1 < sz; i += 2) { |
ae08e3241 HID: picoLCD: Add... |
60 61 |
w = (raw_data[i] << 8) | (raw_data[i+1]); rawir.pulse = !!(w & 0x8000); |
528222d85 media: rc: harmon... |
62 |
rawir.duration = rawir.pulse ? (65536 - w) : w; |
ae08e3241 HID: picoLCD: Add... |
63 |
/* Quirk!! - see above */ |
528222d85 media: rc: harmon... |
64 65 |
if (i == 0 && rawir.duration > 15000) rawir.duration -= 15000; |
ae08e3241 HID: picoLCD: Add... |
66 67 68 |
ir_raw_event_store(data->rc_dev, &rawir); } ir_raw_event_handle(data->rc_dev); |
fabdbf2fd HID: picoLCD: spl... |
69 70 |
return 1; } |
ae08e3241 HID: picoLCD: Add... |
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
static int picolcd_cir_open(struct rc_dev *dev) { struct picolcd_data *data = dev->priv; unsigned long flags; spin_lock_irqsave(&data->lock, flags); data->status &= ~PICOLCD_CIR_SHUN; spin_unlock_irqrestore(&data->lock, flags); return 0; } static void picolcd_cir_close(struct rc_dev *dev) { struct picolcd_data *data = dev->priv; unsigned long flags; spin_lock_irqsave(&data->lock, flags); data->status |= PICOLCD_CIR_SHUN; spin_unlock_irqrestore(&data->lock, flags); } |
fabdbf2fd HID: picoLCD: spl... |
91 92 93 |
/* initialize CIR input device */ int picolcd_init_cir(struct picolcd_data *data, struct hid_report *report) { |
ae08e3241 HID: picoLCD: Add... |
94 95 |
struct rc_dev *rdev; int ret = 0; |
0f7499fdd [media] rc-main: ... |
96 |
rdev = rc_allocate_device(RC_DRIVER_IR_RAW); |
ae08e3241 HID: picoLCD: Add... |
97 98 99 100 |
if (!rdev) return -ENOMEM; rdev->priv = data; |
6d741bfed media: rc: rename... |
101 |
rdev->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER; |
ae08e3241 HID: picoLCD: Add... |
102 103 |
rdev->open = picolcd_cir_open; rdev->close = picolcd_cir_close; |
518f4b26b media: rc-core: r... |
104 |
rdev->device_name = data->hdev->name; |
ae08e3241 HID: picoLCD: Add... |
105 106 107 108 109 110 111 112 |
rdev->input_phys = data->hdev->phys; rdev->input_id.bustype = data->hdev->bus; rdev->input_id.vendor = data->hdev->vendor; rdev->input_id.product = data->hdev->product; rdev->input_id.version = data->hdev->version; rdev->dev.parent = &data->hdev->dev; rdev->driver_name = PICOLCD_NAME; rdev->map_name = RC_MAP_RC6_MCE; |
528222d85 media: rc: harmon... |
113 114 |
rdev->timeout = MS_TO_US(100); rdev->rx_resolution = 1; |
ae08e3241 HID: picoLCD: Add... |
115 116 117 118 119 |
ret = rc_register_device(rdev); if (ret) goto err; data->rc_dev = rdev; |
fabdbf2fd HID: picoLCD: spl... |
120 |
return 0; |
ae08e3241 HID: picoLCD: Add... |
121 122 123 124 |
err: rc_free_device(rdev); return ret; |
fabdbf2fd HID: picoLCD: spl... |
125 126 127 128 |
} void picolcd_exit_cir(struct picolcd_data *data) { |
ae08e3241 HID: picoLCD: Add... |
129 130 131 |
struct rc_dev *rdev = data->rc_dev; data->rc_dev = NULL; |
4b8a82620 HID: picoLCD: Del... |
132 |
rc_unregister_device(rdev); |
fabdbf2fd HID: picoLCD: spl... |
133 |
} |