[media] patch for Asus My Cinema PS3-100 (1043:48cd)
authorremi schwartz <remi.schwartz@gmail.com>
Sat, 19 May 2012 09:11:47 +0000 (06:11 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 20 May 2012 19:05:02 +0000 (16:05 -0300)
Signed-off-by: Remi Schwartz <remi.schwartz@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/rc/keymaps/Makefile
drivers/media/rc/keymaps/rc-asus-ps3-100.c [new file with mode: 0644]
drivers/media/video/saa7134/saa7134-cards.c
drivers/media/video/saa7134/saa7134-dvb.c
drivers/media/video/saa7134/saa7134-input.c
drivers/media/video/saa7134/saa7134.h
include/media/rc-map.h

index 6d41a29861accbef09eecf519ac0c7c2d32d52e4..ab84d66c67c1b0e37df35e4704d29aa3d7f73555 100644 (file)
@@ -3,6 +3,7 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
                        rc-anysee.o \
                        rc-apac-viewcomp.o \
                        rc-asus-pc39.o \
+                       rc-asus-ps3-100.o \
                        rc-ati-tv-wonder-hd-600.o \
                        rc-ati-x10.o \
                        rc-avermedia-a16d.o \
diff --git a/drivers/media/rc/keymaps/rc-asus-ps3-100.c b/drivers/media/rc/keymaps/rc-asus-ps3-100.c
new file mode 100644 (file)
index 0000000..ba76609
--- /dev/null
@@ -0,0 +1,91 @@
+/* asus-ps3-100.h - Keytable for asus_ps3_100 Remote Controller
+ *
+ * Copyright (c) 2012 by Mauro Carvalho Chehab <mchehab@redhat.com>
+ *
+ * Based on a previous patch from Remi Schwartz <remi.schwartz@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <media/rc-map.h>
+#include <linux/module.h>
+
+static struct rc_map_table asus_ps3_100[] = {
+       { 0x081c, KEY_HOME },             /* home */
+       { 0x081e, KEY_TV },               /* tv */
+       { 0x0803, KEY_TEXT },             /* teletext */
+       { 0x0829, KEY_POWER },            /* close */
+
+       { 0x080b, KEY_RED },              /* red */
+       { 0x080d, KEY_YELLOW },           /* yellow */
+       { 0x0806, KEY_BLUE },             /* blue */
+       { 0x0807, KEY_GREEN },            /* green */
+
+       /* Keys 0 to 9 */
+       { 0x082a, KEY_0 },
+       { 0x0816, KEY_1 },
+       { 0x0812, KEY_2 },
+       { 0x0814, KEY_3 },
+       { 0x0836, KEY_4 },
+       { 0x0832, KEY_5 },
+       { 0x0834, KEY_6 },
+       { 0x080e, KEY_7 },
+       { 0x080a, KEY_8 },
+       { 0x080c, KEY_9 },
+
+       { 0x0815, KEY_VOLUMEUP },
+       { 0x0826, KEY_VOLUMEDOWN },
+       { 0x0835, KEY_CHANNELUP },        /* channel / program + */
+       { 0x0824, KEY_CHANNELDOWN },      /* channel / program - */
+
+       { 0x0808, KEY_UP },
+       { 0x0804, KEY_DOWN },
+       { 0x0818, KEY_LEFT },
+       { 0x0810, KEY_RIGHT },
+       { 0x0825, KEY_ENTER },            /* enter */
+
+       { 0x0822, KEY_EXIT },             /* back */
+       { 0x082c, KEY_AB },               /* recall */
+
+       { 0x0820, KEY_AUDIO },            /* TV audio */
+       { 0x0837, KEY_SCREEN },           /* snapshot */
+       { 0x082e, KEY_ZOOM },             /* full screen */
+       { 0x0802, KEY_MUTE },             /* mute */
+
+       { 0x0831, KEY_REWIND },           /* backward << */
+       { 0x0811, KEY_RECORD },           /* recording */
+       { 0x0809, KEY_STOP },
+       { 0x0805, KEY_FASTFORWARD },      /* forward >> */
+       { 0x0821, KEY_PREVIOUS },         /* rew */
+       { 0x081a, KEY_PAUSE },            /* pause */
+       { 0x0839, KEY_PLAY },             /* play */
+       { 0x0819, KEY_NEXT },             /* forward */
+};
+
+static struct rc_map_list asus_ps3_100_map = {
+.map = {
+       .scan    = asus_ps3_100,
+       .size    = ARRAY_SIZE(asus_ps3_100),
+       .rc_type = RC_TYPE_RC5,
+       .name    = RC_MAP_ASUS_PS3_100,
+}
+};
+
+static int __init init_rc_map_asus_ps3_100(void)
+{
+return rc_map_register(&asus_ps3_100_map);
+}
+
+static void __exit exit_rc_map_asus_ps3_100(void)
+{
+rc_map_unregister(&asus_ps3_100_map);
+}
+
+module_init(init_rc_map_asus_ps3_100)
+module_exit(exit_rc_map_asus_ps3_100)
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
index 53aae5968ffb7a2fa5ece96741d2b1b5c7c79686..0d3cfcf7a1fdf8d7639c8e04333c35212fee1784 100644 (file)
@@ -5080,6 +5080,36 @@ struct saa7134_board saa7134_boards[] = {
                        .gpio = 0x0200000,
                },
        },
