[media] Twinhan 1027 + IR Port support
authorSergey Ivanov <123kash@gmail.com>
Mon, 9 Aug 2010 13:18:32 +0000 (10:18 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 21 Oct 2010 09:55:55 +0000 (07:55 -0200)
Patch add support of TwinHan 1027 DVB-S card.

Refreshed version of https://patchwork.kernel.org/patch/79753/ patch.
(adapted for the new IR system), still works.

DVB-S support come from a patch originally authored by
Manu Abraham (abraham.manu@gmail.com).
IR Port support were added by Sergey.

Cc: Manu Abraham <abraham.manu@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/IR/keymaps/Makefile
drivers/media/IR/keymaps/rc-twinhan1027.c [new file with mode: 0644]
drivers/media/video/cx88/cx88-cards.c
drivers/media/video/cx88/cx88-dvb.c
drivers/media/video/cx88/cx88-input.c
drivers/media/video/cx88/cx88.h
include/media/rc-map.h

index 11688dd740ca6dc219b8f0b9ec8a0b265eb00411..6083453f47151696662fa4972872c05e0d935d9a 100644 (file)
@@ -77,6 +77,7 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
                        rc-total-media-in-hand.o \
                        rc-trekstor.o \
                        rc-tt-1500.o \
+                       rc-twinhan1027.o \
                        rc-videomate-s350.o \
                        rc-videomate-tv-pvr.o \
                        rc-winfast.o \
diff --git a/drivers/media/IR/keymaps/rc-twinhan1027.c b/drivers/media/IR/keymaps/rc-twinhan1027.c
new file mode 100644 (file)
index 0000000..0b5d356
--- /dev/null
@@ -0,0 +1,87 @@
+#include <media/rc-map.h>
+
+static struct ir_scancode twinhan_vp1027[] = {
+       { 0x16, KEY_POWER2 },
+       { 0x17, KEY_FAVORITES },
+       { 0x0f, KEY_TEXT },
+       { 0x48, KEY_INFO},
+       { 0x1c, KEY_EPG },
+       { 0x04, KEY_LIST },
+
+       { 0x03, KEY_1 },
+       { 0x01, KEY_2 },
+       { 0x06, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x1d, KEY_5 },
+       { 0x1f, KEY_6 },
+       { 0x0d, KEY_7 },
+       { 0x19, KEY_8 },
+       { 0x1b, KEY_9 },
+       { 0x15, KEY_0 },
+
+       { 0x0c, KEY_CANCEL },
+       { 0x4a, KEY_CLEAR },
+       { 0x13, KEY_BACKSPACE },
+       { 0x00, KEY_TAB },
+
+       { 0x4b, KEY_UP },
+       { 0x51, KEY_DOWN },
+       { 0x4e, KEY_LEFT },
+       { 0x52, KEY_RIGHT },
+       { 0x4f, KEY_ENTER },
+
+       { 0x1e, KEY_VOLUMEUP },
+       { 0x0a, KEY_VOLUMEDOWN },
+       { 0x02, KEY_CHANNELDOWN },
+       { 0x05, KEY_CHANNELUP },
+       { 0x11, KEY_RECORD },
+
+       { 0x14, KEY_PLAY },
+       { 0x4c, KEY_PAUSE },
+       { 0x1a, KEY_STOP },
+       { 0x40, KEY_REWIND },
+       { 0x12, KEY_FASTFORWARD },
+       { 0x41, KEY_PREVIOUSSONG },
+       { 0x42, KEY_NEXTSONG },
+       { 0x54, KEY_SAVE },
+       { 0x50, KEY_LANGUAGE },
+       { 0x47, KEY_MEDIA },
+       { 0x4d, KEY_SCREEN },
+       { 0x43, KEY_SUBTITLE },
+       { 0x10, KEY_MUTE },
+       { 0x49, KEY_AUDIO },
+       { 0x07, KEY_SLEEP },
+       { 0x08, KEY_VIDEO },
+       { 0x0e, KEY_AGAIN },
+       { 0x45, KEY_EQUAL },
+       { 0x46, KEY_MINUS },
+       { 0x18, KEY_RED },
+       { 0x53, KEY_GREEN },
+       { 0x5e, KEY_YELLOW },
+       { 0x5f, KEY_BLUE },
+};
+
+static struct rc_keymap twinhan_vp1027_map = {
+       .map = {
+               .scan    = twinhan_vp1027,
+               .size    = ARRAY_SIZE(twinhan_vp1027),
+               .ir_type = IR_TYPE_UNKNOWN,     /* Legacy IR type */
+               .name    = RC_MAP_TWINHAN_VP1027_DVBS,
+       }
+};
+
+static int __init init_rc_map_twinhan_vp1027(void)
+{
+       return ir_register_map(&twinhan_vp1027_map);
+}
+
+static void __exit exit_rc_map_twinhan_vp1027(void)
+{
+       ir_unregister_map(&twinhan_vp1027_map);
+}
+
+module_init(init_rc_map_twinhan_vp1027)
+module_exit(exit_rc_map_twinhan_vp1027)
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Sergey Ivanov <123kash@gmail.com>");
index 97672cb49b511f76aedd6575406273d594b8e405..f220fa2e10d83b5d0e69a8d43c85cff033e8df49 100644 (file)
@@ -2104,6 +2104,18 @@ static const struct cx88_board cx88_boards[] = {
                } },
                .mpeg           = CX88_MPEG_DVB,
        },
