cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ene_ir.c (31303B)


      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
     30static int sample_period;
     31static bool learning_mode_force;
     32static int debug;
     33static bool txsim;
     34
     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}
     40
     41/* read a hardware register */
     42static 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 */
     52static 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 */
     60static 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 */
     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}
     74
     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);
     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;
     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 */
    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
    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;
    228error:
    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*/
    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
    312	dbg("attempt to read beyond ring buffer end");
    313	return 0;
    314}
    315
    316/* Sense current received carrier */
    317static 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 */
    349static 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*/
    356static 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 */
    365static 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*/
    379static 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
    433select_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->hw_learning_and_tx_capable)
    455		dev->rdev->tx_resolution = sample_period;
    456
    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;
    461}
    462
    463/* Enable the device for receive */
    464static void ene_rx_enable_hw(struct ene_device *dev)
    465{
    466	u8 reg_value;
    467
    468	/* Enable system interrupt */
    469	if (dev->hw_revision < ENE_HW_C) {
    470		ene_write_reg(dev, ENEB_IRQ, dev->irq << 1);
    471		ene_write_reg(dev, ENEB_IRQ_UNK1, 0x01);
    472	} else {
    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);
    478	}
    479
    480	/* Enable inputs */
    481	ene_rx_enable_fan_input(dev, dev->rx_fan_input_inuse);
    482	ene_rx_enable_cir_engine(dev, !dev->rx_fan_input_inuse);
    483
    484	/* ack any pending irqs - just in case */
    485	ene_irq_status(dev);
    486
    487	/* enable firmware bits */
    488	ene_set_reg_mask(dev, ENE_FW1, ENE_FW1_ENABLE | ENE_FW1_IRQ);
    489
    490	/* enter idle mode */
    491	ir_raw_event_set_idle(dev->rdev, true);
    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);
    498	dev->rx_enabled = true;
    499}
    500
    501/* Disable the device receiver */
    502static void ene_rx_disable_hw(struct ene_device *dev)
    503{
    504	/* disable inputs */
    505	ene_rx_enable_cir_engine(dev, false);
    506	ene_rx_enable_fan_input(dev, false);
    507
    508	/* disable hardware IRQ and firmware flag */
    509	ene_clear_reg_mask(dev, ENE_FW1, ENE_FW1_ENABLE | ENE_FW1_IRQ);
    510	ir_raw_event_set_idle(dev->rdev, true);
    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);
    517	dev->rx_enabled = false;
    518}
    519
    520/* This resets the receiver. Useful to stop stream of spaces at end of
    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
    572/* prepare transmission */
    573static void ene_tx_enable(struct ene_device *dev)
    574{
    575	u8 conf1 = ene_read_reg(dev, ENE_CIRCFG);
    576	u8 fwreg2 = ene_read_reg(dev, ENE_FW2);
    577
    578	dev->saved_conf1 = conf1;
    579
    580	/* Show information about currently connected transmitter jacks */
    581	if (fwreg2 & ENE_FW2_EMMITER1_CONN)
    582		dbg("TX: Transmitter #1 is connected");
    583
    584	if (fwreg2 & ENE_FW2_EMMITER2_CONN)
    585		dbg("TX: Transmitter #2 is connected");
    586
    587	if (!(fwreg2 & (ENE_FW2_EMMITER1_CONN | ENE_FW2_EMMITER2_CONN)))
    588		pr_warn("TX: transmitter cable isn't connected!\n");
    589
    590	/* disable receive on revc */
    591	if (dev->hw_revision == ENE_HW_C)
    592		conf1 &= ~ENE_CIRCFG_RX_EN;
    593
    594	/* Enable TX engine */
    595	conf1 |= ENE_CIRCFG_TX_EN | ENE_CIRCFG_TX_IRQ;
    596	ene_write_reg(dev, ENE_CIRCFG, conf1);
    597}
    598
    599/* end transmission */
    600static void ene_tx_disable(struct ene_device *dev)
    601{
    602	ene_write_reg(dev, ENE_CIRCFG, dev->saved_conf1);
    603	dev->tx_buffer = NULL;
    604}
    605
    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;
    612	bool pulse = dev->tx_sample_pulse;
    613
    614	if (!dev->tx_buffer) {
    615		pr_warn("TX: BUG: attempt to transmit NULL buffer\n");
    616		return;
    617	}
    618
    619	/* Grab next TX sample */
    620	if (!dev->tx_sample) {
    621
    622		if (dev->tx_pos == dev->tx_len) {
    623			if (!dev->tx_done) {
    624				dbg("TX: no more data to send");
    625				dev->tx_done = true;
    626				goto exit;
    627			} else {
    628				dbg("TX: last sample sent by hardware");
    629				ene_tx_disable(dev);
    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
    638		dev->tx_sample = DIV_ROUND_CLOSEST(sample, sample_period);
    639
    640		if (!dev->tx_sample)
    641			dev->tx_sample = 1;
    642	}
    643
    644	raw_tx = min(dev->tx_sample , (unsigned int)ENE_CIRRLC_OUT_MASK);
    645	dev->tx_sample -= raw_tx;
    646
    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);
    654
    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 */
    663static void ene_tx_irqsim(struct timer_list *t)
    664{
    665	struct ene_device *dev = from_timer(dev, t, tx_sim_timer);
    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;
    679	int retval = 0;
    680
    681	fw_flags2 = ene_read_reg(dev, ENE_FW2);
    682
    683	if (dev->hw_revision < ENE_HW_C) {
    684		irq_status = ene_read_reg(dev, ENEB_IRQ_STATUS);
    685
    686		if (!(irq_status & ENEB_IRQ_STATUS_IR))
    687			return 0;
    688
    689		ene_clear_reg_mask(dev, ENEB_IRQ_STATUS, ENEB_IRQ_STATUS_IR);
    690		return ENE_IRQ_RX;
    691	}
    692
    693	irq_status = ene_read_reg(dev, ENE_IRQ);
    694	if (!(irq_status & ENE_IRQ_STATUS))
    695		return 0;
    696
    697	/* original driver does that twice - a workaround ? */
    698	ene_write_reg(dev, ENE_IRQ, irq_status & ~ENE_IRQ_STATUS);
    699	ene_write_reg(dev, ENE_IRQ, irq_status & ~ENE_IRQ_STATUS);
    700
    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	}
    706
    707	/* check TX interrupt */
    708	fw_flags1 = ene_read_reg(dev, ENE_FW1);
    709	if (fw_flags1 & ENE_FW1_TXIRQ) {
    710		ene_write_reg(dev, ENE_FW1, fw_flags1 & ~ENE_FW1_TXIRQ);
    711		retval |= ENE_IRQ_TX;
    712	}
    713
    714	return retval;
    715}
    716
    717/* interrupt handler */
    718static irqreturn_t ene_isr(int irq, void *data)
    719{
    720	u16 hw_value, reg;
    721	int hw_sample, irq_status;
    722	bool pulse;
    723	unsigned long flags;
    724	irqreturn_t retval = IRQ_NONE;
    725	struct ene_device *dev = (struct ene_device *)data;
    726	struct ir_raw_event ev = {};
    727
    728	spin_lock_irqsave(&dev->hw_lock, flags);
    729
    730	dbg_verbose("ISR called");
    731	ene_rx_read_hw_pointer(dev);
    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) {
    740		dbg_verbose("TX interrupt");
    741		if (!dev->hw_learning_and_tx_capable) {
    742			dbg("TX interrupt on unsupported device!");
    743			goto unlock;
    744		}
    745		ene_tx_sample(dev);
    746	}
    747
    748	if (!(irq_status & ENE_IRQ_RX))
    749		goto unlock;
    750
    751	dbg_verbose("RX interrupt");
    752
    753	if (dev->hw_learning_and_tx_capable)
    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) {
    762
    763		reg = ene_rx_get_sample_reg(dev);
    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);
    770
    771		if (dev->rx_fan_input_inuse) {
    772
    773			int offset = ENE_FW_SMPL_BUF_FAN - ENE_FW_SAMPLE_BUFFER;
    774
    775			/* read high part of the sample */
    776			hw_value |= ene_read_reg(dev, reg + offset) << 8;
    777			pulse = hw_value & ENE_FW_SMPL_BUF_FAN_PLS;
    778
    779			/* clear space bit, and other unused bits */
    780			hw_value &= ENE_FW_SMPL_BUF_FAN_MSK;
    781			hw_sample = hw_value * ENE_FW_SAMPLE_PERIOD_FAN;
    782
    783		} else {
    784			pulse = !(hw_value & ENE_FW_SAMPLE_SPACE);
    785			hw_value &= ~ENE_FW_SAMPLE_SPACE;
    786			hw_sample = hw_value * sample_period;
    787
    788			if (dev->rx_period_adjust) {
    789				hw_sample *= 100;
    790				hw_sample /= (100 + dev->rx_period_adjust);
    791			}
    792		}
    793
    794		if (!dev->hw_extra_buffer && !hw_sample) {
    795			dev->r_pointer = dev->w_pointer;
    796			continue;
    797		}
    798
    799		dbg("RX: %d (%s)", hw_sample, pulse ? "pulse" : "space");
    800
    801		ev.duration = hw_sample;
    802		ev.pulse = pulse;
    803		ir_raw_event_store_with_filter(dev->rdev, &ev);
    804	}
    805
    806	ir_raw_event_handle(dev->rdev);
    807unlock:
    808	spin_unlock_irqrestore(&dev->hw_lock, flags);
    809	return retval;
    810}
    811
    812/* Initialize default settings */
    813static void ene_setup_default_settings(struct ene_device *dev)
    814{
    815	dev->tx_period = 32;
    816	dev->tx_duty_cycle = 50; /*%*/
    817	dev->transmitter_mask = 0x03;
    818	dev->learning_mode_enabled = learning_mode_force;
    819
    820	/* Set reasonable default timeout */
    821	dev->rdev->timeout = MS_TO_US(150);
    822}
    823
    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
    835/* outside interface: called on first open*/
    836static int ene_open(struct rc_dev *rdev)
    837{
    838	struct ene_device *dev = rdev->priv;
    839	unsigned long flags;
    840
    841	spin_lock_irqsave(&dev->hw_lock, flags);
    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*/
    848static void ene_close(struct rc_dev *rdev)
    849{
    850	struct ene_device *dev = rdev->priv;
    851	unsigned long flags;
    852	spin_lock_irqsave(&dev->hw_lock, flags);
    853
    854	ene_rx_disable(dev);
    855	spin_unlock_irqrestore(&dev->hw_lock, flags);
    856}
    857
    858/* outside interface: set transmitter mask */
    859static int ene_set_tx_mask(struct rc_dev *rdev, u32 tx_mask)
    860{
    861	struct ene_device *dev = rdev->priv;
    862	dbg("TX: attempt to set transmitter mask %02x", tx_mask);
    863
    864	/* invalid txmask */
    865	if (!tx_mask || tx_mask & ~0x03) {
    866		dbg("TX: invalid mask");
    867		/* return count of transmitters */
    868		return 2;
    869	}
    870
    871	dev->transmitter_mask = tx_mask;
    872	ene_tx_set_transmitters(dev);
    873	return 0;
    874}
    875
    876/* outside interface : set tx carrier */
    877static int ene_set_tx_carrier(struct rc_dev *rdev, u32 carrier)
    878{
    879	struct ene_device *dev = rdev->priv;
    880	u32 period;
    881
    882	dbg("TX: attempt to set tx carrier to %d kHz", carrier);
    883	if (carrier == 0)
    884		return -EINVAL;
    885
    886	period = 2000000 / carrier;
    887	if (period && (period > ENE_CIRMOD_PRD_MAX ||
    888			period < ENE_CIRMOD_PRD_MIN)) {
    889
    890		dbg("TX: out of range %d-%d kHz carrier",
    891			2000 / ENE_CIRMOD_PRD_MIN, 2000 / ENE_CIRMOD_PRD_MAX);
    892		return -EINVAL;
    893	}
    894
    895	dev->tx_period = period;
    896	ene_tx_set_carrier(dev);
    897	return 0;
    898}
    899
    900/*outside interface : set tx duty cycle */
    901static int ene_set_tx_duty_cycle(struct rc_dev *rdev, u32 duty_cycle)
    902{
    903	struct ene_device *dev = rdev->priv;
    904	dbg("TX: setting duty cycle to %d%%", duty_cycle);
    905	dev->tx_duty_cycle = duty_cycle;
    906	ene_tx_set_carrier(dev);
    907	return 0;
    908}
    909
    910/* outside interface: enable learning mode */
    911static int ene_set_learning_mode(struct rc_dev *rdev, int enable)
    912{
    913	struct ene_device *dev = rdev->priv;
    914	unsigned long flags;
    915	if (enable == dev->learning_mode_enabled)
    916		return 0;
    917
    918	spin_lock_irqsave(&dev->hw_lock, flags);
    919	dev->learning_mode_enabled = enable;
    920	ene_rx_disable(dev);
    921	ene_rx_setup(dev);
    922	ene_rx_enable(dev);
    923	spin_unlock_irqrestore(&dev->hw_lock, flags);
    924	return 0;
    925}
    926
    927static int ene_set_carrier_report(struct rc_dev *rdev, int enable)
    928{
    929	struct ene_device *dev = rdev->priv;
    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
    944/* outside interface: enable or disable idle mode */
    945static void ene_set_idle(struct rc_dev *rdev, bool idle)
    946{
    947	struct ene_device *dev = rdev->priv;
    948
    949	if (idle) {
    950		ene_rx_reset(dev);
    951		dbg("RX: end of data");
    952	}
    953}
    954
    955/* outside interface: transmit */
    956static int ene_transmit(struct rc_dev *rdev, unsigned *buf, unsigned n)
    957{
    958	struct ene_device *dev = rdev->priv;
    959	unsigned long flags;
    960
    961	dev->tx_buffer = buf;
    962	dev->tx_len = n;
    963	dev->tx_pos = 0;
    964	dev->tx_reg = 0;
    965	dev->tx_done = 0;
    966	dev->tx_sample = 0;
    967	dev->tx_sample_pulse = false;
    968
    969	dbg("TX: %d samples", dev->tx_len);
    970
    971	spin_lock_irqsave(&dev->hw_lock, flags);
    972
    973	ene_tx_enable(dev);
    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) {
    982		dbg("TX: timeout");
    983		spin_lock_irqsave(&dev->hw_lock, flags);
    984		ene_tx_disable(dev);
    985		spin_unlock_irqrestore(&dev->hw_lock, flags);
    986	} else
    987		dbg("TX: done");
    988	return n;
    989}
    990
    991/* probe entry */
    992static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
    993{
    994	int error = -ENOMEM;
    995	struct rc_dev *rdev;
    996	struct ene_device *dev;
    997
    998	/* allocate memory */
    999	dev = kzalloc(sizeof(struct ene_device), GFP_KERNEL);
   1000	rdev = rc_allocate_device(RC_DRIVER_IR_RAW);
   1001	if (!dev || !rdev)
   1002		goto exit_free_dev_rdev;
   1003
   1004	/* validate resources */
   1005	error = -ENODEV;
   1006
   1007	/* init these to -1, as 0 is valid for both */
   1008	dev->hw_io = -1;
   1009	dev->irq = -1;
   1010
   1011	if (!pnp_port_valid(pnp_dev, 0) ||
   1012	    pnp_port_len(pnp_dev, 0) < ENE_IO_SIZE)
   1013		goto exit_free_dev_rdev;
   1014
   1015	if (!pnp_irq_valid(pnp_dev, 0))
   1016		goto exit_free_dev_rdev;
   1017
   1018	spin_lock_init(&dev->hw_lock);
   1019
   1020	dev->hw_io = pnp_port_start(pnp_dev, 0);
   1021	dev->irq = pnp_irq(pnp_dev, 0);
   1022
   1023
   1024	pnp_set_drvdata(pnp_dev, dev);
   1025	dev->pnp_dev = pnp_dev;
   1026
   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
   1031	/* detect hardware version and features */
   1032	error = ene_hw_detect(dev);
   1033	if (error)
   1034		goto exit_free_dev_rdev;
   1035
   1036	if (!dev->hw_learning_and_tx_capable && txsim) {
   1037		dev->hw_learning_and_tx_capable = true;
   1038		timer_setup(&dev->tx_sim_timer, ene_tx_irqsim, 0);
   1039		pr_warn("Simulation of TX activated\n");
   1040	}
   1041
   1042	if (!dev->hw_learning_and_tx_capable)
   1043		learning_mode_force = false;
   1044
   1045	rdev->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
   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;
   1052	rdev->device_name = "ENE eHome Infrared Remote Receiver";
   1053
   1054	if (dev->hw_learning_and_tx_capable) {
   1055		rdev->s_wideband_receiver = ene_set_learning_mode;
   1056		init_completion(&dev->tx_complete);
   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;
   1062		rdev->device_name = "ENE eHome Infrared Remote Transceiver";
   1063	}
   1064
   1065	dev->rdev = rdev;
   1066
   1067	ene_rx_setup_hw_buffer(dev);
   1068	ene_setup_default_settings(dev);
   1069	ene_setup_hw_settings(dev);
   1070
   1071	device_set_wakeup_capable(&pnp_dev->dev, true);
   1072	device_set_wakeup_enable(&pnp_dev->dev, true);
   1073
   1074	error = rc_register_device(rdev);
   1075	if (error < 0)
   1076		goto exit_free_dev_rdev;
   1077
   1078	/* claim the resources */
   1079	error = -EBUSY;
   1080	if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) {
   1081		goto exit_unregister_device;
   1082	}
   1083
   1084	if (request_irq(dev->irq, ene_isr,
   1085			IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) {
   1086		goto exit_release_hw_io;
   1087	}
   1088
   1089	pr_notice("driver has been successfully loaded\n");
   1090	return 0;
   1091
   1092exit_release_hw_io:
   1093	release_region(dev->hw_io, ENE_IO_SIZE);
   1094exit_unregister_device:
   1095	rc_unregister_device(rdev);
   1096	rdev = NULL;
   1097exit_free_dev_rdev:
   1098	rc_free_device(rdev);
   1099	kfree(dev);
   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);
   1111	ene_rx_restore_hw_buffer(dev);
   1112	spin_unlock_irqrestore(&dev->hw_lock, flags);
   1113
   1114	free_irq(dev->irq, dev);
   1115	release_region(dev->hw_io, ENE_IO_SIZE);
   1116	rc_unregister_device(dev->rdev);
   1117	kfree(dev);
   1118}
   1119
   1120/* enable wake on IR (wakes on specific button on original remote) */
   1121static void ene_enable_wake(struct ene_device *dev, bool enable)
   1122{
   1123	dbg("wake on IR %s", enable ? "enabled" : "disabled");
   1124	ene_set_clear_reg_mask(dev, ENE_FW1, ENE_FW1_WAKE, enable);
   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);
   1131	bool wake = device_may_wakeup(&dev->pnp_dev->dev);
   1132
   1133	if (!wake && dev->rx_enabled)
   1134		ene_rx_disable_hw(dev);
   1135
   1136	ene_enable_wake(dev, wake);
   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);
   1143	ene_setup_hw_settings(dev);
   1144
   1145	if (dev->rx_enabled)
   1146		ene_rx_enable(dev);
   1147
   1148	ene_enable_wake(dev, false);
   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);
   1156	ene_enable_wake(dev, true);
   1157}
   1158
   1159static const struct pnp_device_id ene_ids[] = {
   1160	{.id = "ENE0100",},
   1161	{.id = "ENE0200",},
   1162	{.id = "ENE0201",},
   1163	{.id = "ENE0202",},
   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,
   1173	.remove = ene_remove,
   1174#ifdef CONFIG_PM
   1175	.suspend = ene_suspend,
   1176	.resume = ene_resume,
   1177#endif
   1178	.shutdown = ene_shutdown,
   1179};
   1180
   1181module_param(sample_period, int, S_IRUGO);
   1182MODULE_PARM_DESC(sample_period, "Hardware sample period (50 us default)");
   1183
   1184module_param(learning_mode_force, bool, S_IRUGO);
   1185MODULE_PARM_DESC(learning_mode_force, "Enable learning mode by default");
   1186
   1187module_param(debug, int, S_IRUGO | S_IWUSR);
   1188MODULE_PARM_DESC(debug, "Debug level");
   1189
   1190module_param(txsim, bool, S_IRUGO);
   1191MODULE_PARM_DESC(txsim,
   1192	"Simulate TX features on unsupported hardware (dangerous)");
   1193
   1194MODULE_DEVICE_TABLE(pnp, ene_ids);
   1195MODULE_DESCRIPTION
   1196	("Infrared input driver for KB3926B/C/D/E/F (aka ENE0100/ENE0200/ENE0201/ENE0202) CIR port");
   1197
   1198MODULE_AUTHOR("Maxim Levitsky");
   1199MODULE_LICENSE("GPL");
   1200
   1201module_pnp_driver(ene_driver);