+       [SAA7134_BOARD_ASUSTeK_PS3_100] = {
+               .name           = "Asus My Cinema PS3-100",
+               .audio_clock    = 0x00187de7,
+               .tuner_type     = TUNER_PHILIPS_TDA8290,
+               .radio_type     = UNSET,
+               .tuner_addr     = ADDR_UNSET,
+               .radio_addr     = ADDR_UNSET,
+               .tuner_config   = 2,
+               .gpiomask       = 1 << 21,
+               .mpeg           = SAA7134_MPEG_DVB,
+               .inputs         = {{
+                       .name = name_tv,
+                       .vmux = 1,
+                       .amux = TV,
+                       .tv   = 1,
+               }, {
+                       .name = name_comp,
+                       .vmux = 0,
+                       .amux = LINE2,
+               }, {
+                       .name = name_svideo,
+                       .vmux = 8,
+                       .amux = LINE2,
+               } },
+               .radio = {
+                       .name = name_radio,
+                       .amux = TV,
+                       .gpio = 0x0200000,
+               },
+       },
        [SAA7134_BOARD_REAL_ANGEL_220] = {
                .name           = "Zogis Real Angel 220",
                .audio_clock    = 0x00187de7,
@@ -6875,6 +6905,18 @@ struct pci_device_id saa7134_pci_tbl[] = {
                .subvendor    = 0x1043,
                .subdevice    = 0x4878, /* REV:1.02G */
                .driver_data  = SAA7134_BOARD_ASUSTeK_TIGER_3IN1,
+       }, {
+               .vendor       = PCI_VENDOR_ID_PHILIPS,
+               .device       = PCI_DEVICE_ID_PHILIPS_SAA7133,
+               .subvendor    = 0x1043,
+               .subdevice    = 0x48cd,
+               .driver_data  = SAA7134_BOARD_ASUSTeK_PS3_100,
+       }, {
+               .vendor       = PCI_VENDOR_ID_PHILIPS,
+               .device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
+               .subvendor    = 0x17de,
+               .subdevice    = 0x7128,
+               .driver_data  = SAA7134_BOARD_ASUSTeK_TIGER_3IN1,
        }, {
                .vendor       = PCI_VENDOR_ID_PHILIPS,
                .device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
@@ -7347,6 +7389,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
        case SAA7134_BOARD_KWORLD_TERMINATOR:
        case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS:
        case SAA7134_BOARD_FLYDVBT_LR301:
+       case SAA7134_BOARD_ASUSTeK_PS3_100:
        case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
        case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
        case SAA7134_BOARD_ASUSTeK_P7131_ANALOG:
@@ -7811,6 +7854,14 @@ int saa7134_board_init2(struct saa7134_dev *dev)
                i2c_transfer(&dev->i2c_adap, &msg, 1);
                break;
        }
+       case SAA7134_BOARD_ASUSTeK_PS3_100:
+       {
+               u8 data[] = { 0x3c, 0x33, 0x60};
+               struct i2c_msg msg = {.addr = 0x0b, .flags = 0, .buf = data,
+                                                      .len = sizeof(data)};
+               i2c_transfer(&dev->i2c_adap, &msg, 1);
+               break;
+       }
        case SAA7134_BOARD_FLYDVB_TRIO:
        {
                u8 temp = 0;
index aaa5c97a7216f21cd6c4a1ef255768dff39b6c42..5dfd826d734e82cffb9c791b790b5c9d8d373a36 100644 (file)
@@ -881,6 +881,20 @@ static struct tda1004x_config asus_tiger_3in1_config = {
        .request_firmware = philips_tda1004x_request_firmware
 };
 
+static struct tda1004x_config asus_ps3_100_config = {
+       .demod_address = 0x0b,
+       .invert        = 1,
+       .invert_oclk   = 0,
+       .xtal_freq     = TDA10046_XTAL_16M,
+       .agc_config    = TDA10046_AGC_TDA827X,
+       .gpio_config   = TDA10046_GP11_I,
+       .if_freq       = TDA10046_FREQ_045,
+       .i2c_gate      = 0x4b,
+       .tuner_address = 0x61,
+       .antenna_switch = 1,
+       .request_firmware = philips_tda1004x_request_firmware
+};
+
 /* ------------------------------------------------------------------
  * special case: this card uses saa713x GPIO22 for the mode switch
  */
@@ -1647,6 +1661,31 @@ static int dvb_init(struct saa7134_dev *dev)
                                                &dev->i2c_adap, 0, 0) == NULL) {
                                        wprintk("%s: Asus Tiger 3in1, no lnbp21"
                                                " found!\n", __func__);
+                                      goto dettach_frontend;
+                              }
+                      }
+              }
+              break;
+       case SAA7134_BOARD_ASUSTeK_PS3_100:
+               if (!use_frontend) {     /* terrestrial */
+                       if (configure_tda827x_fe(dev, &asus_ps3_100_config,
+                                                &tda827x_cfg_2) < 0)
+                               goto dettach_frontend;
+              } else {                /* satellite */
+                       fe0->dvb.frontend = dvb_attach(tda10086_attach,
+                                                      &flydvbs, &dev->i2c_adap);
+                       if (fe0->dvb.frontend) {
+                               if (dvb_attach(tda826x_attach,
+                                              fe0->dvb.frontend, 0x60,
+                                              &dev->i2c_adap, 0) == NULL) {
+                                       wprintk("%s: Asus My Cinema PS3-100, no "
+                                               "tda826x found!\n", __func__);
+                                       goto dettach_frontend;
+                               }
+                               if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
+                                              &dev->i2c_adap, 0, 0) == NULL) {
+                                       wprintk("%s: Asus My Cinema PS3-100, no lnbp21"
+                                               " found!\n", __func__);
                                        goto dettach_frontend;
                                }
                        }
