Here is a small patch that allows you to set registers for the cx25480 which 
can use the range from 0-0x1ffff. The old API used unsigned char as the 
address, it's now a 32-bit number.

                Hans
diff -ru iv/driver/cx25840-driver.c ivtv-0.3.7c/driver/cx25840-driver.c
--- iv/driver/cx25840-driver.c	2005-07-18 16:02:33.000000000 +0200
+++ ivtv-0.3.7c/driver/cx25840-driver.c	2005-08-14 17:41:02.000000000 +0200
@@ -437,14 +437,14 @@
 	{
 		struct decoder_reg *reg = arg;
 
-		reg->val = cx25840_read(client, 0x400 | reg->reg);
+		reg->val = cx25840_read(client, reg->reg & 0x1fff);
 		break;
 	}
 	case DECODER_SET_REG:
 	{
 		struct decoder_reg *reg = arg;
 
-		cx25840_write(client, 0x400 | reg->reg, reg->val);
+		cx25840_write(client, reg->reg & 0x1fff, reg->val & 0xff);
 		break;
 	}
 	case DECODER_GET_SETTING:
diff -ru iv/driver/decoder.h ivtv-0.3.7c/driver/decoder.h
--- iv/driver/decoder.h	2005-05-28 03:27:59.000000000 +0200
+++ ivtv-0.3.7c/driver/decoder.h	2005-08-14 17:41:02.000000000 +0200
@@ -38,8 +38,8 @@
 };
 
 struct decoder_reg {
-	u8 reg;
-	u8 val;
+	u32 reg;
+	u32 val;
 };
 
 /* Possible audio bit rates for DECODER_SET_AUDIO */
diff -ru iv/driver/ivtv.h ivtv-0.3.7c/driver/ivtv.h
--- iv/driver/ivtv.h	2005-07-09 17:23:09.000000000 +0200
+++ ivtv-0.3.7c/driver/ivtv.h	2005-08-14 17:41:02.000000000 +0200
@@ -352,8 +352,8 @@
 };
 
 struct ivtv_saa71xx_reg {
-	unsigned char reg;
-	unsigned char val;
+	uint32_t reg;
+	uint32_t val;
 };
 
 struct ivtv_itvc_reg {
diff -ru iv/driver/saa7115.c ivtv-0.3.7c/driver/saa7115.c
--- iv/driver/saa7115.c	2005-07-05 16:09:09.000000000 +0200
+++ ivtv-0.3.7c/driver/saa7115.c	2005-08-14 17:41:02.000000000 +0200
@@ -574,14 +574,14 @@
 	{
 		struct decoder_reg *reg = arg;
 
-		reg->val = saa7115_read(client, reg->reg);
+		reg->val = saa7115_read(client, reg->reg & 0xff);
 		break;
 	}
 	case DECODER_SET_REG:
 	{
 		struct decoder_reg *reg = arg;
 
-		saa7115_write(client, reg->reg, reg->val);
+		saa7115_write(client, reg->reg & 0xff, reg->val & 0xff);
 		break;
 	}
 
diff -ru iv/driver/saa7127.c ivtv-0.3.7c/driver/saa7127.c
--- iv/driver/saa7127.c	2005-07-18 16:02:33.000000000 +0200
+++ ivtv-0.3.7c/driver/saa7127.c	2005-08-14 17:41:22.000000000 +0200
@@ -667,13 +667,13 @@
 	case ENCODER_GET_REG:{
 		struct saa7127_reg *reg = arg;
 
-		reg->val = saa7127_read(client, reg->reg);
+		reg->val = saa7127_read(client, reg->reg & 0xff);
 		break;
 	}
 	case ENCODER_SET_REG:{
 		struct saa7127_reg *reg = arg;
 
-		saa7127_writereg(client, reg->reg, reg->val);
+		saa7127_writereg(client, reg->reg & 0xff, reg->val & 0xff);
 		break;
 	}
 
diff -ru iv/utils/ivtvctl.c ivtv-0.3.7c/utils/ivtvctl.c
--- iv/utils/ivtvctl.c	2005-06-06 18:17:56.000000000 +0200
+++ ivtv-0.3.7c/utils/ivtvctl.c	2005-08-14 17:41:02.000000000 +0200
@@ -1343,7 +1343,9 @@
 		printf("ioctl: IVTV_IOC_G_SAA7115_REG\n");
 		printf("      00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
 		for (i = 0; i < 256; i++) {
-			saa7115_reg.reg = (unsigned char)i;
+                        // 0x400 is a hack for the cx24580, the saa7115 only uses
+                        // the lower 8 bits of the address.
+			saa7115_reg.reg = 0x400 | i;
 			if (ioctl(fd, IVTV_IOC_G_SAA7115_REG, &saa7115_reg) < 0)
 				fprintf(stderr,
 					"ioctl: IVTV_IOC_G_SAA7115_REG failed\n");

Reply via email to