V4L/DVB: cx88: don't handle IR on Pixelview too fast
[safe/jmp/linux-2.6] / drivers / media / video / cx88 / cx88-input.c
1 /*
2  *
3  * Device driver for GPIO attached remote control interfaces
4  * on Conexant 2388x based TV/DVB cards.
5  *
6  * Copyright (c) 2003 Pavel Machek
7  * Copyright (c) 2004 Gerd Knorr
8  * Copyright (c) 2004, 2005 Chris Pascoe
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23  */
24
25 #include <linux/init.h>
26 #include <linux/hrtimer.h>
27 #include <linux/input.h>
28 #include <linux/pci.h>
29 #include <linux/slab.h>
30 #include <linux/module.h>
31
32 #include "cx88.h"
33 #include <media/ir-common.h>
34
35 #define MODULE_NAME "cx88xx"
36
37 /* ---------------------------------------------------------------------- */
38
39 struct cx88_IR {
40         struct cx88_core *core;
41         struct input_dev *input;
42         struct ir_input_state ir;
43         struct ir_dev_props props;
44
45         int users;
46
47         char name[32];
48         char phys[32];
49
50         /* sample from gpio pin 16 */
51         u32 sampling;
52         u32 samples[16];
53         int scount;
54         unsigned long release;
55
56         /* poll external decoder */
57         int polling;
58         struct hrtimer timer;
59         u32 gpio_addr;
60         u32 last_gpio;
61         u32 mask_keycode;
62         u32 mask_keydown;
63         u32 mask_keyup;
64 };
65
66 static int ir_debug;
67 module_param(ir_debug, int, 0644);      /* debug level [IR] */
68 MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]");
69
70 #define ir_dprintk(fmt, arg...) if (ir_debug) \
71         printk(KERN_DEBUG "%s IR: " fmt , ir->core->name , ##arg)
72
73 /* ---------------------------------------------------------------------- */
74
75 static void cx88_ir_handle_key(struct cx88_IR *ir)
76 {
77         struct cx88_core *core = ir->core;
78         u32 gpio, data, auxgpio;
79
80         /* read gpio value */
81         gpio = cx_read(ir->gpio_addr);
82         switch (core->boardnr) {
83         case CX88_BOARD_NPGTECH_REALTV_TOP10FM:
84                 /* This board apparently uses a combination of 2 GPIO
85                    to represent the keys. Additionally, the second GPIO
86                    can be used for parity.
87
88                    Example:
89
90                    for key "5"
91                         gpio = 0x758, auxgpio = 0xe5 or 0xf5
92                    for key "Power"
93                         gpio = 0x758, auxgpio = 0xed or 0xfd
94                  */
95
96                 auxgpio = cx_read(MO_GP1_IO);
97                 /* Take out the parity part */
98                 gpio=(gpio & 0x7fd) + (auxgpio & 0xef);
99                 break;
100         case CX88_BOARD_WINFAST_DTV1000:
101         case CX88_BOARD_WINFAST_DTV1800H:
102         case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
103                 gpio = (gpio & 0x6ff) | ((cx_read(MO_GP1_IO) << 8) & 0x900);
104                 auxgpio = gpio;
105                 break;
106         default:
107                 auxgpio = gpio;
108         }
109         if (ir->polling) {
110                 if (ir->last_gpio == auxgpio)
111                         return;
112                 ir->last_gpio = auxgpio;
113         }
114
115         /* extract data */
116         data = ir_extract_bits(gpio, ir->mask_keycode);
117         ir_dprintk("irq gpio=0x%x code=%d | %s%s%s\n",
118                    gpio, data,
119                    ir->polling ? "poll" : "irq",
120                    (gpio & ir->mask_keydown) ? " down" : "",
121                    (gpio & ir->mask_keyup) ? " up" : "");
122
123         if (ir->core->boardnr == CX88_BOARD_NORWOOD_MICRO) {
124                 u32 gpio_key = cx_read(MO_GP0_IO);
125
126                 data = (data << 4) | ((gpio_key & 0xf0) >> 4);
127
128                 ir_input_keydown(ir->input, &ir->ir, data);
129                 ir_input_nokey(ir->input, &ir->ir);
130
131         } else if (ir->mask_keydown) {
132                 /* bit set on keydown */
133                 if (gpio & ir->mask_keydown) {
134                         ir_input_keydown(ir->input, &ir->ir, data);
135                 } else {
136                         ir_input_nokey(ir->input, &ir->ir);
137                 }
138
139         } else if (ir->mask_keyup) {
140                 /* bit cleared on keydown */
141                 if (0 == (gpio & ir->mask_keyup)) {
142                         ir_input_keydown(ir->input, &ir->ir, data);
143                 } else {
144                         ir_input_nokey(ir->input, &ir->ir);
145                 }
146
147         } else {
148                 /* can't distinguish keydown/up :-/ */
149                 ir_input_keydown(ir->input, &ir->ir, data);
150                 ir_input_nokey(ir->input, &ir->ir);
151         }
152 }
153
154 static enum hrtimer_restart cx88_ir_work(struct hrtimer *timer)
155 {
156         unsigned long missed;
157         struct cx88_IR *ir = container_of(timer, struct cx88_IR, timer);
158
159         cx88_ir_handle_key(ir);
160         missed = hrtimer_forward_now(&ir->timer,
161                                      ktime_set(0, ir->polling * 1000000));
162         if (missed > 1)
163                 ir_dprintk("Missed ticks %ld\n", missed - 1);
164
165         return HRTIMER_RESTART;
166 }
167
168 static int __cx88_ir_start(void *priv)
169 {
170         struct cx88_core *core = priv;
171         struct cx88_IR *ir;
172
173         if (!core || !core->ir)
174                 return -EINVAL;
175
176         ir = core->ir;
177
178         if (ir->polling) {
179                 hrtimer_init(&ir->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
180                 ir->timer.function = cx88_ir_work;
181                 hrtimer_start(&ir->timer,
182                               ktime_set(0, ir->polling * 1000000),
183                               HRTIMER_MODE_REL);
184         }
185         if (ir->sampling) {
186                 core->pci_irqmask |= PCI_INT_IR_SMPINT;
187                 cx_write(MO_DDS_IO, 0xa80a80);  /* 4 kHz sample rate */
188                 cx_write(MO_DDSCFG_IO, 0x5);    /* enable */
189         }
190         return 0;
191 }
192
193 static void __cx88_ir_stop(void *priv)
194 {
195         struct cx88_core *core = priv;
196         struct cx88_IR *ir;
197
198         if (!core || !core->ir)
199                 return;
200
201         ir = core->ir;
202         if (ir->sampling) {
203                 cx_write(MO_DDSCFG_IO, 0x0);
204                 core->pci_irqmask &= ~PCI_INT_IR_SMPINT;
205         }
206
207         if (ir->polling)
208                 hrtimer_cancel(&ir->timer);
209 }
210
211 int cx88_ir_start(struct cx88_core *core)
212 {
213         if (core->ir->users)
214                 return __cx88_ir_start(core);
215
216         return 0;
217 }
218
219 void cx88_ir_stop(struct cx88_core *core)
220 {
221         if (core->ir->users)
222                 __cx88_ir_stop(core);
223 }
224
225 static int cx88_ir_open(void *priv)
226 {
227         struct cx88_core *core = priv;
228
229         core->ir->users++;
230         return __cx88_ir_start(core);
231 }
232
233 static void cx88_ir_close(void *priv)
234 {
235         struct cx88_core *core = priv;
236
237         core->ir->users--;
238         if (!core->ir->users)
239                 __cx88_ir_stop(core);
240 }
241
242 /* ---------------------------------------------------------------------- */
243
244 int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
245 {
246         struct cx88_IR *ir;
247         struct input_dev *input_dev;
248         char *ir_codes = NULL;
249         u64 ir_type = IR_TYPE_OTHER;
250         int err = -ENOMEM;
251
252         ir = kzalloc(sizeof(*ir), GFP_KERNEL);
253         input_dev = input_allocate_device();
254         if (!ir || !input_dev)
255                 goto err_out_free;
256
257         ir->input = input_dev;
258
259         /* detect & configure */
260         switch (core->boardnr) {
261         case CX88_BOARD_DNTV_LIVE_DVB_T:
262         case CX88_BOARD_KWORLD_DVB_T:
263         case CX88_BOARD_KWORLD_DVB_T_CX22702:
264                 ir_codes = RC_MAP_DNTV_LIVE_DVB_T;
265                 ir->gpio_addr = MO_GP1_IO;
266                 ir->mask_keycode = 0x1f;
267                 ir->mask_keyup = 0x60;
268                 ir->polling = 50; /* ms */
269                 break;
270         case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1:
271                 ir_codes = RC_MAP_CINERGY_1400;
272                 ir_type = IR_TYPE_PD;
273                 ir->sampling = 0xeb04; /* address */
274                 break;
275         case CX88_BOARD_HAUPPAUGE:
276         case CX88_BOARD_HAUPPAUGE_DVB_T1:
277         case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
278         case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
279         case CX88_BOARD_HAUPPAUGE_HVR1100:
280         case CX88_BOARD_HAUPPAUGE_HVR3000:
281         case CX88_BOARD_HAUPPAUGE_HVR4000:
282         case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
283         case CX88_BOARD_PCHDTV_HD3000:
284         case CX88_BOARD_PCHDTV_HD5500:
285         case CX88_BOARD_HAUPPAUGE_IRONLY:
286                 ir_codes = RC_MAP_HAUPPAUGE_NEW;
287                 ir_type = IR_TYPE_RC5;
288                 ir->sampling = 1;
289                 break;
290         case CX88_BOARD_WINFAST_DTV2000H:
291         case CX88_BOARD_WINFAST_DTV2000H_J:
292         case CX88_BOARD_WINFAST_DTV1800H:
293                 ir_codes = RC_MAP_WINFAST;
294                 ir->gpio_addr = MO_GP0_IO;
295                 ir->mask_keycode = 0x8f8;
296                 ir->mask_keyup = 0x100;
297                 ir->polling = 50; /* ms */
298                 break;
299         case CX88_BOARD_WINFAST2000XP_EXPERT:
300         case CX88_BOARD_WINFAST_DTV1000:
301         case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
302                 ir_codes = RC_MAP_WINFAST;
303                 ir->gpio_addr = MO_GP0_IO;
304                 ir->mask_keycode = 0x8f8;
305                 ir->mask_keyup = 0x100;
306                 ir->polling = 1; /* ms */
307                 break;
308         case CX88_BOARD_IODATA_GVBCTV7E:
309                 ir_codes = RC_MAP_IODATA_BCTV7E;
310                 ir->gpio_addr = MO_GP0_IO;
311                 ir->mask_keycode = 0xfd;
312                 ir->mask_keydown = 0x02;
313                 ir->polling = 5; /* ms */
314                 break;
315         case CX88_BOARD_PROLINK_PLAYTVPVR:
316         case CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO:
317                 ir_codes = RC_MAP_PIXELVIEW;
318                 ir->gpio_addr = MO_GP1_IO;
319                 ir->mask_keycode = 0x1f;        /* Only command is retrieved */
320                 ir->mask_keyup = 0x80;
321                 ir->polling = 10; /* ms */
322                 break;
323         case CX88_BOARD_PROLINK_PV_8000GT:
324         case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
325                 ir_codes = RC_MAP_PIXELVIEW_NEW;
326                 ir->gpio_addr = MO_GP1_IO;
327                 ir->mask_keycode = 0x3f;
328                 ir->mask_keyup = 0x80;
329                 ir->polling = 1; /* ms */
330                 break;
331         case CX88_BOARD_KWORLD_LTV883:
332                 ir_codes = RC_MAP_PIXELVIEW;
333                 ir->gpio_addr = MO_GP1_IO;
334                 ir->mask_keycode = 0x1f;
335                 ir->mask_keyup = 0x60;
336                 ir->polling = 1; /* ms */
337                 break;
338         case CX88_BOARD_ADSTECH_DVB_T_PCI:
339                 ir_codes = RC_MAP_ADSTECH_DVB_T_PCI;
340                 ir->gpio_addr = MO_GP1_IO;
341                 ir->mask_keycode = 0xbf;
342                 ir->mask_keyup = 0x40;
343                 ir->polling = 50; /* ms */
344                 break;
345         case CX88_BOARD_MSI_TVANYWHERE_MASTER:
346                 ir_codes = RC_MAP_MSI_TVANYWHERE;
347                 ir->gpio_addr = MO_GP1_IO;
348                 ir->mask_keycode = 0x1f;
349                 ir->mask_keyup = 0x40;
350                 ir->polling = 1; /* ms */
351                 break;
352         case CX88_BOARD_AVERTV_303:
353         case CX88_BOARD_AVERTV_STUDIO_303:
354                 ir_codes         = RC_MAP_AVERTV_303;
355                 ir->gpio_addr    = MO_GP2_IO;
356                 ir->mask_keycode = 0xfb;
357                 ir->mask_keydown = 0x02;
358                 ir->polling      = 50; /* ms */
359                 break;
360         case CX88_BOARD_OMICOM_SS4_PCI:
361         case CX88_BOARD_SATTRADE_ST4200:
362         case CX88_BOARD_TBS_8920:
363         case CX88_BOARD_TBS_8910:
364         case CX88_BOARD_PROF_7300:
365         case CX88_BOARD_PROF_7301:
366         case CX88_BOARD_PROF_6200:
367                 ir_codes = RC_MAP_TBS_NEC;
368                 ir_type = IR_TYPE_PD;
369                 ir->sampling = 0xff00; /* address */
370                 break;
371         case CX88_BOARD_TEVII_S460:
372         case CX88_BOARD_TEVII_S420:
373                 ir_codes = RC_MAP_TEVII_NEC;
374                 ir_type = IR_TYPE_PD;
375                 ir->sampling = 0xff00; /* address */
376                 break;
377         case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
378                 ir_codes         = RC_MAP_DNTV_LIVE_DVBT_PRO;
379                 ir_type          = IR_TYPE_PD;
380                 ir->sampling     = 0xff00; /* address */
381                 break;
382         case CX88_BOARD_NORWOOD_MICRO:
383                 ir_codes         = RC_MAP_NORWOOD;
384                 ir->gpio_addr    = MO_GP1_IO;
385                 ir->mask_keycode = 0x0e;
386                 ir->mask_keyup   = 0x80;
387                 ir->polling      = 50; /* ms */
388                 break;
389         case CX88_BOARD_NPGTECH_REALTV_TOP10FM:
390                 ir_codes         = RC_MAP_NPGTECH;
391                 ir->gpio_addr    = MO_GP0_IO;
392                 ir->mask_keycode = 0xfa;
393                 ir->polling      = 50; /* ms */
394                 break;
395         case CX88_BOARD_PINNACLE_PCTV_HD_800i:
396                 ir_codes         = RC_MAP_PINNACLE_PCTV_HD;
397                 ir_type          = IR_TYPE_RC5;
398                 ir->sampling     = 1;
399                 break;
400         case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
401                 ir_codes         = RC_MAP_POWERCOLOR_REAL_ANGEL;
402                 ir->gpio_addr    = MO_GP2_IO;
403                 ir->mask_keycode = 0x7e;
404                 ir->polling      = 100; /* ms */
405                 break;
406         }
407
408         if (NULL == ir_codes) {
409                 err = -ENODEV;
410                 goto err_out_free;
411         }
412
413         /* init input device */
414         snprintf(ir->name, sizeof(ir->name), "cx88 IR (%s)", core->board.name);
415         snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", pci_name(pci));
416
417         err = ir_input_init(input_dev, &ir->ir, ir_type);
418         if (err < 0)
419                 goto err_out_free;
420
421         input_dev->name = ir->name;
422         input_dev->phys = ir->phys;
423         input_dev->id.bustype = BUS_PCI;
424         input_dev->id.version = 1;
425         if (pci->subsystem_vendor) {
426                 input_dev->id.vendor = pci->subsystem_vendor;
427                 input_dev->id.product = pci->subsystem_device;
428         } else {
429                 input_dev->id.vendor = pci->vendor;
430                 input_dev->id.product = pci->device;
431         }
432         input_dev->dev.parent = &pci->dev;
433         /* record handles to ourself */
434         ir->core = core;
435         core->ir = ir;
436
437         ir->props.priv = core;
438         ir->props.open = cx88_ir_open;
439         ir->props.close = cx88_ir_close;
440
441         /* all done */
442         err = ir_input_register(ir->input, ir_codes, &ir->props, MODULE_NAME);
443         if (err)
444                 goto err_out_free;
445
446         return 0;
447
448  err_out_free:
449         core->ir = NULL;
450         kfree(ir);
451         return err;
452 }
453
454 int cx88_ir_fini(struct cx88_core *core)
455 {
456         struct cx88_IR *ir = core->ir;
457
458         /* skip detach on non attached boards */
459         if (NULL == ir)
460                 return 0;
461
462         cx88_ir_stop(core);
463         ir_input_unregister(ir->input);
464         kfree(ir);
465
466         /* done */
467         core->ir = NULL;
468         return 0;
469 }
470
471 /* ---------------------------------------------------------------------- */
472
473 void cx88_ir_irq(struct cx88_core *core)
474 {
475         struct cx88_IR *ir = core->ir;
476         u32 samples, ircode;
477         int i, start, range, toggle, dev, code;
478
479         if (NULL == ir)
480                 return;
481         if (!ir->sampling)
482                 return;
483
484         samples = cx_read(MO_SAMPLE_IO);
485         if (0 != samples && 0xffffffff != samples) {
486                 /* record sample data */
487                 if (ir->scount < ARRAY_SIZE(ir->samples))
488                         ir->samples[ir->scount++] = samples;
489                 return;
490         }
491         if (!ir->scount) {
492                 /* nothing to sample */
493                 if (ir->ir.keypressed && time_after(jiffies, ir->release))
494                         ir_input_nokey(ir->input, &ir->ir);
495                 return;
496         }
497
498         /* have a complete sample */
499         if (ir->scount < ARRAY_SIZE(ir->samples))
500                 ir->samples[ir->scount++] = samples;
501         for (i = 0; i < ir->scount; i++)
502                 ir->samples[i] = ~ir->samples[i];
503         if (ir_debug)
504                 ir_dump_samples(ir->samples, ir->scount);
505
506         /* decode it */
507         switch (core->boardnr) {
508         case CX88_BOARD_TEVII_S460:
509         case CX88_BOARD_TEVII_S420:
510         case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1:
511         case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
512         case CX88_BOARD_OMICOM_SS4_PCI:
513         case CX88_BOARD_SATTRADE_ST4200:
514         case CX88_BOARD_TBS_8920:
515         case CX88_BOARD_TBS_8910:
516         case CX88_BOARD_PROF_7300:
517         case CX88_BOARD_PROF_7301:
518         case CX88_BOARD_PROF_6200:
519                 ircode = ir_decode_pulsedistance(ir->samples, ir->scount, 1, 4);
520
521                 if (ircode == 0xffffffff) { /* decoding error */
522                         ir_dprintk("pulse distance decoding error\n");
523                         break;
524                 }
525
526                 ir_dprintk("pulse distance decoded: %x\n", ircode);
527
528                 if (ircode == 0) { /* key still pressed */
529                         ir_dprintk("pulse distance decoded repeat code\n");
530                         ir->release = jiffies + msecs_to_jiffies(120);
531                         break;
532                 }
533
534                 if ((ircode & 0xffff) != (ir->sampling & 0xffff)) { /* wrong address */
535                         ir_dprintk("pulse distance decoded wrong address\n");
536                         break;
537                 }
538
539                 if (((~ircode >> 24) & 0xff) != ((ircode >> 16) & 0xff)) { /* wrong checksum */
540                         ir_dprintk("pulse distance decoded wrong check sum\n");
541                         break;
542                 }
543
544                 ir_dprintk("Key Code: %x\n", (ircode >> 16) & 0x7f);
545
546                 ir_input_keydown(ir->input, &ir->ir, (ircode >> 16) & 0x7f);
547                 ir->release = jiffies + msecs_to_jiffies(120);
548                 break;
549         case CX88_BOARD_HAUPPAUGE:
550         case CX88_BOARD_HAUPPAUGE_DVB_T1:
551         case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
552         case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
553         case CX88_BOARD_HAUPPAUGE_HVR1100:
554         case CX88_BOARD_HAUPPAUGE_HVR3000:
555         case CX88_BOARD_HAUPPAUGE_HVR4000:
556         case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
557         case CX88_BOARD_PCHDTV_HD3000:
558         case CX88_BOARD_PCHDTV_HD5500:
559         case CX88_BOARD_HAUPPAUGE_IRONLY:
560                 ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7);
561                 ir_dprintk("biphase decoded: %x\n", ircode);
562                 /*
563                  * RC5 has an extension bit which adds a new range
564                  * of available codes, this is detected here. Also
565                  * hauppauge remotes (black/silver) always use
566                  * specific device ids. If we do not filter the
567                  * device ids then messages destined for devices
568                  * such as TVs (id=0) will get through to the
569                  * device causing mis-fired events.
570                  */
571                 /* split rc5 data block ... */
572                 start = (ircode & 0x2000) >> 13;
573                 range = (ircode & 0x1000) >> 12;
574                 toggle= (ircode & 0x0800) >> 11;
575                 dev   = (ircode & 0x07c0) >> 6;
576                 code  = (ircode & 0x003f) | ((range << 6) ^ 0x0040);
577                 if( start != 1)
578                         /* no key pressed */
579                         break;
580                 if ( dev != 0x1e && dev != 0x1f )
581                         /* not a hauppauge remote */
582                         break;
583                 ir_input_keydown(ir->input, &ir->ir, code);
584                 ir->release = jiffies + msecs_to_jiffies(120);
585                 break;
586         case CX88_BOARD_PINNACLE_PCTV_HD_800i:
587                 ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7);
588                 ir_dprintk("biphase decoded: %x\n", ircode);
589                 if ((ircode & 0xfffff000) != 0x3000)
590                         break;
591                 ir_input_keydown(ir->input, &ir->ir, ircode & 0x3f);
592                 ir->release = jiffies + msecs_to_jiffies(120);
593                 break;
594         }
595
596         ir->scount = 0;
597         return;
598 }
599
600 /* ---------------------------------------------------------------------- */
601
602 MODULE_AUTHOR("Gerd Knorr, Pavel Machek, Chris Pascoe");
603 MODULE_DESCRIPTION("input driver for cx88 GPIO-based IR remote controls");
604 MODULE_LICENSE("GPL");
605 /*
606  * Local variables:
607  * c-basic-offset: 8
608  * End:
609  */