2 handle au0828 IR remotes via linux kernel input layer.
4 Copyright (C) 2014 Mauro Carvalho Chehab <mchehab@samsung.com>
5 Copyright (c) 2014 Samsung Electronics Co., Ltd.
7 Based on em28xx-input.c.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/delay.h>
25 #include <linux/interrupt.h>
26 #include <linux/usb.h>
27 #include <linux/slab.h>
28 #include <media/rc-core.h>
30 static int disable_ir
;
31 module_param(disable_ir
, int, 0444);
32 MODULE_PARM_DESC(disable_ir
, "disable infrared remote support");
35 struct au0828_dev
*dev
;
42 struct delayed_work work
;
44 /* i2c slave address of external device (if used) */
47 int (*get_key_i2c
)(struct au0828_rc
*ir
);
51 * AU8522 has a builtin IR receiver. Add functions to get IR from it
54 static int au8522_rc_write(struct au0828_rc
*ir
, u16 reg
, u8 data
)
57 char buf
[] = { (reg
>> 8) | 0x80, reg
& 0xff, data
};
58 struct i2c_msg msg
= { .addr
= ir
->i2c_dev_addr
, .flags
= 0,
59 .buf
= buf
, .len
= sizeof(buf
) };
61 rc
= i2c_transfer(ir
->dev
->i2c_client
.adapter
, &msg
, 1);
66 return (rc
== 1) ? 0 : -EIO
;
69 static int au8522_rc_read(struct au0828_rc
*ir
, u16 reg
, int val
,
74 struct i2c_msg msg
[2] = { { .addr
= ir
->i2c_dev_addr
, .flags
= 0,
75 .buf
= obuf
, .len
= 2 },
76 { .addr
= ir
->i2c_dev_addr
, .flags
= I2C_M_RD
,
77 .buf
= buf
, .len
= size
} };
79 obuf
[0] = 0x40 | reg
>> 8;
86 rc
= i2c_transfer(ir
->dev
->i2c_client
.adapter
, msg
, 2);
91 return (rc
== 2) ? 0 : -EIO
;
94 static int au8522_rc_andor(struct au0828_rc
*ir
, u16 reg
, u8 mask
, u8 value
)
99 rc
= au8522_rc_read(ir
, reg
, -1, &buf
, 1);
104 buf
= (buf
& ~mask
) | (value
& mask
);
106 /* Nothing to do, just return */
110 return au8522_rc_write(ir
, reg
, buf
);
113 #define au8522_rc_set(ir, reg, bit) au8522_rc_andor(ir, (reg), (bit), (bit))
114 #define au8522_rc_clear(ir, reg, bit) au8522_rc_andor(ir, (reg), (bit), 0)
116 /* Remote Controller time units */
118 #define AU8522_UNIT 200000 /* ns */
119 #define NEC_START_SPACE (4500000 / AU8522_UNIT)
120 #define NEC_START_PULSE (562500 * 16)
121 #define RC5_START_SPACE (4 * AU8522_UNIT)
122 #define RC5_START_PULSE 888888
124 static int au0828_get_key_au8522(struct au0828_rc
*ir
)
126 unsigned char buf
[40];
127 DEFINE_IR_RAW_EVENT(rawir
);
129 int prv_bit
, bit
, width
;
132 /* do nothing if device is disconnected */
133 if (test_bit(DEV_DISCONNECTED
, &ir
->dev
->dev_state
))
137 rc
= au8522_rc_read(ir
, 0xe1, -1, buf
, 1);
138 if (rc
< 0 || !(buf
[0] & (1 << 4))) {
139 /* Be sure that IR is enabled */
140 au8522_rc_set(ir
, 0xe0, 1 << 4);
144 /* Something arrived. Get the data */
145 rc
= au8522_rc_read(ir
, 0xe3, 0x11, buf
, sizeof(buf
));
152 au8522_rc_clear(ir
, 0xe0, 1 << 4);
155 au8522_rc_set(ir
, 0xe0, 1 << 4);
157 dprintk(16, "RC data received: %*ph\n", 40, buf
);
159 prv_bit
= (buf
[0] >> 7) & 0x01;
161 for (i
= 0; i
< sizeof(buf
); i
++) {
162 for (j
= 7; j
>= 0; j
--) {
163 bit
= (buf
[i
] >> j
) & 0x01;
164 if (bit
== prv_bit
) {
170 * Fix an au8522 bug: the first pulse event
171 * is lost. So, we need to fake it, based on the
172 * protocol. That means that not all raw decoders
173 * will work, as we need to add a hack for each
174 * protocol, based on the first space.
175 * So, we only support RC5 and NEC.
181 init_ir_raw_event(&rawir
);
183 if (width
> NEC_START_SPACE
- 2 &&
184 width
< NEC_START_SPACE
+ 2) {
186 rawir
.duration
= NEC_START_PULSE
;
187 dprintk(16, "Storing NEC start %s with duration %d",
188 rawir
.pulse
? "pulse" : "space",
192 rawir
.duration
= RC5_START_PULSE
;
193 dprintk(16, "Storing RC5 start %s with duration %d",
194 rawir
.pulse
? "pulse" : "space",
197 ir_raw_event_store(ir
->rc
, &rawir
);
200 init_ir_raw_event(&rawir
);
201 rawir
.pulse
= prv_bit
? false : true;
202 rawir
.duration
= AU8522_UNIT
* width
;
203 dprintk(16, "Storing %s with duration %d",
204 rawir
.pulse
? "pulse" : "space",
206 ir_raw_event_store(ir
->rc
, &rawir
);
213 init_ir_raw_event(&rawir
);
214 rawir
.pulse
= prv_bit
? false : true;
215 rawir
.duration
= AU8522_UNIT
* width
;
216 dprintk(16, "Storing end %s with duration %d",
217 rawir
.pulse
? "pulse" : "space",
219 ir_raw_event_store(ir
->rc
, &rawir
);
221 ir_raw_event_handle(ir
->rc
);
230 static void au0828_rc_work(struct work_struct
*work
)
232 struct au0828_rc
*ir
= container_of(work
, struct au0828_rc
, work
.work
);
235 rc
= ir
->get_key_i2c(ir
);
237 pr_info("Error while getting RC scancode\n");
239 schedule_delayed_work(&ir
->work
, msecs_to_jiffies(ir
->polling
));
242 static int au0828_rc_start(struct rc_dev
*rc
)
244 struct au0828_rc
*ir
= rc
->priv
;
246 INIT_DELAYED_WORK(&ir
->work
, au0828_rc_work
);
249 au8522_rc_set(ir
, 0xe0, 1 << 4);
251 schedule_delayed_work(&ir
->work
, msecs_to_jiffies(ir
->polling
));
256 static void au0828_rc_stop(struct rc_dev
*rc
)
258 struct au0828_rc
*ir
= rc
->priv
;
260 cancel_delayed_work_sync(&ir
->work
);
262 /* do nothing if device is disconnected */
263 if (!test_bit(DEV_DISCONNECTED
, &ir
->dev
->dev_state
)) {
265 au8522_rc_clear(ir
, 0xe0, 1 << 4);
269 static int au0828_probe_i2c_ir(struct au0828_dev
*dev
)
272 const unsigned short addr_list
[] = {
276 while (addr_list
[i
] != I2C_CLIENT_END
) {
277 if (i2c_probe_func_quick_read(dev
->i2c_client
.adapter
,
286 int au0828_rc_register(struct au0828_dev
*dev
)
288 struct au0828_rc
*ir
;
291 u16 i2c_rc_dev_addr
= 0;
293 if (!dev
->board
.has_ir_i2c
|| disable_ir
)
296 i2c_rc_dev_addr
= au0828_probe_i2c_ir(dev
);
297 if (!i2c_rc_dev_addr
)
300 ir
= kzalloc(sizeof(*ir
), GFP_KERNEL
);
301 rc
= rc_allocate_device();
305 /* record handles to ourself */
311 rc
->open
= au0828_rc_start
;
312 rc
->close
= au0828_rc_stop
;
314 if (dev
->board
.has_ir_i2c
) { /* external i2c device */
315 switch (dev
->boardnr
) {
316 case AU0828_BOARD_HAUPPAUGE_HVR950Q
:
317 rc
->map_name
= RC_MAP_HAUPPAUGE
;
318 ir
->get_key_i2c
= au0828_get_key_au8522
;
325 ir
->i2c_dev_addr
= i2c_rc_dev_addr
;
328 /* This is how often we ask the chip for IR information */
329 ir
->polling
= 100; /* ms */
331 /* init input device */
332 snprintf(ir
->name
, sizeof(ir
->name
), "au0828 IR (%s)",
335 usb_make_path(dev
->usbdev
, ir
->phys
, sizeof(ir
->phys
));
336 strlcat(ir
->phys
, "/input0", sizeof(ir
->phys
));
338 rc
->input_name
= ir
->name
;
339 rc
->input_phys
= ir
->phys
;
340 rc
->input_id
.bustype
= BUS_USB
;
341 rc
->input_id
.version
= 1;
342 rc
->input_id
.vendor
= le16_to_cpu(dev
->usbdev
->descriptor
.idVendor
);
343 rc
->input_id
.product
= le16_to_cpu(dev
->usbdev
->descriptor
.idProduct
);
344 rc
->dev
.parent
= &dev
->usbdev
->dev
;
345 rc
->driver_name
= "au0828-input";
346 rc
->driver_type
= RC_DRIVER_IR_RAW
;
347 rc
->allowed_protocols
= RC_BIT_NEC
| RC_BIT_NECX
| RC_BIT_NEC32
|
351 err
= rc_register_device(rc
);
355 pr_info("Remote controller %s initalized\n", ir
->name
);
366 void au0828_rc_unregister(struct au0828_dev
*dev
)
368 struct au0828_rc
*ir
= dev
->ir
;
370 /* skip detach on non attached boards */
374 rc_unregister_device(ir
->rc
);
381 int au0828_rc_suspend(struct au0828_dev
*dev
)
383 struct au0828_rc
*ir
= dev
->ir
;
388 pr_info("Stopping RC\n");
390 cancel_delayed_work_sync(&ir
->work
);
393 au8522_rc_clear(ir
, 0xe0, 1 << 4);
398 int au0828_rc_resume(struct au0828_dev
*dev
)
400 struct au0828_rc
*ir
= dev
->ir
;
405 pr_info("Restarting RC\n");
408 au8522_rc_set(ir
, 0xe0, 1 << 4);
410 schedule_delayed_work(&ir
->work
, msecs_to_jiffies(ir
->polling
));