+       [CX88_BOARD_TWINHAN_VP1027_DVBS] = {
+               .name           = "Twinhan VP-1027 DVB-S",
+               .tuner_type     = TUNER_ABSENT,
+               .radio_type     = UNSET,
+               .tuner_addr     = ADDR_UNSET,
+               .radio_addr     = ADDR_UNSET,
+               .input          = {{
+                      .type   = CX88_VMUX_DVB,
+                      .vmux   = 0,
+               } },
+               .mpeg           = CX88_MPEG_DVB,
+       },
 };
 
 /* ------------------------------------------------------------------ */
@@ -2576,6 +2588,10 @@ static const struct cx88_subid cx88_subids[] = {
                .subvendor = 0xb034,
                .subdevice = 0x3034,
                .card      = CX88_BOARD_PROF_7301,
+       }, {
+               .subvendor = 0x1822,
+               .subdevice = 0x0023,
+               .card      = CX88_BOARD_TWINHAN_VP1027_DVBS,
        },
 };
 
@@ -3070,6 +3086,13 @@ static void cx88_card_setup_pre_i2c(struct cx88_core *core)
                cx_set(MO_GP1_IO, 0x10);
                mdelay(50);
                break;
+
+       case CX88_BOARD_TWINHAN_VP1027_DVBS:
+               cx_write(MO_GP0_IO, 0x00003230);
+               cx_write(MO_GP0_IO, 0x00003210);
+               msleep(1);
+               cx_write(MO_GP0_IO, 0x00001230);
+               break;
        }
 }
 
index a037e925ceb976fbf906c38056ca305661475cbe..367a653f4c95ca50f7fb9280eabafb274788760a 100644 (file)
@@ -56,6 +56,7 @@
 #include "stv0900.h"
 #include "stb6100.h"
 #include "stb6100_proc.h"
+#include "mb86a16.h"
 
 MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
 MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
@@ -250,6 +251,10 @@ static const struct zl10353_config cx88_terratec_cinergy_ht_pci_mkii_config = {
        .if2           = 45600,
 };
 
