From: Antonio Ospite <ospite@studenti.unina.it>
Date: Sat, 29 Jun 2013 22:22:07 +0000 (+0200)
Subject: am7xxx: add quirks for devices not supporting some operations
X-Git-Tag: v0.1.4~23
X-Git-Url: https://git.ao2.it/libam7xxx.git/commitdiff_plain/f641ad3eaaada89be7816332f2804dad9d9ecd39

am7xxx: add quirks for devices not supporting some operations

For instance Philips/SagemoCm PicoPix PPX 2330 does not support power
modes and zoom modes, and the device even gets confused when trying to
use them; so for reliable operation it is better to just skip these
operations on such devices.

Thanks-to: Grégory Lemesre
---

diff --git a/src/am7xxx.c b/src/am7xxx.c
index 1f75c60..f37ad70 100644
--- a/src/am7xxx.c
+++ b/src/am7xxx.c
@@ -64,12 +64,16 @@ static void log_message(am7xxx_context *ctx,
 #define debug(ctx, ...)   log_message(ctx,  AM7XXX_LOG_DEBUG,   __func__, 0,        __VA_ARGS__)
 #define trace(ctx, ...)   log_message(ctx,  AM7XXX_LOG_TRACE,   NULL,     0,        __VA_ARGS__)
 
+#define AM7XXX_QUIRK_NO_POWER_MODE (1 << 0)
+#define AM7XXX_QUIRK_NO_ZOOM_MODE  (1 << 1)
+
 struct am7xxx_usb_device_descriptor {
 	const char *name;
 	uint16_t vendor_id;
 	uint16_t product_id;
 	uint8_t configuration;    /* The bConfigurationValue of the device */
 	uint8_t interface_number; /* The bInterfaceNumber of the device */
+	unsigned long quirks;
 };
 
 static const struct am7xxx_usb_device_descriptor supported_devices[] = {
@@ -114,6 +118,7 @@ static const struct am7xxx_usb_device_descriptor supported_devices[] = {
 		.product_id = 0x0019,
 		.configuration    = 1,
 		.interface_number = 0,
+		.quirks = AM7XXX_QUIRK_NO_POWER_MODE | AM7XXX_QUIRK_NO_ZOOM_MODE,
 	},
 };
 
@@ -956,6 +961,12 @@ AM7XXX_PUBLIC int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode po
 		.unknown3        = 0x10,
 	};
 
+	if (dev->desc->quirks & AM7XXX_QUIRK_NO_POWER_MODE) {
+		debug(dev->ctx,
+		      "setting power mode is unsupported on this device\n");
+		return 0;
+	}
+
 	switch(power) {
 	case AM7XXX_POWER_OFF:
 		h.header_data.power.bit2 = 0;
@@ -1010,6 +1021,12 @@ AM7XXX_PUBLIC int am7xxx_set_zoom_mode(am7xxx_device *dev, am7xxx_zoom_mode zoom
 		.unknown3        = 0x10,
 	};
 
+	if (dev->desc->quirks & AM7XXX_QUIRK_NO_ZOOM_MODE) {
+		debug(dev->ctx,
+		      "setting zoom mode is unsupported on this device\n");
+		return 0;
+	}
+
 	switch(zoom) {
 	case AM7XXX_ZOOM_ORIGINAL:
 		h.header_data.zoom.bit1 = 0;