]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/media/rc/streamzap.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / media / rc / streamzap.c
similarity index 89%
rename from drivers/media/IR/streamzap.c
rename to drivers/media/rc/streamzap.c
index 3a20aef67d08f97f7f0b92b143a85a67bbe24304..e435d94c0776d657403c391f6ca0b9877f100339 100644 (file)
 #include <linux/device.h>
 #include <linux/module.h>
 #include <linux/slab.h>
-#include <linux/input.h>
 #include <linux/usb.h>
 #include <linux/usb/input.h>
-#include <media/ir-core.h>
+#include <media/rc-core.h>
 
 #define DRIVER_VERSION "1.61"
 #define DRIVER_NAME    "streamzap"
@@ -74,7 +73,7 @@ MODULE_DEVICE_TABLE(usb, streamzap_table);
 #ifdef CONFIG_IR_RC5_SZ_DECODER_MODULE
 #define load_rc5_sz_decode()    request_module("ir-rc5-sz-decoder")
 #else
-#define load_rc5_sz_decode()    0
+#define load_rc5_sz_decode()    {}
 #endif
 
 enum StreamzapDecoderState {
@@ -86,13 +85,11 @@ enum StreamzapDecoderState {
 
 /* structure to hold our device specific stuff */
 struct streamzap_ir {
-
        /* ir-core */
-       struct ir_dev_props *props;
+       struct rc_dev *rdev;
 
        /* core device info */
        struct device *dev;
-       struct input_dev *idev;
 
        /* usb */
        struct usb_device       *usbdev;
@@ -143,7 +140,7 @@ static void sz_push(struct streamzap_ir *sz, struct ir_raw_event rawir)
 {
        dev_dbg(sz->dev, "Storing %s with duration %u us\n",
                (rawir.pulse ? "pulse" : "space"), rawir.duration);
-       ir_raw_event_store_with_filter(sz->idev, &rawir);
+       ir_raw_event_store_with_filter(sz->rdev, &rawir);
 }
 
 static void sz_push_full_pulse(struct streamzap_ir *sz,
@@ -167,7 +164,7 @@ static void sz_push_full_pulse(struct streamzap_ir *sz,
                                sz->signal_start.tv_usec -
                                sz->signal_last.tv_usec);
                        rawir.duration -= sz->sum;
-                       rawir.duration *= 1000;
+                       rawir.duration = US_TO_NS(rawir.duration);
                        rawir.duration &= IR_MAX_DURATION;
                }
                sz_push(sz, rawir);
@@ -180,7 +177,7 @@ static void sz_push_full_pulse(struct streamzap_ir *sz,
        rawir.duration = ((int) value) * SZ_RESOLUTION;
        rawir.duration += SZ_RESOLUTION / 2;
        sz->sum += rawir.duration;
-       rawir.duration *= 1000;
+       rawir.duration = US_TO_NS(rawir.duration);
        rawir.duration &= IR_MAX_DURATION;
        sz_push(sz, rawir);
 }
@@ -200,7 +197,7 @@ static void sz_push_full_space(struct streamzap_ir *sz,
        rawir.duration = ((int) value) * SZ_RESOLUTION;
        rawir.duration += SZ_RESOLUTION / 2;
        sz->sum += rawir.duration;
-       rawir.duration *= 1000;
+       rawir.duration = US_TO_NS(rawir.duration);
        sz_push(sz, rawir);
 }
 
@@ -271,11 +268,12 @@ static void streamzap_callback(struct urb *urb)
                                DEFINE_IR_RAW_EVENT(rawir);
 
                                rawir.pulse = false;
-                               rawir.duration = sz->props->timeout;
+                               rawir.duration = sz->rdev->timeout;
                                sz->idle = true;
                                if (sz->timeout_enabled)
                                        sz_push(sz, rawir);
-                               ir_raw_event_handle(sz->idev);
+                               ir_raw_event_handle(sz->rdev);
+                               ir_raw_event_reset(sz->rdev);
                        } else {
                                sz_push_full_space(sz, sz->buf_in[i]);
                        }
@@ -293,62 +291,51 @@ static void streamzap_callback(struct urb *urb)
                }
        }
 
+       ir_raw_event_handle(sz->rdev);
        usb_submit_urb(urb, GFP_ATOMIC);
 
        return;
 }
 
