upgrade to fedora-2.6.12-1.1398.FC4 + vserver 2.0.rc7
[linux-2.6.git] / drivers / media / dvb / ttpci / av7110_hw.c
index c6f0160..7fa4a0e 100644 (file)
@@ -104,7 +104,7 @@ u32 av7110_debiread(struct av7110 *av7110, u32 config, int addr, int count)
 
 
 /* av7110 ARM core boot stuff */
-
+#if 0
 void av7110_reset_arm(struct av7110 *av7110)
 {
        saa7146_setgpio(av7110->dev, RESET_LINE, SAA7146_GPIO_OUTLO);
@@ -124,7 +124,7 @@ void av7110_reset_arm(struct av7110 *av7110)
        av7110->arm_ready = 1;
        dprintk(1, "reset ARM\n");
 }
-
+#endif  /*  0  */
 
 static int waitdebi(struct av7110 *av7110, int adr, int state)
 {
@@ -153,8 +153,10 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len)
        base = DRAM_START_CODE;
 
        for (i = 0; i < blocks; i++) {
-               if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
+               if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
+                       printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at block %d\n", i);
                        return -1;
+               }
                dprintk(4, "writing DRAM block %d\n", i);
                mwdebi(av7110, DEBISWAB, bootblock,
                       ((char*)data) + i * BOOT_MAX_SIZE, BOOT_MAX_SIZE);
@@ -166,8 +168,10 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len)
        }
 
        if (rest > 0) {
-               if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
+               if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
+                       printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at last block\n");
                        return -1;
+               }
                if (rest > 4)
                        mwdebi(av7110, DEBISWAB, bootblock,
                               ((char*)data) + i * BOOT_MAX_SIZE, rest);
@@ -179,12 +183,16 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len)
                iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, rest, 2);
                iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
        }
-       if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
+       if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
+               printk(KERN_ERR "dvb-ttpci: load_dram(): timeout after last block\n");
                return -1;
+       }
        iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, 0, 2);
        iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
-       if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0)
+       if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0) {
+               printk(KERN_ERR "dvb-ttpci: load_dram(): final handshake timeout\n");
                return -1;
+       }
        return 0;
 }
 
@@ -261,8 +269,11 @@ int av7110_bootarm(struct av7110 *av7110)
        mdelay(1);
 
        dprintk(1, "load dram code\n");
-       if (load_dram(av7110, (u32 *)av7110->bin_root, av7110->size_root) < 0)
+       if (load_dram(av7110, (u32 *)av7110->bin_root, av7110->size_root) < 0) {
+               printk(KERN_ERR "dvb-ttpci: av7110_bootarm(): "
+                      "load_dram() failed\n");
                return -1;
+       }
 
        saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTLO);
        mdelay(1);
@@ -324,7 +335,7 @@ int av7110_wait_msgstate(struct av7110 *av7110, u16 flags)
        return 0;
 }
 
-int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
+static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
 {
        int i;
        unsigned long start;
@@ -336,7 +347,7 @@ int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
 
        if (!av7110->arm_ready) {
                dprintk(1, "arm not ready.\n");
-               return -1;
+               return -ENXIO;
        }
 
        start = jiffies;
@@ -344,7 +355,7 @@ int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
                msleep(1);
                if (time_after(jiffies, start + ARM_WAIT_FREE)) {
                        printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for COMMAND idle\n", __FUNCTION__);
-                       return -1;
+                       return -ETIMEDOUT;
                }
        }
 
@@ -356,7 +367,7 @@ int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
                msleep(1);
                if (time_after(jiffies, start + ARM_WAIT_SHAKE)) {
                        printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for HANDSHAKE_REG\n", __FUNCTION__);
-                       return -1;
+                       return -ETIMEDOUT;
                }
        }
 #endif
@@ -375,13 +386,20 @@ int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
                flags[0] = OSDQOver;
                flags[1] = OSDQFull;
                break;
+       case COMTYPE_MISC:
+               if (FW_VERSION(av7110->arm_app) >= 0x261d) {
+                       type = "MSG";
+                       flags[0] = GPMQOver;
+                       flags[1] = GPMQBusy;
+               }
+               break;
        default:
                break;
        }
 
        if (type != NULL) {
                /* non-immediate COMMAND type */
-       start = jiffies;
+               start = jiffies;
                for (;;) {
                        stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
                        if (stat & flags[0]) {
@@ -394,8 +412,8 @@ int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
                        if (time_after(jiffies, start + ARM_WAIT_FREE)) {
                                printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n",
                                        __FUNCTION__, type);
-                       return -1;
-               }
+                               return -1;
+                       }
                        msleep(1);
                }
        }
