Lines Matching refs:priv

376 static void img_ir_write_timings(struct img_ir_priv *priv,  in img_ir_write_timings()  argument
380 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_write_timings()
387 img_ir_write(priv, IMG_IR_LEAD_SYMB_TIMING, regs->ldr); in img_ir_write_timings()
388 img_ir_write(priv, IMG_IR_S00_SYMB_TIMING, regs->s00); in img_ir_write_timings()
389 img_ir_write(priv, IMG_IR_S01_SYMB_TIMING, regs->s01); in img_ir_write_timings()
390 img_ir_write(priv, IMG_IR_S10_SYMB_TIMING, regs->s10); in img_ir_write_timings()
391 img_ir_write(priv, IMG_IR_S11_SYMB_TIMING, regs->s11); in img_ir_write_timings()
392 img_ir_write(priv, IMG_IR_FREE_SYMB_TIMING, ft); in img_ir_write_timings()
393 dev_dbg(priv->dev, "timings: ldr=%#x, s=[%#x, %#x, %#x, %#x], ft=%#x\n", in img_ir_write_timings()
397 static void img_ir_write_filter(struct img_ir_priv *priv, in img_ir_write_filter() argument
401 dev_dbg(priv->dev, "IR filter=%016llx & %016llx\n", in img_ir_write_filter()
404 img_ir_write(priv, IMG_IR_IRQ_MSG_DATA_LW, (u32)filter->data); in img_ir_write_filter()
405 img_ir_write(priv, IMG_IR_IRQ_MSG_DATA_UP, (u32)(filter->data in img_ir_write_filter()
407 img_ir_write(priv, IMG_IR_IRQ_MSG_MASK_LW, (u32)filter->mask); in img_ir_write_filter()
408 img_ir_write(priv, IMG_IR_IRQ_MSG_MASK_UP, (u32)(filter->mask in img_ir_write_filter()
411 dev_dbg(priv->dev, "IR clearing filter\n"); in img_ir_write_filter()
412 img_ir_write(priv, IMG_IR_IRQ_MSG_MASK_LW, 0); in img_ir_write_filter()
413 img_ir_write(priv, IMG_IR_IRQ_MSG_MASK_UP, 0); in img_ir_write_filter()
418 static void _img_ir_set_filter(struct img_ir_priv *priv, in _img_ir_set_filter() argument
421 struct img_ir_priv_hw *hw = &priv->hw; in _img_ir_set_filter()
424 irq_en = img_ir_read(priv, IMG_IR_IRQ_ENABLE); in _img_ir_set_filter()
439 img_ir_write_filter(priv, filter); in _img_ir_set_filter()
441 img_ir_write(priv, IMG_IR_IRQ_CLEAR, irq_on); in _img_ir_set_filter()
442 img_ir_write(priv, IMG_IR_IRQ_ENABLE, irq_en); in _img_ir_set_filter()
446 static void _img_ir_set_wake_filter(struct img_ir_priv *priv, in _img_ir_set_wake_filter() argument
449 struct img_ir_priv_hw *hw = &priv->hw; in _img_ir_set_wake_filter()
464 struct img_ir_priv *priv = dev->priv; in img_ir_set_filter() local
465 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_set_filter()
469 dev_dbg(priv->dev, "IR scancode %sfilter=%08x & %08x\n", in img_ir_set_filter()
474 spin_lock_irq(&priv->lock); in img_ir_set_filter()
494 dev_dbg(priv->dev, "IR raw %sfilter=%016llx & %016llx\n", in img_ir_set_filter()
503 _img_ir_set_filter(priv, filter_ptr); in img_ir_set_filter()
506 _img_ir_set_wake_filter(priv, filter_ptr); in img_ir_set_filter()
513 spin_unlock_irq(&priv->lock); in img_ir_set_filter()
535 static void img_ir_set_decoder(struct img_ir_priv *priv, in img_ir_set_decoder() argument
539 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_set_decoder()
542 spin_lock_irq(&priv->lock); in img_ir_set_decoder()
554 spin_unlock_irq(&priv->lock); in img_ir_set_decoder()
557 spin_lock_irq(&priv->lock); in img_ir_set_decoder()
562 img_ir_write(priv, IMG_IR_CONTROL, 0); in img_ir_set_decoder()
563 irq_en = img_ir_read(priv, IMG_IR_IRQ_ENABLE); in img_ir_set_decoder()
564 img_ir_write(priv, IMG_IR_IRQ_ENABLE, irq_en & IMG_IR_IRQ_EDGE); in img_ir_set_decoder()
565 img_ir_write(priv, IMG_IR_IRQ_CLEAR, IMG_IR_IRQ_ALL & ~IMG_IR_IRQ_EDGE); in img_ir_set_decoder()
568 ir_status = img_ir_read(priv, IMG_IR_STATUS); in img_ir_set_decoder()
571 img_ir_write(priv, IMG_IR_STATUS, ir_status); in img_ir_set_decoder()
575 img_ir_read(priv, IMG_IR_DATA_LW); in img_ir_set_decoder()
576 img_ir_read(priv, IMG_IR_DATA_UP); in img_ir_set_decoder()
586 _img_ir_set_filter(priv, NULL); in img_ir_set_decoder()
587 _img_ir_set_wake_filter(priv, NULL); in img_ir_set_decoder()
604 img_ir_write_timings(priv, &hw->reg_timings.timings, RC_FILTER_NORMAL); in img_ir_set_decoder()
607 img_ir_write(priv, IMG_IR_CONTROL, hw->reg_timings.ctrl); in img_ir_set_decoder()
611 spin_unlock_irq(&priv->lock); in img_ir_set_decoder()
621 static bool img_ir_decoder_compatible(struct img_ir_priv *priv, in img_ir_decoder_compatible() argument
628 if (priv->hw.ct_quirks[ct] & IMG_IR_QUIRK_CODE_BROKEN) in img_ir_decoder_compatible()
640 static u64 img_ir_allowed_protos(struct img_ir_priv *priv) in img_ir_allowed_protos() argument
647 if (img_ir_decoder_compatible(priv, dec)) in img_ir_allowed_protos()
656 struct img_ir_priv *priv = dev->priv; in img_ir_change_protocol() local
657 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_change_protocol()
664 img_ir_set_decoder(priv, NULL, 0); in img_ir_change_protocol()
669 if (!img_ir_decoder_compatible(priv, dec)) in img_ir_change_protocol()
673 img_ir_set_decoder(priv, dec, *ir_type); in img_ir_change_protocol()
693 static void img_ir_set_protocol(struct img_ir_priv *priv, u64 proto) in img_ir_set_protocol() argument
695 struct rc_dev *rdev = priv->hw.rdev; in img_ir_set_protocol()
729 static int img_ir_enable_wake(struct img_ir_priv *priv) in img_ir_enable_wake() argument
731 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_enable_wake()
734 spin_lock_irq(&priv->lock); in img_ir_enable_wake()
737 hw->suspend_irqen = img_ir_read(priv, IMG_IR_IRQ_ENABLE); in img_ir_enable_wake()
738 img_ir_write(priv, IMG_IR_IRQ_ENABLE, IMG_IR_IRQ_DATA_MATCH); in img_ir_enable_wake()
739 img_ir_write_filter(priv, &hw->filters[RC_FILTER_WAKEUP]); in img_ir_enable_wake()
740 img_ir_write_timings(priv, &hw->reg_timings.timings, in img_ir_enable_wake()
745 spin_unlock_irq(&priv->lock); in img_ir_enable_wake()
756 static int img_ir_disable_wake(struct img_ir_priv *priv) in img_ir_disable_wake() argument
758 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_disable_wake()
761 spin_lock_irq(&priv->lock); in img_ir_disable_wake()
765 img_ir_write(priv, IMG_IR_IRQ_ENABLE, in img_ir_disable_wake()
768 img_ir_write_filter(priv, in img_ir_disable_wake()
771 img_ir_write(priv, IMG_IR_IRQ_ENABLE, in img_ir_disable_wake()
775 img_ir_write_filter(priv, NULL); in img_ir_disable_wake()
777 img_ir_write_timings(priv, &hw->reg_timings.timings, in img_ir_disable_wake()
782 spin_unlock_irq(&priv->lock); in img_ir_disable_wake()
788 static void img_ir_begin_repeat(struct img_ir_priv *priv) in img_ir_begin_repeat() argument
790 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_begin_repeat()
793 img_ir_write(priv, IMG_IR_CONTROL, 0); in img_ir_begin_repeat()
795 img_ir_write_timings(priv, &hw->reg_timings.rtimings, in img_ir_begin_repeat()
797 img_ir_write(priv, IMG_IR_CONTROL, hw->reg_timings.ctrl); in img_ir_begin_repeat()
802 static void img_ir_end_repeat(struct img_ir_priv *priv) in img_ir_end_repeat() argument
804 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_end_repeat()
807 img_ir_write(priv, IMG_IR_CONTROL, 0); in img_ir_end_repeat()
809 img_ir_write_timings(priv, &hw->reg_timings.timings, in img_ir_end_repeat()
811 img_ir_write(priv, IMG_IR_CONTROL, hw->reg_timings.ctrl); in img_ir_end_repeat()
816 static void img_ir_handle_data(struct img_ir_priv *priv, u32 len, u64 raw) in img_ir_handle_data() argument
818 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_handle_data()
832 dev_dbg(priv->dev, "data (%u bits) = %#llx\n", in img_ir_handle_data()
835 dev_dbg(priv->dev, "decoded scan code %#x, toggle %u\n", in img_ir_handle_data()
839 img_ir_end_repeat(priv); in img_ir_handle_data()
842 dev_dbg(priv->dev, "decoded repeat code\n"); in img_ir_handle_data()
845 dev_dbg(priv->dev, "decoded unexpected repeat code, ignoring\n"); in img_ir_handle_data()
848 dev_dbg(priv->dev, "decode failed (%d)\n", ret); in img_ir_handle_data()
857 img_ir_begin_repeat(priv); in img_ir_handle_data()
869 struct img_ir_priv *priv = (struct img_ir_priv *)arg; in img_ir_end_timer() local
871 spin_lock_irq(&priv->lock); in img_ir_end_timer()
872 img_ir_end_repeat(priv); in img_ir_end_timer()
873 spin_unlock_irq(&priv->lock); in img_ir_end_timer()
883 struct img_ir_priv *priv = (struct img_ir_priv *)arg; in img_ir_suspend_timer() local
885 spin_lock_irq(&priv->lock); in img_ir_suspend_timer()
890 if ((priv->hw.quirk_suspend_irq & IMG_IR_IRQ_EDGE) == in img_ir_suspend_timer()
891 img_ir_read(priv, IMG_IR_IRQ_ENABLE)) in img_ir_suspend_timer()
892 img_ir_write(priv, IMG_IR_IRQ_ENABLE, in img_ir_suspend_timer()
893 priv->hw.quirk_suspend_irq); in img_ir_suspend_timer()
895 img_ir_write(priv, IMG_IR_CONTROL, priv->hw.reg_timings.ctrl); in img_ir_suspend_timer()
896 spin_unlock_irq(&priv->lock); in img_ir_suspend_timer()
900 static void img_ir_change_frequency(struct img_ir_priv *priv, in img_ir_change_frequency() argument
903 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_change_frequency()
905 dev_dbg(priv->dev, "clk changed %lu HZ -> %lu HZ\n", in img_ir_change_frequency()
908 spin_lock_irq(&priv->lock); in img_ir_change_frequency()
918 img_ir_write_timings(priv, &hw->reg_timings.timings, in img_ir_change_frequency()
922 img_ir_write_timings(priv, &hw->reg_timings.rtimings, in img_ir_change_frequency()
927 img_ir_write_timings(priv, &hw->reg_timings.timings, in img_ir_change_frequency()
934 spin_unlock_irq(&priv->lock); in img_ir_change_frequency()
940 struct img_ir_priv *priv = container_of(self, struct img_ir_priv, in img_ir_clk_notify() local
944 img_ir_change_frequency(priv, data); in img_ir_clk_notify()
954 void img_ir_isr_hw(struct img_ir_priv *priv, u32 irq_status) in img_ir_isr_hw() argument
956 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_isr_hw()
966 ir_status = img_ir_read(priv, IMG_IR_STATUS); in img_ir_isr_hw()
968 if (!(priv->hw.ct_quirks[ct] & IMG_IR_QUIRK_CODE_IRQ) || in img_ir_isr_hw()
981 img_ir_write(priv, IMG_IR_CONTROL, 0); in img_ir_isr_hw()
982 hw->quirk_suspend_irq = img_ir_read(priv, IMG_IR_IRQ_ENABLE); in img_ir_isr_hw()
983 img_ir_write(priv, IMG_IR_IRQ_ENABLE, in img_ir_isr_hw()
992 img_ir_write(priv, IMG_IR_STATUS, ir_status); in img_ir_isr_hw()
999 lw = img_ir_read(priv, IMG_IR_DATA_LW); in img_ir_isr_hw()
1000 up = img_ir_read(priv, IMG_IR_DATA_UP); in img_ir_isr_hw()
1001 img_ir_handle_data(priv, len, (u64)up << 32 | lw); in img_ir_isr_hw()
1004 void img_ir_setup_hw(struct img_ir_priv *priv) in img_ir_setup_hw() argument
1008 if (!priv->hw.rdev) in img_ir_setup_hw()
1014 if (img_ir_decoder_compatible(priv, dec)) { in img_ir_setup_hw()
1015 img_ir_set_protocol(priv, dec->type); in img_ir_setup_hw()
1016 img_ir_set_decoder(priv, dec, 0); in img_ir_setup_hw()
1020 img_ir_set_decoder(priv, NULL, 0); in img_ir_setup_hw()
1027 static void img_ir_probe_hw_caps(struct img_ir_priv *priv) in img_ir_probe_hw_caps() argument
1029 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_probe_hw_caps()
1042 int img_ir_probe_hw(struct img_ir_priv *priv) in img_ir_probe_hw() argument
1044 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_probe_hw()
1052 img_ir_probe_hw_caps(priv); in img_ir_probe_hw()
1055 setup_timer(&hw->end_timer, img_ir_end_timer, (unsigned long)priv); in img_ir_probe_hw()
1057 (unsigned long)priv); in img_ir_probe_hw()
1060 if (!IS_ERR(priv->clk)) { in img_ir_probe_hw()
1061 hw->clk_hz = clk_get_rate(priv->clk); in img_ir_probe_hw()
1064 error = clk_notifier_register(priv->clk, &hw->clk_nb); in img_ir_probe_hw()
1066 dev_warn(priv->dev, in img_ir_probe_hw()
1076 dev_err(priv->dev, "cannot allocate input device\n"); in img_ir_probe_hw()
1080 rdev->priv = priv; in img_ir_probe_hw()
1082 rdev->allowed_protocols = img_ir_allowed_protos(priv); in img_ir_probe_hw()
1090 dev_err(priv->dev, "failed to register IR input device\n"); in img_ir_probe_hw()
1100 device_init_wakeup(priv->dev, 1); in img_ir_probe_hw()
1105 img_ir_set_decoder(priv, NULL, 0); in img_ir_probe_hw()
1110 if (!IS_ERR(priv->clk)) in img_ir_probe_hw()
1111 clk_notifier_unregister(priv->clk, &hw->clk_nb); in img_ir_probe_hw()
1116 void img_ir_remove_hw(struct img_ir_priv *priv) in img_ir_remove_hw() argument
1118 struct img_ir_priv_hw *hw = &priv->hw; in img_ir_remove_hw()
1122 img_ir_set_decoder(priv, NULL, 0); in img_ir_remove_hw()
1126 if (!IS_ERR(priv->clk)) in img_ir_remove_hw()
1127 clk_notifier_unregister(priv->clk, &hw->clk_nb); in img_ir_remove_hw()
1134 struct img_ir_priv *priv = dev_get_drvdata(dev); in img_ir_suspend() local
1136 if (device_may_wakeup(dev) && img_ir_enable_wake(priv)) in img_ir_suspend()
1137 enable_irq_wake(priv->irq); in img_ir_suspend()
1143 struct img_ir_priv *priv = dev_get_drvdata(dev); in img_ir_resume() local
1145 if (device_may_wakeup(dev) && img_ir_disable_wake(priv)) in img_ir_resume()
1146 disable_irq_wake(priv->irq); in img_ir_resume()