index 48d2878699b750fe4c94ebc449797765e1d762f2..05c6e217d8a7fc8d39c691cc5c4fc171e1022491 100644 (file)
@@ -753,6 +753,13 @@ int saa7134_input_init1(struct saa7134_dev *dev)
                mask_keycode = 0xffff;
                raw_decode   = true;
                break;
+       case SAA7134_BOARD_ASUSTeK_PS3_100:
+               ir_codes     = RC_MAP_ASUS_PS3_100;
+               mask_keydown = 0x0040000;
+               mask_keyup   = 0x0040000;
+               mask_keycode = 0xffff;
+               raw_decode   = true;
+               break;
        case SAA7134_BOARD_ENCORE_ENLTV:
        case SAA7134_BOARD_ENCORE_ENLTV_FM:
                ir_codes     = RC_MAP_ENCORE_ENLTV;
index f625060e6a0f5df59f8a4c02227e821cfcc0b55b..89c8333736a28706a0c0e6ce42ef597921643f45 100644 (file)
@@ -332,6 +332,7 @@ struct saa7134_card_ir {
 #define SAA7134_BOARD_BEHOLD_503FM          187
 #define SAA7134_BOARD_SENSORAY811_911       188
 #define SAA7134_BOARD_KWORLD_PC150U         189
+#define SAA7134_BOARD_ASUSTeK_PS3_100      190
 
 #define SAA7134_MAXBOARDS 32
 #define SAA7134_INPUT_MAX 8
index 2e0f67db666f7784b71bfad92b24a030957b93fd..cfd5163ff7f3dc7dfb95cbe4ac8b00141a0cd9db 100644 (file)
@@ -62,6 +62,7 @@ void rc_map_init(void);
 #define RC_MAP_ANYSEE                    "rc-anysee"
 #define RC_MAP_APAC_VIEWCOMP             "rc-apac-viewcomp"
 #define RC_MAP_ASUS_PC39                 "rc-asus-pc39"
+#define RC_MAP_ASUS_PS3_100              "rc-asus-ps3-100"
 #define RC_MAP_ATI_TV_WONDER_HD_600      "rc-ati-tv-wonder-hd-600"
 #define RC_MAP_ATI_X10                   "rc-ati-x10"
 #define RC_MAP_AVERMEDIA_A16D            "rc-avermedia-a16d"