[media] ir-core: make struct rc_dev the primary interface
[linux-2.6-block.git] / drivers / staging / tm6000 / tm6000-input.c
index 6022caaa739b43eadc3109eae7dedc6acbfa3b1d..3517d20c13103f44821b615addbdbc5ae2a7b1c9 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/usb.h>
 
 #include <media/ir-core.h>
-#include <media/ir-common.h>
 
 #include "tm6000.h"
 #include "tm6000-regs.h"
@@ -51,8 +50,7 @@ struct tm6000_ir_poll_result {
 
 struct tm6000_IR {
        struct tm6000_core      *dev;
-       struct ir_input_dev     *input;
-       struct ir_input_state   ir;
+       struct rc_dev           *rc;
        char                    name[32];
        char                    phys[32];
 
@@ -67,7 +65,7 @@ struct tm6000_IR {
        int (*get_key) (struct tm6000_IR *, struct tm6000_ir_poll_result *);
 
        /* IR device properties */
-       struct ir_dev_props     props;
+       u64                     ir_type;
 };
 
 
@@ -145,7 +143,7 @@ static int default_polling_getkey(struct tm6000_IR *ir,
                return 0;
 
        if (&dev->int_in) {
-               if (ir->ir.ir_type == IR_TYPE_RC5)
+               if (ir->ir_type == IR_TYPE_RC5)
                        poll_result->rc_data = ir->urb_data[0];
                else
                        poll_result->rc_data = ir->urb_data[0] | ir->urb_data[1] << 8;
@@ -155,7 +153,7 @@ static int default_polling_getkey(struct tm6000_IR *ir,
                tm6000_set_reg(dev, REQ_04_EN_DISABLE_MCU_INT, 2, 1);
                msleep(10);
 
-               if (ir->ir.ir_type == IR_TYPE_RC5) {
+               if (ir->ir_type == IR_TYPE_RC5) {
                        rc = tm6000_read_write_usb(dev, USB_DIR_IN |
                                USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                                REQ_02_GET_IR_CODE, 0, 0, buf, 1);
@@ -201,10 +199,7 @@ static void tm6000_ir_handle_key(struct tm6000_IR *ir)
        dprintk("ir->get_key result data=%04x\n", poll_result.rc_data);
 
        if (ir->key) {
-               ir_input_keydown(ir->input->input_dev, &ir->ir,
-                               (u32)poll_result.rc_data);
-
-               ir_input_nokey(ir->input->input_dev, &ir->ir);
+               ir_keydown(ir->rc, poll_result.rc_data, 0);
                ir->key = 0;
        }
        return;
@@ -218,9 +213,9 @@ static void tm6000_ir_work(struct work_struct *work)
        schedule_delayed_work(&ir->work, msecs_to_jiffies(ir->polling));
 }
 
-static int tm6000_ir_start(void *priv)
+static int tm6000_ir_start(struct rc_dev *rc)
 {
-       struct tm6000_IR *ir = priv;
+       struct tm6000_IR *ir = rc->priv;
 
        INIT_DELAYED_WORK(&ir->work, tm6000_ir_work);
        schedule_delayed_work(&ir->work, 0);
@@ -228,16 +223,16 @@ static int tm6000_ir_start(void *priv)
        return 0;
 }
 
-static void tm6000_ir_stop(void *priv)
+static void tm6000_ir_stop(struct rc_dev *rc)
 {
-       struct tm6000_IR *ir = priv;
+       struct tm6000_IR *ir = rc->priv;
 
        cancel_delayed_work_sync(&ir->work);
 }
 
-int tm6000_ir_change_protocol(void *priv, u64 ir_type)
+int tm6000_ir_change_protocol(struct rc_dev *rc, u64 ir_type)
 {
-       struct tm6000_IR *ir = priv;
+       struct tm6000_IR *ir = rc->priv;
 
        ir->get_key = default_polling_getkey;
 
@@ -249,9 +244,9 @@ int tm6000_ir_change_protocol(void *priv, u64 ir_type)
 int tm6000_ir_init(struct tm6000_core *dev)
 {
        struct tm6000_IR *ir;
-       struct ir_input_dev *ir_input_dev;
+       struct rc_dev *rc;
        int err = -ENOMEM;
-       int pipe, size, rc;
+       int pipe, size;
 
        if (!enable_ir)
                return -ENODEV;
@@ -263,24 +258,22 @@ int tm6000_ir_init(struct tm6000_core *dev)
                return 0;
 
        ir = kzalloc(sizeof(*ir), GFP_KERNEL);
-       ir_input_dev = kzalloc(sizeof(*ir_input_dev), GFP_KERNEL);
-       ir_input_dev->input_dev = input_allocate_device();
-       if (!ir || !ir_input_dev || !ir_input_dev->input_dev)
-               goto err_out_free;
+       rc = rc_allocate_device();
+       if (!ir | !rc)
+               goto out;
 
        /* record handles to ourself */
        ir->dev = dev;
        dev->ir = ir;
-
-       ir->input = ir_input_dev;
+       ir->rc = rc;
 
        /* input einrichten */
-       ir->props.allowed_protos = IR_TYPE_RC5 | IR_TYPE_NEC;
-       ir->props.priv = ir;
-       ir->props.change_protocol = tm6000_ir_change_protocol;
-       ir->props.open = tm6000_ir_start;
-       ir->props.close = tm6000_ir_stop;
-       ir->props.driver_type = RC_DRIVER_SCANCODE;
+       rc->allowed_protos = IR_TYPE_RC5 | IR_TYPE_NEC;
+       rc->priv = ir;
+       rc->change_protocol = tm6000_ir_change_protocol;
+       rc->open = tm6000_ir_start;
+       rc->close = tm6000_ir_stop;
+       rc->driver_type = RC_DRIVER_SCANCODE;
 
        ir->polling = 50;
 
@@ -290,19 +283,17 @@ int tm6000_ir_init(struct tm6000_core *dev)
        usb_make_path(dev->udev, ir->phys, sizeof(ir->phys));
        strlcat(ir->phys, "/input0", sizeof(ir->phys));
 
-       tm6000_ir_change_protocol(ir, IR_TYPE_UNKNOWN);
-       err = ir_input_init(ir_input_dev->input_dev, &ir->ir, IR_TYPE_OTHER);
-       if (err < 0)
-               goto err_out_free;
-
-       ir_input_dev->input_dev->name = ir->name;
-       ir_input_dev->input_dev->phys = ir->phys;
-       ir_input_dev->input_dev->id.bustype = BUS_USB;
-       ir_input_dev->input_dev->id.version = 1;
-       ir_input_dev->input_dev->id.vendor = le16_to_cpu(dev->udev->descriptor.idVendor);
-       ir_input_dev->input_dev->id.product = le16_to_cpu(dev->udev->descriptor.idProduct);
+       tm6000_ir_change_protocol(rc, IR_TYPE_UNKNOWN);
 
-       ir_input_dev->input_dev->dev.parent = &dev->udev->dev;
+       rc->input_name = ir->name;
+       rc->input_phys = ir->phys;
+       rc->input_id.bustype = BUS_USB;
+       rc->input_id.version = 1;
+       rc->input_id.vendor = le16_to_cpu(dev->udev->descriptor.idVendor);
+       rc->input_id.product = le16_to_cpu(dev->udev->descriptor.idProduct);
+       rc->map_name = dev->ir_codes;
+       rc->driver_name = "tm6000";
+       rc->dev.parent = &dev->udev->dev;
 
        if (&dev->int_in) {
                dprintk("IR over int\n");
@@ -319,35 +310,32 @@ int tm6000_ir_init(struct tm6000_core *dev)
                ir->int_urb->transfer_buffer = kzalloc(size, GFP_KERNEL);
                if (ir->int_urb->transfer_buffer == NULL) {
                        usb_free_urb(ir->int_urb);
-                       goto err_out_stop;
+                       goto out;
                }
                dprintk("int interval: %d\n", dev->int_in.endp->desc.bInterval);
                usb_fill_int_urb(ir->int_urb, dev->udev, pipe,
                        ir->int_urb->transfer_buffer, size,
                        tm6000_ir_urb_received, dev,
                        dev->int_in.endp->desc.bInterval);
-               rc = usb_submit_urb(ir->int_urb, GFP_KERNEL);
-               if (rc) {
+               err = usb_submit_urb(ir->int_urb, GFP_KERNEL);
+               if (err) {
                        kfree(ir->int_urb->transfer_buffer);
                        usb_free_urb(ir->int_urb);
-                       err = rc;
-                       goto err_out_stop;
+                       goto out;
                }
                ir->urb_data = kzalloc(size, GFP_KERNEL);
        }
 
        /* ir register */
-       err = ir_input_register(ir->input->input_dev, dev->ir_codes,
-               &ir->props, "tm6000");
+       err = rc_register_device(rc);
        if (err)
-               goto err_out_stop;
+               goto out;
 
        return 0;
 
-err_out_stop:
+out:
        dev->ir = NULL;
-err_out_free:
-       kfree(ir_input_dev);
+       rc_free_device(rc);
        kfree(ir);
        return err;
 }
@@ -361,7 +349,7 @@ int tm6000_ir_fini(struct tm6000_core *dev)
        if (!ir)
                return 0;
 
-       ir_input_unregister(ir->input->input_dev);
+       rc_unregister_device(ir->rc);
 
        if (ir->int_urb) {
                usb_kill_urb(ir->int_urb);
@@ -372,8 +360,6 @@ int tm6000_ir_fini(struct tm6000_core *dev)
                ir->urb_data = NULL;
        }
 
-       kfree(ir->input);
-       ir->input = NULL;
        kfree(ir);
        dev->ir = NULL;