+static struct mb86a16_config twinhan_vp1027 = {
+       .demod_address  = 0x08,
+};
+
 #if defined(CONFIG_VIDEO_CX88_VP3054) || (defined(CONFIG_VIDEO_CX88_VP3054_MODULE) && defined(MODULE))
 static int dntv_live_dvbt_pro_demod_init(struct dvb_frontend* fe)
 {
@@ -429,15 +434,41 @@ static int tevii_dvbs_set_voltage(struct dvb_frontend *fe,
 
        cx_set(MO_GP0_IO, 0x6040);
        switch (voltage) {
-               case SEC_VOLTAGE_13:
-                       cx_clear(MO_GP0_IO, 0x20);
-                       break;
-               case SEC_VOLTAGE_18:
-                       cx_set(MO_GP0_IO, 0x20);
-                       break;
-               case SEC_VOLTAGE_OFF:
-                       cx_clear(MO_GP0_IO, 0x20);
-                       break;
+       case SEC_VOLTAGE_13:
+               cx_clear(MO_GP0_IO, 0x20);
+               break;
+       case SEC_VOLTAGE_18:
+               cx_set(MO_GP0_IO, 0x20);
+               break;
+       case SEC_VOLTAGE_OFF:
+               cx_clear(MO_GP0_IO, 0x20);
+               break;
+       }
+
+       if (core->prev_set_voltage)
+               return core->prev_set_voltage(fe, voltage);
+       return 0;
+}
+
+static int vp1027_set_voltage(struct dvb_frontend *fe,
+                                   fe_sec_voltage_t voltage)
+{
+       struct cx8802_dev *dev = fe->dvb->priv;
+       struct cx88_core *core = dev->core;
+
+       switch (voltage) {
+       case SEC_VOLTAGE_13:
+               dprintk(1, "LNB SEC Voltage=13\n");
+               cx_write(MO_GP0_IO, 0x00001220);
+               break;
+       case SEC_VOLTAGE_18:
+               dprintk(1, "LNB SEC Voltage=18\n");
+               cx_write(MO_GP0_IO, 0x00001222);
+               break;
+       case SEC_VOLTAGE_OFF:
+               dprintk(1, "LNB Voltage OFF\n");
+               cx_write(MO_GP0_IO, 0x00001230);
+               break;
        }
 
        if (core->prev_set_voltage)
@@ -1416,6 +1447,18 @@ static int dvb_register(struct cx8802_dev *dev)
                }
 
                break;
+       case CX88_BOARD_TWINHAN_VP1027_DVBS:
+               dev->ts_gen_cntrl = 0x00;
+               fe0->dvb.frontend = dvb_attach(mb86a16_attach,
+                                               &twinhan_vp1027,
+                                               &core->i2c_adap);
+               if (fe0->dvb.frontend) {
+                       core->prev_set_voltage =
+                                       fe0->dvb.frontend->ops.set_voltage;
+                       fe0->dvb.frontend->ops.set_voltage =
+                                       vp1027_set_voltage;
+               }
+               break;
 
        default:
                printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
index d52ce0e3bec9d26fffa398c1b451f76f83681053..fc777bc6e71629a3bdf5d0492d5e7e6931d1c3a3 100644 (file)
@@ -405,6 +405,11 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
                ir->mask_keycode = 0x7e;
                ir->polling      = 100; /* ms */
                break;
+       case CX88_BOARD_TWINHAN_VP1027_DVBS:
+               ir_codes         = RC_MAP_TWINHAN_VP1027_DVBS;
+               ir_type          = IR_TYPE_NEC;
+               ir->sampling     = 0xff00; /* address */
+               break;
        }
 
        if (NULL == ir_codes) {
@@ -530,6 +535,7 @@ void cx88_ir_irq(struct cx88_core *core)
        case CX88_BOARD_PROF_7300:
        case CX88_BOARD_PROF_7301:
        case CX88_BOARD_PROF_6200:
+       case CX88_BOARD_TWINHAN_VP1027_DVBS:
                ircode = ir_decode_pulsedistance(ir->samples, ir->scount, 1, 4);
 
                if (ircode == 0xffffffff) { /* decoding error */
index 127118f4b650dfca0dc09353315df4ff95823069..c9981e77416a6f8292721b53333bd9cbba1da35c 100644 (file)
@@ -239,6 +239,7 @@ extern const struct sram_channel const cx88_sram_channels[];
 #define CX88_BOARD_WINFAST_DTV2000H_J      82
 #define CX88_BOARD_PROF_7301               83
 #define CX88_BOARD_SAMSUNG_SMT_7020        84
+#define CX88_BOARD_TWINHAN_VP1027_DVBS     85
 
 enum cx88_itype {
        CX88_VMUX_COMPOSITE1 = 1,
index d1bff027297e96d1dbe78df05f2193f9902af64d..74a00a93dcf1c28bc4302784f5a5518bfd7cec05 100644 (file)
@@ -134,6 +134,7 @@ void rc_map_init(void);
 #define RC_MAP_TOTAL_MEDIA_IN_HAND       "rc-total-media-in-hand"
 #define RC_MAP_TREKSTOR                  "rc-trekstor"
 #define RC_MAP_TT_1500                   "rc-tt-1500"
+#define RC_MAP_TWINHAN_VP1027_DVBS       "rc-twinhan1027"
 #define RC_MAP_VIDEOMATE_S350            "rc-videomate-s350"
 #define RC_MAP_VIDEOMATE_TV_PVR          "rc-videomate-tv-pvr"
 #define RC_MAP_WINFAST                   "rc-winfast"