diff -urN v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/common/ir-keymaps.c v4l-dvb-28f8b0ebd224/linux/drivers/media/common/ir-keymaps.c --- v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/common/ir-keymaps.c 2009-08-23 19:55:25.000000000 +0300 +++ v4l-dvb-28f8b0ebd224/linux/drivers/media/common/ir-keymaps.c 2009-08-26 12:29:34.000000000 +0300 @@ -2648,6 +2648,124 @@ }; EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d); +/* Twinhan CAB-CI 2033 */ +IR_KEYTAB_TYPE ir_codes_mantis_vp2033[IR_KEYTAB_SIZE] = { + [ 0x29 ] = KEY_POWER, + [ 0x28 ] = KEY_FAVORITES, + [ 0x30 ] = KEY_TEXT, + [ 0x17 ] = KEY_INFO, // Preview + [ 0x23 ] = KEY_EPG, + [ 0x3b ] = KEY_F22, // Record List + + [ 0x3c ] = KEY_1, + [ 0x3e ] = KEY_2, + [ 0x39 ] = KEY_3, + [ 0x36 ] = KEY_4, + [ 0x22 ] = KEY_5, + [ 0x20 ] = KEY_6, + [ 0x32 ] = KEY_7, + [ 0x26 ] = KEY_8, + [ 0x24 ] = KEY_9, + [ 0x2a ] = KEY_0, + + [ 0x33 ] = KEY_CANCEL, + [ 0x2c ] = KEY_BACK, + [ 0x15 ] = KEY_CLEAR, + [ 0x3f ] = KEY_TAB, + [ 0x10 ] = KEY_ENTER, + [ 0x14 ] = KEY_UP, + [ 0x0d ] = KEY_RIGHT, + [ 0x0e ] = KEY_DOWN, + [ 0x11 ] = KEY_LEFT, + + [ 0x21 ] = KEY_VOLUMEUP, + [ 0x35 ] = KEY_VOLUMEDOWN, + [ 0x3d ] = KEY_CHANNELDOWN, + [ 0x3a ] = KEY_CHANNELUP, + [ 0x2e ] = KEY_RECORD, + [ 0x2b ] = KEY_PLAY, + [ 0x13 ] = KEY_PAUSE, + [ 0x25 ] = KEY_STOP, + + [ 0x1f ] = KEY_REWIND, + [ 0x2d ] = KEY_FASTFORWARD, + [ 0x1e ] = KEY_PREVIOUS, // Replay |< + [ 0x1d ] = KEY_NEXT, // Skip >| + + [ 0x0b ] = KEY_CAMERA, // Capture + [ 0x0f ] = KEY_LANGUAGE, // SAP + [ 0x18 ] = KEY_MODE, // PIP + [ 0x12 ] = KEY_ZOOM, // Full screen, + [ 0x1c ] = KEY_SUBTITLE, + [ 0x2f ] = KEY_MUTE, + [ 0x16 ] = KEY_F20, // L/R, + [ 0x38 ] = KEY_F21, // Hibernate, + + [ 0x37 ] = KEY_SWITCHVIDEOMODE, // A/V + [ 0x31 ] = KEY_AGAIN, // Recall, + [ 0x1a ] = KEY_KPPLUS, // Zoom+, + [ 0x19 ] = KEY_KPMINUS, // Zoom-, + [ 0x27 ] = KEY_RED, + [ 0x0C ] = KEY_GREEN, + [ 0x01 ] = KEY_YELLOW, + [ 0x00 ] = KEY_BLUE, +}; + +EXPORT_SYMBOL_GPL(ir_codes_mantis_vp2033); + +/* Twinhan mantis vp2040 - terratec cinergy c */ +IR_KEYTAB_TYPE ir_codes_mantis_vp2040[IR_KEYTAB_SIZE] = { + [ 0x3e ] = KEY_POWER, + [ 0x3d ] = KEY_1, + [ 0x3c ] = KEY_2, + [ 0x3b ] = KEY_3, + [ 0x3a ] = KEY_4, + [ 0x39 ] = KEY_5, + [ 0x38 ] = KEY_6, + [ 0x37 ] = KEY_7, + [ 0x36 ] = KEY_8, + [ 0x35 ] = KEY_9, + [ 0x34 ] = KEY_VIDEO_NEXT, /* AV */ + [ 0x33 ] = KEY_0, + [ 0x32 ] = KEY_REFRESH, + [ 0x30 ] = KEY_EPG, + [ 0x2f ] = KEY_UP, + [ 0x2e ] = KEY_LEFT, + [ 0x2d ] = KEY_OK, + [ 0x2c ] = KEY_RIGHT, + [ 0x2b ] = KEY_DOWN, + [ 0x29 ] = KEY_INFO, + [ 0x28 ] = KEY_RED, + [ 0x27 ] = KEY_GREEN, + [ 0x26 ] = KEY_YELLOW, + [ 0x25 ] = KEY_BLUE, + [ 0x24 ] = KEY_CHANNELUP, + [ 0x23 ] = KEY_VOLUMEUP, + [ 0x22 ] = KEY_MUTE, + [ 0x21 ] = KEY_VOLUMEDOWN, + [ 0x20 ] = KEY_CHANNELDOWN, + [ 0x1f ] = KEY_PAUSE, + [ 0x1e ] = KEY_HOME, + [ 0x1d ] = KEY_MENU, /* DVD Menu */ + [ 0x1c ] = KEY_SUBTITLE, + [ 0x1b ] = KEY_TEXT, /* Teletext */ + [ 0x1a ] = KEY_DELETE, + [ 0x19 ] = KEY_TV, + [ 0x18 ] = KEY_DVD, + [ 0x17 ] = KEY_STOP, + [ 0x16 ] = KEY_VIDEO, + [ 0x15 ] = KEY_AUDIO, /* Music */ + [ 0x14 ] = KEY_SCREEN, /* Pic */ + [ 0x13 ] = KEY_PLAY, + [ 0x12 ] = KEY_BACK, + [ 0x11 ] = KEY_REWIND, + [ 0x10 ] = KEY_FASTFORWARD, + [ 0x0b ] = KEY_PREVIOUS, + [ 0x07 ] = KEY_RECORD, + [ 0x03 ] = KEY_NEXT, +}; +EXPORT_SYMBOL_GPL(ir_codes_mantis_vp2040); + /* Encore ENLTV-FM v5.3 Mauro Carvalho Chehab */ diff -urN v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/Makefile v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/Makefile --- v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/Makefile 2009-08-26 12:31:05.000000000 +0300 +++ v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/Makefile 2009-08-26 12:25:21.000000000 +0300 @@ -12,7 +12,8 @@ mantis_vp1041.o \ mantis_vp2033.o \ mantis_vp2040.o \ - mantis_vp3030.o + mantis_vp3030.o \ + mantis_rc.o obj-$(CONFIG_DVB_MANTIS) += mantis.o diff -urN v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_common.h v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_common.h --- v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_common.h 2009-08-26 12:31:05.000000000 +0300 +++ v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_common.h 2009-08-26 12:25:21.000000000 +0300 @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include "dvbdev.h" #include "dvb_demux.h" @@ -74,6 +76,20 @@ char *model_name; char *dev_type; u32 ts_size; + IR_KEYTAB_TYPE *ir_codes; +}; + +struct mantis_ir { + struct input_dev *rc_dev; + char rc_name[80]; + char rc_phys[80]; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + struct work_struct rc_query_work; +#else + struct delayed_work rc_query_work; +#endif + u32 ir_last_code; + struct ir_input_state ir; }; struct mantis_pci { @@ -142,6 +158,9 @@ u32 gpif_status; struct mantis_ca *mantis_ca; + + /* IR */ + struct mantis_ir ir; }; #define MANTIS_HIF_STATUS (mantis->gpio_status) diff -urN v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_core.c v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_core.c --- v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_core.c 2009-08-26 12:31:05.000000000 +0300 +++ v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_core.c 2009-08-26 12:25:21.000000000 +0300 @@ -165,6 +165,10 @@ dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DVB init failed"); return err; } + if ((err = mantis_rc_init(mantis)) < 0) { + dprintk(verbose, MANTIS_DEBUG, 1, "Mantis RC init failed"); + return err; + } return 0; } diff -urN v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_core.h v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_core.h --- v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_core.h 2009-08-26 12:31:05.000000000 +0300 +++ v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_core.h 2009-08-26 12:25:21.000000000 +0300 @@ -53,5 +53,7 @@ extern int mantis_i2c_exit(struct mantis_pci *mantis); extern int mantis_core_init(struct mantis_pci *mantis); extern int mantis_core_exit(struct mantis_pci *mantis); +extern int mantis_rc_init(struct mantis_pci *mantis); +extern int mantis_rc_exit(struct mantis_pci *mantis); #endif //__MANTIS_CORE_H diff -urN v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_pci.c v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_pci.c --- v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_pci.c 2009-08-26 12:31:05.000000000 +0300 +++ v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_pci.c 2009-08-26 12:25:21.000000000 +0300 @@ -93,6 +93,7 @@ schedule_work(&ca->hif_evm_work); } if (stat & MANTIS_INT_IRQ1) { + mantis->ir.ir_last_code = mmread(0xe8); dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *"); } if (stat & MANTIS_INT_OCERR) { @@ -247,6 +248,7 @@ dprintk(verbose, MANTIS_ERROR, 1, "Aeio, Mantis NULL ptr"); return; } + mantis_rc_exit(mantis); mantis_core_exit(mantis); dprintk(verbose, MANTIS_ERROR, 1, "Removing -->Mantis irq: %d, latency: %d\n memory: 0x%lx, mmio: 0x%p", pdev->irq, mantis->latency, mantis->mantis_addr, diff -urN v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_rc.c v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_rc.c --- v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_rc.c 1970-01-01 02:00:00.000000000 +0200 +++ v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_rc.c 2009-08-26 12:25:21.000000000 +0300 @@ -0,0 +1,93 @@ +#include +#include "mantis_common.h" +#include "mantis_core.h" + +#include "dmxdev.h" +#include "dvbdev.h" +#include "dvb_demux.h" +#include "dvb_frontend.h" +#include "mantis_vp1033.h" +#include "mantis_vp1034.h" +#include "mantis_vp2033.h" +#include "mantis_vp3030.h" + +#define POLL_FREQ 100 + +void mantis_query_rc(struct work_struct *work) +{ + struct mantis_pci *mantis = + container_of(work, struct mantis_pci, ir.rc_query_work.work); + struct ir_input_state *ir = &mantis->ir.ir; + + u32 lastkey = mantis->ir.ir_last_code; + + if (lastkey != -1) { + ir_input_keydown(mantis->ir.rc_dev, ir, lastkey, 0); + mantis->ir.ir_last_code = -1; + } else { + ir_input_nokey(mantis->ir.rc_dev, ir); + } + schedule_delayed_work(&mantis->ir.rc_query_work, + msecs_to_jiffies(POLL_FREQ)); +} + +int mantis_rc_init(struct mantis_pci *mantis) +{ + struct input_dev *rc_dev; + struct mantis_ir *mir = &mantis->ir; + struct ir_input_state *ir = &mir->ir; + int err; + + if (!mantis->hwconfig->ir_codes) { + dprintk(verbose, MANTIS_DEBUG, 1, "No RC codes available"); + return 0; + } + + mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ1, MANTIS_INT_MASK); + + rc_dev = input_allocate_device(); + if (!rc_dev) { + dprintk(verbose, MANTIS_ERROR, 1, "dvb_rc_init failed"); + return -ENOENT; + } + + mir->rc_dev = rc_dev; + + snprintf(mir->rc_name, sizeof(mir->rc_name), + "Mantis %s IR Receiver", mantis->hwconfig->model_name); + snprintf(mir->rc_phys, sizeof(mir->rc_phys), + "pci-%s/ir0", pci_name(mantis->pdev)); + + rc_dev->name = mir->rc_name; + rc_dev->phys = mir->rc_phys; + + ir_input_init(rc_dev, ir, IR_TYPE_OTHER, mantis->hwconfig->ir_codes); + + rc_dev->id.bustype = BUS_PCI; + rc_dev->id.vendor = mantis->vendor_id; + rc_dev->id.product = mantis->device_id; + rc_dev->id.version = 1; + + INIT_DELAYED_WORK(&mir->rc_query_work, mantis_query_rc); + + err = input_register_device(rc_dev); + if (err) { + dprintk(verbose, MANTIS_ERROR, 1, "rc registering failed"); + return -ENOENT; + } + + schedule_delayed_work(&mir->rc_query_work, + msecs_to_jiffies(POLL_FREQ)); + return 0; +} + +int mantis_rc_exit(struct mantis_pci *mantis) +{ + mmwrite(mmread(MANTIS_INT_MASK) & (~MANTIS_INT_IRQ1), MANTIS_INT_MASK); + + cancel_delayed_work(&mantis->ir.rc_query_work); + flush_scheduled_work(); + input_unregister_device(mantis->ir.rc_dev); + dprintk(verbose, MANTIS_DEBUG, 1, "RC unregistered"); + return 0; +} diff -urN v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_vp2033.c v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_vp2033.c --- v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_vp2033.c 2009-08-26 12:31:05.000000000 +0300 +++ v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_vp2033.c 2009-08-26 12:25:21.000000000 +0300 @@ -28,6 +28,7 @@ .model_name = MANTIS_MODEL_NAME, .dev_type = MANTIS_DEV_TYPE, .ts_size = MANTIS_TS_204, + .ir_codes = ir_codes_mantis_vp2033, }; struct tda1002x_config philips_cu1216_config = { diff -urN v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_vp2040.c v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_vp2040.c --- v4l-dvb-28f8b0ebd224.ORIG/linux/drivers/media/dvb/mantis/mantis_vp2040.c 2009-08-26 12:31:05.000000000 +0300 +++ v4l-dvb-28f8b0ebd224/linux/drivers/media/dvb/mantis/mantis_vp2040.c 2009-08-26 12:25:21.000000000 +0300 @@ -28,6 +28,7 @@ .model_name = MANTIS_MODEL_NAME, .dev_type = MANTIS_DEV_TYPE, .ts_size = MANTIS_TS_204, + .ir_codes = ir_codes_mantis_vp2040, }; struct tda10023_config tda10023_cu1216_config = { diff -urN v4l-dvb-28f8b0ebd224.ORIG/linux/include/media/ir-common.h v4l-dvb-28f8b0ebd224/linux/include/media/ir-common.h --- v4l-dvb-28f8b0ebd224.ORIG/linux/include/media/ir-common.h 2009-08-23 19:55:25.000000000 +0300 +++ v4l-dvb-28f8b0ebd224/linux/include/media/ir-common.h 2009-08-26 12:30:33.000000000 +0300 @@ -155,6 +155,8 @@ extern IR_KEYTAB_TYPE ir_codes_genius_tvgo_a11mce[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE]; +extern IR_KEYTAB_TYPE ir_codes_mantis_vp2033[IR_KEYTAB_SIZE]; +extern IR_KEYTAB_TYPE ir_codes_mantis_vp2040[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_encore_enltv_fm53[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_real_audio_220_32_keys[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_msi_tvanywhere_plus[IR_KEYTAB_SIZE];