diff mbox

[3/4] media: dvb/af9015, refactor remote setting

Message ID 1264173055-14787-3-git-send-email-jslaby@suse.cz (mailing list archive)
State Accepted
Headers show

Commit Message

Jiri Slaby Jan. 22, 2010, 3:10 p.m. UTC
None
diff mbox

Patch

diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c
index adba90d..796f9d5 100644
--- a/drivers/media/dvb/dvb-usb/af9015.c
+++ b/drivers/media/dvb/dvb-usb/af9015.c
@@ -732,98 +732,80 @@  error:
 	return ret;
 }
 
+struct af9015_setup {
+	unsigned int id;
+	struct dvb_usb_rc_key *rc_key_map;
+	unsigned int rc_key_map_size;
+	u8 *ir_table;
+	unsigned int ir_table_size;
+};
+
+static const struct af9015_setup *af9015_setup_match(unsigned int id,
+		const struct af9015_setup *table)
+{
+	for (; table->rc_key_map; table++)
+		if (table->id == id)
+			return table;
+	return NULL;
+}
+
+static const struct af9015_setup af9015_setup_modparam[] = {
+	{ AF9015_REMOTE_A_LINK_DTU_M,
+		af9015_rc_keys_a_link, ARRAY_SIZE(af9015_rc_keys_a_link),
+		af9015_ir_table_a_link, ARRAY_SIZE(af9015_ir_table_a_link) },
+	{ AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
+		af9015_rc_keys_msi, ARRAY_SIZE(af9015_rc_keys_msi),
+		af9015_ir_table_msi, ARRAY_SIZE(af9015_ir_table_msi) },
+	{ AF9015_REMOTE_MYGICTV_U718,
+		af9015_rc_keys_mygictv, ARRAY_SIZE(af9015_rc_keys_mygictv),
+		af9015_ir_table_mygictv, ARRAY_SIZE(af9015_ir_table_mygictv) },
+	{ AF9015_REMOTE_DIGITTRADE_DVB_T,
+		af9015_rc_keys_digittrade, ARRAY_SIZE(af9015_rc_keys_digittrade),
+		af9015_ir_table_digittrade, ARRAY_SIZE(af9015_ir_table_digittrade) },
+	{ AF9015_REMOTE_AVERMEDIA_KS,
+		af9015_rc_keys_avermedia, ARRAY_SIZE(af9015_rc_keys_avermedia),
+		af9015_ir_table_avermedia_ks, ARRAY_SIZE(af9015_ir_table_avermedia_ks) },
+	{ }
+};
+
+/* don't add new entries here anymore, use hashes instead */
+static const struct af9015_setup af9015_setup_usbids[] = {
+	{ USB_VID_LEADTEK,
+		af9015_rc_keys_leadtek, ARRAY_SIZE(af9015_rc_keys_leadtek),
+		af9015_ir_table_leadtek, ARRAY_SIZE(af9015_ir_table_leadtek) },
+	{ USB_VID_VISIONPLUS,
+		af9015_rc_keys_twinhan, ARRAY_SIZE(af9015_rc_keys_twinhan),
+		af9015_ir_table_twinhan, ARRAY_SIZE(af9015_ir_table_twinhan) },
+	{ USB_VID_KWORLD_2, /* TODO: use correct rc keys */
+		af9015_rc_keys_twinhan, ARRAY_SIZE(af9015_rc_keys_twinhan),
+		af9015_ir_table_kworld, ARRAY_SIZE(af9015_ir_table_kworld) },
+	{ USB_VID_AVERMEDIA,
+		af9015_rc_keys_avermedia, ARRAY_SIZE(af9015_rc_keys_avermedia),
+		af9015_ir_table_avermedia, ARRAY_SIZE(af9015_ir_table_avermedia) },
+	{ USB_VID_MSI_2,
+		af9015_rc_keys_msi_digivox_iii, ARRAY_SIZE(af9015_rc_keys_msi_digivox_iii),
+		af9015_ir_table_msi_digivox_iii, ARRAY_SIZE(af9015_ir_table_msi_digivox_iii) },
+	{ }
+};
+
 static void af9015_set_remote_config(struct usb_device *udev,
 		struct dvb_usb_device_properties *props)
 {
+	const struct af9015_setup *table = NULL;
+
 	if (dvb_usb_af9015_remote) {
 		/* load remote defined as module param */
-		switch (dvb_usb_af9015_remote) {
-		case AF9015_REMOTE_A_LINK_DTU_M:
-			props->rc_key_map =
-			  af9015_rc_keys_a_link;
-			props->rc_key_map_size =
-			  ARRAY_SIZE(af9015_rc_keys_a_link);
-			af9015_config.ir_table = af9015_ir_table_a_link;
-			af9015_config.ir_table_size =
-			  ARRAY_SIZE(af9015_ir_table_a_link);
-			break;
-		case AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3:
-			props->rc_key_map =
-			  af9015_rc_keys_msi;
-			props->rc_key_map_size =
-			  ARRAY_SIZE(af9015_rc_keys_msi);
-			af9015_config.ir_table = af9015_ir_table_msi;
-			af9015_config.ir_table_size =
-			  ARRAY_SIZE(af9015_ir_table_msi);
-			break;
-		case AF9015_REMOTE_MYGICTV_U718:
-			props->rc_key_map =
-			  af9015_rc_keys_mygictv;
-			props->rc_key_map_size =
-			  ARRAY_SIZE(af9015_rc_keys_mygictv);
-			af9015_config.ir_table =
-			  af9015_ir_table_mygictv;
-			af9015_config.ir_table_size =
-			  ARRAY_SIZE(af9015_ir_table_mygictv);
-			break;
-		case AF9015_REMOTE_DIGITTRADE_DVB_T:
-			props->rc_key_map =
-			  af9015_rc_keys_digittrade;
-			props->rc_key_map_size =
-			  ARRAY_SIZE(af9015_rc_keys_digittrade);
-			af9015_config.ir_table =
-			  af9015_ir_table_digittrade;
-			af9015_config.ir_table_size =
-			  ARRAY_SIZE(af9015_ir_table_digittrade);
-			break;
-		case AF9015_REMOTE_AVERMEDIA_KS:
-			props->rc_key_map =
-			  af9015_rc_keys_avermedia;
-			props->rc_key_map_size =
-			  ARRAY_SIZE(af9015_rc_keys_avermedia);
-			af9015_config.ir_table =
-			  af9015_ir_table_avermedia_ks;
-			af9015_config.ir_table_size =
-			  ARRAY_SIZE(af9015_ir_table_avermedia_ks);
-			break;
-		}
+		table = af9015_setup_match(dvb_usb_af9015_remote,
+				af9015_setup_modparam);
 	} else {
-		switch (le16_to_cpu(udev->descriptor.idVendor)) {
-		case USB_VID_LEADTEK:
-			props->rc_key_map =
-			  af9015_rc_keys_leadtek;
-			props->rc_key_map_size =
-			  ARRAY_SIZE(af9015_rc_keys_leadtek);
-			af9015_config.ir_table =
-			  af9015_ir_table_leadtek;
-			af9015_config.ir_table_size =
-			  ARRAY_SIZE(af9015_ir_table_leadtek);
-			break;
-		case USB_VID_VISIONPLUS:
-			props->rc_key_map =
-			  af9015_rc_keys_twinhan;
-			props->rc_key_map_size =
-			  ARRAY_SIZE(af9015_rc_keys_twinhan);
-			af9015_config.ir_table =
-			  af9015_ir_table_twinhan;
-			af9015_config.ir_table_size =
-			  ARRAY_SIZE(af9015_ir_table_twinhan);
-			break;
-		case USB_VID_KWORLD_2:
-			/* TODO: use correct rc keys */
-			props->rc_key_map =
-			  af9015_rc_keys_twinhan;
-			props->rc_key_map_size =
-			  ARRAY_SIZE(af9015_rc_keys_twinhan);
-			af9015_config.ir_table = af9015_ir_table_kworld;
-			af9015_config.ir_table_size =
-			  ARRAY_SIZE(af9015_ir_table_kworld);
-			break;
-		/* Check USB manufacturer and product strings and try
-		   to determine correct remote in case of chip vendor
-		   reference IDs are used. */
-		case USB_VID_AFATECH:
-		{
+		u16 vendor = le16_to_cpu(udev->descriptor.idVendor);
+
+		if (vendor == USB_VID_AFATECH) {
+			/* Check USB manufacturer and product strings and try
+			   to determine correct remote in case of chip vendor
+			   reference IDs are used.
+			   DO NOT ADD ANYTHING NEW HERE. Use hashes instead.
+			 */
 			char manufacturer[10];
 			memset(manufacturer, 0, sizeof(manufacturer));
 			usb_string(udev, udev->descriptor.iManufacturer,
@@ -831,59 +813,33 @@  static void af9015_set_remote_config(struct usb_device *udev,
 			if (!strcmp("Geniatech", manufacturer)) {
 				/* iManufacturer 1 Geniatech
 				   iProduct      2 AF9015 */
-				props->rc_key_map =
-				  af9015_rc_keys_mygictv;
-				props->rc_key_map_size =
-				  ARRAY_SIZE(af9015_rc_keys_mygictv);
-				af9015_config.ir_table =
-				  af9015_ir_table_mygictv;
-				af9015_config.ir_table_size =
-				  ARRAY_SIZE(af9015_ir_table_mygictv);
+				table = af9015_setup_match(
+					AF9015_REMOTE_MYGICTV_U718,
+					af9015_setup_modparam);
 			} else if (!strcmp("MSI", manufacturer)) {
 				/* iManufacturer 1 MSI
 				   iProduct      2 MSI K-VOX */
-				props->rc_key_map =
-				  af9015_rc_keys_msi;
-				props->rc_key_map_size =
-				  ARRAY_SIZE(af9015_rc_keys_msi);
-				af9015_config.ir_table =
-				  af9015_ir_table_msi;
-				af9015_config.ir_table_size =
-				  ARRAY_SIZE(af9015_ir_table_msi);
+				table = af9015_setup_match(
+					AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
+					af9015_setup_modparam);
 			} else if (udev->descriptor.idProduct ==
 				cpu_to_le16(USB_PID_TREKSTOR_DVBT)) {
-				props->rc_key_map =
-				  af9015_rc_keys_trekstor;
-				props->rc_key_map_size =
-				  ARRAY_SIZE(af9015_rc_keys_trekstor);
-				af9015_config.ir_table =
-				  af9015_ir_table_trekstor;
-				af9015_config.ir_table_size =
-				  ARRAY_SIZE(af9015_ir_table_trekstor);
+				table = &(const struct af9015_setup){ 0,
+					af9015_rc_keys_trekstor,
+					ARRAY_SIZE(af9015_rc_keys_trekstor),
+					af9015_ir_table_trekstor,
+					ARRAY_SIZE(af9015_ir_table_trekstor)
+				};
 			}
-			break;
-		}
-		case USB_VID_AVERMEDIA:
-			props->rc_key_map =
-			  af9015_rc_keys_avermedia;
-			props->rc_key_map_size =
-			  ARRAY_SIZE(af9015_rc_keys_avermedia);
-			af9015_config.ir_table =
-			  af9015_ir_table_avermedia;
-			af9015_config.ir_table_size =
-			  ARRAY_SIZE(af9015_ir_table_avermedia);
-			break;
-		case USB_VID_MSI_2:
-			props->rc_key_map =
-			  af9015_rc_keys_msi_digivox_iii;
-			props->rc_key_map_size =
-			  ARRAY_SIZE(af9015_rc_keys_msi_digivox_iii);
-			af9015_config.ir_table =
-			  af9015_ir_table_msi_digivox_iii;
-			af9015_config.ir_table_size =
-			  ARRAY_SIZE(af9015_ir_table_msi_digivox_iii);
-			break;
-		}
+		} else
+			table = af9015_setup_match(vendor, af9015_setup_usbids);
+	}
+
+	if (table) {
+		props->rc_key_map = table->rc_key_map;
+		props->rc_key_map_size = table->rc_key_map_size;
+		af9015_config.ir_table = table->ir_table;
+		af9015_config.ir_table_size = table->ir_table_size;
 	}
 }