@@ -419,25 +437,25 @@ int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
                if (time_after(jiffies, start + ARM_WAIT_FREE)) {
                        printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for COMMAND to complete\n",
                               __FUNCTION__);
-                       return -1;
+                       return -ETIMEDOUT;
                }
        }
 
        stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
        if (stat & GPMQOver) {
                printk(KERN_ERR "dvb-ttpci: %s(): GPMQOver\n", __FUNCTION__);
-               return -1;
+               return -ENOSPC;
        }
        else if (stat & OSDQOver) {
                printk(KERN_ERR "dvb-ttpci: %s(): OSDQOver\n", __FUNCTION__);
-               return -1;
+               return -ENOSPC;
        }
 #endif
 
        return 0;
 }
 
-int av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
+static int av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
 {
        int ret;
 
@@ -453,7 +471,8 @@ int av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
        ret = __av7110_send_fw_cmd(av7110, buf, length);
        up(&av7110->dcomlock);
        if (ret)
-               printk("dvb-ttpci: %s(): av7110_send_fw_cmd error\n", __FUNCTION__);
+               printk(KERN_ERR "dvb-ttpci: %s(): av7110_send_fw_cmd error %d\n",
+                      __FUNCTION__, ret);
        return ret;
 }
 
@@ -477,10 +496,11 @@ int av7110_fw_cmd(struct av7110 *av7110, int type, int com, int num, ...)
 
        ret = av7110_send_fw_cmd(av7110, buf, num + 2);
        if (ret)
-               printk("dvb-ttpci: av7110_fw_cmd error\n");
+               printk(KERN_ERR "dvb-ttpci: av7110_fw_cmd error %d\n", ret);
        return ret;
 }
 
+#if 0
 int av7110_send_ci_cmd(struct av7110 *av7110, u8 subcom, u8 *buf, u8 len)
 {
        int i, ret;
@@ -499,9 +519,10 @@ int av7110_send_ci_cmd(struct av7110 *av7110, u8 subcom, u8 *buf, u8 len)
 
        ret = av7110_send_fw_cmd(av7110, cmd, 18);
        if (ret)
-               printk("dvb-ttpci: av7110_send_ci_cmd error\n");
+               printk(KERN_ERR "dvb-ttpci: av7110_send_ci_cmd error %d\n", ret);
        return ret;
 }
+#endif  /*  0  */
 
 int av7110_fw_request(struct av7110 *av7110, u16 *request_buf,
                      int request_buf_len, u16 *reply_buf, int reply_buf_len)
@@ -525,7 +546,7 @@ int av7110_fw_request(struct av7110 *av7110, u16 *request_buf,
 
        if ((err = __av7110_send_fw_cmd(av7110, request_buf, request_buf_len)) < 0) {
                up(&av7110->dcomlock);
-               printk("dvb-ttpci: av7110_fw_request error\n");
+               printk(KERN_ERR "dvb-ttpci: av7110_fw_request error %d\n", err);
                return err;
        }
 
@@ -574,12 +595,12 @@ int av7110_fw_request(struct av7110 *av7110, u16 *request_buf,
        return 0;
 }
 
-int av7110_fw_query(struct av7110 *av7110, u16 tag, u16* buf, s16 length)
+static int av7110_fw_query(struct av7110 *av7110, u16 tag, u16* buf, s16 length)
 {
        int ret;
        ret = av7110_fw_request(av7110, &tag, 0, buf, length);
        if (ret)
-               printk("dvb-ttpci: av7110_fw_query error\n");
+               printk(KERN_ERR "dvb-ttpci: av7110_fw_query error %d\n", ret);
        return ret;
 }
 
@@ -598,7 +619,7 @@ int av7110_firmversion(struct av7110 *av7110)
 
        if (av7110_fw_query(av7110, tag, buf, 16)) {
                printk("dvb-ttpci: failed to boot firmware @ card %d\n",
-                      av7110->dvb_adapter->num);
+                      av7110->dvb_adapter.num);
                return -EIO;
        }
 
