xref: /linux/drivers/media/rc/meson-ir.c (revision 7f71507851fc7764b36a3221839607d3a45c2025)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Driver for Amlogic Meson IR remote receiver
4  *
5  * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
6  */
7 
8 #include <linux/device.h>
9 #include <linux/err.h>
10 #include <linux/interrupt.h>
11 #include <linux/io.h>
12 #include <linux/module.h>
13 #include <linux/of.h>
14 #include <linux/platform_device.h>
15 #include <linux/spinlock.h>
16 #include <linux/bitfield.h>
17 #include <linux/regmap.h>
18 
19 #include <media/rc-core.h>
20 
21 #define DRIVER_NAME		"meson-ir"
22 
23 #define IR_DEC_LDR_ACTIVE			0x00
24 #define IR_DEC_LDR_ACTIVE_MAX			GENMASK(28, 16)
25 #define IR_DEC_LDR_ACTIVE_MIN			GENMASK(12, 0)
26 #define IR_DEC_LDR_IDLE				0x04
27 #define IR_DEC_LDR_IDLE_MAX			GENMASK(28, 16)
28 #define IR_DEC_LDR_IDLE_MIN			GENMASK(12, 0)
29 #define IR_DEC_LDR_REPEAT			0x08
30 #define IR_DEC_LDR_REPEAT_MAX			GENMASK(25, 16)
31 #define IR_DEC_LDR_REPEAT_MIN			GENMASK(9, 0)
32 #define IR_DEC_BIT_0				0x0c
33 #define IR_DEC_BIT_0_MAX			GENMASK(25, 16)
34 #define IR_DEC_BIT_0_MIN			GENMASK(9, 0)
35 #define IR_DEC_REG0				0x10
36 #define IR_DEC_REG0_FILTER			GENMASK(30, 28)
37 #define IR_DEC_REG0_FRAME_TIME_MAX		GENMASK(24, 12)
38 #define IR_DEC_REG0_BASE_TIME			GENMASK(11, 0)
39 #define IR_DEC_FRAME				0x14
40 #define IR_DEC_STATUS				0x18
41 #define IR_DEC_STATUS_BIT_1_ENABLE		BIT(30)
42 #define IR_DEC_STATUS_BIT_1_MAX			GENMASK(29, 20)
43 #define IR_DEC_STATUS_BIT_1_MIN			GENMASK(19, 10)
44 #define IR_DEC_STATUS_PULSE			BIT(8)
45 #define IR_DEC_STATUS_BUSY			BIT(7)
46 #define IR_DEC_STATUS_FRAME_STATUS		GENMASK(3, 0)
47 #define IR_DEC_REG1				0x1c
48 #define IR_DEC_REG1_TIME_IV			GENMASK(28, 16)
49 #define IR_DEC_REG1_FRAME_LEN			GENMASK(13, 8)
50 #define IR_DEC_REG1_ENABLE			BIT(15)
51 #define IR_DEC_REG1_HOLD_CODE			BIT(6)
52 #define IR_DEC_REG1_IRQSEL			GENMASK(3, 2)
53 #define IR_DEC_REG1_RESET			BIT(0)
54 /* Meson 6b uses REG1 to configure IR mode */
55 #define IR_DEC_REG1_MODE			GENMASK(8, 7)
56 
57 /* The following registers are only available on Meson 8b and newer */
58 #define IR_DEC_REG2				0x20
59 #define IR_DEC_REG2_TICK_MODE			BIT(15)
60 #define IR_DEC_REG2_REPEAT_COUNTER		BIT(13)
61 #define IR_DEC_REG2_REPEAT_TIME			BIT(12)
62 #define IR_DEC_REG2_COMPARE_FRAME		BIT(11)
63 #define IR_DEC_REG2_BIT_ORDER			BIT(8)
64 /* Meson 8b / GXBB use REG2 to configure IR mode */
65 #define IR_DEC_REG2_MODE			GENMASK(3, 0)
66 #define IR_DEC_DURATN2				0x24
67 #define IR_DEC_DURATN2_MAX			GENMASK(25, 16)
68 #define IR_DEC_DURATN2_MIN			GENMASK(9, 0)
69 #define IR_DEC_DURATN3				0x28
70 #define IR_DEC_DURATN3_MAX			GENMASK(25, 16)
71 #define IR_DEC_DURATN3_MIN			GENMASK(9, 0)
72 #define IR_DEC_FRAME1				0x2c
73 
74 #define FRAME_MSB_FIRST				true
75 #define FRAME_LSB_FIRST				false
76 
77 #define DEC_MODE_NEC				0x0
78 #define DEC_MODE_RAW				0x2
79 #define DEC_MODE_RC6				0x9
80 #define DEC_MODE_XMP				0xE
81 #define DEC_MODE_UNKNOW				0xFF
82 
83 #define DEC_STATUS_VALID			BIT(3)
84 #define DEC_STATUS_DATA_CODE_ERR		BIT(2)
85 #define DEC_STATUS_CUSTOM_CODE_ERR		BIT(1)
86 #define DEC_STATUS_REPEAT			BIT(0)
87 
88 #define IRQSEL_DEC_MODE				0
89 #define IRQSEL_RISE_FALL			1
90 #define IRQSEL_FALL				2
91 #define IRQSEL_RISE				3
92 
93 #define MESON_RAW_TRATE				10	/* us */
94 #define MESON_HW_TRATE				20	/* us */
95 
96 /**
97  * struct meson_ir_protocol - describe IR Protocol parameter
98  *
99  * @hw_protocol: select IR Protocol from IR Controller
100  * @repeat_counter_enable: enable frame-to-frame time counter, it should work
101  *                         with @repeat_compare_enable to detect the repeat frame
102  * @repeat_check_enable: enable repeat time check for repeat detection
103  * @repeat_compare_enable: enable to compare frame for repeat frame detection.
104  *                         Some IR Protocol send the same data as repeat frame.
105  *                         In this case, it should work with
106  *                         @repeat_counter_enable to detect the repeat frame.
107  * @bit_order: bit order, LSB or MSB
108  * @bit1_match_enable: enable to check bit 1
109  * @hold_code_enable: hold frame code in register IR_DEC_FRAME1, the new one
110  *                    frame code will not be store in IR_DEC_FRAME1.
111  *                    until IR_DEC_FRAME1 has been read
112  * @count_tick_mode: increasing time unit of frame-to-frame time counter.
113  *                   0 = 100us, 1 = 10us
114  * @code_length: length (N-1) of data frame
115  * @frame_time_max: max time for whole frame. Unit: MESON_HW_TRATE
116  * @leader_active_max: max time for NEC/RC6 leader active part. Unit: MESON_HW_TRATE
117  * @leader_active_min: min time for NEC/RC6 leader active part. Unit: MESON_HW_TRATE
118  * @leader_idle_max: max time for NEC/RC6 leader idle part. Unit: MESON_HW_TRATE
119  * @leader_idle_min: min time for NEC/RC6 leader idle part. Unit: MESON_HW_TRATE
120  * @repeat_leader_max: max time for NEC repeat leader idle part. Unit: MESON_HW_TRATE
121  * @repeat_leader_min: min time for NEC repeat leader idle part. Unit: MESON_HW_TRATE
122  * @bit0_max: max time for NEC Logic '0', half of RC6 trailer bit, XMP Logic '00'
123  * @bit0_min: min time for NEC Logic '0', half of RC6 trailer bit, XMP Logic '00'
124  * @bit1_max: max time for NEC Logic '1', whole of RC6 trailer bit, XMP Logic '01'
125  * @bit1_min: min time for NEC Logic '1', whole of RC6 trailer bit, XMP Logic '01'
126  * @duration2_max: max time for half of RC6 normal bit, XMP Logic '10'
127  * @duration2_min: min time for half of RC6 normal bit, XMP Logic '10'
128  * @duration3_max: max time for whole of RC6 normal bit, XMP Logic '11'
129  * @duration3_min: min time for whole of RC6 normal bit, XMP Logic '11'
130  */
131 
132 struct meson_ir_protocol {
133 	u8 hw_protocol;
134 	bool repeat_counter_enable;
135 	bool repeat_check_enable;
136 	bool repeat_compare_enable;
137 	bool bit_order;
138 	bool bit1_match_enable;
139 	bool hold_code_enable;
140 	bool count_tick_mode;
141 	u8 code_length;
142 	u16 frame_time_max;
143 	u16 leader_active_max;
144 	u16 leader_active_min;
145 	u16 leader_idle_max;
146 	u16 leader_idle_min;
147 	u16 repeat_leader_max;
148 	u16 repeat_leader_min;
149 	u16 bit0_max;
150 	u16 bit0_min;
151 	u16 bit1_max;
152 	u16 bit1_min;
153 	u16 duration2_max;
154 	u16 duration2_min;
155 	u16 duration3_max;
156 	u16 duration3_min;
157 };
158 
159 struct meson_ir_param {
160 	bool support_hw_decoder;
161 	unsigned int max_register;
162 };
163 
164 struct meson_ir {
165 	const struct meson_ir_param *param;
166 	struct regmap	*reg;
167 	struct rc_dev	*rc;
168 	spinlock_t	lock;
169 };
170 
171 static struct regmap_config meson_ir_regmap_config = {
172 	.reg_bits = 32,
173 	.val_bits = 32,
174 	.reg_stride = 4,
175 };
176 
177 static const struct meson_ir_protocol protocol_timings[] = {
178 	/* protocol, repeat counter, repeat check, repeat compare, order */
179 	{DEC_MODE_NEC, false, false, false, FRAME_LSB_FIRST,
180 	/* bit 1 match, hold code, count tick, len, frame time */
181 	true, false, false, 32, 4000,
182 	/* leader active max/min, leader idle max/min, repeat leader max/min */
183 	500, 400, 300, 200, 150, 80,
184 	/* bit0 max/min, bit1 max/min, duration2 max/min, duration3 max/min */
185 	72, 40, 134, 90, 0, 0, 0, 0}
186 };
187 
188 static void meson_ir_nec_handler(struct meson_ir *ir)
189 {
190 	u32 code = 0;
191 	u32 status = 0;
192 	enum rc_proto proto;
193 
194 	regmap_read(ir->reg, IR_DEC_STATUS, &status);
195 
196 	if (status & DEC_STATUS_REPEAT) {
197 		rc_repeat(ir->rc);
198 	} else {
199 		regmap_read(ir->reg, IR_DEC_FRAME, &code);
200 
201 		code = ir_nec_bytes_to_scancode(code, code >> 8,
202 						code >> 16, code >> 24, &proto);
203 		rc_keydown(ir->rc, proto, code, 0);
204 	}
205 }
206 
207 static void meson_ir_hw_handler(struct meson_ir *ir)
208 {
209 	if (ir->rc->enabled_protocols & RC_PROTO_BIT_NEC)
210 		meson_ir_nec_handler(ir);
211 }
212 
213 static irqreturn_t meson_ir_irq(int irqno, void *dev_id)
214 {
215 	struct meson_ir *ir = dev_id;
216 	u32 duration, status;
217 	struct ir_raw_event rawir = {};
218 
219 	spin_lock(&ir->lock);
220 
221 	regmap_read(ir->reg, IR_DEC_STATUS, &status);
222 
223 	if (ir->rc->driver_type == RC_DRIVER_IR_RAW) {
224 		rawir.pulse = !!(status & IR_DEC_STATUS_PULSE);
225 
226 		regmap_read(ir->reg, IR_DEC_REG1, &duration);
227 		duration = FIELD_GET(IR_DEC_REG1_TIME_IV, duration);
228 		rawir.duration = duration * MESON_RAW_TRATE;
229 
230 		ir_raw_event_store_with_timeout(ir->rc, &rawir);
231 	} else if (ir->rc->driver_type == RC_DRIVER_SCANCODE) {
232 		if (status & DEC_STATUS_VALID)
233 			meson_ir_hw_handler(ir);
234 	}
235 
236 	spin_unlock(&ir->lock);
237 
238 	return IRQ_HANDLED;
239 }
240 
241 static int meson_ir_hw_decoder_init(struct rc_dev *dev, u64 *rc_type)
242 {
243 	u8 protocol;
244 	u32 regval;
245 	int i;
246 	unsigned long flags;
247 	const struct meson_ir_protocol *timings;
248 	struct meson_ir *ir = dev->priv;
249 
250 	if (*rc_type & RC_PROTO_BIT_NEC)
251 		protocol = DEC_MODE_NEC;
252 	else
253 		return 0;
254 
255 	for (i = 0; i < ARRAY_SIZE(protocol_timings); i++)
256 		if (protocol_timings[i].hw_protocol == protocol)
257 			break;
258 
259 	if (i == ARRAY_SIZE(protocol_timings)) {
260 		dev_err(&dev->dev, "hw protocol isn't supported: %d\n",
261 			protocol);
262 		return -EINVAL;
263 	}
264 	timings = &protocol_timings[i];
265 
266 	spin_lock_irqsave(&ir->lock, flags);
267 
268 	/* Clear controller status */
269 	regmap_read(ir->reg, IR_DEC_STATUS, &regval);
270 	regmap_read(ir->reg, IR_DEC_FRAME, &regval);
271 
272 	/* Reset ir decoder and disable decoder */
273 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_ENABLE, 0);
274 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_RESET,
275 			   IR_DEC_REG1_RESET);
276 
277 	/* Base time resolution, (19+1)*1us=20us */
278 	regval = FIELD_PREP(IR_DEC_REG0_BASE_TIME, MESON_HW_TRATE - 1);
279 	regmap_update_bits(ir->reg, IR_DEC_REG0, IR_DEC_REG0_BASE_TIME, regval);
280 
281 	/* Monitor timing for input filter */
282 	regmap_update_bits(ir->reg, IR_DEC_REG0, IR_DEC_REG0_FILTER,
283 			   FIELD_PREP(IR_DEC_REG0_FILTER, 7));
284 
285 	/* HW protocol */
286 	regval = FIELD_PREP(IR_DEC_REG2_MODE, timings->hw_protocol);
287 	regmap_update_bits(ir->reg, IR_DEC_REG2, IR_DEC_REG2_MODE, regval);
288 
289 	/* Hold frame data until register was read */
290 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_HOLD_CODE,
291 			   timings->hold_code_enable ?
292 			   IR_DEC_REG1_HOLD_CODE : 0);
293 
294 	/* Bit order */
295 	regmap_update_bits(ir->reg, IR_DEC_REG2, IR_DEC_REG2_BIT_ORDER,
296 			   timings->bit_order ? IR_DEC_REG2_BIT_ORDER : 0);
297 
298 	/* Select tick mode */
299 	regmap_update_bits(ir->reg, IR_DEC_REG2, IR_DEC_REG2_TICK_MODE,
300 			   timings->count_tick_mode ?
301 			   IR_DEC_REG2_TICK_MODE : 0);
302 
303 	/*
304 	 * Some protocols transmit the same data frame as repeat frame
305 	 * when the key is pressing. In this case, it could be detected as
306 	 * repeat frame if the repeat checker was enabled.
307 	 */
308 	regmap_update_bits(ir->reg, IR_DEC_REG2, IR_DEC_REG2_REPEAT_COUNTER,
309 			   timings->repeat_counter_enable ?
310 			   IR_DEC_REG2_REPEAT_COUNTER : 0);
311 	regmap_update_bits(ir->reg, IR_DEC_REG2, IR_DEC_REG2_REPEAT_TIME,
312 			   timings->repeat_check_enable ?
313 			   IR_DEC_REG2_REPEAT_TIME : 0);
314 	regmap_update_bits(ir->reg, IR_DEC_REG2, IR_DEC_REG2_COMPARE_FRAME,
315 			   timings->repeat_compare_enable ?
316 			   IR_DEC_REG2_COMPARE_FRAME : 0);
317 
318 	/*
319 	 * FRAME_TIME_MAX should be larger than the time between
320 	 * data frame and repeat frame
321 	 */
322 	regval = FIELD_PREP(IR_DEC_REG0_FRAME_TIME_MAX,
323 			    timings->frame_time_max);
324 	regmap_update_bits(ir->reg, IR_DEC_REG0, IR_DEC_REG0_FRAME_TIME_MAX,
325 			   regval);
326 
327 	/* Length(N-1) of data frame */
328 	regval = FIELD_PREP(IR_DEC_REG1_FRAME_LEN, timings->code_length - 1);
329 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_FRAME_LEN, regval);
330 
331 	/* Time for leader active part */
332 	regval = FIELD_PREP(IR_DEC_LDR_ACTIVE_MAX,
333 			    timings->leader_active_max) |
334 		 FIELD_PREP(IR_DEC_LDR_ACTIVE_MIN,
335 			    timings->leader_active_min);
336 	regmap_update_bits(ir->reg, IR_DEC_LDR_ACTIVE, IR_DEC_LDR_ACTIVE_MAX |
337 			   IR_DEC_LDR_ACTIVE_MIN, regval);
338 
339 	/* Time for leader idle part */
340 	regval = FIELD_PREP(IR_DEC_LDR_IDLE_MAX, timings->leader_idle_max) |
341 		 FIELD_PREP(IR_DEC_LDR_IDLE_MIN, timings->leader_idle_min);
342 	regmap_update_bits(ir->reg, IR_DEC_LDR_IDLE,
343 			   IR_DEC_LDR_IDLE_MAX | IR_DEC_LDR_IDLE_MIN, regval);
344 
345 	/* Time for repeat leader idle part */
346 	regval = FIELD_PREP(IR_DEC_LDR_REPEAT_MAX, timings->repeat_leader_max) |
347 		 FIELD_PREP(IR_DEC_LDR_REPEAT_MIN, timings->repeat_leader_min);
348 	regmap_update_bits(ir->reg, IR_DEC_LDR_REPEAT, IR_DEC_LDR_REPEAT_MAX |
349 			   IR_DEC_LDR_REPEAT_MIN, regval);
350 
351 	/*
352 	 * NEC: Time for logic '0'
353 	 * RC6: Time for half of trailer bit
354 	 */
355 	regval = FIELD_PREP(IR_DEC_BIT_0_MAX, timings->bit0_max) |
356 		 FIELD_PREP(IR_DEC_BIT_0_MIN, timings->bit0_min);
357 	regmap_update_bits(ir->reg, IR_DEC_BIT_0,
358 			   IR_DEC_BIT_0_MAX | IR_DEC_BIT_0_MIN, regval);
359 
360 	/*
361 	 * NEC: Time for logic '1'
362 	 * RC6: Time for whole of trailer bit
363 	 */
364 	regval = FIELD_PREP(IR_DEC_STATUS_BIT_1_MAX, timings->bit1_max) |
365 		 FIELD_PREP(IR_DEC_STATUS_BIT_1_MIN, timings->bit1_min);
366 	regmap_update_bits(ir->reg, IR_DEC_STATUS, IR_DEC_STATUS_BIT_1_MAX |
367 			   IR_DEC_STATUS_BIT_1_MIN, regval);
368 
369 	/* Enable to match logic '1' */
370 	regmap_update_bits(ir->reg, IR_DEC_STATUS, IR_DEC_STATUS_BIT_1_ENABLE,
371 			   timings->bit1_match_enable ?
372 			   IR_DEC_STATUS_BIT_1_ENABLE : 0);
373 
374 	/*
375 	 * NEC: Unused
376 	 * RC6: Time for halt of logic 0/1
377 	 */
378 	regval = FIELD_PREP(IR_DEC_DURATN2_MAX, timings->duration2_max) |
379 		 FIELD_PREP(IR_DEC_DURATN2_MIN, timings->duration2_min);
380 	regmap_update_bits(ir->reg, IR_DEC_DURATN2,
381 			   IR_DEC_DURATN2_MAX | IR_DEC_DURATN2_MIN, regval);
382 
383 	/*
384 	 * NEC: Unused
385 	 * RC6: Time for whole logic 0/1
386 	 */
387 	regval = FIELD_PREP(IR_DEC_DURATN3_MAX, timings->duration3_max) |
388 		 FIELD_PREP(IR_DEC_DURATN3_MIN, timings->duration3_min);
389 	regmap_update_bits(ir->reg, IR_DEC_DURATN3,
390 			   IR_DEC_DURATN3_MAX | IR_DEC_DURATN3_MIN, regval);
391 
392 	/* Reset ir decoder and enable decode */
393 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_RESET,
394 			   IR_DEC_REG1_RESET);
395 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_RESET, 0);
396 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_ENABLE,
397 			   IR_DEC_REG1_ENABLE);
398 
399 	spin_unlock_irqrestore(&ir->lock, flags);
400 
401 	dev_info(&dev->dev, "hw decoder init, protocol: %d\n", protocol);
402 
403 	return 0;
404 }
405 
406 static void meson_ir_sw_decoder_init(struct rc_dev *dev)
407 {
408 	unsigned long flags;
409 	struct meson_ir *ir = dev->priv;
410 
411 	spin_lock_irqsave(&ir->lock, flags);
412 
413 	/* Reset the decoder */
414 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_RESET,
415 			   IR_DEC_REG1_RESET);
416 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_RESET, 0);
417 
418 	/* Set general operation mode (= raw/software decoding) */
419 	if (of_device_is_compatible(dev->dev.of_node, "amlogic,meson6-ir"))
420 		regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_MODE,
421 				   FIELD_PREP(IR_DEC_REG1_MODE,
422 					      DEC_MODE_RAW));
423 	else
424 		regmap_update_bits(ir->reg, IR_DEC_REG2, IR_DEC_REG2_MODE,
425 				   FIELD_PREP(IR_DEC_REG2_MODE,
426 					      DEC_MODE_RAW));
427 
428 	/* Set rate */
429 	regmap_update_bits(ir->reg, IR_DEC_REG0, IR_DEC_REG0_BASE_TIME,
430 			   FIELD_PREP(IR_DEC_REG0_BASE_TIME,
431 				      MESON_RAW_TRATE - 1));
432 	/* IRQ on rising and falling edges */
433 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_IRQSEL,
434 			   FIELD_PREP(IR_DEC_REG1_IRQSEL, IRQSEL_RISE_FALL));
435 	/* Enable the decoder */
436 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_ENABLE,
437 			   IR_DEC_REG1_ENABLE);
438 
439 	spin_unlock_irqrestore(&ir->lock, flags);
440 
441 	dev_info(&dev->dev, "sw decoder init\n");
442 }
443 
444 static int meson_ir_probe(struct platform_device *pdev)
445 {
446 	const struct meson_ir_param *match_data;
447 	struct device *dev = &pdev->dev;
448 	struct device_node *node = dev->of_node;
449 	void __iomem *res_start;
450 	const char *map_name;
451 	struct meson_ir *ir;
452 	int irq, ret;
453 
454 	ir = devm_kzalloc(dev, sizeof(struct meson_ir), GFP_KERNEL);
455 	if (!ir)
456 		return -ENOMEM;
457 
458 	match_data = of_device_get_match_data(dev);
459 	if (!match_data)
460 		return dev_err_probe(dev, -ENODEV, "failed to get match data\n");
461 
462 	ir->param = match_data;
463 
464 	res_start = devm_platform_ioremap_resource(pdev, 0);
465 	if (IS_ERR(res_start))
466 		return PTR_ERR(res_start);
467 
468 	meson_ir_regmap_config.max_register = ir->param->max_register;
469 	ir->reg = devm_regmap_init_mmio(&pdev->dev, res_start,
470 					&meson_ir_regmap_config);
471 	if (IS_ERR(ir->reg))
472 		return PTR_ERR(ir->reg);
473 
474 	irq = platform_get_irq(pdev, 0);
475 	if (irq < 0)
476 		return irq;
477 
478 	if (ir->param->support_hw_decoder)
479 		ir->rc = devm_rc_allocate_device(&pdev->dev,
480 						 RC_DRIVER_SCANCODE);
481 	else
482 		ir->rc = devm_rc_allocate_device(&pdev->dev, RC_DRIVER_IR_RAW);
483 
484 	if (!ir->rc) {
485 		dev_err(dev, "failed to allocate rc device\n");
486 		return -ENOMEM;
487 	}
488 
489 	if (ir->rc->driver_type == RC_DRIVER_IR_RAW) {
490 		ir->rc->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
491 		ir->rc->rx_resolution = MESON_RAW_TRATE;
492 		ir->rc->min_timeout = 1;
493 		ir->rc->timeout = IR_DEFAULT_TIMEOUT;
494 		ir->rc->max_timeout = 10 * IR_DEFAULT_TIMEOUT;
495 	} else if (ir->rc->driver_type == RC_DRIVER_SCANCODE) {
496 		ir->rc->allowed_protocols = RC_PROTO_BIT_NEC;
497 		ir->rc->change_protocol = meson_ir_hw_decoder_init;
498 	}
499 
500 	ir->rc->priv = ir;
501 	ir->rc->device_name = DRIVER_NAME;
502 	ir->rc->input_phys = DRIVER_NAME "/input0";
503 	ir->rc->input_id.bustype = BUS_HOST;
504 	map_name = of_get_property(node, "linux,rc-map-name", NULL);
505 	ir->rc->map_name = map_name ? map_name : RC_MAP_EMPTY;
506 	ir->rc->driver_name = DRIVER_NAME;
507 
508 	spin_lock_init(&ir->lock);
509 	platform_set_drvdata(pdev, ir);
510 
511 	ret = devm_rc_register_device(dev, ir->rc);
512 	if (ret) {
513 		dev_err(dev, "failed to register rc device\n");
514 		return ret;
515 	}
516 
517 	if (ir->rc->driver_type == RC_DRIVER_IR_RAW)
518 		meson_ir_sw_decoder_init(ir->rc);
519 
520 	ret = devm_request_irq(dev, irq, meson_ir_irq, 0, "meson_ir", ir);
521 	if (ret) {
522 		dev_err(dev, "failed to request irq\n");
523 		return ret;
524 	}
525 
526 	dev_info(dev, "receiver initialized\n");
527 
528 	return 0;
529 }
530 
531 static void meson_ir_remove(struct platform_device *pdev)
532 {
533 	struct meson_ir *ir = platform_get_drvdata(pdev);
534 	unsigned long flags;
535 
536 	/* Disable the decoder */
537 	spin_lock_irqsave(&ir->lock, flags);
538 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_ENABLE, 0);
539 	spin_unlock_irqrestore(&ir->lock, flags);
540 }
541 
542 static void meson_ir_shutdown(struct platform_device *pdev)
543 {
544 	struct device *dev = &pdev->dev;
545 	struct device_node *node = dev->of_node;
546 	struct meson_ir *ir = platform_get_drvdata(pdev);
547 	unsigned long flags;
548 
549 	spin_lock_irqsave(&ir->lock, flags);
550 
551 	/*
552 	 * Set operation mode to NEC/hardware decoding to give
553 	 * bootloader a chance to power the system back on
554 	 */
555 	if (of_device_is_compatible(node, "amlogic,meson6-ir"))
556 		regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_MODE,
557 				   FIELD_PREP(IR_DEC_REG1_MODE, DEC_MODE_NEC));
558 	else
559 		regmap_update_bits(ir->reg, IR_DEC_REG2, IR_DEC_REG2_MODE,
560 				   FIELD_PREP(IR_DEC_REG2_MODE, DEC_MODE_NEC));
561 
562 	/* Set rate to default value */
563 	regmap_update_bits(ir->reg, IR_DEC_REG0, IR_DEC_REG0_BASE_TIME,
564 			   FIELD_PREP(IR_DEC_REG0_BASE_TIME,
565 				      MESON_HW_TRATE - 1));
566 
567 	spin_unlock_irqrestore(&ir->lock, flags);
568 }
569 
570 static __maybe_unused int meson_ir_resume(struct device *dev)
571 {
572 	struct meson_ir *ir = dev_get_drvdata(dev);
573 
574 	if (ir->param->support_hw_decoder)
575 		meson_ir_hw_decoder_init(ir->rc, &ir->rc->enabled_protocols);
576 	else
577 		meson_ir_sw_decoder_init(ir->rc);
578 
579 	return 0;
580 }
581 
582 static __maybe_unused int meson_ir_suspend(struct device *dev)
583 {
584 	struct meson_ir *ir = dev_get_drvdata(dev);
585 	unsigned long flags;
586 
587 	spin_lock_irqsave(&ir->lock, flags);
588 	regmap_update_bits(ir->reg, IR_DEC_REG1, IR_DEC_REG1_ENABLE, 0);
589 	spin_unlock_irqrestore(&ir->lock, flags);
590 
591 	return 0;
592 }
593 
594 static SIMPLE_DEV_PM_OPS(meson_ir_pm_ops, meson_ir_suspend, meson_ir_resume);
595 
596 static const struct meson_ir_param meson6_ir_param = {
597 	.support_hw_decoder = false,
598 	.max_register = IR_DEC_REG1,
599 };
600 
601 static const struct meson_ir_param meson8b_ir_param = {
602 	.support_hw_decoder = false,
603 	.max_register = IR_DEC_REG2,
604 };
605 
606 static const struct meson_ir_param meson_s4_ir_param = {
607 	.support_hw_decoder = true,
608 	.max_register = IR_DEC_FRAME1,
609 };
610 
611 static const struct of_device_id meson_ir_match[] = {
612 	{
613 		.compatible = "amlogic,meson6-ir",
614 		.data = &meson6_ir_param,
615 	}, {
616 		.compatible = "amlogic,meson8b-ir",
617 		.data = &meson8b_ir_param,
618 	}, {
619 		.compatible = "amlogic,meson-gxbb-ir",
620 		.data = &meson8b_ir_param,
621 	}, {
622 		.compatible = "amlogic,meson-s4-ir",
623 		.data = &meson_s4_ir_param,
624 	},
625 	{},
626 };
627 MODULE_DEVICE_TABLE(of, meson_ir_match);
628 
629 static struct platform_driver meson_ir_driver = {
630 	.probe		= meson_ir_probe,
631 	.remove		= meson_ir_remove,
632 	.shutdown	= meson_ir_shutdown,
633 	.driver = {
634 		.name		= DRIVER_NAME,
635 		.of_match_table	= meson_ir_match,
636 		.pm = pm_ptr(&meson_ir_pm_ops),
637 	},
638 };
639 
640 module_platform_driver(meson_ir_driver);
641 
642 MODULE_DESCRIPTION("Amlogic Meson IR remote receiver driver");
643 MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>");
644 MODULE_LICENSE("GPL v2");
645