[media] bttv: stop abusing mbox_we for sw_status
authorOndrej Zary <linux@rainbow-software.org>
Tue, 14 May 2013 19:54:44 +0000 (16:54 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Fri, 26 Jul 2013 16:33:10 +0000 (13:33 -0300)
Kodicom 4400R and Geovision GV-800 code in bttv driver abuses mbox_we (int)
in struct bttv as char *.
Remove this hack and add a proper sw_status array to struct bttv instead.
This is a a preparation to remove mbox_we.

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/pci/bt8xx/bttv-cards.c
drivers/media/pci/bt8xx/bttvp.h

index e564aac0aa30fc67ee3eeb9cca5ea7f2dabdf6d5..d85cb0ace4dc654b541017a38fde5e0e004f3b1e 100644 (file)
@@ -4441,9 +4441,7 @@ static void tibetCS16_init(struct bttv *btv)
  * is {3, 0, 2, 1}, i.e. the first controller to be detected is logical
  * unit 3, the second (which is the master) is logical unit 0, etc.
  * We need to maintain the status of the analog switch (which of the 16
- * cameras is connected to which of the 4 controllers).  Rather than
- * add to the bttv structure for this, we use the data reserved for
- * the mbox (unused for this card type).
+ * cameras is connected to which of the 4 controllers) in sw_status array.
  */
 
 /*
@@ -4478,7 +4476,6 @@ static void kodicom4400r_write(struct bttv *btv,
  */
 static void kodicom4400r_muxsel(struct bttv *btv, unsigned int input)
 {
-       char *sw_status;
        int xaddr, yaddr;
        struct bttv *mctlr;
        static unsigned char map[4] = {3, 0, 2, 1};
@@ -4489,14 +4486,13 @@ static void kodicom4400r_muxsel(struct bttv *btv, unsigned int input)
        }
        yaddr = (btv->c.nr - mctlr->c.nr + 1) & 3; /* the '&' is for safety */
        yaddr = map[yaddr];
-       sw_status = (char *)(&mctlr->mbox_we);
        xaddr = input & 0xf;
        /* Check if the controller/camera pair has changed, else ignore */
-       if (sw_status[yaddr] != xaddr)
+       if (mctlr->sw_status[yaddr] != xaddr)
        {
                /* "open" the old switch, "close" the new one, save the new */
-               kodicom4400r_write(mctlr, sw_status[yaddr], yaddr, 0);
-               sw_status[yaddr] = xaddr;
+               kodicom4400r_write(mctlr, mctlr->sw_status[yaddr], yaddr, 0);
+               mctlr->sw_status[yaddr] = xaddr;
                kodicom4400r_write(mctlr, xaddr, yaddr, 1);
        }
 }
@@ -4509,7 +4505,6 @@ static void kodicom4400r_muxsel(struct bttv *btv, unsigned int input)
  */
 static void kodicom4400r_init(struct bttv *btv)
 {
-       char *sw_status = (char *)(&btv->mbox_we);
        int ix;
 
        gpio_inout(0x0003ff, 0x0003ff);
@@ -4517,7 +4512,7 @@ static void kodicom4400r_init(struct bttv *btv)
        gpio_write(0);
        /* Preset camera 0 to the 4 controllers */
        for (ix = 0; ix < 4; ix++) {
-               sw_status[ix] = ix;
+               btv->sw_status[ix] = ix;
                kodicom4400r_write(btv, ix, ix, 1);
        }
        /*
@@ -4794,7 +4789,6 @@ static void gv800s_write(struct bttv *btv,
 static void gv800s_muxsel(struct bttv *btv, unsigned int input)
 {
        struct bttv *mctlr;
-       char *sw_status;
        int xaddr, yaddr;
        static unsigned int map[4][4] = { { 0x0, 0x4, 0xa, 0x6 },
                                          { 0x1, 0x5, 0xb, 0x7 },
@@ -4807,14 +4801,13 @@ static void gv800s_muxsel(struct bttv *btv, unsigned int input)
                return;
        }
        yaddr = (btv->c.nr - mctlr->c.nr) & 3;
-       sw_status = (char *)(&mctlr->mbox_we);
        xaddr = map[yaddr][input] & 0xf;
 
        /* Check if the controller/camera pair has changed, ignore otherwise */
-       if (sw_status[yaddr] != xaddr) {
+       if (mctlr->sw_status[yaddr] != xaddr) {
                /* disable the old switch, enable the new one and save status */
-               gv800s_write(mctlr, sw_status[yaddr], yaddr, 0);
-               sw_status[yaddr] = xaddr;
+               gv800s_write(mctlr, mctlr->sw_status[yaddr], yaddr, 0);
+               mctlr->sw_status[yaddr] = xaddr;
                gv800s_write(mctlr, xaddr, yaddr, 1);
        }
 }
@@ -4822,7 +4815,6 @@ static void gv800s_muxsel(struct bttv *btv, unsigned int input)
 /* GeoVision GV-800(S) "master" chip init */
 static void gv800s_init(struct bttv *btv)
 {
-       char *sw_status = (char *)(&btv->mbox_we);
        int ix;
 
        gpio_inout(0xf107f, 0xf107f);
@@ -4831,7 +4823,7 @@ static void gv800s_init(struct bttv *btv)
 
        /* Preset camera 0 to the 4 controllers */
        for (ix = 0; ix < 4; ix++) {
-               sw_status[ix] = ix;
+               btv->sw_status[ix] = ix;
                gv800s_write(btv, ix, ix, 1);
        }
 
index 9c1cc2c50ee2abc9ef916dd3bf922ae5ab9505d5..6eefb595d0fa67509620627ed0b755ffa2747cfe 100644 (file)
@@ -459,6 +459,9 @@ struct bttv {
        int mbox_iow;
        int mbox_csel;
 
+       /* switch status for multi-controller cards */
+       char sw_status[4];
+
        /* risc memory management data
           - must acquire s_lock before changing these
           - only the irq handler is supported to touch top + bottom + vcurr */