forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
kernel/drivers/media/rc/gpio-ir-tx.c
....@@ -1,14 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Copyright (C) 2017 Sean Young <sean@mess.org>
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License version 2, or
6
- * (at your option) any later version.
7
- *
8
- * This program is distributed in the hope that it will be useful,
9
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- * GNU General Public License for more details.
124 */
135
146 #include <linux/kernel.h>
....@@ -27,8 +19,6 @@
2719 struct gpio_desc *gpio;
2820 unsigned int carrier;
2921 unsigned int duty_cycle;
30
- /* we need a spinlock to hold the cpu while transmitting */
31
- spinlock_t lock;
3222 };
3323
3424 static const struct of_device_id gpio_ir_tx_of_match[] = {
....@@ -50,7 +40,7 @@
5040 {
5141 struct gpio_ir *gpio_ir = dev->priv;
5242
53
- if (!carrier)
43
+ if (carrier > 500000)
5444 return -EINVAL;
5545
5646 gpio_ir->carrier = carrier;
....@@ -58,11 +48,48 @@
5848 return 0;
5949 }
6050
61
-static int gpio_ir_tx(struct rc_dev *dev, unsigned int *txbuf,
62
- unsigned int count)
51
+static void delay_until(ktime_t until)
6352 {
64
- struct gpio_ir *gpio_ir = dev->priv;
65
- unsigned long flags;
53
+ /*
54
+ * delta should never exceed 0.5 seconds (IR_MAX_DURATION) and on
55
+ * m68k ndelay(s64) does not compile; so use s32 rather than s64.
56
+ */
57
+ s32 delta;
58
+
59
+ while (true) {
60
+ delta = ktime_us_delta(until, ktime_get());
61
+ if (delta <= 0)
62
+ return;
63
+
64
+ /* udelay more than 1ms may not work */
65
+ delta = min(delta, 1000);
66
+ udelay(delta);
67
+ }
68
+}
69
+
70
+static void gpio_ir_tx_unmodulated(struct gpio_ir *gpio_ir, uint *txbuf,
71
+ uint count)
72
+{
73
+ ktime_t edge;
74
+ int i;
75
+
76
+ local_irq_disable();
77
+
78
+ edge = ktime_get();
79
+
80
+ for (i = 0; i < count; i++) {
81
+ gpiod_set_value(gpio_ir->gpio, !(i % 2));
82
+
83
+ edge = ktime_add_us(edge, txbuf[i]);
84
+ delay_until(edge);
85
+ }
86
+
87
+ gpiod_set_value(gpio_ir->gpio, 0);
88
+}
89
+
90
+static void gpio_ir_tx_modulated(struct gpio_ir *gpio_ir, uint *txbuf,
91
+ uint count)
92
+{
6693 ktime_t edge;
6794 /*
6895 * delta should never exceed 0.5 seconds (IR_MAX_DURATION) and on
....@@ -78,7 +105,7 @@
78105 space = DIV_ROUND_CLOSEST((100 - gpio_ir->duty_cycle) *
79106 (NSEC_PER_SEC / 100), gpio_ir->carrier);
80107
81
- spin_lock_irqsave(&gpio_ir->lock, flags);
108
+ local_irq_disable();
82109
83110 edge = ktime_get();
84111
....@@ -86,9 +113,7 @@
86113 if (i % 2) {
87114 // space
88115 edge = ktime_add_us(edge, txbuf[i]);
89
- delta = ktime_us_delta(edge, ktime_get());
90
- if (delta > 0)
91
- udelay(delta);
116
+ delay_until(edge);
92117 } else {
93118 // pulse
94119 ktime_t last = ktime_add_us(edge, txbuf[i]);
....@@ -111,8 +136,20 @@
111136 edge = last;
112137 }
113138 }
139
+}
114140
115
- spin_unlock_irqrestore(&gpio_ir->lock, flags);
141
+static int gpio_ir_tx(struct rc_dev *dev, unsigned int *txbuf,
142
+ unsigned int count)
143
+{
144
+ struct gpio_ir *gpio_ir = dev->priv;
145
+ unsigned long flags;
146
+
147
+ local_irq_save(flags);
148
+ if (gpio_ir->carrier)
149
+ gpio_ir_tx_modulated(gpio_ir, txbuf, count);
150
+ else
151
+ gpio_ir_tx_unmodulated(gpio_ir, txbuf, count);
152
+ local_irq_restore(flags);
116153
117154 return count;
118155 }
....@@ -148,7 +185,6 @@
148185
149186 gpio_ir->carrier = 38000;
150187 gpio_ir->duty_cycle = 50;
151
- spin_lock_init(&gpio_ir->lock);
152188
153189 rc = devm_rc_register_device(&pdev->dev, rcdev);
154190 if (rc < 0)