Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
[pandora-kernel.git] / drivers / media / IR / imon.c
index 5e20456..4bbd45f 100644 (file)
@@ -94,6 +94,7 @@ struct imon_context {
 
        bool display_supported;         /* not all controllers do */
        bool display_isopen;            /* display port has been opened */
+       bool rf_device;                 /* true if iMON 2.4G LT/DT RF device */
        bool rf_isassociating;          /* RF remote associating */
        bool dev_present_intf0;         /* USB device presence, interface 0 */
        bool dev_present_intf1;         /* USB device presence, interface 1 */
@@ -385,7 +386,7 @@ static int display_open(struct inode *inode, struct file *file)
                err("%s: display port is already open", __func__);
                retval = -EBUSY;
        } else {
-               ictx->display_isopen = 1;
+               ictx->display_isopen = true;
                file->private_data = ictx;
                dev_dbg(ictx->dev, "display port opened\n");
        }
@@ -422,7 +423,7 @@ static int display_close(struct inode *inode, struct file *file)
                err("%s: display is not open", __func__);
                retval = -EIO;
        } else {
-               ictx->display_isopen = 0;
+               ictx->display_isopen = false;
                dev_dbg(ictx->dev, "display port closed\n");
                if (!ictx->dev_present_intf0) {
                        /*
@@ -491,12 +492,12 @@ static int send_packet(struct imon_context *ictx)
        }
 
        init_completion(&ictx->tx.finished);
-       ictx->tx.busy = 1;
+       ictx->tx.busy = true;
        smp_rmb(); /* ensure later readers know we're busy */
 
        retval = usb_submit_urb(ictx->tx_urb, GFP_KERNEL);
        if (retval) {
-               ictx->tx.busy = 0;
+               ictx->tx.busy = false;
                smp_rmb(); /* ensure later readers know we're not busy */
                err("%s: error submitting urb(%d)", __func__, retval);
        } else {
@@ -682,7 +683,7 @@ static ssize_t store_associate_remote(struct device *d,
                return -ENODEV;
 
        mutex_lock(&ictx->lock);
-       ictx->rf_isassociating = 1;
+       ictx->rf_isassociating = true;
        send_associate_24g(ictx);
        mutex_unlock(&ictx->lock);
 
@@ -950,7 +951,7 @@ static void usb_tx_callback(struct urb *urb)
        ictx->tx.status = urb->status;
 
        /* notify waiters that write has finished */
-       ictx->tx.busy = 0;
+       ictx->tx.busy = false;
        smp_rmb(); /* ensure later readers know we're not busy */
        complete(&ictx->tx.finished);
 }
@@ -1215,7 +1216,7 @@ static bool imon_mouse_event(struct imon_context *ictx,
 {
        char rel_x = 0x00, rel_y = 0x00;
        u8 right_shift = 1;
-       bool mouse_input = 1;
+       bool mouse_input = true;
        int dir = 0;
 
        /* newer iMON device PAD or mouse button */
@@ -1246,7 +1247,7 @@ static bool imon_mouse_event(struct imon_context *ictx,
        } else if (ictx->kc == KEY_CHANNELDOWN && (buf[2] & 0x40) != 0x40) {
                dir = -1;
        } else
-               mouse_input = 0;
+               mouse_input = false;
 
        if (mouse_input) {
                dev_dbg(ictx->dev, "sending mouse data via input subsystem\n");
@@ -1450,7 +1451,7 @@ static void imon_incoming_packet(struct imon_context *ictx,
        unsigned char *buf = urb->transfer_buffer;
        struct device *dev = ictx->dev;
        u32 kc;
-       bool norelease = 0;
+       bool norelease = false;
        int i;
        u64 temp_key;
        u64 panel_key = 0;
@@ -1465,7 +1466,7 @@ static void imon_incoming_packet(struct imon_context *ictx,
        idev = ictx->idev;
 
        /* filter out junk data on the older 0xffdc imon devices */
-       if ((buf[0] == 0xff) && (buf[7] == 0xff))
+       if ((buf[0] == 0xff) && (buf[1] == 0xff) && (buf[2] == 0xff))
                return;
 
        /* Figure out what key was pressed */
@@ -1517,7 +1518,7 @@ static void imon_incoming_packet(struct imon_context *ictx,
             !(buf[1] & 0x1 || buf[1] >> 2 & 0x1))) {
                len = 8;
                imon_pad_to_keys(ictx, buf);
-               norelease = 1;
+               norelease = true;
        }
 
        if (debug) {
@@ -1580,7 +1581,7 @@ not_input_data:
            (buf[6] == 0x5E && buf[7] == 0xDF))) {      /* DT */
                dev_warn(dev, "%s: remote associated refid=%02X\n",
                         __func__, buf[1]);
-               ictx->rf_isassociating = 0;
+               ictx->rf_isassociating = false;
        }
 }
 
@@ -1790,9 +1791,9 @@ static bool imon_find_endpoints(struct imon_context *ictx,
        int ifnum = iface_desc->desc.bInterfaceNumber;
        int num_endpts = iface_desc->desc.bNumEndpoints;
        int i, ep_dir, ep_type;
-       bool ir_ep_found = 0;
-       bool display_ep_found = 0;
-       bool tx_control = 0;
+       bool ir_ep_found = false;
+       bool display_ep_found = false;
+       bool tx_control = false;
 
        /*
         * Scan the endpoint list and set:
@@ -1808,13 +1809,13 @@ static bool imon_find_endpoints(struct imon_context *ictx,
                    ep_type == USB_ENDPOINT_XFER_INT) {
 
                        rx_endpoint = ep;
-                       ir_ep_found = 1;
+                       ir_ep_found = true;
                        dev_dbg(ictx->dev, "%s: found IR endpoint\n", __func__);
 
                } else if (!display_ep_found && ep_dir == USB_DIR_OUT &&
                           ep_type == USB_ENDPOINT_XFER_INT) {
                        tx_endpoint = ep;
-                       display_ep_found = 1;
+                       display_ep_found = true;
                        dev_dbg(ictx->dev, "%s: found display endpoint\n", __func__);
                }
        }
@@ -1835,8 +1836,8 @@ static bool imon_find_endpoints(struct imon_context *ictx,
         * newer iMON devices that use control urb instead of interrupt
         */
        if (!display_ep_found) {
-               tx_control = 1;
-               display_ep_found = 1;
+               tx_control = true;
+               display_ep_found = true;
                dev_dbg(ictx->dev, "%s: device uses control endpoint, not "
                        "interface OUT endpoint\n", __func__);
        }
@@ -1847,7 +1848,7 @@ static bool imon_find_endpoints(struct imon_context *ictx,
         * and without... :\
         */
        if (ictx->display_type == IMON_DISPLAY_TYPE_NONE) {
-               display_ep_found = 0;
+               display_ep_found = false;
                dev_dbg(ictx->dev, "%s: device has no display\n", __func__);
        }
 
@@ -1856,7 +1857,7 @@ static bool imon_find_endpoints(struct imon_context *ictx,
         * that refers to e.g. /dev/lcd0 (a character device LCD or VFD).
         */
        if (ictx->display_type == IMON_DISPLAY_TYPE_VGA) {
-               display_ep_found = 0;
+               display_ep_found = false;
                dev_dbg(ictx->dev, "%s: iMON Touch device found\n", __func__);
        }
 
@@ -1905,9 +1906,10 @@ static struct imon_context *imon_init_intf0(struct usb_interface *intf)
 
        ictx->dev = dev;
        ictx->usbdev_intf0 = usb_get_dev(interface_to_usbdev(intf));
-       ictx->dev_present_intf0 = 1;
+       ictx->dev_present_intf0 = true;
        ictx->rx_urb_intf0 = rx_urb;
        ictx->tx_urb = tx_urb;
+       ictx->rf_device = false;
 
        ictx->vendor  = le16_to_cpu(ictx->usbdev_intf0->descriptor.idVendor);
        ictx->product = le16_to_cpu(ictx->usbdev_intf0->descriptor.idProduct);
@@ -1979,7 +1981,7 @@ static struct imon_context *imon_init_intf1(struct usb_interface *intf,
        }
 
        ictx->usbdev_intf1 = usb_get_dev(interface_to_usbdev(intf));
-       ictx->dev_present_intf1 = 1;
+       ictx->dev_present_intf1 = true;
        ictx->rx_urb_intf1 = rx_urb;
 
        ret = -ENODEV;
@@ -2047,6 +2049,12 @@ static void imon_get_ffdc_type(struct imon_context *ictx)
                dev_info(ictx->dev, "0xffdc iMON Knob, iMON IR");
                ictx->display_supported = false;
                break;
+       /* iMON 2.4G LT (usb stick), no display, iMON RF */
+       case 0x4e:
+               dev_info(ictx->dev, "0xffdc iMON 2.4G LT, iMON RF");
+               ictx->display_supported = false;
+               ictx->rf_device = true;
+               break;
        /* iMON VFD, no IR (does have vol knob tho) */
        case 0x35:
                dev_info(ictx->dev, "0xffdc iMON VFD + knob, no IR");
@@ -2197,15 +2205,6 @@ static int __devinit imon_probe(struct usb_interface *interface,
                        goto fail;
                }
 
-               if (product == 0xffdc) {
-                       /* RF products *also* use 0xffdc... sigh... */
-                       sysfs_err = sysfs_create_group(&interface->dev.kobj,
-                                                      &imon_rf_attribute_group);
-                       if (sysfs_err)
-                               err("%s: Could not create RF sysfs entries(%d)",
-                                   __func__, sysfs_err);
-               }
-
        } else {
        /* this is the secondary interface on the device */
                ictx = imon_init_intf1(interface, first_if_ctx);
@@ -2233,6 +2232,14 @@ static int __devinit imon_probe(struct usb_interface *interface,
 
                imon_set_display_type(ictx, interface);
 
+               if (product == 0xffdc && ictx->rf_device) {
+                       sysfs_err = sysfs_create_group(&interface->dev.kobj,
+                                                      &imon_rf_attribute_group);
+                       if (sysfs_err)
+                               err("%s: Could not create RF sysfs entries(%d)",
+                                   __func__, sysfs_err);
+               }
+
                if (ictx->display_supported)
                        imon_init_display(ictx, interface);
        }
@@ -2297,7 +2304,7 @@ static void __devexit imon_disconnect(struct usb_interface *interface)
        }
 
        if (ifnum == 0) {
-               ictx->dev_present_intf0 = 0;
+               ictx->dev_present_intf0 = false;
                usb_kill_urb(ictx->rx_urb_intf0);
                input_unregister_device(ictx->idev);
                if (ictx->display_supported) {
@@ -2307,7 +2314,7 @@ static void __devexit imon_disconnect(struct usb_interface *interface)
                                usb_deregister_dev(interface, &imon_vfd_class);
                }
        } else {
-               ictx->dev_present_intf1 = 0;
+               ictx->dev_present_intf1 = false;
                usb_kill_urb(ictx->rx_urb_intf1);
                if (ictx->display_type == IMON_DISPLAY_TYPE_VGA)
                        input_unregister_device(ictx->touch);