V4L/DVB: ir-core: move decoding state to ir_raw_event_ctrl
[deliverable/linux.git] / drivers / media / IR / ir-rc5-decoder.c
index bdfa404a6537f47102ebef551a5013cb1855a74c..df4770d978ad835201ec31341d122f3011db9427 100644 (file)
 #define RC5_BIT_END            (1 * RC5_UNIT)
 #define RC5X_SPACE             (4 * RC5_UNIT)
 
-/* Used to register rc5_decoder clients */
-static LIST_HEAD(decoder_list);
-static DEFINE_SPINLOCK(decoder_lock);
-
 enum rc5_state {
        STATE_INACTIVE,
        STATE_BIT_START,
@@ -42,39 +38,6 @@ enum rc5_state {
        STATE_FINISHED,
 };
 
-struct decoder_data {
-       struct list_head        list;
-       struct ir_input_dev     *ir_dev;
-
-       /* State machine control */
-       enum rc5_state          state;
-       u32                     rc5_bits;
-       struct ir_raw_event     prev_ev;
-       unsigned                count;
-       unsigned                wanted_bits;
-};
-
-
-/**
- * get_decoder_data()  - gets decoder data
- * @input_dev: input device
- *
- * Returns the struct decoder_data that corresponds to a device
- */
-
-static struct decoder_data *get_decoder_data(struct  ir_input_dev *ir_dev)
-{
-       struct decoder_data *data = NULL;
-
-       spin_lock(&decoder_lock);
-       list_for_each_entry(data, &decoder_list, list) {
-               if (data->ir_dev == ir_dev)
-                       break;
-       }
-       spin_unlock(&decoder_lock);
-       return data;
-}
-
 /**
  * ir_rc5_decode() - Decode one RC-5 pulse or space
  * @input_dev: the struct input_dev descriptor of the device
@@ -84,15 +47,11 @@ static struct decoder_data *get_decoder_data(struct  ir_input_dev *ir_dev)
  */
 static int ir_rc5_decode(struct input_dev *input_dev, struct ir_raw_event ev)
 {
-       struct decoder_data *data;
        struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
+       struct rc5_dec *data = &ir_dev->raw->rc5;
        u8 toggle;
        u32 scancode;
 
-       data = get_decoder_data(ir_dev);
-       if (!data)
-               return -EINVAL;
-
         if (!(ir_dev->raw->enabled_protocols & IR_TYPE_RC5))
                 return 0;
 
@@ -128,16 +87,15 @@ again:
                if (!eq_margin(ev.duration, RC5_BIT_START, RC5_UNIT / 2))
                        break;
 
-               data->rc5_bits <<= 1;
+               data->bits <<= 1;
                if (!ev.pulse)
-                       data->rc5_bits |= 1;
+                       data->bits |= 1;
                data->count++;
-               data->prev_ev = ev;
                data->state = STATE_BIT_END;
                return 0;
 
        case STATE_BIT_END:
-               if (!is_transition(&ev, &data->prev_ev))
+               if (!is_transition(&ev, &ir_dev->raw->prev_ev))
                        break;
 
                if (data->count == data->wanted_bits)
@@ -169,11 +127,11 @@ again:
                if (data->wanted_bits == RC5X_NBITS) {
                        /* RC5X */
                        u8 xdata, command, system;
-                       xdata    = (data->rc5_bits & 0x0003F) >> 0;
-                       command  = (data->rc5_bits & 0x00FC0) >> 6;
-                       system   = (data->rc5_bits & 0x1F000) >> 12;
-                       toggle   = (data->rc5_bits & 0x20000) ? 1 : 0;
-                       command += (data->rc5_bits & 0x01000) ? 0 : 0x40;
+                       xdata    = (data->bits & 0x0003F) >> 0;
+                       command  = (data->bits & 0x00FC0) >> 6;
+                       system   = (data->bits & 0x1F000) >> 12;
+                       toggle   = (data->bits & 0x20000) ? 1 : 0;
+                       command += (data->bits & 0x01000) ? 0 : 0x40;
                        scancode = system << 16 | command << 8 | xdata;
 
                        IR_dprintk(1, "RC5X scancode 0x%06x (toggle: %u)\n",
@@ -182,10 +140,10 @@ again:
                } else {
                        /* RC5 */
                        u8 command, system;
-                       command  = (data->rc5_bits & 0x0003F) >> 0;
-                       system   = (data->rc5_bits & 0x007C0) >> 6;
-                       toggle   = (data->rc5_bits & 0x00800) ? 1 : 0;
-                       command += (data->rc5_bits & 0x01000) ? 0 : 0x40;
+                       command  = (data->bits & 0x0003F) >> 0;
+                       system   = (data->bits & 0x007C0) >> 6;
+                       toggle   = (data->bits & 0x00800) ? 1 : 0;
+                       command += (data->bits & 0x01000) ? 0 : 0x40;
                        scancode = system << 8 | command;
 
                        IR_dprintk(1, "RC5 scancode 0x%04x (toggle: %u)\n",
@@ -204,45 +162,9 @@ out:
        return -EINVAL;
 }
 
-static int ir_rc5_register(struct input_dev *input_dev)
-{
-       struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
-       struct decoder_data *data;
-
-       data = kzalloc(sizeof(*data), GFP_KERNEL);
-       if (!data)
-               return -ENOMEM;
-
-       data->ir_dev = ir_dev;
-
-       spin_lock(&decoder_lock);
-       list_add_tail(&data->list, &decoder_list);
-       spin_unlock(&decoder_lock);
-
-       return 0;
-}
-
-static int ir_rc5_unregister(struct input_dev *input_dev)
-{
-       struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
-       static struct decoder_data *data;
-
-       data = get_decoder_data(ir_dev);
-       if (!data)
-               return 0;
-
-       spin_lock(&decoder_lock);
-       list_del(&data->list);
-       spin_unlock(&decoder_lock);
-
-       return 0;
-}
-
 static struct ir_raw_handler rc5_handler = {
        .protocols      = IR_TYPE_RC5,
        .decode         = ir_rc5_decode,
-       .raw_register   = ir_rc5_register,
-       .raw_unregister = ir_rc5_unregister,
 };
 
 static int __init ir_rc5_decode_init(void)
This page took 0.026236 seconds and 5 git commands to generate.