V4L/DVB (10562): bttv: rework the way digital inputs are indicated
authorTrent Piepho <xyzzy@speakeasy.org>
Thu, 29 Jan 2009 00:32:59 +0000 (21:32 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:42:47 +0000 (12:42 -0300)
The code was using a muxsel value of -1U to indicate a digital input.  A
couple places in were checking of muxsel < 0 to detect this, which doesn't
work of course because muxsel is unsigned and can't be negative.

Only a couple cards had digital inputs and it was always the last one, so
for the card database create a one bit field that indicates the last input
is digital.  On init, this is used to set a new field in the bttv struct to
the digital input's number or UNSET for none.  This makes it easier to
check if the current input is digital.

Signed-off-by: Trent Piepho <xyzzy@speakeasy.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/bt8xx/bttv-cards.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/bt8xx/bttv-risc.c
drivers/media/video/bt8xx/bttv.h
drivers/media/video/bt8xx/bttvp.h

index f49e6e6..d545d48 100644 (file)
@@ -633,8 +633,9 @@ struct tvcard bttv_tvcards[] = {
                .video_inputs   = 3,
                /* .audio_inputs= 1, */
                .svhs           = NO_SVHS,
+               .has_dig_in     = 1,
                .gpiomask       = 7,
-               .muxsel         = { 2, 3, -1 },
+               .muxsel         = { 2, 3, 0 }, /* input 2 is digital */
                /* .digital_mode= DIGITAL_MODE_CAMERA, */
                .gpiomux        = { 0, 0, 0, 0 },
                .no_msp34xx     = 1,
@@ -1069,8 +1070,9 @@ struct tvcard bttv_tvcards[] = {
                .video_inputs   = 5,
                /* .audio_inputs= 1, */
                .svhs           = 3,
+               .has_dig_in     = 1,
                .gpiomask       = 0xAA0000,
-               .muxsel         = { 2, 3, 1, 1, -1 },
+               .muxsel         = { 2, 3, 1, 1, 0 }, /* input 4 is digital */
                /* .digital_mode= DIGITAL_MODE_CAMERA, */
                .gpiomux        = { 0x20000, 0, 0x80000, 0x80000 },
                .gpiomute       = 0xa8000,
@@ -2539,8 +2541,9 @@ struct tvcard bttv_tvcards[] = {
                .video_inputs   = 5,
                /* .audio_inputs= 1, */
                .svhs           = 3,
+               .has_dig_in     = 1,
                .gpiomask       = 0x01fe00,
-               .muxsel         = { 2, 3, 1, 1, -1 },
+               .muxsel         = { 2, 3, 1, 1, 0 }, /* in 4 is digital */
                /* .digital_mode= DIGITAL_MODE_CAMERA, */
                .gpiomux        = { 0x00400, 0x10400, 0x04400, 0x80000 },
                .gpiomute       = 0x12400,
@@ -3417,6 +3420,8 @@ void __devinit bttv_init_card2(struct bttv *btv)
                bttv_call_i2c_clients(btv, TUNER_SET_CONFIG, &tda9887_cfg);
        }
 
+       btv->dig = bttv_tvcards[btv->c.type].has_dig_in ?
+                  bttv_tvcards[btv->c.type].video_inputs - 1 : UNSET;
        btv->svhs = bttv_tvcards[btv->c.type].svhs == NO_SVHS ?
                    UNSET : bttv_tvcards[btv->c.type].svhs;
        if (svhs[btv->c.nr] != UNSET)
index 1bb6c2d..8d9756b 100644 (file)
@@ -1040,7 +1040,7 @@ static void bt848A_set_timing(struct bttv *btv)
        int table_idx = bttv_tvnorms[btv->tvnorm].sram;
        int fsc       = bttv_tvnorms[btv->tvnorm].Fsc;
 
-       if (UNSET == bttv_tvcards[btv->c.type].muxsel[btv->input]) {
+       if (btv->input == btv->dig) {
                dprintk("bttv%d: load digital timing table (table_idx=%d)\n",
                        btv->c.nr,table_idx);
 
index 5b1b8e4..d16af28 100644 (file)
@@ -341,7 +341,7 @@ bttv_calc_geo_old(struct bttv *btv, struct bttv_geometry *geo,
        int totalwidth   = tvnorm->totalwidth;
        int scaledtwidth = tvnorm->scaledtwidth;
 
-       if (bttv_tvcards[btv->c.type].muxsel[btv->input] < 0) {
+       if (btv->input == btv->dig) {
                swidth       = 720;
                totalwidth   = 858;
                scaledtwidth = 858;
@@ -391,7 +391,7 @@ bttv_calc_geo               (struct bttv *                  btv,
             && crop->width == tvnorm->cropcap.defrect.width
             && crop->height == tvnorm->cropcap.defrect.height
             && width <= tvnorm->swidth /* see PAL-Nc et al */)
-           || bttv_tvcards[btv->c.type].muxsel[btv->input] < 0) {
+           || btv->input == btv->dig) {
                bttv_calc_geo_old(btv, geo, width, height,
                                  both_fields, tvnorm);
                return;
index a2e140a..e377e28 100644 (file)
@@ -224,6 +224,10 @@ struct tvcard {
        u8 video_inputs;        /* Number of inputs */
        unsigned int svhs:4;    /* Which input is s-video */
 #define NO_SVHS        15
+       unsigned int pll:2;
+#define PLL_NONE 0
+#define PLL_28   1
+#define PLL_35   2
 
        /* i2c audio flags */
        unsigned int no_msp34xx:1;
@@ -236,11 +240,8 @@ struct tvcard {
        unsigned int has_dvb:1;
        unsigned int has_remote:1;
        unsigned int has_radio:1;
+       unsigned int has_dig_in:1; /* Has digital input (always last input) */
        unsigned int no_gpioirq:1;
-       unsigned int pll:2;
-#define PLL_NONE 0
-#define PLL_28   1
-#define PLL_35   2
 };
 
 extern struct tvcard bttv_tvcards[];
index 230e148..23ab1c9 100644 (file)
@@ -329,7 +329,7 @@ struct bttv {
        unsigned int cardid;   /* pci subsystem id (bt878 based ones) */
        unsigned int tuner_type;  /* tuner chip type */
        unsigned int tda9887_conf;
-       unsigned int svhs;
+       unsigned int svhs, dig;
        struct bttv_pll_info pll;
        int triton1;
        int gpioirq;