Lines Matching +full:no +full:- +full:sd

1 // SPDX-License-Identifier: GPL-2.0-or-later
13 #include <media/drv-intf/cx25840.h>
14 #include <media/rc-core.h>
16 #include "cx25840-core.h"
114 static inline struct cx25840_ir_state *to_ir_state(struct v4l2_subdev *sd) in to_ir_state() argument
116 struct cx25840_state *state = to_state(sd); in to_ir_state()
117 return state ? state->ir_state : NULL; in to_ir_state()
135 d--; in count_to_clock_divider()
313 count--; in pulse_clocks_to_clock_divider()
391 if (*carrier_range_high > DIV_ROUND_CLOSEST(c16, 16 - 3)) { in control_rx_s_carrier_window()
393 *carrier_range_high = DIV_ROUND_CLOSEST(c16, 16 - 4); in control_rx_s_carrier_window()
396 *carrier_range_high = DIV_ROUND_CLOSEST(c16, 16 - 3); in control_rx_s_carrier_window()
464 n--; in cduty_tx_s_duty_cycle()
484 static inline void irqenable_rx(struct v4l2_subdev *sd, u32 mask) in irqenable_rx() argument
486 struct cx25840_state *state = to_state(sd); in irqenable_rx()
491 cx25840_and_or4(state->c, CX25840_IR_IRQEN_REG, in irqenable_rx()
495 static inline void irqenable_tx(struct v4l2_subdev *sd, u32 mask) in irqenable_tx() argument
497 struct cx25840_state *state = to_state(sd); in irqenable_tx()
502 cx25840_and_or4(state->c, CX25840_IR_IRQEN_REG, ~IRQEN_TSE, mask); in irqenable_tx()
508 int cx25840_ir_irq_handler(struct v4l2_subdev *sd, u32 status, bool *handled) in cx25840_ir_irq_handler() argument
510 struct cx25840_state *state = to_state(sd); in cx25840_ir_irq_handler()
511 struct cx25840_ir_state *ir_state = to_ir_state(sd); in cx25840_ir_irq_handler()
523 return -ENODEV; in cx25840_ir_irq_handler()
525 c = ir_state->c; in cx25840_ir_irq_handler()
529 return -ENODEV; in cx25840_ir_irq_handler()
547 v4l2_dbg(2, ir_debug, sd, "IR IRQ Status: %s %s %s %s %s %s\n", in cx25840_ir_irq_handler()
553 v4l2_dbg(2, ir_debug, sd, "IR IRQ Enables: %s %s %s %s\n", in cx25840_ir_irq_handler()
572 irqenable_tx(sd, 0); in cx25840_ir_irq_handler()
574 v4l2_subdev_notify(sd, V4L2_SUBDEV_IR_TX_NOTIFY, &events); in cx25840_ir_irq_handler()
599 k = kfifo_in_locked(&ir_state->rx_kfifo, in cx25840_ir_irq_handler()
601 &ir_state->rx_kfifo_lock); in cx25840_ir_irq_handler()
612 v4l2_err(sd, "IR receiver software FIFO overrun\n"); in cx25840_ir_irq_handler()
621 v4l2_err(sd, "IR receiver hardware FIFO overrun\n"); in cx25840_ir_irq_handler()
637 spin_lock_irqsave(&ir_state->rx_kfifo_lock, flags); in cx25840_ir_irq_handler()
638 if (kfifo_len(&ir_state->rx_kfifo) >= CX25840_IR_RX_KFIFO_SIZE / 2) in cx25840_ir_irq_handler()
640 spin_unlock_irqrestore(&ir_state->rx_kfifo_lock, flags); in cx25840_ir_irq_handler()
643 v4l2_subdev_notify(sd, V4L2_SUBDEV_IR_RX_NOTIFY, &events); in cx25840_ir_irq_handler()
648 static int cx25840_ir_rx_read(struct v4l2_subdev *sd, u8 *buf, size_t count, in cx25840_ir_rx_read() argument
651 struct cx25840_ir_state *ir_state = to_ir_state(sd); in cx25840_ir_rx_read()
659 return -ENODEV; in cx25840_ir_rx_read()
661 invert = (bool) atomic_read(&ir_state->rx_invert); in cx25840_ir_rx_read()
662 divider = (u16) atomic_read(&ir_state->rxclk_divider); in cx25840_ir_rx_read()
671 n = kfifo_out_locked(&ir_state->rx_kfifo, buf, n, in cx25840_ir_rx_read()
672 &ir_state->rx_kfifo_lock); in cx25840_ir_rx_read()
679 if ((p->hw_fifo_data & FIFO_RXTX_RTO) == FIFO_RXTX_RTO) { in cx25840_ir_rx_read()
680 /* Assume RTO was because of no IR light input */ in cx25840_ir_rx_read()
684 u = (p->hw_fifo_data & FIFO_RXTX_LVL) ? 1 : 0; in cx25840_ir_rx_read()
691 (u16)(p->hw_fifo_data & FIFO_RXTX), divider) / 1000; in cx25840_ir_rx_read()
695 p->ir_core_data = (struct ir_raw_event) in cx25840_ir_rx_read()
698 v4l2_dbg(2, ir_debug, sd, "rx read: %10u ns %s %s\n", in cx25840_ir_rx_read()
701 v4l2_dbg(2, ir_debug, sd, "rx read: end of rx\n"); in cx25840_ir_rx_read()
706 static int cx25840_ir_rx_g_parameters(struct v4l2_subdev *sd, in cx25840_ir_rx_g_parameters() argument
709 struct cx25840_ir_state *ir_state = to_ir_state(sd); in cx25840_ir_rx_g_parameters()
712 return -ENODEV; in cx25840_ir_rx_g_parameters()
714 mutex_lock(&ir_state->rx_params_lock); in cx25840_ir_rx_g_parameters()
715 memcpy(p, &ir_state->rx_params, in cx25840_ir_rx_g_parameters()
717 mutex_unlock(&ir_state->rx_params_lock); in cx25840_ir_rx_g_parameters()
721 static int cx25840_ir_rx_shutdown(struct v4l2_subdev *sd) in cx25840_ir_rx_shutdown() argument
723 struct cx25840_ir_state *ir_state = to_ir_state(sd); in cx25840_ir_rx_shutdown()
727 return -ENODEV; in cx25840_ir_rx_shutdown()
729 c = ir_state->c; in cx25840_ir_rx_shutdown()
730 mutex_lock(&ir_state->rx_params_lock); in cx25840_ir_rx_shutdown()
733 irqenable_rx(sd, 0); in cx25840_ir_rx_shutdown()
740 ir_state->rx_params.shutdown = true; in cx25840_ir_rx_shutdown()
742 mutex_unlock(&ir_state->rx_params_lock); in cx25840_ir_rx_shutdown()
746 static int cx25840_ir_rx_s_parameters(struct v4l2_subdev *sd, in cx25840_ir_rx_s_parameters() argument
749 struct cx25840_ir_state *ir_state = to_ir_state(sd); in cx25840_ir_rx_s_parameters()
755 return -ENODEV; in cx25840_ir_rx_s_parameters()
757 if (p->shutdown) in cx25840_ir_rx_s_parameters()
758 return cx25840_ir_rx_shutdown(sd); in cx25840_ir_rx_s_parameters()
760 if (p->mode != V4L2_SUBDEV_IR_MODE_PULSE_WIDTH) in cx25840_ir_rx_s_parameters()
761 return -ENOSYS; in cx25840_ir_rx_s_parameters()
763 c = ir_state->c; in cx25840_ir_rx_s_parameters()
764 o = &ir_state->rx_params; in cx25840_ir_rx_s_parameters()
766 mutex_lock(&ir_state->rx_params_lock); in cx25840_ir_rx_s_parameters()
768 o->shutdown = p->shutdown; in cx25840_ir_rx_s_parameters()
770 p->mode = V4L2_SUBDEV_IR_MODE_PULSE_WIDTH; in cx25840_ir_rx_s_parameters()
771 o->mode = p->mode; in cx25840_ir_rx_s_parameters()
773 p->bytes_per_data_element = sizeof(union cx25840_ir_fifo_rec); in cx25840_ir_rx_s_parameters()
774 o->bytes_per_data_element = p->bytes_per_data_element; in cx25840_ir_rx_s_parameters()
777 irqenable_rx(sd, 0); in cx25840_ir_rx_s_parameters()
780 control_rx_demodulation_enable(c, p->modulation); in cx25840_ir_rx_s_parameters()
781 o->modulation = p->modulation; in cx25840_ir_rx_s_parameters()
783 if (p->modulation) { in cx25840_ir_rx_s_parameters()
784 p->carrier_freq = rxclk_rx_s_carrier(c, p->carrier_freq, in cx25840_ir_rx_s_parameters()
787 o->carrier_freq = p->carrier_freq; in cx25840_ir_rx_s_parameters()
789 p->duty_cycle = 50; in cx25840_ir_rx_s_parameters()
790 o->duty_cycle = p->duty_cycle; in cx25840_ir_rx_s_parameters()
792 control_rx_s_carrier_window(c, p->carrier_freq, in cx25840_ir_rx_s_parameters()
793 &p->carrier_range_lower, in cx25840_ir_rx_s_parameters()
794 &p->carrier_range_upper); in cx25840_ir_rx_s_parameters()
795 o->carrier_range_lower = p->carrier_range_lower; in cx25840_ir_rx_s_parameters()
796 o->carrier_range_upper = p->carrier_range_upper; in cx25840_ir_rx_s_parameters()
798 p->max_pulse_width = in cx25840_ir_rx_s_parameters()
801 p->max_pulse_width = in cx25840_ir_rx_s_parameters()
802 rxclk_rx_s_max_pulse_width(c, p->max_pulse_width, in cx25840_ir_rx_s_parameters()
805 o->max_pulse_width = p->max_pulse_width; in cx25840_ir_rx_s_parameters()
806 atomic_set(&ir_state->rxclk_divider, rxclk_divider); in cx25840_ir_rx_s_parameters()
808 p->noise_filter_min_width = in cx25840_ir_rx_s_parameters()
809 filter_rx_s_min_width(c, p->noise_filter_min_width); in cx25840_ir_rx_s_parameters()
810 o->noise_filter_min_width = p->noise_filter_min_width; in cx25840_ir_rx_s_parameters()
812 p->resolution = clock_divider_to_resolution(rxclk_divider); in cx25840_ir_rx_s_parameters()
813 o->resolution = p->resolution; in cx25840_ir_rx_s_parameters()
815 /* FIXME - make this dependent on resolution for better performance */ in cx25840_ir_rx_s_parameters()
820 o->invert_level = p->invert_level; in cx25840_ir_rx_s_parameters()
821 atomic_set(&ir_state->rx_invert, p->invert_level); in cx25840_ir_rx_s_parameters()
823 o->interrupt_enable = p->interrupt_enable; in cx25840_ir_rx_s_parameters()
824 o->enable = p->enable; in cx25840_ir_rx_s_parameters()
825 if (p->enable) { in cx25840_ir_rx_s_parameters()
828 spin_lock_irqsave(&ir_state->rx_kfifo_lock, flags); in cx25840_ir_rx_s_parameters()
829 kfifo_reset(&ir_state->rx_kfifo); in cx25840_ir_rx_s_parameters()
830 spin_unlock_irqrestore(&ir_state->rx_kfifo_lock, flags); in cx25840_ir_rx_s_parameters()
831 if (p->interrupt_enable) in cx25840_ir_rx_s_parameters()
832 irqenable_rx(sd, IRQEN_RSE | IRQEN_RTE | IRQEN_ROE); in cx25840_ir_rx_s_parameters()
833 control_rx_enable(c, p->enable); in cx25840_ir_rx_s_parameters()
836 mutex_unlock(&ir_state->rx_params_lock); in cx25840_ir_rx_s_parameters()
841 static int cx25840_ir_tx_write(struct v4l2_subdev *sd, u8 *buf, size_t count, in cx25840_ir_tx_write() argument
844 struct cx25840_ir_state *ir_state = to_ir_state(sd); in cx25840_ir_tx_write()
847 return -ENODEV; in cx25840_ir_tx_write()
851 * FIXME - the code below is an incomplete and untested sketch of what in cx25840_ir_tx_write()
857 * tx_kfifo - don't let it happen and let the caller know not all his in cx25840_ir_tx_write()
866 n = CX25840_IR_TX_KFIFO_SIZE - kfifo_len(ir_state->tx_kfifo); in cx25840_ir_tx_write()
870 /* FIXME - turn on Tx Fifo service interrupt in cx25840_ir_tx_write()
879 ir_state->txclk_divider); in cx25840_ir_tx_write()
884 kfifo_put(ir_state->tx_kfifo, (u8 *) fifo_pulse, in cx25840_ir_tx_write()
890 irqenable_tx(sd, IRQEN_TSE); in cx25840_ir_tx_write()
896 static int cx25840_ir_tx_g_parameters(struct v4l2_subdev *sd, in cx25840_ir_tx_g_parameters() argument
899 struct cx25840_ir_state *ir_state = to_ir_state(sd); in cx25840_ir_tx_g_parameters()
902 return -ENODEV; in cx25840_ir_tx_g_parameters()
904 mutex_lock(&ir_state->tx_params_lock); in cx25840_ir_tx_g_parameters()
905 memcpy(p, &ir_state->tx_params, in cx25840_ir_tx_g_parameters()
907 mutex_unlock(&ir_state->tx_params_lock); in cx25840_ir_tx_g_parameters()
911 static int cx25840_ir_tx_shutdown(struct v4l2_subdev *sd) in cx25840_ir_tx_shutdown() argument
913 struct cx25840_ir_state *ir_state = to_ir_state(sd); in cx25840_ir_tx_shutdown()
917 return -ENODEV; in cx25840_ir_tx_shutdown()
919 c = ir_state->c; in cx25840_ir_tx_shutdown()
920 mutex_lock(&ir_state->tx_params_lock); in cx25840_ir_tx_shutdown()
923 irqenable_tx(sd, 0); in cx25840_ir_tx_shutdown()
928 ir_state->tx_params.shutdown = true; in cx25840_ir_tx_shutdown()
930 mutex_unlock(&ir_state->tx_params_lock); in cx25840_ir_tx_shutdown()
934 static int cx25840_ir_tx_s_parameters(struct v4l2_subdev *sd, in cx25840_ir_tx_s_parameters() argument
937 struct cx25840_ir_state *ir_state = to_ir_state(sd); in cx25840_ir_tx_s_parameters()
943 return -ENODEV; in cx25840_ir_tx_s_parameters()
945 if (p->shutdown) in cx25840_ir_tx_s_parameters()
946 return cx25840_ir_tx_shutdown(sd); in cx25840_ir_tx_s_parameters()
948 if (p->mode != V4L2_SUBDEV_IR_MODE_PULSE_WIDTH) in cx25840_ir_tx_s_parameters()
949 return -ENOSYS; in cx25840_ir_tx_s_parameters()
951 c = ir_state->c; in cx25840_ir_tx_s_parameters()
952 o = &ir_state->tx_params; in cx25840_ir_tx_s_parameters()
953 mutex_lock(&ir_state->tx_params_lock); in cx25840_ir_tx_s_parameters()
955 o->shutdown = p->shutdown; in cx25840_ir_tx_s_parameters()
957 p->mode = V4L2_SUBDEV_IR_MODE_PULSE_WIDTH; in cx25840_ir_tx_s_parameters()
958 o->mode = p->mode; in cx25840_ir_tx_s_parameters()
960 p->bytes_per_data_element = sizeof(union cx25840_ir_fifo_rec); in cx25840_ir_tx_s_parameters()
961 o->bytes_per_data_element = p->bytes_per_data_element; in cx25840_ir_tx_s_parameters()
964 irqenable_tx(sd, 0); in cx25840_ir_tx_s_parameters()
967 control_tx_modulation_enable(c, p->modulation); in cx25840_ir_tx_s_parameters()
968 o->modulation = p->modulation; in cx25840_ir_tx_s_parameters()
970 if (p->modulation) { in cx25840_ir_tx_s_parameters()
971 p->carrier_freq = txclk_tx_s_carrier(c, p->carrier_freq, in cx25840_ir_tx_s_parameters()
973 o->carrier_freq = p->carrier_freq; in cx25840_ir_tx_s_parameters()
975 p->duty_cycle = cduty_tx_s_duty_cycle(c, p->duty_cycle); in cx25840_ir_tx_s_parameters()
976 o->duty_cycle = p->duty_cycle; in cx25840_ir_tx_s_parameters()
978 p->max_pulse_width = in cx25840_ir_tx_s_parameters()
981 p->max_pulse_width = in cx25840_ir_tx_s_parameters()
982 txclk_tx_s_max_pulse_width(c, p->max_pulse_width, in cx25840_ir_tx_s_parameters()
985 o->max_pulse_width = p->max_pulse_width; in cx25840_ir_tx_s_parameters()
986 atomic_set(&ir_state->txclk_divider, txclk_divider); in cx25840_ir_tx_s_parameters()
988 p->resolution = clock_divider_to_resolution(txclk_divider); in cx25840_ir_tx_s_parameters()
989 o->resolution = p->resolution; in cx25840_ir_tx_s_parameters()
991 /* FIXME - make this dependent on resolution for better performance */ in cx25840_ir_tx_s_parameters()
994 control_tx_polarity_invert(c, p->invert_carrier_sense); in cx25840_ir_tx_s_parameters()
995 o->invert_carrier_sense = p->invert_carrier_sense; in cx25840_ir_tx_s_parameters()
1003 o->invert_level = p->invert_level; in cx25840_ir_tx_s_parameters()
1005 o->interrupt_enable = p->interrupt_enable; in cx25840_ir_tx_s_parameters()
1006 o->enable = p->enable; in cx25840_ir_tx_s_parameters()
1007 if (p->enable) { in cx25840_ir_tx_s_parameters()
1009 if (p->interrupt_enable) in cx25840_ir_tx_s_parameters()
1010 irqenable_tx(sd, IRQEN_TSE); in cx25840_ir_tx_s_parameters()
1011 control_tx_enable(c, p->enable); in cx25840_ir_tx_s_parameters()
1014 mutex_unlock(&ir_state->tx_params_lock); in cx25840_ir_tx_s_parameters()
1022 int cx25840_ir_log_status(struct v4l2_subdev *sd) in cx25840_ir_log_status() argument
1024 struct cx25840_state *state = to_state(sd); in cx25840_ir_log_status()
1025 struct i2c_client *c = state->c; in cx25840_ir_log_status()
1044 v4l2_info(sd, "IR Receiver:\n"); in cx25840_ir_log_status()
1045 v4l2_info(sd, "\tEnabled: %s\n", in cx25840_ir_log_status()
1046 cntrl & CNTRL_RXE ? "yes" : "no"); in cx25840_ir_log_status()
1047 v4l2_info(sd, "\tDemodulation from a carrier: %s\n", in cx25840_ir_log_status()
1049 v4l2_info(sd, "\tFIFO: %s\n", in cx25840_ir_log_status()
1068 v4l2_info(sd, "\tPulse timers' start/stop trigger: %s\n", s); in cx25840_ir_log_status()
1069 v4l2_info(sd, "\tFIFO data on pulse timer overflow: %s\n", in cx25840_ir_log_status()
1071 v4l2_info(sd, "\tFIFO interrupt watermark: %s\n", in cx25840_ir_log_status()
1073 v4l2_info(sd, "\tLoopback mode: %s\n", in cx25840_ir_log_status()
1076 v4l2_info(sd, "\tExpected carrier (16 clocks): %u Hz\n", in cx25840_ir_log_status()
1100 v4l2_info(sd, "\tNext carrier edge window: 16 clocks -%1d/+%1d, %u to %u Hz\n", in cx25840_ir_log_status()
1103 clock_divider_to_freq(rxclk, 16 - i)); in cx25840_ir_log_status()
1105 v4l2_info(sd, "\tMax measurable pulse width: %u us, %llu ns\n", in cx25840_ir_log_status()
1108 v4l2_info(sd, "\tLow pass filter: %s\n", in cx25840_ir_log_status()
1111 v4l2_info(sd, "\tMin acceptable pulse width (LPF): %u us, %u ns\n", in cx25840_ir_log_status()
1114 v4l2_info(sd, "\tPulse width timer timed-out: %s\n", in cx25840_ir_log_status()
1115 stats & STATS_RTO ? "yes" : "no"); in cx25840_ir_log_status()
1116 v4l2_info(sd, "\tPulse width timer time-out intr: %s\n", in cx25840_ir_log_status()
1118 v4l2_info(sd, "\tFIFO overrun: %s\n", in cx25840_ir_log_status()
1119 stats & STATS_ROR ? "yes" : "no"); in cx25840_ir_log_status()
1120 v4l2_info(sd, "\tFIFO overrun interrupt: %s\n", in cx25840_ir_log_status()
1122 v4l2_info(sd, "\tBusy: %s\n", in cx25840_ir_log_status()
1123 stats & STATS_RBY ? "yes" : "no"); in cx25840_ir_log_status()
1124 v4l2_info(sd, "\tFIFO service requested: %s\n", in cx25840_ir_log_status()
1125 stats & STATS_RSR ? "yes" : "no"); in cx25840_ir_log_status()
1126 v4l2_info(sd, "\tFIFO service request interrupt: %s\n", in cx25840_ir_log_status()
1129 v4l2_info(sd, "IR Transmitter:\n"); in cx25840_ir_log_status()
1130 v4l2_info(sd, "\tEnabled: %s\n", in cx25840_ir_log_status()
1131 cntrl & CNTRL_TXE ? "yes" : "no"); in cx25840_ir_log_status()
1132 v4l2_info(sd, "\tModulation onto a carrier: %s\n", in cx25840_ir_log_status()
1134 v4l2_info(sd, "\tFIFO: %s\n", in cx25840_ir_log_status()
1136 v4l2_info(sd, "\tFIFO interrupt watermark: %s\n", in cx25840_ir_log_status()
1138 v4l2_info(sd, "\tCarrier polarity: %s\n", in cx25840_ir_log_status()
1142 v4l2_info(sd, "\tCarrier (16 clocks): %u Hz\n", in cx25840_ir_log_status()
1144 v4l2_info(sd, "\tCarrier duty cycle: %2u/16\n", in cx25840_ir_log_status()
1147 v4l2_info(sd, "\tMax pulse width: %u us, %llu ns\n", in cx25840_ir_log_status()
1150 v4l2_info(sd, "\tBusy: %s\n", in cx25840_ir_log_status()
1151 stats & STATS_TBY ? "yes" : "no"); in cx25840_ir_log_status()
1152 v4l2_info(sd, "\tFIFO service requested: %s\n", in cx25840_ir_log_status()
1153 stats & STATS_TSR ? "yes" : "no"); in cx25840_ir_log_status()
1154 v4l2_info(sd, "\tFIFO service request interrupt: %s\n", in cx25840_ir_log_status()
1181 .carrier_freq = 36000, /* 36 kHz - RC-5, and RC-6 carrier */
1183 /* RC-5: 666,667 ns = 1/36 kHz * 32 cycles * 1 mark * 0.75 */
1184 /* RC-6: 333,333 ns = 1/36 kHz * 16 cycles * 1 mark * 0.75 */
1200 .carrier_freq = 36000, /* 36 kHz - RC-5 carrier */
1201 .duty_cycle = 25, /* 25 % - RC-5 carrier */
1206 int cx25840_ir_probe(struct v4l2_subdev *sd) in cx25840_ir_probe() argument
1208 struct cx25840_state *state = to_state(sd); in cx25840_ir_probe()
1216 ir_state = devm_kzalloc(&state->c->dev, sizeof(*ir_state), GFP_KERNEL); in cx25840_ir_probe()
1218 return -ENOMEM; in cx25840_ir_probe()
1220 spin_lock_init(&ir_state->rx_kfifo_lock); in cx25840_ir_probe()
1221 if (kfifo_alloc(&ir_state->rx_kfifo, in cx25840_ir_probe()
1223 return -ENOMEM; in cx25840_ir_probe()
1225 ir_state->c = state->c; in cx25840_ir_probe()
1226 state->ir_state = ir_state; in cx25840_ir_probe()
1228 /* Ensure no interrupts arrive yet */ in cx25840_ir_probe()
1230 cx25840_write4(ir_state->c, CX25840_IR_IRQEN_REG, IRQEN_MSK); in cx25840_ir_probe()
1232 cx25840_write4(ir_state->c, CX25840_IR_IRQEN_REG, 0); in cx25840_ir_probe()
1234 mutex_init(&ir_state->rx_params_lock); in cx25840_ir_probe()
1236 v4l2_subdev_call(sd, ir, rx_s_parameters, &default_params); in cx25840_ir_probe()
1238 mutex_init(&ir_state->tx_params_lock); in cx25840_ir_probe()
1240 v4l2_subdev_call(sd, ir, tx_s_parameters, &default_params); in cx25840_ir_probe()
1245 int cx25840_ir_remove(struct v4l2_subdev *sd) in cx25840_ir_remove() argument
1247 struct cx25840_state *state = to_state(sd); in cx25840_ir_remove()
1248 struct cx25840_ir_state *ir_state = to_ir_state(sd); in cx25840_ir_remove()
1251 return -ENODEV; in cx25840_ir_remove()
1253 cx25840_ir_rx_shutdown(sd); in cx25840_ir_remove()
1254 cx25840_ir_tx_shutdown(sd); in cx25840_ir_remove()
1256 kfifo_free(&ir_state->rx_kfifo); in cx25840_ir_remove()
1257 state->ir_state = NULL; in cx25840_ir_remove()