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