diff -rNU3 --label linux-2.6.28.9-orig/drivers/media/video/uvc --label linux-2.6.28.9-ctrl-blacklist/drivers/media/video/uvc linux-2.6.28.9-orig/drivers/media/video/uvc linux-2.6.28.9-ctrl-blacklist/drivers/media/video/uvc
--- linux-2.6.28.9-orig/drivers/media/video/uvc
+++ linux-2.6.28.9-ctrl-blacklist/drivers/media/video/uvc
@@ -548,6 +548,11 @@
 	return (data[bit >> 3] >> (bit & 7)) & 1;
 }
 
+static inline void uvc_clear_bit(__u8 *data, int bit)
+{
+ data[bit >> 3] &= ~(1 << (bit & 7));
+}
+
 /* Extract the bit string specified by mapping->offset and mapping->size
  * from the little-endian data stored at 'data' and return the result as
  * a signed 32bit integer. Sign extension will be performed if the mapping
@@ -1306,6 +1311,47 @@
 }
 
 /*
+ * Prune an entity of its bogus controls using a blacklist. Bogus controls
+ * are currently the ones that crash the camera or unconditionally return an
+ * error when queried.
+ */
+static void
+uvc_ctrl_prune_entity(struct uvc_device *dev, struct uvc_entity *entity)
+{
+ static const struct {
+   struct usb_device_id id;
+   u8 index;
+ } blacklist[] = {
+   { { USB_DEVICE(0x5986, 0x0241) }, 2 }, /* Hue */
+   { { USB_DEVICE(0x1c4f, 0x3000) }, 6 }, /* WB Temperature */
+ };
+
+ u8 *controls;
+ unsigned int size;
+ unsigned int i;
+
+ if (UVC_ENTITY_TYPE(entity) != VC_PROCESSING_UNIT)
+   return;
+
+ controls = entity->processing.bmControls;
+ size = entity->processing.bControlSize;
+ 
+ for (i = 0; i < ARRAY_SIZE(blacklist); ++i) {
+   if (!usb_match_id(dev->intf, &blacklist[i].id))
+     continue;
+
+   if (blacklist[i].index >= 8 * size ||
+       !uvc_get_bit(controls, blacklist[i].index))
+     continue;
+
+   uvc_trace(UVC_TRACE_CONTROL, "%u/%u control is black listed, "
+     "removing it.\n", entity->id, blacklist[i].index);
+
+   uvc_clear_bit(controls, blacklist[i].index);
+ }
+}
+
+/*
  * Initialize device controls.
  */
 int uvc_ctrl_init_device(struct uvc_device *dev)
@@ -1331,6 +1377,9 @@
 			bControlSize = entity->camera.bControlSize;
 		}
 
+        if (dev->quirks & UVC_QUIRK_PRUNE_CONTROLS)
+          uvc_ctrl_prune_entity(dev, entity);
+
 		for (i = 0; i < bControlSize; ++i)
 			ncontrols += hweight8(bmControls[i]);
 
diff -rNU3 --label linux-2.6.28.9-orig/drivers/media/video/uvc --label linux-2.6.28.9-ctrl-blacklist/drivers/media/video/uvc linux-2.6.28.9-orig/drivers/media/video/uvc linux-2.6.28.9-ctrl-blacklist/drivers/media/video/uvc
--- linux-2.6.28.9-orig/drivers/media/video/uvc
+++ linux-2.6.28.9-ctrl-blacklist/drivers/media/video/uvc
@@ -1884,7 +1884,19 @@
 	  .bInterfaceSubClass	= 1,
 	  .bInterfaceProtocol	= 0,
 	  .driver_info		= UVC_QUIRK_PROBE_MINMAX
-				| UVC_QUIRK_IGNORE_SELECTOR_UNIT},
+                | UVC_QUIRK_IGNORE_SELECTOR_UNIT
+                | UVC_QUIRK_PRUNE_CONTROLS },
+    /* Bison Electronics, Pro NB */
+    { .match_flags      = USB_DEVICE_ID_MATCH_DEVICE
+                | USB_DEVICE_ID_MATCH_INT_INFO,
+      .idVendor     = 0x5986,
+      .idProduct        = 0x0241,
+      .bInterfaceClass  = USB_CLASS_VIDEO,
+      .bInterfaceSubClass   = 1,
+      .bInterfaceProtocol   = 0,
+      .driver_info      = UVC_QUIRK_PROBE_MINMAX 
+                | UVC_QUIRK_IGNORE_SELECTOR_UNIT
+                | UVC_QUIRK_PRUNE_CONTROLS },
 	/* Acer OEM Webcam - Unknown vendor */
 	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
 				| USB_DEVICE_ID_MATCH_INT_INFO,
diff -rNU3 --label linux-2.6.28.9-orig/drivers/media/video/uvc --label linux-2.6.28.9-ctrl-blacklist/drivers/media/video/uvc linux-2.6.28.9-orig/drivers/media/video/uvc linux-2.6.28.9-ctrl-blacklist/drivers/media/video/uvc
--- linux-2.6.28.9-orig/drivers/media/video/uvc
+++ linux-2.6.28.9-ctrl-blacklist/drivers/media/video/uvc
@@ -316,6 +316,7 @@
 #define UVC_QUIRK_BUILTIN_ISIGHT	0x00000008
 #define UVC_QUIRK_STREAM_NO_FID		0x00000010
 #define UVC_QUIRK_IGNORE_SELECTOR_UNIT	0x00000020
+#define UVC_QUIRK_PRUNE_CONTROLS 0x00000040
 
 /* Format flags */
 #define UVC_FMT_FLAG_COMPRESSED		0x00000001

