]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge tag 'v3.2-rc2' into staging/for_v3.3
authorMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 23 Nov 2011 21:42:09 +0000 (19:42 -0200)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 23 Nov 2011 21:42:09 +0000 (19:42 -0200)
* tag 'v3.2-rc2': (3068 commits)
  Linux 3.2-rc2
  hfs: add sanity check for file name length
  fsl-rio: fix compile error
  blackfin: Fixup export.h includes
  Blackfin: add serial TX IRQ in individual platform resource
  virtio-pci: fix use after free
  ACPI / cpuidle: Remove acpi_idle_suspend (to fix suspend regression)
  drm/radeon/kms/combios: fix dynamic allocation of PM clock modes
  [CPUFREQ] db8500: fix build error due to undeclared i variable
  bma023: Add SFI translation for this device
  vrtc: change its year offset from 1960 to 1972
  ce4100: fix a build error
  arm/imx: fix imx6q mmc error when mounting rootfs
  arm/imx: fix AUTO_ZRELADDR selection
  arm/imx: fix the references to ARCH_MX3
  ARM: mx51/53: set pwm clock parent to ipg_perclk
  btrfs: rename the option to nospace_cache
  drm/radeon/kms/pm: switch to dynamically allocating clock mode array
  drm/radeon/kms: optimize r600_pm_profile_init
  drm/radeon/kms/pm: add a proper pm profile init function for fusion
  ...

Conflicts:
drivers/media/radio/Kconfig

94 files changed:
Documentation/DocBook/media/dvb/dvbproperty.xml
Documentation/dvb/get_dvb_firmware
Documentation/video4linux/CARDLIST.bttv
Documentation/video4linux/CARDLIST.cx23885
Documentation/video4linux/CARDLIST.cx88
Documentation/video4linux/CARDLIST.em28xx
Documentation/video4linux/CARDLIST.saa7134
Documentation/video4linux/CARDLIST.saa7164
drivers/media/common/tuners/mxl5007t.c
drivers/media/common/tuners/tda18212.c
drivers/media/common/tuners/tda18212.h
drivers/media/common/tuners/tda18271-fe.c
drivers/media/common/tuners/tda18271-priv.h
drivers/media/common/tuners/tuner-simple.c
drivers/media/common/tuners/xc5000.c
drivers/media/dvb/dvb-core/dvb_frontend.c
drivers/media/dvb/dvb-usb/Kconfig
drivers/media/dvb/dvb-usb/anysee.c
drivers/media/dvb/dvb-usb/anysee.h
drivers/media/dvb/dvb-usb/dvb-usb-ids.h
drivers/media/dvb/dvb-usb/it913x.c
drivers/media/dvb/dvb-usb/mxl111sf-tuner.c
drivers/media/dvb/dvb-usb/ttusb2.c
drivers/media/dvb/frontends/au8522_dig.c
drivers/media/dvb/frontends/drxk.h
drivers/media/dvb/frontends/drxk_hard.c
drivers/media/dvb/frontends/it913x-fe-priv.h
drivers/media/dvb/frontends/it913x-fe.c
drivers/media/dvb/frontends/it913x-fe.h
drivers/media/dvb/frontends/s5h1409.c
drivers/media/dvb/frontends/s5h1411.c
drivers/media/dvb/frontends/tda18271c2dd.c
drivers/media/radio/Kconfig
drivers/media/rc/Kconfig
drivers/media/rc/Makefile
drivers/media/rc/ir-nec-decoder.c
drivers/media/rc/ir-raw.c
drivers/media/rc/ir-sanyo-decoder.c [new file with mode: 0644]
drivers/media/rc/keymaps/rc-hauppauge.c
drivers/media/rc/rc-core-priv.h
drivers/media/rc/rc-main.c
drivers/media/video/Kconfig
drivers/media/video/Makefile
drivers/media/video/adv7170.c
drivers/media/video/atmel-isi.c
drivers/media/video/bt8xx/bt848.h
drivers/media/video/bt8xx/bttv-cards.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/bt8xx/bttv.h
drivers/media/video/cx88/Kconfig
drivers/media/video/davinci/vpbe_display.c
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/em28xx/em28xx-dvb.c
drivers/media/video/em28xx/em28xx-input.c
drivers/media/video/em28xx/em28xx.h
drivers/media/video/mt9m001.c
drivers/media/video/mt9m111.c
drivers/media/video/mt9p031.c
drivers/media/video/mt9t001.c
drivers/media/video/mt9t031.c
drivers/media/video/mt9v022.c
drivers/media/video/mt9v032.c
drivers/media/video/omap/omap_vout.c
drivers/media/video/omap/omap_voutdef.h
drivers/media/video/s5p-g2d/Makefile [new file with mode: 0644]
drivers/media/video/s5p-g2d/g2d-hw.c [new file with mode: 0644]
drivers/media/video/s5p-g2d/g2d-regs.h [new file with mode: 0644]
drivers/media/video/s5p-g2d/g2d.c [new file with mode: 0644]
drivers/media/video/s5p-g2d/g2d.h [new file with mode: 0644]
drivers/media/video/saa7134/saa7134-cards.c
drivers/media/video/saa7134/saa7134.h
drivers/media/video/tvp5150.c
drivers/media/video/usbvision/usbvision-i2c.c
drivers/media/video/via-camera.c
drivers/staging/media/as102/Kconfig
drivers/staging/media/as102/Makefile
drivers/staging/media/as102/as102_drv.c
drivers/staging/media/as102/as102_drv.h
drivers/staging/media/as102/as102_fe.c
drivers/staging/media/as102/as102_fw.c
drivers/staging/media/as102/as102_fw.h
drivers/staging/media/as102/as102_usb_drv.c
drivers/staging/media/as102/as102_usb_drv.h
drivers/staging/media/as102/as10x_cmd.c
drivers/staging/media/as102/as10x_cmd.h
drivers/staging/media/as102/as10x_cmd_cfg.c
drivers/staging/media/as102/as10x_cmd_stream.c
drivers/staging/media/as102/as10x_handle.h
drivers/staging/media/as102/as10x_types.h
drivers/staging/media/solo6x10/Makefile
drivers/staging/media/solo6x10/solo6x10-jpeg.h [moved from drivers/staging/media/solo6x10/jpeg.h with 100% similarity]
drivers/staging/media/solo6x10/v4l2-enc.c
include/linux/dvb/frontend.h
include/media/rc-map.h

index 3bc8a61efe301a4b32bd89862efd28219e9315c4..6ac803959a479438e3807513b3ad6f8a2c3dfd1a 100644 (file)
@@ -311,6 +311,8 @@ typedef enum fe_rolloff {
        ROLLOFF_20,
        ROLLOFF_25,
        ROLLOFF_AUTO,
+       ROLLOFF_15, /* DVB-C Annex A */
+       ROLLOFF_13, /* DVB-C Annex C */
 } fe_rolloff_t;
                </programlisting>
                </section>
@@ -778,8 +780,10 @@ typedef enum fe_hierarchy {
                        <listitem><para><link linkend="DTV-MODULATION"><constant>DTV_MODULATION</constant></link></para></listitem>
                        <listitem><para><link linkend="DTV-INVERSION"><constant>DTV_INVERSION</constant></link></para></listitem>
                        <listitem><para><link linkend="DTV-SYMBOL-RATE"><constant>DTV_SYMBOL_RATE</constant></link></para></listitem>
+                       <listitem><para><link linkend="DTV-ROLLOFF"><constant>DTV_ROLLOFF</constant></link></para></listitem>
                        <listitem><para><link linkend="DTV-INNER-FEC"><constant>DTV_INNER_FEC</constant></link></para></listitem>
                </itemizedlist>
+               <para>The Rolloff of 0.15 (ROLLOFF_15) is assumed, as ITU-T J.83 Annex A is more common. For Annex C, rolloff should be 0.13 (ROLLOFF_13). All other values are invalid.</para>
        </section>
        <section id="dvbc-annex-b-params">
                <title>DVB-C Annex B delivery system</title>
index e67be7afc78b481d4dc42553bc555690e34c898e..0f15ab7524cdfc301d8b256e8fcba028704b57ec 100755 (executable)
@@ -27,8 +27,8 @@ use IO::Handle;
                "or51211", "or51132_qam", "or51132_vsb", "bluebird",
                "opera1", "cx231xx", "cx18", "cx23885", "pvrusb2", "mpc718",
                "af9015", "ngene", "az6027", "lme2510_lg", "lme2510c_s7395",
-               "lme2510c_s7395_old", "drxk", "drxk_terratec_h5", "tda10071",
-               "it9135" );
+               "lme2510c_s7395_old", "drxk", "drxk_terratec_h5",
+               "drxk_hauppauge_hvr930c", "tda10071", "it9135" );
 
 # Check args
 syntax() if (scalar(@ARGV) != 1);
@@ -644,6 +644,24 @@ sub drxk {
     "$fwfile"
 }
 
+sub drxk_hauppauge_hvr930c {
+    my $url = "http://www.wintvcd.co.uk/drivers/";
+    my $zipfile = "HVR-9x0_5_10_325_28153_SIGNED.zip";
+    my $hash = "83ab82e7e9480ec8bf1ae0155ca63c88";
+    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
+    my $drvfile = "HVR-900/emOEM.sys";
+    my $fwfile = "dvb-usb-hauppauge-hvr930c-drxk.fw";
+
+    checkstandard();
+
+    wgetfile($zipfile, $url . $zipfile);
+    verify($zipfile, $hash);
+    unzip($zipfile, $tmpdir);
+    extract("$tmpdir/$drvfile", 0x117b0, 42692, "$fwfile");
+
+    "$fwfile"
+}
+
 sub drxk_terratec_h5 {
     my $url = "http://www.linuxtv.org/downloads/firmware/";
     my $hash = "19000dada8e2741162ccc50cc91fa7f1";
index 4739d568430599002d61d163be47a4be9e7a9f23..8948da46a2548f1a1bc1bb2920f9636d5263d261 100644 (file)
@@ -71,7 +71,7 @@
  70 -> Prolink Pixelview PV-BT878P+ (Rev.4C,8E)
  71 -> Lifeview FlyVideo 98EZ (capture only) LR51          [1851:1851]
  72 -> Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM) [1554:4011]
- 73 -> Sensoray 311                                        [6000:0311]
+ 73 -> Sensoray 311/611                                    [6000:0311,6000:0611]
  74 -> RemoteVision MX (RV605)
  75 -> Powercolor MTV878/ MTV878R/ MTV878F
  76 -> Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP) [0e11:0079]
index 8910449d23a8e355cc1fc86dd400638224166fc4..99acaa344fea28b3885da735f8350c8318046c13 100644 (file)
@@ -29,3 +29,5 @@
  28 -> LEADTEK WinFast PxTV1200                            [107d:6f22]
  29 -> GoTView X5 3D Hybrid                                [5654:2390]
  30 -> NetUP Dual DVB-T/C-CI RF                            [1b55:e2e4]
+ 31 -> Leadtek Winfast PxDVR3200 H XC4000                  [107d:6f39]
+ 32 -> MPX-885
index d9c0f119196d0f2ef15dc1f3a70e40fd46e3524b..eee18e6962b6c9ae54a830dbcf8ad14b54bc742b 100644 (file)
@@ -85,3 +85,5 @@
  84 -> Samsung SMT 7020 DVB-S                              [18ac:dc00,18ac:dccd]
  85 -> Twinhan VP-1027 DVB-S                               [1822:0023]
  86 -> TeVii S464 DVB-S/S2                                 [d464:9022]
+ 87 -> Leadtek WinFast DTV2000 H PLUS                      [107d:6f42]
+ 88 -> Leadtek WinFast DTV1800 H (XC4000)                  [107d:6f38]
index 4a7b3df6d8bd7695a0cee2417d3d849b43912345..7734b2cf08102b86c82dfd4c31cb16bb0012d6a5 100644 (file)
@@ -11,7 +11,7 @@
  10 -> Hauppauge WinTV HVR 900                  (em2880)        [2040:6500]
  11 -> Terratec Hybrid XS                       (em2880)
  12 -> Kworld PVR TV 2800 RF                    (em2820/em2840)
- 13 -> Terratec Prodigy XS                      (em2880)        [0ccd:0047]
+ 13 -> Terratec Prodigy XS                      (em2880)
  14 -> SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0 (em2820/em2840)
  15 -> V-Gear PocketTV                          (em2800)
  16 -> Hauppauge WinTV HVR 950                  (em2883)        [2040:6513,2040:6517,2040:651b]
@@ -64,7 +64,7 @@
  64 -> Easy Cap Capture DC-60                   (em2860)
  65 -> IO-DATA GV-MVP/SZ                        (em2820/em2840) [04bb:0515]
  66 -> Empire dual TV                           (em2880)
- 67 -> Terratec Grabby                          (em2860)        [0ccd:0096]
+ 67 -> Terratec Grabby                          (em2860)        [0ccd:0096,0ccd:10AF]
  68 -> Terratec AV350                           (em2860)        [0ccd:0084]
  69 -> KWorld ATSC 315U HDTV TV Box             (em2882)        [eb1a:a313]
  70 -> Evga inDtube                             (em2882)
@@ -76,3 +76,5 @@
  76 -> KWorld PlusTV 340U or UB435-Q (ATSC)     (em2870)        [1b80:a340]
  77 -> EM2874 Leadership ISDBT                  (em2874)
  78 -> PCTV nanoStick T2 290e                   (em28174)
+ 79 -> Terratec Cinergy H5                      (em2884)        [0ccd:10a2,0ccd:10ad]
+ 80 -> PCTV DVB-S2 Stick (460e)                 (em28174)
index 7efae9bd73eda9445ce6db29c079a20510d53a49..e7ef38a19859964f922aef707ab4f254b9ab8a22 100644 (file)
 185 -> MagicPro ProHDTV Pro2 DMB-TH/Hybrid      [17de:d136]
 186 -> Beholder BeholdTV 501                    [5ace:5010]
 187 -> Beholder BeholdTV 503 FM                 [5ace:5030]
+188 -> Sensoray 811/911                         [6000:0811,6000:0911]
index 152bd7b781ca51b5ceded74bb121642c50f8783b..2205e8d55537ccaf69395eed7540ae46149cec9e 100644 (file)
@@ -7,3 +7,5 @@
   6 -> Hauppauge WinTV-HVR2200                             [0070:8901]
   7 -> Hauppauge WinTV-HVR2250                             [0070:8891,0070:8851]
   8 -> Hauppauge WinTV-HVR2250                             [0070:88A1]
+  9 -> Hauppauge WinTV-HVR2200                             [0070:8940]
+ 10 -> Hauppauge WinTV-HVR2200                             [0070:8953]
index 7eb1bf75cd072ae634b816a8a496ccfd8a559127..2f0e550ad93545a5322ca744ff12e7865db025b5 100644 (file)
@@ -165,6 +165,8 @@ struct mxl5007t_state {
        struct reg_pair_t tab_init_cable[ARRAY_SIZE(init_tab_cable)];
        struct reg_pair_t tab_rftune[ARRAY_SIZE(reg_pair_rftune)];
 
+       enum mxl5007t_if_freq if_freq;
+
        u32 frequency;
        u32 bandwidth;
 };
@@ -286,6 +288,8 @@ static void mxl5007t_set_if_freq_bits(struct mxl5007t_state *state,
        /* set inverted IF or normal IF */
        set_reg_bits(state->tab_init, 0x02, 0x10, invert_if ? 0x10 : 0x00);
 
+       state->if_freq = if_freq;
+
        return;
 }
 
@@ -737,6 +741,50 @@ static int mxl5007t_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
        return 0;
 }
 
+static int mxl5007t_get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
+{
+       struct mxl5007t_state *state = fe->tuner_priv;
+
+       *frequency = 0;
+
+       switch (state->if_freq) {
+       case MxL_IF_4_MHZ:
+               *frequency = 4000000;
+               break;
+       case MxL_IF_4_5_MHZ:
+               *frequency = 4500000;
+               break;
+       case MxL_IF_4_57_MHZ:
+               *frequency = 4570000;
+               break;
+       case MxL_IF_5_MHZ:
+               *frequency = 5000000;
+               break;
+       case MxL_IF_5_38_MHZ:
+               *frequency = 5380000;
+               break;
+       case MxL_IF_6_MHZ:
+               *frequency = 6000000;
+               break;
+       case MxL_IF_6_28_MHZ:
+               *frequency = 6280000;
+               break;
+       case MxL_IF_9_1915_MHZ:
+               *frequency = 9191500;
+               break;
+       case MxL_IF_35_25_MHZ:
+               *frequency = 35250000;
+               break;
+       case MxL_IF_36_15_MHZ:
+               *frequency = 36150000;
+               break;
+       case MxL_IF_44_MHZ:
+               *frequency = 44000000;
+               break;
+       }
+       return 0;
+}
+
 static int mxl5007t_release(struct dvb_frontend *fe)
 {
        struct mxl5007t_state *state = fe->tuner_priv;
@@ -766,6 +814,7 @@ static struct dvb_tuner_ops mxl5007t_tuner_ops = {
        .get_frequency     = mxl5007t_get_frequency,
        .get_bandwidth     = mxl5007t_get_bandwidth,
        .release           = mxl5007t_release,
+       .get_if_frequency  = mxl5007t_get_if_frequency,
 };
 
 static int mxl5007t_get_chip_id(struct mxl5007t_state *state)
index e29cc2bc113a91604f03b009a7f2877dd4a7d0e2..6374a1e010bff36b5b69277e1f3e79579cd9f10d 100644 (file)
@@ -136,12 +136,24 @@ static int tda18212_set_params(struct dvb_frontend *fe,
        int ret, i;
        u32 if_khz;
        u8 buf[9];
+       #define DVBT_6   0
+       #define DVBT_7   1
+       #define DVBT_8   2
+       #define DVBT2_6  3
+       #define DVBT2_7  4
+       #define DVBT2_8  5
+       #define DVBC_6   6
+       #define DVBC_8   7
        static const u8 bw_params[][3] = {
-               /*  0f    13    23 */
-               { 0xb3, 0x20, 0x03 }, /* DVB-T 6 MHz */
-               { 0xb3, 0x31, 0x01 }, /* DVB-T 7 MHz */
-               { 0xb3, 0x22, 0x01 }, /* DVB-T 8 MHz */
-               { 0x92, 0x53, 0x03 }, /* DVB-C */
+                    /* reg:   0f    13    23 */
+               [DVBT_6]  = { 0xb3, 0x20, 0x03 },
+               [DVBT_7]  = { 0xb3, 0x31, 0x01 },
+               [DVBT_8]  = { 0xb3, 0x22, 0x01 },
+               [DVBT2_6] = { 0xbc, 0x20, 0x03 },
+               [DVBT2_7] = { 0xbc, 0x72, 0x03 },
+               [DVBT2_8] = { 0xbc, 0x22, 0x01 },
+               [DVBC_6]  = { 0x92, 0x50, 0x03 },
+               [DVBC_8]  = { 0x92, 0x53, 0x03 },
        };
 
        dbg("delsys=%d RF=%d BW=%d\n",
@@ -155,15 +167,34 @@ static int tda18212_set_params(struct dvb_frontend *fe,
                switch (c->bandwidth_hz) {
                case 6000000:
                        if_khz = priv->cfg->if_dvbt_6;
-                       i = 0;
+                       i = DVBT_6;
                        break;
                case 7000000:
                        if_khz = priv->cfg->if_dvbt_7;
-                       i = 1;
+                       i = DVBT_7;
                        break;
                case 8000000:
                        if_khz = priv->cfg->if_dvbt_8;
-                       i = 2;
+                       i = DVBT_8;
+                       break;
+               default:
+                       ret = -EINVAL;
+                       goto error;
+               }
+               break;
+       case SYS_DVBT2:
+               switch (c->bandwidth_hz) {
+               case 6000000:
+                       if_khz = priv->cfg->if_dvbt2_6;
+                       i = DVBT2_6;
+                       break;
+               case 7000000:
+                       if_khz = priv->cfg->if_dvbt2_7;
+                       i = DVBT2_7;
+                       break;
+               case 8000000:
+                       if_khz = priv->cfg->if_dvbt2_8;
+                       i = DVBT2_8;
                        break;
                default:
                        ret = -EINVAL;
@@ -172,7 +203,7 @@ static int tda18212_set_params(struct dvb_frontend *fe,
                break;
        case SYS_DVBC_ANNEX_AC:
                if_khz = priv->cfg->if_dvbc;
-               i = 3;
+               i = DVBC_8;
                break;
        default:
                ret = -EINVAL;
index 83b497f59e1b2e16b2a214bb4b6b06ec882778da..9bd5da4aabb7b032e13e6dc2ad7633d8d21b6971 100644 (file)
@@ -29,6 +29,10 @@ struct tda18212_config {
        u16 if_dvbt_6;
        u16 if_dvbt_7;
        u16 if_dvbt_8;
+       u16 if_dvbt2_5;
+       u16 if_dvbt2_6;
+       u16 if_dvbt2_7;
+       u16 if_dvbt2_8;
        u16 if_dvbc;
 };
 
index 63cc4004e211e9654044b612400460bb93832bf9..3347c5b488dd41dd1b3116ab8867a1ed9d982f40 100644 (file)
@@ -994,6 +994,7 @@ static int tda18271_set_params(struct dvb_frontend *fe,
        if (tda_fail(ret))
                goto fail;
 
+       priv->if_freq   = map->if_freq;
        priv->frequency = freq;
        priv->bandwidth = (fe->ops.info.type == FE_OFDM) ?
                params->u.ofdm.bandwidth : 0;
@@ -1050,6 +1051,7 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe,
        if (tda_fail(ret))
                goto fail;
 
+       priv->if_freq   = map->if_freq;
        priv->frequency = freq;
        priv->bandwidth = 0;
 fail:
@@ -1086,6 +1088,13 @@ static int tda18271_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
        return 0;
 }
 
+static int tda18271_get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
+{
+       struct tda18271_priv *priv = fe->tuner_priv;
+       *frequency = (u32)priv->if_freq * 1000;
+       return 0;
+}
+
 /* ------------------------------------------------------------------ */
 
 #define tda18271_update_std(std_cfg, name) do {                                \
@@ -1245,6 +1254,7 @@ static const struct dvb_tuner_ops tda18271_tuner_ops = {
        .set_config        = tda18271_set_config,
        .get_frequency     = tda18271_get_frequency,
        .get_bandwidth     = tda18271_get_bandwidth,
+       .get_if_frequency  = tda18271_get_if_frequency,
 };
 
 struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
index 94340f47562bbe36c01a5035a0633ff1c2149c72..454c152ccaa023d66423591108ca16616c058660 100644 (file)
@@ -122,6 +122,8 @@ struct tda18271_priv {
 
        struct mutex lock;
 
+       u16 if_freq;
+
        u32 frequency;
        u32 bandwidth;
 };
index f8ee29e6059c982e8e8ddce5cd0cbe28d78b58ed..4092200c148eb92b26c020c88ac596ef4d1d0493 100644 (file)
@@ -751,6 +751,17 @@ static int simple_set_radio_freq(struct dvb_frontend *fe,
        if (4 != rc)
                tuner_warn("i2c i/o error: rc == %d (should be 4)\n", rc);
 
+       /* Write AUX byte */
+       switch (priv->type) {
+       case TUNER_PHILIPS_FM1216ME_MK3:
+               buffer[2] = 0x98;
+               buffer[3] = 0x20; /* set TOP AGC */
+               rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 4);
+               if (4 != rc)
+                       tuner_warn("i2c i/o error: rc == %d (should be 4)\n", rc);
+               break;
+       }
+
        return 0;
 }
 
index aa1b2e844d3206b8c2bcc96ddaab3f583f7e2739..048f48944aa15de22451cb4c73526a052b2e5e84 100644 (file)
@@ -628,20 +628,12 @@ static void xc_debug_dump(struct xc5000_priv *priv)
        dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);
 }
 
-/*
- * As defined on EN 300 429, the DVB-C roll-off factor is 0.15.
- * So, the amount of the needed bandwith is given by:
- *     Bw = Symbol_rate * (1 + 0.15)
- * As such, the maximum symbol rate supported by 6 MHz is given by:
- *     max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds
- */
-#define MAX_SYMBOL_RATE_6MHz   5217391
-
 static int xc5000_set_params(struct dvb_frontend *fe,
        struct dvb_frontend_parameters *params)
 {
        struct xc5000_priv *priv = fe->tuner_priv;
        int ret;
+       u32 bw;
 
        if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
                if (xc_load_fw_and_init_tuner(fe) != XC_RESULT_SUCCESS) {
@@ -707,11 +699,19 @@ static int xc5000_set_params(struct dvb_frontend *fe,
                        dprintk(1, "%s() QAM modulation\n", __func__);
                        priv->rf_mode = XC_RF_MODE_CABLE;
                        /*
-                        * Using a 8MHz bandwidth sometimes fail
-                        * with 6MHz-spaced channels, due to inter-carrier
-                        * interference. So, use DTV6 firmware
+                        * Using a higher bandwidth at the tuner filter may
+                        * allow inter-carrier interference.
+                        * So, determine the minimal channel spacing, in order
+                        * to better adjust the tuner filter.
+                        * According with ITU-T J.83, the bandwidth is given by:
+                        * bw = Simbol Rate * (1 + roll_off), where the roll_off
+                        * is equal to 0.15 for Annex A, and 0.13 for annex C
                         */
-                       if (params->u.qam.symbol_rate <= MAX_SYMBOL_RATE_6MHz) {
+                       if (fe->dtv_property_cache.rolloff == ROLLOFF_13)
+                               bw = (params->u.qam.symbol_rate * 13) / 10;
+                       else
+                               bw = (params->u.qam.symbol_rate * 15) / 10;
+                       if (bw <= 6000000) {
                                priv->bandwidth = BANDWIDTH_6_MHZ;
                                priv->video_standard = DTV6;
                                priv->freq_hz = params->frequency - 1750000;
@@ -968,6 +968,14 @@ static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq)
        return 0;
 }
 
+static int xc5000_get_if_frequency(struct dvb_frontend *fe, u32 *freq)
+{
+       struct xc5000_priv *priv = fe->tuner_priv;
+       dprintk(1, "%s()\n", __func__);
+       *freq = priv->if_khz * 1000;
+       return 0;
+}
+
 static int xc5000_get_bandwidth(struct dvb_frontend *fe, u32 *bw)
 {
        struct xc5000_priv *priv = fe->tuner_priv;
@@ -996,6 +1004,8 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe)
        struct xc5000_priv *priv = fe->tuner_priv;
        int ret = 0;
 
+       mutex_lock(&xc5000_list_mutex);
+
        if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
                ret = xc5000_fwupload(fe);
                if (ret != XC_RESULT_SUCCESS)
@@ -1015,6 +1025,8 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe)
        /* Default to "CABLE" mode */
        ret |= xc_write_reg(priv, XREG_SIGNALSOURCE, XC_RF_MODE_CABLE);
 
+       mutex_unlock(&xc5000_list_mutex);
+
        return ret;
 }
 
@@ -1108,6 +1120,7 @@ static const struct dvb_tuner_ops xc5000_tuner_ops = {
        .set_params        = xc5000_set_params,
        .set_analog_params = xc5000_set_analog_params,
        .get_frequency     = xc5000_get_frequency,
+       .get_if_frequency  = xc5000_get_if_frequency,
        .get_bandwidth     = xc5000_get_bandwidth,
        .get_status        = xc5000_get_status
 };
index 2c0acdb4d81144b00b1381742505d18f208addb2..c849455458ea8d02f3f00a96b32ba83f00a57083 100644 (file)
@@ -876,6 +876,7 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
        c->symbol_rate = QAM_AUTO;
        c->code_rate_HP = FEC_AUTO;
        c->code_rate_LP = FEC_AUTO;
+       c->rolloff = ROLLOFF_AUTO;
 
        c->isdbt_partial_reception = -1;
        c->isdbt_sb_mode = -1;
@@ -1030,6 +1031,7 @@ static void dtv_property_cache_init(struct dvb_frontend *fe,
                break;
        case FE_QAM:
                c->delivery_system = SYS_DVBC_ANNEX_AC;
+               c->rolloff = ROLLOFF_15; /* implied for Annex A */
                break;
        case FE_OFDM:
                c->delivery_system = SYS_DVBT;
index 58257165761e1b016a58b30019a9388d395400b2..3e316f2f7de13b93b41f3b8bd1be1ee866c569cc 100644 (file)
@@ -311,6 +311,7 @@ config DVB_USB_ANYSEE
        select DVB_STV0900 if !DVB_FE_CUSTOMISE
        select DVB_STV6110 if !DVB_FE_CUSTOMISE
        select DVB_ISL6423 if !DVB_FE_CUSTOMISE
+       select DVB_CXD2820R if !DVB_FE_CUSTOMISE
        help
          Say Y here to support the Anysee E30, Anysee E30 Plus or
          Anysee E30 C Plus DVB USB2.0 receiver.
index 5f2278b73ee9c4375cea917d8bc45fd75e9827b7..c64eb56204dedc6c455fc013d56b3993260f834f 100644 (file)
@@ -41,6 +41,7 @@
 #include "stv0900.h"
 #include "stv6110.h"
 #include "isl6423.h"
+#include "cxd2820r.h"
 
 /* debug */
 static int dvb_usb_anysee_debug;
@@ -66,10 +67,12 @@ static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
        if (mutex_lock_interruptible(&anysee_usb_mutex) < 0)
                return -EAGAIN;
 
+       deb_xfer(">>> ");
+       debug_dump(buf, slen, deb_xfer);
+
        /* We need receive one message more after dvb_usb_generic_rw due
           to weird transaction flow, which is 1 x send + 2 x receive. */
        ret = dvb_usb_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
-
        if (!ret) {
                /* receive 2nd answer */
                ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
@@ -79,7 +82,10 @@ static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
                        err("%s: recv bulk message failed: %d", __func__, ret);
                else {
                        deb_xfer("<<< ");
-                       debug_dump(buf, act_len, deb_xfer);
+                       debug_dump(buf, rlen, deb_xfer);
+
+                       if (buf[63] != 0x4f)
+                               deb_info("%s: cmd failed\n", __func__);
                }
        }
 
@@ -129,6 +135,29 @@ static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
        return anysee_write_reg(d, reg, val);
 }
 
+/* read single register with mask */
+static int anysee_rd_reg_mask(struct dvb_usb_device *d, u16 reg, u8 *val,
+       u8 mask)
+{
+       int ret, i;
+       u8 tmp;
+
+       ret = anysee_read_reg(d, reg, &tmp);
+       if (ret)
+               return ret;
+
+       tmp &= mask;
+
+       /* find position of the first bit */
+       for (i = 0; i < 8; i++) {
+               if ((mask >> i) & 0x01)
+                       break;
+       }
+       *val = tmp >> i;
+
+       return 0;
+}
+
 static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
 {
        u8 buf[] = {CMD_GET_HW_INFO};
@@ -156,22 +185,6 @@ static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
        return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
 }
 
-static int anysee_init(struct dvb_usb_device *d)
-{
-       int ret;
-       /* LED light */
-       ret = anysee_led_ctrl(d, 0x01, 0x03);
-       if (ret)
-               return ret;
-
-       /* enable IR */
-       ret = anysee_ir_ctrl(d, 1);
-       if (ret)
-               return ret;
-
-       return 0;
-}
-
 /* I2C */
 static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
        int num)
@@ -297,7 +310,7 @@ static struct tda10023_config anysee_tda10023_tda18212_config = {
        .pll_m  = 12,
        .pll_p  = 3,
        .pll_n  = 1,
-       .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
+       .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_B,
        .deltaf = 0xba02,
 };
 
@@ -309,6 +322,17 @@ static struct tda18212_config anysee_tda18212_config = {
        .if_dvbc = 5000,
 };
 
+static struct tda18212_config anysee_tda18212_config2 = {
+       .i2c_address = 0x60 /* (0xc0 >> 1) */,
+       .if_dvbt_6 = 3550,
+       .if_dvbt_7 = 3700,
+       .if_dvbt_8 = 4150,
+       .if_dvbt2_6 = 3250,
+       .if_dvbt2_7 = 4000,
+       .if_dvbt2_8 = 4000,
+       .if_dvbc = 5000,
+};
+
 static struct cx24116_config anysee_cx24116_config = {
        .demod_address = (0xaa >> 1),
        .mpg_clk_pos_pol = 0x00,
@@ -339,6 +363,18 @@ static struct isl6423_config anysee_isl6423_config = {
        .addr = (0x10 >> 1),
 };
 
+static struct cxd2820r_config anysee_cxd2820r_config = {
+       .i2c_address = 0x6d, /* (0xda >> 1) */
+       .ts_mode = 0x38,
+       .if_dvbt_6 = 3550,
+       .if_dvbt_7 = 3700,
+       .if_dvbt_8 = 4150,
+       .if_dvbt2_6 = 3250,
+       .if_dvbt2_7 = 4000,
+       .if_dvbt2_8 = 4000,
+       .if_dvbc = 5000,
+};
+
 /*
  * New USB device strings: Mfr=1, Product=2, SerialNumber=0
  * Manufacturer: AMT.CO.KR
@@ -421,6 +457,14 @@ static struct isl6423_config anysee_isl6423_config = {
  * IOA[7] TS 1=enabled
  * IOE[5] STV0903 1=enabled
  *
+ * E7 T2C VID=1c73 PID=861f HW=20 FW=0.1 AMTCI=0.5 "anysee-E7T2C(LP)"
+ * PCB: 508T2C (rev0.3)
+ * parts: DNOQ44QCH106A(CXD2820R, TDA18212), TDA8024
+ * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
+ * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
+ * IOA[7] TS 1=enabled
+ * IOE[5] CXD2820R 1=enabled
+ *
  * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
  * PCB: 508PTC (rev0.5)
  * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
@@ -437,7 +481,7 @@ static struct isl6423_config anysee_isl6423_config = {
  * IOD[6] ZL10353 1=enabled
  * IOE[0] IF 0=enabled
  *
- * E7 S2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
+ * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
  * PCB: 508PS2 (rev0.4)
  * parts: DNBU10512IST(STV0903, STV6110), ISL6423
  * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
@@ -446,6 +490,16 @@ static struct isl6423_config anysee_isl6423_config = {
  * IOE[5] STV0903 1=enabled
  */
 
+
+/* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
+static int anysee_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
+{
+       struct dvb_usb_adapter *adap = fe->dvb->priv;
+
+       /* enable / disable tuner access on IOE[4] */
+       return anysee_wr_reg_mask(adap->dev, REG_IOE, (enable << 4), 0x10);
+}
+
 static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
 {
        struct dvb_usb_adapter *adap = fe->dvb->priv;
@@ -577,7 +631,8 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
        /* detect hardware only once */
        if (adap->fe_adap[0].fe == NULL) {
                /* Check which hardware we have.
-                * We must do this call two times to get reliable values (hw bug).
+                * We must do this call two times to get reliable values
+                * (hw/fw bug).
                 */
                ret = anysee_get_hw_info(adap->dev, hw_info);
                if (ret)
@@ -606,14 +661,14 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        break;
 
                /* attach demod */
-               adap->fe_adap[0].fe = dvb_attach(mt352_attach, &anysee_mt352_config,
-                       &adap->dev->i2c_adap);
+               adap->fe_adap[0].fe = dvb_attach(mt352_attach,
+                       &anysee_mt352_config, &adap->dev->i2c_adap);
                if (adap->fe_adap[0].fe)
                        break;
 
                /* attach demod */
-               adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
-                       &adap->dev->i2c_adap);
+               adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
+                       &anysee_zl10353_config, &adap->dev->i2c_adap);
 
                break;
        case ANYSEE_HW_507CD: /* 6 */
@@ -665,8 +720,8 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        goto error;
 
                /* attach demod */
-               adap->fe_adap[0].fe = dvb_attach(cx24116_attach, &anysee_cx24116_config,
-                       &adap->dev->i2c_adap);
+               adap->fe_adap[0].fe = dvb_attach(cx24116_attach,
+                       &anysee_cx24116_config, &adap->dev->i2c_adap);
 
                break;
        case ANYSEE_HW_507FA: /* 15 */
@@ -747,17 +802,19 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        }
                }
 
+               /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
+               if (tmp == 0xc7) {
+                       if (adap->fe_adap[state->fe_id].fe)
+                               adap->fe_adap[state->fe_id].fe->ops.i2c_gate_ctrl =
+                                       anysee_i2c_gate_ctrl;
+               }
+
                break;
        case ANYSEE_HW_508TC: /* 18 */
        case ANYSEE_HW_508PTC: /* 21 */
                /* E7 TC */
                /* E7 PTC */
 
-               /* enable transport stream on IOA[7] */
-               ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
-               if (ret)
-                       goto error;
-
                if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0)  {
                        /* disable DVB-T demod on IOD[6] */
                        ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
@@ -772,7 +829,8 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                                goto error;
 
                        /* attach demod */
-                       adap->fe_adap[state->fe_id].fe = dvb_attach(tda10023_attach,
+                       adap->fe_adap[state->fe_id].fe =
+                               dvb_attach(tda10023_attach,
                                &anysee_tda10023_tda18212_config,
                                &adap->dev->i2c_adap, 0x48);
                } else {
@@ -789,11 +847,19 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                                goto error;
 
                        /* attach demod */
-                       adap->fe_adap[state->fe_id].fe = dvb_attach(zl10353_attach,
+                       adap->fe_adap[state->fe_id].fe =
+                               dvb_attach(zl10353_attach,
                                &anysee_zl10353_tda18212_config,
                                &adap->dev->i2c_adap);
                }
 
+               /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
+               if (adap->fe_adap[state->fe_id].fe)
+                       adap->fe_adap[state->fe_id].fe->ops.i2c_gate_ctrl =
+                               anysee_i2c_gate_ctrl;
+
+               state->has_ci = true;
+
                break;
        case ANYSEE_HW_508S2: /* 19 */
        case ANYSEE_HW_508PS2: /* 22 */
@@ -803,19 +869,41 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                if (state->fe_id)
                        break;
 
-               /* enable transport stream on IOA[7] */
-               ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
+               /* enable DVB-S/S2 demod on IOE[5] */
+               ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
                if (ret)
                        goto error;
 
-               /* enable DVB-S/S2 demod on IOE[5] */
+               /* attach demod */
+               adap->fe_adap[0].fe = dvb_attach(stv0900_attach,
+                       &anysee_stv0900_config, &adap->dev->i2c_adap, 0);
+
+               state->has_ci = true;
+
+               break;
+       case ANYSEE_HW_508T2C: /* 20 */
+               /* E7 T2C */
+
+               /* enable DVB-T/T2/C demod on IOE[5] */
                ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
                if (ret)
                        goto error;
 
-               /* attach demod */
-               adap->fe_adap[0].fe = dvb_attach(stv0900_attach, &anysee_stv0900_config,
-                       &adap->dev->i2c_adap, 0);
+               if (state->fe_id == 0)  {
+                       /* DVB-T/T2 */
+                       adap->fe_adap[state->fe_id].fe =
+                               dvb_attach(cxd2820r_attach,
+                               &anysee_cxd2820r_config,
+                               &adap->dev->i2c_adap, NULL);
+               } else {
+                       /* DVB-C */
+                       adap->fe_adap[state->fe_id].fe =
+                               dvb_attach(cxd2820r_attach,
+                               &anysee_cxd2820r_config,
+                               &adap->dev->i2c_adap, adap->fe_adap[0].fe);
+               }
+
+               state->has_ci = true;
 
                break;
        }
@@ -842,24 +930,26 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E30 */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc2 >> 1),
-                       NULL, DVB_PLL_THOMSON_DTT7579);
+               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
+                       (0xc2 >> 1), NULL, DVB_PLL_THOMSON_DTT7579);
 
                break;
        case ANYSEE_HW_507CD: /* 6 */
                /* E30 Plus */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc2 >> 1),
-                       &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
+               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
+                       (0xc2 >> 1), &adap->dev->i2c_adap,
+                       DVB_PLL_THOMSON_DTT7579);
 
                break;
        case ANYSEE_HW_507DC: /* 10 */
                /* E30 C Plus */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc0 >> 1),
-                       &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
+               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
+                       (0xc0 >> 1), &adap->dev->i2c_adap,
+                       DVB_PLL_SAMSUNG_DTOS403IH102A);
 
                break;
        case ANYSEE_HW_507SI: /* 11 */
@@ -877,22 +967,12 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* Try first attach TDA18212 silicon tuner on IOE[4], if that
                 * fails attach old simple PLL. */
 
-               /* enable tuner on IOE[4] */
-               ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
-               if (ret)
-                       goto error;
-
                /* attach tuner */
                fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
                        &adap->dev->i2c_adap, &anysee_tda18212_config);
                if (fe)
                        break;
 
-               /* disable tuner on IOE[4] */
-               ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
-               if (ret)
-                       goto error;
-
                /* attach tuner */
                fe = dvb_attach(dvb_pll_attach, adap->fe_adap[state->fe_id].fe,
                        (0xc0 >> 1), &adap->dev->i2c_adap,
@@ -904,11 +984,6 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E7 TC */
                /* E7 PTC */
 
-               /* enable tuner on IOE[4] */
-               ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
-               if (ret)
-                       goto error;
-
                /* attach tuner */
                fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
                        &adap->dev->i2c_adap, &anysee_tda18212_config);
@@ -930,6 +1005,15 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                }
 
                break;
+
+       case ANYSEE_HW_508T2C: /* 20 */
+               /* E7 T2C */
+
+               /* attach tuner */
+               fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
+                       &adap->dev->i2c_adap, &anysee_tda18212_config2);
+
+               break;
        default:
                fe = NULL;
        }
@@ -939,7 +1023,6 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
        else
                ret = -ENODEV;
 
-error:
        return ret;
 }
 
@@ -969,6 +1052,201 @@ static int anysee_rc_query(struct dvb_usb_device *d)
        return 0;
 }
 
+static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
+       int addr)
+{
+       struct dvb_usb_device *d = ci->data;
+       int ret;
+       u8 buf[] = {CMD_CI, 0x02, 0x40 | addr >> 8, addr & 0xff, 0x00, 1};
+       u8 val;
+
+       ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
+       if (ret)
+               return ret;
+
+       return val;
+}
+
+static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
+       int addr, u8 val)
+{
+       struct dvb_usb_device *d = ci->data;
+       int ret;
+       u8 buf[] = {CMD_CI, 0x03, 0x40 | addr >> 8, addr & 0xff, 0x00, 1, val};
+
+       ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int anysee_ci_read_cam_control(struct dvb_ca_en50221 *ci, int slot,
+       u8 addr)
+{
+       struct dvb_usb_device *d = ci->data;
+       int ret;
+       u8 buf[] = {CMD_CI, 0x04, 0x40, addr, 0x00, 1};
+       u8 val;
+
+       ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
+       if (ret)
+               return ret;
+
+       return val;
+}
+
+static int anysee_ci_write_cam_control(struct dvb_ca_en50221 *ci, int slot,
+       u8 addr, u8 val)
+{
+       struct dvb_usb_device *d = ci->data;
+       int ret;
+       u8 buf[] = {CMD_CI, 0x05, 0x40, addr, 0x00, 1, val};
+
+       ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int anysee_ci_slot_reset(struct dvb_ca_en50221 *ci, int slot)
+{
+       struct dvb_usb_device *d = ci->data;
+       int ret;
+       struct anysee_state *state = d->priv;
+
+       state->ci_cam_ready = jiffies + msecs_to_jiffies(1000);
+
+       ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
+       if (ret)
+               return ret;
+
+       msleep(300);
+
+       ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int anysee_ci_slot_shutdown(struct dvb_ca_en50221 *ci, int slot)
+{
+       struct dvb_usb_device *d = ci->data;
+       int ret;
+
+       ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
+       if (ret)
+               return ret;
+
+       msleep(30);
+
+       ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221 *ci, int slot)
+{
+       struct dvb_usb_device *d = ci->data;
+       int ret;
+
+       ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 1), 0x02);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int anysee_ci_poll_slot_status(struct dvb_ca_en50221 *ci, int slot,
+       int open)
+{
+       struct dvb_usb_device *d = ci->data;
+       struct anysee_state *state = d->priv;
+       int ret;
+       u8 tmp;
+
+       ret = anysee_rd_reg_mask(d, REG_IOC, &tmp, 0x40);
+       if (ret)
+               return ret;
+
+       if (tmp == 0) {
+               ret = DVB_CA_EN50221_POLL_CAM_PRESENT;
+               if (time_after(jiffies, state->ci_cam_ready))
+                       ret |= DVB_CA_EN50221_POLL_CAM_READY;
+       }
+
+       return ret;
+}
+
+static int anysee_ci_init(struct dvb_usb_device *d)
+{
+       struct anysee_state *state = d->priv;
+       int ret;
+
+       state->ci.owner               = THIS_MODULE;
+       state->ci.read_attribute_mem  = anysee_ci_read_attribute_mem;
+       state->ci.write_attribute_mem = anysee_ci_write_attribute_mem;
+       state->ci.read_cam_control    = anysee_ci_read_cam_control;
+       state->ci.write_cam_control   = anysee_ci_write_cam_control;
+       state->ci.slot_reset          = anysee_ci_slot_reset;
+       state->ci.slot_shutdown       = anysee_ci_slot_shutdown;
+       state->ci.slot_ts_enable      = anysee_ci_slot_ts_enable;
+       state->ci.poll_slot_status    = anysee_ci_poll_slot_status;
+       state->ci.data                = d;
+
+       ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
+       if (ret)
+               return ret;
+
+       ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static void anysee_ci_release(struct dvb_usb_device *d)
+{
+       struct anysee_state *state = d->priv;
+
+       /* detach CI */
+       if (state->has_ci)
+               dvb_ca_en50221_release(&state->ci);
+
+       return;
+}
+
+static int anysee_init(struct dvb_usb_device *d)
+{
+       struct anysee_state *state = d->priv;
+       int ret;
+
+       /* LED light */
+       ret = anysee_led_ctrl(d, 0x01, 0x03);
+       if (ret)
+               return ret;
+
+       /* enable IR */
+       ret = anysee_ir_ctrl(d, 1);
+       if (ret)
+               return ret;
+
+       /* attach CI */
+       if (state->has_ci) {
+               ret = anysee_ci_init(d);
+               if (ret) {
+                       state->has_ci = false;
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
 /* DVB USB Driver stuff */
 static struct dvb_usb_device_properties anysee_properties;
 
@@ -1010,6 +1288,16 @@ static int anysee_probe(struct usb_interface *intf,
        return anysee_init(d);
 }
 
+static void anysee_disconnect(struct usb_interface *intf)
+{
+       struct dvb_usb_device *d = usb_get_intfdata(intf);
+
+       anysee_ci_release(d);
+       dvb_usb_device_exit(intf);
+
+       return;
+}
+
 static struct usb_device_id anysee_table[] = {
        { USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
        { USB_DEVICE(USB_VID_AMT,     USB_PID_ANYSEE) },
@@ -1029,7 +1317,7 @@ static struct dvb_usb_device_properties anysee_properties = {
                {
                .num_frontends    = 2,
                .frontend_ctrl    = anysee_frontend_ctrl,
-               .fe = {{
+               .fe = { {
                        .streaming_ctrl   = anysee_streaming_ctrl,
                        .frontend_attach  = anysee_frontend_attach,
                        .tuner_attach     = anysee_tuner_attach,
@@ -1057,7 +1345,7 @@ static struct dvb_usb_device_properties anysee_properties = {
                                        }
                                }
                        },
-               }},
+               } },
                }
        },
 
@@ -1087,7 +1375,7 @@ static struct dvb_usb_device_properties anysee_properties = {
 static struct usb_driver anysee_driver = {
        .name       = "dvb_usb_anysee",
        .probe      = anysee_probe,
-       .disconnect = dvb_usb_device_exit,
+       .disconnect = anysee_disconnect,
        .id_table   = anysee_table,
 };
 
index 57ee500b8c0e1c16d8c41e8bf51d40b1e6058014..8ac8794315401d06a087dcf4614444ce98c8d12b 100644 (file)
@@ -36,6 +36,7 @@
 
 #define DVB_USB_LOG_PREFIX "anysee"
 #include "dvb-usb.h"
+#include "dvb_ca_en50221.h"
 
 #define deb_info(args...) dprintk(dvb_usb_anysee_debug, 0x01, args)
 #define deb_xfer(args...) dprintk(dvb_usb_anysee_debug, 0x02, args)
@@ -54,12 +55,16 @@ enum cmd {
        CMD_GET_IR_CODE         = 0x41,
        CMD_GET_HW_INFO         = 0x19,
        CMD_SMARTCARD           = 0x34,
+       CMD_CI                  = 0x37,
 };
 
 struct anysee_state {
        u8 hw; /* PCB ID */
        u8 seq;
        u8 fe_id:1; /* frondend ID */
+       u8 has_ci:1;
+       struct dvb_ca_en50221 ci;
+       unsigned long ci_cam_ready; /* jiffies */
 };
 
 #define ANYSEE_HW_507T    2 /* E30 */
@@ -69,6 +74,7 @@ struct anysee_state {
 #define ANYSEE_HW_507FA  15 /* E30 Combo Plus / E30 C Plus */
 #define ANYSEE_HW_508TC  18 /* E7 TC */
 #define ANYSEE_HW_508S2  19 /* E7 S2 */
+#define ANYSEE_HW_508T2C 20 /* E7 T2C */
 #define ANYSEE_HW_508PTC 21 /* E7 PTC Plus */
 #define ANYSEE_HW_508PS2 22 /* E7 PS2 Plus */
 
index 2d08c9b5128a2759a60f04e7a3bf9e31cd23fd88..0040aa24f89f21a81d4f783b579439962390892e 100644 (file)
 #define USB_PID_TVWAY_PLUS                             0x0002
 #define USB_PID_SVEON_STV20                            0xe39d
 #define USB_PID_SVEON_STV22                            0xe401
+#define USB_PID_SVEON_STV22_IT9137                     0xe411
 #define USB_PID_AZUREWAVE_AZ6027                       0x3275
 #define USB_PID_TERRATEC_DVBS2CI_V1                    0x10a4
 #define USB_PID_TERRATEC_DVBS2CI_V2                    0x10ac
index c46226187143a2d3cdf1b8fd98c5b3b2b90448fb..9abdaee4aa6c307dc5aa71fe250850ca7b7f71bc 100644 (file)
@@ -60,15 +60,6 @@ struct it913x_state {
        u8 id;
 };
 
-struct ite_config {
-       u8 chip_ver;
-       u16 chip_type;
-       u32 firmware;
-       u8 tuner_id_0;
-       u8 tuner_id_1;
-       u8 dual_mode;
-};
-
 struct ite_config it913x_config;
 
 static int it913x_bulk_write(struct usb_device *dev,
@@ -359,6 +350,19 @@ static int it913x_identify_state(struct usb_device *udev,
        /* checnk for dual mode */
        it913x_config.dual_mode =  it913x_read_reg(udev, 0x49c5);
 
+       if (udev->speed != USB_SPEED_HIGH) {
+               props->adapter[0].fe[0].pid_filter_count = 5;
+               info("USB 1 low speed mode - connect to USB 2 port");
+               if (pid_filter > 0)
+                       pid_filter = 0;
+               if (it913x_config.dual_mode) {
+                       it913x_config.dual_mode = 0;
+                       info("Dual mode not supported in USB 1");
+               }
+       } else /* For replugging */
+               if(props->adapter[0].fe[0].pid_filter_count == 5)
+                       props->adapter[0].fe[0].pid_filter_count = 31;
+
        /* TODO different remotes */
        remote = it913x_read_reg(udev, 0x49ac); /* Remote */
        if (remote == 0)
@@ -390,8 +394,8 @@ static int it913x_identify_state(struct usb_device *udev,
                        if (ret != 0)
                                ret = it913x_wr_reg(udev, DEV_0,
                                        GPIOH1_O, 0x0);
+                       props->num_adapters = 2;
                }
-               props->num_adapters = 2;
        } else
                props->num_adapters = 1;
 
@@ -474,12 +478,17 @@ static int it913x_download_firmware(struct usb_device *udev,
        /* Tuner function */
        if (it913x_config.dual_mode)
                ret |= it913x_wr_reg(udev, DEV_0_DMOD , 0xec4c, 0xa0);
-
-       ret |= it913x_wr_reg(udev, DEV_0,  PADODPU, 0x0);
-       ret |= it913x_wr_reg(udev, DEV_0,  AGC_O_D, 0x0);
-       if (it913x_config.dual_mode) {
-               ret |= it913x_wr_reg(udev, DEV_1,  PADODPU, 0x0);
-               ret |= it913x_wr_reg(udev, DEV_1,  AGC_O_D, 0x0);
+       else
+               ret |= it913x_wr_reg(udev, DEV_0_DMOD , 0xec4c, 0x68);
+
+       if ((it913x_config.chip_ver == 1) &&
+               (it913x_config.chip_type == 0x9135)) {
+               ret |= it913x_wr_reg(udev, DEV_0,  PADODPU, 0x0);
+               ret |= it913x_wr_reg(udev, DEV_0,  AGC_O_D, 0x0);
+               if (it913x_config.dual_mode) {
+                       ret |= it913x_wr_reg(udev, DEV_1,  PADODPU, 0x0);
+                       ret |= it913x_wr_reg(udev, DEV_1,  AGC_O_D, 0x0);
+               }
        }
 
        return (ret < 0) ? -ENODEV : 0;
@@ -501,31 +510,17 @@ static int it913x_frontend_attach(struct dvb_usb_adapter *adap)
 {
        struct usb_device *udev = adap->dev->udev;
        int ret = 0;
-       u8 adf = it913x_read_reg(udev, IO_MUX_POWER_CLK);
        u8 adap_addr = I2C_BASE_ADDR + (adap->id << 5);
        u16 ep_size = adap->props.fe[0].stream.u.bulk.buffersize;
-       u8 tuner_id, tuner_type;
+       u8 pkt_size = 0x80;
 
-       if (adap->id == 0)
-               tuner_id = it913x_config.tuner_id_0;
-       else
-               tuner_id = it913x_config.tuner_id_1;
-
-       /* TODO we always use IT9137 possible references here*/
-       /* Documentation suggests don't care */
-       switch (tuner_id) {
-       case 0x51:
-       case 0x52:
-       case 0x60:
-       case 0x61:
-       case 0x62:
-       default:
-       case 0x38:
-               tuner_type = IT9137;
-       }
+       if (adap->dev->udev->speed != USB_SPEED_HIGH)
+               pkt_size = 0x10;
+
+       it913x_config.adf = it913x_read_reg(udev, IO_MUX_POWER_CLK);
 
        adap->fe_adap[0].fe = dvb_attach(it913x_fe_attach,
-               &adap->dev->i2c_adap, adap_addr, adf, tuner_type);
+               &adap->dev->i2c_adap, adap_addr, &it913x_config);
 
        if (adap->id == 0 && adap->fe_adap[0].fe) {
                ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2_SW_RST, 0x1);
@@ -536,13 +531,13 @@ static int it913x_frontend_attach(struct dvb_usb_adapter *adap)
                ret = it913x_wr_reg(udev, DEV_0, EP4_TX_LEN_LSB,
                                        ep_size & 0xff);
                ret = it913x_wr_reg(udev, DEV_0, EP4_TX_LEN_MSB, ep_size >> 8);
-               ret = it913x_wr_reg(udev, DEV_0, EP4_MAX_PKT, 0x80);
+               ret = it913x_wr_reg(udev, DEV_0, EP4_MAX_PKT, pkt_size);
        } else if (adap->id == 1 && adap->fe_adap[0].fe) {
                ret = it913x_wr_reg(udev, DEV_0, EP0_TX_EN, 0x6f);
                ret = it913x_wr_reg(udev, DEV_0, EP5_TX_LEN_LSB,
                                        ep_size & 0xff);
                ret = it913x_wr_reg(udev, DEV_0, EP5_TX_LEN_MSB, ep_size >> 8);
-               ret = it913x_wr_reg(udev, DEV_0, EP5_MAX_PKT, 0x80);
+               ret = it913x_wr_reg(udev, DEV_0, EP5_MAX_PKT, pkt_size);
                ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2IF2_EN, 0x1);
                ret = it913x_wr_reg(udev, DEV_1_DMOD, MP2IF_SERIAL, 0x1);
                ret = it913x_wr_reg(udev, DEV_1, TOP_HOSTB_SER_MODE, 0x1);
@@ -582,6 +577,7 @@ static int it913x_probe(struct usb_interface *intf,
 static struct usb_device_id it913x_table[] = {
        { USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB499_2T_T09) },
        { USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9135) },
+       { USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV22_IT9137) },
        {}              /* Terminating entry */
 };
 
@@ -657,7 +653,7 @@ static struct dvb_usb_device_properties it913x_properties = {
                .rc_codes       = RC_MAP_KWORLD_315U,
        },
        .i2c_algo         = &it913x_i2c_algo,
-       .num_device_descs = 2,
+       .num_device_descs = 3,
        .devices = {
                {   "Kworld UB499-2T T09(IT9137)",
                        { &it913x_table[0], NULL },
@@ -665,6 +661,9 @@ static struct dvb_usb_device_properties it913x_properties = {
                {   "ITE 9135 Generic",
                        { &it913x_table[1], NULL },
                        },
+               {   "Sveon STV22 Dual DVB-T HDTV(IT9137)",
+                       { &it913x_table[2], NULL },
+                       },
        }
 };
 
@@ -698,5 +697,5 @@ module_exit(it913x_module_exit);
 
 MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
 MODULE_DESCRIPTION("it913x USB 2 Driver");
-MODULE_VERSION("1.07");
+MODULE_VERSION("1.09");
 MODULE_LICENSE("GPL");
index a6341058c4e71da379f0774bed2f2a985d31534f..3bfc6d8368a8e36a1d9da95c2e5e76e879021580 100644 (file)
@@ -38,6 +38,8 @@ struct mxl111sf_tuner_state {
 
        struct mxl111sf_tuner_config *cfg;
 
+       enum mxl_if_freq if_freq;
+
        u32 frequency;
        u32 bandwidth;
 };
@@ -186,7 +188,10 @@ static int mxl1x1sf_tuner_set_if_output_freq(struct mxl111sf_tuner_state *state)
        ctrl = iffcw & 0x00ff;
 #endif
        ret = mxl111sf_tuner_write_reg(state, V6_TUNER_IF_FCW_REG, ctrl);
-       mxl_fail(ret);
+       if (mxl_fail(ret))
+               goto fail;
+
+       state->if_freq = state->cfg->if_freq;
 fail:
        return ret;
 }
@@ -407,6 +412,54 @@ static int mxl111sf_tuner_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
        return 0;
 }
 
+static int mxl111sf_tuner_get_if_frequency(struct dvb_frontend *fe,
+                                          u32 *frequency)
+{
+       struct mxl111sf_tuner_state *state = fe->tuner_priv;
+
+       *frequency = 0;
+
+       switch (state->if_freq) {
+       case MXL_IF_4_0:   /* 4.0   MHz */
+               *frequency = 4000000;
+               break;
+       case MXL_IF_4_5:   /* 4.5   MHz */
+               *frequency = 4500000;
+               break;
+       case MXL_IF_4_57:  /* 4.57  MHz */
+               *frequency = 4570000;
+               break;
+       case MXL_IF_5_0:   /* 5.0   MHz */
+               *frequency = 5000000;
+               break;
+       case MXL_IF_5_38:  /* 5.38  MHz */
+               *frequency = 5380000;
+               break;
+       case MXL_IF_6_0:   /* 6.0   MHz */
+               *frequency = 6000000;
+               break;
+       case MXL_IF_6_28:  /* 6.28  MHz */
+               *frequency = 6280000;
+               break;
+       case MXL_IF_7_2:   /* 7.2   MHz */
+               *frequency = 7200000;
+               break;
+       case MXL_IF_35_25: /* 35.25 MHz */
+               *frequency = 35250000;
+               break;
+       case MXL_IF_36:    /* 36    MHz */
+               *frequency = 36000000;
+               break;
+       case MXL_IF_36_15: /* 36.15 MHz */
+               *frequency = 36150000;
+               break;
+       case MXL_IF_44:    /* 44    MHz */
+               *frequency = 44000000;
+               break;
+       }
+       return 0;
+}
+
 static int mxl111sf_tuner_release(struct dvb_frontend *fe)
 {
        struct mxl111sf_tuner_state *state = fe->tuner_priv;
@@ -436,6 +489,7 @@ static struct dvb_tuner_ops mxl111sf_tuner_tuner_ops = {
        .get_rf_strength   = mxl111sf_get_rf_strength,
        .get_frequency     = mxl111sf_tuner_get_frequency,
        .get_bandwidth     = mxl111sf_tuner_get_bandwidth,
+       .get_if_frequency  = mxl111sf_tuner_get_if_frequency,
        .release           = mxl111sf_tuner_release,
 };
 
index ea4eab8b3965c00659aa8c26805e99fc4ed2bd0e..faed393c08b6acf4cc6117095a912758f1225135 100644 (file)
@@ -75,10 +75,18 @@ static int ttusb2_msg(struct dvb_usb_device *d, u8 cmd,
                u8 *wbuf, int wlen, u8 *rbuf, int rlen)
 {
        struct ttusb2_state *st = d->priv;
-       u8 s[wlen+4],r[64] = { 0 };
+       u8 *s, *r = NULL;
        int ret = 0;
 
-       memset(s,0,wlen+4);
+       s = kzalloc(wlen+4, GFP_KERNEL);
+       if (!s)
+               return -ENOMEM;
+
+       r = kzalloc(64, GFP_KERNEL);
+       if (!r) {
+               kfree(s);
+               return -ENOMEM;
+       }
 
        s[0] = 0xaa;
        s[1] = ++st->id;
@@ -94,12 +102,17 @@ static int ttusb2_msg(struct dvb_usb_device *d, u8 cmd,
                r[2] != cmd ||
                (rlen > 0 && r[3] != rlen)) {
                warn("there might have been an error during control message transfer. (rlen = %d, was %d)",rlen,r[3]);
+               kfree(s);
+               kfree(r);
                return -EIO;
        }
 
        if (rlen > 0)
                memcpy(rbuf, &r[4], rlen);
 
+       kfree(s);
+       kfree(r);
+
        return 0;
 }
 
index 1d572940e243637994b302f16a56bdb5b7caa7c6..5c0d3989f5bd331b3877e4adaddc8b14eb2aadb8 100644 (file)
@@ -862,7 +862,36 @@ static int au8522_read_snr(struct dvb_frontend *fe, u16 *snr)
 static int au8522_read_signal_strength(struct dvb_frontend *fe,
                                       u16 *signal_strength)
 {
-       return au8522_read_snr(fe, signal_strength);
+       /* borrowed from lgdt330x.c
+        *
+        * Calculate strength from SNR up to 35dB
+        * Even though the SNR can go higher than 35dB,
+        * there is some comfort factor in having a range of
+        * strong signals that can show at 100%
+        */
+       u16 snr;
+       u32 tmp;
+       int ret = au8522_read_snr(fe, &snr);
+
+       *signal_strength = 0;
+
+       if (0 == ret) {
+               /* The following calculation method was chosen
+                * purely for the sake of code re-use from the
+                * other demod drivers that use this method */
+
+               /* Convert from SNR in dB * 10 to 8.24 fixed-point */
+               tmp = (snr * ((1 << 24) / 10));
+
+               /* Convert from 8.24 fixed-point to
+                * scale the range 0 - 35*2^24 into 0 - 65535*/
+               if (tmp >= 8960 * 0x10000)
+                       *signal_strength = 0xffff;
+               else
+                       *signal_strength = tmp / 8960;
+       }
+
+       return ret;
 }
 
 static int au8522_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
index 58baf419560cedb55f11ca5b788cbcd9eff77069..e6d42e271b8912c8bbce1ecb23a2bfa4bf88892f 100644 (file)
@@ -26,6 +26,8 @@ struct drxk_config {
        bool    antenna_dvbt;
        u16     antenna_gpio;
 
+       int    chunk_size;
+
        const char *microcode_name;
 };
 
index f6431ef827dc1f86e6b4748ae08c5edb141919ff..95cbc98176fafe0ad9de2cfd4d72f1a25b2dae87 100644 (file)
@@ -681,7 +681,8 @@ static int init_state(struct drxk_state *state)
        state->m_hasOOB = false;
        state->m_hasAudio = false;
 
-       state->m_ChunkSize = 124;
+       if (!state->m_ChunkSize)
+               state->m_ChunkSize = 124;
 
        state->m_oscClockFreq = 0;
        state->m_smartAntInverted = false;
@@ -6218,6 +6219,13 @@ static int drxk_set_parameters(struct dvb_frontend *fe,
                return -EINVAL;
        }
 
+       if (state->m_OperationMode == OM_QAM_ITU_A ||
+           state->m_OperationMode == OM_QAM_ITU_C) {
+               if (fe->dtv_property_cache.rolloff == ROLLOFF_13)
+                       state->m_OperationMode = OM_QAM_ITU_C;
+               else
+                       state->m_OperationMode = OM_QAM_ITU_A;
+       }
 
        if (fe->ops.i2c_gate_ctrl)
                fe->ops.i2c_gate_ctrl(fe, 1);
@@ -6423,6 +6431,7 @@ struct dvb_frontend *drxk_attach(const struct drxk_config *config,
        state->no_i2c_bridge = config->no_i2c_bridge;
        state->antenna_gpio = config->antenna_gpio;
        state->antenna_dvbt = config->antenna_dvbt;
+       state->m_ChunkSize = config->chunk_size;
 
        /* NOTE: as more UIO bits will be used, add them to the mask */
        state->UIO_mask = config->antenna_gpio;
index 1c6fb4b662556ddd18bfdf8ec897ad9d268bec92..836a5b818219bbf1ffd040bf6b68dc12fa0c1146 100644 (file)
@@ -153,8 +153,7 @@ struct table {
 };
 
 static struct table fe_clockTable[] = {
-               {12000000, tab3},       /* FPGA     */
-               {16384000, tab6},       /* 16.38MHz */
+               {12000000, tab3},       /* 12.00MHz */
                {20480000, tab6},       /* 20.48MHz */
                {36000000, tab3},       /* 36.00MHz */
                {30000000, tab1},       /* 30.00MHz */
@@ -164,7 +163,6 @@ static struct table fe_clockTable[] = {
                {34000000, tab2},       /* 34.00MHz */
                {24000000, tab1},       /* 24.00MHz */
                {22000000, tab8},       /* 22.00MHz */
-               {12000000, tab3}        /* 12.00MHz */
 };
 
 /* fe get */
@@ -205,6 +203,10 @@ fe_modulation_t fe_con[] = {
 
 /* Standard demodulator functions */
 static struct it913xset set_solo_fe[] = {
+       {PRO_LINK, GPIOH5_EN, {0x01}, 0x01},
+       {PRO_LINK, GPIOH5_ON, {0x01}, 0x01},
+       {PRO_LINK, GPIOH5_O, {0x00}, 0x01},
+       {PRO_LINK, GPIOH5_O, {0x01}, 0x01},
        {PRO_LINK, DVBT_INTEN, {0x04}, 0x01},
        {PRO_LINK, DVBT_ENABLE, {0x05}, 0x01},
        {PRO_DMOD, MP2IF_MPEG_PAR_MODE, {0x00}, 0x01},
@@ -233,8 +235,121 @@ static struct it913xset init_1[] = {
        {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
 };
 
-/* ---------IT9137 0x38 tuner init---------- */
-static struct it913xset it9137_set[] = {
+
+/* Version 1 types */
+static struct it913xset it9135_v1[] = {
+       {PRO_DMOD, 0x0051, {0x01}, 0x01},
+       {PRO_DMOD, 0x0070, {0x0a}, 0x01},
+       {PRO_DMOD, 0x007e, {0x04}, 0x01},
+       {PRO_DMOD, 0x0081, {0x0a}, 0x01},
+       {PRO_DMOD, 0x008a, {0x01}, 0x01},
+       {PRO_DMOD, 0x008e, {0x01}, 0x01},
+       {PRO_DMOD, 0x0092, {0x06}, 0x01},
+       {PRO_DMOD, 0x0099, {0x01}, 0x01},
+       {PRO_DMOD, 0x009f, {0xe1}, 0x01},
+       {PRO_DMOD, 0x00a0, {0xcf}, 0x01},
+       {PRO_DMOD, 0x00a3, {0x01}, 0x01},
+       {PRO_DMOD, 0x00a5, {0x01}, 0x01},
+       {PRO_DMOD, 0x00a6, {0x01}, 0x01},
+       {PRO_DMOD, 0x00a9, {0x00}, 0x01},
+       {PRO_DMOD, 0x00aa, {0x01}, 0x01},
+       {PRO_DMOD, 0x00b0, {0x01}, 0x01},
+       {PRO_DMOD, 0x00c2, {0x05}, 0x01},
+       {PRO_DMOD, 0x00c6, {0x19}, 0x01},
+       {PRO_DMOD, 0xf000, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf016, {0x10}, 0x01},
+       {PRO_DMOD, 0xf017, {0x04}, 0x01},
+       {PRO_DMOD, 0xf018, {0x05}, 0x01},
+       {PRO_DMOD, 0xf019, {0x04}, 0x01},
+       {PRO_DMOD, 0xf01a, {0x05}, 0x01},
+       {PRO_DMOD, 0xf021, {0x03}, 0x01},
+       {PRO_DMOD, 0xf022, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf023, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf02b, {0x00}, 0x01},
+       {PRO_DMOD, 0xf02c, {0x01}, 0x01},
+       {PRO_DMOD, 0xf064, {0x03}, 0x01},
+       {PRO_DMOD, 0xf065, {0xf9}, 0x01},
+       {PRO_DMOD, 0xf066, {0x03}, 0x01},
+       {PRO_DMOD, 0xf067, {0x01}, 0x01},
+       {PRO_DMOD, 0xf06f, {0xe0}, 0x01},
+       {PRO_DMOD, 0xf070, {0x03}, 0x01},
+       {PRO_DMOD, 0xf072, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf073, {0x03}, 0x01},
+       {PRO_DMOD, 0xf078, {0x00}, 0x01},
+       {PRO_DMOD, 0xf087, {0x00}, 0x01},
+       {PRO_DMOD, 0xf09b, {0x3f}, 0x01},
+       {PRO_DMOD, 0xf09c, {0x00}, 0x01},
+       {PRO_DMOD, 0xf09d, {0x20}, 0x01},
+       {PRO_DMOD, 0xf09e, {0x00}, 0x01},
+       {PRO_DMOD, 0xf09f, {0x0c}, 0x01},
+       {PRO_DMOD, 0xf0a0, {0x00}, 0x01},
+       {PRO_DMOD, 0xf130, {0x04}, 0x01},
+       {PRO_DMOD, 0xf132, {0x04}, 0x01},
+       {PRO_DMOD, 0xf144, {0x1a}, 0x01},
+       {PRO_DMOD, 0xf146, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14a, {0x01}, 0x01},
+       {PRO_DMOD, 0xf14c, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14d, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14f, {0x04}, 0x01},
+       {PRO_DMOD, 0xf158, {0x7f}, 0x01},
+       {PRO_DMOD, 0xf15a, {0x00}, 0x01},
+       {PRO_DMOD, 0xf15b, {0x08}, 0x01},
+       {PRO_DMOD, 0xf15d, {0x03}, 0x01},
+       {PRO_DMOD, 0xf15e, {0x05}, 0x01},
+       {PRO_DMOD, 0xf163, {0x05}, 0x01},
+       {PRO_DMOD, 0xf166, {0x01}, 0x01},
+       {PRO_DMOD, 0xf167, {0x40}, 0x01},
+       {PRO_DMOD, 0xf168, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf17a, {0x00}, 0x01},
+       {PRO_DMOD, 0xf17b, {0x00}, 0x01},
+       {PRO_DMOD, 0xf183, {0x01}, 0x01},
+       {PRO_DMOD, 0xf19d, {0x40}, 0x01},
+       {PRO_DMOD, 0xf1bc, {0x36}, 0x01},
+       {PRO_DMOD, 0xf1bd, {0x00}, 0x01},
+       {PRO_DMOD, 0xf1cb, {0xa0}, 0x01},
+       {PRO_DMOD, 0xf1cc, {0x01}, 0x01},
+       {PRO_DMOD, 0xf204, {0x10}, 0x01},
+       {PRO_DMOD, 0xf214, {0x00}, 0x01},
+       {PRO_DMOD, 0xf40e, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf40f, {0x40}, 0x01},
+       {PRO_DMOD, 0xf410, {0x08}, 0x01},
+       {PRO_DMOD, 0xf55f, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf561, {0x15}, 0x01},
+       {PRO_DMOD, 0xf562, {0x20}, 0x01},
+       {PRO_DMOD, 0xf5df, {0xfb}, 0x01},
+       {PRO_DMOD, 0xf5e0, {0x00}, 0x01},
+       {PRO_DMOD, 0xf5e3, {0x09}, 0x01},
+       {PRO_DMOD, 0xf5e4, {0x01}, 0x01},
+       {PRO_DMOD, 0xf5e5, {0x01}, 0x01},
+       {PRO_DMOD, 0xf5f8, {0x01}, 0x01},
+       {PRO_DMOD, 0xf5fd, {0x01}, 0x01},
+       {PRO_DMOD, 0xf600, {0x05}, 0x01},
+       {PRO_DMOD, 0xf601, {0x08}, 0x01},
+       {PRO_DMOD, 0xf602, {0x0b}, 0x01},
+       {PRO_DMOD, 0xf603, {0x0e}, 0x01},
+       {PRO_DMOD, 0xf604, {0x11}, 0x01},
+       {PRO_DMOD, 0xf605, {0x14}, 0x01},
+       {PRO_DMOD, 0xf606, {0x17}, 0x01},
+       {PRO_DMOD, 0xf607, {0x1f}, 0x01},
+       {PRO_DMOD, 0xf60e, {0x00}, 0x01},
+       {PRO_DMOD, 0xf60f, {0x04}, 0x01},
+       {PRO_DMOD, 0xf610, {0x32}, 0x01},
+       {PRO_DMOD, 0xf611, {0x10}, 0x01},
+       {PRO_DMOD, 0xf707, {0xfc}, 0x01},
+       {PRO_DMOD, 0xf708, {0x00}, 0x01},
+       {PRO_DMOD, 0xf709, {0x37}, 0x01},
+       {PRO_DMOD, 0xf70a, {0x00}, 0x01},
+       {PRO_DMOD, 0xf78b, {0x01}, 0x01},
+       {PRO_DMOD, 0xf80f, {0x40}, 0x01},
+       {PRO_DMOD, 0xf810, {0x54}, 0x01},
+       {PRO_DMOD, 0xf811, {0x5a}, 0x01},
+       {PRO_DMOD, 0xf905, {0x01}, 0x01},
+       {PRO_DMOD, 0xfb06, {0x03}, 0x01},
+       {PRO_DMOD, 0xfd8b, {0x00}, 0x01},
+       {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
+};
+
+static struct it913xset it9135_38[] = {
        {PRO_DMOD, 0x0043, {0x00}, 0x01},
        {PRO_DMOD, 0x0046, {0x38}, 0x01},
        {PRO_DMOD, 0x0051, {0x01}, 0x01},
@@ -244,7 +359,7 @@ static struct it913xset it9137_set[] = {
        {PRO_DMOD, 0x0075, {0x8c, 0x8c, 0x8c, 0xc8, 0x01}, 0x05},
        {PRO_DMOD, 0x007e, {0x04, 0x00}, 0x02},
        {PRO_DMOD, 0x0081, {    0x0a, 0x12, 0x02, 0x0a, 0x03, 0xc8, 0xb8,
-                               0xd0, 0xc3, 0x01        }, 0x0a},
+                               0xd0, 0xc3, 0x01}, 0x0a},
        {PRO_DMOD, 0x008e, {0x01}, 0x01},
        {PRO_DMOD, 0x0092, {0x06, 0x00, 0x00, 0x00, 0x00}, 0x05},
        {PRO_DMOD, 0x0099, {0x01}, 0x01},
@@ -262,15 +377,25 @@ static struct it913xset it9137_set[] = {
        {PRO_DMOD, 0x00f3, {0x05, 0x8c, 0x8c}, 0x03},
        {PRO_DMOD, 0x00f8, {0x03, 0x06, 0x06}, 0x03},
        {PRO_DMOD, 0x00fc, {    0x02, 0x02, 0x02, 0x09, 0x50, 0x7b, 0x77,
-                               0x00, 0x02, 0xc8, 0x05, 0x7b    }, 0x0c},
+                               0x00, 0x02, 0xc8, 0x05, 0x7b}, 0x0c},
        {PRO_DMOD, 0x0109, {0x02}, 0x01},
-       {PRO_DMOD, 0x0115, {0x0a, 0x03}, 0x02},
-       {PRO_DMOD, 0x011a, {0xc8, 0x7b, 0xbc, 0xa0}, 0x04},
+       {PRO_DMOD, 0x0115, {0x0a, 0x03, 0x02, 0x80}, 0x04},
+       {PRO_DMOD, 0x011a, {0xc8, 0x7b, 0x8a, 0xa0}, 0x04},
        {PRO_DMOD, 0x0122, {0x02, 0x18, 0xc3}, 0x03},
        {PRO_DMOD, 0x0127, {0x00, 0x07}, 0x02},
        {PRO_DMOD, 0x012a, {0x53, 0x51, 0x4e, 0x43}, 0x04},
        {PRO_DMOD, 0x0137, {0x01, 0x00, 0x07, 0x00, 0x06}, 0x05},
-       {PRO_DMOD, 0x013d, {0x00, 0x01, 0x5b, 0xc8}, 0x04},
+       {PRO_DMOD, 0x013d, {0x00, 0x01, 0x5b, 0xc8, 0x59}, 0x05},
+       {PRO_DMOD, 0xf000, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf016, {0x10, 0x04, 0x05, 0x04, 0x05}, 0x05},
+       {PRO_DMOD, 0xf01f, {0x8c, 0x00, 0x03, 0x0a, 0x0a}, 0x05},
+       {PRO_DMOD, 0xf029, {0x8c, 0x00, 0x00, 0x01}, 0x04},
+       {PRO_DMOD, 0xf064, {0x03, 0xf9, 0x03, 0x01}, 0x04},
+       {PRO_DMOD, 0xf06f, {0xe0, 0x03}, 0x02},
+       {PRO_DMOD, 0xf072, {0x0f, 0x03}, 0x02},
+       {PRO_DMOD, 0xf077, {0x01, 0x00}, 0x02},
+       {PRO_DMOD, 0xf085, {0x00, 0x02, 0x00}, 0x03},
+       {PRO_DMOD, 0xf09b, {0x3f, 0x00, 0x20, 0x00, 0x0c, 0x00}, 0x06},
        {PRO_DMOD, 0xf130, {0x04}, 0x01},
        {PRO_DMOD, 0xf132, {0x04}, 0x01},
        {PRO_DMOD, 0xf144, {0x1a}, 0x01},
@@ -301,7 +426,7 @@ static struct it913xset it9137_set[] = {
        {PRO_DMOD, 0xf5f8, {0x01}, 0x01},
        {PRO_DMOD, 0xf5fd, {0x01}, 0x01},
        {PRO_DMOD, 0xf600, {    0x05, 0x08, 0x0b, 0x0e, 0x11, 0x14, 0x17,
-                               0x1f    }, 0x08},
+                               0x1f}, 0x08},
        {PRO_DMOD, 0xf60e, {0x00, 0x04, 0x32, 0x10}, 0x04},
        {PRO_DMOD, 0xf707, {0xfc, 0x00, 0x37, 0x00}, 0x04},
        {PRO_DMOD, 0xf78b, {0x01}, 0x01},
@@ -309,13 +434,578 @@ static struct it913xset it9137_set[] = {
        {PRO_DMOD, 0xf905, {0x01}, 0x01},
        {PRO_DMOD, 0xfb06, {0x03}, 0x01},
        {PRO_DMOD, 0xfd8b, {0x00}, 0x01},
-       {PRO_LINK, GPIOH5_EN, {0x01}, 0x01},
-       {PRO_LINK, GPIOH5_ON, {0x01}, 0x01},
-       {PRO_LINK, GPIOH5_O, {0x00}, 0x01},
-       {PRO_LINK, GPIOH5_O, {0x01}, 0x01},
-       {0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
+       {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
+};
+
+static struct it913xset it9135_51[] = {
+       {PRO_DMOD, 0x0043, {0x00}, 0x01},
+       {PRO_DMOD, 0x0046, {0x51}, 0x01},
+       {PRO_DMOD, 0x0051, {0x01}, 0x01},
+       {PRO_DMOD, 0x005f, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0x0068, {0x0a}, 0x01},
+       {PRO_DMOD, 0x0070, {0x0a, 0x06, 0x02}, 0x03},
+       {PRO_DMOD, 0x0075, {0x8c, 0x8c, 0x8c, 0xc8, 0x01}, 0x05},
+       {PRO_DMOD, 0x007e, {0x04, 0x00}, 0x02},
+       {PRO_DMOD, 0x0081, {    0x0a, 0x12, 0x02, 0x0a, 0x03, 0xc0, 0x96,
+                               0xcf, 0xc3, 0x01}, 0x0a},
+       {PRO_DMOD, 0x008e, {0x01}, 0x01},
+       {PRO_DMOD, 0x0092, {0x06, 0x00, 0x00, 0x00, 0x00}, 0x05},
+       {PRO_DMOD, 0x0099, {0x01}, 0x01},
+       {PRO_DMOD, 0x009b, {0x3c, 0x28}, 0x02},
+       {PRO_DMOD, 0x009f, {0xe1, 0xcf}, 0x02},
+       {PRO_DMOD, 0x00a3, {0x01, 0x5a, 0x01, 0x01}, 0x04},
+       {PRO_DMOD, 0x00a9, {0x00, 0x01}, 0x02},
+       {PRO_DMOD, 0x00b0, {0x01}, 0x01},
+       {PRO_DMOD, 0x00b3, {0x02, 0x3c}, 0x02},
+       {PRO_DMOD, 0x00b6, {0x14}, 0x01},
+       {PRO_DMOD, 0x00c0, {0x11, 0x00, 0x05}, 0x03},
+       {PRO_DMOD, 0x00c4, {0x00}, 0x01},
+       {PRO_DMOD, 0x00c6, {0x19, 0x00}, 0x02},
+       {PRO_DMOD, 0x00cc, {0x2e, 0x51, 0x33}, 0x03},
+       {PRO_DMOD, 0x00f3, {0x05, 0x8c, 0x8c}, 0x03},
+       {PRO_DMOD, 0x00f8, {0x03, 0x06, 0x06}, 0x03},
+       {PRO_DMOD, 0x00fc, {    0x03, 0x02, 0x02, 0x09, 0x50, 0x7a, 0x77,
+                               0x01, 0x02, 0xb0, 0x02, 0x7a}, 0x0c},
+       {PRO_DMOD, 0x0109, {0x02}, 0x01},
+       {PRO_DMOD, 0x0115, {0x0a, 0x03, 0x02, 0x80}, 0x04},
+       {PRO_DMOD, 0x011a, {0xc0, 0x7a, 0xac, 0x8c}, 0x04},
+       {PRO_DMOD, 0x0122, {0x02, 0x70, 0xa4}, 0x03},
+       {PRO_DMOD, 0x0127, {0x00, 0x07}, 0x02},
+       {PRO_DMOD, 0x012a, {0x53, 0x51, 0x4e, 0x43}, 0x04},
+       {PRO_DMOD, 0x0137, {0x01, 0x00, 0x07, 0x00, 0x06}, 0x05},
+       {PRO_DMOD, 0x013d, {0x00, 0x01, 0x5b, 0xc0, 0x59}, 0x05},
+       {PRO_DMOD, 0xf000, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf016, {0x10, 0x04, 0x05, 0x04, 0x05}, 0x05},
+       {PRO_DMOD, 0xf01f, {0x8c, 0x00, 0x03, 0x0a, 0x0a}, 0x05},
+       {PRO_DMOD, 0xf029, {0x8c, 0x00, 0x00, 0x01}, 0x04},
+       {PRO_DMOD, 0xf064, {0x03, 0xf9, 0x03, 0x01}, 0x04},
+       {PRO_DMOD, 0xf06f, {0xe0, 0x03}, 0x02},
+       {PRO_DMOD, 0xf072, {0x0f, 0x03}, 0x02},
+       {PRO_DMOD, 0xf077, {0x01, 0x00}, 0x02},
+       {PRO_DMOD, 0xf085, {0xc0, 0x01, 0x00}, 0x03},
+       {PRO_DMOD, 0xf09b, {0x3f, 0x00, 0x20, 0x00, 0x0c, 0x00}, 0x06},
+       {PRO_DMOD, 0xf130, {0x04}, 0x01},
+       {PRO_DMOD, 0xf132, {0x04}, 0x01},
+       {PRO_DMOD, 0xf144, {0x1a}, 0x01},
+       {PRO_DMOD, 0xf146, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14a, {0x01}, 0x01},
+       {PRO_DMOD, 0xf14c, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0xf14f, {0x04}, 0x01},
+       {PRO_DMOD, 0xf158, {0x7f}, 0x01},
+       {PRO_DMOD, 0xf15a, {0x00, 0x08}, 0x02},
+       {PRO_DMOD, 0xf15d, {0x03, 0x05}, 0x02},
+       {PRO_DMOD, 0xf163, {0x05}, 0x01},
+       {PRO_DMOD, 0xf166, {0x01, 0x40, 0x0f}, 0x03},
+       {PRO_DMOD, 0xf17a, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0xf183, {0x01}, 0x01},
+       {PRO_DMOD, 0xf19d, {0x40}, 0x01},
+       {PRO_DMOD, 0xf1bc, {0x36, 0x00}, 0x02},
+       {PRO_DMOD, 0xf1cb, {0xa0, 0x01}, 0x02},
+       {PRO_DMOD, 0xf204, {0x10}, 0x01},
+       {PRO_DMOD, 0xf214, {0x00}, 0x01},
+       {PRO_DMOD, 0xf24c, {0x88, 0x95, 0x9a, 0x90}, 0x04},
+       {PRO_DMOD, 0xf25a, {0x07, 0xe8, 0x03, 0xb0, 0x04}, 0x05},
+       {PRO_DMOD, 0xf270, {0x01, 0x02, 0x01, 0x02}, 0x04},
+       {PRO_DMOD, 0xf40e, {0x0a, 0x40, 0x08}, 0x03},
+       {PRO_DMOD, 0xf55f, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf561, {0x15, 0x20}, 0x02},
+       {PRO_DMOD, 0xf5df, {0xfb, 0x00}, 0x02},
+       {PRO_DMOD, 0xf5e3, {0x09, 0x01, 0x01}, 0x03},
+       {PRO_DMOD, 0xf5f8, {0x01}, 0x01},
+       {PRO_DMOD, 0xf5fd, {0x01}, 0x01},
+       {PRO_DMOD, 0xf600, {    0x05, 0x08, 0x0b, 0x0e, 0x11, 0x14, 0x17,
+                               0x1f}, 0x08},
+       {PRO_DMOD, 0xf60e, {0x00, 0x04, 0x32, 0x10}, 0x04},
+       {PRO_DMOD, 0xf707, {0xfc, 0x00, 0x37, 0x00}, 0x04},
+       {PRO_DMOD, 0xf78b, {0x01}, 0x01},
+       {PRO_DMOD, 0xf80f, {0x40, 0x54, 0x5a}, 0x03},
+       {PRO_DMOD, 0xf905, {0x01}, 0x01},
+       {PRO_DMOD, 0xfb06, {0x03}, 0x01},
+       {PRO_DMOD, 0xfd8b, {0x00}, 0x01},
+       {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
+};
+
+static struct it913xset it9135_52[] = {
+       {PRO_DMOD, 0x0043, {0x00}, 0x01},
+       {PRO_DMOD, 0x0046, {0x52}, 0x01},
+       {PRO_DMOD, 0x0051, {0x01}, 0x01},
+       {PRO_DMOD, 0x005f, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0x0068, {0x10}, 0x01},
+       {PRO_DMOD, 0x0070, {0x0a, 0x05, 0x02}, 0x03},
+       {PRO_DMOD, 0x0075, {0x8c, 0x8c, 0x8c, 0xa0, 0x01}, 0x05},
+       {PRO_DMOD, 0x007e, {0x04, 0x00}, 0x02},
+       {PRO_DMOD, 0x0081, {    0x0a, 0x12, 0x03, 0x0a, 0x03, 0xb3, 0x97,
+                               0xc0, 0x9e, 0x01}, 0x0a},
+       {PRO_DMOD, 0x008e, {0x01}, 0x01},
+       {PRO_DMOD, 0x0092, {0x06, 0x00, 0x00, 0x00, 0x00}, 0x05},
+       {PRO_DMOD, 0x0099, {0x01}, 0x01},
+       {PRO_DMOD, 0x009b, {0x3c, 0x28}, 0x02},
+       {PRO_DMOD, 0x009f, {0xe1, 0xcf}, 0x02},
+       {PRO_DMOD, 0x00a3, {0x01, 0x5c, 0x01, 0x01}, 0x04},
+       {PRO_DMOD, 0x00a9, {0x00, 0x01}, 0x02},
+       {PRO_DMOD, 0x00b0, {0x01}, 0x01},
+       {PRO_DMOD, 0x00b3, {0x02, 0x3c}, 0x02},
+       {PRO_DMOD, 0x00b6, {0x14}, 0x01},
+       {PRO_DMOD, 0x00c0, {0x11, 0x00, 0x05}, 0x03},
+       {PRO_DMOD, 0x00c4, {0x00}, 0x01},
+       {PRO_DMOD, 0x00c6, {0x19, 0x00}, 0x02},
+       {PRO_DMOD, 0x00cc, {0x2e, 0x51, 0x33}, 0x03},
+       {PRO_DMOD, 0x00f3, {0x05, 0x91, 0x8c}, 0x03},
+       {PRO_DMOD, 0x00f8, {0x03, 0x06, 0x06}, 0x03},
+       {PRO_DMOD, 0x00fc, {    0x03, 0x02, 0x02, 0x09, 0x50, 0x74, 0x77,
+                               0x02, 0x02, 0xae, 0x02, 0x6e}, 0x0c},
+       {PRO_DMOD, 0x0109, {0x02}, 0x01},
+       {PRO_DMOD, 0x0115, {0x0a, 0x03, 0x02, 0x80}, 0x04},
+       {PRO_DMOD, 0x011a, {0xcd, 0x62, 0xa4, 0x8c}, 0x04},
+       {PRO_DMOD, 0x0122, {0x03, 0x18, 0x9e}, 0x03},
+       {PRO_DMOD, 0x0127, {0x00, 0x07}, 0x02},
+       {PRO_DMOD, 0x012a, {0x53, 0x51, 0x4e, 0x43}, 0x04},
+       {PRO_DMOD, 0x0137, {0x00, 0x00, 0x07, 0x00, 0x06}, 0x05},
+       {PRO_DMOD, 0x013d, {0x00, 0x01, 0x5b, 0xb6, 0x59}, 0x05},
+       {PRO_DMOD, 0xf000, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf016, {0x10, 0x04, 0x05, 0x04, 0x05}, 0x05},
+       {PRO_DMOD, 0xf01f, {0x8c, 0x00, 0x03, 0x0a, 0x0a}, 0x05},
+       {PRO_DMOD, 0xf029, {0x8c, 0x00, 0x00, 0x01}, 0x04},
+       {PRO_DMOD, 0xf064, {0x03, 0xf9, 0x03, 0x01}, 0x04},
+       {PRO_DMOD, 0xf06f, {0xe0, 0x03}, 0x02},
+       {PRO_DMOD, 0xf072, {0x0f, 0x03}, 0x02},
+       {PRO_DMOD, 0xf077, {0x01, 0x00}, 0x02},
+       {PRO_DMOD, 0xf085, {0xc0, 0x01, 0x00}, 0x03},
+       {PRO_DMOD, 0xf09b, {0x3f, 0x00, 0x20, 0x00, 0x0c, 0x00}, 0x06},
+       {PRO_DMOD, 0xf130, {0x04}, 0x01},
+       {PRO_DMOD, 0xf132, {0x04}, 0x01},
+       {PRO_DMOD, 0xf144, {0x1a}, 0x01},
+       {PRO_DMOD, 0xf146, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14a, {0x01}, 0x01},
+       {PRO_DMOD, 0xf14c, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0xf14f, {0x04}, 0x01},
+       {PRO_DMOD, 0xf158, {0x7f}, 0x01},
+       {PRO_DMOD, 0xf15a, {0x00, 0x08}, 0x02},
+       {PRO_DMOD, 0xf15d, {0x03, 0x05}, 0x02},
+       {PRO_DMOD, 0xf163, {0x05}, 0x01},
+       {PRO_DMOD, 0xf166, {0x01, 0x40, 0x0f}, 0x03},
+       {PRO_DMOD, 0xf17a, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0xf183, {0x01}, 0x01},
+       {PRO_DMOD, 0xf19d, {0x40}, 0x01},
+       {PRO_DMOD, 0xf1bc, {0x36, 0x00}, 0x02},
+       {PRO_DMOD, 0xf1cb, {0xa0, 0x01}, 0x02},
+       {PRO_DMOD, 0xf204, {0x10}, 0x01},
+       {PRO_DMOD, 0xf214, {0x00}, 0x01},
+       {PRO_DMOD, 0xf24c, {0x88, 0x95, 0x9a, 0x90}, 0x04},
+       {PRO_DMOD, 0xf25a, {0x07, 0xe8, 0x03, 0xb0, 0x04}, 0x05},
+       {PRO_DMOD, 0xf270, {0x01, 0x02, 0x01, 0x02}, 0x04},
+       {PRO_DMOD, 0xf40e, {0x0a, 0x40, 0x08}, 0x03},
+       {PRO_DMOD, 0xf55f, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf561, {0x15, 0x20}, 0x02},
+       {PRO_DMOD, 0xf5df, {0xfb, 0x00}, 0x02},
+       {PRO_DMOD, 0xf5e3, {0x09, 0x01, 0x01}, 0x03},
+       {PRO_DMOD, 0xf5f8, {0x01}, 0x01},
+       {PRO_DMOD, 0xf5fd, {0x01}, 0x01},
+       {PRO_DMOD, 0xf600, {0x05, 0x08, 0x0b, 0x0e, 0x11, 0x14, 0x17,
+                               0x1f}, 0x08},
+       {PRO_DMOD, 0xf60e, {0x00, 0x04, 0x32, 0x10}, 0x04},
+       {PRO_DMOD, 0xf707, {0xfc, 0x00, 0x37, 0x00}, 0x04},
+       {PRO_DMOD, 0xf78b, {0x01}, 0x01},
+       {PRO_DMOD, 0xf80f, {0x40, 0x54, 0x5a}, 0x03},
+       {PRO_DMOD, 0xf905, {0x01}, 0x01},
+       {PRO_DMOD, 0xfb06, {0x03}, 0x01},
+       {PRO_DMOD, 0xfd8b, {0x00}, 0x01},
+       {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
+};
+
+/* Version 2 types */
+static struct it913xset it9135_v2[] = {
+       {PRO_DMOD, 0x0051, {0x01}, 0x01},
+       {PRO_DMOD, 0x0070, {0x0a}, 0x01},
+       {PRO_DMOD, 0x007e, {0x04}, 0x01},
+       {PRO_DMOD, 0x0081, {0x0a}, 0x01},
+       {PRO_DMOD, 0x008a, {0x01}, 0x01},
+       {PRO_DMOD, 0x008e, {0x01}, 0x01},
+       {PRO_DMOD, 0x0092, {0x06}, 0x01},
+       {PRO_DMOD, 0x0099, {0x01}, 0x01},
+       {PRO_DMOD, 0x009f, {0xe1}, 0x01},
+       {PRO_DMOD, 0x00a0, {0xcf}, 0x01},
+       {PRO_DMOD, 0x00a3, {0x01}, 0x01},
+       {PRO_DMOD, 0x00a5, {0x01}, 0x01},
+       {PRO_DMOD, 0x00a6, {0x01}, 0x01},
+       {PRO_DMOD, 0x00a9, {0x00}, 0x01},
+       {PRO_DMOD, 0x00aa, {0x01}, 0x01},
+       {PRO_DMOD, 0x00b0, {0x01}, 0x01},
+       {PRO_DMOD, 0x00c2, {0x05}, 0x01},
+       {PRO_DMOD, 0x00c6, {0x19}, 0x01},
+       {PRO_DMOD, 0xf000, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf02b, {0x00}, 0x01},
+       {PRO_DMOD, 0xf064, {0x03}, 0x01},
+       {PRO_DMOD, 0xf065, {0xf9}, 0x01},
+       {PRO_DMOD, 0xf066, {0x03}, 0x01},
+       {PRO_DMOD, 0xf067, {0x01}, 0x01},
+       {PRO_DMOD, 0xf06f, {0xe0}, 0x01},
+       {PRO_DMOD, 0xf070, {0x03}, 0x01},
+       {PRO_DMOD, 0xf072, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf073, {0x03}, 0x01},
+       {PRO_DMOD, 0xf078, {0x00}, 0x01},
+       {PRO_DMOD, 0xf087, {0x00}, 0x01},
+       {PRO_DMOD, 0xf09b, {0x3f}, 0x01},
+       {PRO_DMOD, 0xf09c, {0x00}, 0x01},
+       {PRO_DMOD, 0xf09d, {0x20}, 0x01},
+       {PRO_DMOD, 0xf09e, {0x00}, 0x01},
+       {PRO_DMOD, 0xf09f, {0x0c}, 0x01},
+       {PRO_DMOD, 0xf0a0, {0x00}, 0x01},
+       {PRO_DMOD, 0xf130, {0x04}, 0x01},
+       {PRO_DMOD, 0xf132, {0x04}, 0x01},
+       {PRO_DMOD, 0xf144, {0x1a}, 0x01},
+       {PRO_DMOD, 0xf146, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14a, {0x01}, 0x01},
+       {PRO_DMOD, 0xf14c, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14d, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14f, {0x04}, 0x01},
+       {PRO_DMOD, 0xf158, {0x7f}, 0x01},
+       {PRO_DMOD, 0xf15a, {0x00}, 0x01},
+       {PRO_DMOD, 0xf15b, {0x08}, 0x01},
+       {PRO_DMOD, 0xf15d, {0x03}, 0x01},
+       {PRO_DMOD, 0xf15e, {0x05}, 0x01},
+       {PRO_DMOD, 0xf163, {0x05}, 0x01},
+       {PRO_DMOD, 0xf166, {0x01}, 0x01},
+       {PRO_DMOD, 0xf167, {0x40}, 0x01},
+       {PRO_DMOD, 0xf168, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf17a, {0x00}, 0x01},
+       {PRO_DMOD, 0xf17b, {0x00}, 0x01},
+       {PRO_DMOD, 0xf183, {0x01}, 0x01},
+       {PRO_DMOD, 0xf19d, {0x40}, 0x01},
+       {PRO_DMOD, 0xf1bc, {0x36}, 0x01},
+       {PRO_DMOD, 0xf1bd, {0x00}, 0x01},
+       {PRO_DMOD, 0xf1cb, {0xa0}, 0x01},
+       {PRO_DMOD, 0xf1cc, {0x01}, 0x01},
+       {PRO_DMOD, 0xf204, {0x10}, 0x01},
+       {PRO_DMOD, 0xf214, {0x00}, 0x01},
+       {PRO_DMOD, 0xf40e, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf40f, {0x40}, 0x01},
+       {PRO_DMOD, 0xf410, {0x08}, 0x01},
+       {PRO_DMOD, 0xf55f, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf561, {0x15}, 0x01},
+       {PRO_DMOD, 0xf562, {0x20}, 0x01},
+       {PRO_DMOD, 0xf5e3, {0x09}, 0x01},
+       {PRO_DMOD, 0xf5e4, {0x01}, 0x01},
+       {PRO_DMOD, 0xf5e5, {0x01}, 0x01},
+       {PRO_DMOD, 0xf600, {0x05}, 0x01},
+       {PRO_DMOD, 0xf601, {0x08}, 0x01},
+       {PRO_DMOD, 0xf602, {0x0b}, 0x01},
+       {PRO_DMOD, 0xf603, {0x0e}, 0x01},
+       {PRO_DMOD, 0xf604, {0x11}, 0x01},
+       {PRO_DMOD, 0xf605, {0x14}, 0x01},
+       {PRO_DMOD, 0xf606, {0x17}, 0x01},
+       {PRO_DMOD, 0xf607, {0x1f}, 0x01},
+       {PRO_DMOD, 0xf60e, {0x00}, 0x01},
+       {PRO_DMOD, 0xf60f, {0x04}, 0x01},
+       {PRO_DMOD, 0xf610, {0x32}, 0x01},
+       {PRO_DMOD, 0xf611, {0x10}, 0x01},
+       {PRO_DMOD, 0xf707, {0xfc}, 0x01},
+       {PRO_DMOD, 0xf708, {0x00}, 0x01},
+       {PRO_DMOD, 0xf709, {0x37}, 0x01},
+       {PRO_DMOD, 0xf70a, {0x00}, 0x01},
+       {PRO_DMOD, 0xf78b, {0x01}, 0x01},
+       {PRO_DMOD, 0xf80f, {0x40}, 0x01},
+       {PRO_DMOD, 0xf810, {0x54}, 0x01},
+       {PRO_DMOD, 0xf811, {0x5a}, 0x01},
+       {PRO_DMOD, 0xf905, {0x01}, 0x01},
+       {PRO_DMOD, 0xfb06, {0x03}, 0x01},
+       {PRO_DMOD, 0xfd8b, {0x00}, 0x01},
+       {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
+};
+
+static struct it913xset it9135_60[] = {
+       {PRO_DMOD, 0x0043, {0x00}, 0x01},
+       {PRO_DMOD, 0x0046, {0x60}, 0x01},
+       {PRO_DMOD, 0x0051, {0x01}, 0x01},
+       {PRO_DMOD, 0x005f, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0x0068, {0x0a}, 0x01},
+       {PRO_DMOD, 0x006a, {0x03}, 0x01},
+       {PRO_DMOD, 0x0070, {0x0a, 0x05, 0x02}, 0x03},
+       {PRO_DMOD, 0x0075, {0x8c, 0x8c, 0x8c, 0x8c, 0x01}, 0x05},
+       {PRO_DMOD, 0x007e, {0x04}, 0x01},
+       {PRO_DMOD, 0x0081, {0x0a, 0x12}, 0x02},
+       {PRO_DMOD, 0x0084, {0x0a, 0x33, 0xbe, 0xa0, 0xc6, 0xb6, 0x01}, 0x07},
+       {PRO_DMOD, 0x008e, {0x01}, 0x01},
+       {PRO_DMOD, 0x0092, {0x06, 0x00, 0x00, 0x00, 0x00}, 0x05},
+       {PRO_DMOD, 0x0099, {0x01}, 0x01},
+       {PRO_DMOD, 0x009b, {0x3c, 0x28}, 0x02},
+       {PRO_DMOD, 0x009f, {0xe1, 0xcf}, 0x02},
+       {PRO_DMOD, 0x00a3, {0x01, 0x5a, 0x01, 0x01}, 0x04},
+       {PRO_DMOD, 0x00a9, {0x00, 0x01}, 0x02},
+       {PRO_DMOD, 0x00b0, {0x01}, 0x01},
+       {PRO_DMOD, 0x00b3, {0x02, 0x3a}, 0x02},
+       {PRO_DMOD, 0x00b6, {0x14}, 0x01},
+       {PRO_DMOD, 0x00c0, {0x11, 0x00, 0x05, 0x01, 0x00}, 0x05},
+       {PRO_DMOD, 0x00c6, {0x19, 0x00}, 0x02},
+       {PRO_DMOD, 0x00cb, {0x32, 0x2c, 0x4f, 0x30}, 0x04},
+       {PRO_DMOD, 0x00f3, {0x05, 0xa0, 0x8c}, 0x03},
+       {PRO_DMOD, 0x00f8, {0x03, 0x06, 0x06}, 0x03},
+       {PRO_DMOD, 0x00fc, {    0x03, 0x03, 0x02, 0x0a, 0x50, 0x7b, 0x8c,
+                               0x00, 0x02, 0xbe, 0x00}, 0x0b},
+       {PRO_DMOD, 0x0109, {0x02}, 0x01},
+       {PRO_DMOD, 0x0115, {0x0a, 0x03}, 0x02},
+       {PRO_DMOD, 0x011a, {0xbe}, 0x01},
+       {PRO_DMOD, 0x0124, {0xae}, 0x01},
+       {PRO_DMOD, 0x0127, {0x00}, 0x01},
+       {PRO_DMOD, 0x012a, {0x56, 0x50, 0x47, 0x42}, 0x04},
+       {PRO_DMOD, 0x0137, {0x00}, 0x01},
+       {PRO_DMOD, 0x013b, {0x08}, 0x01},
+       {PRO_DMOD, 0x013f, {0x5b}, 0x01},
+       {PRO_DMOD, 0x0141, {    0x59, 0xf9, 0x19, 0x19, 0x8c, 0x8c, 0x8c,
+                               0x6e, 0x8c, 0x50, 0x8c, 0x8c, 0xac, 0xc6,
+                               0x33}, 0x0f},
+       {PRO_DMOD, 0x0151, {0x28}, 0x01},
+       {PRO_DMOD, 0x0153, {0xbc}, 0x01},
+       {PRO_DMOD, 0x0178, {0x09}, 0x01},
+       {PRO_DMOD, 0x0181, {0x94, 0x6e}, 0x02},
+       {PRO_DMOD, 0x0185, {0x24}, 0x01},
+       {PRO_DMOD, 0x0187, {0x00, 0x00, 0xbe, 0x02, 0x80}, 0x05},
+       {PRO_DMOD, 0xed02, {0xff}, 0x01},
+       {PRO_DMOD, 0xee42, {0xff}, 0x01},
+       {PRO_DMOD, 0xee82, {0xff}, 0x01},
+       {PRO_DMOD, 0xf000, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf01f, {0x8c, 0x00}, 0x02},
+       {PRO_DMOD, 0xf029, {0x8c, 0x00, 0x00}, 0x03},
+       {PRO_DMOD, 0xf064, {0x03, 0xf9, 0x03, 0x01}, 0x04},
+       {PRO_DMOD, 0xf06f, {0xe0, 0x03}, 0x02},
+       {PRO_DMOD, 0xf072, {0x0f, 0x03}, 0x02},
+       {PRO_DMOD, 0xf077, {0x01, 0x00}, 0x02},
+       {PRO_DMOD, 0xf087, {0x00}, 0x01},
+       {PRO_DMOD, 0xf09b, {0x3f, 0x00, 0x20, 0x00, 0x0c, 0x00}, 0x06},
+       {PRO_DMOD, 0xf130, {0x04}, 0x01},
+       {PRO_DMOD, 0xf132, {0x04}, 0x01},
+       {PRO_DMOD, 0xf144, {0x1a}, 0x01},
+       {PRO_DMOD, 0xf146, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14a, {0x01}, 0x01},
+       {PRO_DMOD, 0xf14c, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0xf14f, {0x04}, 0x01},
+       {PRO_DMOD, 0xf158, {0x7f}, 0x01},
+       {PRO_DMOD, 0xf15a, {0x00, 0x08}, 0x02},
+       {PRO_DMOD, 0xf15d, {0x03, 0x05}, 0x02},
+       {PRO_DMOD, 0xf163, {0x05}, 0x01},
+       {PRO_DMOD, 0xf166, {0x01, 0x40, 0x0f}, 0x03},
+       {PRO_DMOD, 0xf17a, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0xf183, {0x01}, 0x01},
+       {PRO_DMOD, 0xf19d, {0x40}, 0x01},
+       {PRO_DMOD, 0xf1bc, {0x36, 0x00}, 0x02},
+       {PRO_DMOD, 0xf1cb, {0xa0, 0x01}, 0x02},
+       {PRO_DMOD, 0xf204, {0x10}, 0x01},
+       {PRO_DMOD, 0xf214, {0x00}, 0x01},
+       {PRO_DMOD, 0xf24c, {0x88, 0x95, 0x9a, 0x90}, 0x04},
+       {PRO_DMOD, 0xf25a, {0x07, 0xe8, 0x03, 0xb0, 0x04}, 0x05},
+       {PRO_DMOD, 0xf270, {0x01, 0x02, 0x01, 0x02}, 0x04},
+       {PRO_DMOD, 0xf40e, {0x0a, 0x40, 0x08}, 0x03},
+       {PRO_DMOD, 0xf55f, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf561, {0x15, 0x20}, 0x02},
+       {PRO_DMOD, 0xf5e3, {0x09, 0x01, 0x01}, 0x03},
+       {PRO_DMOD, 0xf600, {0x05, 0x08, 0x0b, 0x0e, 0x11, 0x14, 0x17
+               , 0x1f}, 0x08},
+       {PRO_DMOD, 0xf60e, {0x00, 0x04, 0x32, 0x10}, 0x04},
+       {PRO_DMOD, 0xf707, {0xfc, 0x00, 0x37, 0x00}, 0x04},
+       {PRO_DMOD, 0xf78b, {0x01}, 0x01},
+       {PRO_DMOD, 0xf80f, {0x40, 0x54, 0x5a}, 0x03},
+       {PRO_DMOD, 0xf905, {0x01}, 0x01},
+       {PRO_DMOD, 0xfb06, {0x03}, 0x01},
+       {PRO_DMOD, 0xfd8b, {0x00}, 0x01},
+       {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
+};
+
+static struct it913xset it9135_61[] = {
+       {PRO_DMOD, 0x0043, {0x00}, 0x01},
+       {PRO_DMOD, 0x0046, {0x61}, 0x01},
+       {PRO_DMOD, 0x0051, {0x01}, 0x01},
+       {PRO_DMOD, 0x005f, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0x0068, {0x06}, 0x01},
+       {PRO_DMOD, 0x006a, {0x03}, 0x01},
+       {PRO_DMOD, 0x0070, {0x0a, 0x05, 0x02}, 0x03},
+       {PRO_DMOD, 0x0075, {0x8c, 0x8c, 0x8c, 0x90, 0x01}, 0x05},
+       {PRO_DMOD, 0x007e, {0x04}, 0x01},
+       {PRO_DMOD, 0x0081, {0x0a, 0x12}, 0x02},
+       {PRO_DMOD, 0x0084, {0x0a, 0x33, 0xbc, 0x9c, 0xcc, 0xa8, 0x01}, 0x07},
+       {PRO_DMOD, 0x008e, {0x01}, 0x01},
+       {PRO_DMOD, 0x0092, {0x06, 0x00, 0x00, 0x00, 0x00}, 0x05},
+       {PRO_DMOD, 0x0099, {0x01}, 0x01},
+       {PRO_DMOD, 0x009b, {0x3c, 0x28}, 0x02},
+       {PRO_DMOD, 0x009f, {0xe1, 0xcf}, 0x02},
+       {PRO_DMOD, 0x00a3, {0x01, 0x5c, 0x01, 0x01}, 0x04},
+       {PRO_DMOD, 0x00a9, {0x00, 0x01}, 0x02},
+       {PRO_DMOD, 0x00b0, {0x01}, 0x01},
+       {PRO_DMOD, 0x00b3, {0x02, 0x3a}, 0x02},
+       {PRO_DMOD, 0x00b6, {0x14}, 0x01},
+       {PRO_DMOD, 0x00c0, {0x11, 0x00, 0x05, 0x01, 0x00}, 0x05},
+       {PRO_DMOD, 0x00c6, {0x19, 0x00}, 0x02},
+       {PRO_DMOD, 0x00cb, {0x32, 0x2c, 0x4f, 0x30}, 0x04},
+       {PRO_DMOD, 0x00f3, {0x05, 0xa0, 0x8c}, 0x03},
+       {PRO_DMOD, 0x00f8, {0x03, 0x06, 0x06}, 0x03},
+       {PRO_DMOD, 0x00fc, {    0x03, 0x03, 0x02, 0x08, 0x50, 0x7b, 0x8c,
+                               0x01, 0x02, 0xc8, 0x00}, 0x0b},
+       {PRO_DMOD, 0x0109, {0x02}, 0x01},
+       {PRO_DMOD, 0x0115, {0x0a, 0x03}, 0x02},
+       {PRO_DMOD, 0x011a, {0xc6}, 0x01},
+       {PRO_DMOD, 0x0124, {0xa8}, 0x01},
+       {PRO_DMOD, 0x0127, {0x00}, 0x01},
+       {PRO_DMOD, 0x012a, {0x59, 0x50, 0x47, 0x42}, 0x04},
+       {PRO_DMOD, 0x0137, {0x00}, 0x01},
+       {PRO_DMOD, 0x013b, {0x05}, 0x01},
+       {PRO_DMOD, 0x013f, {0x5b}, 0x01},
+       {PRO_DMOD, 0x0141, {    0x59, 0xf9, 0x59, 0x59, 0x8c, 0x8c, 0x8c,
+                               0x7b, 0x8c, 0x50, 0x8c, 0x8c, 0xa8, 0xc6,
+                               0x33}, 0x0f},
+       {PRO_DMOD, 0x0151, {0x28}, 0x01},
+       {PRO_DMOD, 0x0153, {0xcc}, 0x01},
+       {PRO_DMOD, 0x0178, {0x09}, 0x01},
+       {PRO_DMOD, 0x0181, {0x9c, 0x76}, 0x02},
+       {PRO_DMOD, 0x0185, {0x28}, 0x01},
+       {PRO_DMOD, 0x0187, {0x01, 0x00, 0xaa, 0x02, 0x80}, 0x05},
+       {PRO_DMOD, 0xed02, {0xff}, 0x01},
+       {PRO_DMOD, 0xee42, {0xff}, 0x01},
+       {PRO_DMOD, 0xee82, {0xff}, 0x01},
+       {PRO_DMOD, 0xf000, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf01f, {0x8c, 0x00}, 0x02},
+       {PRO_DMOD, 0xf029, {0x8c, 0x00, 0x00}, 0x03},
+       {PRO_DMOD, 0xf064, {0x03, 0xf9, 0x03, 0x01}, 0x04},
+       {PRO_DMOD, 0xf06f, {0xe0, 0x03}, 0x02},
+       {PRO_DMOD, 0xf072, {0x0f, 0x03}, 0x02},
+       {PRO_DMOD, 0xf077, {0x01, 0x00}, 0x02},
+       {PRO_DMOD, 0xf087, {0x00}, 0x01},
+       {PRO_DMOD, 0xf09b, {0x3f, 0x00, 0x20, 0x00, 0x0c, 0x00}, 0x06},
+       {PRO_DMOD, 0xf130, {0x04}, 0x01},
+       {PRO_DMOD, 0xf132, {0x04}, 0x01},
+       {PRO_DMOD, 0xf144, {0x1a}, 0x01},
+       {PRO_DMOD, 0xf146, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14a, {0x01}, 0x01},
+       {PRO_DMOD, 0xf14c, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0xf14f, {0x04}, 0x01},
+       {PRO_DMOD, 0xf158, {0x7f}, 0x01},
+       {PRO_DMOD, 0xf15a, {0x00, 0x08}, 0x02},
+       {PRO_DMOD, 0xf15d, {0x03, 0x05}, 0x02},
+       {PRO_DMOD, 0xf163, {0x05}, 0x01},
+       {PRO_DMOD, 0xf166, {0x01, 0x40, 0x0f}, 0x03},
+       {PRO_DMOD, 0xf17a, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0xf183, {0x01}, 0x01},
+       {PRO_DMOD, 0xf19d, {0x40}, 0x01},
+       {PRO_DMOD, 0xf1bc, {0x36, 0x00}, 0x02},
+       {PRO_DMOD, 0xf1cb, {0xa0, 0x01}, 0x02},
+       {PRO_DMOD, 0xf204, {0x10}, 0x01},
+       {PRO_DMOD, 0xf214, {0x00}, 0x01},
+       {PRO_DMOD, 0xf24c, {0x88, 0x95, 0x9a, 0x90}, 0x04},
+       {PRO_DMOD, 0xf25a, {0x07, 0xe8, 0x03, 0xb0, 0x04}, 0x05},
+       {PRO_DMOD, 0xf270, {0x01, 0x02, 0x01, 0x02}, 0x04},
+       {PRO_DMOD, 0xf40e, {0x0a, 0x40, 0x08}, 0x03},
+       {PRO_DMOD, 0xf55f, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf561, {0x15, 0x20}, 0x02},
+       {PRO_DMOD, 0xf5e3, {0x09, 0x01, 0x01}, 0x03},
+       {PRO_DMOD, 0xf600, {    0x05, 0x08, 0x0b, 0x0e, 0x11, 0x14, 0x17,
+                               0x1f}, 0x08},
+       {PRO_DMOD, 0xf60e, {0x00, 0x04, 0x32, 0x10}, 0x04},
+       {PRO_DMOD, 0xf707, {0xfc, 0x00, 0x37, 0x00}, 0x04},
+       {PRO_DMOD, 0xf78b, {0x01}, 0x01},
+       {PRO_DMOD, 0xf80f, {0x40, 0x54, 0x5a}, 0x03},
+       {PRO_DMOD, 0xf905, {0x01}, 0x01},
+       {PRO_DMOD, 0xfb06, {0x03}, 0x01},
+       {PRO_DMOD, 0xfd8b, {0x00}, 0x01},
+       {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
+};
+
+static struct it913xset it9135_62[] = {
+       {PRO_DMOD, 0x0043, {0x00}, 0x01},
+       {PRO_DMOD, 0x0046, {0x62}, 0x01},
+       {PRO_DMOD, 0x0051, {0x01}, 0x01},
+       {PRO_DMOD, 0x005f, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0x0068, {0x0a}, 0x01},
+       {PRO_DMOD, 0x006a, {0x03}, 0x01},
+       {PRO_DMOD, 0x0070, {0x0a, 0x05, 0x02}, 0x03},
+       {PRO_DMOD, 0x0075, {0x8c, 0x8c, 0x8c, 0x8c, 0x01}, 0x05},
+       {PRO_DMOD, 0x007e, {0x04}, 0x01},
+       {PRO_DMOD, 0x0081, {0x0a, 0x12}, 0x02},
+       {PRO_DMOD, 0x0084, {    0x0a, 0x33, 0xb8, 0x9c, 0xb2, 0xa6, 0x01},
+                               0x07},
+       {PRO_DMOD, 0x008e, {0x01}, 0x01},
+       {PRO_DMOD, 0x0092, {0x06, 0x00, 0x00, 0x00, 0x00}, 0x05},
+       {PRO_DMOD, 0x0099, {0x01}, 0x01},
+       {PRO_DMOD, 0x009b, {0x3c, 0x28}, 0x02},
+       {PRO_DMOD, 0x009f, {0xe1, 0xcf}, 0x02},
+       {PRO_DMOD, 0x00a3, {0x01, 0x5a, 0x01, 0x01}, 0x04},
+       {PRO_DMOD, 0x00a9, {0x00, 0x01}, 0x02},
+       {PRO_DMOD, 0x00b0, {0x01}, 0x01},
+       {PRO_DMOD, 0x00b3, {0x02, 0x3a}, 0x02},
+       {PRO_DMOD, 0x00b6, {0x14}, 0x01},
+       {PRO_DMOD, 0x00c0, {0x11, 0x00, 0x05, 0x01, 0x00}, 0x05},
+       {PRO_DMOD, 0x00c6, {0x19, 0x00}, 0x02},
+       {PRO_DMOD, 0x00cb, {0x32, 0x2c, 0x4f, 0x30}, 0x04},
+       {PRO_DMOD, 0x00f3, {0x05, 0x8c, 0x8c}, 0x03},
+       {PRO_DMOD, 0x00f8, {0x03, 0x06, 0x06}, 0x03},
+       {PRO_DMOD, 0x00fc, {    0x02, 0x03, 0x02, 0x09, 0x50, 0x6e, 0x8c,
+                               0x02, 0x02, 0xc2, 0x00}, 0x0b},
+       {PRO_DMOD, 0x0109, {0x02}, 0x01},
+       {PRO_DMOD, 0x0115, {0x0a, 0x03}, 0x02},
+       {PRO_DMOD, 0x011a, {0xb8}, 0x01},
+       {PRO_DMOD, 0x0124, {0xa8}, 0x01},
+       {PRO_DMOD, 0x0127, {0x00}, 0x01},
+       {PRO_DMOD, 0x012a, {0x53, 0x51, 0x4e, 0x43}, 0x04},
+       {PRO_DMOD, 0x0137, {0x00}, 0x01},
+       {PRO_DMOD, 0x013b, {0x05}, 0x01},
+       {PRO_DMOD, 0x013f, {0x5b}, 0x01},
+       {PRO_DMOD, 0x0141, {    0x59, 0xf9, 0x59, 0x19, 0x8c, 0x8c, 0x8c,
+                               0x7b, 0x8c, 0x50, 0x70, 0x8c, 0x96, 0xd0,
+                               0x33}, 0x0f},
+       {PRO_DMOD, 0x0151, {0x28}, 0x01},
+       {PRO_DMOD, 0x0153, {0xb2}, 0x01},
+       {PRO_DMOD, 0x0178, {0x09}, 0x01},
+       {PRO_DMOD, 0x0181, {0x9c, 0x6e}, 0x02},
+       {PRO_DMOD, 0x0185, {0x24}, 0x01},
+       {PRO_DMOD, 0x0187, {0x00, 0x00, 0xb8, 0x02, 0x80}, 0x05},
+       {PRO_DMOD, 0xed02, {0xff}, 0x01},
+       {PRO_DMOD, 0xee42, {0xff}, 0x01},
+       {PRO_DMOD, 0xee82, {0xff}, 0x01},
+       {PRO_DMOD, 0xf000, {0x0f}, 0x01},
+       {PRO_DMOD, 0xf01f, {0x8c, 0x00}, 0x02},
+       {PRO_DMOD, 0xf029, {0x8c, 0x00, 0x00}, 0x03},
+       {PRO_DMOD, 0xf064, {0x03, 0xf9, 0x03, 0x01}, 0x04},
+       {PRO_DMOD, 0xf06f, {0xe0, 0x03}, 0x02},
+       {PRO_DMOD, 0xf072, {0x0f, 0x03}, 0x02},
+       {PRO_DMOD, 0xf077, {0x01, 0x00}, 0x02},
+       {PRO_DMOD, 0xf087, {0x00}, 0x01},
+       {PRO_DMOD, 0xf09b, {0x3f, 0x00, 0x20, 0x00, 0x0c, 0x00}, 0x06},
+       {PRO_DMOD, 0xf130, {0x04}, 0x01},
+       {PRO_DMOD, 0xf132, {0x04}, 0x01},
+       {PRO_DMOD, 0xf144, {0x1a}, 0x01},
+       {PRO_DMOD, 0xf146, {0x00}, 0x01},
+       {PRO_DMOD, 0xf14a, {0x01}, 0x01},
+       {PRO_DMOD, 0xf14c, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0xf14f, {0x04}, 0x01},
+       {PRO_DMOD, 0xf158, {0x7f}, 0x01},
+       {PRO_DMOD, 0xf15a, {0x00, 0x08}, 0x02},
+       {PRO_DMOD, 0xf15d, {0x03, 0x05}, 0x02},
+       {PRO_DMOD, 0xf163, {0x05}, 0x01},
+       {PRO_DMOD, 0xf166, {0x01, 0x40, 0x0f}, 0x03},
+       {PRO_DMOD, 0xf17a, {0x00, 0x00}, 0x02},
+       {PRO_DMOD, 0xf183, {0x01}, 0x01},
+       {PRO_DMOD, 0xf19d, {0x40}, 0x01},
+       {PRO_DMOD, 0xf1bc, {0x36, 0x00}, 0x02},
+       {PRO_DMOD, 0xf1cb, {0xa0, 0x01}, 0x02},
+       {PRO_DMOD, 0xf204, {0x10}, 0x01},
+       {PRO_DMOD, 0xf214, {0x00}, 0x01},
+       {PRO_DMOD, 0xf24c, {0x88, 0x95, 0x9a, 0x90}, 0x04},
+       {PRO_DMOD, 0xf25a, {0x07, 0xe8, 0x03, 0xb0, 0x04}, 0x05},
+       {PRO_DMOD, 0xf270, {0x01, 0x02, 0x01, 0x02}, 0x04},
+       {PRO_DMOD, 0xf40e, {0x0a, 0x40, 0x08}, 0x03},
+       {PRO_DMOD, 0xf55f, {0x0a}, 0x01},
+       {PRO_DMOD, 0xf561, {0x15, 0x20}, 0x02},
+       {PRO_DMOD, 0xf5e3, {0x09, 0x01, 0x01}, 0x03},
+       {PRO_DMOD, 0xf600, {    0x05, 0x08, 0x0b, 0x0e, 0x11, 0x14, 0x17,
+                               0x1f}, 0x08},
+       {PRO_DMOD, 0xf60e, {0x00, 0x04, 0x32, 0x10}, 0x04},
+       {PRO_DMOD, 0xf707, {0xfc, 0x00, 0x37, 0x00}, 0x04},
+       {PRO_DMOD, 0xf78b, {0x01}, 0x01},
+       {PRO_DMOD, 0xf80f, {0x40, 0x54, 0x5a}, 0x03},
+       {PRO_DMOD, 0xf905, {0x01}, 0x01},
+       {PRO_DMOD, 0xfb06, {0x03}, 0x01},
+       {PRO_DMOD, 0xfd8b, {0x00}, 0x01},
+       {0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
 };
 
+/* Tuner setting scripts (still keeping it9137) */
 static struct it913xset it9137_tuner_off[] = {
        {PRO_DMOD, 0xfba8, {0x01}, 0x01}, /* Tuner Clock Off  */
        {PRO_DMOD, 0xec40, {0x00}, 0x01}, /* Power Down Tuner */
index d4bd24eb4700d36d612f674cc0793317f0d70ada..07c1b4601b1f78fbaf112bb72d505ff7e0318710 100644 (file)
@@ -50,9 +50,11 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able)).");
 struct it913x_fe_state {
        struct dvb_frontend frontend;
        struct i2c_adapter *i2c_adap;
+       struct ite_config *config;
        u8 i2c_addr;
        u32 frequency;
-       u8 adf;
+       fe_modulation_t constellation;
+       fe_transmit_mode_t transmission_mode;
        u32 crystalFrequency;
        u32 adcFrequency;
        u8 tuner_type;
@@ -211,13 +213,17 @@ static int it913x_init_tuner(struct it913x_fe_state *state)
        state->tun_fn_min /= (state->tun_fdiv * nv_val);
        deb_info("Tuner fn_min %d", state->tun_fn_min);
 
-       for (i = 0; i < 50; i++) {
-               reg = it913x_read_reg_u8(state, 0xec82);
-               if (reg > 0)
-                       break;
-               if (reg < 0)
-                       return -ENODEV;
-               udelay(2000);
+       if (state->config->chip_ver > 1)
+               msleep(50);
+       else {
+               for (i = 0; i < 50; i++) {
+                       reg = it913x_read_reg_u8(state, 0xec82);
+                       if (reg > 0)
+                               break;
+                       if (reg < 0)
+                               return -ENODEV;
+                       udelay(2000);
+               }
        }
 
        return it913x_write_reg(state, PRO_DMOD, 0xed81, val);
@@ -492,14 +498,50 @@ static int it913x_fe_read_signal_strength(struct dvb_frontend *fe,
        return 0;
 }
 
-static int it913x_fe_read_snr(struct dvb_frontend *fe, u16snr)
+static int it913x_fe_read_snr(struct dvb_frontend *fe, u16 *snr)
 {
        struct it913x_fe_state *state = fe->demodulator_priv;
-       int ret = it913x_read_reg_u8(state, SIGNAL_QUALITY);
-       ret = (ret * 0xff) / 0x64;
-       ret |= (ret << 0x8);
-       *snr = ~ret;
-       return 0;
+       int ret;
+       u8 reg[3];
+       u32 snr_val, snr_min, snr_max;
+       u32 temp;
+
+       ret = it913x_read_reg(state, 0x2c, reg, sizeof(reg));
+
+       snr_val = (u32)(reg[2] << 16) | (reg[1] < 8) | reg[0];
+
+       ret |= it913x_read_reg(state, 0xf78b, reg, 1);
+       if (reg[0])
+               snr_val /= reg[0];
+
+       if (state->transmission_mode == TRANSMISSION_MODE_2K)
+               snr_val *= 4;
+       else if (state->transmission_mode == TRANSMISSION_MODE_4K)
+               snr_val *= 2;
+
+       if (state->constellation == QPSK) {
+               snr_min = 0xb4711;
+               snr_max = 0x191451;
+       } else if (state->constellation == QAM_16) {
+               snr_min = 0x4f0d5;
+               snr_max = 0xc7925;
+       } else if (state->constellation == QAM_64) {
+               snr_min = 0x256d0;
+               snr_max = 0x626be;
+       } else
+               return -EINVAL;
+
+       if (snr_val < snr_min)
+               *snr = 0;
+       else if (snr_val < snr_max) {
+               temp = (snr_val - snr_min) >> 5;
+               temp *= 0xffff;
+               temp /= (snr_max - snr_min) >> 5;
+               *snr = (u16)temp;
+       } else
+               *snr = 0xffff;
+
+       return (ret < 0) ? -ENODEV : 0;
 }
 
 static int it913x_fe_read_ber(struct dvb_frontend *fe, u32 *ber)
@@ -526,9 +568,13 @@ static int it913x_fe_get_frontend(struct dvb_frontend *fe,
        if (reg[3] < 3)
                p->u.ofdm.constellation = fe_con[reg[3]];
 
+       state->constellation = p->u.ofdm.constellation;
+
        if (reg[0] < 3)
                p->u.ofdm.transmission_mode = fe_mode[reg[0]];
 
+       state->transmission_mode = p->u.ofdm.transmission_mode;
+
        if (reg[1] < 4)
                p->u.ofdm.guard_interval = fe_gi[reg[1]];
 
@@ -578,7 +624,12 @@ static int it913x_fe_set_frontend(struct dvb_frontend *fe,
 
        deb_info("Frontend Set Tuner Type %02x", state->tuner_type);
        switch (state->tuner_type) {
-       case IT9137: /* Tuner type 0x38 */
+       case IT9135_38:
+       case IT9135_51:
+       case IT9135_52:
+       case IT9135_60:
+       case IT9135_61:
+       case IT9135_62:
                ret = it9137_set_tuner(state,
                        p->u.ofdm.bandwidth, p->frequency);
                break;
@@ -678,16 +729,17 @@ static u32 compute_div(u32 a, u32 b, u32 x)
 
 static int it913x_fe_start(struct it913x_fe_state *state)
 {
-       struct it913xset *set_fe;
+       struct it913xset *set_lna;
        struct it913xset *set_mode;
        int ret;
-       u8 adf = (state->adf & 0xf);
+       u8 adf = (state->config->adf & 0xf);
        u32 adc, xtal;
        u8 b[4];
 
-       ret = it913x_init_tuner(state);
+       if (state->config->chip_ver == 1)
+               ret = it913x_init_tuner(state);
 
-       if (adf < 12) {
+       if (adf < 10) {
                state->crystalFrequency = fe_clockTable[adf].xtal ;
                state->table = fe_clockTable[adf].table;
                state->adcFrequency = state->table->adcFrequency;
@@ -720,23 +772,57 @@ static int it913x_fe_start(struct it913x_fe_state *state)
        b[1] = (adc >> 8) & 0xff;
        b[2] = (adc >> 16) & 0xff;
        ret |= it913x_write(state, PRO_DMOD, ADC_FREQ, b, 3);
+       if (ret < 0)
+               return -ENODEV;
+
+       /* v1 or v2 tuner script */
+       if (state->config->chip_ver > 1)
+               ret = it913x_fe_script_loader(state, it9135_v2);
+       else
+               ret = it913x_fe_script_loader(state, it9135_v1);
+       if (ret < 0)
+               return ret;
 
+       /* LNA Scripts */
        switch (state->tuner_type) {
-       case IT9137: /* Tuner type 0x38 */
-               set_fe = it9137_set;
+       case IT9135_51:
+               set_lna = it9135_51;
                break;
+       case IT9135_52:
+               set_lna = it9135_52;
+               break;
+       case IT9135_60:
+               set_lna = it9135_60;
+               break;
+       case IT9135_61:
+               set_lna = it9135_61;
+               break;
+       case IT9135_62:
+               set_lna = it9135_62;
+               break;
+       case IT9135_38:
        default:
-               return -EINVAL;
+               set_lna = it9135_38;
        }
+       ret = it913x_fe_script_loader(state, set_lna);
+       if (ret < 0)
+               return ret;
+
+       if (state->config->chip_ver == 2) {
+               ret = it913x_write_reg(state, PRO_DMOD, TRIGGER_OFSM, 0x1);
+               ret |= it913x_write_reg(state, PRO_LINK, PADODPU, 0x0);
+               ret |= it913x_write_reg(state, PRO_LINK, AGC_O_D, 0x0);
+               ret |= it913x_init_tuner(state);
+       }
+       if (ret < 0)
+               return -ENODEV;
 
-       /* set the demod */
-       ret = it913x_fe_script_loader(state, set_fe);
        /* Always solo frontend */
        set_mode = set_solo_fe;
        ret |= it913x_fe_script_loader(state, set_mode);
 
        ret |= it913x_fe_suspend(state);
-       return 0;
+       return (ret < 0) ? -ENODEV : 0;
 }
 
 static int it913x_fe_init(struct dvb_frontend *fe)
@@ -750,13 +836,7 @@ static int it913x_fe_init(struct dvb_frontend *fe)
 
        ret |= it913x_fe_script_loader(state, init_1);
 
-       switch (state->tuner_type) {
-       case IT9137:
-               ret |= it913x_write_reg(state, PRO_DMOD, 0xfba8, 0x0);
-               break;
-       default:
-               return -EINVAL;
-       }
+       ret |= it913x_write_reg(state, PRO_DMOD, 0xfba8, 0x0);
 
        return (ret < 0) ? -ENODEV : 0;
 }
@@ -770,19 +850,34 @@ static void it913x_fe_release(struct dvb_frontend *fe)
 static struct dvb_frontend_ops it913x_fe_ofdm_ops;
 
 struct dvb_frontend *it913x_fe_attach(struct i2c_adapter *i2c_adap,
-               u8 i2c_addr, u8 adf, u8 type)
+               u8 i2c_addr, struct ite_config *config)
 {
        struct it913x_fe_state *state = NULL;
        int ret;
+
        /* allocate memory for the internal state */
        state = kzalloc(sizeof(struct it913x_fe_state), GFP_KERNEL);
        if (state == NULL)
+               return NULL;
+       if (config == NULL)
                goto error;
 
        state->i2c_adap = i2c_adap;
        state->i2c_addr = i2c_addr;
-       state->adf = adf;
-       state->tuner_type = type;
+       state->config = config;
+
+       switch (state->config->tuner_id_0) {
+       case IT9135_51:
+       case IT9135_52:
+       case IT9135_60:
+       case IT9135_61:
+       case IT9135_62:
+               state->tuner_type = state->config->tuner_id_0;
+               break;
+       default:
+       case IT9135_38:
+               state->tuner_type = IT9135_38;
+       }
 
        ret = it913x_fe_start(state);
        if (ret < 0)
@@ -835,5 +930,5 @@ static struct dvb_frontend_ops it913x_fe_ofdm_ops = {
 
 MODULE_DESCRIPTION("it913x Frontend and it9137 tuner");
 MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com");
-MODULE_VERSION("1.07");
+MODULE_VERSION("1.10");
 MODULE_LICENSE("GPL");
index 9d97f32e690b4261ea5980b2b964b2f499eaeb42..43f879a053c92baefa1bb50157a856512610e143 100644 (file)
 
 #include <linux/dvb/frontend.h>
 #include "dvb_frontend.h"
+
+struct ite_config {
+       u8 chip_ver;
+       u16 chip_type;
+       u32 firmware;
+       u8 tuner_id_0;
+       u8 tuner_id_1;
+       u8 dual_mode;
+       u8 adf;
+};
+
 #if defined(CONFIG_DVB_IT913X_FE) || (defined(CONFIG_DVB_IT913X_FE_MODULE) && \
 defined(MODULE))
 extern struct dvb_frontend *it913x_fe_attach(struct i2c_adapter *i2c_adap,
-                       u8 i2c_addr, u8 adf, u8 type);
+                       u8 i2c_addr, struct ite_config *config);
 #else
 static inline struct dvb_frontend *it913x_fe_attach(
-               struct i2c_adapter *i2c_adap,   u8 i2c_addr, u8 adf, u8 type)
+               struct i2c_adapter *i2c_adap,
+                       u8 i2c_addr, struct ite_config *config)
 {
        printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
        return NULL;
@@ -144,8 +156,14 @@ static inline struct dvb_frontend *it913x_fe_attach(
 #define EST_SIGNAL_LEVEL       0x004a
 #define FREE_BAND              0x004b
 #define SUSPEND_FLAG           0x004c
-/* Build in tuners */
+/* Build in tuner types */
 #define IT9137 0x38
+#define IT9135_38 0x38
+#define IT9135_51 0x50
+#define IT9135_52 0x52
+#define IT9135_60 0x60
+#define IT9135_61 0x61
+#define IT9135_62 0x62
 
 enum {
        CMD_DEMOD_READ = 0,
index 0e2f61a8978ffe3febef2321bd1e2d5fcd790cbf..0d6d5e3e2c31a2de892eb15c3df19c7b03571414 100644 (file)
@@ -879,7 +879,36 @@ static int s5h1409_read_snr(struct dvb_frontend *fe, u16 *snr)
 static int s5h1409_read_signal_strength(struct dvb_frontend *fe,
                                        u16 *signal_strength)
 {
-       return s5h1409_read_snr(fe, signal_strength);
+       /* borrowed from lgdt330x.c
+        *
+        * Calculate strength from SNR up to 35dB
+        * Even though the SNR can go higher than 35dB,
+        * there is some comfort factor in having a range of
+        * strong signals that can show at 100%
+        */
+       u16 snr;
+       u32 tmp;
+       int ret = s5h1409_read_snr(fe, &snr);
+
+       *signal_strength = 0;
+
+       if (0 == ret) {
+               /* The following calculation method was chosen
+                * purely for the sake of code re-use from the
+                * other demod drivers that use this method */
+
+               /* Convert from SNR in dB * 10 to 8.24 fixed-point */
+               tmp = (snr * ((1 << 24) / 10));
+
+               /* Convert from 8.24 fixed-point to
+                * scale the range 0 - 35*2^24 into 0 - 65535*/
+               if (tmp >= 8960 * 0x10000)
+                       *signal_strength = 0xffff;
+               else
+                       *signal_strength = tmp / 8960;
+       }
+
+       return ret;
 }
 
 static int s5h1409_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
index d8adf1e32019a9f7b62a712d693dd242ee79e036..5fca113a2013f25d043a3666cf361970de18e1e1 100644 (file)
@@ -794,7 +794,36 @@ static int s5h1411_read_snr(struct dvb_frontend *fe, u16 *snr)
 static int s5h1411_read_signal_strength(struct dvb_frontend *fe,
        u16 *signal_strength)
 {
-       return s5h1411_read_snr(fe, signal_strength);
+       /* borrowed from lgdt330x.c
+        *
+        * Calculate strength from SNR up to 35dB
+        * Even though the SNR can go higher than 35dB,
+        * there is some comfort factor in having a range of
+        * strong signals that can show at 100%
+        */
+       u16 snr;
+       u32 tmp;
+       int ret = s5h1411_read_snr(fe, &snr);
+
+       *signal_strength = 0;
+
+       if (0 == ret) {
+               /* The following calculation method was chosen
+                * purely for the sake of code re-use from the
+                * other demod drivers that use this method */
+
+               /* Convert from SNR in dB * 10 to 8.24 fixed-point */
+               tmp = (snr * ((1 << 24) / 10));
+
+               /* Convert from 8.24 fixed-point to
+                * scale the range 0 - 35*2^24 into 0 - 65535*/
+               if (tmp >= 8960 * 0x10000)
+                       *signal_strength = 0xffff;
+               else
+                       *signal_strength = tmp / 8960;
+       }
+
+       return ret;
 }
 
 static int s5h1411_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
index 1b1bf200c55c4b1c65dea314d5abcffcf89e7027..de544f6a4d706d44e807301ae7d42619c4f6d116 100644 (file)
@@ -1123,20 +1123,6 @@ static int release(struct dvb_frontend *fe)
        return 0;
 }
 
-/*
- * As defined on EN 300 429 Annex A and on ITU-T J.83 annex A, the DVB-C
- * roll-off factor is 0.15.
- * According with the specs, the amount of the needed bandwith is given by:
- *     Bw = Symbol_rate * (1 + 0.15)
- * As such, the maximum symbol rate supported by 6 MHz is
- *     max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds
- *NOTE: For ITU-T J.83 Annex C, the roll-off factor is 0.13. So:
- *     max_symbol_rate = 6 MHz / 1.13 = 5309735 Baud
- *     That means that an adjustment is needed for Japan,
- *     but, as currently DRX-K is hardcoded to Annex A, let's stick
- *     with 0.15 roll-off factor.
- */
-#define MAX_SYMBOL_RATE_6MHz   5217391
 
 static int set_params(struct dvb_frontend *fe,
                      struct dvb_frontend_parameters *params)
@@ -1144,6 +1130,7 @@ static int set_params(struct dvb_frontend *fe,
        struct tda_state *state = fe->tuner_priv;
        int status = 0;
        int Standard;
+       u32 bw;
 
        state->m_Frequency = params->frequency;
 
@@ -1161,8 +1148,23 @@ static int set_params(struct dvb_frontend *fe,
                        break;
                }
        else if (fe->ops.info.type == FE_QAM) {
-               if (params->u.qam.symbol_rate <= MAX_SYMBOL_RATE_6MHz)
+               /*
+                * Using a higher bandwidth at the tuner filter may
+                * allow inter-carrier interference.
+                * So, determine the minimal channel spacing, in order
+                * to better adjust the tuner filter.
+                * According with ITU-T J.83, the bandwidth is given by:
+                * bw = Simbol Rate * (1 + roll_off), where the roll_off
+                * is equal to 0.15 for Annex A, and 0.13 for annex C
+                */
+               if (fe->dtv_property_cache.rolloff == ROLLOFF_13)
+                       bw = (params->u.qam.symbol_rate * 13) / 10;
+               else
+                       bw = (params->u.qam.symbol_rate * 15) / 10;
+               if (bw <= 6000000)
                        Standard = HF_DVBC_6MHZ;
+               else if (bw <= 7000000)
+                       Standard = HF_DVBC_7MHZ;
                else
                        Standard = HF_DVBC_8MHZ;
        } else
index ccd5f0d8a012113a08b788b9927860079289fa0c..e954781c90bfd920e57bea52d1a1fa2c34f8a151 100644 (file)
@@ -11,6 +11,162 @@ menuconfig RADIO_ADAPTERS
 
 if RADIO_ADAPTERS && VIDEO_V4L2
 
+config RADIO_SI470X
+       bool "Silicon Labs Si470x FM Radio Receiver support"
+       depends on VIDEO_V4L2
+
+source "drivers/media/radio/si470x/Kconfig"
+
+config USB_MR800
+       tristate "AverMedia MR 800 USB FM radio support"
+       depends on USB && VIDEO_V4L2
+       ---help---
+         Say Y here if you want to connect this type of radio to your
+         computer's USB port. Note that the audio is not digital, and
+         you must connect the line out connector to a sound card or a
+         set of speakers.
+
+         To compile this driver as a module, choose M here: the
+         module will be called radio-mr800.
+
+config USB_DSBR
+       tristate "D-Link/GemTek USB FM radio support"
+       depends on USB && VIDEO_V4L2
+       ---help---
+         Say Y here if you want to connect this type of radio to your
+         computer's USB port. Note that the audio is not digital, and
+         you must connect the line out connector to a sound card or a
+         set of speakers.
+
+         To compile this driver as a module, choose M here: the
+         module will be called dsbr100.
+
+config RADIO_MAXIRADIO
+       tristate "Guillemot MAXI Radio FM 2000 radio"
+       depends on VIDEO_V4L2 && PCI
+       ---help---
+         Choose Y here if you have this radio card.  This card may also be
+         found as Gemtek PCI FM.
+
+         In order to control your radio card, you will need to use programs
+         that are compatible with the Video For Linux API.  Information on
+         this API and pointers to "v4l" programs may be found at
+         <file:Documentation/video4linux/API.html>.
+
+         To compile this driver as a module, choose M here: the
+         module will be called radio-maxiradio.
+
+
+config I2C_SI4713
+       tristate "I2C driver for Silicon Labs Si4713 device"
+       depends on I2C && VIDEO_V4L2
+       ---help---
+         Say Y here if you want support to Si4713 I2C device.
+         This device driver supports only i2c bus.
+
+         To compile this driver as a module, choose M here: the
+         module will be called si4713.
+
+config RADIO_SI4713
+       tristate "Silicon Labs Si4713 FM Radio Transmitter support"
+       depends on I2C && VIDEO_V4L2
+       select I2C_SI4713
+       ---help---
+         Say Y here if you want support to Si4713 FM Radio Transmitter.
+         This device can transmit audio through FM. It can transmit
+         RDS and RBDS signals as well. This module is the v4l2 radio
+         interface for the i2c driver of this device.
+
+         To compile this driver as a module, choose M here: the
+         module will be called radio-si4713.
+
+config RADIO_TEA5764
+       tristate "TEA5764 I2C FM radio support"
+       depends on I2C && VIDEO_V4L2
+       ---help---
+         Say Y here if you want to use the TEA5764 FM chip found in
+         EZX phones. This FM chip is present in EZX phones from Motorola,
+         connected to internal pxa I2C bus.
+
+         To compile this driver as a module, choose M here: the
+         module will be called radio-tea5764.
+
+config RADIO_TEA5764_XTAL
+       bool "TEA5764 crystal reference"
+       depends on RADIO_TEA5764=y
+       default y
+       help
+         Say Y here if TEA5764 have a 32768 Hz crystal in circuit, say N
+         here if TEA5764 reference frequency is connected in FREQIN.
+
+config RADIO_SAA7706H
+       tristate "SAA7706H Car Radio DSP"
+       depends on I2C && VIDEO_V4L2
+       ---help---
+         Say Y here if you want to use the SAA7706H Car radio Digital
+         Signal Processor, found for instance on the Russellville development
+         board. On the russellville the device is connected to internal
+         timberdale I2C bus.
+
+         To compile this driver as a module, choose M here: the
+         module will be called SAA7706H.
+
+config RADIO_TEF6862
+       tristate "TEF6862 Car Radio Enhanced Selectivity Tuner"
+       depends on I2C && VIDEO_V4L2
+       ---help---
+         Say Y here if you want to use the TEF6862 Car Radio Enhanced
+         Selectivity Tuner, found for instance on the Russellville development
+         board. On the russellville the device is connected to internal
+         timberdale I2C bus.
+
+         To compile this driver as a module, choose M here: the
+         module will be called TEF6862.
+
+config RADIO_TIMBERDALE
+       tristate "Enable the Timberdale radio driver"
+       depends on MFD_TIMBERDALE && VIDEO_V4L2
+       depends on I2C  # for RADIO_SAA7706H
+       select RADIO_TEF6862
+       select RADIO_SAA7706H
+       ---help---
+         This is a kind of umbrella driver for the Radio Tuner and DSP
+         found behind the Timberdale FPGA on the Russellville board.
+         Enabling this driver will automatically select the DSP and tuner.
+
+config RADIO_WL1273
+       tristate "Texas Instruments WL1273 I2C FM Radio"
+       depends on I2C && VIDEO_V4L2
+       select MFD_CORE
+       select MFD_WL1273_CORE
+       select FW_LOADER
+       ---help---
+         Choose Y here if you have this FM radio chip.
+
+         In order to control your radio card, you will need to use programs
+         that are compatible with the Video For Linux 2 API.  Information on
+         this API and pointers to "v4l2" programs may be found at
+         <file:Documentation/video4linux/API.html>.
+
+         To compile this driver as a module, choose M here: the
+         module will be called radio-wl1273.
+
+# TI's ST based wl128x FM radio
+source "drivers/media/radio/wl128x/Kconfig"
+
+#
+# ISA drivers configuration
+#
+
+menuconfig V4L_RADIO_ISA_DRIVERS
+       bool "ISA radio devices"
+       depends on ISA
+       default n
+       ---help---
+         Say Y here to enable support for these ISA drivers.
+
+if V4L_RADIO_ISA_DRIVERS
+
 config RADIO_CADET
        tristate "ADS Cadet AM/FM Tuner"
        depends on ISA && VIDEO_V4L2
@@ -151,21 +307,6 @@ config RADIO_GEMTEK_PROBE
          following ports will be probed: 0x20c, 0x30c, 0x24c, 0x34c, 0x248 and
          0x28c.
 
-config RADIO_MAXIRADIO
-       tristate "Guillemot MAXI Radio FM 2000 radio"
-       depends on VIDEO_V4L2 && PCI
-       ---help---
-         Choose Y here if you have this radio card.  This card may also be
-         found as Gemtek PCI FM.
-
-         In order to control your radio card, you will need to use programs
-         that are compatible with the Video For Linux API.  Information on
-         this API and pointers to "v4l" programs may be found at
-         <file:Documentation/video4linux/API.html>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called radio-maxiradio.
-
 config RADIO_MIROPCM20
        tristate "miroSOUND PCM20 radio"
        depends on ISA && ISA_DMA_API && VIDEO_V4L2 && SND
@@ -316,130 +457,6 @@ config RADIO_ZOLTRIX_PORT
        help
          Enter the I/O port of your Zoltrix radio card.
 
-config I2C_SI4713
-       tristate "I2C driver for Silicon Labs Si4713 device"
-       depends on I2C && VIDEO_V4L2
-       ---help---
-         Say Y here if you want support to Si4713 I2C device.
-         This device driver supports only i2c bus.
-
-         To compile this driver as a module, choose M here: the
-         module will be called si4713.
-
-config RADIO_SI4713
-       tristate "Silicon Labs Si4713 FM Radio Transmitter support"
-       depends on I2C && VIDEO_V4L2
-       select I2C_SI4713
-       ---help---
-         Say Y here if you want support to Si4713 FM Radio Transmitter.
-         This device can transmit audio through FM. It can transmit
-         RDS and RBDS signals as well. This module is the v4l2 radio
-         interface for the i2c driver of this device.
-
-         To compile this driver as a module, choose M here: the
-         module will be called radio-si4713.
-
-config USB_DSBR
-       tristate "D-Link/GemTek USB FM radio support"
-       depends on USB && VIDEO_V4L2
-       ---help---
-         Say Y here if you want to connect this type of radio to your
-         computer's USB port. Note that the audio is not digital, and
-         you must connect the line out connector to a sound card or a
-         set of speakers.
-
-         To compile this driver as a module, choose M here: the
-         module will be called dsbr100.
-
-config RADIO_SI470X
-       bool "Silicon Labs Si470x FM Radio Receiver support"
-       depends on VIDEO_V4L2
-
-source "drivers/media/radio/si470x/Kconfig"
-
-config USB_MR800
-       tristate "AverMedia MR 800 USB FM radio support"
-       depends on USB && VIDEO_V4L2
-       ---help---
-         Say Y here if you want to connect this type of radio to your
-         computer's USB port. Note that the audio is not digital, and
-         you must connect the line out connector to a sound card or a
-         set of speakers.
-
-         To compile this driver as a module, choose M here: the
-         module will be called radio-mr800.
-
-config RADIO_TEA5764
-       tristate "TEA5764 I2C FM radio support"
-       depends on I2C && VIDEO_V4L2
-       ---help---
-         Say Y here if you want to use the TEA5764 FM chip found in
-         EZX phones. This FM chip is present in EZX phones from Motorola,
-         connected to internal pxa I2C bus.
-
-         To compile this driver as a module, choose M here: the
-         module will be called radio-tea5764.
-
-config RADIO_TEA5764_XTAL
-       bool "TEA5764 crystal reference"
-       depends on RADIO_TEA5764=y
-       default y
-       help
-         Say Y here if TEA5764 have a 32768 Hz crystal in circuit, say N
-         here if TEA5764 reference frequency is connected in FREQIN.
-
-config RADIO_SAA7706H
-       tristate "SAA7706H Car Radio DSP"
-       depends on I2C && VIDEO_V4L2
-       ---help---
-         Say Y here if you want to use the SAA7706H Car radio Digital
-         Signal Processor, found for instance on the Russellville development
-         board. On the russellville the device is connected to internal
-         timberdale I2C bus.
-
-         To compile this driver as a module, choose M here: the
-         module will be called SAA7706H.
-
-config RADIO_TEF6862
-       tristate "TEF6862 Car Radio Enhanced Selectivity Tuner"
-       depends on I2C && VIDEO_V4L2
-       ---help---
-         Say Y here if you want to use the TEF6862 Car Radio Enhanced
-         Selectivity Tuner, found for instance on the Russellville development
-         board. On the russellville the device is connected to internal
-         timberdale I2C bus.
-
-         To compile this driver as a module, choose M here: the
-         module will be called TEF6862.
-
-config RADIO_TIMBERDALE
-       tristate "Enable the Timberdale radio driver"
-       depends on MFD_TIMBERDALE && VIDEO_V4L2
-       depends on I2C  # for RADIO_SAA7706H
-       select RADIO_TEF6862
-       select RADIO_SAA7706H
-       ---help---
-         This is a kind of umbrella driver for the Radio Tuner and DSP
-         found behind the Timberdale FPGA on the Russellville board.
-         Enabling this driver will automatically select the DSP and tuner.
-
-config RADIO_WL1273
-       tristate "Texas Instruments WL1273 I2C FM Radio"
-       depends on I2C && VIDEO_V4L2
-       select MFD_WL1273_CORE
-       select FW_LOADER
-       ---help---
-         Choose Y here if you have this FM radio chip.
-
-         In order to control your radio card, you will need to use programs
-         that are compatible with the Video For Linux 2 API.  Information on
-         this API and pointers to "v4l2" programs may be found at
-         <file:Documentation/video4linux/API.html>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called radio-wl1273.
-
-# TI's ST based wl128x FM radio
-source "drivers/media/radio/wl128x/Kconfig"
+endif # V4L_RADIO_ISA_DRIVERS
 
 endif # RADIO_ADAPTERS
index aeb7f43dfb652790b053192bceeca1f9fdf31758..4df4affeea5f1537d72a8383c970f472b34635b1 100644 (file)
@@ -87,6 +87,16 @@ config IR_RC5_SZ_DECODER
           uses an IR protocol that is almost standard RC-5, but not quite,
           as it uses an additional bit).
 
+config IR_SANYO_DECODER
+       tristate "Enable IR raw decoder for the Sanyo protocol"
+       depends on RC_CORE
+       default y
+
+       ---help---
+          Enable this option if you have an infrared remote control which
+          uses the Sanyo protocol (Sanyo, Aiwa, Chinon remotes),
+          and you need software decoding support.
+
 config IR_MCE_KBD_DECODER
        tristate "Enable IR raw decoder for the MCE keyboard/mouse protocol"
        depends on RC_CORE
index 2156e786b5571194bbe36b69c4ac1e610cbfc75c..fb3dee2dd84584788c14af2ef0aab4816a0c88bb 100644 (file)
@@ -10,6 +10,7 @@ obj-$(CONFIG_IR_RC6_DECODER) += ir-rc6-decoder.o
 obj-$(CONFIG_IR_JVC_DECODER) += ir-jvc-decoder.o
 obj-$(CONFIG_IR_SONY_DECODER) += ir-sony-decoder.o
 obj-$(CONFIG_IR_RC5_SZ_DECODER) += ir-rc5-sz-decoder.o
+obj-$(CONFIG_IR_SANYO_DECODER) += ir-sanyo-decoder.o
 obj-$(CONFIG_IR_MCE_KBD_DECODER) += ir-mce_kbd-decoder.o
 obj-$(CONFIG_IR_LIRC_CODEC) += ir-lirc-codec.o
 
index 17f8db00435ac70269823ae3f029968cebbbd72a..3c9431a9f62d282d37238ab6089cd63ca73ad77b 100644 (file)
@@ -194,8 +194,8 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
                return 0;
        }
 
-       IR_dprintk(1, "NEC decode failed at state %d (%uus %s)\n",
-                  data->state, TO_US(ev.duration), TO_STR(ev.pulse));
+       IR_dprintk(1, "NEC decode failed at count %d state %d (%uus %s)\n",
+                  data->count, data->state, TO_US(ev.duration), TO_STR(ev.pulse));
        data->state = STATE_INACTIVE;
        return -EINVAL;
 }
index 2e5cd3100b64476da15ef33508cbd39dd42ded50..95e630998aaf42d2e2441514f62713038ab41fdc 100644 (file)
@@ -357,6 +357,7 @@ static void init_decoders(struct work_struct *work)
        load_rc6_decode();
        load_jvc_decode();
        load_sony_decode();
+       load_sanyo_decode();
        load_mce_kbd_decode();
        load_lirc_codec();
 
diff --git a/drivers/media/rc/ir-sanyo-decoder.c b/drivers/media/rc/ir-sanyo-decoder.c
new file mode 100644 (file)
index 0000000..1646730
--- /dev/null
@@ -0,0 +1,204 @@
+/* ir-sanyo-decoder.c - handle SANYO IR Pulse/Space protocol
+ *
+ * Copyright (C) 2011 by Mauro Carvalho Chehab <mchehab@redhat.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 version 2 of the License.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ * This protocol uses the NEC protocol timings. However, data is formatted as:
+ *     13 bits Custom Code
+ *     13 bits NOT(Custom Code)
+ *     8 bits Key data
+ *     8 bits NOT(Key data)
+ *
+ * According with LIRC, this protocol is used on Sanyo, Aiwa and Chinon
+ * Information for this protocol is available at the Sanyo LC7461 datasheet.
+ */
+
+#include <linux/bitrev.h>
+#include "rc-core-priv.h"
+
+#define SANYO_NBITS            (13+13+8+8)
+#define SANYO_UNIT             562500  /* ns */
+#define SANYO_HEADER_PULSE     (16  * SANYO_UNIT)
+#define SANYO_HEADER_SPACE     (8   * SANYO_UNIT)
+#define SANYO_BIT_PULSE                (1   * SANYO_UNIT)
+#define SANYO_BIT_0_SPACE      (1   * SANYO_UNIT)
+#define SANYO_BIT_1_SPACE      (3   * SANYO_UNIT)
+#define SANYO_REPEAT_SPACE     (150 * SANYO_UNIT)
+#define        SANYO_TRAILER_PULSE     (1   * SANYO_UNIT)
+#define        SANYO_TRAILER_SPACE     (10  * SANYO_UNIT)      /* in fact, 42 */
+
+enum sanyo_state {
+       STATE_INACTIVE,
+       STATE_HEADER_SPACE,
+       STATE_BIT_PULSE,
+       STATE_BIT_SPACE,
+       STATE_TRAILER_PULSE,
+       STATE_TRAILER_SPACE,
+};
+
+/**
+ * ir_sanyo_decode() - Decode one SANYO pulse or space
+ * @dev:       the struct rc_dev descriptor of the device
+ * @duration:  the struct ir_raw_event descriptor of the pulse/space
+ *
+ * This function returns -EINVAL if the pulse violates the state machine
+ */
+static int ir_sanyo_decode(struct rc_dev *dev, struct ir_raw_event ev)
+{
+       struct sanyo_dec *data = &dev->raw->sanyo;
+       u32 scancode;
+       u8 address, not_address, command, not_command;
+
+       if (!(dev->raw->enabled_protocols & RC_TYPE_SANYO))
+               return 0;
+
+       if (!is_timing_event(ev)) {
+               if (ev.reset) {
+                       IR_dprintk(1, "SANYO event reset received. reset to state 0\n");
+                       data->state = STATE_INACTIVE;
+               }
+               return 0;
+       }
+
+       IR_dprintk(2, "SANYO decode started at state %d (%uus %s)\n",
+                  data->state, TO_US(ev.duration), TO_STR(ev.pulse));
+
+       switch (data->state) {
+
+       case STATE_INACTIVE:
+               if (!ev.pulse)
+                       break;
+
+               if (eq_margin(ev.duration, SANYO_HEADER_PULSE, SANYO_UNIT / 2)) {
+                       data->count = 0;
+                       data->state = STATE_HEADER_SPACE;
+                       return 0;
+               }
+               break;
+
+
+       case STATE_HEADER_SPACE:
+               if (ev.pulse)
+                       break;
+
+               if (eq_margin(ev.duration, SANYO_HEADER_SPACE, SANYO_UNIT / 2)) {
+                       data->state = STATE_BIT_PULSE;
+                       return 0;
+               }
+
+               break;
+
+       case STATE_BIT_PULSE:
+               if (!ev.pulse)
+                       break;
+
+               if (!eq_margin(ev.duration, SANYO_BIT_PULSE, SANYO_UNIT / 2))
+                       break;
+
+               data->state = STATE_BIT_SPACE;
+               return 0;
+
+       case STATE_BIT_SPACE:
+               if (ev.pulse)
+                       break;
+
+               if (!data->count && geq_margin(ev.duration, SANYO_REPEAT_SPACE, SANYO_UNIT / 2)) {
+                       if (!dev->keypressed) {
+                               IR_dprintk(1, "SANYO discarding last key repeat: event after key up\n");
+                       } else {
+                               rc_repeat(dev);
+                               IR_dprintk(1, "SANYO repeat last key\n");
+                               data->state = STATE_INACTIVE;
+                       }
+                       return 0;
+               }
+
+               data->bits <<= 1;
+               if (eq_margin(ev.duration, SANYO_BIT_1_SPACE, SANYO_UNIT / 2))
+                       data->bits |= 1;
+               else if (!eq_margin(ev.duration, SANYO_BIT_0_SPACE, SANYO_UNIT / 2))
+                       break;
+               data->count++;
+
+               if (data->count == SANYO_NBITS)
+                       data->state = STATE_TRAILER_PULSE;
+               else
+                       data->state = STATE_BIT_PULSE;
+
+               return 0;
+
+       case STATE_TRAILER_PULSE:
+               if (!ev.pulse)
+                       break;
+
+               if (!eq_margin(ev.duration, SANYO_TRAILER_PULSE, SANYO_UNIT / 2))
+                       break;
+
+               data->state = STATE_TRAILER_SPACE;
+               return 0;
+
+       case STATE_TRAILER_SPACE:
+               if (ev.pulse)
+                       break;
+
+               if (!geq_margin(ev.duration, SANYO_TRAILER_SPACE, SANYO_UNIT / 2))
+                       break;
+
+               address     = bitrev16((data->bits >> 29) & 0x1fff) >> 3;
+               not_address = bitrev16((data->bits >> 16) & 0x1fff) >> 3;
+               command     = bitrev8((data->bits >>  8) & 0xff);
+               not_command = bitrev8((data->bits >>  0) & 0xff);
+
+               if ((command ^ not_command) != 0xff) {
+                       IR_dprintk(1, "SANYO checksum error: received 0x%08Lx\n",
+                                  data->bits);
+                       data->state = STATE_INACTIVE;
+                       return 0;
+               }
+
+               scancode = address << 8 | command;
+               IR_dprintk(1, "SANYO scancode: 0x%06x\n", scancode);
+               rc_keydown(dev, scancode, 0);
+               data->state = STATE_INACTIVE;
+               return 0;
+       }
+
+       IR_dprintk(1, "SANYO decode failed at count %d state %d (%uus %s)\n",
+                  data->count, data->state, TO_US(ev.duration), TO_STR(ev.pulse));
+       data->state = STATE_INACTIVE;
+       return -EINVAL;
+}
+
+static struct ir_raw_handler sanyo_handler = {
+       .protocols      = RC_TYPE_SANYO,
+       .decode         = ir_sanyo_decode,
+};
+
+static int __init ir_sanyo_decode_init(void)
+{
+       ir_raw_handler_register(&sanyo_handler);
+
+       printk(KERN_INFO "IR SANYO protocol handler initialized\n");
+       return 0;
+}
+
+static void __exit ir_sanyo_decode_exit(void)
+{
+       ir_raw_handler_unregister(&sanyo_handler);
+}
+
+module_init(ir_sanyo_decode_init);
+module_exit(ir_sanyo_decode_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
+MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com)");
+MODULE_DESCRIPTION("SANYO IR protocol decoder");
index e51c6163378b5e0bece020e4a615da5b0095640c..929bbbc163931ca9e9883b471d293754d0f75e33 100644 (file)
@@ -182,6 +182,57 @@ static struct rc_map_table rc5_hauppauge_new[] = {
        { 0x1d3d, KEY_POWER },
        { 0x1d3f, KEY_HOME },
 
+       /*
+        * Keycodes for PT# R-005 remote bundled with Haupauge HVR-930C
+        * Keycodes start with address = 0x1c
+        */
+       { 0x1c3b, KEY_GOTO },
+       { 0x1c3d, KEY_POWER },
+
+       { 0x1c14, KEY_UP },
+       { 0x1c15, KEY_DOWN },
+       { 0x1c16, KEY_LEFT },
+       { 0x1c17, KEY_RIGHT },
+       { 0x1c25, KEY_OK },
+
+       { 0x1c00, KEY_0 },
+       { 0x1c01, KEY_1 },
+       { 0x1c02, KEY_2 },
+       { 0x1c03, KEY_3 },
+       { 0x1c04, KEY_4 },
+       { 0x1c05, KEY_5 },
+       { 0x1c06, KEY_6 },
+       { 0x1c07, KEY_7 },
+       { 0x1c08, KEY_8 },
+       { 0x1c09, KEY_9 },
+
+       { 0x1c1f, KEY_EXIT },   /* BACK */
+       { 0x1c0d, KEY_MENU },
+       { 0x1c1c, KEY_TV },
+
+       { 0x1c10, KEY_VOLUMEUP },
+       { 0x1c11, KEY_VOLUMEDOWN },
+
+       { 0x1c20, KEY_CHANNELUP },
+       { 0x1c21, KEY_CHANNELDOWN },
+
+       { 0x1c0f, KEY_MUTE },
+       { 0x1c12, KEY_PREVIOUS }, /* Prev */
+
+       { 0x1c36, KEY_STOP },
+       { 0x1c37, KEY_RECORD },
+
+       { 0x1c24, KEY_LAST },           /* <|             */
+       { 0x1c1e, KEY_NEXT },           /* >|             */
+
+       { 0x1c0a, KEY_TEXT },
+       { 0x1c0e, KEY_SUBTITLE },       /* CC */
+
+       { 0x1c32, KEY_REWIND },
+       { 0x1c30, KEY_PAUSE },
+       { 0x1c35, KEY_PLAY },
+       { 0x1c34, KEY_FASTFORWARD },
+
        /*
         * Keycodes for the old Black Remote Controller
         * This one also uses RC-5 protocol
index c6ca870e8b7eb1e2a112b8da1670cd896ed12e1d..b72f8580e3170ba14b629cab0e0ae88d9d83095f 100644 (file)
@@ -84,6 +84,11 @@ struct ir_raw_event_ctrl {
                unsigned count;
                unsigned wanted_bits;
        } rc5_sz;
+       struct sanyo_dec {
+               int state;
+               unsigned count;
+               u64 bits;
+       } sanyo;
        struct mce_kbd_dec {
                struct input_dev *idev;
                struct timer_list rx_timeout;
@@ -193,6 +198,13 @@ static inline void load_jvc_decode(void) { }
 static inline void load_sony_decode(void) { }
 #endif
 
+/* from ir-sanyo-decoder.c */
+#ifdef CONFIG_IR_SANYO_DECODER_MODULE
+#define load_sanyo_decode()    request_module("ir-sanyo-decoder")
+#else
+static inline void load_sanyo_decode(void) { }
+#endif
+
 /* from ir-mce_kbd-decoder.c */
 #ifdef CONFIG_IR_MCE_KBD_DECODER_MODULE
 #define load_mce_kbd_decode()  request_module("ir-mce_kbd-decoder")
index 29f900065d8ad7c74f252cb8b8a3479b0c456838..0ea55ea2b71d28577ba4f92224a9375ac594aa0c 100644 (file)
@@ -736,6 +736,7 @@ static struct {
        { RC_TYPE_JVC,          "jvc"           },
        { RC_TYPE_SONY,         "sony"          },
        { RC_TYPE_RC5_SZ,       "rc-5-sz"       },
+       { RC_TYPE_SANYO,        "sanyo"         },
        { RC_TYPE_MCE_KBD,      "mce_kbd"       },
        { RC_TYPE_LIRC,         "lirc"          },
        { RC_TYPE_OTHER,        "other"         },
index b303a3f8a9f8ac776f83511740e52d91e36095e4..4e8a0c4bc000641a5fd6bdf21baf47074ac33ec8 100644 (file)
@@ -580,25 +580,6 @@ config VIDEO_M52790
 
 endmenu # encoder / decoder chips
 
-config VIDEO_SH_VOU
-       tristate "SuperH VOU video output driver"
-       depends on VIDEO_DEV && ARCH_SHMOBILE
-       select VIDEOBUF_DMA_CONTIG
-       help
-         Support for the Video Output Unit (VOU) on SuperH SoCs.
-
-config VIDEO_VIU
-       tristate "Freescale VIU Video Driver"
-       depends on VIDEO_V4L2 && PPC_MPC512x
-       select VIDEOBUF_DMA_CONTIG
-       default y
-       ---help---
-         Support for Freescale VIU video driver. This device captures
-         video data, or overlays video on DIU frame buffer.
-
-         Say Y here if you want to enable VIU device on MPC5121e Rev2+.
-         In doubt, say N.
-
 config VIDEO_VIVI
        tristate "Virtual Video Driver"
        depends on VIDEO_DEV && VIDEO_V4L2 && !SPARC32 && !SPARC64
@@ -613,66 +594,130 @@ config VIDEO_VIVI
          Say Y here if you want to test video apps or debug V4L devices.
          In doubt, say N.
 
-source "drivers/media/video/davinci/Kconfig"
+#
+# USB Multimedia device configuration
+#
 
-source "drivers/media/video/omap/Kconfig"
+menuconfig V4L_USB_DRIVERS
+       bool "V4L USB devices"
+       depends on USB
+       default y
 
-source "drivers/media/video/bt8xx/Kconfig"
+if V4L_USB_DRIVERS
 
-config VIDEO_PMS
-       tristate "Mediavision Pro Movie Studio Video For Linux"
-       depends on ISA && VIDEO_V4L2
-       help
-         Say Y if you have such a thing.
+source "drivers/media/video/uvc/Kconfig"
+
+source "drivers/media/video/gspca/Kconfig"
+
+source "drivers/media/video/pvrusb2/Kconfig"
+
+source "drivers/media/video/hdpvr/Kconfig"
+
+source "drivers/media/video/em28xx/Kconfig"
+
+source "drivers/media/video/tlg2300/Kconfig"
+
+source "drivers/media/video/cx231xx/Kconfig"
+
+source "drivers/media/video/tm6000/Kconfig"
+
+source "drivers/media/video/usbvision/Kconfig"
+
+source "drivers/media/video/et61x251/Kconfig"
+
+source "drivers/media/video/sn9c102/Kconfig"
+
+source "drivers/media/video/pwc/Kconfig"
+
+source "drivers/media/video/cpia2/Kconfig"
+
+config USB_ZR364XX
+       tristate "USB ZR364XX Camera support"
+       depends on VIDEO_V4L2
+       select VIDEOBUF_GEN
+       select VIDEOBUF_VMALLOC
+       ---help---
+         Say Y here if you want to connect this type of camera to your
+         computer's USB port.
+         See <file:Documentation/video4linux/zr364xx.txt> for more info
+         and list of supported cameras.
 
          To compile this driver as a module, choose M here: the
-         module will be called pms.
+         module will be called zr364xx.
 
-config VIDEO_BWQCAM
-       tristate "Quickcam BW Video For Linux"
-       depends on PARPORT && VIDEO_V4L2
-       help
-         Say Y have if you the black and white version of the QuickCam
-         camera. See the next option for the color version.
+config USB_STKWEBCAM
+       tristate "USB Syntek DC1125 Camera support"
+       depends on VIDEO_V4L2 && EXPERIMENTAL
+       ---help---
+         Say Y here if you want to use this type of camera.
+         Supported devices are typically found in some Asus laptops,
+         with USB id 174f:a311 and 05e1:0501. Other Syntek cameras
+         may be supported by the stk11xx driver, from which this is
+         derived, see <http://sourceforge.net/projects/syntekdriver/>
 
          To compile this driver as a module, choose M here: the
-         module will be called bw-qcam.
+         module will be called stkwebcam.
 
-config VIDEO_CQCAM
-       tristate "QuickCam Colour Video For Linux (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && PARPORT && VIDEO_V4L2
+config USB_S2255
+       tristate "USB Sensoray 2255 video capture device"
+       depends on VIDEO_V4L2
+       select VIDEOBUF_VMALLOC
+       default n
        help
-         This is the video4linux driver for the colour version of the
-         Connectix QuickCam.  If you have one of these cameras, say Y here,
-         otherwise say N.  This driver does not work with the original
-         monochrome QuickCam, QuickCam VC or QuickClip.  It is also available
-         as a module (c-qcam).
-         Read <file:Documentation/video4linux/CQcam.txt> for more information.
+         Say Y here if you want support for the Sensoray 2255 USB device.
+         This driver can be compiled as a module, called s2255drv.
 
-config VIDEO_W9966
-       tristate "W9966CF Webcam (FlyCam Supra and others) Video For Linux"
-       depends on PARPORT_1284 && PARPORT && VIDEO_V4L2
-       help
-         Video4linux driver for Winbond's w9966 based Webcams.
-         Currently tested with the LifeView FlyCam Supra.
-         If you have one of these cameras, say Y here
-         otherwise say N.
-         This driver is also available as a module (w9966).
+endif # V4L_USB_DRIVERS
 
-         Check out <file:Documentation/video4linux/w9966.txt> for more
-         information.
+#
+# PCI drivers configuration
+#
 
-source "drivers/media/video/cpia2/Kconfig"
+menuconfig V4L_PCI_DRIVERS
+       bool "V4L PCI(e) devices"
+       depends on PCI
+       default y
+       ---help---
+         Say Y here to enable support for these PCI(e) drivers.
 
-config VIDEO_VINO
-       tristate "SGI Vino Video For Linux (EXPERIMENTAL)"
-       depends on I2C && SGI_IP22 && EXPERIMENTAL && VIDEO_V4L2
-       select VIDEO_SAA7191 if VIDEO_HELPER_CHIPS_AUTO
-       help
-         Say Y here to build in support for the Vino video input system found
-         on SGI Indy machines.
+if V4L_PCI_DRIVERS
 
-source "drivers/media/video/zoran/Kconfig"
+source "drivers/media/video/au0828/Kconfig"
+
+source "drivers/media/video/bt8xx/Kconfig"
+
+source "drivers/media/video/cx18/Kconfig"
+
+source "drivers/media/video/cx23885/Kconfig"
+
+source "drivers/media/video/cx25821/Kconfig"
+
+source "drivers/media/video/cx88/Kconfig"
+
+config VIDEO_HEXIUM_GEMINI
+       tristate "Hexium Gemini frame grabber"
+       depends on PCI && VIDEO_V4L2 && I2C
+       select VIDEO_SAA7146_VV
+       ---help---
+         This is a video4linux driver for the Hexium Gemini frame
+         grabber card by Hexium. Please note that the Gemini Dual
+         card is *not* fully supported.
+
+         To compile this driver as a module, choose M here: the
+         module will be called hexium_gemini.
+
+config VIDEO_HEXIUM_ORION
+       tristate "Hexium HV-PCI6 and Orion frame grabber"
+       depends on PCI && VIDEO_V4L2 && I2C
+       select VIDEO_SAA7146_VV
+       ---help---
+         This is a video4linux driver for the Hexium HV-PCI6 and
+         Orion frame grabber cards by Hexium.
+
+         To compile this driver as a module, choose M here: the
+         module will be called hexium_orion.
+
+source "drivers/media/video/ivtv/Kconfig"
 
 config VIDEO_MEYE
        tristate "Sony Vaio Picturebook Motion Eye Video For Linux"
@@ -688,8 +733,6 @@ config VIDEO_MEYE
          To compile this driver as a module, choose M here: the
          module will be called meye.
 
-source "drivers/media/video/saa7134/Kconfig"
-
 config VIDEO_MXB
        tristate "Siemens-Nixdorf 'Multimedia eXtension Board'"
        depends on PCI && VIDEO_V4L2 && I2C
@@ -706,28 +749,119 @@ config VIDEO_MXB
          To compile this driver as a module, choose M here: the
          module will be called mxb.
 
-config VIDEO_HEXIUM_ORION
-       tristate "Hexium HV-PCI6 and Orion frame grabber"
-       depends on PCI && VIDEO_V4L2 && I2C
-       select VIDEO_SAA7146_VV
+source "drivers/media/video/saa7134/Kconfig"
+
+source "drivers/media/video/saa7164/Kconfig"
+
+source "drivers/media/video/zoran/Kconfig"
+
+endif # V4L_PCI_DRIVERS
+
+#
+# ISA & parallel port drivers configuration
+#
+
+menuconfig V4L_ISA_PARPORT_DRIVERS
+       bool "V4L ISA and parallel port devices"
+       depends on ISA || PARPORT
+       default n
        ---help---
-         This is a video4linux driver for the Hexium HV-PCI6 and
-         Orion frame grabber cards by Hexium.
+         Say Y here to enable support for these ISA and parallel port drivers.
+
+if V4L_ISA_PARPORT_DRIVERS
+
+config VIDEO_BWQCAM
+       tristate "Quickcam BW Video For Linux"
+       depends on PARPORT && VIDEO_V4L2
+       help
+         Say Y have if you the black and white version of the QuickCam
+         camera. See the next option for the color version.
 
          To compile this driver as a module, choose M here: the
-         module will be called hexium_orion.
+         module will be called bw-qcam.
 
-config VIDEO_HEXIUM_GEMINI
-       tristate "Hexium Gemini frame grabber"
-       depends on PCI && VIDEO_V4L2 && I2C
-       select VIDEO_SAA7146_VV
-       ---help---
-         This is a video4linux driver for the Hexium Gemini frame
-         grabber card by Hexium. Please note that the Gemini Dual
-         card is *not* fully supported.
+config VIDEO_CQCAM
+       tristate "QuickCam Colour Video For Linux"
+       depends on PARPORT && VIDEO_V4L2
+       help
+         This is the video4linux driver for the colour version of the
+         Connectix QuickCam.  If you have one of these cameras, say Y here,
+         otherwise say N.  This driver does not work with the original
+         monochrome QuickCam, QuickCam VC or QuickClip.  It is also available
+         as a module (c-qcam).
+         Read <file:Documentation/video4linux/CQcam.txt> for more information.
+
+config VIDEO_PMS
+       tristate "Mediavision Pro Movie Studio Video For Linux"
+       depends on ISA && VIDEO_V4L2
+       help
+         Say Y if you have the ISA Mediavision Pro Movie Studio
+         capture card.
 
          To compile this driver as a module, choose M here: the
-         module will be called hexium_gemini.
+         module will be called pms.
+
+config VIDEO_W9966
+       tristate "W9966CF Webcam (FlyCam Supra and others) Video For Linux"
+       depends on PARPORT_1284 && PARPORT && VIDEO_V4L2
+       help
+         Video4linux driver for Winbond's w9966 based Webcams.
+         Currently tested with the LifeView FlyCam Supra.
+         If you have one of these cameras, say Y here
+         otherwise say N.
+         This driver is also available as a module (w9966).
+
+         Check out <file:Documentation/video4linux/w9966.txt> for more
+         information.
+
+endif # V4L_ISA_PARPORT_DRIVERS
+
+menuconfig V4L_PLATFORM_DRIVERS
+       bool "V4L platform devices"
+       default n
+       ---help---
+         Say Y here to enable support for platform-specific V4L drivers.
+
+if V4L_PLATFORM_DRIVERS
+
+source "drivers/media/video/marvell-ccic/Kconfig"
+
+config VIDEO_VIA_CAMERA
+       tristate "VIAFB camera controller support"
+       depends on FB_VIA
+       select VIDEOBUF_DMA_SG
+       select VIDEO_OV7670
+       help
+          Driver support for the integrated camera controller in VIA
+          Chrome9 chipsets.  Currently only tested on OLPC xo-1.5 systems
+          with ov7670 sensors.
+
+#
+# Platform multimedia device configuration
+#
+
+source "drivers/media/video/davinci/Kconfig"
+
+source "drivers/media/video/omap/Kconfig"
+
+config VIDEO_SH_VOU
+       tristate "SuperH VOU video output driver"
+       depends on VIDEO_DEV && ARCH_SHMOBILE
+       select VIDEOBUF_DMA_CONTIG
+       help
+         Support for the Video Output Unit (VOU) on SuperH SoCs.
+
+config VIDEO_VIU
+       tristate "Freescale VIU Video Driver"
+       depends on VIDEO_V4L2 && PPC_MPC512x
+       select VIDEOBUF_DMA_CONTIG
+       default y
+       ---help---
+         Support for Freescale VIU video driver. This device captures
+         video data, or overlays video on DIU frame buffer.
+
+         Say Y here if you want to enable VIU device on MPC5121e Rev2+.
+         In doubt, say N.
 
 config VIDEO_TIMBERDALE
        tristate "Support for timberdale Video In/LogiWIN"
@@ -739,21 +873,13 @@ config VIDEO_TIMBERDALE
        ---help---
          Add support for the Video In peripherial of the timberdale FPGA.
 
-source "drivers/media/video/cx88/Kconfig"
-
-source "drivers/media/video/cx23885/Kconfig"
-
-source "drivers/media/video/cx25821/Kconfig"
-
-source "drivers/media/video/au0828/Kconfig"
-
-source "drivers/media/video/ivtv/Kconfig"
-
-source "drivers/media/video/cx18/Kconfig"
-
-source "drivers/media/video/saa7164/Kconfig"
-
-source "drivers/media/video/marvell-ccic/Kconfig"
+config VIDEO_VINO
+       tristate "SGI Vino Video For Linux"
+       depends on I2C && SGI_IP22 && VIDEO_V4L2
+       select VIDEO_SAA7191 if VIDEO_HELPER_CHIPS_AUTO
+       help
+         Say Y here to build in support for the Vino video input system found
+         on SGI Indy machines.
 
 config VIDEO_M32R_AR
        tristate "AR devices"
@@ -774,16 +900,6 @@ config VIDEO_M32R_AR_M64278
          To compile this driver as a module, choose M here: the
          module will be called arv.
 
-config VIDEO_VIA_CAMERA
-       tristate "VIAFB camera controller support"
-       depends on FB_VIA
-       select VIDEOBUF_DMA_SG
-       select VIDEO_OV7670
-       help
-          Driver support for the integrated camera controller in VIA
-          Chrome9 chipsets.  Currently only tested on OLPC xo-1.5 systems
-          with ov7670 sensors.
-
 config VIDEO_OMAP3
        tristate "OMAP 3 Camera support (EXPERIMENTAL)"
        depends on OMAP_IOVMM && VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API && ARCH_OMAP3 && EXPERIMENTAL
@@ -1002,78 +1118,7 @@ config VIDEO_S5P_MIPI_CSIS
 
 source "drivers/media/video/s5p-tv/Kconfig"
 
-#
-# USB Multimedia device configuration
-#
-
-menuconfig V4L_USB_DRIVERS
-       bool "V4L USB devices"
-       depends on USB
-       default y
-
-if V4L_USB_DRIVERS && USB
-
-source "drivers/media/video/uvc/Kconfig"
-
-source "drivers/media/video/gspca/Kconfig"
-
-source "drivers/media/video/pvrusb2/Kconfig"
-
-source "drivers/media/video/hdpvr/Kconfig"
-
-source "drivers/media/video/em28xx/Kconfig"
-
-source "drivers/media/video/tlg2300/Kconfig"
-
-source "drivers/media/video/cx231xx/Kconfig"
-
-source "drivers/media/video/tm6000/Kconfig"
-
-source "drivers/media/video/usbvision/Kconfig"
-
-source "drivers/media/video/et61x251/Kconfig"
-
-source "drivers/media/video/sn9c102/Kconfig"
-
-source "drivers/media/video/pwc/Kconfig"
-
-config USB_ZR364XX
-       tristate "USB ZR364XX Camera support"
-       depends on VIDEO_V4L2
-       select VIDEOBUF_GEN
-       select VIDEOBUF_VMALLOC
-       ---help---
-         Say Y here if you want to connect this type of camera to your
-         computer's USB port.
-         See <file:Documentation/video4linux/zr364xx.txt> for more info
-         and list of supported cameras.
-
-         To compile this driver as a module, choose M here: the
-         module will be called zr364xx.
-
-config USB_STKWEBCAM
-       tristate "USB Syntek DC1125 Camera support"
-       depends on VIDEO_V4L2 && EXPERIMENTAL
-       ---help---
-         Say Y here if you want to use this type of camera.
-         Supported devices are typically found in some Asus laptops,
-         with USB id 174f:a311 and 05e1:0501. Other Syntek cameras
-         may be supported by the stk11xx driver, from which this is
-         derived, see <http://sourceforge.net/projects/syntekdriver/>
-
-         To compile this driver as a module, choose M here: the
-         module will be called stkwebcam.
-
-config USB_S2255
-       tristate "USB Sensoray 2255 video capture device"
-       depends on VIDEO_V4L2
-       select VIDEOBUF_VMALLOC
-       default n
-       help
-         Say Y here if you want support for the Sensoray 2255 USB device.
-         This driver can be compiled as a module, called s2255drv.
-
-endif # V4L_USB_DRIVERS
+endif # V4L_PLATFORM_DRIVERS
 endif # VIDEO_CAPTURE_DRIVERS
 
 menuconfig V4L_MEM2MEM_DRIVERS
@@ -1098,6 +1143,15 @@ config VIDEO_MEM2MEM_TESTDEV
          This is a virtual test device for the memory-to-memory driver
          framework.
 
+config VIDEO_SAMSUNG_S5P_G2D
+       tristate "Samsung S5P and EXYNOS4 G2D 2d graphics accelerator driver"
+       depends on VIDEO_DEV && VIDEO_V4L2 && PLAT_S5P
+       select VIDEOBUF2_DMA_CONTIG
+       select V4L2_MEM2MEM_DEV
+       default n
+       ---help---
+         This is a v4l2 driver for Samsung S5P and EXYNOS4 G2D
+         2d graphics accelerator.
 
 config VIDEO_SAMSUNG_S5P_MFC
        tristate "Samsung S5P MFC 5.1 Video Codec"
index 117f9c4b4cb9a9d804f96f7d80c2a125d857fb44..ddeaa6c8ad9a87ea72c46de31c7fa486a63113a6 100644 (file)
@@ -180,6 +180,8 @@ obj-$(CONFIG_VIDEO_SAMSUNG_S5P_FIMC)        += s5p-fimc/
 obj-$(CONFIG_VIDEO_SAMSUNG_S5P_MFC)    += s5p-mfc/
 obj-$(CONFIG_VIDEO_SAMSUNG_S5P_TV)     += s5p-tv/
 
+obj-$(CONFIG_VIDEO_SAMSUNG_S5P_G2D)    += s5p-g2d/
+
 obj-$(CONFIG_ARCH_DAVINCI)             += davinci/
 
 obj-$(CONFIG_VIDEO_SH_VOU)             += sh_vou.o
index 23ba5c37c3e4d493bd243ddf444404fd43cd01e3..879f1d839760a5588376358c81128ededa8cee81 100644 (file)
@@ -64,6 +64,11 @@ static inline struct adv7170 *to_adv7170(struct v4l2_subdev *sd)
 
 static char *inputs[] = { "pass_through", "play_back" };
 
+static enum v4l2_mbus_pixelcode adv7170_codes[] = {
+       V4L2_MBUS_FMT_UYVY8_2X8,
+       V4L2_MBUS_FMT_UYVY8_1X16,
+};
+
 /* ----------------------------------------------------------------------- */
 
 static inline int adv7170_write(struct v4l2_subdev *sd, u8 reg, u8 value)
@@ -258,6 +263,60 @@ static int adv7170_s_routing(struct v4l2_subdev *sd,
        return 0;
 }
 
+static int adv7170_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
+                               enum v4l2_mbus_pixelcode *code)
+{
+       if (index >= ARRAY_SIZE(adv7170_codes))
+               return -EINVAL;
+
+       *code = adv7170_codes[index];
+       return 0;
+}
+
+static int adv7170_g_fmt(struct v4l2_subdev *sd,
+                               struct v4l2_mbus_framefmt *mf)
+{
+       u8 val = adv7170_read(sd, 0x7);
+
+       if ((val & 0x40) == (1 << 6))
+               mf->code = V4L2_MBUS_FMT_UYVY8_1X16;
+       else
+               mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
+
+       mf->colorspace  = V4L2_COLORSPACE_SMPTE170M;
+       mf->width       = 0;
+       mf->height      = 0;
+       mf->field       = V4L2_FIELD_ANY;
+
+       return 0;
+}
+
+static int adv7170_s_fmt(struct v4l2_subdev *sd,
+                               struct v4l2_mbus_framefmt *mf)
+{
+       u8 val = adv7170_read(sd, 0x7);
+       int ret;
+
+       switch (mf->code) {
+       case V4L2_MBUS_FMT_UYVY8_2X8:
+               val &= ~0x40;
+               break;
+
+       case V4L2_MBUS_FMT_UYVY8_1X16:
+               val |= 0x40;
+               break;
+
+       default:
+               v4l2_dbg(1, debug, sd,
+                       "illegal v4l2_mbus_framefmt code: %d\n", mf->code);
+               return -EINVAL;
+       }
+
+       ret = adv7170_write(sd, 0x7, val);
+
+       return ret;
+}
+
 static int adv7170_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
 {
        struct i2c_client *client = v4l2_get_subdevdata(sd);
@@ -274,6 +333,9 @@ static const struct v4l2_subdev_core_ops adv7170_core_ops = {
 static const struct v4l2_subdev_video_ops adv7170_video_ops = {
        .s_std_output = adv7170_s_std_output,
        .s_routing = adv7170_s_routing,
+       .s_mbus_fmt = adv7170_s_fmt,
+       .g_mbus_fmt = adv7170_g_fmt,
+       .enum_mbus_fmt  = adv7170_enum_fmt,
 };
 
 static const struct v4l2_subdev_ops adv7170_ops = {
index 8c775c59e120f30589d520c49d75b18fd9a397fa..fbc904f2f6fd80a1f7704fbd2fc6d3c72e5051b5 100644 (file)
@@ -1036,7 +1036,7 @@ err_alloc_ctx:
 err_alloc_descriptors:
        kfree(isi);
 err_alloc_isi:
-       clk_put(isi->pclk);
+       clk_put(pclk);
 
        return ret;
 }
index 0bcd95303bb0c2ace9c55d21e95eb530cbdfe000..c37e6acffdedef6ea698f73da153a3f9ec47f3d7 100644 (file)
 #ifndef PCI_DEVICE_ID_BT849
 #define PCI_DEVICE_ID_BT849     0x351
 #endif
+#ifndef PCI_DEVICE_ID_FUSION879
+#define PCI_DEVICE_ID_FUSION879        0x36c
+#endif
+
 #ifndef PCI_DEVICE_ID_BT878
 #define PCI_DEVICE_ID_BT878     0x36e
 #endif
@@ -37,7 +41,6 @@
 #define PCI_DEVICE_ID_BT879     0x36f
 #endif
 
-
 /* Brooktree 848 registers */
 
 #define BT848_DSTATUS          0x000
index 5939021d8eba4782cc983e99b658d0f370c93c0a..ff2933ab705ff2608dd38827dcab12ff0b0ca2ee 100644 (file)
@@ -80,6 +80,8 @@ static void phytec_muxsel(struct bttv *btv, unsigned int input);
 static void gv800s_muxsel(struct bttv *btv, unsigned int input);
 static void gv800s_init(struct bttv *btv);
 
+static void td3116_muxsel(struct bttv *btv, unsigned int input);
+
 static int terratec_active_radio_upgrade(struct bttv *btv);
 static int tea5757_read(struct bttv *btv);
 static int tea5757_write(struct bttv *btv, int value);
@@ -284,7 +286,8 @@ static struct CARD {
        { 0x10b42636, BTTV_BOARD_HAUPPAUGE878,  "STB ???" },
        { 0x217d6606, BTTV_BOARD_WINFAST2000,   "Leadtek WinFast TV 2000" },
        { 0xfff6f6ff, BTTV_BOARD_WINFAST2000,   "Leadtek WinFast TV 2000" },
-       { 0x03116000, BTTV_BOARD_SENSORAY311,   "Sensoray 311" },
+       { 0x03116000, BTTV_BOARD_SENSORAY311_611, "Sensoray 311" },
+       { 0x06116000, BTTV_BOARD_SENSORAY311_611, "Sensoray 611" },
        { 0x00790e11, BTTV_BOARD_WINDVR,        "Canopus WinDVR PCI" },
        { 0xa0fca1a0, BTTV_BOARD_ZOLTRIX,       "Face to Face Tvmax" },
        { 0x82b2aa6a, BTTV_BOARD_SIMUS_GVC1100, "SIMUS GVC1100" },
@@ -341,6 +344,7 @@ static struct CARD {
        { 0x15401835, BTTV_BOARD_PV183,         "Provideo PV183-6" },
        { 0x15401836, BTTV_BOARD_PV183,         "Provideo PV183-7" },
        { 0x15401837, BTTV_BOARD_PV183,         "Provideo PV183-8" },
+       { 0x3116f200, BTTV_BOARD_TVT_TD3116,    "Tongwei Video Technology TD-3116" },
 
        { 0, -1, NULL }
 };
@@ -1526,10 +1530,10 @@ struct tvcard bttv_tvcards[] = {
                        GPIO20,22,23: R30,R29,R28
                */
        },
-       [BTTV_BOARD_SENSORAY311] = {
+       [BTTV_BOARD_SENSORAY311_611] = {
                /* Clay Kunz <ckunz@mail.arc.nasa.gov> */
-               /* you must jumper JP5 for the card to work */
-               .name           = "Sensoray 311",
+               /* you must jumper JP5 for the 311 card (PC/104+) to work */
+               .name           = "Sensoray 311/611",
                .video_inputs   = 5,
                /* .audio_inputs= 0, */
                .svhs           = 4,
@@ -2879,6 +2883,16 @@ struct tvcard bttv_tvcards[] = {
                .tuner_type     = TUNER_ABSENT,
                .tuner_addr     = ADDR_UNSET,
        },
+       [BTTV_BOARD_TVT_TD3116] = {
+               .name           = "Tongwei Video Technology TD-3116",
+               .video_inputs   = 16,
+               .gpiomask       = 0xc00ff,
+               .muxsel         = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
+               .muxsel_hook    = td3116_muxsel,
+               .svhs           = NO_SVHS,
+               .pll            = PLL_28,
+               .tuner_type     = TUNER_ABSENT,
+       },
 };
 
 static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
@@ -3228,6 +3242,42 @@ static void geovision_muxsel(struct bttv *btv, unsigned int input)
        gpio_bits(0xf, inmux);
 }
 
+/*
+ * The TD3116 has 2 74HC4051 muxes wired to the MUX0 input of a bt878.
+ * The first 74HC4051 has the lower 8 inputs, the second one the higher 8.
+ * The muxes are controlled via a 74HC373 latch which is connected to
+ * GPIOs 0-7. GPIO 18 is connected to the LE signal of the latch.
+ * Q0 of the latch is connected to the Enable (~E) input of the first
+ * 74HC4051. Q1 - Q3 are connected to S0 - S2 of the same 74HC4051.
+ * Q4 - Q7 are connected to the second 74HC4051 in the same way.
+ */
+
+static void td3116_latch_value(struct bttv *btv, u32 value)
+{
+       gpio_bits((1<<18) | 0xff, value);
+       gpio_bits((1<<18) | 0xff, (1<<18) | value);
+       udelay(1);
+       gpio_bits((1<<18) | 0xff, value);
+}
+
+static void td3116_muxsel(struct bttv *btv, unsigned int input)
+{
+       u32 value;
+       u32 highbit;
+
+       highbit = (input & 0x8) >> 3 ;
+
+       /* Disable outputs and set value in the mux */
+       value = 0x11; /* Disable outputs */
+       value |= ((input & 0x7) << 1)  << (4 * highbit);
+       td3116_latch_value(btv, value);
+
+       /* Enable the correct output */
+       value &= ~0x11;
+       value |= ((highbit ^ 0x1) << 4) | highbit;
+       td3116_latch_value(btv, value);
+}
+
 /* ----------------------------------------------------------------------- */
 
 static void bttv_reset_audio(struct bttv *btv)
index 3dd06607aec2a0457ec4b75a36463162ab15b6e4..76c301f05095375ec21d6956d00a9d69f8b33da6 100644 (file)
@@ -4572,6 +4572,7 @@ static struct pci_device_id bttv_pci_tbl[] = {
        {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT849), 0},
        {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT878), 0},
        {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT879), 0},
+       {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_FUSION879), 0},
        {0,}
 };
 
index c6333595c6b90a3749fabfa8e3f90de1751fa2c3..c5171619ac7998369511c515da9046beda33d315 100644 (file)
@@ -96,7 +96,7 @@
 #define BTTV_BOARD_PV_BT878P_PLUS          0x46
 #define BTTV_BOARD_FLYVIDEO98EZ            0x47
 #define BTTV_BOARD_PV_BT878P_9B            0x48
-#define BTTV_BOARD_SENSORAY311             0x49
+#define BTTV_BOARD_SENSORAY311_611         0x49
 #define BTTV_BOARD_RV605                   0x4a
 #define BTTV_BOARD_POWERCLR_MTV878         0x4b
 #define BTTV_BOARD_WINDVR                  0x4c
 #define BTTV_BOARD_GEOVISION_GV800S       0x9d
 #define BTTV_BOARD_GEOVISION_GV800S_SL    0x9e
 #define BTTV_BOARD_PV183                   0x9f
+#define BTTV_BOARD_TVT_TD3116             0xa0
 
 
 /* more card-specific defines */
index 5c42abdf422f35fe47a77c711f47adea3e8c26fa..3598dc087b0880fd5214f8f96b36b377678b1a00 100644 (file)
@@ -70,11 +70,6 @@ config VIDEO_CX88_DVB
          To compile this driver as a module, choose M here: the
          module will be called cx88-dvb.
 
-config VIDEO_CX88_MPEG
-       tristate
-       depends on VIDEO_CX88_DVB || VIDEO_CX88_BLACKBIRD
-       default y
-
 config VIDEO_CX88_VP3054
        tristate "VP-3054 Secondary I2C Bus Support"
        default m
@@ -84,3 +79,8 @@ config VIDEO_CX88_VP3054
          Conexant 2388x chip and the MT352 demodulator,
          which also require support for the VP-3054
          Secondary I2C bus, such at DNTV Live! DVB-T Pro.
+
+config VIDEO_CX88_MPEG
+       tristate
+       depends on VIDEO_CX88_DVB || VIDEO_CX88_BLACKBIRD
+       default y
index 8588a86d9b45ecb31335924b5259499fd310d69c..d98da4bfb256b2948c546cc32935e59776b9470b 100644 (file)
@@ -1746,15 +1746,16 @@ static __devinit int vpbe_display_probe(struct platform_device *pdev)
        for (i = 0; i < VPBE_DISPLAY_MAX_DEVICES; i++) {
                if (register_device(disp_dev->dev[i], disp_dev, pdev)) {
                        err = -ENODEV;
-                       goto probe_out;
+                       goto probe_out_irq;
                }
        }
 
        printk(KERN_DEBUG "Successfully completed the probing of vpbe v4l2 device\n");
        return 0;
 
-probe_out:
+probe_out_irq:
        free_irq(res->start, disp_dev);
+probe_out:
        for (k = 0; k < VPBE_DISPLAY_MAX_DEVICES; k++) {
                /* Get the pointer to the layer object */
                vpbe_display_layer = disp_dev->dev[k];
index 9b747c266afa82be27753cfe8991292af95d98a6..f63a7159f7fc03461acfc1bde48dbef6d37e854b 100644 (file)
@@ -336,6 +336,23 @@ static struct em28xx_reg_seq pctv_460e[] = {
        {             -1,   -1,   -1,  -1},
 };
 
+static struct em28xx_reg_seq hauppauge_930c_gpio[] = {
+       {EM2874_R80_GPIO,       0x6f,   0xff,   10},
+       {EM2874_R80_GPIO,       0x4f,   0xff,   10}, /* xc5000 reset */
+       {EM2874_R80_GPIO,       0x6f,   0xff,   10},
+       {EM2874_R80_GPIO,       0x4f,   0xff,   10},
+       { -1,                   -1,     -1,     -1},
+};
+
+#if 0
+static struct em28xx_reg_seq hauppauge_930c_digital[] = {
+       {EM2874_R80_GPIO,       0xf6,   0xff,   10},
+       {EM2874_R80_GPIO,       0xe6,   0xff,   100},
+       {EM2874_R80_GPIO,       0xa6,   0xff,   10},
+       { -1,                   -1,     -1,     -1},
+};
+#endif
+
 /*
  *  Board definitions
  */
@@ -887,11 +904,29 @@ struct em28xx_board em28xx_boards[] = {
                .tuner_addr   = 0x41,
                .dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */
                .tuner_gpio   = terratec_h5_gpio,
+#else
+               .tuner_type   = TUNER_ABSENT,
 #endif
                .i2c_speed    = EM2874_I2C_SECONDARY_BUS_SELECT |
                                EM28XX_I2C_CLK_WAIT_ENABLE |
                                EM28XX_I2C_FREQ_400_KHZ,
        },
+       [EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {
+               .name         = "Hauppauge WinTV HVR 930C",
+               .has_dvb      = 1,
+#if 0 /* FIXME: Add analog support */
+               .tuner_type   = TUNER_XC5000,
+               .tuner_addr   = 0x41,
+               .dvb_gpio     = hauppauge_930c_digital,
+               .tuner_gpio   = hauppauge_930c_gpio,
+#else
+               .tuner_type   = TUNER_ABSENT,
+#endif
+               .ir_codes     = RC_MAP_HAUPPAUGE,
+               .i2c_speed    = EM2874_I2C_SECONDARY_BUS_SELECT |
+                               EM28XX_I2C_CLK_WAIT_ENABLE |
+                               EM28XX_I2C_FREQ_400_KHZ,
+       },
        [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
                .name         = "Hauppauge WinTV HVR 900",
                .tda9887_conf = TDA9887_PRESENT,
@@ -1914,11 +1949,11 @@ struct usb_device_id em28xx_id_table[] = {
        { USB_DEVICE(0x0ccd, 0x0042),
                        .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
        { USB_DEVICE(0x0ccd, 0x0043),
+                       .driver_info = EM2870_BOARD_TERRATEC_XS },
+       { USB_DEVICE(0x0ccd, 0x10a2),   /* H5 Rev. 1 */
                        .driver_info = EM2884_BOARD_TERRATEC_H5 },
-       { USB_DEVICE(0x0ccd, 0x10a2),   /* Rev. 1 */
+       { USB_DEVICE(0x0ccd, 0x10ad),   /* H5 Rev. 2 */
                        .driver_info = EM2884_BOARD_TERRATEC_H5 },
-       { USB_DEVICE(0x0ccd, 0x10ad),   /* Rev. 2 */
-                       .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS },
        { USB_DEVICE(0x0ccd, 0x0084),
                        .driver_info = EM2860_BOARD_TERRATEC_AV350 },
        { USB_DEVICE(0x0ccd, 0x0096),
@@ -1975,6 +2010,8 @@ struct usb_device_id em28xx_id_table[] = {
                        .driver_info = EM28174_BOARD_PCTV_290E },
        { USB_DEVICE(0x2013, 0x024c),
                        .driver_info = EM28174_BOARD_PCTV_460E },
+       { USB_DEVICE(0x2040, 0x1605),
+                       .driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },
        { },
 };
 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
@@ -2028,10 +2065,10 @@ int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
        int rc = 0;
        struct em28xx *dev = ptr;
 
-       if (dev->tuner_type != TUNER_XC2028)
+       if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)
                return 0;
 
-       if (command != XC2028_TUNER_RESET)
+       if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)
                return 0;
 
        rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
index cef7a2d409cbc27c53c2aabe805528d62f40b894..55a900897cac8470e0cc719d83dd14b1c2d84427 100644 (file)
@@ -316,6 +316,14 @@ struct drxk_config terratec_h5_drxk = {
        .microcode_name = "dvb-usb-terratec-h5-drxk.fw",
 };
 
+struct drxk_config hauppauge_930c_drxk = {
+       .adr = 0x29,
+       .single_master = 1,
+       .no_i2c_bridge = 1,
+       .microcode_name = "dvb-usb-hauppauge-hvr930c-drxk.fw",
+       .chunk_size = 56,
+};
+
 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
 {
        struct em28xx_dvb *dvb = fe->sec_priv;
@@ -334,6 +342,73 @@ static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
        return status;
 }
 
+static void hauppauge_hvr930c_init(struct em28xx *dev)
+{
+       int i;
+
+       struct em28xx_reg_seq hauppauge_hvr930c_init[] = {
+               {EM2874_R80_GPIO,       0xff,   0xff,   0x65},
+               {EM2874_R80_GPIO,       0xfb,   0xff,   0x32},
+               {EM2874_R80_GPIO,       0xff,   0xff,   0xb8},
+               { -1,                   -1,     -1,     -1},
+       };
+       struct em28xx_reg_seq hauppauge_hvr930c_end[] = {
+               {EM2874_R80_GPIO,       0xef,   0xff,   0x01},
+               {EM2874_R80_GPIO,       0xaf,   0xff,   0x65},
+               {EM2874_R80_GPIO,       0xef,   0xff,   0x76},
+               {EM2874_R80_GPIO,       0xef,   0xff,   0x01},
+               {EM2874_R80_GPIO,       0xcf,   0xff,   0x0b},
+               {EM2874_R80_GPIO,       0xef,   0xff,   0x40},
+
+               {EM2874_R80_GPIO,       0xcf,   0xff,   0x65},
+               {EM2874_R80_GPIO,       0xef,   0xff,   0x65},
+               {EM2874_R80_GPIO,       0xcf,   0xff,   0x0b},
+               {EM2874_R80_GPIO,       0xef,   0xff,   0x65},
+
+               { -1,                   -1,     -1,     -1},
+       };
+
+       struct {
+               unsigned char r[4];
+               int len;
+       } regs[] = {
+               {{ 0x06, 0x02, 0x00, 0x31 }, 4},
+               {{ 0x01, 0x02 }, 2},
+               {{ 0x01, 0x02, 0x00, 0xc6 }, 4},
+               {{ 0x01, 0x00 }, 2},
+               {{ 0x01, 0x00, 0xff, 0xaf }, 4},
+               {{ 0x01, 0x00, 0x03, 0xa0 }, 4},
+               {{ 0x01, 0x00 }, 2},
+               {{ 0x01, 0x00, 0x73, 0xaf }, 4},
+               {{ 0x04, 0x00 }, 2},
+               {{ 0x00, 0x04 }, 2},
+               {{ 0x00, 0x04, 0x00, 0x0a }, 4},
+               {{ 0x04, 0x14 }, 2},
+               {{ 0x04, 0x14, 0x00, 0x00 }, 4},
+       };
+
+       em28xx_gpio_set(dev, hauppauge_hvr930c_init);
+       em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
+       msleep(10);
+       em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x44);
+       msleep(10);
+
+       dev->i2c_client.addr = 0x82 >> 1;
+
+       for (i = 0; i < ARRAY_SIZE(regs); i++)
+               i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len);
+       em28xx_gpio_set(dev, hauppauge_hvr930c_end);
+
+       msleep(100);
+
+       em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x44);
+       msleep(30);
+
+       em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x45);
+       msleep(10);
+
+}
+
 static void terratec_h5_init(struct em28xx *dev)
 {
        int i;
@@ -787,6 +862,49 @@ static int em28xx_dvb_init(struct em28xx *dev)
 
                        mfe_shared = 1;
                }
+               break;
+       case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
+               hauppauge_hvr930c_init(dev);
+
+               dvb->dont_attach_fe1 = 1;
+
+               dvb->fe[0] = dvb_attach(drxk_attach,
+                                       &hauppauge_930c_drxk, &dev->i2c_adap,
+                                       &dvb->fe[1]);
+               if (!dvb->fe[0]) {
+                       result = -EINVAL;
+                       goto out_free;
+               }
+               /* FIXME: do we need a pll semaphore? */
+               dvb->fe[0]->sec_priv = dvb;
+               sema_init(&dvb->pll_mutex, 1);
+               dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl;
+               dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl;
+               dvb->fe[1]->id = 1;
+
+               /* Attach xc5000 */
+               struct xc5000_config cfg;
+               memset(&cfg, 0, sizeof(cfg));
+               cfg.i2c_address  = 0x61;
+               cfg.if_khz = 4000;
+
+               if (dvb->fe[0]->ops.i2c_gate_ctrl)
+                       dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 1);
+               if (!dvb_attach(xc5000_attach, dvb->fe[0], &dev->i2c_adap,
+                               &cfg)) {
+                       result = -EINVAL;
+                       goto out_free;
+               }
+
+               if (dvb->fe[0]->ops.i2c_gate_ctrl)
+                       dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0);
+
+               /* Hack - needed by drxk/tda18271c2dd */
+               dvb->fe[1]->tuner_priv = dvb->fe[0]->tuner_priv;
+               memcpy(&dvb->fe[1]->ops.tuner_ops,
+                      &dvb->fe[0]->ops.tuner_ops,
+                      sizeof(dvb->fe[0]->ops.tuner_ops));
+
                break;
        case EM2884_BOARD_TERRATEC_H5:
                terratec_h5_init(dev);
@@ -798,7 +916,6 @@ static int em28xx_dvb_init(struct em28xx *dev)
                        result = -EINVAL;
                        goto out_free;
                }
-
                /* FIXME: do we need a pll semaphore? */
                dvb->fe[0]->sec_priv = dvb;
                sema_init(&dvb->pll_mutex, 1);
@@ -845,6 +962,8 @@ static int em28xx_dvb_init(struct em28xx *dev)
        }
        /* define general-purpose callback pointer */
        dvb->fe[0]->callback = em28xx_tuner_callback;
+       if (dvb->fe[1])
+               dvb->fe[1]->callback = em28xx_tuner_callback;
 
        /* register everything */
        result = em28xx_register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev);
index 679da480428113ec8d7da347e722bf36bde6e590..2630b265b0e813c5c6f450927367d3899933c013 100644 (file)
@@ -306,7 +306,8 @@ static void em28xx_ir_handle_key(struct em28xx_IR *ir)
                                   poll_result.rc_data[0],
                                   poll_result.toggle_bit);
 
-               if (ir->dev->chip_id == CHIP_ID_EM2874)
+               if (ir->dev->chip_id == CHIP_ID_EM2874 ||
+                   ir->dev->chip_id == CHIP_ID_EM2884)
                        /* The em2874 clears the readcount field every time the
                           register is read.  The em2860/2880 datasheet says that it
                           is supposed to clear the readcount, but it doesn't.  So with
@@ -371,13 +372,15 @@ int em28xx_ir_change_protocol(struct rc_dev *rc_dev, u64 rc_type)
        case CHIP_ID_EM2883:
                ir->get_key = default_polling_getkey;
                break;
+       case CHIP_ID_EM2884:
        case CHIP_ID_EM2874:
        case CHIP_ID_EM28174:
                ir->get_key = em2874_polling_getkey;
                em28xx_write_regs(dev, EM2874_R50_IR_CONFIG, &ir_config, 1);
                break;
        default:
-               printk("Unrecognized em28xx chip id: IR not supported\n");
+               printk("Unrecognized em28xx chip id 0x%02x: IR not supported\n",
+                       dev->chip_id);
                rc = -EINVAL;
        }
 
index 2a2cb7ed0014fcda319a31c60066c3ebbfa12f9f..c16ae8f95642bd16f67418d3dd783641b5f335aa 100644 (file)
@@ -38,6 +38,7 @@
 #include <media/videobuf-dvb.h>
 #endif
 #include "tuner-xc2028.h"
+#include "xc5000.h"
 #include "em28xx-reg.h"
 
 /* Boards supported by driver */
 #define EM28174_BOARD_PCTV_290E                   78
 #define EM2884_BOARD_TERRATEC_H5                 79
 #define EM28174_BOARD_PCTV_460E                   80
+#define EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C    81
 
 /* Limits minimum and default number of buffers */
 #define EM28XX_MIN_BUF 4
index e2b1029b16cdd24552123d67dfc4a44ef51a6359..097c9d3d04a8c581236a928d9eceeaed765d4d72 100644 (file)
@@ -109,14 +109,13 @@ static struct mt9m001 *to_mt9m001(const struct i2c_client *client)
 
 static int reg_read(struct i2c_client *client, const u8 reg)
 {
-       s32 data = i2c_smbus_read_word_data(client, reg);
-       return data < 0 ? data : swab16(data);
+       return i2c_smbus_read_word_swapped(client, reg);
 }
 
 static int reg_write(struct i2c_client *client, const u8 reg,
                     const u16 data)
 {
-       return i2c_smbus_write_word_data(client, reg, swab16(data));
+       return i2c_smbus_write_word_swapped(client, reg, data);
 }
 
 static int reg_set(struct i2c_client *client, const u8 reg,
index cf2c0fb95f2f47d96121e55a4e4d87a07c076bcf..258adfd99e67cdf294549f4530d1e59b6991ea3a 100644 (file)
@@ -211,7 +211,7 @@ static int reg_page_map_set(struct i2c_client *client, const u16 reg)
        if (page > 2)
                return -EINVAL;
 
-       ret = i2c_smbus_write_word_data(client, MT9M111_PAGE_MAP, swab16(page));
+       ret = i2c_smbus_write_word_swapped(client, MT9M111_PAGE_MAP, page);
        if (!ret)
                mt9m111->lastpage = page;
        return ret;
@@ -223,7 +223,7 @@ static int mt9m111_reg_read(struct i2c_client *client, const u16 reg)
 
        ret = reg_page_map_set(client, reg);
        if (!ret)
-               ret = swab16(i2c_smbus_read_word_data(client, reg & 0xff));
+               ret = i2c_smbus_read_word_swapped(client, reg & 0xff);
 
        dev_dbg(&client->dev, "read  reg.%03x -> %04x\n", reg, ret);
        return ret;
@@ -236,8 +236,7 @@ static int mt9m111_reg_write(struct i2c_client *client, const u16 reg,
 
        ret = reg_page_map_set(client, reg);
        if (!ret)
-               ret = i2c_smbus_write_word_data(client, reg & 0xff,
-                                               swab16(data));
+               ret = i2c_smbus_write_word_swapped(client, reg & 0xff, data);
        dev_dbg(&client->dev, "write reg.%03x = %04x -> %d\n", reg, data, ret);
        return ret;
 }
index 73c068993f050cce24eb408d2cbf7e745791c667..93c3ec7426e85ce14b83d8380c7c008abeb5505c 100644 (file)
@@ -132,13 +132,12 @@ static struct mt9p031 *to_mt9p031(struct v4l2_subdev *sd)
 
 static int mt9p031_read(struct i2c_client *client, u8 reg)
 {
-       s32 data = i2c_smbus_read_word_data(client, reg);
-       return data < 0 ? data : be16_to_cpu(data);
+       return i2c_smbus_read_word_swapped(client, reg);
 }
 
 static int mt9p031_write(struct i2c_client *client, u8 reg, u16 data)
 {
-       return i2c_smbus_write_word_data(client, reg, cpu_to_be16(data));
+       return i2c_smbus_write_word_swapped(client, reg, data);
 }
 
 static int mt9p031_set_output_control(struct mt9p031 *mt9p031, u16 clear,
index 08074b8a2736ca75a8bcdd6a26512536e584cf36..cd81d04a529e2ec9eb1d10fd9eb2c80f502830c4 100644 (file)
@@ -133,13 +133,12 @@ static inline struct mt9t001 *to_mt9t001(struct v4l2_subdev *sd)
 
 static int mt9t001_read(struct i2c_client *client, u8 reg)
 {
-       s32 data = i2c_smbus_read_word_data(client, reg);
-       return data < 0 ? data : be16_to_cpu(data);
+       return i2c_smbus_read_word_swapped(client, reg);
 }
 
 static int mt9t001_write(struct i2c_client *client, u8 reg, u16 data)
 {
-       return i2c_smbus_write_word_data(client, reg, cpu_to_be16(data));
+       return i2c_smbus_write_word_swapped(client, reg, data);
 }
 
 static int mt9t001_set_output_control(struct mt9t001 *mt9t001, u16 clear,
index 0e78477452ffb81bf5a09a781d9b68326b61e345..84add1aef13955941a1969d7dabec019148d7a51 100644 (file)
@@ -90,14 +90,13 @@ static struct mt9t031 *to_mt9t031(const struct i2c_client *client)
 
 static int reg_read(struct i2c_client *client, const u8 reg)
 {
-       s32 data = i2c_smbus_read_word_data(client, reg);
-       return data < 0 ? data : swab16(data);
+       return i2c_smbus_read_word_swapped(client, reg);
 }
 
 static int reg_write(struct i2c_client *client, const u8 reg,
                     const u16 data)
 {
-       return i2c_smbus_write_word_data(client, reg, swab16(data));
+       return i2c_smbus_write_word_swapped(client, reg, data);
 }
 
 static int reg_set(struct i2c_client *client, const u8 reg,
index 690ee0d42eebbcbb8aaf7374ca49a7302716180f..944940758fa3094d6ec0d5213342fc533d97a240 100644 (file)
@@ -130,14 +130,13 @@ static struct mt9v022 *to_mt9v022(const struct i2c_client *client)
 
 static int reg_read(struct i2c_client *client, const u8 reg)
 {
-       s32 data = i2c_smbus_read_word_data(client, reg);
-       return data < 0 ? data : swab16(data);
+       return i2c_smbus_read_word_swapped(client, reg);
 }
 
 static int reg_write(struct i2c_client *client, const u8 reg,
                     const u16 data)
 {
-       return i2c_smbus_write_word_data(client, reg, swab16(data));
+       return i2c_smbus_write_word_swapped(client, reg, data);
 }
 
 static int reg_set(struct i2c_client *client, const u8 reg,
index f080c162123f3ee0de1d0b532fc74a96d760b846..d90b982cc218d4adf5874494f2a3203fbd8bc43d 100644 (file)
@@ -139,10 +139,10 @@ static struct mt9v032 *to_mt9v032(struct v4l2_subdev *sd)
 
 static int mt9v032_read(struct i2c_client *client, const u8 reg)
 {
-       s32 data = i2c_smbus_read_word_data(client, reg);
+       s32 data = i2c_smbus_read_word_swapped(client, reg);
        dev_dbg(&client->dev, "%s: read 0x%04x from 0x%02x\n", __func__,
-               swab16(data), reg);
-       return data < 0 ? data : swab16(data);
+               data, reg);
+       return data;
 }
 
 static int mt9v032_write(struct i2c_client *client, const u8 reg,
@@ -150,7 +150,7 @@ static int mt9v032_write(struct i2c_client *client, const u8 reg,
 {
        dev_dbg(&client->dev, "%s: writing 0x%04x to 0x%02x\n", __func__,
                data, reg);
-       return i2c_smbus_write_word_data(client, reg, swab16(data));
+       return i2c_smbus_write_word_swapped(client, reg, data);
 }
 
 static int mt9v032_set_chip_control(struct mt9v032 *mt9v032, u16 clear, u16 set)
index 9c5c19f142de598067de4fec22b229eecb4a7862..def647242bb3029de70f5dfeb20a6167939b2e6b 100644 (file)
@@ -523,10 +523,50 @@ static int omapvid_apply_changes(struct omap_vout_device *vout)
        return 0;
 }
 
+static int omapvid_handle_interlace_display(struct omap_vout_device *vout,
+               unsigned int irqstatus, struct timeval timevalue)
+{
+       u32 fid;
+
+       if (vout->first_int) {
+               vout->first_int = 0;
+               goto err;
+       }
+
+       if (irqstatus & DISPC_IRQ_EVSYNC_ODD)
+               fid = 1;
+       else if (irqstatus & DISPC_IRQ_EVSYNC_EVEN)
+               fid = 0;
+       else
+               goto err;
+
+       vout->field_id ^= 1;
+       if (fid != vout->field_id) {
+               if (fid == 0)
+                       vout->field_id = fid;
+       } else if (0 == fid) {
+               if (vout->cur_frm == vout->next_frm)
+                       goto err;
+
+               vout->cur_frm->ts = timevalue;
+               vout->cur_frm->state = VIDEOBUF_DONE;
+               wake_up_interruptible(&vout->cur_frm->done);
+               vout->cur_frm = vout->next_frm;
+       } else {
+               if (list_empty(&vout->dma_queue) ||
+                               (vout->cur_frm != vout->next_frm))
+                       goto err;
+       }
+
+       return vout->field_id;
+err:
+       return 0;
+}
+
 static void omap_vout_isr(void *arg, unsigned int irqstatus)
 {
-       int ret;
-       u32 addr, fid;
+       int ret, fid, mgr_id;
+       u32 addr, irq;
        struct omap_overlay *ovl;
        struct timeval timevalue;
        struct omapvideo_info *ovid;
@@ -542,112 +582,73 @@ static void omap_vout_isr(void *arg, unsigned int irqstatus)
        if (!ovl->manager || !ovl->manager->device)
                return;
 
+       mgr_id = ovl->manager->id;
        cur_display = ovl->manager->device;
 
        spin_lock(&vout->vbq_lock);
        do_gettimeofday(&timevalue);
 
-       if (cur_display->type != OMAP_DISPLAY_TYPE_VENC) {
-               switch (cur_display->type) {
-               case OMAP_DISPLAY_TYPE_DPI:
-                       if (!(irqstatus & (DISPC_IRQ_VSYNC | DISPC_IRQ_VSYNC2)))
-                               goto vout_isr_err;
-                       break;
-               case OMAP_DISPLAY_TYPE_HDMI:
-                       if (!(irqstatus & DISPC_IRQ_EVSYNC_EVEN))
-                               goto vout_isr_err;
-                       break;
-               default:
-                       goto vout_isr_err;
-               }
-               if (!vout->first_int && (vout->cur_frm != vout->next_frm)) {
-                       vout->cur_frm->ts = timevalue;
-                       vout->cur_frm->state = VIDEOBUF_DONE;
-                       wake_up_interruptible(&vout->cur_frm->done);
-                       vout->cur_frm = vout->next_frm;
-               }
-               vout->first_int = 0;
-               if (list_empty(&vout->dma_queue))
+       switch (cur_display->type) {
+       case OMAP_DISPLAY_TYPE_DSI:
+       case OMAP_DISPLAY_TYPE_DPI:
+               if (mgr_id == OMAP_DSS_CHANNEL_LCD)
+                       irq = DISPC_IRQ_VSYNC;
+               else if (mgr_id == OMAP_DSS_CHANNEL_LCD2)
+                       irq = DISPC_IRQ_VSYNC2;
+               else
                        goto vout_isr_err;
 
-               vout->next_frm = list_entry(vout->dma_queue.next,
-                               struct videobuf_buffer, queue);
-               list_del(&vout->next_frm->queue);
-
-               vout->next_frm->state = VIDEOBUF_ACTIVE;
+               if (!(irqstatus & irq))
+                       goto vout_isr_err;
+               break;
+       case OMAP_DISPLAY_TYPE_VENC:
+               fid = omapvid_handle_interlace_display(vout, irqstatus,
+                               timevalue);
+               if (!fid)
+                       goto vout_isr_err;
+               break;
+       case OMAP_DISPLAY_TYPE_HDMI:
+               if (!(irqstatus & DISPC_IRQ_EVSYNC_EVEN))
+                       goto vout_isr_err;
+               break;
+       default:
+               goto vout_isr_err;
+       }
 
-               addr = (unsigned long) vout->queued_buf_addr[vout->next_frm->i]
-                       + vout->cropped_offset;
+       if (!vout->first_int && (vout->cur_frm != vout->next_frm)) {
+               vout->cur_frm->ts = timevalue;
+               vout->cur_frm->state = VIDEOBUF_DONE;
+               wake_up_interruptible(&vout->cur_frm->done);
+               vout->cur_frm = vout->next_frm;
+       }
 
-               /* First save the configuration in ovelray structure */
-               ret = omapvid_init(vout, addr);
-               if (ret)
-                       printk(KERN_ERR VOUT_NAME
-                               "failed to set overlay info\n");
-               /* Enable the pipeline and set the Go bit */
-               ret = omapvid_apply_changes(vout);
-               if (ret)
-                       printk(KERN_ERR VOUT_NAME "failed to change mode\n");
-       } else {
+       vout->first_int = 0;
+       if (list_empty(&vout->dma_queue))
+               goto vout_isr_err;
 
-               if (vout->first_int) {
-                       vout->first_int = 0;
-                       goto vout_isr_err;
-               }
-               if (irqstatus & DISPC_IRQ_EVSYNC_ODD)
-                       fid = 1;
-               else if (irqstatus & DISPC_IRQ_EVSYNC_EVEN)
-                       fid = 0;
-               else
-                       goto vout_isr_err;
+       vout->next_frm = list_entry(vout->dma_queue.next,
+                       struct videobuf_buffer, queue);
+       list_del(&vout->next_frm->queue);
 
-               vout->field_id ^= 1;
-               if (fid != vout->field_id) {
-                       if (0 == fid)
-                               vout->field_id = fid;
+       vout->next_frm->state = VIDEOBUF_ACTIVE;
 
-                       goto vout_isr_err;
-               }
-               if (0 == fid) {
-                       if (vout->cur_frm == vout->next_frm)
-                               goto vout_isr_err;
-
-                       vout->cur_frm->ts = timevalue;
-                       vout->cur_frm->state = VIDEOBUF_DONE;
-                       wake_up_interruptible(&vout->cur_frm->done);
-                       vout->cur_frm = vout->next_frm;
-               } else if (1 == fid) {
-                       if (list_empty(&vout->dma_queue) ||
-                                       (vout->cur_frm != vout->next_frm))
-                               goto vout_isr_err;
-
-                       vout->next_frm = list_entry(vout->dma_queue.next,
-                                       struct videobuf_buffer, queue);
-                       list_del(&vout->next_frm->queue);
-
-                       vout->next_frm->state = VIDEOBUF_ACTIVE;
-                       addr = (unsigned long)
-                               vout->queued_buf_addr[vout->next_frm->i] +
-                               vout->cropped_offset;
-                       /* First save the configuration in ovelray structure */
-                       ret = omapvid_init(vout, addr);
-                       if (ret)
-                               printk(KERN_ERR VOUT_NAME
-                                               "failed to set overlay info\n");
-                       /* Enable the pipeline and set the Go bit */
-                       ret = omapvid_apply_changes(vout);
-                       if (ret)
-                               printk(KERN_ERR VOUT_NAME
-                                               "failed to change mode\n");
-               }
+       addr = (unsigned long) vout->queued_buf_addr[vout->next_frm->i]
+               + vout->cropped_offset;
 
-       }
+       /* First save the configuration in ovelray structure */
+       ret = omapvid_init(vout, addr);
+       if (ret)
+               printk(KERN_ERR VOUT_NAME
+                       "failed to set overlay info\n");
+       /* Enable the pipeline and set the Go bit */
+       ret = omapvid_apply_changes(vout);
+       if (ret)
+               printk(KERN_ERR VOUT_NAME "failed to change mode\n");
 
 vout_isr_err:
        spin_unlock(&vout->vbq_lock);
 }
 
-
 /* Video buffer call backs */
 
 /*
@@ -663,10 +664,14 @@ static int omap_vout_buffer_setup(struct videobuf_queue *q, unsigned int *count,
        u32 phy_addr = 0, virt_addr = 0;
        struct omap_vout_device *vout = q->priv_data;
        struct omapvideo_info *ovid = &vout->vid_info;
+       int vid_max_buf_size;
 
        if (!vout)
                return -EINVAL;
 
+       vid_max_buf_size = vout->vid == OMAP_VIDEO1 ? video1_bufsize :
+               video2_bufsize;
+
        if (V4L2_BUF_TYPE_VIDEO_OUTPUT != q->type)
                return -EINVAL;
 
@@ -689,7 +694,7 @@ static int omap_vout_buffer_setup(struct videobuf_queue *q, unsigned int *count,
                video1_numbuffers : video2_numbuffers;
 
        /* Check the size of the buffer */
-       if (*size > vout->buffer_size) {
+       if (*size > vid_max_buf_size) {
                v4l2_err(&vout->vid_dev->v4l2_dev,
                                "buffer allocation mismatch [%u] [%u]\n",
                                *size, vout->buffer_size);
index d793501cafcc516710f319cd5a9d64acced3da49..27a95d23b913493db67d20b90857e37f621fdd10 100644 (file)
@@ -25,7 +25,7 @@
 #define MAC_VRFB_CTXS  4
 #define MAX_VOUT_DEV   2
 #define MAX_OVLS       3
-#define MAX_DISPLAYS   3
+#define MAX_DISPLAYS   10
 #define MAX_MANAGERS   3
 
 #define QQVGA_WIDTH            160
diff --git a/drivers/media/video/s5p-g2d/Makefile b/drivers/media/video/s5p-g2d/Makefile
new file mode 100644 (file)
index 0000000..2c48c41
--- /dev/null
@@ -0,0 +1,3 @@
+s5p-g2d-objs := g2d.o g2d-hw.o
+
+obj-$(CONFIG_VIDEO_SAMSUNG_S5P_G2D)    += s5p-g2d.o
diff --git a/drivers/media/video/s5p-g2d/g2d-hw.c b/drivers/media/video/s5p-g2d/g2d-hw.c
new file mode 100644 (file)
index 0000000..e5249f3
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Samsung S5P G2D - 2D Graphics Accelerator Driver
+ *
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd.
+ * Kamil Debski, <k.debski@samsung.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 <linux/io.h>
+
+#include "g2d.h"
+#include "g2d-regs.h"
+
+#define w(x, a)        writel((x), d->regs + (a))
+#define r(a)   readl(d->regs + (a))
+
+/* g2d_reset clears all g2d registers */
+void g2d_reset(struct g2d_dev *d)
+{
+       w(1, SOFT_RESET_REG);
+}
+
+void g2d_set_src_size(struct g2d_dev *d, struct g2d_frame *f)
+{
+       u32 n;
+       u32 stride;
+
+       w(f->stride & 0xFFFF, SRC_STRIDE_REG);
+
+       n = f->o_height & 0xFFF;
+       n <<= 16;
+       n |= f->o_width & 0xFFF;
+       w(n, SRC_LEFT_TOP_REG);
+
+       n = f->bottom & 0xFFF;
+       n <<= 16;
+       n |= f->right & 0xFFF;
+       w(n, SRC_RIGHT_BOTTOM_REG);
+
+       w(f->fmt->hw, SRC_COLOR_MODE_REG);
+}
+
+void g2d_set_src_addr(struct g2d_dev *d, dma_addr_t a)
+{
+       w(a, SRC_BASE_ADDR_REG);
+}
+
+void g2d_set_dst_size(struct g2d_dev *d, struct g2d_frame *f)
+{
+       u32 n;
+       u32 stride;
+
+       w(f->stride & 0xFFFF, DST_STRIDE_REG);
+
+       n = f->o_height & 0xFFF;
+       n <<= 16;
+       n |= f->o_width & 0xFFF;
+       w(n, DST_LEFT_TOP_REG);
+
+       n = f->bottom & 0xFFF;
+       n <<= 16;
+       n |= f->right & 0xFFF;
+       w(n, DST_RIGHT_BOTTOM_REG);
+
+       w(f->fmt->hw, DST_COLOR_MODE_REG);
+}
+
+void g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a)
+{
+       w(a, DST_BASE_ADDR_REG);
+}
+
+void g2d_set_rop4(struct g2d_dev *d, u32 r)
+{
+       w(r, ROP4_REG);
+}
+
+u32 g2d_cmd_stretch(u32 e)
+{
+       e &= 1;
+       return e << 4;
+}
+
+void g2d_set_cmd(struct g2d_dev *d, u32 c)
+{
+       w(c, BITBLT_COMMAND_REG);
+}
+
+void g2d_start(struct g2d_dev *d)
+{
+       /* Clear cache */
+       w(0x7, CACHECTL_REG);
+       /* Enable interrupt */
+       w(1, INTEN_REG);
+       /* Start G2D engine */
+       w(1, BITBLT_START_REG);
+}
+
+void g2d_clear_int(struct g2d_dev *d)
+{
+       w(1, INTC_PEND_REG);
+}
diff --git a/drivers/media/video/s5p-g2d/g2d-regs.h b/drivers/media/video/s5p-g2d/g2d-regs.h
new file mode 100644 (file)
index 0000000..02e1cf5
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Samsung S5P G2D - 2D Graphics Accelerator Driver
+ *
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd.
+ * Kamil Debski, <k.debski@samsung.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
+ */
+
+/* General Registers */
+#define SOFT_RESET_REG         0x0000  /* Software reset reg */
+#define INTEN_REG              0x0004  /* Interrupt Enable reg */
+#define INTC_PEND_REG          0x000C  /* Interrupt Control Pending reg */
+#define FIFO_STAT_REG          0x0010  /* Command FIFO Status reg */
+#define AXI_ID_MODE_REG                0x0014  /* AXI Read ID Mode reg */
+#define CACHECTL_REG           0x0018  /* Cache & Buffer clear reg */
+#define AXI_MODE_REG           0x001C  /* AXI Mode reg */
+
+/* Command Registers */
+#define BITBLT_START_REG       0x0100  /* BitBLT Start reg */
+#define BITBLT_COMMAND_REG     0x0104  /* Command reg for BitBLT */
+
+/* Parameter Setting Registers (Rotate & Direction) */
+#define ROTATE_REG             0x0200  /* Rotation reg */
+#define SRC_MSK_DIRECT_REG     0x0204  /* Src and Mask Direction reg */
+#define DST_PAT_DIRECT_REG     0x0208  /* Dest and Pattern Direction reg */
+
+/* Parameter Setting Registers (Src) */
+#define SRC_SELECT_REG         0x0300  /* Src Image Selection reg */
+#define SRC_BASE_ADDR_REG      0x0304  /* Src Image Base Address reg */
+#define SRC_STRIDE_REG         0x0308  /* Src Stride reg */
+#define SRC_COLOR_MODE_REG     0x030C  /* Src Image Color Mode reg */
+#define SRC_LEFT_TOP_REG       0x0310  /* Src Left Top Coordinate reg */
+#define SRC_RIGHT_BOTTOM_REG   0x0314  /* Src Right Bottom Coordinate reg */
+
+/* Parameter Setting Registers (Dest) */
+#define DST_SELECT_REG         0x0400  /* Dest Image Selection reg */
+#define DST_BASE_ADDR_REG      0x0404  /* Dest Image Base Address reg */
+#define DST_STRIDE_REG         0x0408  /* Dest Stride reg */
+#define DST_COLOR_MODE_REG     0x040C  /* Dest Image Color Mode reg */
+#define DST_LEFT_TOP_REG       0x0410  /* Dest Left Top Coordinate reg */
+#define DST_RIGHT_BOTTOM_REG   0x0414  /* Dest Right Bottom Coordinate reg */
+
+/* Parameter Setting Registers (Pattern) */
+#define PAT_BASE_ADDR_REG      0x0500  /* Pattern Image Base Address reg */
+#define PAT_SIZE_REG           0x0504  /* Pattern Image Size reg */
+#define PAT_COLOR_MODE_REG     0x0508  /* Pattern Image Color Mode reg */
+#define PAT_OFFSET_REG         0x050C  /* Pattern Left Top Coordinate reg */
+#define PAT_STRIDE_REG         0x0510  /* Pattern Stride reg */
+
+/* Parameter Setting Registers (Mask) */
+#define MASK_BASE_ADDR_REG     0x0520  /* Mask Base Address reg */
+#define MASK_STRIDE_REG                0x0524  /* Mask Stride reg */
+
+/* Parameter Setting Registers (Clipping Window) */
+#define CW_LT_REG              0x0600  /* LeftTop coordinates of Clip Window */
+#define CW_RB_REG              0x0604  /* RightBottom coordinates of Clip
+                                                               Window */
+
+/* Parameter Setting Registers (ROP & Alpha Setting) */
+#define THIRD_OPERAND_REG      0x0610  /* Third Operand Selection reg */
+#define ROP4_REG               0x0614  /* Raster Operation reg */
+#define ALPHA_REG              0x0618  /* Alpha value, Fading offset value */
+
+/* Parameter Setting Registers (Color) */
+#define FG_COLOR_REG           0x0700  /* Foreground Color reg */
+#define BG_COLOR_REG           0x0704  /* Background Color reg */
+#define BS_COLOR_REG           0x0708  /* Blue Screen Color reg */
+
+/* Parameter Setting Registers (Color Key) */
+#define SRC_COLORKEY_CTRL_REG  0x0710  /* Src Colorkey control reg */
+#define SRC_COLORKEY_DR_MIN_REG        0x0714  /* Src Colorkey Decision Reference
+                                                               Min reg */
+#define SRC_COLORKEY_DR_MAX_REG        0x0718  /* Src Colorkey Decision Reference
+                                                               Max reg */
+#define DST_COLORKEY_CTRL_REG  0x071C  /* Dest Colorkey control reg */
+#define DST_COLORKEY_DR_MIN_REG        0x0720  /* Dest Colorkey Decision Reference
+                                                               Min reg */
+#define DST_COLORKEY_DR_MAX_REG        0x0724  /* Dest Colorkey Decision Reference
+                                                               Max reg */
+
+/* Color mode values */
+
+#define ORDER_XRGB             0
+#define ORDER_RGBX             1
+#define ORDER_XBGR             2
+#define ORDER_BGRX             3
+
+#define MODE_XRGB_8888         0
+#define MODE_ARGB_8888         1
+#define MODE_RGB_565           2
+#define MODE_XRGB_1555         3
+#define MODE_ARGB_1555         4
+#define MODE_XRGB_4444         5
+#define MODE_ARGB_4444         6
+#define MODE_PACKED_RGB_888    7
+
+#define COLOR_MODE(o, m)       (((o) << 4) | (m))
+
+/* ROP4 operation values */
+#define ROP4_COPY              0xCCCC
+#define ROP4_INVERT            0x3333
+
+/* Hardware limits */
+#define MAX_WIDTH              8000
+#define MAX_HEIGHT             8000
+
+#define G2D_TIMEOUT            500
+
+#define DEFAULT_WIDTH          100
+#define DEFAULT_HEIGHT         100
+
diff --git a/drivers/media/video/s5p-g2d/g2d.c b/drivers/media/video/s5p-g2d/g2d.c
new file mode 100644 (file)
index 0000000..1f156c8
--- /dev/null
@@ -0,0 +1,824 @@
+/*
+ * Samsung S5P G2D - 2D Graphics Accelerator Driver
+ *
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd.
+ * Kamil Debski, <k.debski@samsung.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 <linux/module.h>
+#include <linux/fs.h>
+#include <linux/version.h>
+#include <linux/timer.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/clk.h>
+#include <linux/interrupt.h>
+
+#include <linux/platform_device.h>
+#include <media/v4l2-mem2mem.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-ioctl.h>
+#include <media/videobuf2-core.h>
+#include <media/videobuf2-dma-contig.h>
+
+#include "g2d.h"
+#include "g2d-regs.h"
+
+#define fh2ctx(__fh) container_of(__fh, struct g2d_ctx, fh)
+
+static struct g2d_fmt formats[] = {
+       {
+               .name   = "XRGB_8888",
+               .fourcc = V4L2_PIX_FMT_RGB32,
+               .depth  = 32,
+               .hw     = COLOR_MODE(ORDER_XRGB, MODE_XRGB_8888),
+       },
+       {
+               .name   = "RGB_565",
+               .fourcc = V4L2_PIX_FMT_RGB565X,
+               .depth  = 16,
+               .hw     = COLOR_MODE(ORDER_XRGB, MODE_RGB_565),
+       },
+       {
+               .name   = "XRGB_1555",
+               .fourcc = V4L2_PIX_FMT_RGB555X,
+               .depth  = 16,
+               .hw     = COLOR_MODE(ORDER_XRGB, MODE_XRGB_1555),
+       },
+       {
+               .name   = "XRGB_4444",
+               .fourcc = V4L2_PIX_FMT_RGB444,
+               .depth  = 16,
+               .hw     = COLOR_MODE(ORDER_XRGB, MODE_XRGB_4444),
+       },
+       {
+               .name   = "PACKED_RGB_888",
+               .fourcc = V4L2_PIX_FMT_RGB24,
+               .depth  = 24,
+               .hw     = COLOR_MODE(ORDER_XRGB, MODE_PACKED_RGB_888),
+       },
+};
+#define NUM_FORMATS ARRAY_SIZE(formats)
+
+struct g2d_frame def_frame = {
+       .width          = DEFAULT_WIDTH,
+       .height         = DEFAULT_HEIGHT,
+       .c_width        = DEFAULT_WIDTH,
+       .c_height       = DEFAULT_HEIGHT,
+       .o_width        = 0,
+       .o_height       = 0,
+       .fmt            = &formats[0],
+       .right          = DEFAULT_WIDTH,
+       .bottom         = DEFAULT_HEIGHT,
+};
+
+struct g2d_fmt *find_fmt(struct v4l2_format *f)
+{
+       unsigned int i;
+       for (i = 0; i < NUM_FORMATS; i++) {
+               if (formats[i].fourcc == f->fmt.pix.pixelformat)
+                       return &formats[i];
+       }
+       return NULL;
+}
+
+
+static struct g2d_frame *get_frame(struct g2d_ctx *ctx,
+                                                       enum v4l2_buf_type type)
+{
+       switch (type) {
+       case V4L2_BUF_TYPE_VIDEO_OUTPUT:
+               return &ctx->in;
+       case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+               return &ctx->out;
+       default:
+               return ERR_PTR(-EINVAL);
+       }
+}
+
+static int g2d_queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
+                          unsigned int *nbuffers, unsigned int *nplanes,
+                          unsigned int sizes[], void *alloc_ctxs[])
+{
+       struct g2d_ctx *ctx = vb2_get_drv_priv(vq);
+       struct g2d_frame *f = get_frame(ctx, vq->type);
+
+       if (IS_ERR(f))
+               return PTR_ERR(f);
+
+       sizes[0] = f->size;
+       *nplanes = 1;
+       alloc_ctxs[0] = ctx->dev->alloc_ctx;
+
+       if (*nbuffers == 0)
+               *nbuffers = 1;
+
+       return 0;
+}
+
+static int g2d_buf_prepare(struct vb2_buffer *vb)
+{
+       struct g2d_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
+       struct g2d_frame *f = get_frame(ctx, vb->vb2_queue->type);
+
+       if (IS_ERR(f))
+               return PTR_ERR(f);
+       vb2_set_plane_payload(vb, 0, f->size);
+       return 0;
+}
+
+static void g2d_buf_queue(struct vb2_buffer *vb)
+{
+       struct g2d_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
+       v4l2_m2m_buf_queue(ctx->m2m_ctx, vb);
+}
+
+
+static struct vb2_ops g2d_qops = {
+       .queue_setup    = g2d_queue_setup,
+       .buf_prepare    = g2d_buf_prepare,
+       .buf_queue      = g2d_buf_queue,
+};
+
+static int queue_init(void *priv, struct vb2_queue *src_vq,
+                                               struct vb2_queue *dst_vq)
+{
+       struct g2d_ctx *ctx = priv;
+       int ret;
+
+       memset(src_vq, 0, sizeof(*src_vq));
+       src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
+       src_vq->io_modes = VB2_MMAP | VB2_USERPTR;
+       src_vq->drv_priv = ctx;
+       src_vq->ops = &g2d_qops;
+       src_vq->mem_ops = &vb2_dma_contig_memops;
+       src_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
+
+       ret = vb2_queue_init(src_vq);
+       if (ret)
+               return ret;
+
+       memset(dst_vq, 0, sizeof(*dst_vq));
+       dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+       dst_vq->io_modes = VB2_MMAP | VB2_USERPTR;
+       dst_vq->drv_priv = ctx;
+       dst_vq->ops = &g2d_qops;
+       dst_vq->mem_ops = &vb2_dma_contig_memops;
+       dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
+
+       return vb2_queue_init(dst_vq);
+}
+
+static int g2d_s_ctrl(struct v4l2_ctrl *ctrl)
+{
+       struct g2d_ctx *ctx = container_of(ctrl->handler, struct g2d_ctx,
+                                                               ctrl_handler);
+       switch (ctrl->id) {
+       case V4L2_CID_COLORFX:
+               if (ctrl->val == V4L2_COLORFX_NEGATIVE)
+                       ctx->rop = ROP4_INVERT;
+               else
+                       ctx->rop = ROP4_COPY;
+       default:
+               v4l2_err(&ctx->dev->v4l2_dev, "unknown control\n");
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static const struct v4l2_ctrl_ops g2d_ctrl_ops = {
+       .s_ctrl         = g2d_s_ctrl,
+};
+
+int g2d_setup_ctrls(struct g2d_ctx *ctx)
+{
+       struct g2d_dev *dev = ctx->dev;
+
+       v4l2_ctrl_handler_init(&ctx->ctrl_handler, 1);
+       if (ctx->ctrl_handler.error) {
+               v4l2_err(&dev->v4l2_dev, "v4l2_ctrl_handler_init failed\n");
+               return ctx->ctrl_handler.error;
+       }
+
+       v4l2_ctrl_new_std_menu(
+               &ctx->ctrl_handler,
+               &g2d_ctrl_ops,
+               V4L2_CID_COLORFX,
+               V4L2_COLORFX_NEGATIVE,
+               ~((1 << V4L2_COLORFX_NONE) | (1 << V4L2_COLORFX_NEGATIVE)),
+               V4L2_COLORFX_NONE);
+
+       if (ctx->ctrl_handler.error) {
+               v4l2_err(&dev->v4l2_dev, "v4l2_ctrl_handler_init failed\n");
+               return ctx->ctrl_handler.error;
+       }
+
+       return 0;
+}
+
+static int g2d_open(struct file *file)
+{
+       struct g2d_dev *dev = video_drvdata(file);
+       struct g2d_ctx *ctx = NULL;
+       int ret = 0;
+
+       ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+       if (!ctx)
+               return -ENOMEM;
+       ctx->dev = dev;
+       /* Set default formats */
+       ctx->in         = def_frame;
+       ctx->out        = def_frame;
+
+       ctx->m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, ctx, &queue_init);
+       if (IS_ERR(ctx->m2m_ctx)) {
+               ret = PTR_ERR(ctx->m2m_ctx);
+               kfree(ctx);
+               return ret;
+       }
+       v4l2_fh_init(&ctx->fh, video_devdata(file));
+       file->private_data = &ctx->fh;
+       v4l2_fh_add(&ctx->fh);
+
+       g2d_setup_ctrls(ctx);
+
+       /* Write the default values to the ctx struct */
+       v4l2_ctrl_handler_setup(&ctx->ctrl_handler);
+
+       ctx->fh.ctrl_handler = &ctx->ctrl_handler;
+
+       v4l2_info(&dev->v4l2_dev, "instance opened\n");
+       return 0;
+}
+
+static int g2d_release(struct file *file)
+{
+       struct g2d_dev *dev = video_drvdata(file);
+       struct g2d_ctx *ctx = fh2ctx(file->private_data);
+
+       v4l2_ctrl_handler_free(&ctx->ctrl_handler);
+       v4l2_fh_del(&ctx->fh);
+       v4l2_fh_exit(&ctx->fh);
+       kfree(ctx);
+       v4l2_info(&dev->v4l2_dev, "instance closed\n");
+       return 0;
+}
+
+
+static int vidioc_querycap(struct file *file, void *priv,
+                               struct v4l2_capability *cap)
+{
+       strncpy(cap->driver, G2D_NAME, sizeof(cap->driver) - 1);
+       strncpy(cap->card, G2D_NAME, sizeof(cap->card) - 1);
+       cap->bus_info[0] = 0;
+       cap->version = KERNEL_VERSION(1, 0, 0);
+       cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT
+                                                       | V4L2_CAP_STREAMING;
+       return 0;
+}
+
+static int vidioc_enum_fmt(struct file *file, void *prv, struct v4l2_fmtdesc *f)
+{
+       struct g2d_fmt *fmt;
+       if (f->index >= NUM_FORMATS)
+               return -EINVAL;
+       fmt = &formats[f->index];
+       f->pixelformat = fmt->fourcc;
+       strncpy(f->description, fmt->name, sizeof(f->description) - 1);
+       return 0;
+}
+
+static int vidioc_g_fmt(struct file *file, void *prv, struct v4l2_format *f)
+{
+       struct g2d_ctx *ctx = prv;
+       struct vb2_queue *vq;
+       struct g2d_frame *frm;
+
+       vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type);
+       if (!vq)
+               return -EINVAL;
+       frm = get_frame(ctx, f->type);
+       if (IS_ERR(frm))
+               return PTR_ERR(frm);
+
+       f->fmt.pix.width                = frm->width;
+       f->fmt.pix.height               = frm->height;
+       f->fmt.pix.field                = V4L2_FIELD_NONE;
+       f->fmt.pix.pixelformat          = frm->fmt->fourcc;
+       f->fmt.pix.bytesperline         = (frm->width * frm->fmt->depth) >> 3;
+       f->fmt.pix.sizeimage            = frm->size;
+       return 0;
+}
+
+static int vidioc_try_fmt(struct file *file, void *prv, struct v4l2_format *f)
+{
+       struct g2d_fmt *fmt;
+       enum v4l2_field *field;
+
+       fmt = find_fmt(f);
+       if (!fmt)
+               return -EINVAL;
+
+       field = &f->fmt.pix.field;
+       if (*field == V4L2_FIELD_ANY)
+               *field = V4L2_FIELD_NONE;
+       else if (*field != V4L2_FIELD_NONE)
+               return -EINVAL;
+
+       if (f->fmt.pix.width > MAX_WIDTH)
+               f->fmt.pix.width = MAX_WIDTH;
+       if (f->fmt.pix.height > MAX_HEIGHT)
+               f->fmt.pix.height = MAX_HEIGHT;
+
+       if (f->fmt.pix.width < 1)
+               f->fmt.pix.width = 1;
+       if (f->fmt.pix.height < 1)
+               f->fmt.pix.height = 1;
+
+       f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
+       f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
+       return 0;
+}
+
+static int vidioc_s_fmt(struct file *file, void *prv, struct v4l2_format *f)
+{
+       struct g2d_ctx *ctx = prv;
+       struct g2d_dev *dev = ctx->dev;
+       struct vb2_queue *vq;
+       struct g2d_frame *frm;
+       struct g2d_fmt *fmt;
+       int ret = 0;
+
+       /* Adjust all values accordingly to the hardware capabilities
+        * and chosen format. */
+       ret = vidioc_try_fmt(file, prv, f);
+       if (ret)
+               return ret;
+       vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type);
+       if (vb2_is_busy(vq)) {
+               v4l2_err(&dev->v4l2_dev, "queue (%d) bust\n", f->type);
+               return -EBUSY;
+       }
+       frm = get_frame(ctx, f->type);
+       if (IS_ERR(frm))
+               return PTR_ERR(frm);
+       fmt = find_fmt(f);
+       if (!fmt)
+               return -EINVAL;
+       frm->width      = f->fmt.pix.width;
+       frm->height     = f->fmt.pix.height;
+       frm->size       = f->fmt.pix.sizeimage;
+       /* Reset crop settings */
+       frm->o_width    = 0;
+       frm->o_height   = 0;
+       frm->c_width    = frm->width;
+       frm->c_height   = frm->height;
+       frm->right      = frm->width;
+       frm->bottom     = frm->height;
+       frm->fmt        = fmt;
+       frm->stride     = f->fmt.pix.bytesperline;
+       return 0;
+}
+
+static unsigned int g2d_poll(struct file *file, struct poll_table_struct *wait)
+{
+       struct g2d_ctx *ctx = fh2ctx(file->private_data);
+       return v4l2_m2m_poll(file, ctx->m2m_ctx, wait);
+}
+
+static int g2d_mmap(struct file *file, struct vm_area_struct *vma)
+{
+       struct g2d_ctx *ctx = fh2ctx(file->private_data);
+       return v4l2_m2m_mmap(file, ctx->m2m_ctx, vma);
+}
+
+static int vidioc_reqbufs(struct file *file, void *priv,
+                       struct v4l2_requestbuffers *reqbufs)
+{
+       struct g2d_ctx *ctx = priv;
+       return v4l2_m2m_reqbufs(file, ctx->m2m_ctx, reqbufs);
+}
+
+static int vidioc_querybuf(struct file *file, void *priv,
+                       struct v4l2_buffer *buf)
+{
+       struct g2d_ctx *ctx = priv;
+       return v4l2_m2m_querybuf(file, ctx->m2m_ctx, buf);
+}
+
+static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
+{
+       struct g2d_ctx *ctx = priv;
+       return v4l2_m2m_qbuf(file, ctx->m2m_ctx, buf);
+}
+
+static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
+{
+       struct g2d_ctx *ctx = priv;
+       return v4l2_m2m_dqbuf(file, ctx->m2m_ctx, buf);
+}
+
+
+static int vidioc_streamon(struct file *file, void *priv,
+                                       enum v4l2_buf_type type)
+{
+       struct g2d_ctx *ctx = priv;
+       return v4l2_m2m_streamon(file, ctx->m2m_ctx, type);
+}
+
+static int vidioc_streamoff(struct file *file, void *priv,
+                                       enum v4l2_buf_type type)
+{
+       struct g2d_ctx *ctx = priv;
+       return v4l2_m2m_streamoff(file, ctx->m2m_ctx, type);
+}
+
+static int vidioc_cropcap(struct file *file, void *priv,
+                                       struct v4l2_cropcap *cr)
+{
+       struct g2d_ctx *ctx = priv;
+       struct g2d_frame *f;
+
+       f = get_frame(ctx, cr->type);
+       if (IS_ERR(f))
+               return PTR_ERR(f);
+
+       cr->bounds.left         = 0;
+       cr->bounds.top          = 0;
+       cr->bounds.width        = f->width;
+       cr->bounds.height       = f->height;
+       cr->defrect             = cr->bounds;
+       return 0;
+}
+
+static int vidioc_g_crop(struct file *file, void *prv, struct v4l2_crop *cr)
+{
+       struct g2d_ctx *ctx = prv;
+       struct g2d_frame *f;
+
+       f = get_frame(ctx, cr->type);
+       if (IS_ERR(f))
+               return PTR_ERR(f);
+
+       cr->c.left      = f->o_height;
+       cr->c.top       = f->o_width;
+       cr->c.width     = f->c_width;
+       cr->c.height    = f->c_height;
+       return 0;
+}
+
+static int vidioc_try_crop(struct file *file, void *prv, struct v4l2_crop *cr)
+{
+       struct g2d_ctx *ctx = prv;
+       struct g2d_dev *dev = ctx->dev;
+       struct g2d_frame *f;
+
+       f = get_frame(ctx, cr->type);
+       if (IS_ERR(f))
+               return PTR_ERR(f);
+
+       if (cr->c.top < 0 || cr->c.left < 0) {
+               v4l2_err(&dev->v4l2_dev,
+                       "doesn't support negative values for top & left\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int vidioc_s_crop(struct file *file, void *prv, struct v4l2_crop *cr)
+{
+       struct g2d_ctx *ctx = prv;
+       struct g2d_frame *f;
+       int ret;
+
+       ret = vidioc_try_crop(file, prv, cr);
+       if (ret)
+               return ret;
+       f = get_frame(ctx, cr->type);
+       if (IS_ERR(f))
+               return PTR_ERR(f);
+
+       f->c_width      = cr->c.width;
+       f->c_height     = cr->c.height;
+       f->o_width      = cr->c.left;
+       f->o_height     = cr->c.top;
+       f->bottom       = f->o_height + f->c_height;
+       f->right        = f->o_width + f->c_width;
+       return 0;
+}
+
+static void g2d_lock(void *prv)
+{
+       struct g2d_ctx *ctx = prv;
+       struct g2d_dev *dev = ctx->dev;
+       mutex_lock(&dev->mutex);
+}
+
+static void g2d_unlock(void *prv)
+{
+       struct g2d_ctx *ctx = prv;
+       struct g2d_dev *dev = ctx->dev;
+       mutex_unlock(&dev->mutex);
+}
+
+static void job_abort(void *prv)
+{
+       struct g2d_ctx *ctx = prv;
+       struct g2d_dev *dev = ctx->dev;
+       int ret;
+
+       if (dev->curr == 0) /* No job currently running */
+               return;
+
+       ret = wait_event_timeout(dev->irq_queue,
+               dev->curr == 0,
+               msecs_to_jiffies(G2D_TIMEOUT));
+}
+
+static void device_run(void *prv)
+{
+       struct g2d_ctx *ctx = prv;
+       struct g2d_dev *dev = ctx->dev;
+       struct vb2_buffer *src, *dst;
+       u32 cmd = 0;
+
+       dev->curr = ctx;
+
+       src = v4l2_m2m_next_src_buf(ctx->m2m_ctx);
+       dst = v4l2_m2m_next_dst_buf(ctx->m2m_ctx);
+
+       clk_enable(dev->gate);
+       g2d_reset(dev);
+
+       g2d_set_src_size(dev, &ctx->in);
+       g2d_set_src_addr(dev, vb2_dma_contig_plane_dma_addr(src, 0));
+
+       g2d_set_dst_size(dev, &ctx->out);
+       g2d_set_dst_addr(dev, vb2_dma_contig_plane_dma_addr(dst, 0));
+
+       g2d_set_rop4(dev, ctx->rop);
+       if (ctx->in.c_width != ctx->out.c_width ||
+               ctx->in.c_height != ctx->out.c_height)
+               cmd |= g2d_cmd_stretch(1);
+       g2d_set_cmd(dev, cmd);
+       g2d_start(dev);
+}
+
+static irqreturn_t g2d_isr(int irq, void *prv)
+{
+       struct g2d_dev *dev = prv;
+       struct g2d_ctx *ctx = dev->curr;
+       struct vb2_buffer *src, *dst;
+
+       g2d_clear_int(dev);
+       clk_disable(dev->gate);
+
+       BUG_ON(ctx == 0);
+
+       src = v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
+       dst = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx);
+
+       BUG_ON(src == 0);
+       BUG_ON(dst == 0);
+
+       v4l2_m2m_buf_done(src, VB2_BUF_STATE_DONE);
+       v4l2_m2m_buf_done(dst, VB2_BUF_STATE_DONE);
+       v4l2_m2m_job_finish(dev->m2m_dev, ctx->m2m_ctx);
+
+       dev->curr = 0;
+       wake_up(&dev->irq_queue);
+       return IRQ_HANDLED;
+}
+
+static const struct v4l2_file_operations g2d_fops = {
+       .owner          = THIS_MODULE,
+       .open           = g2d_open,
+       .release        = g2d_release,
+       .poll           = g2d_poll,
+       .unlocked_ioctl = video_ioctl2,
+       .mmap           = g2d_mmap,
+};
+
+static const struct v4l2_ioctl_ops g2d_ioctl_ops = {
+       .vidioc_querycap        = vidioc_querycap,
+
+       .vidioc_enum_fmt_vid_cap        = vidioc_enum_fmt,
+       .vidioc_g_fmt_vid_cap           = vidioc_g_fmt,
+       .vidioc_try_fmt_vid_cap         = vidioc_try_fmt,
+       .vidioc_s_fmt_vid_cap           = vidioc_s_fmt,
+
+       .vidioc_enum_fmt_vid_out        = vidioc_enum_fmt,
+       .vidioc_g_fmt_vid_out           = vidioc_g_fmt,
+       .vidioc_try_fmt_vid_out         = vidioc_try_fmt,
+       .vidioc_s_fmt_vid_out           = vidioc_s_fmt,
+
+       .vidioc_reqbufs                 = vidioc_reqbufs,
+       .vidioc_querybuf                = vidioc_querybuf,
+
+       .vidioc_qbuf                    = vidioc_qbuf,
+       .vidioc_dqbuf                   = vidioc_dqbuf,
+
+       .vidioc_streamon                = vidioc_streamon,
+       .vidioc_streamoff               = vidioc_streamoff,
+
+       .vidioc_g_crop                  = vidioc_g_crop,
+       .vidioc_s_crop                  = vidioc_s_crop,
+       .vidioc_cropcap                 = vidioc_cropcap,
+};
+
+static struct video_device g2d_videodev = {
+       .name           = G2D_NAME,
+       .fops           = &g2d_fops,
+       .ioctl_ops      = &g2d_ioctl_ops,
+       .minor          = -1,
+       .release        = video_device_release,
+};
+
+static struct v4l2_m2m_ops g2d_m2m_ops = {
+       .device_run     = device_run,
+       .job_abort      = job_abort,
+       .lock           = g2d_lock,
+       .unlock         = g2d_unlock,
+};
+
+static int g2d_probe(struct platform_device *pdev)
+{
+       struct g2d_dev *dev;
+       struct video_device *vfd;
+       struct resource *res;
+       int ret = 0;
+
+       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+       if (!dev)
+               return -ENOMEM;
+       spin_lock_init(&dev->irqlock);
+       mutex_init(&dev->mutex);
+       atomic_set(&dev->num_inst, 0);
+       init_waitqueue_head(&dev->irq_queue);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "failed to find registers\n");
+               ret = -ENOENT;
+               goto free_dev;
+       }
+
+       dev->res_regs = request_mem_region(res->start, resource_size(res),
+                                               dev_name(&pdev->dev));
+
+       if (!dev->res_regs) {
+               dev_err(&pdev->dev, "failed to obtain register region\n");
+               ret = -ENOENT;
+               goto free_dev;
+       }
+
+       dev->regs = ioremap(res->start, resource_size(res));
+       if (!dev->regs) {
+               dev_err(&pdev->dev, "failed to map registers\n");
+               ret = -ENOENT;
+               goto rel_res_regs;
+       }
+
+       dev->clk = clk_get(&pdev->dev, "sclk_fimg2d");
+       if (IS_ERR_OR_NULL(dev->clk)) {
+               dev_err(&pdev->dev, "failed to get g2d clock\n");
+               ret = -ENXIO;
+               goto unmap_regs;
+       }
+
+       dev->gate = clk_get(&pdev->dev, "fimg2d");
+       if (IS_ERR_OR_NULL(dev->gate)) {
+               dev_err(&pdev->dev, "failed to get g2d clock gate\n");
+               ret = -ENXIO;
+               goto put_clk;
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "failed to find IRQ\n");
+               ret = -ENXIO;
+               goto put_clk_gate;
+       }
+
+       dev->irq = res->start;
+
+       ret = request_irq(dev->irq, g2d_isr, 0, pdev->name, dev);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to install IRQ\n");
+               goto put_clk_gate;
+       }
+
+       dev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
+       if (IS_ERR(dev->alloc_ctx)) {
+               ret = PTR_ERR(dev->alloc_ctx);
+               goto rel_irq;
+       }
+
+       ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
+       if (ret)
+               goto alloc_ctx_cleanup;
+       vfd = video_device_alloc();
+       if (!vfd) {
+               v4l2_err(&dev->v4l2_dev, "Failed to allocate video device\n");
+               ret = -ENOMEM;
+               goto unreg_v4l2_dev;
+       }
+       *vfd = g2d_videodev;
+       vfd->lock = &dev->mutex;
+       ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
+       if (ret) {
+               v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
+               goto rel_vdev;
+       }
+       video_set_drvdata(vfd, dev);
+       snprintf(vfd->name, sizeof(vfd->name), "%s", g2d_videodev.name);
+       dev->vfd = vfd;
+       v4l2_info(&dev->v4l2_dev, "device registered as /dev/video%d\n",
+                                                               vfd->num);
+       platform_set_drvdata(pdev, dev);
+       dev->m2m_dev = v4l2_m2m_init(&g2d_m2m_ops);
+       if (IS_ERR(dev->m2m_dev)) {
+               v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem device\n");
+               ret = PTR_ERR(dev->m2m_dev);
+               goto unreg_video_dev;
+       }
+
+       def_frame.stride = (def_frame.width * def_frame.fmt->depth) >> 3;
+
+       return 0;
+
+unreg_video_dev:
+       video_unregister_device(dev->vfd);
+rel_vdev:
+       video_device_release(vfd);
+unreg_v4l2_dev:
+       v4l2_device_unregister(&dev->v4l2_dev);
+alloc_ctx_cleanup:
+       vb2_dma_contig_cleanup_ctx(dev->alloc_ctx);
+rel_irq:
+       free_irq(dev->irq, dev);
+put_clk_gate:
+       clk_put(dev->gate);
+put_clk:
+       clk_put(dev->clk);
+unmap_regs:
+       iounmap(dev->regs);
+rel_res_regs:
+       release_resource(dev->res_regs);
+free_dev:
+       kfree(dev);
+       return ret;
+}
+
+static int g2d_remove(struct platform_device *pdev)
+{
+       struct g2d_dev *dev = (struct g2d_dev *)platform_get_drvdata(pdev);
+
+       v4l2_info(&dev->v4l2_dev, "Removing " G2D_NAME);
+       v4l2_m2m_release(dev->m2m_dev);
+       video_unregister_device(dev->vfd);
+       v4l2_device_unregister(&dev->v4l2_dev);
+       vb2_dma_contig_cleanup_ctx(dev->alloc_ctx);
+       free_irq(dev->irq, dev);
+       clk_put(dev->gate);
+       clk_put(dev->clk);
+       iounmap(dev->regs);
+       release_resource(dev->res_regs);
+       kfree(dev);
+       return 0;
+}
+
+static struct platform_driver g2d_pdrv = {
+       .probe          = g2d_probe,
+       .remove         = g2d_remove,
+       .driver         = {
+               .name = G2D_NAME,
+               .owner = THIS_MODULE,
+       },
+};
+
+static void __exit g2d_exit(void)
+{
+       platform_driver_unregister(&g2d_pdrv);
+};
+
+static int  __init g2d_init(void)
+{
+       int ret = 0;
+
+       ret = platform_driver_register(&g2d_pdrv);
+       return ret;
+};
+
+module_init(g2d_init);
+module_exit(g2d_exit);
+
+MODULE_AUTHOR("Kamil Debski <k.debski@samsung.com>");
+MODULE_DESCRIPTION("S5P G2D 2d graphics accelerator driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/video/s5p-g2d/g2d.h b/drivers/media/video/s5p-g2d/g2d.h
new file mode 100644 (file)
index 0000000..5eae901
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Samsung S5P G2D - 2D Graphics Accelerator Driver
+ *
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd.
+ * Kamil Debski, <k.debski@samsung.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/v4l2-device.h>
+#include <media/v4l2-ctrls.h>
+
+#define G2D_NAME "s5p-g2d"
+
+struct g2d_dev {
+       struct v4l2_device      v4l2_dev;
+       struct v4l2_m2m_dev     *m2m_dev;
+       struct video_device     *vfd;
+       struct mutex            mutex;
+       spinlock_t              irqlock;
+       atomic_t                num_inst;
+       struct vb2_alloc_ctx    *alloc_ctx;
+       struct resource         *res_regs;
+       void __iomem            *regs;
+       struct clk              *clk;
+       struct clk              *gate;
+       struct g2d_ctx          *curr;
+       int irq;
+       wait_queue_head_t       irq_queue;
+};
+
+struct g2d_frame {
+       /* Original dimensions */
+       u32     width;
+       u32     height;
+       /* Crop size */
+       u32     c_width;
+       u32     c_height;
+       /* Offset */
+       u32     o_width;
+       u32     o_height;
+       /* Image format */
+       struct g2d_fmt *fmt;
+       /* Variables that can calculated once and reused */
+       u32     stride;
+       u32     bottom;
+       u32     right;
+       u32     size;
+};
+
+struct g2d_ctx {
+       struct v4l2_fh fh;
+       struct g2d_dev          *dev;
+       struct v4l2_m2m_ctx     *m2m_ctx;
+       struct g2d_frame        in;
+       struct g2d_frame        out;
+       struct v4l2_ctrl_handler ctrl_handler;
+       u32 rop;
+};
+
+struct g2d_fmt {
+       char    *name;
+       u32     fourcc;
+       int     depth;
+       u32     hw;
+};
+
+
+void g2d_reset(struct g2d_dev *d);
+void g2d_set_src_size(struct g2d_dev *d, struct g2d_frame *f);
+void g2d_set_src_addr(struct g2d_dev *d, dma_addr_t a);
+void g2d_set_dst_size(struct g2d_dev *d, struct g2d_frame *f);
+void g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a);
+void g2d_start(struct g2d_dev *d);
+void g2d_clear_int(struct g2d_dev *d);
+void g2d_set_rop4(struct g2d_dev *d, u32 r);
+u32 g2d_cmd_stretch(u32 e);
+void g2d_set_cmd(struct g2d_dev *d, u32 c);
+
+
index 0f9fb99adeb4e06224445f42d25546038b0bf878..065d0f6be4a061121eed47c5956ad5953980383b 100644 (file)
@@ -5691,6 +5691,27 @@ struct saa7134_board saa7134_boards[] = {
                        .amux = LINE1,
                },
        },
+       [SAA7134_BOARD_SENSORAY811_911] = {
+               .name           = "Sensoray 811/911",
+               .audio_clock    = 0x00200000,
+               .tuner_type     = TUNER_ABSENT,
+               .radio_type     = UNSET,
+               .tuner_addr     = ADDR_UNSET,
+               .radio_addr     = ADDR_UNSET,
+               .inputs         = {{
+                       .name   = name_comp1,
+                       .vmux   = 0,
+                       .amux   = LINE1,
+               }, {
+                       .name   = name_comp3,
+                       .vmux   = 2,
+                       .amux   = LINE1,
+               }, {
+                       .name   = name_svideo,
+                       .vmux   = 8,
+                       .amux   = LINE1,
+               } },
+       },
 
 };
 
@@ -6913,6 +6934,18 @@ struct pci_device_id saa7134_pci_tbl[] = {
                .subvendor    = 0x17de,
                .subdevice    = 0xd136,
                .driver_data  = SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2,
+       }, {
+               .vendor       = PCI_VENDOR_ID_PHILIPS,
+               .device       = PCI_DEVICE_ID_PHILIPS_SAA7133,
+               .subvendor    = 0x6000,
+               .subdevice    = 0x0811,
+               .driver_data  = SAA7134_BOARD_SENSORAY811_911,
+       }, {
+               .vendor       = PCI_VENDOR_ID_PHILIPS,
+               .device       = PCI_DEVICE_ID_PHILIPS_SAA7133,
+               .subvendor    = 0x6000,
+               .subdevice    = 0x0911,
+               .driver_data  = SAA7134_BOARD_SENSORAY811_911,
        }, {
                /* --- boards without eeprom + subsystem ID --- */
                .vendor       = PCI_VENDOR_ID_PHILIPS,
index 9b550687213a44c7b808ca73bfa6713e05aebb50..4ad9de4410d4c31b1c2c781a62341606a6fc52f7 100644 (file)
@@ -330,6 +330,7 @@ struct saa7134_card_ir {
 #define SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2 185
 #define SAA7134_BOARD_BEHOLD_501            186
 #define SAA7134_BOARD_BEHOLD_503FM          187
+#define SAA7134_BOARD_SENSORAY811_911       188
 
 #define SAA7134_MAXBOARDS 32
 #define SAA7134_INPUT_MAX 8
index 6abaa16ae136b950657e1086fee643a0f6cc8b50..fc91a1ec54a01e26e1939fe5149c24e5181ca363 100644 (file)
@@ -703,21 +703,21 @@ static int tvp5150_set_std(struct v4l2_subdev *sd, v4l2_std_id std)
        /* First tests should be against specific std */
 
        if (std == V4L2_STD_ALL) {
-               fmt = 0;        /* Autodetect mode */
+               fmt = VIDEO_STD_AUTO_SWITCH_BIT;        /* Autodetect mode */
        } else if (std & V4L2_STD_NTSC_443) {
-               fmt = 0xa;
+               fmt = VIDEO_STD_NTSC_4_43_BIT;
        } else if (std & V4L2_STD_PAL_M) {
-               fmt = 0x6;
+               fmt = VIDEO_STD_PAL_M_BIT;
        } else if (std & (V4L2_STD_PAL_N | V4L2_STD_PAL_Nc)) {
-               fmt = 0x8;
+               fmt = VIDEO_STD_PAL_COMBINATION_N_BIT;
        } else {
                /* Then, test against generic ones */
                if (std & V4L2_STD_NTSC)
-                       fmt = 0x2;
+                       fmt = VIDEO_STD_NTSC_MJ_BIT;
                else if (std & V4L2_STD_PAL)
-                       fmt = 0x4;
+                       fmt = VIDEO_STD_PAL_BDGHIN_BIT;
                else if (std & V4L2_STD_SECAM)
-                       fmt = 0xc;
+                       fmt = VIDEO_STD_SECAM_BIT;
        }
 
        v4l2_dbg(1, debug, sd, "Set video std register to %d.\n", fmt);
index d7f97513b2894c61902ed9783898997acae0893a..89fec029e9246c6933b7cfa6aea9441fc403536b 100644 (file)
@@ -110,42 +110,20 @@ static inline int usb_find_address(struct i2c_adapter *i2c_adap,
 
        unsigned char addr;
        int ret;
-       if ((flags & I2C_M_TEN)) {
-               /* a ten bit address */
-               addr = 0xf0 | ((msg->addr >> 7) & 0x03);
-               /* try extended address code... */
-               ret = try_write_address(i2c_adap, addr, retries);
-               if (ret != 1) {
-                       dev_err(&i2c_adap->dev,
-                               "died at extended address code, while writing\n");
-                       return -EREMOTEIO;
-               }
-               add[0] = addr;
-               if (flags & I2C_M_RD) {
-                       /* okay, now switch into reading mode */
-                       addr |= 0x01;
-                       ret = try_read_address(i2c_adap, addr, retries);
-                       if (ret != 1) {
-                               dev_err(&i2c_adap->dev,
-                                       "died at extended address code, while reading\n");
-                               return -EREMOTEIO;
-                       }
-               }
 
-       } else {                /* normal 7bit address  */
-               addr = (msg->addr << 1);
-               if (flags & I2C_M_RD)
-                       addr |= 1;
+       addr = (msg->addr << 1);
+       if (flags & I2C_M_RD)
+               addr |= 1;
 
-               add[0] = addr;
-               if (flags & I2C_M_RD)
-                       ret = try_read_address(i2c_adap, addr, retries);
-               else
-                       ret = try_write_address(i2c_adap, addr, retries);
+       add[0] = addr;
+       if (flags & I2C_M_RD)
+               ret = try_read_address(i2c_adap, addr, retries);
+       else
+               ret = try_write_address(i2c_adap, addr, retries);
+
+       if (ret != 1)
+               return -EREMOTEIO;
 
-               if (ret != 1)
-                       return -EREMOTEIO;
-       }
        return 0;
 }
 
@@ -184,7 +162,7 @@ usbvision_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num)
 
 static u32 functionality(struct i2c_adapter *adap)
 {
-       return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR;
+       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
 }
 
 /* -----exported algorithm data: ------------------------------------- */
index cbf13d09b4ac84c20c6cfe2ba86180e07355bbfc..6a828759e38773028642c98cc4f9e1d893fcb448 100644 (file)
@@ -156,14 +156,10 @@ static struct via_format {
                .mbus_code      = V4L2_MBUS_FMT_YUYV8_2X8,
                .bpp            = 2,
        },
-       {
-               .desc           = "RGB 565",
-               .pixelformat    = V4L2_PIX_FMT_RGB565,
-               .mbus_code      = V4L2_MBUS_FMT_RGB565_2X8_LE,
-               .bpp            = 2,
-       },
        /* RGB444 and Bayer should be doable, but have never been
-          tested with this driver. */
+          tested with this driver. RGB565 seems to work at the default
+          resolution, but results in color corruption when being scaled by
+          viacam_set_scaled(), and is disabled as a result. */
 };
 #define N_VIA_FMTS ARRAY_SIZE(via_formats)
 
index 5865029db0f67999404c6789b087de4f46612045..28aba00dc6295c5742551813fbf792033412c6ca 100644 (file)
@@ -1,6 +1,7 @@
 config DVB_AS102
        tristate "Abilis AS102 DVB receiver"
        depends on DVB_CORE && USB && I2C && INPUT
+       select FW_LOADER
        help
          Choose Y or M here if you have a device containing an AS102
 
index e7dbb6f814d53c62a24d21bcc83f7ad221d1c6e1..1bca43e847c7c0c301e6d711ea128e96e7db58c5 100644 (file)
@@ -3,4 +3,4 @@ dvb-as102-objs := as102_drv.o as102_fw.o as10x_cmd.o as10x_cmd_stream.o \
 
 obj-$(CONFIG_DVB_AS102) += dvb-as102.o
 
-EXTRA_CFLAGS += -DCONFIG_AS102_USB -Idrivers/media/dvb/dvb-core
+EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
index d335c7d6fa0f849ac22dbdbe526948dafb5e872b..b8adfd291b293ffd8850e950f41a015ca2941657 100644 (file)
@@ -24,7 +24,7 @@
 #include <linux/module.h>
 #include <linux/mm.h>
 #include <linux/kref.h>
-#include <asm/uaccess.h>
+#include <linux/uaccess.h>
 #include <linux/usb.h>
 
 /* header file for Usb device driver*/
@@ -56,13 +56,11 @@ int elna_enable = 1;
 module_param_named(elna_enable, elna_enable, int, 0644);
 MODULE_PARM_DESC(elna_enable, "Activate eLNA (default: on)");
 
-#ifdef DVB_DEFINE_MOD_OPT_ADAPTER_NR
 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
-#endif
 
 static void as102_stop_stream(struct as102_dev_t *dev)
 {
-       struct as102_bus_adapter_t *bus_adap;
+       struct as10x_bus_adapter_t *bus_adap;
 
        if (dev != NULL)
                bus_adap = &dev->bus_adap;
@@ -85,7 +83,7 @@ static void as102_stop_stream(struct as102_dev_t *dev)
 
 static int as102_start_stream(struct as102_dev_t *dev)
 {
-       struct as102_bus_adapter_t *bus_adap;
+       struct as10x_bus_adapter_t *bus_adap;
        int ret = -EFAULT;
 
        if (dev != NULL)
@@ -111,7 +109,7 @@ static int as102_start_stream(struct as102_dev_t *dev)
 static int as10x_pid_filter(struct as102_dev_t *dev,
                            int index, u16 pid, int onoff) {
 
-       struct as102_bus_adapter_t *bus_adap = &dev->bus_adap;
+       struct as10x_bus_adapter_t *bus_adap = &dev->bus_adap;
        int ret = -EFAULT;
 
        ENTER();
@@ -123,22 +121,22 @@ static int as10x_pid_filter(struct as102_dev_t *dev,
 
        switch (onoff) {
        case 0:
-           ret = as10x_cmd_del_PID_filter(bus_adap, (uint16_t) pid);
-           dprintk(debug, "DEL_PID_FILTER([%02d] 0x%04x) ret = %d\n",
-                   index, pid, ret);
-           break;
+               ret = as10x_cmd_del_PID_filter(bus_adap, (uint16_t) pid);
+               dprintk(debug, "DEL_PID_FILTER([%02d] 0x%04x) ret = %d\n",
+                       index, pid, ret);
+               break;
        case 1:
        {
-           struct as10x_ts_filter filter;
+               struct as10x_ts_filter filter;
 
-           filter.type = TS_PID_TYPE_TS;
-           filter.idx = 0xFF;
-           filter.pid = pid;
+               filter.type = TS_PID_TYPE_TS;
+               filter.idx = 0xFF;
+               filter.pid = pid;
 
-           ret = as10x_cmd_add_PID_filter(bus_adap, &filter);
-           dprintk(debug, "ADD_PID_FILTER([%02d -> %02d], 0x%04x) ret = %d\n",
-                   index, filter.idx, filter.pid, ret);
-           break;
+               ret = as10x_cmd_add_PID_filter(bus_adap, &filter);
+               dprintk(debug, "ADD_PID_FILTER([%02d -> %02d], 0x%04x) ret = %d\n",
+                       index, filter.idx, filter.pid, ret);
+               break;
        }
        }
 
@@ -159,10 +157,9 @@ static int as102_dvb_dmx_start_feed(struct dvb_demux_feed *dvbdmxfeed)
        if (mutex_lock_interruptible(&as102_dev->sem))
                return -ERESTARTSYS;
 
-       if (pid_filtering) {
-               as10x_pid_filter(as102_dev,
-                               dvbdmxfeed->index, dvbdmxfeed->pid, 1);
-       }
+       if (pid_filtering)
+               as10x_pid_filter(as102_dev, dvbdmxfeed->index,
+                                dvbdmxfeed->pid, 1);
 
        if (as102_dev->streaming++ == 0)
                ret = as102_start_stream(as102_dev);
@@ -185,10 +182,9 @@ static int as102_dvb_dmx_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
        if (--as102_dev->streaming == 0)
                as102_stop_stream(as102_dev);
 
-       if (pid_filtering) {
-               as10x_pid_filter(as102_dev,
-                               dvbdmxfeed->index, dvbdmxfeed->pid, 0);
-       }
+       if (pid_filtering)
+               as10x_pid_filter(as102_dev, dvbdmxfeed->index,
+                                dvbdmxfeed->pid, 0);
 
        mutex_unlock(&as102_dev->sem);
        LEAVE();
@@ -197,27 +193,16 @@ static int as102_dvb_dmx_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
 
 int as102_dvb_register(struct as102_dev_t *as102_dev)
 {
-       int ret = 0;
-       ENTER();
+       struct device *dev = &as102_dev->bus_adap.usb_dev->dev;
+       int ret;
 
        ret = dvb_register_adapter(&as102_dev->dvb_adap,
-                                  as102_dev->name,
-                                  THIS_MODULE,
-#if defined(CONFIG_AS102_USB)
-                                  &as102_dev->bus_adap.usb_dev->dev
-#elif defined(CONFIG_AS102_SPI)
-                                  &as102_dev->bus_adap.spi_dev->dev
-#else
-#error >>> dvb_register_adapter <<<
-#endif
-#ifdef DVB_DEFINE_MOD_OPT_ADAPTER_NR
-                                  , adapter_nr
-#endif
-                                  );
+                          as102_dev->name, THIS_MODULE,
+                          dev, adapter_nr);
        if (ret < 0) {
-               err("%s: dvb_register_adapter() failed (errno = %d)",
-                   __func__, ret);
-               goto failed;
+               dev_err(dev, "%s: dvb_register_adapter() failed: %d\n",
+                       __func__, ret);
+               return ret;
        }
 
        as102_dev->dvb_dmx.priv = as102_dev;
@@ -235,22 +220,22 @@ int as102_dvb_register(struct as102_dev_t *as102_dev)
 
        ret = dvb_dmx_init(&as102_dev->dvb_dmx);
        if (ret < 0) {
-               err("%s: dvb_dmx_init() failed (errno = %d)", __func__, ret);
-               goto failed;
+               dev_err("%s: dvb_dmx_init() failed: %d\n", __func__, ret);
+               goto edmxinit;
        }
 
        ret = dvb_dmxdev_init(&as102_dev->dvb_dmxdev, &as102_dev->dvb_adap);
        if (ret < 0) {
-               err("%s: dvb_dmxdev_init() failed (errno = %d)", __func__,
-                   ret);
-               goto failed;
+               dev_err(dev, "%s: dvb_dmxdev_init() failed: %d\n",
+                       __func__, ret);
+               goto edmxdinit;
        }
 
        ret = as102_dvb_register_fe(as102_dev, &as102_dev->dvb_fe);
        if (ret < 0) {
-               err("%s: as102_dvb_register_frontend() failed (errno = %d)",
+               dev_err(dev, "%s: as102_dvb_register_frontend() failed: %d",
                    __func__, ret);
-               goto failed;
+               goto efereg;
        }
 
        /* init bus mutex for token locking */
@@ -259,7 +244,6 @@ int as102_dvb_register(struct as102_dev_t *as102_dev)
        /* init start / stop stream mutex */
        mutex_init(&as102_dev->sem);
 
-#if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)
        /*
         * try to load as102 firmware. If firmware upload failed, we'll be
         * able to upload it later.
@@ -267,18 +251,21 @@ int as102_dvb_register(struct as102_dev_t *as102_dev)
        if (fw_upload)
                try_then_request_module(as102_fw_upload(&as102_dev->bus_adap),
                                "firmware_class");
-#endif
 
-failed:
-       LEAVE();
-       /* FIXME: free dvb_XXX */
+       pr_info("Registered device %s", as102_dev->name);
+       return 0;
+
+efereg:
+       dvb_dmxdev_release(&as102_dev->dvb_dmxdev);
+edmxdinit:
+       dvb_dmx_release(&as102_dev->dvb_dmx);
+edmxinit:
+       dvb_unregister_adapter(&as102_dev->dvb_adap);
        return ret;
 }
 
 void as102_dvb_unregister(struct as102_dev_t *as102_dev)
 {
-       ENTER();
-
        /* unregister as102 frontend */
        as102_dvb_unregister_fe(&as102_dev->dvb_fe);
 
@@ -289,28 +276,18 @@ void as102_dvb_unregister(struct as102_dev_t *as102_dev)
        /* unregister dvb adapter */
        dvb_unregister_adapter(&as102_dev->dvb_adap);
 
-       LEAVE();
+       pr_info("Unregistered device %s", as102_dev->name);
 }
 
 static int __init as102_driver_init(void)
 {
-       int ret = 0;
-
-       ENTER();
+       int ret;
 
        /* register this driver with the low level subsystem */
-#if defined(CONFIG_AS102_USB)
        ret = usb_register(&as102_usb_driver);
        if (ret)
                err("usb_register failed (ret = %d)", ret);
-#endif
-#if defined(CONFIG_AS102_SPI)
-       ret = spi_register_driver(&as102_spi_driver);
-       if (ret)
-               printk(KERN_ERR "spi_register failed (ret = %d)", ret);
-#endif
 
-       LEAVE();
        return ret;
 }
 
@@ -327,15 +304,8 @@ module_init(as102_driver_init);
  */
 static void __exit as102_driver_exit(void)
 {
-       ENTER();
        /* deregister this driver with the low level bus subsystem */
-#if defined(CONFIG_AS102_USB)
        usb_deregister(&as102_usb_driver);
-#endif
-#if defined(CONFIG_AS102_SPI)
-       spi_unregister_driver(&as102_spi_driver);
-#endif
-       LEAVE();
 }
 
 /*
@@ -347,5 +317,3 @@ module_exit(as102_driver_exit);
 MODULE_DESCRIPTION(DRIVER_FULL_NAME);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Pierrick Hascoet <pierrick.hascoet@abilis.com>");
-
-/* EOF - vim: set textwidth=80 ts=8 sw=8 sts=8 noet: */
index bcda635b5a9967454f95c843ccf4ae4c42a22d15..0ecef9e1a6961ad31acc90f39eda8957aefb9a81 100644 (file)
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#if defined(CONFIG_AS102_USB)
 #include <linux/usb.h>
-extern struct usb_driver as102_usb_driver;
-#endif
-
-#if defined(CONFIG_AS102_SPI)
-#include <linux/platform_device.h>
-#include <linux/spi/spi.h>
-#include <linux/cdev.h>
-
-extern struct spi_driver as102_spi_driver;
-#endif
-
-#include "dvb_demux.h"
-#include "dvb_frontend.h"
-#include "dmxdev.h"
+#include <dvb_demux.h>
+#include <dvb_frontend.h>
+#include <dmxdev.h>
+#include "as10x_cmd.h"
+#include "as102_usb_drv.h"
 
 #define DRIVER_FULL_NAME "Abilis Systems as10x usb driver"
 #define DRIVER_NAME "as10x_usb"
 
 extern int debug;
+extern struct usb_driver as102_usb_driver;
+extern int elna_enable;
 
 #define dprintk(debug, args...) \
        do { if (debug) {       \
-               printk(KERN_DEBUG "%s: ",__FUNCTION__); \
+               pr_debug("%s: ", __func__);     \
                printk(args);   \
        } } while (0)
 
 #ifdef TRACE
-#define ENTER()                 printk(">> enter %s\n", __FUNCTION__)
-#define LEAVE()                 printk("<< leave %s\n", __FUNCTION__)
+#define ENTER()        pr_debug(">> enter %s\n", __func__)
+#define LEAVE()        pr_debug("<< leave %s\n", __func__)
 #else
 #define ENTER()
 #define LEAVE()
@@ -58,39 +50,14 @@ extern int debug;
 #define AS102_USB_BUF_SIZE     512
 #define MAX_STREAM_URB         32
 
-#include "as10x_cmd.h"
-
-#if defined(CONFIG_AS102_USB)
-#include "as102_usb_drv.h"
-#endif
-
-#if defined(CONFIG_AS102_SPI)
-#include "as10x_spi_drv.h"
-#endif
-
-
-struct as102_bus_adapter_t {
-#if defined(CONFIG_AS102_USB)
+struct as10x_bus_adapter_t {
        struct usb_device *usb_dev;
-#elif defined(CONFIG_AS102_SPI)
-       struct spi_device *spi_dev;
-       struct cdev cdev; /* spidev raw device */
-
-       struct timer_list timer;
-       struct completion xfer_done;
-#endif
        /* bus token lock */
        struct mutex lock;
        /* low level interface for bus adapter */
        union as10x_bus_token_t {
-#if defined(CONFIG_AS102_USB)
                /* usb token */
                struct as10x_usb_token_cmd_t usb;
-#endif
-#if defined(CONFIG_AS102_SPI)
-               /* spi token */
-               struct as10x_spi_token_cmd_t spi;
-#endif
        } token;
 
        /* token cmd xfer id */
@@ -105,7 +72,7 @@ struct as102_bus_adapter_t {
 
 struct as102_dev_t {
        const char *name;
-       struct as102_bus_adapter_t bus_adap;
+       struct as10x_bus_adapter_t bus_adap;
        struct list_head device_entry;
        struct kref kref;
        unsigned long minor;
@@ -137,5 +104,3 @@ void as102_dvb_unregister(struct as102_dev_t *dev);
 
 int as102_dvb_register_fe(struct as102_dev_t *dev, struct dvb_frontend *fe);
 int as102_dvb_unregister_fe(struct dvb_frontend *dev);
-
-/* EOF - vim: set textwidth=80 ts=8 sw=8 sts=8 noet: */
index 3550f905367e611d2d210619ad63733220588772..c2adfe5607c664bc1f84f2b887525642d25fe48a 100644 (file)
@@ -23,8 +23,6 @@
 #include "as10x_types.h"
 #include "as10x_cmd.h"
 
-extern int elna_enable;
-
 static void as10x_fe_copy_tps_parameters(struct dvb_frontend_parameters *dst,
                                         struct as10x_tps *src);
 
@@ -599,5 +597,3 @@ static void as102_fe_copy_tune_parameters(struct as10x_tune_args *tune_args,
                        as102_fe_get_code_rate(params->u.ofdm.code_rate_HP);
        }
 }
-
-/* EOF - vim: set textwidth=80 ts=8 sw=8 sts=8 noet: */
index c019df933cc988891dc1a28f80dc53ce9794e9a7..43ebc43e6b9a1e1841fcb3dc87e4811216359311 100644 (file)
@@ -26,7 +26,6 @@
 #include "as102_drv.h"
 #include "as102_fw.h"
 
-#if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)
 char as102_st_fw1[] = "as102_data1_st.hex";
 char as102_st_fw2[] = "as102_data2_st.hex";
 char as102_dt_fw1[] = "as102_data1_dt.hex";
@@ -59,7 +58,7 @@ static int parse_hex_line(unsigned char *fw_data, unsigned char *addr,
        unsigned char *src, dst;
 
        if (*fw_data++ != ':') {
-               printk(KERN_ERR "invalid firmware file\n");
+               pr_err("invalid firmware file\n");
                return -EFAULT;
        }
 
@@ -102,7 +101,7 @@ static int parse_hex_line(unsigned char *fw_data, unsigned char *addr,
        return (count * 2) + 2;
 }
 
-static int as102_firmware_upload(struct as102_bus_adapter_t *bus_adap,
+static int as102_firmware_upload(struct as10x_bus_adapter_t *bus_adap,
                                 unsigned char *cmd,
                                 const struct firmware *firmware) {
 
@@ -163,19 +162,14 @@ error:
        return (errno == 0) ? total_read_bytes : errno;
 }
 
-int as102_fw_upload(struct as102_bus_adapter_t *bus_adap)
+int as102_fw_upload(struct as10x_bus_adapter_t *bus_adap)
 {
        int errno = -EFAULT;
        const struct firmware *firmware;
        unsigned char *cmd_buf = NULL;
        char *fw1, *fw2;
-
-#if defined(CONFIG_AS102_USB)
        struct usb_device *dev = bus_adap->usb_dev;
-#endif
-#if defined(CONFIG_AS102_SPI)
-       struct spi_device *dev = bus_adap->spi_dev;
-#endif
+
        ENTER();
 
        /* select fw file to upload */
@@ -187,7 +181,6 @@ int as102_fw_upload(struct as102_bus_adapter_t *bus_adap)
                fw2 = as102_st_fw2;
        }
 
-#if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)
        /* allocate buffer to store firmware upload command and data */
        cmd_buf = kzalloc(MAX_FW_PKT_SIZE, GFP_KERNEL);
        if (cmd_buf == NULL) {
@@ -198,21 +191,21 @@ int as102_fw_upload(struct as102_bus_adapter_t *bus_adap)
        /* request kernel to locate firmware file: part1 */
        errno = request_firmware(&firmware, fw1, &dev->dev);
        if (errno < 0) {
-               printk(KERN_ERR "%s: unable to locate firmware file: %s\n",
-                                DRIVER_NAME, fw1);
+               pr_err("%s: unable to locate firmware file: %s\n",
+                      DRIVER_NAME, fw1);
                goto error;
        }
 
        /* initiate firmware upload */
        errno = as102_firmware_upload(bus_adap, cmd_buf, firmware);
        if (errno < 0) {
-               printk(KERN_ERR "%s: error during firmware upload part1\n",
-                                DRIVER_NAME);
+               pr_err("%s: error during firmware upload part1\n",
+                      DRIVER_NAME);
                goto error;
        }
 
-       printk(KERN_INFO "%s: fimrware: %s loaded with success\n",
-                        DRIVER_NAME, fw1);
+       pr_info("%s: firmware: %s loaded with success\n",
+               DRIVER_NAME, fw1);
        release_firmware(firmware);
 
        /* wait for boot to complete */
@@ -221,31 +214,28 @@ int as102_fw_upload(struct as102_bus_adapter_t *bus_adap)
        /* request kernel to locate firmware file: part2 */
        errno = request_firmware(&firmware, fw2, &dev->dev);
        if (errno < 0) {
-               printk(KERN_ERR "%s: unable to locate firmware file: %s\n",
-                                DRIVER_NAME, fw2);
+               pr_err("%s: unable to locate firmware file: %s\n",
+                      DRIVER_NAME, fw2);
                goto error;
        }
 
        /* initiate firmware upload */
        errno = as102_firmware_upload(bus_adap, cmd_buf, firmware);
        if (errno < 0) {
-               printk(KERN_ERR "%s: error during firmware upload part2\n",
-                                DRIVER_NAME);
+               pr_err("%s: error during firmware upload part2\n",
+                      DRIVER_NAME);
                goto error;
        }
 
-       printk(KERN_INFO "%s: fimrware: %s loaded with success\n",
-                       DRIVER_NAME, fw2);
+       pr_info("%s: firmware: %s loaded with success\n",
+               DRIVER_NAME, fw2);
 error:
        /* free data buffer */
        kfree(cmd_buf);
        /* release firmware if needed */
        if (firmware != NULL)
                release_firmware(firmware);
-#endif
+
        LEAVE();
        return errno;
 }
-#endif
-
-/* EOF - vim: set textwidth=80 ts=8 sw=8 sts=8 noet: */
index 27e5347e2e19472a4c52b118f651c47db726ffd4..bd21f0554392bba3f860ce4661740c954da3bbe3 100644 (file)
 
 extern int dual_tuner;
 
-#pragma pack(1)
 struct as10x_raw_fw_pkt {
        unsigned char address[4];
        unsigned char data[MAX_FW_PKT_SIZE - 6];
-};
+} __packed;
 
 struct as10x_fw_pkt_t {
        union {
@@ -32,11 +31,8 @@ struct as10x_fw_pkt_t {
                unsigned char length[2];
        } u;
        struct as10x_raw_fw_pkt raw;
-};
-#pragma pack()
+} __packed;
 
 #ifdef __KERNEL__
-int as102_fw_upload(struct as102_bus_adapter_t *bus_adap);
+int as102_fw_upload(struct as10x_bus_adapter_t *bus_adap);
 #endif
-
-/* EOF - vim: set textwidth=80 ts=8 sw=8 sts=8 noet: */
index 264be2dbd2a41c98fd2d1861ede5a57716328879..9faab5b50045b9c80cb76fd7356ff7884a25edbf 100644 (file)
@@ -47,7 +47,7 @@ static struct usb_device_id as102_usb_id_table[] = {
 
 /* Note that this table must always have the same number of entries as the
    as102_usb_id_table struct */
-static const char *as102_device_names[] = {
+static const char * const as102_device_names[] = {
        AS102_REFERENCE_DESIGN,
        AS102_PCTV_74E,
        AS102_ELGATO_EYETV_DTT_NAME,
@@ -56,16 +56,16 @@ static const char *as102_device_names[] = {
 };
 
 struct usb_driver as102_usb_driver = {
-       .name        DRIVER_FULL_NAME,
-       .probe       as102_usb_probe,
-       .disconnect  as102_usb_disconnect,
-       .id_table    as102_usb_id_table
+       .name           = DRIVER_FULL_NAME,
+       .probe          = as102_usb_probe,
+       .disconnect     = as102_usb_disconnect,
+       .id_table       = as102_usb_id_table
 };
 
 static const struct file_operations as102_dev_fops = {
-       .owner   = THIS_MODULE,
-       .open    = as102_open,
-       .release = as102_release,
+       .owner          = THIS_MODULE,
+       .open           = as102_open,
+       .release        = as102_release,
 };
 
 static struct usb_class_driver as102_usb_class_driver = {
@@ -74,7 +74,7 @@ static struct usb_class_driver as102_usb_class_driver = {
        .minor_base     = AS102_DEVICE_MAJOR,
 };
 
-static int as102_usb_xfer_cmd(struct as102_bus_adapter_t *bus_adap,
+static int as102_usb_xfer_cmd(struct as10x_bus_adapter_t *bus_adap,
                              unsigned char *send_buf, int send_buf_len,
                              unsigned char *recv_buf, int recv_buf_len)
 {
@@ -131,7 +131,7 @@ static int as102_usb_xfer_cmd(struct as102_bus_adapter_t *bus_adap,
        return ret;
 }
 
-static int as102_send_ep1(struct as102_bus_adapter_t *bus_adap,
+static int as102_send_ep1(struct as10x_bus_adapter_t *bus_adap,
                          unsigned char *send_buf,
                          int send_buf_len,
                          int swap32)
@@ -154,7 +154,7 @@ static int as102_send_ep1(struct as102_bus_adapter_t *bus_adap,
        return ret ? ret : actual_len;
 }
 
-static int as102_read_ep2(struct as102_bus_adapter_t *bus_adap,
+static int as102_read_ep2(struct as10x_bus_adapter_t *bus_adap,
                   unsigned char *recv_buf, int recv_buf_len)
 {
        int ret = 0, actual_len;
@@ -337,7 +337,7 @@ static void as102_usb_disconnect(struct usb_interface *intf)
        /* decrement usage counter */
        kref_put(&as102_dev->kref, as102_usb_release);
 
-       printk(KERN_INFO "%s: device has been disconnected\n", DRIVER_NAME);
+       pr_info("%s: device has been disconnected\n", DRIVER_NAME);
 
        LEAVE();
 }
@@ -360,7 +360,7 @@ static int as102_usb_probe(struct usb_interface *intf,
        /* This should never actually happen */
        if ((sizeof(as102_usb_id_table) / sizeof(struct usb_device_id)) !=
            (sizeof(as102_device_names) / sizeof(const char *))) {
-               printk(KERN_ERR "Device names table invalid size");
+               pr_err("Device names table invalid size");
                return -EINVAL;
        }
 
@@ -399,7 +399,7 @@ static int as102_usb_probe(struct usb_interface *intf,
                goto failed;
        }
 
-       printk(KERN_INFO "%s: device has been detected\n", DRIVER_NAME);
+       pr_info("%s: device has been detected\n", DRIVER_NAME);
 
        /* request buffer allocation for streaming */
        ret = as102_alloc_usb_stream_buffer(as102_dev);
@@ -432,8 +432,8 @@ static int as102_open(struct inode *inode, struct file *file)
        /* fetch device from usb interface */
        intf = usb_find_interface(&as102_usb_driver, minor);
        if (intf == NULL) {
-               printk(KERN_ERR "%s: can't find device for minor %d\n",
-                               __func__, minor);
+               pr_err("%s: can't find device for minor %d\n",
+                      __func__, minor);
                ret = -ENODEV;
                goto exit;
        }
@@ -474,5 +474,3 @@ static int as102_release(struct inode *inode, struct file *file)
 }
 
 MODULE_DEVICE_TABLE(usb, as102_usb_id_table);
-
-/* EOF - vim: set textwidth=80 ts=8 sw=8 sts=8 noet: */
index fb1fc41dcd7968f4ab9ec80998e7853a811d558f..35925b7c1b252101b7b857947617473bac749dd4 100644 (file)
@@ -56,4 +56,3 @@ struct as10x_usb_token_cmd_t {
        struct as10x_cmd_t r;
 };
 #endif
-/* EOF - vim: set textwidth=80 ts=8 sw=8 sts=8 noet: */
index 0dcba806578065637532657438aeedd0a858da4c..0387bb85cafe9bce67c52f0e62e0be973f6ec6c6 100644 (file)
 
 /**
  * as10x_cmd_turn_on - send turn on command to AS10x
- * @phandle:   pointer to AS10x handle
+ * @adap:   pointer to AS10x bus adapter
  *
  * Return 0 when no error, < 0 in case of error.
  */
-int as10x_cmd_turn_on(as10x_handle_t *phandle)
+int as10x_cmd_turn_on(struct as10x_bus_adapter_t *adap)
 {
        int error;
        struct as10x_cmd_t *pcmd, *prsp;
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.turn_on.req));
 
        /* fill command */
        pcmd->body.turn_on.req.proc_id = cpu_to_le16(CONTROL_PROC_TURNON);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(phandle, (uint8_t *) pcmd,
-                                              sizeof(pcmd->body.turn_on.req) +
-                                              HEADER_SIZE,
-                                              (uint8_t *) prsp,
-                                              sizeof(prsp->body.turn_on.rsp) +
-                                              HEADER_SIZE);
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd,
+                                           sizeof(pcmd->body.turn_on.req) +
+                                           HEADER_SIZE,
+                                           (uint8_t *) prsp,
+                                           sizeof(prsp->body.turn_on.rsp) +
+                                           HEADER_SIZE);
        } else {
                error = AS10X_CMD_ERROR;
        }
@@ -71,31 +71,31 @@ out:
 
 /**
  * as10x_cmd_turn_off - send turn off command to AS10x
- * @phandle:   pointer to AS10x handle
+ * @adap:   pointer to AS10x bus adapter
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_turn_off(as10x_handle_t *phandle)
+int as10x_cmd_turn_off(struct as10x_bus_adapter_t *adap)
 {
        int error;
        struct as10x_cmd_t *pcmd, *prsp;
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.turn_off.req));
 
        /* fill command */
        pcmd->body.turn_off.req.proc_id = cpu_to_le16(CONTROL_PROC_TURNOFF);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(
-                       phandle, (uint8_t *) pcmd,
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(
+                       adap, (uint8_t *) pcmd,
                        sizeof(pcmd->body.turn_off.req) + HEADER_SIZE,
                        (uint8_t *) prsp,
                        sizeof(prsp->body.turn_off.rsp) + HEADER_SIZE);
@@ -116,23 +116,24 @@ out:
 
 /**
  * as10x_cmd_set_tune - send set tune command to AS10x
- * @phandle: pointer to AS10x handle
+ * @adap:    pointer to AS10x bus adapter
  * @ptune:   tune parameters
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_set_tune(as10x_handle_t *phandle, struct as10x_tune_args *ptune)
+int as10x_cmd_set_tune(struct as10x_bus_adapter_t *adap,
+                      struct as10x_tune_args *ptune)
 {
        int error;
        struct as10x_cmd_t *preq, *prsp;
 
        ENTER();
 
-       preq = phandle->cmd;
-       prsp = phandle->rsp;
+       preq = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(preq, (++phandle->cmd_xid),
+       as10x_cmd_build(preq, (++adap->cmd_xid),
                        sizeof(preq->body.set_tune.req));
 
        /* fill command */
@@ -150,14 +151,14 @@ int as10x_cmd_set_tune(as10x_handle_t *phandle, struct as10x_tune_args *ptune)
                ptune->transmission_mode;
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(phandle,
-                                              (uint8_t *) preq,
-                                              sizeof(preq->body.set_tune.req)
-                                              + HEADER_SIZE,
-                                              (uint8_t *) prsp,
-                                              sizeof(prsp->body.set_tune.rsp)
-                                              + HEADER_SIZE);
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(adap,
+                                           (uint8_t *) preq,
+                                           sizeof(preq->body.set_tune.req)
+                                           + HEADER_SIZE,
+                                           (uint8_t *) prsp,
+                                           sizeof(prsp->body.set_tune.rsp)
+                                           + HEADER_SIZE);
        } else {
                error = AS10X_CMD_ERROR;
        }
@@ -175,12 +176,12 @@ out:
 
 /**
  * as10x_cmd_get_tune_status - send get tune status command to AS10x
- * @phandle: pointer to AS10x handle
+ * @adap: pointer to AS10x bus adapter
  * @pstatus: pointer to updated status structure of the current tune
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_get_tune_status(as10x_handle_t *phandle,
+int as10x_cmd_get_tune_status(struct as10x_bus_adapter_t *adap,
                              struct as10x_tune_status *pstatus)
 {
        int error;
@@ -188,11 +189,11 @@ int as10x_cmd_get_tune_status(as10x_handle_t *phandle,
 
        ENTER();
 
-       preq = phandle->cmd;
-       prsp = phandle->rsp;
+       preq = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(preq, (++phandle->cmd_xid),
+       as10x_cmd_build(preq, (++adap->cmd_xid),
                        sizeof(preq->body.get_tune_status.req));
 
        /* fill command */
@@ -200,9 +201,9 @@ int as10x_cmd_get_tune_status(as10x_handle_t *phandle,
                cpu_to_le16(CONTROL_PROC_GETTUNESTAT);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(
-                       phandle,
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(
+                       adap,
                        (uint8_t *) preq,
                        sizeof(preq->body.get_tune_status.req) + HEADER_SIZE,
                        (uint8_t *) prsp,
@@ -232,24 +233,24 @@ out:
 }
 
 /**
- * send get TPS command to AS10x
- * @phandle:   pointer to AS10x handle
+ * as10x_cmd_get_tps - send get TPS command to AS10x
+ * @adap:      pointer to AS10x handle
  * @ptps:      pointer to TPS parameters structure
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_get_tps(as10x_handle_t *phandle, struct as10x_tps *ptps)
+int as10x_cmd_get_tps(struct as10x_bus_adapter_t *adap, struct as10x_tps *ptps)
 {
        int error;
        struct as10x_cmd_t *pcmd, *prsp;
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.get_tps.req));
 
        /* fill command */
@@ -257,14 +258,14 @@ int as10x_cmd_get_tps(as10x_handle_t *phandle, struct as10x_tps *ptps)
                cpu_to_le16(CONTROL_PROC_GETTPS);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(phandle,
-                                              (uint8_t *) pcmd,
-                                              sizeof(pcmd->body.get_tps.req) +
-                                              HEADER_SIZE,
-                                              (uint8_t *) prsp,
-                                              sizeof(prsp->body.get_tps.rsp) +
-                                              HEADER_SIZE);
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(adap,
+                                           (uint8_t *) pcmd,
+                                           sizeof(pcmd->body.get_tps.req) +
+                                           HEADER_SIZE,
+                                           (uint8_t *) prsp,
+                                           sizeof(prsp->body.get_tps.rsp) +
+                                           HEADER_SIZE);
        } else {
                error = AS10X_CMD_ERROR;
        }
@@ -296,12 +297,12 @@ out:
 
 /**
  * as10x_cmd_get_demod_stats - send get demod stats command to AS10x
- * @phandle:       pointer to AS10x handle
+ * @adap:          pointer to AS10x bus adapter
  * @pdemod_stats:  pointer to demod stats parameters structure
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_get_demod_stats(as10x_handle_t  *phandle,
+int as10x_cmd_get_demod_stats(struct as10x_bus_adapter_t *adap,
                              struct as10x_demod_stats *pdemod_stats)
 {
        int error;
@@ -309,11 +310,11 @@ int as10x_cmd_get_demod_stats(as10x_handle_t  *phandle,
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.get_demod_stats.req));
 
        /* fill command */
@@ -321,8 +322,8 @@ int as10x_cmd_get_demod_stats(as10x_handle_t  *phandle,
                cpu_to_le16(CONTROL_PROC_GET_DEMOD_STATS);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(phandle,
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(adap,
                                (uint8_t *) pcmd,
                                sizeof(pcmd->body.get_demod_stats.req)
                                + HEADER_SIZE,
@@ -360,13 +361,13 @@ out:
 
 /**
  * as10x_cmd_get_impulse_resp - send get impulse response command to AS10x
- * @phandle:  pointer to AS10x handle
+ * @adap:     pointer to AS10x bus adapter
  * @is_ready: pointer to value indicating when impulse
  *           response data is ready
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_get_impulse_resp(as10x_handle_t     *phandle,
+int as10x_cmd_get_impulse_resp(struct as10x_bus_adapter_t *adap,
                               uint8_t *is_ready)
 {
        int error;
@@ -374,11 +375,11 @@ int as10x_cmd_get_impulse_resp(as10x_handle_t     *phandle,
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.get_impulse_rsp.req));
 
        /* fill command */
@@ -386,8 +387,8 @@ int as10x_cmd_get_impulse_resp(as10x_handle_t     *phandle,
                cpu_to_le16(CONTROL_PROC_GET_IMPULSE_RESP);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(phandle,
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(adap,
                                        (uint8_t *) pcmd,
                                        sizeof(pcmd->body.get_impulse_rsp.req)
                                        + HEADER_SIZE,
index 01a716380e0a702350770ceea2121bdc9211a4e7..4ea249e7adab947c27488f9c57427d04a504ab0b 100644 (file)
 /*********************************/
 /*       MACRO DEFINITIONS       */
 /*********************************/
-#define AS10X_CMD_ERROR -1
+#define AS10X_CMD_ERROR                -1
 
-#define SERVICE_PROG_ID        0x0002
-#define SERVICE_PROG_VERSION   0x0001
+#define SERVICE_PROG_ID                0x0002
+#define SERVICE_PROG_VERSION   0x0001
 
-#define HIER_NONE              0x00
-#define HIER_LOW_PRIORITY      0x01
+#define HIER_NONE              0x00
+#define HIER_LOW_PRIORITY      0x01
 
 #define HEADER_SIZE (sizeof(struct as10x_cmd_header_t))
 
 /* context request types */
-#define GET_CONTEXT_DATA        1
-#define SET_CONTEXT_DATA        2
+#define GET_CONTEXT_DATA       1
+#define SET_CONTEXT_DATA       2
 
 /* ODSP suspend modes */
-#define CFG_MODE_ODSP_RESUME  0
-#define CFG_MODE_ODSP_SUSPEND 1
+#define CFG_MODE_ODSP_RESUME   0
+#define CFG_MODE_ODSP_SUSPEND  1
 
 /* Dump memory size */
-#define DUMP_BLOCK_SIZE_MAX   0x20
+#define DUMP_BLOCK_SIZE_MAX    0x20
 
 /*********************************/
 /*     TYPE DEFINITION           */
 /*********************************/
-typedef enum {
-   CONTROL_PROC_TURNON               = 0x0001,
-   CONTROL_PROC_TURNON_RSP           = 0x0100,
-   CONTROL_PROC_SET_REGISTER         = 0x0002,
-   CONTROL_PROC_SET_REGISTER_RSP     = 0x0200,
-   CONTROL_PROC_GET_REGISTER         = 0x0003,
-   CONTROL_PROC_GET_REGISTER_RSP     = 0x0300,
-   CONTROL_PROC_SETTUNE              = 0x000A,
-   CONTROL_PROC_SETTUNE_RSP          = 0x0A00,
-   CONTROL_PROC_GETTUNESTAT          = 0x000B,
-   CONTROL_PROC_GETTUNESTAT_RSP      = 0x0B00,
-   CONTROL_PROC_GETTPS               = 0x000D,
-   CONTROL_PROC_GETTPS_RSP           = 0x0D00,
-   CONTROL_PROC_SETFILTER            = 0x000E,
-   CONTROL_PROC_SETFILTER_RSP        = 0x0E00,
-   CONTROL_PROC_REMOVEFILTER         = 0x000F,
-   CONTROL_PROC_REMOVEFILTER_RSP     = 0x0F00,
-   CONTROL_PROC_GET_IMPULSE_RESP     = 0x0012,
-   CONTROL_PROC_GET_IMPULSE_RESP_RSP = 0x1200,
-   CONTROL_PROC_START_STREAMING      = 0x0013,
-   CONTROL_PROC_START_STREAMING_RSP  = 0x1300,
-   CONTROL_PROC_STOP_STREAMING       = 0x0014,
-   CONTROL_PROC_STOP_STREAMING_RSP   = 0x1400,
-   CONTROL_PROC_GET_DEMOD_STATS      = 0x0015,
-   CONTROL_PROC_GET_DEMOD_STATS_RSP  = 0x1500,
-   CONTROL_PROC_ELNA_CHANGE_MODE     = 0x0016,
-   CONTROL_PROC_ELNA_CHANGE_MODE_RSP = 0x1600,
-   CONTROL_PROC_ODSP_CHANGE_MODE     = 0x0017,
-   CONTROL_PROC_ODSP_CHANGE_MODE_RSP = 0x1700,
-   CONTROL_PROC_AGC_CHANGE_MODE      = 0x0018,
-   CONTROL_PROC_AGC_CHANGE_MODE_RSP  = 0x1800,
-
-   CONTROL_PROC_CONTEXT              = 0x00FC,
-   CONTROL_PROC_CONTEXT_RSP          = 0xFC00,
-   CONTROL_PROC_DUMP_MEMORY          = 0x00FD,
-   CONTROL_PROC_DUMP_MEMORY_RSP      = 0xFD00,
-   CONTROL_PROC_DUMPLOG_MEMORY       = 0x00FE,
-   CONTROL_PROC_DUMPLOG_MEMORY_RSP   = 0xFE00,
-   CONTROL_PROC_TURNOFF              = 0x00FF,
-   CONTROL_PROC_TURNOFF_RSP          = 0xFF00
-} control_proc;
-
-
-#pragma pack(1)
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t error;
-   } rsp;
-} TURN_ON;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t err;
-   } rsp;
-} TURN_OFF;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-      /* tune params */
-      struct as10x_tune_args args;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* response error */
-      uint8_t error;
-   } rsp;
-} SET_TUNE;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* response error */
-      uint8_t error;
-      /* tune status */
-      struct as10x_tune_status sts;
-   } rsp;
-} GET_TUNE_STATUS;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* response error */
-      uint8_t error;
-      /* tps details */
-      struct as10x_tps tps;
-   } rsp;
-} GET_TPS;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t  proc_id;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* response error */
-      uint8_t error;
-   } rsp;
-} COMMON;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t  proc_id;
-      /* PID to filter */
-      uint16_t  pid;
-      /* stream type (MPE, PSI/SI or PES )*/
-      uint8_t stream_type;
-      /* PID index in filter table */
-      uint8_t idx;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* response error */
-      uint8_t error;
-      /* Filter id */
-      uint8_t filter_id;
-   } rsp;
-} ADD_PID_FILTER;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t  proc_id;
-      /* PID to remove */
-      uint16_t  pid;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* response error */
-      uint8_t error;
-   } rsp;
-} DEL_PID_FILTER;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t error;
-   } rsp;
-} START_STREAMING;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t error;
-   } rsp;
-} STOP_STREAMING;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t error;
-      /* demod stats */
-      struct as10x_demod_stats stats;
-   } rsp;
-} GET_DEMOD_STATS;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t error;
-      /* impulse response ready */
-      uint8_t is_ready;
-   } rsp;
-} GET_IMPULSE_RESP;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-      /* value to write (for set context)*/
-      struct as10x_register_value reg_val;
-      /* context tag */
-      uint16_t tag;
-      /* context request type */
-      uint16_t type;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* value read (for get context) */
-      struct as10x_register_value reg_val;
-      /* context request type */
-      uint16_t type;
-      /* error */
-      uint8_t error;
-   } rsp;
-} FW_CONTEXT;
-
-typedef union {
-   /* request */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* register description */
-      struct as10x_register_addr reg_addr;
-      /* register content */
-      struct as10x_register_value reg_val;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t error;
-   } rsp;
-} SET_REGISTER;
-
-typedef union {
-   /* request */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* register description */
-      struct as10x_register_addr reg_addr;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t error;
-      /* register content */
-      struct as10x_register_value reg_val;
-   } rsp;
-} GET_REGISTER;
-
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-      /* mode */
-      uint8_t mode;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t error;
-   } rsp;
-} CFG_CHANGE_MODE;
+enum control_proc {
+       CONTROL_PROC_TURNON                     = 0x0001,
+       CONTROL_PROC_TURNON_RSP                 = 0x0100,
+       CONTROL_PROC_SET_REGISTER               = 0x0002,
+       CONTROL_PROC_SET_REGISTER_RSP           = 0x0200,
+       CONTROL_PROC_GET_REGISTER               = 0x0003,
+       CONTROL_PROC_GET_REGISTER_RSP           = 0x0300,
+       CONTROL_PROC_SETTUNE                    = 0x000A,
+       CONTROL_PROC_SETTUNE_RSP                = 0x0A00,
+       CONTROL_PROC_GETTUNESTAT                = 0x000B,
+       CONTROL_PROC_GETTUNESTAT_RSP            = 0x0B00,
+       CONTROL_PROC_GETTPS                     = 0x000D,
+       CONTROL_PROC_GETTPS_RSP                 = 0x0D00,
+       CONTROL_PROC_SETFILTER                  = 0x000E,
+       CONTROL_PROC_SETFILTER_RSP              = 0x0E00,
+       CONTROL_PROC_REMOVEFILTER               = 0x000F,
+       CONTROL_PROC_REMOVEFILTER_RSP           = 0x0F00,
+       CONTROL_PROC_GET_IMPULSE_RESP           = 0x0012,
+       CONTROL_PROC_GET_IMPULSE_RESP_RSP       = 0x1200,
+       CONTROL_PROC_START_STREAMING            = 0x0013,
+       CONTROL_PROC_START_STREAMING_RSP        = 0x1300,
+       CONTROL_PROC_STOP_STREAMING             = 0x0014,
+       CONTROL_PROC_STOP_STREAMING_RSP         = 0x1400,
+       CONTROL_PROC_GET_DEMOD_STATS            = 0x0015,
+       CONTROL_PROC_GET_DEMOD_STATS_RSP        = 0x1500,
+       CONTROL_PROC_ELNA_CHANGE_MODE           = 0x0016,
+       CONTROL_PROC_ELNA_CHANGE_MODE_RSP       = 0x1600,
+       CONTROL_PROC_ODSP_CHANGE_MODE           = 0x0017,
+       CONTROL_PROC_ODSP_CHANGE_MODE_RSP       = 0x1700,
+       CONTROL_PROC_AGC_CHANGE_MODE            = 0x0018,
+       CONTROL_PROC_AGC_CHANGE_MODE_RSP        = 0x1800,
+
+       CONTROL_PROC_CONTEXT                    = 0x00FC,
+       CONTROL_PROC_CONTEXT_RSP                = 0xFC00,
+       CONTROL_PROC_DUMP_MEMORY                = 0x00FD,
+       CONTROL_PROC_DUMP_MEMORY_RSP            = 0xFD00,
+       CONTROL_PROC_DUMPLOG_MEMORY             = 0x00FE,
+       CONTROL_PROC_DUMPLOG_MEMORY_RSP         = 0xFE00,
+       CONTROL_PROC_TURNOFF                    = 0x00FF,
+       CONTROL_PROC_TURNOFF_RSP                = 0xFF00
+};
+
+union as10x_turn_on {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t error;
+       } rsp;
+} __packed;
+
+union as10x_turn_off {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t err;
+       } rsp;
+} __packed;
+
+union as10x_set_tune {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+               /* tune params */
+               struct as10x_tune_args args;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* response error */
+               uint8_t error;
+       } rsp;
+} __packed;
+
+union as10x_get_tune_status {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* response error */
+               uint8_t error;
+               /* tune status */
+               struct as10x_tune_status sts;
+       } rsp;
+} __packed;
+
+union as10x_get_tps {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* response error */
+               uint8_t error;
+               /* tps details */
+               struct as10x_tps tps;
+       } rsp;
+} __packed;
+
+union as10x_common {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t  proc_id;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* response error */
+               uint8_t error;
+       } rsp;
+} __packed;
+
+union as10x_add_pid_filter {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t  proc_id;
+               /* PID to filter */
+               uint16_t  pid;
+               /* stream type (MPE, PSI/SI or PES )*/
+               uint8_t stream_type;
+               /* PID index in filter table */
+               uint8_t idx;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* response error */
+               uint8_t error;
+               /* Filter id */
+               uint8_t filter_id;
+       } rsp;
+} __packed;
+
+union as10x_del_pid_filter {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t  proc_id;
+               /* PID to remove */
+               uint16_t  pid;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* response error */
+               uint8_t error;
+       } rsp;
+} __packed;
+
+union as10x_start_streaming {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t error;
+       } rsp;
+} __packed;
+
+union as10x_stop_streaming {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t error;
+       } rsp;
+} __packed;
+
+union as10x_get_demod_stats {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t error;
+               /* demod stats */
+               struct as10x_demod_stats stats;
+       } rsp;
+} __packed;
+
+union as10x_get_impulse_resp {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t error;
+               /* impulse response ready */
+               uint8_t is_ready;
+       } rsp;
+} __packed;
+
+union as10x_fw_context {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+               /* value to write (for set context)*/
+               struct as10x_register_value reg_val;
+               /* context tag */
+               uint16_t tag;
+               /* context request type */
+               uint16_t type;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* value read (for get context) */
+               struct as10x_register_value reg_val;
+               /* context request type */
+               uint16_t type;
+               /* error */
+               uint8_t error;
+       } rsp;
+} __packed;
+
+union as10x_set_register {
+       /* request */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* register description */
+               struct as10x_register_addr reg_addr;
+               /* register content */
+               struct as10x_register_value reg_val;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t error;
+       } rsp;
+} __packed;
+
+union as10x_get_register {
+       /* request */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* register description */
+               struct as10x_register_addr reg_addr;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t error;
+               /* register content */
+               struct as10x_register_value reg_val;
+       } rsp;
+} __packed;
+
+union as10x_cfg_change_mode {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+               /* mode */
+               uint8_t mode;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t error;
+       } rsp;
+} __packed;
 
 struct as10x_cmd_header_t {
-   uint16_t req_id;
-   uint16_t prog;
-   uint16_t version;
-   uint16_t data_len;
-};
+       uint16_t req_id;
+       uint16_t prog;
+       uint16_t version;
+       uint16_t data_len;
+} __packed;
 
 #define DUMP_BLOCK_SIZE 16
-typedef union {
-   /* request */
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-      /* dump memory type request */
-      uint8_t dump_req;
-      /* register description */
-      struct as10x_register_addr reg_addr;
-      /* nb blocks to read */
-      uint16_t num_blocks;
-   } req;
-   /* response */
-   struct {
-      /* response identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t error;
-      /* dump response */
-      uint8_t dump_rsp;
-      /* data */
-      union {
-        uint8_t  data8[DUMP_BLOCK_SIZE];
-        uint16_t data16[DUMP_BLOCK_SIZE / sizeof(uint16_t)];
-        uint32_t data32[DUMP_BLOCK_SIZE / sizeof(uint32_t)];
-      } u;
-   } rsp;
-} DUMP_MEMORY;
-
-typedef union {
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-      /* dump memory type request */
-      uint8_t dump_req;
-   } req;
-   struct {
-      /* request identifier */
-      uint16_t proc_id;
-      /* error */
-      uint8_t error;
-      /* dump response */
-      uint8_t dump_rsp;
-      /* dump data */
-      uint8_t data[DUMP_BLOCK_SIZE];
-   } rsp;
-} DUMPLOG_MEMORY;
-
-typedef union {
-   /* request */
-   struct {
-      uint16_t proc_id;
-      uint8_t data[64 - sizeof(struct as10x_cmd_header_t) -2 /* proc_id */];
-   } req;
-   /* response */
-   struct {
-      uint16_t proc_id;
-      uint8_t error;
-      uint8_t data[64 - sizeof(struct as10x_cmd_header_t) /* header */
-                     - 2 /* proc_id */ - 1 /* rc */];
-   } rsp;
-} RAW_DATA;
+
+union as10x_dump_memory {
+       /* request */
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+               /* dump memory type request */
+               uint8_t dump_req;
+               /* register description */
+               struct as10x_register_addr reg_addr;
+               /* nb blocks to read */
+               uint16_t num_blocks;
+       } req;
+       /* response */
+       struct {
+               /* response identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t error;
+               /* dump response */
+               uint8_t dump_rsp;
+               /* data */
+               union {
+                       uint8_t  data8[DUMP_BLOCK_SIZE];
+                       uint16_t data16[DUMP_BLOCK_SIZE / sizeof(uint16_t)];
+                       uint32_t data32[DUMP_BLOCK_SIZE / sizeof(uint32_t)];
+               } u;
+       } rsp;
+} __packed;
+
+union as10x_dumplog_memory {
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+               /* dump memory type request */
+               uint8_t dump_req;
+       } req;
+       struct {
+               /* request identifier */
+               uint16_t proc_id;
+               /* error */
+               uint8_t error;
+               /* dump response */
+               uint8_t dump_rsp;
+               /* dump data */
+               uint8_t data[DUMP_BLOCK_SIZE];
+       } rsp;
+} __packed;
+
+union as10x_raw_data {
+       /* request */
+       struct {
+               uint16_t proc_id;
+               uint8_t data[64 - sizeof(struct as10x_cmd_header_t)
+                            - 2 /* proc_id */];
+       } req;
+       /* response */
+       struct {
+               uint16_t proc_id;
+               uint8_t error;
+               uint8_t data[64 - sizeof(struct as10x_cmd_header_t)
+                            - 2 /* proc_id */ - 1 /* rc */];
+       } rsp;
+} __packed;
 
 struct as10x_cmd_t {
-   /* header */
-   struct as10x_cmd_header_t header;
-   /* body */
-   union {
-      TURN_ON           turn_on;
-      TURN_OFF          turn_off;
-      SET_TUNE          set_tune;
-      GET_TUNE_STATUS   get_tune_status;
-      GET_TPS           get_tps;
-      COMMON            common;
-      ADD_PID_FILTER    add_pid_filter;
-      DEL_PID_FILTER    del_pid_filter;
-      START_STREAMING   start_streaming;
-      STOP_STREAMING    stop_streaming;
-      GET_DEMOD_STATS   get_demod_stats;
-      GET_IMPULSE_RESP  get_impulse_rsp;
-      FW_CONTEXT        context;
-      SET_REGISTER      set_register;
-      GET_REGISTER      get_register;
-      CFG_CHANGE_MODE   cfg_change_mode;
-      DUMP_MEMORY       dump_memory;
-      DUMPLOG_MEMORY    dumplog_memory;
-      RAW_DATA          raw_data;
-   } body;
-};
+       struct as10x_cmd_header_t header;
+       union {
+               union as10x_turn_on             turn_on;
+               union as10x_turn_off            turn_off;
+               union as10x_set_tune            set_tune;
+               union as10x_get_tune_status     get_tune_status;
+               union as10x_get_tps             get_tps;
+               union as10x_common              common;
+               union as10x_add_pid_filter      add_pid_filter;
+               union as10x_del_pid_filter      del_pid_filter;
+               union as10x_start_streaming     start_streaming;
+               union as10x_stop_streaming      stop_streaming;
+               union as10x_get_demod_stats     get_demod_stats;
+               union as10x_get_impulse_resp    get_impulse_rsp;
+               union as10x_fw_context          context;
+               union as10x_set_register        set_register;
+               union as10x_get_register        get_register;
+               union as10x_cfg_change_mode     cfg_change_mode;
+               union as10x_dump_memory         dump_memory;
+               union as10x_dumplog_memory      dumplog_memory;
+               union as10x_raw_data            raw_data;
+       } body;
+} __packed;
 
 struct as10x_token_cmd_t {
-   /* token cmd */
-   struct as10x_cmd_t c;
-   /* token response */
-   struct as10x_cmd_t r;
-};
-#pragma pack()
+       /* token cmd */
+       struct as10x_cmd_t c;
+       /* token response */
+       struct as10x_cmd_t r;
+} __packed;
 
 
 /**************************/
@@ -491,50 +488,42 @@ void as10x_cmd_build(struct as10x_cmd_t *pcmd, uint16_t proc_id,
                      uint16_t cmd_len);
 int as10x_rsp_parse(struct as10x_cmd_t *r, uint16_t proc_id);
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* as10x cmd */
-int as10x_cmd_turn_on(as10x_handle_t *phandle);
-int as10x_cmd_turn_off(as10x_handle_t *phandle);
+int as10x_cmd_turn_on(struct as10x_bus_adapter_t *adap);
+int as10x_cmd_turn_off(struct as10x_bus_adapter_t *adap);
 
-int as10x_cmd_set_tune(as10x_handle_t *phandle,
+int as10x_cmd_set_tune(struct as10x_bus_adapter_t *adap,
                       struct as10x_tune_args *ptune);
 
-int as10x_cmd_get_tune_status(as10x_handle_t *phandle,
+int as10x_cmd_get_tune_status(struct as10x_bus_adapter_t *adap,
                              struct as10x_tune_status *pstatus);
 
-int as10x_cmd_get_tps(as10x_handle_t *phandle,
+int as10x_cmd_get_tps(struct as10x_bus_adapter_t *adap,
                      struct as10x_tps *ptps);
 
-int as10x_cmd_get_demod_stats(as10x_handle_t  *phandle,
+int as10x_cmd_get_demod_stats(struct as10x_bus_adapter_t  *adap,
                              struct as10x_demod_stats *pdemod_stats);
 
-int as10x_cmd_get_impulse_resp(as10x_handle_t *phandle,
+int as10x_cmd_get_impulse_resp(struct as10x_bus_adapter_t *adap,
                               uint8_t *is_ready);
 
 /* as10x cmd stream */
-int as10x_cmd_add_PID_filter(as10x_handle_t *phandle,
+int as10x_cmd_add_PID_filter(struct as10x_bus_adapter_t *adap,
                             struct as10x_ts_filter *filter);
-int as10x_cmd_del_PID_filter(as10x_handle_t *phandle,
+int as10x_cmd_del_PID_filter(struct as10x_bus_adapter_t *adap,
                             uint16_t pid_value);
 
-int as10x_cmd_start_streaming(as10x_handle_t *phandle);
-int as10x_cmd_stop_streaming(as10x_handle_t *phandle);
+int as10x_cmd_start_streaming(struct as10x_bus_adapter_t *adap);
+int as10x_cmd_stop_streaming(struct as10x_bus_adapter_t *adap);
 
 /* as10x cmd cfg */
-int as10x_cmd_set_context(as10x_handle_t *phandle,
+int as10x_cmd_set_context(struct as10x_bus_adapter_t *adap,
                          uint16_t tag,
                          uint32_t value);
-int as10x_cmd_get_context(as10x_handle_t *phandle,
+int as10x_cmd_get_context(struct as10x_bus_adapter_t *adap,
                          uint16_t tag,
                          uint32_t *pvalue);
 
-int as10x_cmd_eLNA_change_mode(as10x_handle_t *phandle, uint8_t mode);
+int as10x_cmd_eLNA_change_mode(struct as10x_bus_adapter_t *adap, uint8_t mode);
 int as10x_context_rsp_parse(struct as10x_cmd_t *prsp, uint16_t proc_id);
-#ifdef __cplusplus
-}
-#endif
 #endif
-/* EOF - vim: set textwidth=80 ts=3 sw=3 sts=3 et: */
index ec6f69fcf399593e219f5f2770ea1281fdde2a64..d2a4bce896231f13985fcde28e8b1e8fcec26eca 100644 (file)
 
 /**
  * as10x_cmd_get_context - Send get context command to AS10x
- * @phandle:   pointer to AS10x handle
+ * @adap:      pointer to AS10x bus adapter
  * @tag:       context tag
  * @pvalue:    pointer where to store context value read
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_get_context(as10x_handle_t *phandle, uint16_t tag,
+int as10x_cmd_get_context(struct as10x_bus_adapter_t *adap, uint16_t tag,
                          uint32_t *pvalue)
 {
        int  error;
@@ -42,11 +42,11 @@ int as10x_cmd_get_context(as10x_handle_t *phandle, uint16_t tag,
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.context.req));
 
        /* fill command */
@@ -55,14 +55,14 @@ int as10x_cmd_get_context(as10x_handle_t *phandle, uint16_t tag,
        pcmd->body.context.req.type = cpu_to_le16(GET_CONTEXT_DATA);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error  = phandle->ops->xfer_cmd(phandle,
-                                               (uint8_t *) pcmd,
-                                               sizeof(pcmd->body.context.req)
-                                               + HEADER_SIZE,
-                                               (uint8_t *) prsp,
-                                               sizeof(prsp->body.context.rsp)
-                                               + HEADER_SIZE);
+       if (adap->ops->xfer_cmd) {
+               error  = adap->ops->xfer_cmd(adap,
+                                            (uint8_t *) pcmd,
+                                            sizeof(pcmd->body.context.req)
+                                            + HEADER_SIZE,
+                                            (uint8_t *) prsp,
+                                            sizeof(prsp->body.context.rsp)
+                                            + HEADER_SIZE);
        } else {
                error = AS10X_CMD_ERROR;
        }
@@ -87,13 +87,13 @@ out:
 
 /**
  * as10x_cmd_set_context - send set context command to AS10x
- * @phandle:   pointer to AS10x handle
+ * @adap:      pointer to AS10x bus adapter
  * @tag:       context tag
  * @value:     value to set in context
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_set_context(as10x_handle_t *phandle, uint16_t tag,
+int as10x_cmd_set_context(struct as10x_bus_adapter_t *adap, uint16_t tag,
                          uint32_t value)
 {
        int error;
@@ -101,11 +101,11 @@ int as10x_cmd_set_context(as10x_handle_t *phandle, uint16_t tag,
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.context.req));
 
        /* fill command */
@@ -116,14 +116,14 @@ int as10x_cmd_set_context(as10x_handle_t *phandle, uint16_t tag,
        pcmd->body.context.req.type = cpu_to_le16(SET_CONTEXT_DATA);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error  = phandle->ops->xfer_cmd(phandle,
-                                               (uint8_t *) pcmd,
-                                               sizeof(pcmd->body.context.req)
-                                               + HEADER_SIZE,
-                                               (uint8_t *) prsp,
-                                               sizeof(prsp->body.context.rsp)
-                                               + HEADER_SIZE);
+       if (adap->ops->xfer_cmd) {
+               error  = adap->ops->xfer_cmd(adap,
+                                            (uint8_t *) pcmd,
+                                            sizeof(pcmd->body.context.req)
+                                            + HEADER_SIZE,
+                                            (uint8_t *) prsp,
+                                            sizeof(prsp->body.context.rsp)
+                                            + HEADER_SIZE);
        } else {
                error = AS10X_CMD_ERROR;
        }
@@ -142,7 +142,7 @@ out:
 
 /**
  * as10x_cmd_eLNA_change_mode - send eLNA change mode command to AS10x
- * @phandle:   pointer to AS10x handle
+ * @adap:      pointer to AS10x bus adapter
  * @mode:      mode selected:
  *             - ON    : 0x0 => eLNA always ON
  *             - OFF   : 0x1 => eLNA always OFF
@@ -151,18 +151,18 @@ out:
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_eLNA_change_mode(as10x_handle_t *phandle, uint8_t mode)
+int as10x_cmd_eLNA_change_mode(struct as10x_bus_adapter_t *adap, uint8_t mode)
 {
        int error;
        struct as10x_cmd_t *pcmd, *prsp;
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.cfg_change_mode.req));
 
        /* fill command */
@@ -171,8 +171,8 @@ int as10x_cmd_eLNA_change_mode(as10x_handle_t *phandle, uint8_t mode)
        pcmd->body.cfg_change_mode.req.mode = mode;
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error  = phandle->ops->xfer_cmd(phandle, (uint8_t *) pcmd,
+       if (adap->ops->xfer_cmd) {
+               error  = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd,
                                sizeof(pcmd->body.cfg_change_mode.req)
                                + HEADER_SIZE, (uint8_t *) prsp,
                                sizeof(prsp->body.cfg_change_mode.rsp)
index 045c706831935f87b8c3a6ec3d6fdf338187bf50..6d000f60fb0e9650fe10d0aefc7cd986dfe38b73 100644 (file)
 
 /**
  * as10x_cmd_add_PID_filter - send add filter command to AS10x
- * @phandle:   pointer to AS10x handle
+ * @adap:      pointer to AS10x bus adapter
  * @filter:    TSFilter filter for DVB-T
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_add_PID_filter(as10x_handle_t *phandle,
+int as10x_cmd_add_PID_filter(struct as10x_bus_adapter_t *adap,
                             struct as10x_ts_filter *filter)
 {
        int error;
@@ -36,11 +36,11 @@ int as10x_cmd_add_PID_filter(as10x_handle_t *phandle,
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.add_pid_filter.req));
 
        /* fill command */
@@ -55,8 +55,8 @@ int as10x_cmd_add_PID_filter(as10x_handle_t *phandle,
                pcmd->body.add_pid_filter.req.idx = 0xFF;
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(phandle, (uint8_t *) pcmd,
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd,
                                sizeof(pcmd->body.add_pid_filter.req)
                                + HEADER_SIZE, (uint8_t *) prsp,
                                sizeof(prsp->body.add_pid_filter.rsp)
@@ -83,12 +83,12 @@ out:
 
 /**
  * as10x_cmd_del_PID_filter - Send delete filter command to AS10x
- * @phandle:      pointer to AS10x handle
+ * @adap:         pointer to AS10x bus adapte
  * @pid_value:    PID to delete
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_del_PID_filter(as10x_handle_t *phandle,
+int as10x_cmd_del_PID_filter(struct as10x_bus_adapter_t *adap,
                             uint16_t pid_value)
 {
        int error;
@@ -96,11 +96,11 @@ int as10x_cmd_del_PID_filter(as10x_handle_t *phandle,
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.del_pid_filter.req));
 
        /* fill command */
@@ -109,8 +109,8 @@ int as10x_cmd_del_PID_filter(as10x_handle_t *phandle,
        pcmd->body.del_pid_filter.req.pid = cpu_to_le16(pid_value);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(phandle, (uint8_t *) pcmd,
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd,
                                sizeof(pcmd->body.del_pid_filter.req)
                                + HEADER_SIZE, (uint8_t *) prsp,
                                sizeof(prsp->body.del_pid_filter.rsp)
@@ -132,22 +132,22 @@ out:
 
 /**
  * as10x_cmd_start_streaming - Send start streaming command to AS10x
- * @phandle:   pointer to AS10x handle
+ * @adap:   pointer to AS10x bus adapter
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_start_streaming(as10x_handle_t *phandle)
+int as10x_cmd_start_streaming(struct as10x_bus_adapter_t *adap)
 {
        int error;
        struct as10x_cmd_t *pcmd, *prsp;
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.start_streaming.req));
 
        /* fill command */
@@ -155,8 +155,8 @@ int as10x_cmd_start_streaming(as10x_handle_t *phandle)
                cpu_to_le16(CONTROL_PROC_START_STREAMING);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(phandle, (uint8_t *) pcmd,
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd,
                                sizeof(pcmd->body.start_streaming.req)
                                + HEADER_SIZE, (uint8_t *) prsp,
                                sizeof(prsp->body.start_streaming.rsp)
@@ -178,22 +178,22 @@ out:
 
 /**
  * as10x_cmd_stop_streaming - Send stop streaming command to AS10x
- * @phandle:   pointer to AS10x handle
+ * @adap:   pointer to AS10x bus adapter
  *
  * Return 0 on success or negative value in case of error.
  */
-int as10x_cmd_stop_streaming(as10x_handle_t *phandle)
+int as10x_cmd_stop_streaming(struct as10x_bus_adapter_t *adap)
 {
        int8_t error;
        struct as10x_cmd_t *pcmd, *prsp;
 
        ENTER();
 
-       pcmd = phandle->cmd;
-       prsp = phandle->rsp;
+       pcmd = adap->cmd;
+       prsp = adap->rsp;
 
        /* prepare command */
-       as10x_cmd_build(pcmd, (++phandle->cmd_xid),
+       as10x_cmd_build(pcmd, (++adap->cmd_xid),
                        sizeof(pcmd->body.stop_streaming.req));
 
        /* fill command */
@@ -201,8 +201,8 @@ int as10x_cmd_stop_streaming(as10x_handle_t *phandle)
                cpu_to_le16(CONTROL_PROC_STOP_STREAMING);
 
        /* send command */
-       if (phandle->ops->xfer_cmd) {
-               error = phandle->ops->xfer_cmd(phandle, (uint8_t *) pcmd,
+       if (adap->ops->xfer_cmd) {
+               error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd,
                                sizeof(pcmd->body.stop_streaming.req)
                                + HEADER_SIZE, (uint8_t *) prsp,
                                sizeof(prsp->body.stop_streaming.rsp)
index 4f01a76e98291cb26d72f91244f96c57a83f4df5..62b9795ee424de77a142f284ef3f26860afa043d 100644 (file)
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 #ifdef __KERNEL__
-struct as102_bus_adapter_t;
+struct as10x_bus_adapter_t;
 struct as102_dev_t;
 
-#define as10x_handle_t struct as102_bus_adapter_t
 #include "as10x_cmd.h"
 
 /* values for "mode" field */
-#define REGMODE8         8
-#define REGMODE16        16
-#define REGMODE32        32
+#define REGMODE8       8
+#define REGMODE16      16
+#define REGMODE32      32
 
 struct as102_priv_ops_t {
-       int (*upload_fw_pkt) (struct as102_bus_adapter_t *bus_adap,
+       int (*upload_fw_pkt) (struct as10x_bus_adapter_t *bus_adap,
                              unsigned char *buf, int buflen, int swap32);
 
-       int (*send_cmd) (struct as102_bus_adapter_t *bus_adap,
+       int (*send_cmd) (struct as10x_bus_adapter_t *bus_adap,
                         unsigned char *buf, int buflen);
 
-       int (*xfer_cmd) (struct as102_bus_adapter_t *bus_adap,
+       int (*xfer_cmd) (struct as10x_bus_adapter_t *bus_adap,
                         unsigned char *send_buf, int send_buf_len,
                         unsigned char *recv_buf, int recv_buf_len);
-/*
-       int (*pid_filter) (struct as102_bus_adapter_t *bus_adap,
-                          int index, u16 pid, int onoff);
-*/
+
        int (*start_stream) (struct as102_dev_t *dev);
        void (*stop_stream) (struct as102_dev_t *dev);
 
-       int (*reset_target) (struct as102_bus_adapter_t *bus_adap);
+       int (*reset_target) (struct as10x_bus_adapter_t *bus_adap);
 
-       int (*read_write)(struct as102_bus_adapter_t *bus_adap, uint8_t mode,
+       int (*read_write)(struct as10x_bus_adapter_t *bus_adap, uint8_t mode,
                          uint32_t rd_addr, uint16_t rd_len,
                          uint32_t wr_addr, uint16_t wr_len);
 
-       int (*as102_read_ep2) (struct as102_bus_adapter_t *bus_adap,
+       int (*as102_read_ep2) (struct as10x_bus_adapter_t *bus_adap,
                               unsigned char *recv_buf,
                               int recv_buf_len);
 };
index 3dedb3c1420a24308a5ae07b588d05b5ec8e9aaf..c40c8128cb76fc1deffbd7b3aba40c93e045be8e 100644 (file)
 /*********************************/
 
 /* bandwidth constant values */
-#define BW_5_MHZ           0x00
-#define BW_6_MHZ           0x01
-#define BW_7_MHZ           0x02
-#define BW_8_MHZ           0x03
+#define BW_5_MHZ               0x00
+#define BW_6_MHZ               0x01
+#define BW_7_MHZ               0x02
+#define BW_8_MHZ               0x03
 
 /* hierarchy priority selection values */
-#define HIER_NO_PRIORITY   0x00
-#define HIER_LOW_PRIORITY  0x01
-#define HIER_HIGH_PRIORITY 0x02
+#define HIER_NO_PRIORITY       0x00
+#define HIER_LOW_PRIORITY      0x01
+#define HIER_HIGH_PRIORITY     0x02
 
 /* constellation available values */
-#define CONST_QPSK         0x00
-#define CONST_QAM16        0x01
-#define CONST_QAM64        0x02
-#define CONST_UNKNOWN      0xFF
+#define CONST_QPSK             0x00
+#define CONST_QAM16            0x01
+#define CONST_QAM64            0x02
+#define CONST_UNKNOWN          0xFF
 
 /* hierarchy available values */
-#define HIER_NONE         0x00
-#define HIER_ALPHA_1      0x01
-#define HIER_ALPHA_2      0x02
-#define HIER_ALPHA_4      0x03
-#define HIER_UNKNOWN      0xFF
+#define HIER_NONE              0x00
+#define HIER_ALPHA_1           0x01
+#define HIER_ALPHA_2           0x02
+#define HIER_ALPHA_4           0x03
+#define HIER_UNKNOWN           0xFF
 
 /* interleaving available values */
-#define INTLV_NATIVE      0x00
-#define INTLV_IN_DEPTH    0x01
-#define INTLV_UNKNOWN     0xFF
+#define INTLV_NATIVE           0x00
+#define INTLV_IN_DEPTH         0x01
+#define INTLV_UNKNOWN          0xFF
 
 /* code rate available values */
-#define CODE_RATE_1_2     0x00
-#define CODE_RATE_2_3     0x01
-#define CODE_RATE_3_4     0x02
-#define CODE_RATE_5_6     0x03
-#define CODE_RATE_7_8     0x04
-#define CODE_RATE_UNKNOWN 0xFF
+#define CODE_RATE_1_2          0x00
+#define CODE_RATE_2_3          0x01
+#define CODE_RATE_3_4          0x02
+#define CODE_RATE_5_6          0x03
+#define CODE_RATE_7_8          0x04
+#define CODE_RATE_UNKNOWN      0xFF
 
 /* guard interval available values */
-#define GUARD_INT_1_32    0x00
-#define GUARD_INT_1_16    0x01
-#define GUARD_INT_1_8     0x02
-#define GUARD_INT_1_4     0x03
-#define GUARD_UNKNOWN     0xFF
+#define GUARD_INT_1_32         0x00
+#define GUARD_INT_1_16         0x01
+#define GUARD_INT_1_8          0x02
+#define GUARD_INT_1_4          0x03
+#define GUARD_UNKNOWN          0xFF
 
 /* transmission mode available values */
-#define TRANS_MODE_2K      0x00
-#define TRANS_MODE_8K      0x01
-#define TRANS_MODE_4K      0x02
-#define TRANS_MODE_UNKNOWN 0xFF
+#define TRANS_MODE_2K          0x00
+#define TRANS_MODE_8K          0x01
+#define TRANS_MODE_4K          0x02
+#define TRANS_MODE_UNKNOWN     0xFF
 
 /* DVBH signalling available values */
-#define TIMESLICING_PRESENT   0x01
-#define MPE_FEC_PRESENT       0x02
+#define TIMESLICING_PRESENT    0x01
+#define MPE_FEC_PRESENT                0x02
 
 /* tune state available */
-#define TUNE_STATUS_NOT_TUNED       0x00
-#define TUNE_STATUS_IDLE            0x01
-#define TUNE_STATUS_LOCKING         0x02
-#define TUNE_STATUS_SIGNAL_DVB_OK   0x03
-#define TUNE_STATUS_STREAM_DETECTED 0x04
-#define TUNE_STATUS_STREAM_TUNED    0x05
-#define TUNE_STATUS_ERROR           0xFF
+#define TUNE_STATUS_NOT_TUNED          0x00
+#define TUNE_STATUS_IDLE               0x01
+#define TUNE_STATUS_LOCKING            0x02
+#define TUNE_STATUS_SIGNAL_DVB_OK      0x03
+#define TUNE_STATUS_STREAM_DETECTED    0x04
+#define TUNE_STATUS_STREAM_TUNED       0x05
+#define TUNE_STATUS_ERROR              0xFF
 
 /* available TS FID filter types */
-#define TS_PID_TYPE_TS       0
-#define TS_PID_TYPE_PSI_SI   1
-#define TS_PID_TYPE_MPE      2
+#define TS_PID_TYPE_TS         0
+#define TS_PID_TYPE_PSI_SI     1
+#define TS_PID_TYPE_MPE                2
 
 /* number of echos available */
-#define MAX_ECHOS   15
+#define MAX_ECHOS      15
 
 /* Context types */
-#define CONTEXT_LNA                   1010
-#define CONTEXT_ELNA_HYSTERESIS       4003
-#define CONTEXT_ELNA_GAIN             4004
-#define CONTEXT_MER_THRESHOLD         5005
-#define CONTEXT_MER_OFFSET            5006
-#define CONTEXT_IR_STATE              7000
-#define CONTEXT_TSOUT_MSB_FIRST       7004
-#define CONTEXT_TSOUT_FALLING_EDGE    7005
+#define CONTEXT_LNA                    1010
+#define CONTEXT_ELNA_HYSTERESIS                4003
+#define CONTEXT_ELNA_GAIN              4004
+#define CONTEXT_MER_THRESHOLD          5005
+#define CONTEXT_MER_OFFSET             5006
+#define CONTEXT_IR_STATE               7000
+#define CONTEXT_TSOUT_MSB_FIRST                7004
+#define CONTEXT_TSOUT_FALLING_EDGE     7005
 
 /* Configuration modes */
-#define CFG_MODE_ON     0
-#define CFG_MODE_OFF    1
-#define CFG_MODE_AUTO   2
+#define CFG_MODE_ON    0
+#define CFG_MODE_OFF   1
+#define CFG_MODE_AUTO  2
 
-#pragma pack(1)
 struct as10x_tps {
-   uint8_t constellation;
-   uint8_t hierarchy;
-   uint8_t interleaving_mode;
-   uint8_t code_rate_HP;
-   uint8_t code_rate_LP;
-   uint8_t guard_interval;
-   uint8_t transmission_mode;
-   uint8_t DVBH_mask_HP;
-   uint8_t DVBH_mask_LP;
-   uint16_t cell_ID;
-};
+       uint8_t constellation;
+       uint8_t hierarchy;
+       uint8_t interleaving_mode;
+       uint8_t code_rate_HP;
+       uint8_t code_rate_LP;
+       uint8_t guard_interval;
+       uint8_t transmission_mode;
+       uint8_t DVBH_mask_HP;
+       uint8_t DVBH_mask_LP;
+       uint16_t cell_ID;
+} __packed;
 
 struct as10x_tune_args {
-   /* frequency */
-   uint32_t freq;
-   /* bandwidth */
-   uint8_t bandwidth;
-   /* hierarchy selection */
-   uint8_t hier_select;
-   /* constellation */
-   uint8_t constellation;
-   /* hierarchy */
-   uint8_t hierarchy;
-   /* interleaving mode */
-   uint8_t interleaving_mode;
-   /* code rate */
-   uint8_t code_rate;
-   /* guard interval */
-   uint8_t guard_interval;
-   /* transmission mode */
-   uint8_t transmission_mode;
-};
+       /* frequency */
+       uint32_t freq;
+       /* bandwidth */
+       uint8_t bandwidth;
+       /* hierarchy selection */
+       uint8_t hier_select;
+       /* constellation */
+       uint8_t constellation;
+       /* hierarchy */
+       uint8_t hierarchy;
+       /* interleaving mode */
+       uint8_t interleaving_mode;
+       /* code rate */
+       uint8_t code_rate;
+       /* guard interval */
+       uint8_t guard_interval;
+       /* transmission mode */
+       uint8_t transmission_mode;
+} __packed;
 
 struct as10x_tune_status {
-   /* tune status */
-   uint8_t tune_state;
-   /* signal strength */
-   int16_t signal_strength;
-   /* packet error rate 10^-4 */
-   uint16_t PER;
-   /* bit error rate 10^-4 */
-   uint16_t BER;
-};
+       /* tune status */
+       uint8_t tune_state;
+       /* signal strength */
+       int16_t signal_strength;
+       /* packet error rate 10^-4 */
+       uint16_t PER;
+       /* bit error rate 10^-4 */
+       uint16_t BER;
+} __packed;
 
 struct as10x_demod_stats {
-   /* frame counter */
-   uint32_t frame_count;
-   /* Bad frame counter */
-   uint32_t bad_frame_count;
-   /* Number of wrong bytes fixed by Reed-Solomon */
-   uint32_t bytes_fixed_by_rs;
-   /* Averaged MER */
-   uint16_t mer;
-   /* statistics calculation state indicator (started or not) */
-   uint8_t has_started;
-};
+       /* frame counter */
+       uint32_t frame_count;
+       /* Bad frame counter */
+       uint32_t bad_frame_count;
+       /* Number of wrong bytes fixed by Reed-Solomon */
+       uint32_t bytes_fixed_by_rs;
+       /* Averaged MER */
+       uint16_t mer;
+       /* statistics calculation state indicator (started or not) */
+       uint8_t has_started;
+} __packed;
 
 struct as10x_ts_filter {
-   uint16_t pid;  /** valid PID value 0x00 : 0x2000 */
-   uint8_t  type; /** Red TS_PID_TYPE_<N> values */
-   uint8_t  idx;  /** index in filtering table */
-};
+       uint16_t pid;  /* valid PID value 0x00 : 0x2000 */
+       uint8_t  type; /* Red TS_PID_TYPE_<N> values */
+       uint8_t  idx;  /* index in filtering table */
+} __packed;
 
 struct as10x_register_value {
-   uint8_t       mode;
-   union {
-      uint8_t    value8;    /* 8 bit value */
-      uint16_t   value16;   /* 16 bit value */
-      uint32_t   value32;   /* 32 bit value */
-   }u;
-};
-
-#pragma pack()
+       uint8_t mode;
+       union {
+               uint8_t  value8;   /* 8 bit value */
+               uint16_t value16;  /* 16 bit value */
+               uint32_t value32;  /* 32 bit value */
+       } u;
+} __packed;
 
 struct as10x_register_addr {
-   /* register addr */
-   uint32_t addr;
-   /* register mode access */
-   uint8_t mode;
+       /* register addr */
+       uint32_t addr;
+       /* register mode access */
+       uint8_t mode;
 };
 
-
 #endif
index 72816cf167041afaac21099f47005eca975d2019..337e38c3a0f02c85904cbd9e4fd51525c8d1f34d 100644 (file)
@@ -1,3 +1,3 @@
 solo6x10-y := core.o i2c.o p2m.o v4l2.o tw28.o gpio.o disp.o enc.o v4l2-enc.o g723.o
 
-obj-$(CONFIG_SOLO6X10) := solo6x10.o
+obj-$(CONFIG_SOLO6X10) += solo6x10.o
index bee7280bbed985c59b4e919f229e22834d4aced7..f8f0da952288d127963bdd3c19887864c141f494 100644 (file)
@@ -26,7 +26,7 @@
 #include <media/videobuf-dma-sg.h>
 #include "solo6x10.h"
 #include "tw28.h"
-#include "jpeg.h"
+#include "solo6x10-jpeg.h"
 
 #define MIN_VID_BUFFERS                4
 #define FRAME_BUF_SIZE         (128 * 1024)
index 1b1094c35e4fd979f6b49d35b9f6c725ee0eac9b..d9251df867b5886d54b19969fc8089008c3586e5 100644 (file)
@@ -329,6 +329,8 @@ typedef enum fe_rolloff {
        ROLLOFF_20,
        ROLLOFF_25,
        ROLLOFF_AUTO,
+       ROLLOFF_15,     /* DVB-C Annex A */
+       ROLLOFF_13,     /* DVB-C Annex C */
 } fe_rolloff_t;
 
 typedef enum fe_delivery_system {
index 26a3bd0fe57ca7a393afe27c1004970f5354a701..183d701eb3ce3de58842e986e88c0716b3195546 100644 (file)
 #define RC_TYPE_JVC    (1  << 3)       /* JVC protocol */
 #define RC_TYPE_SONY   (1  << 4)       /* Sony12/15/20 protocol */
 #define RC_TYPE_RC5_SZ (1  << 5)       /* RC5 variant used by Streamzap */
+#define RC_TYPE_SANYO   (1  << 6)      /* Sanyo protocol */
 #define RC_TYPE_MCE_KBD        (1  << 29)      /* RC6-ish MCE keyboard/mouse */
 #define RC_TYPE_LIRC   (1  << 30)      /* Pass raw IR to lirc userspace */
 #define RC_TYPE_OTHER  (1u << 31)
 
-#define RC_TYPE_ALL (RC_TYPE_RC5 | RC_TYPE_NEC  | RC_TYPE_RC6  | \
-                    RC_TYPE_JVC | RC_TYPE_SONY | RC_TYPE_LIRC | \
-                    RC_TYPE_RC5_SZ | RC_TYPE_MCE_KBD | RC_TYPE_OTHER)
+#define RC_TYPE_ALL (RC_TYPE_RC5    | RC_TYPE_NEC   | RC_TYPE_RC6     | \
+                    RC_TYPE_JVC    | RC_TYPE_SONY  | RC_TYPE_LIRC    | \
+                    RC_TYPE_RC5_SZ | RC_TYPE_SANYO | RC_TYPE_MCE_KBD | \
+                    RC_TYPE_OTHER)
 
 struct rc_map_table {
        u32     scancode;