
From: Michael Hunold <hunold@linuxtv.org>

- av7110: check result of saa7146_wait_for_debi_done() in av7110_bootarm()
  and bail out early if booting the ARM failed

- av7110: correct voffset for analog standard

- av7110: replace usage of sleep_on_interruptible_timeout() with
  wait_event_interruptible_timeout()


---

 25-akpm/drivers/media/dvb/ttpci/av7110.c     |   19 +++++++++++++++----
 25-akpm/drivers/media/dvb/ttpci/av7110_hw.c  |   22 +++++++++++++++++-----
 25-akpm/drivers/media/dvb/ttpci/av7110_hw.h  |    2 +-
 25-akpm/drivers/media/dvb/ttpci/av7110_v4l.c |    6 +++---
 4 files changed, 36 insertions(+), 13 deletions(-)

diff -puN drivers/media/dvb/ttpci/av7110.c~dvb-08-av7110-update drivers/media/dvb/ttpci/av7110.c
--- 25/drivers/media/dvb/ttpci/av7110.c~dvb-08-av7110-update	Mon Feb 23 14:05:14 2004
+++ 25-akpm/drivers/media/dvb/ttpci/av7110.c	Mon Feb 23 14:05:14 2004
@@ -105,6 +105,7 @@ static void arm_error(struct av7110 *av7
 static int arm_thread(void *data)
 {
 	struct av7110 *av7110 = data;
+	unsigned long timeout;
         u16 newloops = 0;
 
 	DEB_EE(("av7110: %p\n",av7110));
@@ -112,8 +113,12 @@ static int arm_thread(void *data)
 	dvb_kernel_thread_setup ("arm_mon");
 	av7110->arm_thread = current;
 
-	while (!av7110->arm_rmmod && !signal_pending(current)) {
-                interruptible_sleep_on_timeout(&av7110->arm_wait, 5*HZ);
+	while (1) {
+		timeout = wait_event_interruptible_timeout(av7110->arm_wait,0 != av7110->arm_rmmod, 5*HZ);
+		if (-ERESTARTSYS == timeout || 0 != av7110->arm_rmmod) {
+			/* got signal or told to quit*/
+			break;
+		}
 
                 if (!av7110->arm_ready)
                         continue;
@@ -1283,7 +1288,7 @@ static int check_firmware(struct av7110*
 		return -EINVAL;
 	}
 	if( crc != crc32_le(0,ptr,len)) {
-		printk("dvb-ttpci: crc32 of dpram file does not match.\n");
+		printk("dvb-ttpci: crc32 of root file does not match.\n");
 		return -EINVAL;
 	}
 	av7110->bin_root = ptr;
@@ -1426,7 +1431,10 @@ static int av7110_attach(struct saa7146_
 
         /* load firmware into AV7110 cards */
 	av7110_bootarm(av7110);
-	av7110_firmversion(av7110);
+	if (av7110_firmversion(av7110)) {
+		ret = -EIO;
+		goto err2;
+	}
 
 	if (FW_VERSION(av7110->arm_app)<0x2501)
 		printk ("av7110: Warning, firmware version 0x%04x is too old. "
@@ -1497,6 +1505,9 @@ static int av7110_attach(struct saa7146_
 	av7110_num++;
         return 0;
 
+err2:
+	av7110_ca_exit(av7110);
+	av7110_av_exit(av7110);
 err:
 	if (NULL != av7110 ) {
 		kfree(av7110);
diff -puN drivers/media/dvb/ttpci/av7110_hw.c~dvb-08-av7110-update drivers/media/dvb/ttpci/av7110_hw.c
--- 25/drivers/media/dvb/ttpci/av7110_hw.c~dvb-08-av7110-update	Mon Feb 23 14:05:14 2004
+++ 25-akpm/drivers/media/dvb/ttpci/av7110_hw.c	Mon Feb 23 14:05:14 2004
@@ -249,7 +249,11 @@ int av7110_bootarm(struct av7110 *av7110
 	mwdebi(av7110, DEBISWAB, DPRAM_BASE, bootcode, sizeof(bootcode));
 	iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
 
-	saa7146_wait_for_debi_done(av7110->dev);
+	if (saa7146_wait_for_debi_done(av7110->dev)) {
+		printk(KERN_ERR "dvb: av7110_bootarm(): "
+		       "saa7146_wait_for_debi_done() timed out\n");
+		return -1;
+	}
 	saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI);
 	//FIXME: necessary?
 	set_current_state(TASK_INTERRUPTIBLE);
@@ -265,7 +269,11 @@ int av7110_bootarm(struct av7110 *av7110
 	DEB_D(("av7110_bootarm: load dpram code\n"));
 	mwdebi(av7110, DEBISWAB, DPRAM_BASE, av7110->bin_dpram, av7110->size_dpram);
 
-	saa7146_wait_for_debi_done(av7110->dev);
+	if (saa7146_wait_for_debi_done(av7110->dev)) {
+		printk(KERN_ERR "dvb: av7110_bootarm(): "
+		       "saa7146_wait_for_debi_done() timed out after loading DRAM\n");
+		return -1;
+	}
 	saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI);
 	//FIXME: necessary?
 	mdelay(800);
@@ -515,14 +523,18 @@ int av7110_fw_query(struct av7110 *av711
  ****************************************************************************/
 
 /* get version of the firmware ROM, RTSL, video ucode and ARM application  */
-void av7110_firmversion(struct av7110 *av7110)
+int av7110_firmversion(struct av7110 *av7110)
 {
 	u16 buf[20];
 	u16 tag = ((COMTYPE_REQUEST << 8) + ReqVersion);
 
 	DEB_EE(("av7110: %p\n", av7110));
 
-	av7110_fw_query(av7110, tag, buf, 16);
+	if (av7110_fw_query(av7110, tag, buf, 16)) {
+		printk("DVB: AV7110-%d: ERROR: Failed to boot firmware\n",
+		       av7110->dvb_adapter->num);
+		return -EIO;
+	}
 
 	av7110->arm_fw = (buf[0] << 16) + buf[1];
 	av7110->arm_rtsl = (buf[2] << 16) + buf[3];
@@ -542,7 +554,7 @@ void av7110_firmversion(struct av7110 *a
 		printk("DVB: AV711%d(%d) - no firmware support for CI link layer interface\n",
 		       av7110->avtype, av7110->dvb_adapter->num);
 
-	return;
+	return 0;
 }
 
 
diff -puN drivers/media/dvb/ttpci/av7110_hw.h~dvb-08-av7110-update drivers/media/dvb/ttpci/av7110_hw.h
--- 25/drivers/media/dvb/ttpci/av7110_hw.h~dvb-08-av7110-update	Mon Feb 23 14:05:14 2004
+++ 25-akpm/drivers/media/dvb/ttpci/av7110_hw.h	Mon Feb 23 14:05:14 2004
@@ -362,7 +362,7 @@ enum av7110_command_type {
 
 extern void av7110_reset_arm(struct av7110 *av7110);
 extern int av7110_bootarm(struct av7110 *av7110);
-extern void av7110_firmversion(struct av7110 *av7110);
+extern int av7110_firmversion(struct av7110 *av7110);
 #define FW_CI_LL_SUPPORT(arm_app) ((arm_app) & 0x80000000)
 #define FW_VERSION(arm_app)	  ((arm_app) & 0x0000FFFF)
 
diff -puN drivers/media/dvb/ttpci/av7110_v4l.c~dvb-08-av7110-update drivers/media/dvb/ttpci/av7110_v4l.c
--- 25/drivers/media/dvb/ttpci/av7110_v4l.c~dvb-08-av7110-update	Mon Feb 23 14:05:14 2004
+++ 25-akpm/drivers/media/dvb/ttpci/av7110_v4l.c	Mon Feb 23 14:05:14 2004
@@ -191,7 +191,7 @@ int av7110_dvb_c_switch(struct saa7146_f
 
 	if (0 != av7110->current_input) {
 		adswitch = 1;
-		band = 0x68; /* analog band */
+		band = 0x60; /* analog band */
 		source = SAA7146_HPS_SOURCE_PORT_B;
 		sync = SAA7146_HPS_SYNC_PORT_B;
 		memcpy(standard, analog_standard, sizeof(struct saa7146_standard) * 2);
@@ -204,7 +204,7 @@ int av7110_dvb_c_switch(struct saa7146_f
 		msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x4f00); // SCART 1 volume
 	} else {
 		adswitch = 0;
-		band = 0x28; /* digital band */
+		band = 0x20; /* digital band */
 		source = SAA7146_HPS_SOURCE_PORT_A;
 		sync = SAA7146_HPS_SYNC_PORT_A;
 		memcpy(standard, dvb_standard, sizeof(struct saa7146_standard) * 2);
@@ -638,7 +638,7 @@ static struct saa7146_standard standard[
 static struct saa7146_standard analog_standard[] = {
 	{
 		.name	= "PAL",	.id		= V4L2_STD_PAL_BG,
-		.v_offset	= 0x18 /* 0 */ ,	.v_field	= 288,		.v_calc	= 576,
+		.v_offset	= 0x1b,	.v_field	= 288,		.v_calc	= 576,
 		.h_offset	= 0x08,	.h_pixels	= 708,		.h_calc	= 709,
 		.v_max_out	= 576,	.h_max_out	= 768,
 	}, {

_
