Index: av7110.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/av7110/av7110.c,v
retrieving revision 1.65
diff -p -u -r1.65 av7110.c
--- av7110.c	6 Nov 2003 12:45:22 -0000	1.65
+++ av7110.c	27 Feb 2004 17:41:25 -0000
@@ -743,10 +743,17 @@ TTBStart(av7110_t *av7110)
         saa7146_write(saa->mem, PCI_BT_V1, 0x001c0000);
 
         av7110->ttbp=0;
-        saa7146_write(saa->mem, DD1_INIT, 0x02000600);
-        saa7146_write(saa->mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
 
-        saa7146_write(saa->mem, BRS_CTRL, 0x60000000);	
+        if (av7110->saa->card_type == DVB_CARD_ACTIVY) {
+                saa7146_write(saa->mem, DD1_INIT, 0x04000000);
+                saa7146_write(saa->mem, MC2, (MASK_09 | MASK_25));
+                saa7146_write(saa->mem, BRS_CTRL, 0x00000000);
+        } else {
+                saa7146_write(saa->mem, DD1_INIT, 0x02000600);
+                saa7146_write(saa->mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
+                saa7146_write(saa->mem, BRS_CTRL, 0x60000000);
+        }
+
       	saa7146_write(saa->mem, MC2, (MASK_08 | MASK_24));
         mdelay(10);
 
@@ -754,9 +761,15 @@ TTBStart(av7110_t *av7110)
         saa7146_write(saa->mem, BASE_EVEN3, 0);
         saa7146_write(saa->mem, PROT_ADDR3, TS_BUFLEN);	
         saa7146_write(saa->mem, BASE_PAGE3, virt_to_bus(saa->page_table[0])|ME1|0x90);
-        saa7146_write(saa->mem, PITCH3, TS_WIDTH);	
 
-        saa7146_write(saa->mem, NUM_LINE_BYTE3, (TS_HEIGHT<<16)|TS_WIDTH);
+        if (av7110->saa->card_type == DVB_CARD_ACTIVY) {
+                saa7146_write(saa->mem, PITCH3, TS_WIDTH/4);
+                saa7146_write(saa->mem, NUM_LINE_BYTE3, ((TS_HEIGHT*4)<<16)|(TS_WIDTH/4));
+        } else {
+                saa7146_write(saa->mem, PITCH3, TS_WIDTH);	
+                saa7146_write(saa->mem, NUM_LINE_BYTE3, (TS_HEIGHT<<16)|TS_WIDTH);
+        }
+
       	saa7146_write(saa->mem, MC2, (MASK_04 | MASK_20));
 
         // VPE
@@ -2546,6 +2559,43 @@ SendDiSEqCMsg(av7110_t *av7110, int len,
         return 0;
 }
 
+
+/*
+ *   Routines for the Fujitsu Siemens Activy budget card
+ *   22 kHz tone and DiSEqC are handled by the frontend.
+ *   Voltage must be set here.
+ */
+static int SetVoltage_Activy (av7110_t *av7110, fe_sec_voltage_t voltage)
+{
+	switch (voltage) {
+		case SEC_VOLTAGE_13:
+			setgpio(av7110, 2, GPIO_OUTLO);
+			break;
+		case SEC_VOLTAGE_18:
+			setgpio(av7110, 2, GPIO_OUTHI);
+			break;
+		default:
+			return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int budget_ioctl_activy (struct dvb_frontend *fe, unsigned int cmd, void	*arg)
+{
+	av7110_t *av7110 = fe->before_after_data;
+
+	switch (cmd) {
+		case FE_SET_VOLTAGE:
+			return SetVoltage_Activy (av7110, (fe_sec_voltage_t) arg);
+		default:
+			return -EOPNOTSUPP;
+	}
+
+	return 0;
+}
+
+
 /****************************************************************************
  * I2C client commands
  ****************************************************************************/
@@ -4759,6 +4809,9 @@ dvb_register(av7110_t *av7110)
             av7110->saa->card_type==DVB_CARD_TT_SIEMENS) 
 		dvb_add_frontend_ioctls (av7110->dvb_adapter,
 					 av7110_diseqc_ioctl, NULL, av7110);
+	else if (av7110->saa->card_type == DVB_CARD_ACTIVY)
+		dvb_add_frontend_ioctls (av7110->dvb_adapter,
+					 budget_ioctl_activy, NULL, av7110);
 
 	av7110->audiostate.AV_sync_state=0;
 	av7110->audiostate.mute_state=0;
@@ -4912,7 +4965,11 @@ dvb_unregister(av7110_t *av7110)
                 dvb_remove_frontend_notifier (av7110->dvb_adapter,
                                               av7110_before_after_tune);
 
-	dvb_remove_frontend_ioctls (av7110->dvb_adapter,
+	if (av7110->saa->card_type == DVB_CARD_ACTIVY)
+		dvb_remove_frontend_ioctls (av7110->dvb_adapter,
+				    budget_ioctl_activy, NULL);
+	else
+		dvb_remove_frontend_ioctls (av7110->dvb_adapter,
 				    av7110_diseqc_ioctl, NULL);
 
         if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) {
@@ -5017,7 +5074,11 @@ int av7110_attach (struct saa7146 *saa, 
                 saa7146_write(av7110->saa_mem, DD1_INIT, 0x02000600);
                 saa7146_write(av7110->saa_mem, MC2, 
                               (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-                setgpio(av7110, 2, GPIO_OUTHI); /* frontend power on */
+                /* frontend power on */
+                if (av7110->saa->card_type == DVB_CARD_ACTIVY)
+                        setgpio(av7110, 1, GPIO_OUTHI);
+                else
+                        setgpio(av7110, 2, GPIO_OUTHI);
         }
 
         if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) {
Index: saa7146_core.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/av7110/saa7146_core.c,v
retrieving revision 1.19
diff -p -u -r1.19 saa7146_core.c
--- saa7146_core.c	1 Aug 2003 15:01:37 -0000	1.19
+++ saa7146_core.c	27 Feb 2004 17:41:25 -0000
@@ -931,6 +931,7 @@ static struct card_info tt_2_1 = { DVB_C
 static struct card_info tt_t   = { DVB_CARD_TT_SIEMENS,   "Technotrend/Hauppauge PCI DVB-T" };
 static struct card_info nexus  = { DVB_CARD_TT_SIEMENS,   "Technotrend/Hauppauge Nexus PCI DVB-S" };
 static struct card_info knc1   = { DVB_CARD_KNC1,         "KNC1 DVB-S" };
+static struct card_info fsacs  = { DVB_CARD_ACTIVY,       "Fujitsu-Siemens Activy DVB-S budget" };
 
 #define PHILIPS_SAA7146 PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146
 #define CARD_INFO driver_data: (unsigned long) &
@@ -958,6 +959,7 @@ static struct pci_device_id saa7146_pci_
 	{ PHILIPS_SAA7146, 0x00a1, 0x00a1, CARD_INFO unkwn2 },
 	{ PHILIPS_SAA7146, 0x00a1, 0xa1a0, CARD_INFO nexus },
 	{ PHILIPS_SAA7146, 0x1131, 0x4f56, CARD_INFO knc1 },
+	{ PHILIPS_SAA7146, 0x1131, 0x4f61, CARD_INFO fsacs },
 	{ 0,},
 };
 
Index: saa7146_core.h
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/av7110/saa7146_core.h,v
retrieving revision 1.5
diff -p -u -r1.5 saa7146_core.h
--- saa7146_core.h	17 Jul 2003 08:18:43 -0000	1.5
+++ saa7146_core.h	27 Feb 2004 17:41:25 -0000
@@ -21,6 +21,7 @@
 #define DVB_CARD_TT_BUDGET    1
 #define DVB_CARD_TT_BUDGET_CI 2
 #define DVB_CARD_KNC1         3
+#define DVB_CARD_ACTIVY       4
 
 
 /* this struct contains some constants needed for horizontal and vertical scaling. 