@@ -609,16 +630,16 @@ int av7110_firmversion(struct av7110 *av7110)
        av7110->avtype = (buf[8] << 16) + buf[9];
 
        printk("dvb-ttpci: info @ card %d: firm %08x, rtsl %08x, vid %08x, app %08x\n",
-              av7110->dvb_adapter->num, av7110->arm_fw,
+              av7110->dvb_adapter.num, av7110->arm_fw,
               av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app);
 
        /* print firmware capabilities */
        if (FW_CI_LL_SUPPORT(av7110->arm_app))
                printk("dvb-ttpci: firmware @ card %d supports CI link layer interface\n",
-                      av7110->dvb_adapter->num);
+                      av7110->dvb_adapter.num);
        else
                printk("dvb-ttpci: no firmware support for CI link layer interface @ card %d\n",
-                      av7110->dvb_adapter->num);
+                      av7110->dvb_adapter.num);
 
        return 0;
 }
@@ -626,7 +647,7 @@ int av7110_firmversion(struct av7110 *av7110)
 
 int av7110_diseqc_send(struct av7110 *av7110, int len, u8 *msg, unsigned long burst)
 {
-       int i;
+       int i, ret;
        u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) + SendDiSEqC),
                        16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
@@ -646,8 +667,8 @@ int av7110_diseqc_send(struct av7110 *av7110, int len, u8 *msg, unsigned long bu
        for (i = 0; i < len; i++)
                buf[i + 4] = msg[i];
 
-       if (av7110_send_fw_cmd(av7110, buf, 18))
-               printk("dvb-ttpci: av7110_diseqc_send error\n");
+       if ((ret = av7110_send_fw_cmd(av7110, buf, 18)))
+               printk(KERN_ERR "dvb-ttpci: av7110_diseqc_send error %d\n", ret);
 
        return 0;
 }
@@ -655,21 +676,11 @@ int av7110_diseqc_send(struct av7110 *av7110, int len, u8 *msg, unsigned long bu
 
 #ifdef CONFIG_DVB_AV7110_OSD
 
-static inline int ResetBlend(struct av7110 *av7110, u8 windownr)
-{
-       return av7110_fw_cmd(av7110, COMTYPE_OSD, SetNonBlend, 1, windownr);
-}
-
 static inline int SetColorBlend(struct av7110 *av7110, u8 windownr)
 {
        return av7110_fw_cmd(av7110, COMTYPE_OSD, SetCBlend, 1, windownr);
 }
 
-static inline int SetWindowBlend(struct av7110 *av7110, u8 windownr, u8 blending)
-{
-       return av7110_fw_cmd(av7110, COMTYPE_OSD, SetWBlend, 2, windownr, blending);
-}
-
 static inline int SetBlend_(struct av7110 *av7110, u8 windownr,
                     enum av7110_osd_palette_type colordepth, u16 index, u8 blending)
 {
@@ -684,11 +695,6 @@ static inline int SetColor_(struct av7110 *av7110, u8 windownr,
                             windownr, colordepth, index, colorhi, colorlo);
 }
 
-static inline int BringToTop(struct av7110 *av7110, u8 windownr)
-{
-       return av7110_fw_cmd(av7110, COMTYPE_OSD, WTop, 1, windownr);
-}
-
 static inline int SetFont(struct av7110 *av7110, u8 windownr, u8 fontsize,
                          u16 colorfg, u16 colorbg)
 {
@@ -756,7 +762,7 @@ static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, u8* buf)
        ret = __av7110_send_fw_cmd(av7110, cbuf, 5);
        up(&av7110->dcomlock);
        if (ret)
-               printk("dvb-ttpci: WriteText error\n");
+               printk(KERN_ERR "dvb-ttpci: WriteText error %d\n", ret);
        return ret;
 }
 
@@ -823,7 +829,8 @@ static inline int LoadBitmap(struct av7110 *av7110, u16 format,
 
        ret = wait_event_interruptible_timeout(av7110->bmpq, av7110->bmp_state != BMP_LOADING, HZ);
        if (ret == -ERESTARTSYS || ret == 0) {
-               printk("dvb-ttpci: warning: timeout waiting in %s()\n", __FUNCTION__);
+               printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n",
+                      ret, av7110->bmp_state);
                av7110->bmp_state = BMP_NONE;
                return -1;
        }
@@ -865,6 +872,7 @@ static inline int LoadBitmap(struct av7110 *av7110, u16 format,
                }
        }
        av7110->bmplen += 1024;
+       dprintk(4, "av7110_fw_cmd: LoadBmp size %d\n", av7110->bmplen);
        return av7110_fw_cmd(av7110, COMTYPE_OSD, LoadBmp, 3, format, dx, dy);
 }
 
