firesat: fix DVB-S2 device recognition

This only makes sure that a DVB-S2 device is really recognized as a S2,
nothing else is added yet. It's using the string containing the model
that is stored in the configuration ROM, the older version was using
some hardware revision dependent part of the ROM.

Signed-off-by: Ben Backx <ben@bbackx.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
diff --git a/drivers/media/dvb/firesat/avc_api.c b/drivers/media/dvb/firesat/avc_api.c
index d707956..0ad6420 100644
--- a/drivers/media/dvb/firesat/avc_api.c
+++ b/drivers/media/dvb/firesat/avc_api.c
@@ -251,7 +251,7 @@
 
 //	printk(KERN_INFO "%s\n", __func__);
 
-	if(firesat->type == FireSAT_DVB_S)
+	if (firesat->type == FireSAT_DVB_S || firesat->type == FireSAT_DVB_S2)
 		AVCTuner_tuneQPSK(firesat, params, &CmdFrm);
 	else {
 		if(firesat->type == FireSAT_DVB_T) {
@@ -654,21 +654,6 @@
 	}
 	if(systemId)
 		*systemId = RspFrm.operand[7];
-	if(transport)
-		*transport = RspFrm.operand[14] & 0x7;
-	switch(RspFrm.operand[14] & 0x7) {
-		case 1:
-			printk(KERN_INFO "%s: found DVB/S\n",__func__);
-			break;
-		case 2:
-			printk(KERN_INFO "%s: found DVB/C\n",__func__);
-			break;
-		case 3:
-			printk(KERN_INFO "%s: found DVB/T\n",__func__);
-			break;
-		default:
-			printk(KERN_INFO "%s: found unknown tuner id %u\n",__func__,RspFrm.operand[14] & 0x7);
-	}
 	if(has_ci)
 		*has_ci = (RspFrm.operand[14] >> 4) & 0x1;
 	return 0;
diff --git a/drivers/media/dvb/firesat/firesat.h b/drivers/media/dvb/firesat/firesat.h
index f852a1a..d1e2ce3 100644
--- a/drivers/media/dvb/firesat/firesat.h
+++ b/drivers/media/dvb/firesat/firesat.h
@@ -13,7 +13,8 @@
 enum model_type {
     FireSAT_DVB_S = 1,
     FireSAT_DVB_C = 2,
-    FireSAT_DVB_T = 3
+    FireSAT_DVB_T = 3,
+    FireSAT_DVB_S2 = 4
 };
 
 struct firesat {
diff --git a/drivers/media/dvb/firesat/firesat_1394.c b/drivers/media/dvb/firesat/firesat_1394.c
index c7ccf63..dcac70a 100644
--- a/drivers/media/dvb/firesat/firesat_1394.c
+++ b/drivers/media/dvb/firesat/firesat_1394.c
@@ -263,6 +263,8 @@
 	int result;
 	unsigned char subunitcount = 0xff, subunit;
 	struct firesat **firesats = kmalloc(sizeof (void*) * 2,GFP_KERNEL);
+	int kv_len;
+	char *kv_buf;
 
 	if (!firesats) {
 		printk("%s: couldn't allocate memory.\n", __func__);
@@ -329,6 +331,32 @@
 
 		firesat->subunit = subunit;
 
+		/* Reading device model from ROM */
+		kv_len = (ud->model_name_kv->value.leaf.len - 2) *
+			sizeof(quadlet_t);
+		kv_buf = kmalloc((sizeof(quadlet_t) * kv_len), GFP_KERNEL);
+		memcpy(kv_buf,
+			CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(ud->model_name_kv),
+			kv_len);
+		while ((kv_buf + kv_len - 1) == '\0') kv_len--;
+		kv_buf[kv_len++] = '\0';
+
+		/* Determining the device model */
+		if (strcmp(kv_buf, "FireDTV S/CI") == 0) {
+			printk(KERN_INFO "%s: found DVB/S\n", __func__);
+			firesat->type = 1;
+		} else if (strcmp(kv_buf, "FireDTV C/CI") == 0) {
+			printk(KERN_INFO "%s: found DVB/C\n", __func__);
+			firesat->type = 2;
+		} else if (strcmp(kv_buf, "FireDTV T/CI") == 0) {
+			printk(KERN_INFO "%s: found DVB/T\n", __func__);
+			firesat->type = 3;
+		} else if (strcmp(kv_buf, "FireDTV S2  ") == 0) {
+			printk(KERN_INFO "%s: found DVB/S2\n", __func__);
+			firesat->type = 4;
+		}
+		kfree(kv_buf);
+
 		if (AVCIdentifySubunit(firesat, NULL, (int*)&firesat->type, &firesat->has_ci)) {
 			printk("%s: cannot identify subunit %d\n", __func__, subunit);
 			spin_lock_irqsave(&firesat_list_lock, flags);