am7xxx: add quirks for devices not supporting some operations
authorAntonio Ospite <ospite@studenti.unina.it>
Sat, 29 Jun 2013 22:22:07 +0000 (00:22 +0200)
committerAntonio Ospite <ospite@studenti.unina.it>
Sat, 20 Jul 2013 22:18:03 +0000 (00:18 +0200)
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

src/am7xxx.c

index 1f75c60..f37ad70 100644 (file)
@@ -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 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 */
 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[] = {
 };
 
 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,
                .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,
        };
 
                .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;
        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,
        };
 
                .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;
        switch(zoom) {
        case AM7XXX_ZOOM_ORIGINAL:
                h.header_data.zoom.bit1 = 0;