-static struct input_dev *streamzap_init_input_dev(struct streamzap_ir *sz)
+static struct rc_dev *streamzap_init_rc_dev(struct streamzap_ir *sz)
 {
-       struct input_dev *idev;
-       struct ir_dev_props *props;
+       struct rc_dev *rdev;
        struct device *dev = sz->dev;
        int ret;
 
-       idev = input_allocate_device();
-       if (!idev) {
-               dev_err(dev, "remote input dev allocation failed\n");
-               goto idev_alloc_failed;
-       }
-
-       props = kzalloc(sizeof(struct ir_dev_props), GFP_KERNEL);
-       if (!props) {
-               dev_err(dev, "remote ir dev props allocation failed\n");
-               goto props_alloc_failed;
+       rdev = rc_allocate_device();
+       if (!rdev) {
+               dev_err(dev, "remote dev allocation failed\n");
+               goto out;
        }
 
        snprintf(sz->name, sizeof(sz->name), "Streamzap PC Remote Infrared "
                 "Receiver (%04x:%04x)",
                 le16_to_cpu(sz->usbdev->descriptor.idVendor),
                 le16_to_cpu(sz->usbdev->descriptor.idProduct));
-
-       idev->name = sz->name;
        usb_make_path(sz->usbdev, sz->phys, sizeof(sz->phys));
        strlcat(sz->phys, "/input0", sizeof(sz->phys));
-       idev->phys = sz->phys;
-
-       props->priv = sz;
-       props->driver_type = RC_DRIVER_IR_RAW;
-       props->allowed_protos = IR_TYPE_ALL;
-
-       sz->props = props;
-
-       usb_to_input_id(sz->usbdev, &idev->id);
-       idev->dev.parent = sz->dev;
 
-       ret = ir_input_register(idev, RC_MAP_STREAMZAP, props, DRIVER_NAME);
+       rdev->input_name = sz->name;
+       rdev->input_phys = sz->phys;
+       usb_to_input_id(sz->usbdev, &rdev->input_id);
+       rdev->dev.parent = dev;
+       rdev->priv = sz;
+       rdev->driver_type = RC_DRIVER_IR_RAW;
+       rdev->allowed_protos = RC_TYPE_ALL;
+       rdev->driver_name = DRIVER_NAME;
+       rdev->map_name = RC_MAP_STREAMZAP;
+
+       ret = rc_register_device(rdev);
        if (ret < 0) {
                dev_err(dev, "remote input device register failed\n");
-               goto irdev_failed;
+               goto out;
        }
 
-       return idev;
+       return rdev;
 
-irdev_failed:
-       kfree(props);
-props_alloc_failed:
-       input_free_device(idev);
-idev_alloc_failed:
+out:
+       rc_free_device(rdev);
        return NULL;
 }
 
@@ -437,21 +424,21 @@ static int __devinit streamzap_probe(struct usb_interface *intf,
                snprintf(name + strlen(name), sizeof(name) - strlen(name),
                         " %s", buf);
 
-       sz->idev = streamzap_init_input_dev(sz);
-       if (!sz->idev)
-               goto input_dev_fail;
+       sz->rdev = streamzap_init_rc_dev(sz);
+       if (!sz->rdev)
+               goto rc_dev_fail;
 
        sz->idle = true;
        sz->decoder_state = PulseSpace;
        /* FIXME: don't yet have a way to set this */
        sz->timeout_enabled = true;
-       sz->props->timeout = (((SZ_TIMEOUT * SZ_RESOLUTION * 1000) &
+       sz->rdev->timeout = ((US_TO_NS(SZ_TIMEOUT * SZ_RESOLUTION) &
                                IR_MAX_DURATION) | 0x03000000);
        #if 0
        /* not yet supported, depends on patches from maxim */
        /* see also: LIRC_GET_REC_RESOLUTION and LIRC_SET_REC_TIMEOUT */
-       sz->min_timeout = SZ_TIMEOUT * SZ_RESOLUTION * 1000;
-       sz->max_timeout = SZ_TIMEOUT * SZ_RESOLUTION * 1000;
+       sz->min_timeout = US_TO_NS(SZ_TIMEOUT * SZ_RESOLUTION);
+       sz->max_timeout = US_TO_NS(SZ_TIMEOUT * SZ_RESOLUTION);
        #endif
 
        do_gettimeofday(&sz->signal_start);
@@ -476,7 +463,7 @@ static int __devinit streamzap_probe(struct usb_interface *intf,
 
        return 0;
 
-input_dev_fail:
+rc_dev_fail:
        usb_free_urb(sz->urb_in);
 free_buf_in:
        usb_free_coherent(usbdev, maxp, sz->buf_in, sz->dma_in);
@@ -507,7 +494,7 @@ static void streamzap_disconnect(struct usb_interface *interface)
                return;
 
        sz->usbdev = NULL;
-       ir_input_unregister(sz->idev);
+       rc_unregister_device(sz->rdev);
        usb_kill_urb(sz->urb_in);
        usb_free_urb(sz->urb_in);
        usb_free_coherent(usbdev, sz->buf_in_len, sz->buf_in, sz->dma_in);