]> Git Repo - linux.git/blame - drivers/media/rc/ene_ir.c
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157
[linux.git] / drivers / media / rc / ene_ir.c
CommitLineData
c942fddf 1// SPDX-License-Identifier: GPL-2.0-or-later
9ea53b74 2/*
11b64d31 3 * driver for ENE KB3926 B/C/D/E/F CIR (pnp id: ENE0XXX)
9ea53b74
ML
4 *
5 * Copyright (C) 2010 Maxim Levitsky <[email protected]>
6 *
11b64d31
ML
7 * Special thanks to:
8 * Sami R. <[email protected]> for lot of help in debugging and therefore
9 * bringing to life support for transmission & learning mode.
10 *
11 * Charlie Andrews <[email protected]> for lots of help in
12 * bringing up the support of new firmware buffer that is popular
13 * on latest notebooks
14 *
15 * ENE for partial device documentation
9ea53b74
ML
16 */
17
7de3461c
JP
18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19
9ea53b74
ML
20#include <linux/kernel.h>
21#include <linux/module.h>
22#include <linux/pnp.h>
23#include <linux/io.h>
24#include <linux/interrupt.h>
25#include <linux/sched.h>
931e39a1 26#include <linux/slab.h>
6bda9644 27#include <media/rc-core.h>
931e39a1 28#include "ene_ir.h"
9ea53b74 29
11b64d31 30static int sample_period;
c29bc4d7 31static bool learning_mode_force;
9ea53b74 32static int debug;
11b64d31 33static bool txsim;
9ea53b74 34
11b64d31
ML
35static void ene_set_reg_addr(struct ene_device *dev, u16 reg)
36{
37 outb(reg >> 8, dev->hw_io + ENE_ADDR_HI);
38 outb(reg & 0xFF, dev->hw_io + ENE_ADDR_LO);
39}
9ea53b74
ML
40
41/* read a hardware register */
11b64d31 42static u8 ene_read_reg(struct ene_device *dev, u16 reg)
9ea53b74
ML
43{
44 u8 retval;
11b64d31 45 ene_set_reg_addr(dev, reg);
9ea53b74 46 retval = inb(dev->hw_io + ENE_IO);
11b64d31 47 dbg_regs("reg %04x == %02x", reg, retval);
9ea53b74
ML
48 return retval;
49}
50
51/* write a hardware register */
11b64d31 52static void ene_write_reg(struct ene_device *dev, u16 reg, u8 value)
9ea53b74 53{
11b64d31
ML
54 dbg_regs("reg %04x <- %02x", reg, value);
55 ene_set_reg_addr(dev, reg);
9ea53b74 56 outb(value, dev->hw_io + ENE_IO);
9ea53b74
ML
57}
58
11b64d31
ML
59/* Set bits in hardware register */
60static void ene_set_reg_mask(struct ene_device *dev, u16 reg, u8 mask)
9ea53b74 61{
11b64d31
ML
62 dbg_regs("reg %04x |= %02x", reg, mask);
63 ene_set_reg_addr(dev, reg);
64 outb(inb(dev->hw_io + ENE_IO) | mask, dev->hw_io + ENE_IO);
65}
9ea53b74 66
11b64d31
ML
67/* Clear bits in hardware register */
68static void ene_clear_reg_mask(struct ene_device *dev, u16 reg, u8 mask)
69{
70 dbg_regs("reg %04x &= ~%02x ", reg, mask);
71 ene_set_reg_addr(dev, reg);
72 outb(inb(dev->hw_io + ENE_IO) & ~mask, dev->hw_io + ENE_IO);
73}
9ea53b74 74
11b64d31
ML
75/* A helper to set/clear a bit in register according to boolean variable */
76static void ene_set_clear_reg_mask(struct ene_device *dev, u16 reg, u8 mask,
77 bool set)
78{
79 if (set)
80 ene_set_reg_mask(dev, reg, mask);
81 else
82 ene_clear_reg_mask(dev, reg, mask);
9ea53b74
ML
83}
84
85/* detect hardware features */
86static int ene_hw_detect(struct ene_device *dev)
87{
88 u8 chip_major, chip_minor;
89 u8 hw_revision, old_ver;
11b64d31 90 u8 fw_reg2, fw_reg1;
9ea53b74 91
11b64d31
ML
92 ene_clear_reg_mask(dev, ENE_ECSTS, ENE_ECSTS_RSRVD);
93 chip_major = ene_read_reg(dev, ENE_ECVER_MAJOR);
94 chip_minor = ene_read_reg(dev, ENE_ECVER_MINOR);
95 ene_set_reg_mask(dev, ENE_ECSTS, ENE_ECSTS_RSRVD);
9ea53b74 96
11b64d31
ML
97 hw_revision = ene_read_reg(dev, ENE_ECHV);
98 old_ver = ene_read_reg(dev, ENE_HW_VER_OLD);
9ea53b74 99
11b64d31
ML
100 dev->pll_freq = (ene_read_reg(dev, ENE_PLLFRH) << 4) +
101 (ene_read_reg(dev, ENE_PLLFRL) >> 4);
931e39a1 102
11b64d31
ML
103 if (sample_period != ENE_DEFAULT_SAMPLE_PERIOD)
104 dev->rx_period_adjust =
105 dev->pll_freq == ENE_DEFAULT_PLL_FREQ ? 2 : 4;
931e39a1 106
9ea53b74 107 if (hw_revision == 0xFF) {
7de3461c
JP
108 pr_warn("device seems to be disabled\n");
109 pr_warn("send a mail to [email protected]\n");
110 pr_warn("please attach output of acpidump and dmidecode\n");
9ea53b74
ML
111 return -ENODEV;
112 }
113
7de3461c
JP
114 pr_notice("chip is 0x%02x%02x - kbver = 0x%02x, rev = 0x%02x\n",
115 chip_major, chip_minor, old_ver, hw_revision);
11b64d31 116
7de3461c 117 pr_notice("PLL freq = %d\n", dev->pll_freq);
11b64d31 118
9ea53b74 119 if (chip_major == 0x33) {
7de3461c 120 pr_warn("chips 0x33xx aren't supported\n");
9ea53b74
ML
121 return -ENODEV;
122 }
123
124 if (chip_major == 0x39 && chip_minor == 0x26 && hw_revision == 0xC0) {
125 dev->hw_revision = ENE_HW_C;
7de3461c 126 pr_notice("KB3926C detected\n");
9ea53b74
ML
127 } else if (old_ver == 0x24 && hw_revision == 0xC0) {
128 dev->hw_revision = ENE_HW_B;
7de3461c 129 pr_notice("KB3926B detected\n");
9ea53b74
ML
130 } else {
131 dev->hw_revision = ENE_HW_D;
7de3461c 132 pr_notice("KB3926D or higher detected\n");
9ea53b74
ML
133 }
134
9ea53b74
ML
135 /* detect features hardware supports */
136 if (dev->hw_revision < ENE_HW_C)
137 return 0;
138
11b64d31
ML
139 fw_reg1 = ene_read_reg(dev, ENE_FW1);
140 fw_reg2 = ene_read_reg(dev, ENE_FW2);
9ea53b74 141
7de3461c 142 pr_notice("Firmware regs: %02x %02x\n", fw_reg1, fw_reg2);
9ea53b74 143
a06423c9
ML
144 dev->hw_use_gpio_0a = !!(fw_reg2 & ENE_FW2_GP0A);
145 dev->hw_learning_and_tx_capable = !!(fw_reg2 & ENE_FW2_LEARNING);
146 dev->hw_extra_buffer = !!(fw_reg1 & ENE_FW1_HAS_EXTRA_BUF);
147
148 if (dev->hw_learning_and_tx_capable)
149 dev->hw_fan_input = !!(fw_reg2 & ENE_FW2_FAN_INPUT);
9ea53b74 150
7de3461c 151 pr_notice("Hardware features:\n");
9ea53b74
ML
152
153 if (dev->hw_learning_and_tx_capable) {
7de3461c
JP
154 pr_notice("* Supports transmitting & learning mode\n");
155 pr_notice(" This feature is rare and therefore,\n");
156 pr_notice(" you are welcome to test it,\n");
157 pr_notice(" and/or contact the author via:\n");
158 pr_notice(" [email protected]\n");
159 pr_notice(" or [email protected]\n");
11b64d31 160
7de3461c
JP
161 pr_notice("* Uses GPIO %s for IR raw input\n",
162 dev->hw_use_gpio_0a ? "40" : "0A");
11b64d31
ML
163
164 if (dev->hw_fan_input)
7de3461c 165 pr_notice("* Uses unused fan feedback input as source of demodulated IR data\n");
9ea53b74 166 }
11b64d31
ML
167
168 if (!dev->hw_fan_input)
7de3461c
JP
169 pr_notice("* Uses GPIO %s for IR demodulated input\n",
170 dev->hw_use_gpio_0a ? "0A" : "40");
11b64d31
ML
171
172 if (dev->hw_extra_buffer)
7de3461c 173 pr_notice("* Uses new style input buffer\n");
9ea53b74
ML
174 return 0;
175}
176
04ad3011 177/* Read properties of hw sample buffer */
c29bc4d7
ML
178static void ene_rx_setup_hw_buffer(struct ene_device *dev)
179{
180 u16 tmp;
181
182 ene_rx_read_hw_pointer(dev);
183 dev->r_pointer = dev->w_pointer;
184
185 if (!dev->hw_extra_buffer) {
186 dev->buffer_len = ENE_FW_PACKET_SIZE * 2;
187 return;
188 }
189
190 tmp = ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER);
191 tmp |= ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER+1) << 8;
192 dev->extra_buf1_address = tmp;
193
194 dev->extra_buf1_len = ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER + 2);
195
196 tmp = ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER + 3);
197 tmp |= ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER + 4) << 8;
198 dev->extra_buf2_address = tmp;
199
200 dev->extra_buf2_len = ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER + 5);
201
202 dev->buffer_len = dev->extra_buf1_len + dev->extra_buf2_len + 8;
203
7de3461c
JP
204 pr_notice("Hardware uses 2 extended buffers:\n");
205 pr_notice(" 0x%04x - len : %d\n",
206 dev->extra_buf1_address, dev->extra_buf1_len);
207 pr_notice(" 0x%04x - len : %d\n",
208 dev->extra_buf2_address, dev->extra_buf2_len);
c29bc4d7 209
7de3461c 210 pr_notice("Total buffer len = %d\n", dev->buffer_len);
c29bc4d7
ML
211
212 if (dev->buffer_len > 64 || dev->buffer_len < 16)
213 goto error;
214
215 if (dev->extra_buf1_address > 0xFBFC ||
216 dev->extra_buf1_address < 0xEC00)
217 goto error;
218
219 if (dev->extra_buf2_address > 0xFBFC ||
220 dev->extra_buf2_address < 0xEC00)
221 goto error;
222
223 if (dev->r_pointer > dev->buffer_len)
224 goto error;
225
226 ene_set_reg_mask(dev, ENE_FW1, ENE_FW1_EXTRA_BUF_HND);
227 return;
228error:
7de3461c 229 pr_warn("Error validating extra buffers, device probably won't work\n");
c29bc4d7
ML
230 dev->hw_extra_buffer = false;
231 ene_clear_reg_mask(dev, ENE_FW1, ENE_FW1_EXTRA_BUF_HND);
232}
233
234
235/* Restore the pointers to extra buffers - to make module reload work*/
236static void ene_rx_restore_hw_buffer(struct ene_device *dev)
237{
238 if (!dev->hw_extra_buffer)
239 return;
240
241 ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 0,
242 dev->extra_buf1_address & 0xFF);
243 ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 1,
244 dev->extra_buf1_address >> 8);
245 ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 2, dev->extra_buf1_len);
246
247 ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 3,
248 dev->extra_buf2_address & 0xFF);
249 ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 4,
250 dev->extra_buf2_address >> 8);
251 ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 5,
252 dev->extra_buf2_len);
253 ene_clear_reg_mask(dev, ENE_FW1, ENE_FW1_EXTRA_BUF_HND);
254}
255
256/* Read hardware write pointer */
257static void ene_rx_read_hw_pointer(struct ene_device *dev)
258{
259 if (dev->hw_extra_buffer)
260 dev->w_pointer = ene_read_reg(dev, ENE_FW_RX_POINTER);
261 else
262 dev->w_pointer = ene_read_reg(dev, ENE_FW2)
263 & ENE_FW2_BUF_WPTR ? 0 : ENE_FW_PACKET_SIZE;
264
265 dbg_verbose("RB: HW write pointer: %02x, driver read pointer: %02x",
266 dev->w_pointer, dev->r_pointer);
267}
268
269/* Gets address of next sample from HW ring buffer */
270static int ene_rx_get_sample_reg(struct ene_device *dev)
271{
272 int r_pointer;
273
274 if (dev->r_pointer == dev->w_pointer) {
275 dbg_verbose("RB: hit end, try update w_pointer");
276 ene_rx_read_hw_pointer(dev);
277 }
278
279 if (dev->r_pointer == dev->w_pointer) {
280 dbg_verbose("RB: end of data at %d", dev->r_pointer);
281 return 0;
282 }
283
284 dbg_verbose("RB: reading at offset %d", dev->r_pointer);
285 r_pointer = dev->r_pointer;
286
287 dev->r_pointer++;
288 if (dev->r_pointer == dev->buffer_len)
289 dev->r_pointer = 0;
290
291 dbg_verbose("RB: next read will be from offset %d", dev->r_pointer);
292
293 if (r_pointer < 8) {
294 dbg_verbose("RB: read at main buffer at %d", r_pointer);
295 return ENE_FW_SAMPLE_BUFFER + r_pointer;
296 }
297
298 r_pointer -= 8;
299
300 if (r_pointer < dev->extra_buf1_len) {
301 dbg_verbose("RB: read at 1st extra buffer at %d", r_pointer);
302 return dev->extra_buf1_address + r_pointer;
303 }
304
305 r_pointer -= dev->extra_buf1_len;
306
307 if (r_pointer < dev->extra_buf2_len) {
308 dbg_verbose("RB: read at 2nd extra buffer at %d", r_pointer);
309 return dev->extra_buf2_address + r_pointer;
310 }
311
90802ed9 312 dbg("attempt to read beyond ring buffer end");
c29bc4d7
ML
313 return 0;
314}
315
11b64d31 316/* Sense current received carrier */
e03cd645 317static void ene_rx_sense_carrier(struct ene_device *dev)
9ea53b74 318{
e1b1ddbe 319 int carrier, duty_cycle;
11b64d31
ML
320 int period = ene_read_reg(dev, ENE_CIRCAR_PRD);
321 int hperiod = ene_read_reg(dev, ENE_CIRCAR_HPRD);
11b64d31
ML
322
323 if (!(period & ENE_CIRCAR_PRD_VALID))
324 return;
325
326 period &= ~ENE_CIRCAR_PRD_VALID;
327
328 if (!period)
329 return;
330
331 dbg("RX: hardware carrier period = %02x", period);
332 dbg("RX: hardware carrier pulse period = %02x", hperiod);
333
11b64d31
ML
334 carrier = 2000000 / period;
335 duty_cycle = (hperiod * 100) / period;
336 dbg("RX: sensed carrier = %d Hz, duty cycle %d%%",
e1b1ddbe
ML
337 carrier, duty_cycle);
338 if (dev->carrier_detect_enabled) {
183e19f5
SY
339 struct ir_raw_event ev = {
340 .carrier_report = true,
341 .carrier = carrier,
342 .duty_cycle = duty_cycle
343 };
d8b4b582 344 ir_raw_event_store(dev->rdev, &ev);
e1b1ddbe 345 }
9ea53b74
ML
346}
347
11b64d31 348/* this enables/disables the CIR RX engine */
c29bc4d7 349static void ene_rx_enable_cir_engine(struct ene_device *dev, bool enable)
9ea53b74 350{
11b64d31
ML
351 ene_set_clear_reg_mask(dev, ENE_CIRCFG,
352 ENE_CIRCFG_RX_EN | ENE_CIRCFG_RX_IRQ, enable);
9ea53b74
ML
353}
354
11b64d31 355/* this selects input for CIR engine. Ether GPIO 0A or GPIO40*/
c29bc4d7 356static void ene_rx_select_input(struct ene_device *dev, bool gpio_0a)
9ea53b74 357{
11b64d31 358 ene_set_clear_reg_mask(dev, ENE_CIRCFG2, ENE_CIRCFG2_GPIO0A, gpio_0a);
9ea53b74
ML
359}
360
11b64d31
ML
361/*
362 * this enables alternative input via fan tachometer sensor and bypasses
363 * the hw CIR engine
364 */
c29bc4d7 365static void ene_rx_enable_fan_input(struct ene_device *dev, bool enable)
9ea53b74 366{
11b64d31
ML
367 if (!dev->hw_fan_input)
368 return;
9ea53b74 369
11b64d31
ML
370 if (!enable)
371 ene_write_reg(dev, ENE_FAN_AS_IN1, 0);
372 else {
373 ene_write_reg(dev, ENE_FAN_AS_IN1, ENE_FAN_AS_IN1_EN);
374 ene_write_reg(dev, ENE_FAN_AS_IN2, ENE_FAN_AS_IN2_EN);
375 }
9ea53b74
ML
376}
377
11b64d31
ML
378/* setup the receiver for RX*/
379static void ene_rx_setup(struct ene_device *dev)
9ea53b74 380{
c29bc4d7 381 bool learning_mode = dev->learning_mode_enabled ||
11b64d31
ML
382 dev->carrier_detect_enabled;
383 int sample_period_adjust = 0;
9ea53b74 384
c29bc4d7
ML
385 dbg("RX: setup receiver, learning mode = %d", learning_mode);
386
387
a06423c9
ML
388 /* This selects RLC input and clears CFG2 settings */
389 ene_write_reg(dev, ENE_CIRCFG2, 0x00);
9ea53b74 390
11b64d31
ML
391 /* set sample period*/
392 if (sample_period == ENE_DEFAULT_SAMPLE_PERIOD)
393 sample_period_adjust =
394 dev->pll_freq == ENE_DEFAULT_PLL_FREQ ? 1 : 2;
9ea53b74 395
11b64d31
ML
396 ene_write_reg(dev, ENE_CIRRLC_CFG,
397 (sample_period + sample_period_adjust) |
398 ENE_CIRRLC_CFG_OVERFLOW);
399 /* revB doesn't support inputs */
400 if (dev->hw_revision < ENE_HW_C)
401 goto select_timeout;
9ea53b74 402
a06423c9
ML
403 if (learning_mode) {
404
405 WARN_ON(!dev->hw_learning_and_tx_capable);
9ea53b74 406
11b64d31
ML
407 /* Enable the opposite of the normal input
408 That means that if GPIO40 is normally used, use GPIO0A
409 and vice versa.
410 This input will carry non demodulated
411 signal, and we will tell the hw to demodulate it itself */
c29bc4d7 412 ene_rx_select_input(dev, !dev->hw_use_gpio_0a);
11b64d31 413 dev->rx_fan_input_inuse = false;
9ea53b74 414
11b64d31
ML
415 /* Enable carrier demodulation */
416 ene_set_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_CARR_DEMOD);
9ea53b74 417
11b64d31 418 /* Enable carrier detection */
a06423c9 419 ene_write_reg(dev, ENE_CIRCAR_PULS, 0x63);
11b64d31
ML
420 ene_set_clear_reg_mask(dev, ENE_CIRCFG2, ENE_CIRCFG2_CARR_DETECT,
421 dev->carrier_detect_enabled || debug);
9ea53b74 422 } else {
11b64d31
ML
423 if (dev->hw_fan_input)
424 dev->rx_fan_input_inuse = true;
425 else
c29bc4d7 426 ene_rx_select_input(dev, dev->hw_use_gpio_0a);
11b64d31
ML
427
428 /* Disable carrier detection & demodulation */
429 ene_clear_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_CARR_DEMOD);
430 ene_clear_reg_mask(dev, ENE_CIRCFG2, ENE_CIRCFG2_CARR_DETECT);
9ea53b74
ML
431 }
432
11b64d31 433select_timeout:
931e39a1 434 if (dev->rx_fan_input_inuse) {
5aad7242 435 dev->rdev->rx_resolution = US_TO_NS(ENE_FW_SAMPLE_PERIOD_FAN);
931e39a1 436
11b64d31
ML
437 /* Fan input doesn't support timeouts, it just ends the
438 input with a maximum sample */
d8b4b582 439 dev->rdev->min_timeout = dev->rdev->max_timeout =
5aad7242 440 US_TO_NS(ENE_FW_SMPL_BUF_FAN_MSK *
11b64d31 441 ENE_FW_SAMPLE_PERIOD_FAN);
931e39a1 442 } else {
5aad7242 443 dev->rdev->rx_resolution = US_TO_NS(sample_period);
11b64d31
ML
444
445 /* Theoreticly timeout is unlimited, but we cap it
446 * because it was seen that on one device, it
447 * would stop sending spaces after around 250 msec.
448 * Besides, this is close to 2^32 anyway and timeout is u32.
449 */
5aad7242
JW
450 dev->rdev->min_timeout = US_TO_NS(127 * sample_period);
451 dev->rdev->max_timeout = US_TO_NS(200000);
931e39a1 452 }
11b64d31
ML
453
454 if (dev->hw_learning_and_tx_capable)
5aad7242 455 dev->rdev->tx_resolution = US_TO_NS(sample_period);
11b64d31 456
d8b4b582
DH
457 if (dev->rdev->timeout > dev->rdev->max_timeout)
458 dev->rdev->timeout = dev->rdev->max_timeout;
459 if (dev->rdev->timeout < dev->rdev->min_timeout)
460 dev->rdev->timeout = dev->rdev->min_timeout;
9ea53b74
ML
461}
462
463/* Enable the device for receive */
b5daad2f 464static void ene_rx_enable_hw(struct ene_device *dev)
9ea53b74
ML
465{
466 u8 reg_value;
467
11b64d31 468 /* Enable system interrupt */
9ea53b74 469 if (dev->hw_revision < ENE_HW_C) {
11b64d31
ML
470 ene_write_reg(dev, ENEB_IRQ, dev->irq << 1);
471 ene_write_reg(dev, ENEB_IRQ_UNK1, 0x01);
9ea53b74 472 } else {
11b64d31
ML
473 reg_value = ene_read_reg(dev, ENE_IRQ) & 0xF0;
474 reg_value |= ENE_IRQ_UNK_EN;
475 reg_value &= ~ENE_IRQ_STATUS;
476 reg_value |= (dev->irq & ENE_IRQ_MASK);
477 ene_write_reg(dev, ENE_IRQ, reg_value);
9ea53b74
ML
478 }
479
a06423c9 480 /* Enable inputs */
c29bc4d7
ML
481 ene_rx_enable_fan_input(dev, dev->rx_fan_input_inuse);
482 ene_rx_enable_cir_engine(dev, !dev->rx_fan_input_inuse);
9ea53b74
ML
483
484 /* ack any pending irqs - just in case */
485 ene_irq_status(dev);
486
9ea53b74 487 /* enable firmware bits */
11b64d31 488 ene_set_reg_mask(dev, ENE_FW1, ENE_FW1_ENABLE | ENE_FW1_IRQ);
931e39a1
ML
489
490 /* enter idle mode */
d8b4b582 491 ir_raw_event_set_idle(dev->rdev, true);
b5daad2f
ML
492}
493
494/* Enable the device for receive - wrapper to track the state*/
495static void ene_rx_enable(struct ene_device *dev)
496{
497 ene_rx_enable_hw(dev);
11b64d31 498 dev->rx_enabled = true;
9ea53b74
ML
499}
500
931e39a1 501/* Disable the device receiver */
b5daad2f 502static void ene_rx_disable_hw(struct ene_device *dev)
9ea53b74
ML
503{
504 /* disable inputs */
c29bc4d7
ML
505 ene_rx_enable_cir_engine(dev, false);
506 ene_rx_enable_fan_input(dev, false);
9ea53b74
ML
507
508 /* disable hardware IRQ and firmware flag */
11b64d31 509 ene_clear_reg_mask(dev, ENE_FW1, ENE_FW1_ENABLE | ENE_FW1_IRQ);
d8b4b582 510 ir_raw_event_set_idle(dev->rdev, true);
b5daad2f
ML
511}
512
513/* Disable the device receiver - wrapper to track the state */
514static void ene_rx_disable(struct ene_device *dev)
515{
516 ene_rx_disable_hw(dev);
11b64d31 517 dev->rx_enabled = false;
9ea53b74
ML
518}
519
25985edc 520/* This resets the receiver. Useful to stop stream of spaces at end of
c29bc4d7
ML
521 * transmission
522 */
523static void ene_rx_reset(struct ene_device *dev)
524{
525 ene_clear_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_RX_EN);
526 ene_set_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_RX_EN);
527}
528
529/* Set up the TX carrier frequency and duty cycle */
530static void ene_tx_set_carrier(struct ene_device *dev)
531{
532 u8 tx_puls_width;
533 unsigned long flags;
534
535 spin_lock_irqsave(&dev->hw_lock, flags);
536
537 ene_set_clear_reg_mask(dev, ENE_CIRCFG,
538 ENE_CIRCFG_TX_CARR, dev->tx_period > 0);
539
540 if (!dev->tx_period)
541 goto unlock;
542
543 BUG_ON(dev->tx_duty_cycle >= 100 || dev->tx_duty_cycle <= 0);
544
545 tx_puls_width = dev->tx_period / (100 / dev->tx_duty_cycle);
546
547 if (!tx_puls_width)
548 tx_puls_width = 1;
549
550 dbg("TX: pulse distance = %d * 500 ns", dev->tx_period);
551 dbg("TX: pulse width = %d * 500 ns", tx_puls_width);
552
553 ene_write_reg(dev, ENE_CIRMOD_PRD, dev->tx_period | ENE_CIRMOD_PRD_POL);
554 ene_write_reg(dev, ENE_CIRMOD_HPRD, tx_puls_width);
555unlock:
556 spin_unlock_irqrestore(&dev->hw_lock, flags);
557}
558
559/* Enable/disable transmitters */
560static void ene_tx_set_transmitters(struct ene_device *dev)
561{
562 unsigned long flags;
563
564 spin_lock_irqsave(&dev->hw_lock, flags);
565 ene_set_clear_reg_mask(dev, ENE_GPIOFS8, ENE_GPIOFS8_GPIO41,
566 !!(dev->transmitter_mask & 0x01));
567 ene_set_clear_reg_mask(dev, ENE_GPIOFS1, ENE_GPIOFS1_GPIO0D,
568 !!(dev->transmitter_mask & 0x02));
569 spin_unlock_irqrestore(&dev->hw_lock, flags);
570}
571
9ea53b74 572/* prepare transmission */
c29bc4d7 573static void ene_tx_enable(struct ene_device *dev)
9ea53b74 574{
11b64d31
ML
575 u8 conf1 = ene_read_reg(dev, ENE_CIRCFG);
576 u8 fwreg2 = ene_read_reg(dev, ENE_FW2);
9ea53b74 577
9ea53b74
ML
578 dev->saved_conf1 = conf1;
579
11b64d31
ML
580 /* Show information about currently connected transmitter jacks */
581 if (fwreg2 & ENE_FW2_EMMITER1_CONN)
582 dbg("TX: Transmitter #1 is connected");
9ea53b74 583
11b64d31
ML
584 if (fwreg2 & ENE_FW2_EMMITER2_CONN)
585 dbg("TX: Transmitter #2 is connected");
9ea53b74 586
11b64d31 587 if (!(fwreg2 & (ENE_FW2_EMMITER1_CONN | ENE_FW2_EMMITER2_CONN)))
7de3461c 588 pr_warn("TX: transmitter cable isn't connected!\n");
11b64d31 589
11b64d31
ML
590 /* disable receive on revc */
591 if (dev->hw_revision == ENE_HW_C)
592 conf1 &= ~ENE_CIRCFG_RX_EN;
9ea53b74 593
11b64d31
ML
594 /* Enable TX engine */
595 conf1 |= ENE_CIRCFG_TX_EN | ENE_CIRCFG_TX_IRQ;
596 ene_write_reg(dev, ENE_CIRCFG, conf1);
9ea53b74
ML
597}
598
599/* end transmission */
c29bc4d7 600static void ene_tx_disable(struct ene_device *dev)
9ea53b74 601{
11b64d31 602 ene_write_reg(dev, ENE_CIRCFG, dev->saved_conf1);
931e39a1 603 dev->tx_buffer = NULL;
9ea53b74
ML
604}
605
9ea53b74
ML
606
607/* TX one sample - must be called with dev->hw_lock*/
608static void ene_tx_sample(struct ene_device *dev)
609{
610 u8 raw_tx;
611 u32 sample;
11b64d31 612 bool pulse = dev->tx_sample_pulse;
9ea53b74 613
931e39a1 614 if (!dev->tx_buffer) {
7de3461c 615 pr_warn("TX: BUG: attempt to transmit NULL buffer\n");
9ea53b74
ML
616 return;
617 }
618
619 /* Grab next TX sample */
620 if (!dev->tx_sample) {
11b64d31
ML
621
622 if (dev->tx_pos == dev->tx_len) {
9ea53b74 623 if (!dev->tx_done) {
11b64d31
ML
624 dbg("TX: no more data to send");
625 dev->tx_done = true;
9ea53b74
ML
626 goto exit;
627 } else {
11b64d31 628 dbg("TX: last sample sent by hardware");
c29bc4d7 629 ene_tx_disable(dev);
9ea53b74
ML
630 complete(&dev->tx_complete);
631 return;
632 }
633 }
634
635 sample = dev->tx_buffer[dev->tx_pos++];
636 dev->tx_sample_pulse = !dev->tx_sample_pulse;
637
11b64d31 638 dev->tx_sample = DIV_ROUND_CLOSEST(sample, sample_period);
9ea53b74 639
9ea53b74 640 if (!dev->tx_sample)
11b64d31 641 dev->tx_sample = 1;
9ea53b74
ML
642 }
643
11b64d31 644 raw_tx = min(dev->tx_sample , (unsigned int)ENE_CIRRLC_OUT_MASK);
9ea53b74
ML
645 dev->tx_sample -= raw_tx;
646
11b64d31
ML
647 dbg("TX: sample %8d (%s)", raw_tx * sample_period,
648 pulse ? "pulse" : "space");
649 if (pulse)
650 raw_tx |= ENE_CIRRLC_OUT_PULSE;
651
652 ene_write_reg(dev,
653 dev->tx_reg ? ENE_CIRRLC_OUT1 : ENE_CIRRLC_OUT0, raw_tx);
9ea53b74 654
9ea53b74
ML
655 dev->tx_reg = !dev->tx_reg;
656exit:
657 /* simulate TX done interrupt */
658 if (txsim)
659 mod_timer(&dev->tx_sim_timer, jiffies + HZ / 500);
660}
661
662/* timer to simulate tx done interrupt */
b17ec78a 663static void ene_tx_irqsim(struct timer_list *t)
9ea53b74 664{
b17ec78a 665 struct ene_device *dev = from_timer(dev, t, tx_sim_timer);
9ea53b74
ML
666 unsigned long flags;
667
668 spin_lock_irqsave(&dev->hw_lock, flags);
669 ene_tx_sample(dev);
670 spin_unlock_irqrestore(&dev->hw_lock, flags);
671}
672
673
674/* read irq status and ack it */
675static int ene_irq_status(struct ene_device *dev)
676{
677 u8 irq_status;
678 u8 fw_flags1, fw_flags2;
9ea53b74
ML
679 int retval = 0;
680
11b64d31 681 fw_flags2 = ene_read_reg(dev, ENE_FW2);
9ea53b74
ML
682
683 if (dev->hw_revision < ENE_HW_C) {
11b64d31 684 irq_status = ene_read_reg(dev, ENEB_IRQ_STATUS);
9ea53b74
ML
685
686 if (!(irq_status & ENEB_IRQ_STATUS_IR))
687 return 0;
688
11b64d31 689 ene_clear_reg_mask(dev, ENEB_IRQ_STATUS, ENEB_IRQ_STATUS_IR);
9ea53b74
ML
690 return ENE_IRQ_RX;
691 }
692
11b64d31
ML
693 irq_status = ene_read_reg(dev, ENE_IRQ);
694 if (!(irq_status & ENE_IRQ_STATUS))
9ea53b74
ML
695 return 0;
696
697 /* original driver does that twice - a workaround ? */
11b64d31
ML
698 ene_write_reg(dev, ENE_IRQ, irq_status & ~ENE_IRQ_STATUS);
699 ene_write_reg(dev, ENE_IRQ, irq_status & ~ENE_IRQ_STATUS);
9ea53b74 700
11b64d31
ML
701 /* check RX interrupt */
702 if (fw_flags2 & ENE_FW2_RXIRQ) {
703 retval |= ENE_IRQ_RX;
704 ene_write_reg(dev, ENE_FW2, fw_flags2 & ~ENE_FW2_RXIRQ);
705 }
9ea53b74 706
11b64d31
ML
707 /* check TX interrupt */
708 fw_flags1 = ene_read_reg(dev, ENE_FW1);
9ea53b74 709 if (fw_flags1 & ENE_FW1_TXIRQ) {
11b64d31 710 ene_write_reg(dev, ENE_FW1, fw_flags1 & ~ENE_FW1_TXIRQ);
9ea53b74
ML
711 retval |= ENE_IRQ_TX;
712 }
713
11b64d31
ML
714 return retval;
715}
9ea53b74 716
9ea53b74
ML
717/* interrupt handler */
718static irqreturn_t ene_isr(int irq, void *data)
719{
11b64d31
ML
720 u16 hw_value, reg;
721 int hw_sample, irq_status;
722 bool pulse;
9ea53b74 723 unsigned long flags;
9ea53b74
ML
724 irqreturn_t retval = IRQ_NONE;
725 struct ene_device *dev = (struct ene_device *)data;
183e19f5 726 struct ir_raw_event ev = {};
9ea53b74 727
9ea53b74 728 spin_lock_irqsave(&dev->hw_lock, flags);
11b64d31
ML
729
730 dbg_verbose("ISR called");
c29bc4d7 731 ene_rx_read_hw_pointer(dev);
9ea53b74
ML
732 irq_status = ene_irq_status(dev);
733
734 if (!irq_status)
735 goto unlock;
736
737 retval = IRQ_HANDLED;
738
739 if (irq_status & ENE_IRQ_TX) {
11b64d31 740 dbg_verbose("TX interrupt");
9ea53b74 741 if (!dev->hw_learning_and_tx_capable) {
11b64d31 742 dbg("TX interrupt on unsupported device!");
9ea53b74
ML
743 goto unlock;
744 }
745 ene_tx_sample(dev);
746 }
747
748 if (!(irq_status & ENE_IRQ_RX))
749 goto unlock;
750
11b64d31 751 dbg_verbose("RX interrupt");
9ea53b74 752
e1b1ddbe 753 if (dev->hw_learning_and_tx_capable)
11b64d31
ML
754 ene_rx_sense_carrier(dev);
755
756 /* On hardware that don't support extra buffer we need to trust
757 the interrupt and not track the read pointer */
758 if (!dev->hw_extra_buffer)
759 dev->r_pointer = dev->w_pointer == 0 ? ENE_FW_PACKET_SIZE : 0;
760
761 while (1) {
9ea53b74 762
c29bc4d7 763 reg = ene_rx_get_sample_reg(dev);
11b64d31
ML
764
765 dbg_verbose("next sample to read at: %04x", reg);
766 if (!reg)
767 break;
768
769 hw_value = ene_read_reg(dev, reg);
9ea53b74
ML
770
771 if (dev->rx_fan_input_inuse) {
11b64d31
ML
772
773 int offset = ENE_FW_SMPL_BUF_FAN - ENE_FW_SAMPLE_BUFFER;
774
9ea53b74 775 /* read high part of the sample */
11b64d31
ML
776 hw_value |= ene_read_reg(dev, reg + offset) << 8;
777 pulse = hw_value & ENE_FW_SMPL_BUF_FAN_PLS;
9ea53b74
ML
778
779 /* clear space bit, and other unused bits */
11b64d31
ML
780 hw_value &= ENE_FW_SMPL_BUF_FAN_MSK;
781 hw_sample = hw_value * ENE_FW_SAMPLE_PERIOD_FAN;
9ea53b74
ML
782
783 } else {
11b64d31
ML
784 pulse = !(hw_value & ENE_FW_SAMPLE_SPACE);
785 hw_value &= ~ENE_FW_SAMPLE_SPACE;
9ea53b74 786 hw_sample = hw_value * sample_period;
931e39a1
ML
787
788 if (dev->rx_period_adjust) {
11b64d31
ML
789 hw_sample *= 100;
790 hw_sample /= (100 + dev->rx_period_adjust);
931e39a1 791 }
9ea53b74 792 }
9ea53b74 793
11b64d31
ML
794 if (!dev->hw_extra_buffer && !hw_sample) {
795 dev->r_pointer = dev->w_pointer;
796 continue;
797 }
931e39a1 798
11b64d31 799 dbg("RX: %d (%s)", hw_sample, pulse ? "pulse" : "space");
931e39a1 800
5aad7242 801 ev.duration = US_TO_NS(hw_sample);
931e39a1 802 ev.pulse = pulse;
d8b4b582 803 ir_raw_event_store_with_filter(dev->rdev, &ev);
9ea53b74 804 }
931e39a1 805
d8b4b582 806 ir_raw_event_handle(dev->rdev);
9ea53b74
ML
807unlock:
808 spin_unlock_irqrestore(&dev->hw_lock, flags);
809 return retval;
810}
811
812/* Initialize default settings */
c29bc4d7 813static void ene_setup_default_settings(struct ene_device *dev)
9ea53b74 814{
9ea53b74 815 dev->tx_period = 32;
11b64d31
ML
816 dev->tx_duty_cycle = 50; /*%*/
817 dev->transmitter_mask = 0x03;
c29bc4d7 818 dev->learning_mode_enabled = learning_mode_force;
9ea53b74 819
11b64d31 820 /* Set reasonable default timeout */
5aad7242 821 dev->rdev->timeout = US_TO_NS(150000);
9ea53b74
ML
822}
823
c29bc4d7
ML
824/* Upload all hardware settings at once. Used at load and resume time */
825static void ene_setup_hw_settings(struct ene_device *dev)
826{
827 if (dev->hw_learning_and_tx_capable) {
828 ene_tx_set_carrier(dev);
829 ene_tx_set_transmitters(dev);
830 }
831
832 ene_rx_setup(dev);
833}
834
9ea53b74 835/* outside interface: called on first open*/
d8b4b582 836static int ene_open(struct rc_dev *rdev)
9ea53b74 837{
d8b4b582 838 struct ene_device *dev = rdev->priv;
9ea53b74
ML
839 unsigned long flags;
840
841 spin_lock_irqsave(&dev->hw_lock, flags);
9ea53b74
ML
842 ene_rx_enable(dev);
843 spin_unlock_irqrestore(&dev->hw_lock, flags);
844 return 0;
845}
846
847/* outside interface: called on device close*/
d8b4b582 848static void ene_close(struct rc_dev *rdev)
9ea53b74 849{
d8b4b582 850 struct ene_device *dev = rdev->priv;
9ea53b74
ML
851 unsigned long flags;
852 spin_lock_irqsave(&dev->hw_lock, flags);
853
854 ene_rx_disable(dev);
9ea53b74
ML
855 spin_unlock_irqrestore(&dev->hw_lock, flags);
856}
857
931e39a1 858/* outside interface: set transmitter mask */
d8b4b582 859static int ene_set_tx_mask(struct rc_dev *rdev, u32 tx_mask)
9ea53b74 860{
d8b4b582 861 struct ene_device *dev = rdev->priv;
11b64d31 862 dbg("TX: attempt to set transmitter mask %02x", tx_mask);
931e39a1
ML
863
864 /* invalid txmask */
11b64d31
ML
865 if (!tx_mask || tx_mask & ~0x03) {
866 dbg("TX: invalid mask");
931e39a1
ML
867 /* return count of transmitters */
868 return 2;
9ea53b74
ML
869 }
870
931e39a1 871 dev->transmitter_mask = tx_mask;
c29bc4d7 872 ene_tx_set_transmitters(dev);
931e39a1
ML
873 return 0;
874}
9ea53b74 875
931e39a1 876/* outside interface : set tx carrier */
d8b4b582 877static int ene_set_tx_carrier(struct rc_dev *rdev, u32 carrier)
931e39a1 878{
d8b4b582 879 struct ene_device *dev = rdev->priv;
48cafec9 880 u32 period;
9ea53b74 881
11b64d31 882 dbg("TX: attempt to set tx carrier to %d kHz", carrier);
48cafec9
DC
883 if (carrier == 0)
884 return -EINVAL;
9ea53b74 885
48cafec9 886 period = 2000000 / carrier;
11b64d31
ML
887 if (period && (period > ENE_CIRMOD_PRD_MAX ||
888 period < ENE_CIRMOD_PRD_MIN)) {
9ea53b74 889
11b64d31 890 dbg("TX: out of range %d-%d kHz carrier",
c29bc4d7 891 2000 / ENE_CIRMOD_PRD_MIN, 2000 / ENE_CIRMOD_PRD_MAX);
14d8188a 892 return -EINVAL;
9ea53b74
ML
893 }
894
931e39a1 895 dev->tx_period = period;
c29bc4d7 896 ene_tx_set_carrier(dev);
931e39a1 897 return 0;
9ea53b74
ML
898}
899
11b64d31 900/*outside interface : set tx duty cycle */
d8b4b582 901static int ene_set_tx_duty_cycle(struct rc_dev *rdev, u32 duty_cycle)
11b64d31 902{
d8b4b582 903 struct ene_device *dev = rdev->priv;
11b64d31 904 dbg("TX: setting duty cycle to %d%%", duty_cycle);
11b64d31 905 dev->tx_duty_cycle = duty_cycle;
c29bc4d7 906 ene_tx_set_carrier(dev);
11b64d31
ML
907 return 0;
908}
931e39a1
ML
909
910/* outside interface: enable learning mode */
d8b4b582 911static int ene_set_learning_mode(struct rc_dev *rdev, int enable)
9ea53b74 912{
d8b4b582 913 struct ene_device *dev = rdev->priv;
9ea53b74 914 unsigned long flags;
c29bc4d7 915 if (enable == dev->learning_mode_enabled)
931e39a1 916 return 0;
9ea53b74 917
931e39a1 918 spin_lock_irqsave(&dev->hw_lock, flags);
c29bc4d7 919 dev->learning_mode_enabled = enable;
11b64d31
ML
920 ene_rx_disable(dev);
921 ene_rx_setup(dev);
922 ene_rx_enable(dev);
931e39a1
ML
923 spin_unlock_irqrestore(&dev->hw_lock, flags);
924 return 0;
925}
9ea53b74 926
d8b4b582 927static int ene_set_carrier_report(struct rc_dev *rdev, int enable)
e1b1ddbe 928{
d8b4b582 929 struct ene_device *dev = rdev->priv;
e1b1ddbe
ML
930 unsigned long flags;
931
932 if (enable == dev->carrier_detect_enabled)
933 return 0;
934
935 spin_lock_irqsave(&dev->hw_lock, flags);
936 dev->carrier_detect_enabled = enable;
937 ene_rx_disable(dev);
938 ene_rx_setup(dev);
939 ene_rx_enable(dev);
940 spin_unlock_irqrestore(&dev->hw_lock, flags);
941 return 0;
942}
943
931e39a1 944/* outside interface: enable or disable idle mode */
d8b4b582 945static void ene_set_idle(struct rc_dev *rdev, bool idle)
931e39a1 946{
d8b4b582
DH
947 struct ene_device *dev = rdev->priv;
948
c29bc4d7 949 if (idle) {
d8b4b582 950 ene_rx_reset(dev);
c29bc4d7
ML
951 dbg("RX: end of data");
952 }
11b64d31 953}
9ea53b74 954
931e39a1 955/* outside interface: transmit */
5588dc2b 956static int ene_transmit(struct rc_dev *rdev, unsigned *buf, unsigned n)
931e39a1 957{
d8b4b582 958 struct ene_device *dev = rdev->priv;
931e39a1
ML
959 unsigned long flags;
960
961 dev->tx_buffer = buf;
5588dc2b 962 dev->tx_len = n;
9ea53b74
ML
963 dev->tx_pos = 0;
964 dev->tx_reg = 0;
965 dev->tx_done = 0;
966 dev->tx_sample = 0;
2816cc31 967 dev->tx_sample_pulse = false;
9ea53b74 968
11b64d31 969 dbg("TX: %d samples", dev->tx_len);
9ea53b74
ML
970
971 spin_lock_irqsave(&dev->hw_lock, flags);
972
c29bc4d7 973 ene_tx_enable(dev);
9ea53b74
ML
974
975 /* Transmit first two samples */
976 ene_tx_sample(dev);
977 ene_tx_sample(dev);
978
979 spin_unlock_irqrestore(&dev->hw_lock, flags);
980
981 if (wait_for_completion_timeout(&dev->tx_complete, 2 * HZ) == 0) {
11b64d31 982 dbg("TX: timeout");
9ea53b74 983 spin_lock_irqsave(&dev->hw_lock, flags);
c29bc4d7 984 ene_tx_disable(dev);
9ea53b74
ML
985 spin_unlock_irqrestore(&dev->hw_lock, flags);
986 } else
11b64d31 987 dbg("TX: done");
9ea53b74
ML
988 return n;
989}
990
931e39a1
ML
991/* probe entry */
992static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
9ea53b74 993{
9ea53b74 994 int error = -ENOMEM;
d8b4b582 995 struct rc_dev *rdev;
931e39a1 996 struct ene_device *dev;
9ea53b74 997
931e39a1 998 /* allocate memory */
9ea53b74 999 dev = kzalloc(sizeof(struct ene_device), GFP_KERNEL);
0f7499fd 1000 rdev = rc_allocate_device(RC_DRIVER_IR_RAW);
d8b4b582 1001 if (!dev || !rdev)
70ef6991 1002 goto exit_free_dev_rdev;
9ea53b74
ML
1003
1004 /* validate resources */
931e39a1
ML
1005 error = -ENODEV;
1006
2e4c5562
KM
1007 /* init these to -1, as 0 is valid for both */
1008 dev->hw_io = -1;
1009 dev->irq = -1;
1010
9ea53b74 1011 if (!pnp_port_valid(pnp_dev, 0) ||
11b64d31 1012 pnp_port_len(pnp_dev, 0) < ENE_IO_SIZE)
70ef6991 1013 goto exit_free_dev_rdev;
9ea53b74
ML
1014
1015 if (!pnp_irq_valid(pnp_dev, 0))
70ef6991 1016 goto exit_free_dev_rdev;
9ea53b74 1017
9ea53b74
ML
1018 spin_lock_init(&dev->hw_lock);
1019
b31b0219 1020 dev->hw_io = pnp_port_start(pnp_dev, 0);
1de6ebba
ML
1021 dev->irq = pnp_irq(pnp_dev, 0);
1022
b31b0219 1023
931e39a1
ML
1024 pnp_set_drvdata(pnp_dev, dev);
1025 dev->pnp_dev = pnp_dev;
9ea53b74 1026
11b64d31
ML
1027 /* don't allow too short/long sample periods */
1028 if (sample_period < 5 || sample_period > 0x7F)
1029 sample_period = ENE_DEFAULT_SAMPLE_PERIOD;
1030
9ea53b74
ML
1031 /* detect hardware version and features */
1032 error = ene_hw_detect(dev);
1033 if (error)
70ef6991 1034 goto exit_free_dev_rdev;
9ea53b74 1035
9ea53b74 1036 if (!dev->hw_learning_and_tx_capable && txsim) {
11b64d31 1037 dev->hw_learning_and_tx_capable = true;
b17ec78a 1038 timer_setup(&dev->tx_sim_timer, ene_tx_irqsim, 0);
7de3461c 1039 pr_warn("Simulation of TX activated\n");
9ea53b74
ML
1040 }
1041
a06423c9 1042 if (!dev->hw_learning_and_tx_capable)
c29bc4d7 1043 learning_mode_force = false;
a06423c9 1044
6d741bfe 1045 rdev->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
d8b4b582
DH
1046 rdev->priv = dev;
1047 rdev->open = ene_open;
1048 rdev->close = ene_close;
1049 rdev->s_idle = ene_set_idle;
1050 rdev->driver_name = ENE_DRIVER_NAME;
1051 rdev->map_name = RC_MAP_RC6_MCE;
518f4b26 1052 rdev->device_name = "ENE eHome Infrared Remote Receiver";
9ea53b74 1053
931e39a1 1054 if (dev->hw_learning_and_tx_capable) {
d8b4b582 1055 rdev->s_learning_mode = ene_set_learning_mode;
931e39a1 1056 init_completion(&dev->tx_complete);
d8b4b582
DH
1057 rdev->tx_ir = ene_transmit;
1058 rdev->s_tx_mask = ene_set_tx_mask;
1059 rdev->s_tx_carrier = ene_set_tx_carrier;
1060 rdev->s_tx_duty_cycle = ene_set_tx_duty_cycle;
1061 rdev->s_carrier_report = ene_set_carrier_report;
518f4b26 1062 rdev->device_name = "ENE eHome Infrared Remote Transceiver";
931e39a1
ML
1063 }
1064
2e4c5562
KM
1065 dev->rdev = rdev;
1066
c29bc4d7
ML
1067 ene_rx_setup_hw_buffer(dev);
1068 ene_setup_default_settings(dev);
1069 ene_setup_hw_settings(dev);
931e39a1 1070
11b64d31
ML
1071 device_set_wakeup_capable(&pnp_dev->dev, true);
1072 device_set_wakeup_enable(&pnp_dev->dev, true);
9ea53b74 1073
9fa35204
MK
1074 error = rc_register_device(rdev);
1075 if (error < 0)
1076 goto exit_free_dev_rdev;
1077
9ef449c6
LH
1078 /* claim the resources */
1079 error = -EBUSY;
9ef449c6 1080 if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) {
9fa35204 1081 goto exit_unregister_device;
9ef449c6
LH
1082 }
1083
9ef449c6
LH
1084 if (request_irq(dev->irq, ene_isr,
1085 IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) {
70ef6991 1086 goto exit_release_hw_io;
9ef449c6
LH
1087 }
1088
7de3461c 1089 pr_notice("driver has been successfully loaded\n");
9ea53b74 1090 return 0;
56411c0f 1091
70ef6991 1092exit_release_hw_io:
56411c0f 1093 release_region(dev->hw_io, ENE_IO_SIZE);
9fa35204
MK
1094exit_unregister_device:
1095 rc_unregister_device(rdev);
dbcd371b 1096 rdev = NULL;
70ef6991 1097exit_free_dev_rdev:
d8b4b582 1098 rc_free_device(rdev);
9ea53b74 1099 kfree(dev);
9ea53b74
ML
1100 return error;
1101}
1102
1103/* main unload function */
1104static void ene_remove(struct pnp_dev *pnp_dev)
1105{
1106 struct ene_device *dev = pnp_get_drvdata(pnp_dev);
1107 unsigned long flags;
1108
1109 spin_lock_irqsave(&dev->hw_lock, flags);
1110 ene_rx_disable(dev);
c29bc4d7 1111 ene_rx_restore_hw_buffer(dev);
9ea53b74
ML
1112 spin_unlock_irqrestore(&dev->hw_lock, flags);
1113
1114 free_irq(dev->irq, dev);
11b64d31 1115 release_region(dev->hw_io, ENE_IO_SIZE);
d8b4b582 1116 rc_unregister_device(dev->rdev);
9ea53b74
ML
1117 kfree(dev);
1118}
1119
1120/* enable wake on IR (wakes on specific button on original remote) */
b5daad2f 1121static void ene_enable_wake(struct ene_device *dev, bool enable)
9ea53b74 1122{
11b64d31
ML
1123 dbg("wake on IR %s", enable ? "enabled" : "disabled");
1124 ene_set_clear_reg_mask(dev, ENE_FW1, ENE_FW1_WAKE, enable);
9ea53b74
ML
1125}
1126
1127#ifdef CONFIG_PM
1128static int ene_suspend(struct pnp_dev *pnp_dev, pm_message_t state)
1129{
1130 struct ene_device *dev = pnp_get_drvdata(pnp_dev);
b5daad2f
ML
1131 bool wake = device_may_wakeup(&dev->pnp_dev->dev);
1132
1133 if (!wake && dev->rx_enabled)
1134 ene_rx_disable_hw(dev);
11b64d31 1135
b5daad2f 1136 ene_enable_wake(dev, wake);
9ea53b74
ML
1137 return 0;
1138}
1139
1140static int ene_resume(struct pnp_dev *pnp_dev)
1141{
1142 struct ene_device *dev = pnp_get_drvdata(pnp_dev);
c29bc4d7
ML
1143 ene_setup_hw_settings(dev);
1144
1145 if (dev->rx_enabled)
9ea53b74 1146 ene_rx_enable(dev);
c29bc4d7 1147
11b64d31 1148 ene_enable_wake(dev, false);
9ea53b74
ML
1149 return 0;
1150}
1151#endif
1152
1153static void ene_shutdown(struct pnp_dev *pnp_dev)
1154{
1155 struct ene_device *dev = pnp_get_drvdata(pnp_dev);
11b64d31 1156 ene_enable_wake(dev, true);
9ea53b74
ML
1157}
1158
1159static const struct pnp_device_id ene_ids[] = {
1160 {.id = "ENE0100",},
1161 {.id = "ENE0200",},
1162 {.id = "ENE0201",},
931e39a1 1163 {.id = "ENE0202",},
9ea53b74
ML
1164 {},
1165};
1166
1167static struct pnp_driver ene_driver = {
1168 .name = ENE_DRIVER_NAME,
1169 .id_table = ene_ids,
1170 .flags = PNP_DRIVER_RES_DO_NOT_CHANGE,
1171
1172 .probe = ene_probe,
4c62e976 1173 .remove = ene_remove,
9ea53b74
ML
1174#ifdef CONFIG_PM
1175 .suspend = ene_suspend,
1176 .resume = ene_resume,
1177#endif
1178 .shutdown = ene_shutdown,
1179};
1180
9ea53b74
ML
1181module_param(sample_period, int, S_IRUGO);
1182MODULE_PARM_DESC(sample_period, "Hardware sample period (50 us default)");
1183
c29bc4d7
ML
1184module_param(learning_mode_force, bool, S_IRUGO);
1185MODULE_PARM_DESC(learning_mode_force, "Enable learning mode by default");
9ea53b74
ML
1186
1187module_param(debug, int, S_IRUGO | S_IWUSR);
11b64d31 1188MODULE_PARM_DESC(debug, "Debug level");
9ea53b74
ML
1189
1190module_param(txsim, bool, S_IRUGO);
1191MODULE_PARM_DESC(txsim,
1192 "Simulate TX features on unsupported hardware (dangerous)");
1193
9ea53b74
ML
1194MODULE_DEVICE_TABLE(pnp, ene_ids);
1195MODULE_DESCRIPTION
25ec587c 1196 ("Infrared input driver for KB3926B/C/D/E/F (aka ENE0100/ENE0200/ENE0201/ENE0202) CIR port");
9ea53b74
ML
1197
1198MODULE_AUTHOR("Maxim Levitsky");
1199MODULE_LICENSE("GPL");
1200
af638a04 1201module_pnp_driver(ene_driver);
This page took 0.849505 seconds and 4 git commands to generate.