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