.decode         = ir_imon_decode,
        .encode         = ir_imon_encode,
        .carrier        = 38000,
+       .min_timeout    = IMON_UNIT * IMON_BITS * 2,
 };
 
 static int __init ir_imon_decode_init(void)
 
        .decode         = ir_jvc_decode,
        .encode         = ir_jvc_encode,
        .carrier        = 38000,
+       .min_timeout    = JVC_TRAILER_SPACE,
 };
 
 static int __init ir_jvc_decode_init(void)
 
        .raw_register   = ir_mce_kbd_register,
        .raw_unregister = ir_mce_kbd_unregister,
        .carrier        = 36000,
+       .min_timeout    = MCIR2_MAX_LEN + MCIR2_UNIT / 2,
 };
 
 static int __init ir_mce_kbd_decode_init(void)
 
        .decode         = ir_nec_decode,
        .encode         = ir_nec_encode,
        .carrier        = 38000,
+       .min_timeout    = NEC_TRAILER_SPACE,
 };
 
 static int __init ir_nec_decode_init(void)
 
        .decode         = ir_rc5_decode,
        .encode         = ir_rc5_encode,
        .carrier        = 36000,
+       .min_timeout    = RC5_TRAILER,
 };
 
 static int __init ir_rc5_decode_init(void)
 
        .decode         = ir_rc6_decode,
        .encode         = ir_rc6_encode,
        .carrier        = 36000,
+       .min_timeout    = RC6_SUFFIX_SPACE,
 };
 
 static int __init ir_rc6_decode_init(void)
 
        .decode         = ir_sanyo_decode,
        .encode         = ir_sanyo_encode,
        .carrier        = 38000,
+       .min_timeout    = SANYO_TRAILER_SPACE,
 };
 
 static int __init ir_sanyo_decode_init(void)
 
        .decode         = ir_sharp_decode,
        .encode         = ir_sharp_encode,
        .carrier        = 38000,
+       .min_timeout    = SHARP_ECHO_SPACE + SHARP_ECHO_SPACE / 4,
 };
 
 static int __init ir_sharp_decode_init(void)
 
        .decode         = ir_sony_decode,
        .encode         = ir_sony_encode,
        .carrier        = 40000,
+       .min_timeout    = SONY_TRAILER_SPACE,
 };
 
 static int __init ir_sony_decode_init(void)
 
 static struct ir_raw_handler xmp_handler = {
        .protocols      = RC_PROTO_BIT_XMP,
        .decode         = ir_xmp_decode,
+       .min_timeout    = XMP_TRAILER_SPACE,
 };
 
 static int __init ir_xmp_decode_init(void)
 
        int (*encode)(enum rc_proto protocol, u32 scancode,
                      struct ir_raw_event *events, unsigned int max);
        u32 carrier;
+       u32 min_timeout;
 
        /* These two should only be used by the mce kbd decoder */
        int (*raw_register)(struct rc_dev *dev);
 
 
 static int change_protocol(struct rc_dev *dev, u64 *rc_proto)
 {
-       /* the caller will update dev->enabled_protocols */
+       struct ir_raw_handler *handler;
+       u32 timeout = 0;
+
+       if (!dev->max_timeout)
+               return 0;
+
+       mutex_lock(&ir_raw_handler_lock);
+       list_for_each_entry(handler, &ir_raw_handler_list, list) {
+               if (handler->protocols & *rc_proto) {
+                       if (timeout < handler->min_timeout)
+                               timeout = handler->min_timeout;
+               }
+       }
+       mutex_unlock(&ir_raw_handler_lock);
+
+       if (timeout == 0)
+               timeout = IR_DEFAULT_TIMEOUT;
+       else
+               timeout += MS_TO_NS(10);
+
+       if (timeout < dev->min_timeout)
+               timeout = dev->min_timeout;
+       else if (timeout > dev->max_timeout)
+               timeout = dev->max_timeout;
+
+       if (dev->s_timeout)
+               dev->s_timeout(dev, timeout);
+       else
+               dev->timeout = timeout;
+
        return 0;
 }
 
 
        if (rc < 0)
                goto out;
 
+       if (dev->driver_type == RC_DRIVER_IR_RAW)
+               ir_raw_load_modules(&new_protocols);
+
        rc = dev->change_protocol(dev, &new_protocols);
        if (rc < 0) {
                dev_dbg(&dev->dev, "Error setting protocols to 0x%llx\n",
                goto out;
        }
 
-       if (dev->driver_type == RC_DRIVER_IR_RAW)
-               ir_raw_load_modules(&new_protocols);
-
        if (new_protocols != old_protocols) {
                *current_protocols = new_protocols;
                dev_dbg(&dev->dev, "Protocols changed to 0x%llx\n",
        if (dev->driver_type == RC_DRIVER_SCANCODE && !dev->change_protocol)
                dev->enabled_protocols = dev->allowed_protocols;
 
+       if (dev->driver_type == RC_DRIVER_IR_RAW)
+               ir_raw_load_modules(&rc_proto);
+
        if (dev->change_protocol) {
                rc = dev->change_protocol(dev, &rc_proto);
                if (rc < 0)
                dev->enabled_protocols = rc_proto;
        }
 
-       if (dev->driver_type == RC_DRIVER_IR_RAW)
-               ir_raw_load_modules(&rc_proto);
-
        set_bit(EV_KEY, dev->input_dev->evbit);
        set_bit(EV_REP, dev->input_dev->evbit);
        set_bit(EV_MSC, dev->input_dev->evbit);