@@ -876,16 +884,18 @@ static int BlitBitmap(struct av7110 *av7110, u16 win, u16 x, u16 y, u16 trans)
 
        BUG_ON (av7110->bmp_state == BMP_NONE);
 
-       ret = wait_event_interruptible_timeout(av7110->bmpq, av7110->bmp_state != BMP_LOADING, HZ);
+       ret = wait_event_interruptible_timeout(av7110->bmpq,
+                               av7110->bmp_state != BMP_LOADING, 10*HZ);
        if (ret == -ERESTARTSYS || ret == 0) {
-               printk("dvb-ttpci: warning: timeout waiting in %s()\n", __FUNCTION__);
+               printk("dvb-ttpci: warning: timeout waiting in BlitBitmap: %d, %d\n",
+                      ret, av7110->bmp_state);
                av7110->bmp_state = BMP_NONE;
-               return -1;
-               }
+               return (ret == 0) ? -ETIMEDOUT : ret;
+       }
 
        BUG_ON (av7110->bmp_state != BMP_LOADED);
 
-               return av7110_fw_cmd(av7110, COMTYPE_OSD, BlitBmp, 4, win, x, y, trans);
+       return av7110_fw_cmd(av7110, COMTYPE_OSD, BlitBmp, 4, win, x, y, trans);
 }
 
 static inline int ReleaseBitmap(struct av7110 *av7110)
@@ -954,10 +964,11 @@ static int OSDSetPalette(struct av7110 *av7110, u32 __user * colors, u8 first, u
 }
 
 static int OSDSetBlock(struct av7110 *av7110, int x0, int y0,
-                      int x1, int y1, int inc, u8 __user *data)
+                      int x1, int y1, int inc, u8 __user * data)
 {
        uint w, h, bpp, bpl, size, lpb, bnum, brest;
        int i;
+       int rc;
 
        w = x1 - x0 + 1;
        h = y1 - y0 + 1;
@@ -973,15 +984,23 @@ static int OSDSetBlock(struct av7110 *av7110, int x0, int y0,
        brest = size - bnum * lpb * bpl;
 
        for (i = 0; i < bnum; i++) {
-               LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]],
+               rc = LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]],
                           w, lpb, inc, data);
-               BlitBitmap(av7110, av7110->osdwin, x0, y0 + i * lpb, 0);
+               if (rc)
+                       return rc;
+               rc = BlitBitmap(av7110, av7110->osdwin, x0, y0 + i * lpb, 0);
+               if (rc)
+                       return rc;
                data += lpb * inc;
        }
        if (brest) {
-               LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]],
+               rc = LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]],
                           w, brest / bpl, inc, data);
-               BlitBitmap(av7110, av7110->osdwin, x0, y0 + bnum * lpb, 0);
+               if (rc)
+                       return rc;
+               rc = BlitBitmap(av7110, av7110->osdwin, x0, y0 + bnum * lpb, 0);
+               if (rc)
+                       return rc;
        }
        ReleaseBitmap(av7110);
        return 0;
@@ -1034,7 +1053,7 @@ int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc)
                        goto out;
                } else {
                        int i, len = dc->x0-dc->color+1;
-                       u8 __user *colors = (u8 *)dc->data;
+                       u8 __user *colors = (u8 __user *)dc->data;
                        u8 r, g, b, blend;
 
                        for (i = 0; i<len; i++) {
@@ -1044,9 +1063,9 @@ int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc)
                                    get_user(blend, colors + i * 4 + 3)) {
                                        ret = -EFAULT;
                                        goto out;
-               }
+                                   }
                                OSDSetColor(av7110, dc->color + i, r, g, b, blend);
-               }
+                       }
                }
                ret = 0;
                goto out;
@@ -1063,7 +1082,7 @@ int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc)
                dc->y1 = dc->y0;
                /* fall through */
        case OSD_SetBlock:
-               OSDSetBlock(av7110, dc->x0, dc->y0, dc->x1, dc->y1, dc->color, dc->data);
+               ret = OSDSetBlock(av7110, dc->x0, dc->y0, dc->x1, dc->y1, dc->color, dc->data);
                goto out;
        case OSD_FillRow:
                DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0,
@@ -1145,9 +1164,9 @@ int av7110_osd_capability(struct av7110 *av7110, osd_cap_t *cap)
                         cap->val = 1000000;
                 else
                         cap->val = 92000;
-               return 0;
-       default:
-               return -EINVAL;
-       }
+                return 0;
+        default:
+                return -EINVAL;
+        }
 }
 #endif /* CONFIG_DVB_AV7110_OSD */