2
* driver for ENE KB3926 B/C/D CIR (also known as ENE0100)
4
* Copyright (C) 2009 Maxim Levitsky <maximlevitsky@gmail.com>
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License as
8
* published by the Free Software Foundation; either version 2 of the
9
* License, or (at your option) any later version.
11
* This program is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22
#include <linux/kernel.h>
23
#include <linux/module.h>
24
#include <linux/pnp.h>
26
#include <linux/interrupt.h>
27
#include "lirc_ene0100.h"
29
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
30
#error "Sorry, this driver needs kernel version 2.6.16 or higher"
33
static int sample_period = 75;
34
static int enable_idle = 1;
35
static int enable_learning;
37
static void ene_set_idle(struct ene_device *dev, int idle);
38
static void ene_set_inputs(struct ene_device *dev, int enable);
40
/* read a hardware register */
41
static u8 ene_hw_read_reg(struct ene_device *dev, u16 reg)
43
outb(reg >> 8, dev->hw_io + ENE_ADDR_HI);
44
outb(reg & 0xFF, dev->hw_io + ENE_ADDR_LO);
45
return inb(dev->hw_io + ENE_IO);
48
/* write a hardware register */
49
static void ene_hw_write_reg(struct ene_device *dev, u16 reg, u8 value)
51
outb(reg >> 8, dev->hw_io + ENE_ADDR_HI);
52
outb(reg & 0xFF, dev->hw_io + ENE_ADDR_LO);
53
outb(value, dev->hw_io + ENE_IO);
56
/* change specific bits in hardware register */
57
static void ene_hw_write_reg_mask(struct ene_device *dev,
58
u16 reg, u8 value, u8 mask)
62
outb(reg >> 8, dev->hw_io + ENE_ADDR_HI);
63
outb(reg & 0xFF, dev->hw_io + ENE_ADDR_LO);
65
regvalue = inb(dev->hw_io + ENE_IO) & ~mask;
66
regvalue |= (value & mask);
67
outb(regvalue, dev->hw_io + ENE_IO);
70
/* read irq status and ack it */
71
static int ene_hw_irq_status(struct ene_device *dev, int *buffer_pointer)
74
u8 fw_flags1, fw_flags2;
76
fw_flags2 = ene_hw_read_reg(dev, ENE_FW2);
79
*buffer_pointer = 4 * (fw_flags2 & ENE_FW2_BUF_HIGH);
81
if (dev->hw_revision < ENE_HW_C) {
82
irq_status = ene_hw_read_reg(dev, ENEB_IRQ_STATUS);
84
if (!irq_status & ENEB_IRQ_STATUS_IR)
86
ene_hw_write_reg(dev, ENEB_IRQ_STATUS,
87
irq_status & ~ENEB_IRQ_STATUS_IR);
89
/* rev B support only recieving */
93
irq_status = ene_hw_read_reg(dev, ENEC_IRQ);
95
if (!irq_status && ENEC_IRQ_STATUS)
98
/* original driver does that twice - a workaround ? */
99
ene_hw_write_reg(dev, ENEC_IRQ, irq_status & ~ENEC_IRQ_STATUS);
100
ene_hw_write_reg(dev, ENEC_IRQ, irq_status & ~ENEC_IRQ_STATUS);
102
/* clear unknown flag in F8F9 */
103
if (fw_flags2 & ENE_FW2_IRQ_CLR)
104
ene_hw_write_reg(dev, ENE_FW2, fw_flags2 & ~ENE_FW2_IRQ_CLR);
106
/* check if this is a TX interrupt */
107
fw_flags1 = ene_hw_read_reg(dev, ENE_FW1);
109
if (fw_flags1 & ENE_FW1_TXIRQ) {
110
ene_hw_write_reg(dev, ENE_FW1, fw_flags1 & ~ENE_FW1_TXIRQ);
116
static int ene_hw_detect(struct ene_device *dev)
118
u8 chip_major, chip_minor;
119
u8 hw_revision, old_ver;
123
tmp = ene_hw_read_reg(dev, ENE_HW_UNK);
124
ene_hw_write_reg(dev, ENE_HW_UNK, tmp & ~ENE_HW_UNK_CLR);
126
chip_major = ene_hw_read_reg(dev, ENE_HW_VER_MAJOR);
127
chip_minor = ene_hw_read_reg(dev, ENE_HW_VER_MINOR);
129
ene_hw_write_reg(dev, ENE_HW_UNK, tmp);
130
hw_revision = ene_hw_read_reg(dev, ENE_HW_VERSION);
131
old_ver = ene_hw_read_reg(dev, ENE_HW_VER_OLD);
133
if (hw_revision == 0xFF) {
135
ene_printk(KERN_WARNING, "device seems to be disabled\n");
136
ene_printk(KERN_WARNING,
137
"send a mail to lirc-list@lists.sourceforge.net\n");
138
ene_printk(KERN_WARNING, "please attach output of acpidump\n");
143
if (chip_major == 0x33) {
144
ene_printk(KERN_WARNING, "chips 0x33xx aren't supported yet\n");
148
if (chip_major == 0x39 && chip_minor == 0x26 && hw_revision == 0xC0) {
149
dev->hw_revision = ENE_HW_C;
150
ene_printk(KERN_WARNING,
151
"KB3926C detected, driver support is not complete!\n");
153
} else if (old_ver == 0x24 && hw_revision == 0xC0) {
154
dev->hw_revision = ENE_HW_B;
155
ene_printk(KERN_NOTICE, "KB3926B detected\n");
157
dev->hw_revision = ENE_HW_D;
158
ene_printk(KERN_WARNING,
159
"unknown ENE chip detected, assuming KB3926D\n");
160
ene_printk(KERN_WARNING, "driver support incomplete");
164
ene_printk(KERN_DEBUG, "chip is 0x%02x%02x - 0x%02x, 0x%02x\n",
165
chip_major, chip_minor, old_ver, hw_revision);
168
/* detect features hardware supports */
170
if (dev->hw_revision < ENE_HW_C)
173
fw_capabilities = ene_hw_read_reg(dev, ENE_FW2);
175
dev->hw_gpio40_learning = fw_capabilities & ENE_FW2_GP40_AS_LEARN;
176
dev->hw_learning_and_tx_capable = fw_capabilities & ENE_FW2_LEARNING;
178
dev->hw_fan_as_normal_input = dev->hw_learning_and_tx_capable &&
179
fw_capabilities & ENE_FW2_FAN_AS_NRML_IN;
181
ene_printk(KERN_NOTICE, "hardware features:\n");
182
ene_printk(KERN_NOTICE,
183
"learning and tx %s, gpio40_learn %s, fan_in %s\n",
184
dev->hw_learning_and_tx_capable ? "on" : "off",
185
dev->hw_gpio40_learning ? "on" : "off",
186
dev->hw_fan_as_normal_input ? "on" : "off");
188
if (!dev->hw_learning_and_tx_capable && enable_learning)
191
if (dev->hw_learning_and_tx_capable) {
192
ene_printk(KERN_WARNING,
193
"Device supports transmitting, but the driver doesn't\n");
194
ene_printk(KERN_WARNING,
195
"due to lack of hardware to test against.\n");
196
ene_printk(KERN_WARNING,
197
"Send a mail to: lirc-list@lists.sourceforge.net\n");
202
/* hardware initialization */
203
static int ene_hw_init(void *data)
206
struct ene_device *dev = (struct ene_device *)data;
209
if (dev->hw_revision < ENE_HW_C) {
210
ene_hw_write_reg(dev, ENEB_IRQ, dev->irq << 1);
211
ene_hw_write_reg(dev, ENEB_IRQ_UNK1, 0x01);
213
reg_value = ene_hw_read_reg(dev, ENEC_IRQ) & 0xF0;
214
reg_value |= ENEC_IRQ_UNK_EN;
215
reg_value &= ~ENEC_IRQ_STATUS;
216
reg_value |= (dev->irq & ENEC_IRQ_MASK);
217
ene_hw_write_reg(dev, ENEC_IRQ, reg_value);
218
ene_hw_write_reg(dev, ENE_TX_UNK1, 0x63);
221
ene_hw_write_reg(dev, ENE_CIR_CONF2, 0x00);
222
ene_set_inputs(dev, enable_learning);
224
/* set sampling period */
225
ene_hw_write_reg(dev, ENE_CIR_SAMPLE_PERIOD, sample_period);
227
/* ack any pending irqs - just in case */
228
ene_hw_irq_status(dev, NULL);
230
/* enter idle mode */
231
ene_set_idle(dev, 1);
233
/* enable firmware bits */
234
ene_hw_write_reg_mask(dev, ENE_FW1,
235
ENE_FW1_ENABLE | ENE_FW1_IRQ,
236
ENE_FW1_ENABLE | ENE_FW1_IRQ);
242
/* this enables gpio40 signal, used if connected to wide band input*/
243
static void ene_enable_gpio40(struct ene_device *dev, int enable)
245
ene_hw_write_reg_mask(dev, ENE_CIR_CONF1, enable ?
246
0 : ENE_CIR_CONF2_GPIO40DIS,
247
ENE_CIR_CONF2_GPIO40DIS);
250
/* this enables the classic sampler */
251
static void ene_enable_normal_recieve(struct ene_device *dev, int enable)
253
ene_hw_write_reg(dev, ENE_CIR_CONF1, enable ? ENE_CIR_CONF1_ADC_ON : 0);
256
/* this enables recieve via fan input */
257
static void ene_enable_fan_recieve(struct ene_device *dev, int enable)
260
ene_hw_write_reg(dev, ENE_FAN_AS_IN1, 0);
262
ene_hw_write_reg(dev, ENE_FAN_AS_IN1, ENE_FAN_AS_IN1_EN);
263
ene_hw_write_reg(dev, ENE_FAN_AS_IN2, ENE_FAN_AS_IN2_EN);
265
dev->fan_input_inuse = enable;
268
/* determine which input to use*/
269
static void ene_set_inputs(struct ene_device *dev, int learning_enable)
271
ene_enable_normal_recieve(dev, 1);
273
/* old hardware doesn't support learning mode for sure */
274
if (dev->hw_revision <= ENE_HW_B)
277
/* reciever not learning capable, still set gpio40 correctly */
278
if (!dev->hw_learning_and_tx_capable) {
279
ene_enable_gpio40(dev, !dev->hw_gpio40_learning);
283
/* enable learning mode */
284
if (learning_enable) {
285
ene_enable_gpio40(dev, dev->hw_gpio40_learning);
287
/* fan input is not used for learning */
288
if (dev->hw_fan_as_normal_input)
289
ene_enable_fan_recieve(dev, 0);
291
/* disable learning mode */
293
if (dev->hw_fan_as_normal_input) {
294
ene_enable_fan_recieve(dev, 1);
295
ene_enable_normal_recieve(dev, 0);
297
ene_enable_gpio40(dev, !dev->hw_gpio40_learning);
300
/* set few additional settings for this mode */
301
ene_hw_write_reg_mask(dev, ENE_CIR_CONF1, learning_enable ?
302
ENE_CIR_CONF1_LEARN1 : 0, ENE_CIR_CONF1_LEARN1);
304
ene_hw_write_reg_mask(dev, ENE_CIR_CONF2, learning_enable ?
305
ENE_CIR_CONF2_LEARN2 : 0, ENE_CIR_CONF2_LEARN2);
308
/* deinitialization */
309
static void ene_hw_deinit(void *data)
311
struct ene_device *dev = (struct ene_device *)data;
313
/* disable samplers */
314
ene_enable_normal_recieve(dev, 0);
316
if (dev->hw_fan_as_normal_input)
317
ene_enable_fan_recieve(dev, 0);
319
/* disable hardware IRQ and firmware flag */
320
ene_hw_write_reg_mask(dev, ENE_FW1, 0, ENE_FW1_ENABLE | ENE_FW1_IRQ);
322
ene_set_idle(dev, 1);
326
/* sends current sample to userspace */
327
static void send_sample(struct ene_device *dev)
329
int value = abs(dev->sample) & PULSE_MASK;
334
if (!lirc_buffer_full(dev->lirc_driver->rbuf)) {
335
lirc_buffer_write(dev->lirc_driver->rbuf, (void *)&value);
336
wake_up(&dev->lirc_driver->rbuf->wait_poll);
341
/* this updates current sample */
342
static void update_sample(struct ene_device *dev, int sample)
345
dev->sample = sample;
346
else if (same_sign(dev->sample, sample))
347
dev->sample += sample;
350
dev->sample = sample;
354
/* enable or disable idle mode */
355
static void ene_set_idle(struct ene_device *dev, int idle)
358
int disable = idle && enable_idle && (dev->hw_revision < ENE_HW_C);
360
ene_hw_write_reg_mask(dev, ENE_CIR_SAMPLE_PERIOD,
361
disable ? 0 : ENE_CIR_SAMPLE_OVERFLOW,
362
ENE_CIR_SAMPLE_OVERFLOW);
365
/* remember when we have entered the idle mode */
367
do_gettimeofday(&dev->gap_start);
371
/* send the gap between keypresses now */
372
do_gettimeofday(&now);
374
if (now.tv_sec - dev->gap_start.tv_sec > 16)
375
dev->sample = space(PULSE_MASK);
377
dev->sample = dev->sample +
378
space(1000000ull * (now.tv_sec - dev->gap_start.tv_sec))
379
+ space(now.tv_usec - dev->gap_start.tv_usec);
381
if (abs(dev->sample) > PULSE_MASK)
382
dev->sample = space(PULSE_MASK);
386
/* interrupt handler */
387
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
388
static irqreturn_t ene_hw_irq(int irq, void *data)
390
static irqreturn_t ene_hw_irq(int irq, void *data, struct pt_regs *regs)
399
struct ene_device *dev = (struct ene_device *)data;
400
irq_status = ene_hw_irq_status(dev, &buffer_pointer);
405
/* TODO: only RX for now */
406
if (irq_status == ENE_IRQ_TX)
409
for (i = 0; i < ENE_SAMPLES_SIZE; i++) {
411
hw_value = ene_hw_read_reg(dev,
412
ENE_SAMPLE_BUFFER + buffer_pointer + i);
414
if (dev->fan_input_inuse) {
415
/* read high part of the sample */
416
hw_value |= ene_hw_read_reg(dev,
417
ENE_SAMPLE_BUFFER_FAN + buffer_pointer + i) << 8;
419
/* test for _space_ bit */
420
space = !(hw_value & ENE_FAN_SMPL_PULS_MSK);
422
/* clear space bit, and other unused bits */
423
hw_value &= ENE_FAN_VALUE_MASK;
424
hw_sample = hw_value * ENE_SAMPLE_PERIOD_FAN;
427
space = hw_value & ENE_SAMPLE_SPC_MASK;
428
hw_value &= ENE_SAMPLE_VALUE_MASK;
429
hw_sample = hw_value * sample_period;
439
/* overflow sample recieved, handle it */
441
if (!dev->fan_input_inuse && hw_value == ENE_SAMPLE_OVERFLOW) {
446
if (dev->sample > 0 || abs(dev->sample) <= ENE_MAXGAP)
447
update_sample(dev, hw_sample);
449
ene_set_idle(dev, 1);
454
/* normal first sample recieved */
455
if (!dev->fan_input_inuse && dev->idle) {
456
ene_set_idle(dev, 0);
458
/* discard first recieved value, its random
459
since its the time signal was off before
460
first pulse if idle mode is enabled, HW
466
update_sample(dev, hw_sample);
472
static int ene_probe(struct pnp_dev *pnp_dev,
473
const struct pnp_device_id *dev_id)
475
struct ene_device *dev;
476
struct lirc_driver *lirc_driver;
479
dev = kzalloc(sizeof(struct ene_device), GFP_KERNEL);
484
dev->pnp_dev = pnp_dev;
485
pnp_set_drvdata(pnp_dev, dev);
488
/* prepare lirc interface */
490
lirc_driver = kzalloc(sizeof(struct lirc_driver), GFP_KERNEL);
495
dev->lirc_driver = lirc_driver;
497
strcpy(lirc_driver->name, ENE_DRIVER_NAME);
498
lirc_driver->minor = -1;
499
lirc_driver->code_length = sizeof(int) * 8;
500
lirc_driver->features = LIRC_CAN_REC_MODE2;
501
lirc_driver->data = dev;
502
lirc_driver->set_use_inc = ene_hw_init;
503
lirc_driver->set_use_dec = ene_hw_deinit;
504
lirc_driver->dev = &pnp_dev->dev;
505
lirc_driver->owner = THIS_MODULE;
507
lirc_driver->rbuf = kzalloc(sizeof(struct lirc_buffer), GFP_KERNEL);
509
if (!lirc_driver->rbuf)
512
if (lirc_buffer_init(lirc_driver->rbuf, sizeof(int), sizeof(int) * 256))
516
if (lirc_register_driver(lirc_driver))
519
/* validate resources */
520
if (!pnp_port_valid(pnp_dev, 0) || pnp_port_len(pnp_dev, 0) < ENE_MAX_IO)
523
if (!pnp_irq_valid(pnp_dev, 0))
526
dev->hw_io = pnp_port_start(pnp_dev, 0);
527
dev->irq = pnp_irq(pnp_dev, 0);
529
/* claim the resources */
531
if (!request_region(dev->hw_io, ENE_MAX_IO, ENE_DRIVER_NAME))
534
if (request_irq(dev->irq, ene_hw_irq,
535
IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev))
538
/* detect hardware version and features */
539
error = ene_hw_detect(dev);
543
ene_printk(KERN_NOTICE, "driver has been succesfully loaded\n");
547
free_irq(dev->irq, dev);
549
release_region(dev->hw_io, ENE_MAX_IO);
551
lirc_unregister_driver(lirc_driver->minor);
553
lirc_buffer_free(lirc_driver->rbuf);
555
kfree(lirc_driver->rbuf);
564
static void ene_remove(struct pnp_dev *pnp_dev)
566
struct ene_device *dev = pnp_get_drvdata(pnp_dev);
568
free_irq(dev->irq, dev);
569
release_region(dev->hw_io, ENE_MAX_IO);
570
lirc_unregister_driver(dev->lirc_driver->minor);
571
lirc_buffer_free(dev->lirc_driver->rbuf);
572
kfree(dev->lirc_driver);
578
/* TODO: make 'wake on IR' configurable and add .shutdown */
579
/* currently impossible due to lack of kernel support */
581
static int ene_suspend(struct pnp_dev *pnp_dev, pm_message_t state)
583
struct ene_device *dev = pnp_get_drvdata(pnp_dev);
584
ene_hw_write_reg_mask(dev, ENE_FW1, ENE_FW1_WAKE, ENE_FW1_WAKE);
588
static int ene_resume(struct pnp_dev *pnp_dev)
590
struct ene_device *dev = pnp_get_drvdata(pnp_dev);
594
ene_hw_write_reg_mask(dev, ENE_FW1, 0, ENE_FW1_WAKE);
600
static const struct pnp_device_id ene_ids[] = {
605
static struct pnp_driver ene_driver = {
606
.name = ENE_DRIVER_NAME,
608
.flags = PNP_DRIVER_RES_DO_NOT_CHANGE,
611
.remove = __devexit_p(ene_remove),
614
.suspend = ene_suspend,
615
.resume = ene_resume,
619
static int __init ene_init(void)
621
if (sample_period < 5) {
622
ene_printk(KERN_ERR, "sample period must be at\n");
623
ene_printk(KERN_ERR, "least 5 us, (at least 30 recommended)\n");
626
return pnp_register_driver(&ene_driver);
629
static void ene_exit(void)
631
pnp_unregister_driver(&ene_driver);
634
module_param(sample_period, int, S_IRUGO);
635
MODULE_PARM_DESC(sample_period, "Hardware sample period (75 us default)");
637
module_param(enable_idle, bool, S_IRUGO | S_IWUSR);
638
MODULE_PARM_DESC(enable_idle,
639
"Enables turning off signal sampling after long inactivity time; "
640
"if disabled might help detecting input signal (default: enabled)");
642
module_param(enable_learning, bool, S_IRUGO);
643
MODULE_PARM_DESC(enable_learning, "Use wide band (learning) reciever");
645
MODULE_DEVICE_TABLE(pnp, ene_ids);
647
("LIRC driver for KB3926B/KB3926C/KB3926D (aka ENE0100) CIR port");
648
MODULE_AUTHOR("Maxim Levitsky");
649
MODULE_LICENSE("GPL");
651
module_init(ene_init);
652
module_exit(ene_exit);