• Home
  • Raw
  • Download

Lines Matching +full:12 +full:bit +full:- +full:clkdiv +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0-or-later
13 #include <media/rc-core.h>
15 #define DRIVER_NAME "tango-ir"
40 #define DISABLE_NEC (BIT(4) | BIT(8))
41 #define ENABLE_RC5 (BIT(0) | BIT(9))
42 #define ENABLE_RC6 (BIT(0) | BIT(7))
43 #define ACK_IR_INT (BIT(0) | BIT(1))
44 #define ACK_RC6_INT (BIT(31))
60 v = readl_relaxed(ir->rc5_base + IR_NEC_DATA); in tango_ir_handle_nec()
62 rc_repeat(ir->rc); in tango_ir_handle_nec()
67 rc_keydown(ir->rc, proto, code, 0); in tango_ir_handle_nec()
74 data = readl_relaxed(ir->rc5_base + IR_RC5_DATA); in tango_ir_handle_rc5()
75 if (data & BIT(31)) in tango_ir_handle_rc5()
78 field = data >> 12 & 1; in tango_ir_handle_rc5()
84 rc_keydown(ir->rc, RC_PROTO_RC5, code, toggle); in tango_ir_handle_rc5()
89 u32 data0, data1, toggle, mode, addr, cmd, code; in tango_ir_handle_rc6() local
91 data0 = readl_relaxed(ir->rc6_base + RC6_DATA0); in tango_ir_handle_rc6()
92 data1 = readl_relaxed(ir->rc6_base + RC6_DATA1); in tango_ir_handle_rc6()
94 mode = data0 >> 1 & 7; in tango_ir_handle_rc6()
95 if (mode != 0) in tango_ir_handle_rc6()
103 rc_keydown(ir->rc, RC_PROTO_RC6_0, code, toggle); in tango_ir_handle_rc6()
112 rc5_stat = readl_relaxed(ir->rc5_base + IR_INT); in tango_ir_irq()
113 writel_relaxed(rc5_stat, ir->rc5_base + IR_INT); in tango_ir_irq()
115 rc6_stat = readl_relaxed(ir->rc6_base + RC6_CTRL); in tango_ir_irq()
116 writel_relaxed(rc6_stat, ir->rc6_base + RC6_CTRL); in tango_ir_irq()
118 if (!(rc5_stat & 3) && !(rc6_stat & BIT(31))) in tango_ir_irq()
121 if (rc5_stat & BIT(0)) in tango_ir_irq()
124 if (rc5_stat & BIT(1)) in tango_ir_irq()
127 if (rc6_stat & BIT(31)) in tango_ir_irq()
135 struct tango_ir *ir = dev->priv; in tango_change_protocol()
148 writel_relaxed(rc5_ctrl, ir->rc5_base + IR_CTRL); in tango_change_protocol()
149 writel_relaxed(rc6_ctrl, ir->rc6_base + RC6_CTRL); in tango_change_protocol()
157 struct device *dev = &pdev->dev; in tango_ir_probe()
160 u64 clkrate, clkdiv; in tango_ir_probe() local
166 return -EINVAL; in tango_ir_probe()
170 return -ENOMEM; in tango_ir_probe()
172 ir->rc5_base = devm_platform_ioremap_resource(pdev, 0); in tango_ir_probe()
173 if (IS_ERR(ir->rc5_base)) in tango_ir_probe()
174 return PTR_ERR(ir->rc5_base); in tango_ir_probe()
176 ir->rc6_base = devm_platform_ioremap_resource(pdev, 1); in tango_ir_probe()
177 if (IS_ERR(ir->rc6_base)) in tango_ir_probe()
178 return PTR_ERR(ir->rc6_base); in tango_ir_probe()
180 ir->clk = devm_clk_get(dev, NULL); in tango_ir_probe()
181 if (IS_ERR(ir->clk)) in tango_ir_probe()
182 return PTR_ERR(ir->clk); in tango_ir_probe()
186 return -ENOMEM; in tango_ir_probe()
188 of_property_read_string(dev->of_node, "linux,rc-map-name", &map_name); in tango_ir_probe()
190 rc->device_name = DRIVER_NAME; in tango_ir_probe()
191 rc->driver_name = DRIVER_NAME; in tango_ir_probe()
192 rc->input_phys = DRIVER_NAME "/input0"; in tango_ir_probe()
193 rc->map_name = map_name; in tango_ir_probe()
194 rc->allowed_protocols = NEC_ANY | RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC6_0; in tango_ir_probe()
195 rc->change_protocol = tango_change_protocol; in tango_ir_probe()
196 rc->priv = ir; in tango_ir_probe()
197 ir->rc = rc; in tango_ir_probe()
199 err = clk_prepare_enable(ir->clk); in tango_ir_probe()
203 clkrate = clk_get_rate(ir->clk); in tango_ir_probe()
205 clkdiv = clkrate * NEC_TIME_BASE; in tango_ir_probe()
206 do_div(clkdiv, 1000000); in tango_ir_probe()
208 val = NEC_CAP(31) | GPIO_SEL(12) | clkdiv; in tango_ir_probe()
209 writel_relaxed(val, ir->rc5_base + IR_NEC_CTRL); in tango_ir_probe()
211 clkdiv = clkrate * RC5_TIME_BASE; in tango_ir_probe()
212 do_div(clkdiv, 1000000); in tango_ir_probe()
214 writel_relaxed(DISABLE_NEC, ir->rc5_base + IR_CTRL); in tango_ir_probe()
215 writel_relaxed(clkdiv, ir->rc5_base + IR_RC5_CLK_DIV); in tango_ir_probe()
216 writel_relaxed(ACK_IR_INT, ir->rc5_base + IR_INT); in tango_ir_probe()
218 clkdiv = clkrate * RC6_TIME_BASE; in tango_ir_probe()
219 do_div(clkdiv, RC6_CARRIER); in tango_ir_probe()
221 writel_relaxed(ACK_RC6_INT, ir->rc6_base + RC6_CTRL); in tango_ir_probe()
222 writel_relaxed((clkdiv >> 2) << 18 | clkdiv, ir->rc6_base + RC6_CLKDIV); in tango_ir_probe()
237 clk_disable_unprepare(ir->clk); in tango_ir_probe()
245 clk_disable_unprepare(ir->clk); in tango_ir_remove()
250 { .compatible = "sigma,smp8642-ir" },