1 // SPDX-License-Identifier: GPL-2.0 2 // rc-ir-raw.c - handle IR pulse/space events 3 // 4 // Copyright (C) 2010 by Mauro Carvalho Chehab 5 6 #include <linux/export.h> 7 #include <linux/kthread.h> 8 #include <linux/mutex.h> 9 #include <linux/kmod.h> 10 #include <linux/sched.h> 11 #include "rc-core-priv.h" 12 13 /* Used to keep track of IR raw clients, protected by ir_raw_handler_lock */ 14 static LIST_HEAD(ir_raw_client_list); 15 16 /* Used to handle IR raw handler extensions */ 17 DEFINE_MUTEX(ir_raw_handler_lock); 18 static LIST_HEAD(ir_raw_handler_list); 19 static atomic64_t available_protocols = ATOMIC64_INIT(0); 20 21 static int ir_raw_event_thread(void *data) 22 { 23 struct ir_raw_event ev; 24 struct ir_raw_handler *handler; 25 struct ir_raw_event_ctrl *raw = data; 26 struct rc_dev *dev = raw->dev; 27 28 while (1) { 29 mutex_lock(&ir_raw_handler_lock); 30 while (kfifo_out(&raw->kfifo, &ev, 1)) { 31 if (is_timing_event(ev)) { 32 if (ev.duration == 0) 33 dev_warn_once(&dev->dev, "nonsensical timing event of duration 0"); 34 if (is_timing_event(raw->prev_ev) && 35 !is_transition(&ev, &raw->prev_ev)) 36 dev_warn_once(&dev->dev, "two consecutive events of type %s", 37 TO_STR(ev.pulse)); 38 if (raw->prev_ev.reset && ev.pulse == 0) 39 dev_warn_once(&dev->dev, "timing event after reset should be pulse"); 40 } 41 list_for_each_entry(handler, &ir_raw_handler_list, list) 42 if (dev->enabled_protocols & 43 handler->protocols || !handler->protocols) 44 handler->decode(dev, ev); 45 lirc_raw_event(dev, ev); 46 raw->prev_ev = ev; 47 } 48 mutex_unlock(&ir_raw_handler_lock); 49 50 set_current_state(TASK_INTERRUPTIBLE); 51 52 if (kthread_should_stop()) { 53 __set_current_state(TASK_RUNNING); 54 break; 55 } else if (!kfifo_is_empty(&raw->kfifo)) 56 set_current_state(TASK_RUNNING); 57 58 schedule(); 59 } 60 61 return 0; 62 } 63 64 /** 65 * ir_raw_event_store() - pass a pulse/space duration to the raw ir decoders 66 * @dev: the struct rc_dev device descriptor 67 * @ev: the struct ir_raw_event descriptor of the pulse/space 68 * 69 * This routine (which may be called from an interrupt context) stores a 70 * pulse/space duration for the raw ir decoding state machines. Pulses are 71 * signalled as positive values and spaces as negative values. A zero value 72 * will reset the decoding state machines. 73 */ 74 int ir_raw_event_store(struct rc_dev *dev, struct ir_raw_event *ev) 75 { 76 if (!dev->raw) 77 return -EINVAL; 78 79 dev_dbg(&dev->dev, "sample: (%05dus %s)\n", 80 ev->duration, TO_STR(ev->pulse)); 81 82 if (!kfifo_put(&dev->raw->kfifo, *ev)) { 83 dev_err(&dev->dev, "IR event FIFO is full!\n"); 84 return -ENOSPC; 85 } 86 87 return 0; 88 } 89 EXPORT_SYMBOL_GPL(ir_raw_event_store); 90 91 /** 92 * ir_raw_event_store_edge() - notify raw ir decoders of the start of a pulse/space 93 * @dev: the struct rc_dev device descriptor 94 * @pulse: true for pulse, false for space 95 * 96 * This routine (which may be called from an interrupt context) is used to 97 * store the beginning of an ir pulse or space (or the start/end of ir 98 * reception) for the raw ir decoding state machines. This is used by 99 * hardware which does not provide durations directly but only interrupts 100 * (or similar events) on state change. 101 */ 102 int ir_raw_event_store_edge(struct rc_dev *dev, bool pulse) 103 { 104 ktime_t now; 105 struct ir_raw_event ev = {}; 106 107 if (!dev->raw) 108 return -EINVAL; 109 110 now = ktime_get(); 111 ev.duration = ktime_to_us(ktime_sub(now, dev->raw->last_event)); 112 ev.pulse = !pulse; 113 114 return ir_raw_event_store_with_timeout(dev, &ev); 115 } 116 EXPORT_SYMBOL_GPL(ir_raw_event_store_edge); 117 118 /* 119 * ir_raw_event_store_with_timeout() - pass a pulse/space duration to the raw 120 * ir decoders, schedule decoding and 121 * timeout 122 * @dev: the struct rc_dev device descriptor 123 * @ev: the struct ir_raw_event descriptor of the pulse/space 124 * 125 * This routine (which may be called from an interrupt context) stores a 126 * pulse/space duration for the raw ir decoding state machines, schedules 127 * decoding and generates a timeout. 128 */ 129 int ir_raw_event_store_with_timeout(struct rc_dev *dev, struct ir_raw_event *ev) 130 { 131 ktime_t now; 132 int rc = 0; 133 134 if (!dev->raw) 135 return -EINVAL; 136 137 now = ktime_get(); 138 139 spin_lock(&dev->raw->edge_spinlock); 140 rc = ir_raw_event_store(dev, ev); 141 142 dev->raw->last_event = now; 143 144 /* timer could be set to timeout (125ms by default) */ 145 if (!timer_pending(&dev->raw->edge_handle) || 146 time_after(dev->raw->edge_handle.expires, 147 jiffies + msecs_to_jiffies(15))) { 148 mod_timer(&dev->raw->edge_handle, 149 jiffies + msecs_to_jiffies(15)); 150 } 151 spin_unlock(&dev->raw->edge_spinlock); 152 153 return rc; 154 } 155 EXPORT_SYMBOL_GPL(ir_raw_event_store_with_timeout); 156 157 /** 158 * ir_raw_event_store_with_filter() - pass next pulse/space to decoders with some processing 159 * @dev: the struct rc_dev device descriptor 160 * @ev: the event that has occurred 161 * 162 * This routine (which may be called from an interrupt context) works 163 * in similar manner to ir_raw_event_store_edge. 164 * This routine is intended for devices with limited internal buffer 165 * It automerges samples of same type, and handles timeouts. Returns non-zero 166 * if the event was added, and zero if the event was ignored due to idle 167 * processing. 168 */ 169 int ir_raw_event_store_with_filter(struct rc_dev *dev, struct ir_raw_event *ev) 170 { 171 if (!dev->raw) 172 return -EINVAL; 173 174 /* Ignore spaces in idle mode */ 175 if (dev->idle && !ev->pulse) 176 return 0; 177 else if (dev->idle) 178 ir_raw_event_set_idle(dev, false); 179 180 if (!dev->raw->this_ev.duration) 181 dev->raw->this_ev = *ev; 182 else if (ev->pulse == dev->raw->this_ev.pulse) 183 dev->raw->this_ev.duration += ev->duration; 184 else { 185 ir_raw_event_store(dev, &dev->raw->this_ev); 186 dev->raw->this_ev = *ev; 187 } 188 189 /* Enter idle mode if necessary */ 190 if (!ev->pulse && dev->timeout && 191 dev->raw->this_ev.duration >= dev->timeout) 192 ir_raw_event_set_idle(dev, true); 193 194 return 1; 195 } 196 EXPORT_SYMBOL_GPL(ir_raw_event_store_with_filter); 197 198 /** 199 * ir_raw_event_set_idle() - provide hint to rc-core when the device is idle or not 200 * @dev: the struct rc_dev device descriptor 201 * @idle: whether the device is idle or not 202 */ 203 void ir_raw_event_set_idle(struct rc_dev *dev, bool idle) 204 { 205 if (!dev->raw) 206 return; 207 208 dev_dbg(&dev->dev, "%s idle mode\n", idle ? "enter" : "leave"); 209 210 if (idle) { 211 dev->raw->this_ev.timeout = true; 212 ir_raw_event_store(dev, &dev->raw->this_ev); 213 dev->raw->this_ev = (struct ir_raw_event) {}; 214 } 215 216 if (dev->s_idle) 217 dev->s_idle(dev, idle); 218 219 dev->idle = idle; 220 } 221 EXPORT_SYMBOL_GPL(ir_raw_event_set_idle); 222 223 /** 224 * ir_raw_event_handle() - schedules the decoding of stored ir data 225 * @dev: the struct rc_dev device descriptor 226 * 227 * This routine will tell rc-core to start decoding stored ir data. 228 */ 229 void ir_raw_event_handle(struct rc_dev *dev) 230 { 231 if (!dev->raw || !dev->raw->thread) 232 return; 233 234 wake_up_process(dev->raw->thread); 235 } 236 EXPORT_SYMBOL_GPL(ir_raw_event_handle); 237 238 /* used internally by the sysfs interface */ 239 u64 240 ir_raw_get_allowed_protocols(void) 241 { 242 return atomic64_read(&available_protocols); 243 } 244 245 static int change_protocol(struct rc_dev *dev, u64 *rc_proto) 246 { 247 struct ir_raw_handler *handler; 248 u32 timeout = 0; 249 250 mutex_lock(&ir_raw_handler_lock); 251 list_for_each_entry(handler, &ir_raw_handler_list, list) { 252 if (!(dev->enabled_protocols & handler->protocols) && 253 (*rc_proto & handler->protocols) && handler->raw_register) 254 handler->raw_register(dev); 255 256 if ((dev->enabled_protocols & handler->protocols) && 257 !(*rc_proto & handler->protocols) && 258 handler->raw_unregister) 259 handler->raw_unregister(dev); 260 } 261 mutex_unlock(&ir_raw_handler_lock); 262 263 if (!dev->max_timeout) 264 return 0; 265 266 mutex_lock(&ir_raw_handler_lock); 267 list_for_each_entry(handler, &ir_raw_handler_list, list) { 268 if (handler->protocols & *rc_proto) { 269 if (timeout < handler->min_timeout) 270 timeout = handler->min_timeout; 271 } 272 } 273 mutex_unlock(&ir_raw_handler_lock); 274 275 if (timeout == 0) 276 timeout = IR_DEFAULT_TIMEOUT; 277 else 278 timeout += MS_TO_US(10); 279 280 if (timeout < dev->min_timeout) 281 timeout = dev->min_timeout; 282 else if (timeout > dev->max_timeout) 283 timeout = dev->max_timeout; 284 285 if (dev->s_timeout) 286 dev->s_timeout(dev, timeout); 287 else 288 dev->timeout = timeout; 289 290 return 0; 291 } 292 293 static void ir_raw_disable_protocols(struct rc_dev *dev, u64 protocols) 294 { 295 mutex_lock(&dev->lock); 296 dev->enabled_protocols &= ~protocols; 297 mutex_unlock(&dev->lock); 298 } 299 300 /** 301 * ir_raw_gen_manchester() - Encode data with Manchester (bi-phase) modulation. 302 * @ev: Pointer to pointer to next free event. *@ev is incremented for 303 * each raw event filled. 304 * @max: Maximum number of raw events to fill. 305 * @timings: Manchester modulation timings. 306 * @n: Number of bits of data. 307 * @data: Data bits to encode. 308 * 309 * Encodes the @n least significant bits of @data using Manchester (bi-phase) 310 * modulation with the timing characteristics described by @timings, writing up 311 * to @max raw IR events using the *@ev pointer. 312 * 313 * Returns: 0 on success. 314 * -ENOBUFS if there isn't enough space in the array to fit the 315 * full encoded data. In this case all @max events will have been 316 * written. 317 */ 318 int ir_raw_gen_manchester(struct ir_raw_event **ev, unsigned int max, 319 const struct ir_raw_timings_manchester *timings, 320 unsigned int n, u64 data) 321 { 322 bool need_pulse; 323 u64 i; 324 int ret = -ENOBUFS; 325 326 i = BIT_ULL(n - 1); 327 328 if (timings->leader_pulse) { 329 if (!max--) 330 return ret; 331 init_ir_raw_event_duration((*ev), 1, timings->leader_pulse); 332 if (timings->leader_space) { 333 if (!max--) 334 return ret; 335 init_ir_raw_event_duration(++(*ev), 0, 336 timings->leader_space); 337 } 338 } else { 339 /* continue existing signal */ 340 --(*ev); 341 } 342 /* from here on *ev will point to the last event rather than the next */ 343 344 while (n && i > 0) { 345 need_pulse = !(data & i); 346 if (timings->invert) 347 need_pulse = !need_pulse; 348 if (need_pulse == !!(*ev)->pulse) { 349 (*ev)->duration += timings->clock; 350 } else { 351 if (!max--) 352 goto nobufs; 353 init_ir_raw_event_duration(++(*ev), need_pulse, 354 timings->clock); 355 } 356 357 if (!max--) 358 goto nobufs; 359 init_ir_raw_event_duration(++(*ev), !need_pulse, 360 timings->clock); 361 i >>= 1; 362 } 363 364 if (timings->trailer_space) { 365 if (!(*ev)->pulse) 366 (*ev)->duration += timings->trailer_space; 367 else if (!max--) 368 goto nobufs; 369 else 370 init_ir_raw_event_duration(++(*ev), 0, 371 timings->trailer_space); 372 } 373 374 ret = 0; 375 nobufs: 376 /* point to the next event rather than last event before returning */ 377 ++(*ev); 378 return ret; 379 } 380 EXPORT_SYMBOL(ir_raw_gen_manchester); 381 382 /** 383 * ir_raw_gen_pd() - Encode data to raw events with pulse-distance modulation. 384 * @ev: Pointer to pointer to next free event. *@ev is incremented for 385 * each raw event filled. 386 * @max: Maximum number of raw events to fill. 387 * @timings: Pulse distance modulation timings. 388 * @n: Number of bits of data. 389 * @data: Data bits to encode. 390 * 391 * Encodes the @n least significant bits of @data using pulse-distance 392 * modulation with the timing characteristics described by @timings, writing up 393 * to @max raw IR events using the *@ev pointer. 394 * 395 * Returns: 0 on success. 396 * -ENOBUFS if there isn't enough space in the array to fit the 397 * full encoded data. In this case all @max events will have been 398 * written. 399 */ 400 int ir_raw_gen_pd(struct ir_raw_event **ev, unsigned int max, 401 const struct ir_raw_timings_pd *timings, 402 unsigned int n, u64 data) 403 { 404 int i; 405 int ret; 406 unsigned int space; 407 408 if (timings->header_pulse) { 409 ret = ir_raw_gen_pulse_space(ev, &max, timings->header_pulse, 410 timings->header_space); 411 if (ret) 412 return ret; 413 } 414 415 if (timings->msb_first) { 416 for (i = n - 1; i >= 0; --i) { 417 space = timings->bit_space[(data >> i) & 1]; 418 ret = ir_raw_gen_pulse_space(ev, &max, 419 timings->bit_pulse, 420 space); 421 if (ret) 422 return ret; 423 } 424 } else { 425 for (i = 0; i < n; ++i, data >>= 1) { 426 space = timings->bit_space[data & 1]; 427 ret = ir_raw_gen_pulse_space(ev, &max, 428 timings->bit_pulse, 429 space); 430 if (ret) 431 return ret; 432 } 433 } 434 435 ret = ir_raw_gen_pulse_space(ev, &max, timings->trailer_pulse, 436 timings->trailer_space); 437 return ret; 438 } 439 EXPORT_SYMBOL(ir_raw_gen_pd); 440 441 /** 442 * ir_raw_gen_pl() - Encode data to raw events with pulse-length modulation. 443 * @ev: Pointer to pointer to next free event. *@ev is incremented for 444 * each raw event filled. 445 * @max: Maximum number of raw events to fill. 446 * @timings: Pulse distance modulation timings. 447 * @n: Number of bits of data. 448 * @data: Data bits to encode. 449 * 450 * Encodes the @n least significant bits of @data using space-distance 451 * modulation with the timing characteristics described by @timings, writing up 452 * to @max raw IR events using the *@ev pointer. 453 * 454 * Returns: 0 on success. 455 * -ENOBUFS if there isn't enough space in the array to fit the 456 * full encoded data. In this case all @max events will have been 457 * written. 458 */ 459 int ir_raw_gen_pl(struct ir_raw_event **ev, unsigned int max, 460 const struct ir_raw_timings_pl *timings, 461 unsigned int n, u64 data) 462 { 463 int i; 464 int ret = -ENOBUFS; 465 unsigned int pulse; 466 467 if (!max--) 468 return ret; 469 470 init_ir_raw_event_duration((*ev)++, 1, timings->header_pulse); 471 472 if (timings->msb_first) { 473 for (i = n - 1; i >= 0; --i) { 474 if (!max--) 475 return ret; 476 init_ir_raw_event_duration((*ev)++, 0, 477 timings->bit_space); 478 if (!max--) 479 return ret; 480 pulse = timings->bit_pulse[(data >> i) & 1]; 481 init_ir_raw_event_duration((*ev)++, 1, pulse); 482 } 483 } else { 484 for (i = 0; i < n; ++i, data >>= 1) { 485 if (!max--) 486 return ret; 487 init_ir_raw_event_duration((*ev)++, 0, 488 timings->bit_space); 489 if (!max--) 490 return ret; 491 pulse = timings->bit_pulse[data & 1]; 492 init_ir_raw_event_duration((*ev)++, 1, pulse); 493 } 494 } 495 496 if (!max--) 497 return ret; 498 499 init_ir_raw_event_duration((*ev)++, 0, timings->trailer_space); 500 501 return 0; 502 } 503 EXPORT_SYMBOL(ir_raw_gen_pl); 504 505 /** 506 * ir_raw_encode_scancode() - Encode a scancode as raw events 507 * 508 * @protocol: protocol 509 * @scancode: scancode filter describing a single scancode 510 * @events: array of raw events to write into 511 * @max: max number of raw events 512 * 513 * Attempts to encode the scancode as raw events. 514 * 515 * Returns: The number of events written. 516 * -ENOBUFS if there isn't enough space in the array to fit the 517 * encoding. In this case all @max events will have been written. 518 * -EINVAL if the scancode is ambiguous or invalid, or if no 519 * compatible encoder was found. 520 */ 521 int ir_raw_encode_scancode(enum rc_proto protocol, u32 scancode, 522 struct ir_raw_event *events, unsigned int max) 523 { 524 struct ir_raw_handler *handler; 525 int ret = -EINVAL; 526 u64 mask = 1ULL << protocol; 527 528 ir_raw_load_modules(&mask); 529 530 mutex_lock(&ir_raw_handler_lock); 531 list_for_each_entry(handler, &ir_raw_handler_list, list) { 532 if (handler->protocols & mask && handler->encode) { 533 ret = handler->encode(protocol, scancode, events, max); 534 if (ret >= 0 || ret == -ENOBUFS) 535 break; 536 } 537 } 538 mutex_unlock(&ir_raw_handler_lock); 539 540 return ret; 541 } 542 EXPORT_SYMBOL(ir_raw_encode_scancode); 543 544 /** 545 * ir_raw_edge_handle() - Handle ir_raw_event_store_edge() processing 546 * 547 * @t: timer_list 548 * 549 * This callback is armed by ir_raw_event_store_edge(). It does two things: 550 * first of all, rather than calling ir_raw_event_handle() for each 551 * edge and waking up the rc thread, 15 ms after the first edge 552 * ir_raw_event_handle() is called. Secondly, generate a timeout event 553 * no more IR is received after the rc_dev timeout. 554 */ 555 static void ir_raw_edge_handle(struct timer_list *t) 556 { 557 struct ir_raw_event_ctrl *raw = from_timer(raw, t, edge_handle); 558 struct rc_dev *dev = raw->dev; 559 unsigned long flags; 560 ktime_t interval; 561 562 spin_lock_irqsave(&dev->raw->edge_spinlock, flags); 563 interval = ktime_sub(ktime_get(), dev->raw->last_event); 564 if (ktime_to_us(interval) >= dev->timeout) { 565 struct ir_raw_event ev = { 566 .timeout = true, 567 .duration = ktime_to_us(interval) 568 }; 569 570 ir_raw_event_store(dev, &ev); 571 } else { 572 mod_timer(&dev->raw->edge_handle, 573 jiffies + usecs_to_jiffies(dev->timeout - 574 ktime_to_us(interval))); 575 } 576 spin_unlock_irqrestore(&dev->raw->edge_spinlock, flags); 577 578 ir_raw_event_handle(dev); 579 } 580 581 /** 582 * ir_raw_encode_carrier() - Get carrier used for protocol 583 * 584 * @protocol: protocol 585 * 586 * Attempts to find the carrier for the specified protocol 587 * 588 * Returns: The carrier in Hz 589 * -EINVAL if the protocol is invalid, or if no 590 * compatible encoder was found. 591 */ 592 int ir_raw_encode_carrier(enum rc_proto protocol) 593 { 594 struct ir_raw_handler *handler; 595 int ret = -EINVAL; 596 u64 mask = BIT_ULL(protocol); 597 598 mutex_lock(&ir_raw_handler_lock); 599 list_for_each_entry(handler, &ir_raw_handler_list, list) { 600 if (handler->protocols & mask && handler->encode) { 601 ret = handler->carrier; 602 break; 603 } 604 } 605 mutex_unlock(&ir_raw_handler_lock); 606 607 return ret; 608 } 609 EXPORT_SYMBOL(ir_raw_encode_carrier); 610 611 /* 612 * Used to (un)register raw event clients 613 */ 614 int ir_raw_event_prepare(struct rc_dev *dev) 615 { 616 if (!dev) 617 return -EINVAL; 618 619 dev->raw = kzalloc(sizeof(*dev->raw), GFP_KERNEL); 620 if (!dev->raw) 621 return -ENOMEM; 622 623 dev->raw->dev = dev; 624 dev->change_protocol = change_protocol; 625 dev->idle = true; 626 spin_lock_init(&dev->raw->edge_spinlock); 627 timer_setup(&dev->raw->edge_handle, ir_raw_edge_handle, 0); 628 INIT_KFIFO(dev->raw->kfifo); 629 630 return 0; 631 } 632 633 int ir_raw_event_register(struct rc_dev *dev) 634 { 635 struct task_struct *thread; 636 637 thread = kthread_run(ir_raw_event_thread, dev->raw, "rc%u", dev->minor); 638 if (IS_ERR(thread)) 639 return PTR_ERR(thread); 640 641 dev->raw->thread = thread; 642 643 mutex_lock(&ir_raw_handler_lock); 644 list_add_tail(&dev->raw->list, &ir_raw_client_list); 645 mutex_unlock(&ir_raw_handler_lock); 646 647 return 0; 648 } 649 650 void ir_raw_event_free(struct rc_dev *dev) 651 { 652 if (!dev) 653 return; 654 655 kfree(dev->raw); 656 dev->raw = NULL; 657 } 658 659 void ir_raw_event_unregister(struct rc_dev *dev) 660 { 661 struct ir_raw_handler *handler; 662 663 if (!dev || !dev->raw) 664 return; 665 666 kthread_stop(dev->raw->thread); 667 del_timer_sync(&dev->raw->edge_handle); 668 669 mutex_lock(&ir_raw_handler_lock); 670 list_del(&dev->raw->list); 671 list_for_each_entry(handler, &ir_raw_handler_list, list) 672 if (handler->raw_unregister && 673 (handler->protocols & dev->enabled_protocols)) 674 handler->raw_unregister(dev); 675 676 lirc_bpf_free(dev); 677 678 ir_raw_event_free(dev); 679 680 /* 681 * A user can be calling bpf(BPF_PROG_{QUERY|ATTACH|DETACH}), so 682 * ensure that the raw member is null on unlock; this is how 683 * "device gone" is checked. 684 */ 685 mutex_unlock(&ir_raw_handler_lock); 686 } 687 688 /* 689 * Extension interface - used to register the IR decoders 690 */ 691 692 int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler) 693 { 694 mutex_lock(&ir_raw_handler_lock); 695 list_add_tail(&ir_raw_handler->list, &ir_raw_handler_list); 696 atomic64_or(ir_raw_handler->protocols, &available_protocols); 697 mutex_unlock(&ir_raw_handler_lock); 698 699 return 0; 700 } 701 EXPORT_SYMBOL(ir_raw_handler_register); 702 703 void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler) 704 { 705 struct ir_raw_event_ctrl *raw; 706 u64 protocols = ir_raw_handler->protocols; 707 708 mutex_lock(&ir_raw_handler_lock); 709 list_del(&ir_raw_handler->list); 710 list_for_each_entry(raw, &ir_raw_client_list, list) { 711 if (ir_raw_handler->raw_unregister && 712 (raw->dev->enabled_protocols & protocols)) 713 ir_raw_handler->raw_unregister(raw->dev); 714 ir_raw_disable_protocols(raw->dev, protocols); 715 } 716 atomic64_andnot(protocols, &available_protocols); 717 mutex_unlock(&ir_raw_handler_lock); 718 } 719 EXPORT_SYMBOL(ir_raw_handler_unregister); 720