aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvaylo Dimitrov <ivo.g.dimitrov.75@gmail.com>2016-06-22 15:22:19 -0400
committerTony Lindgren <tony@atomide.com>2016-06-30 00:54:13 -0400
commit3fdd1526e6c5ceadd4e91906d223e2d382fb72ca (patch)
tree69d9e076d3af14f49c908dc5fc6f8af99afeef0d
parenta74a198249c473fba092ee549068cea30d54f07e (diff)
ir-rx51: use PWM framework instead of OMAP dmtimer
Convert driver to use PWM framework instead of calling dmtimer functions directly for PWM timer. Remove paragraph about writing to the Free Software Foundation's mailing address while at it. Signed-off-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com> Acked-by: Pali Rohár <pali.rohar@gmail.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
-rw-r--r--arch/arm/mach-omap2/board-rx51-peripherals.c1
-rw-r--r--arch/arm/mach-omap2/pdata-quirks.c1
-rw-r--r--drivers/media/rc/ir-rx51.c85
-rw-r--r--include/linux/platform_data/media/ir-rx51.h2
4 files changed, 44 insertions, 45 deletions
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index 9a7073949d1d..e487575a86ca 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -1242,7 +1242,6 @@ static struct pwm_omap_dmtimer_pdata __maybe_unused pwm_dmtimer_pdata = {
1242#if defined(CONFIG_IR_RX51) || defined(CONFIG_IR_RX51_MODULE) 1242#if defined(CONFIG_IR_RX51) || defined(CONFIG_IR_RX51_MODULE)
1243static struct lirc_rx51_platform_data rx51_lirc_data = { 1243static struct lirc_rx51_platform_data rx51_lirc_data = {
1244 .set_max_mpu_wakeup_lat = omap_pm_set_max_mpu_wakeup_lat, 1244 .set_max_mpu_wakeup_lat = omap_pm_set_max_mpu_wakeup_lat,
1245 .pwm_timer = 9, /* Use GPT 9 for CIR */
1246#if IS_ENABLED(CONFIG_OMAP_DM_TIMER) 1245#if IS_ENABLED(CONFIG_OMAP_DM_TIMER)
1247 .dmtimer = &pwm_dmtimer_pdata, 1246 .dmtimer = &pwm_dmtimer_pdata,
1248#endif 1247#endif
diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c
index 6571ad959908..278bb8f3b77b 100644
--- a/arch/arm/mach-omap2/pdata-quirks.c
+++ b/arch/arm/mach-omap2/pdata-quirks.c
@@ -491,7 +491,6 @@ static struct pwm_omap_dmtimer_pdata pwm_dmtimer_pdata = {
491 491
492static struct lirc_rx51_platform_data __maybe_unused rx51_lirc_data = { 492static struct lirc_rx51_platform_data __maybe_unused rx51_lirc_data = {
493 .set_max_mpu_wakeup_lat = omap_pm_set_max_mpu_wakeup_lat, 493 .set_max_mpu_wakeup_lat = omap_pm_set_max_mpu_wakeup_lat,
494 .pwm_timer = 9, /* Use GPT 9 for CIR */
495#if IS_ENABLED(CONFIG_OMAP_DM_TIMER) 494#if IS_ENABLED(CONFIG_OMAP_DM_TIMER)
496 .dmtimer = &pwm_dmtimer_pdata, 495 .dmtimer = &pwm_dmtimer_pdata,
497#endif 496#endif
diff --git a/drivers/media/rc/ir-rx51.c b/drivers/media/rc/ir-rx51.c
index da839c3a8c8b..5096ef3108d9 100644
--- a/drivers/media/rc/ir-rx51.c
+++ b/drivers/media/rc/ir-rx51.c
@@ -12,13 +12,7 @@
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details. 14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */ 15 */
21
22#include <linux/clk.h> 16#include <linux/clk.h>
23#include <linux/module.h> 17#include <linux/module.h>
24#include <linux/interrupt.h> 18#include <linux/interrupt.h>
@@ -26,6 +20,7 @@
26#include <linux/platform_device.h> 20#include <linux/platform_device.h>
27#include <linux/sched.h> 21#include <linux/sched.h>
28#include <linux/wait.h> 22#include <linux/wait.h>
23#include <linux/pwm.h>
29 24
30#include <media/lirc.h> 25#include <media/lirc.h>
31#include <media/lirc_dev.h> 26#include <media/lirc_dev.h>
@@ -43,7 +38,7 @@
43#define TIMER_MAX_VALUE 0xffffffff 38#define TIMER_MAX_VALUE 0xffffffff
44 39
45struct lirc_rx51 { 40struct lirc_rx51 {
46 pwm_omap_dmtimer *pwm_timer; 41 struct pwm_device *pwm;
47 pwm_omap_dmtimer *pulse_timer; 42 pwm_omap_dmtimer *pulse_timer;
48 struct pwm_omap_dmtimer_pdata *dmtimer; 43 struct pwm_omap_dmtimer_pdata *dmtimer;
49 struct device *dev; 44 struct device *dev;
@@ -58,32 +53,28 @@ struct lirc_rx51 {
58 int wbuf[WBUF_LEN]; 53 int wbuf[WBUF_LEN];
59 int wbuf_index; 54 int wbuf_index;
60 unsigned long device_is_open; 55 unsigned long device_is_open;
61 int pwm_timer_num;
62}; 56};
63 57
64static void lirc_rx51_on(struct lirc_rx51 *lirc_rx51) 58static void lirc_rx51_on(struct lirc_rx51 *lirc_rx51)
65{ 59{
66 lirc_rx51->dmtimer->set_pwm(lirc_rx51->pwm_timer, 0, 1, 60 pwm_enable(lirc_rx51->pwm);
67 PWM_OMAP_DMTIMER_TRIGGER_OVERFLOW_AND_COMPARE);
68} 61}
69 62
70static void lirc_rx51_off(struct lirc_rx51 *lirc_rx51) 63static void lirc_rx51_off(struct lirc_rx51 *lirc_rx51)
71{ 64{
72 lirc_rx51->dmtimer->set_pwm(lirc_rx51->pwm_timer, 0, 1, 65 pwm_disable(lirc_rx51->pwm);
73 PWM_OMAP_DMTIMER_TRIGGER_NONE);
74} 66}
75 67
76static int init_timing_params(struct lirc_rx51 *lirc_rx51) 68static int init_timing_params(struct lirc_rx51 *lirc_rx51)
77{ 69{
78 u32 load, match; 70 struct pwm_device *pwm = lirc_rx51->pwm;
79 71 int duty, period = DIV_ROUND_CLOSEST(NSEC_PER_SEC, lirc_rx51->freq);
80 load = -(lirc_rx51->fclk_khz * 1000 / lirc_rx51->freq); 72
81 match = -(lirc_rx51->duty_cycle * -load / 100); 73 duty = DIV_ROUND_CLOSEST(lirc_rx51->duty_cycle * period, 100);
82 lirc_rx51->dmtimer->set_load(lirc_rx51->pwm_timer, 1, load);
83 lirc_rx51->dmtimer->set_match(lirc_rx51->pwm_timer, 1, match);
84 lirc_rx51->dmtimer->write_counter(lirc_rx51->pwm_timer, TIMER_MAX_VALUE - 2);
85 lirc_rx51->dmtimer->start(lirc_rx51->pwm_timer);
86 lirc_rx51->dmtimer->set_int_enable(lirc_rx51->pulse_timer, 0); 74 lirc_rx51->dmtimer->set_int_enable(lirc_rx51->pulse_timer, 0);
75
76 pwm_config(pwm, duty, period);
77
87 lirc_rx51->dmtimer->start(lirc_rx51->pulse_timer); 78 lirc_rx51->dmtimer->start(lirc_rx51->pulse_timer);
88 79
89 lirc_rx51->match = 0; 80 lirc_rx51->match = 0;
@@ -165,7 +156,7 @@ end:
165 /* Stop TX here */ 156 /* Stop TX here */
166 lirc_rx51_off(lirc_rx51); 157 lirc_rx51_off(lirc_rx51);
167 lirc_rx51->wbuf_index = -1; 158 lirc_rx51->wbuf_index = -1;
168 lirc_rx51->dmtimer->stop(lirc_rx51->pwm_timer); 159
169 lirc_rx51->dmtimer->stop(lirc_rx51->pulse_timer); 160 lirc_rx51->dmtimer->stop(lirc_rx51->pulse_timer);
170 lirc_rx51->dmtimer->set_int_enable(lirc_rx51->pulse_timer, 0); 161 lirc_rx51->dmtimer->set_int_enable(lirc_rx51->pulse_timer, 0);
171 wake_up_interruptible(&lirc_rx51->wqueue); 162 wake_up_interruptible(&lirc_rx51->wqueue);
@@ -176,13 +167,13 @@ end:
176static int lirc_rx51_init_port(struct lirc_rx51 *lirc_rx51) 167static int lirc_rx51_init_port(struct lirc_rx51 *lirc_rx51)
177{ 168{
178 struct clk *clk_fclk; 169 struct clk *clk_fclk;
179 int retval, pwm_timer = lirc_rx51->pwm_timer_num; 170 int retval;
180 171
181 lirc_rx51->pwm_timer = lirc_rx51->dmtimer->request_specific(pwm_timer); 172 lirc_rx51->pwm = pwm_get(lirc_rx51->dev, NULL);
182 if (lirc_rx51->pwm_timer == NULL) { 173 if (IS_ERR(lirc_rx51->pwm)) {
183 dev_err(lirc_rx51->dev, ": Error requesting GPT%d timer\n", 174 retval = PTR_ERR(lirc_rx51->pwm);
184 pwm_timer); 175 dev_err(lirc_rx51->dev, ": pwm_get failed: %d\n", retval);
185 return -EBUSY; 176 return retval;
186 } 177 }
187 178
188 lirc_rx51->pulse_timer = lirc_rx51->dmtimer->request(); 179 lirc_rx51->pulse_timer = lirc_rx51->dmtimer->request();
@@ -192,15 +183,11 @@ static int lirc_rx51_init_port(struct lirc_rx51 *lirc_rx51)
192 goto err1; 183 goto err1;
193 } 184 }
194 185
195 lirc_rx51->dmtimer->set_source(lirc_rx51->pwm_timer,
196 PWM_OMAP_DMTIMER_SRC_SYS_CLK);
197 lirc_rx51->dmtimer->set_source(lirc_rx51->pulse_timer, 186 lirc_rx51->dmtimer->set_source(lirc_rx51->pulse_timer,
198 PWM_OMAP_DMTIMER_SRC_SYS_CLK); 187 PWM_OMAP_DMTIMER_SRC_SYS_CLK);
199
200 lirc_rx51->dmtimer->enable(lirc_rx51->pwm_timer);
201 lirc_rx51->dmtimer->enable(lirc_rx51->pulse_timer); 188 lirc_rx51->dmtimer->enable(lirc_rx51->pulse_timer);
202 189 lirc_rx51->irq_num =
203 lirc_rx51->irq_num = lirc_rx51->dmtimer->get_irq(lirc_rx51->pulse_timer); 190 lirc_rx51->dmtimer->get_irq(lirc_rx51->pulse_timer);
204 retval = request_irq(lirc_rx51->irq_num, lirc_rx51_interrupt_handler, 191 retval = request_irq(lirc_rx51->irq_num, lirc_rx51_interrupt_handler,
205 IRQF_SHARED, "lirc_pulse_timer", lirc_rx51); 192 IRQF_SHARED, "lirc_pulse_timer", lirc_rx51);
206 if (retval) { 193 if (retval) {
@@ -208,7 +195,7 @@ static int lirc_rx51_init_port(struct lirc_rx51 *lirc_rx51)
208 goto err2; 195 goto err2;
209 } 196 }
210 197
211 clk_fclk = lirc_rx51->dmtimer->get_fclk(lirc_rx51->pwm_timer); 198 clk_fclk = lirc_rx51->dmtimer->get_fclk(lirc_rx51->pulse_timer);
212 lirc_rx51->fclk_khz = clk_get_rate(clk_fclk) / 1000; 199 lirc_rx51->fclk_khz = clk_get_rate(clk_fclk) / 1000;
213 200
214 return 0; 201 return 0;
@@ -216,7 +203,7 @@ static int lirc_rx51_init_port(struct lirc_rx51 *lirc_rx51)
216err2: 203err2:
217 lirc_rx51->dmtimer->free(lirc_rx51->pulse_timer); 204 lirc_rx51->dmtimer->free(lirc_rx51->pulse_timer);
218err1: 205err1:
219 lirc_rx51->dmtimer->free(lirc_rx51->pwm_timer); 206 pwm_put(lirc_rx51->pwm);
220 207
221 return retval; 208 return retval;
222} 209}
@@ -226,11 +213,10 @@ static int lirc_rx51_free_port(struct lirc_rx51 *lirc_rx51)
226 lirc_rx51->dmtimer->set_int_enable(lirc_rx51->pulse_timer, 0); 213 lirc_rx51->dmtimer->set_int_enable(lirc_rx51->pulse_timer, 0);
227 free_irq(lirc_rx51->irq_num, lirc_rx51); 214 free_irq(lirc_rx51->irq_num, lirc_rx51);
228 lirc_rx51_off(lirc_rx51); 215 lirc_rx51_off(lirc_rx51);
229 lirc_rx51->dmtimer->disable(lirc_rx51->pwm_timer);
230 lirc_rx51->dmtimer->disable(lirc_rx51->pulse_timer); 216 lirc_rx51->dmtimer->disable(lirc_rx51->pulse_timer);
231 lirc_rx51->dmtimer->free(lirc_rx51->pwm_timer);
232 lirc_rx51->dmtimer->free(lirc_rx51->pulse_timer); 217 lirc_rx51->dmtimer->free(lirc_rx51->pulse_timer);
233 lirc_rx51->wbuf_index = -1; 218 lirc_rx51->wbuf_index = -1;
219 pwm_put(lirc_rx51->pwm);
234 220
235 return 0; 221 return 0;
236} 222}
@@ -387,7 +373,6 @@ static int lirc_rx51_release(struct inode *inode, struct file *file)
387} 373}
388 374
389static struct lirc_rx51 lirc_rx51 = { 375static struct lirc_rx51 lirc_rx51 = {
390 .freq = 38000,
391 .duty_cycle = 50, 376 .duty_cycle = 50,
392 .wbuf_index = -1, 377 .wbuf_index = -1,
393}; 378};
@@ -445,14 +430,34 @@ static int lirc_rx51_resume(struct platform_device *dev)
445 430
446static int lirc_rx51_probe(struct platform_device *dev) 431static int lirc_rx51_probe(struct platform_device *dev)
447{ 432{
433 struct pwm_device *pwm;
434
448 lirc_rx51_driver.features = LIRC_RX51_DRIVER_FEATURES; 435 lirc_rx51_driver.features = LIRC_RX51_DRIVER_FEATURES;
449 lirc_rx51.pdata = dev->dev.platform_data; 436 lirc_rx51.pdata = dev->dev.platform_data;
437
438 if (!lirc_rx51.pdata) {
439 dev_err(&dev->dev, "Platform Data is missing\n");
440 return -ENXIO;
441 }
442
450 if (!lirc_rx51.pdata->dmtimer) { 443 if (!lirc_rx51.pdata->dmtimer) {
451 dev_err(&dev->dev, "no dmtimer?\n"); 444 dev_err(&dev->dev, "no dmtimer?\n");
452 return -ENODEV; 445 return -ENODEV;
453 } 446 }
454 447
455 lirc_rx51.pwm_timer_num = lirc_rx51.pdata->pwm_timer; 448 pwm = pwm_get(&dev->dev, NULL);
449 if (IS_ERR(pwm)) {
450 int err = PTR_ERR(pwm);
451
452 if (err != -EPROBE_DEFER)
453 dev_err(&dev->dev, "pwm_get failed: %d\n", err);
454 return err;
455 }
456
457 /* Use default, in case userspace does not set the carrier */
458 lirc_rx51.freq = DIV_ROUND_CLOSEST(pwm_get_period(pwm), NSEC_PER_SEC);
459 pwm_put(pwm);
460
456 lirc_rx51.dmtimer = lirc_rx51.pdata->dmtimer; 461 lirc_rx51.dmtimer = lirc_rx51.pdata->dmtimer;
457 lirc_rx51.dev = &dev->dev; 462 lirc_rx51.dev = &dev->dev;
458 lirc_rx51_driver.dev = &dev->dev; 463 lirc_rx51_driver.dev = &dev->dev;
@@ -464,8 +469,6 @@ static int lirc_rx51_probe(struct platform_device *dev)
464 lirc_rx51_driver.minor); 469 lirc_rx51_driver.minor);
465 return lirc_rx51_driver.minor; 470 return lirc_rx51_driver.minor;
466 } 471 }
467 dev_info(lirc_rx51.dev, "registration ok, minor: %d, pwm: %d\n",
468 lirc_rx51_driver.minor, lirc_rx51.pwm_timer_num);
469 472
470 return 0; 473 return 0;
471} 474}
diff --git a/include/linux/platform_data/media/ir-rx51.h b/include/linux/platform_data/media/ir-rx51.h
index 3038120ca46e..6acf22d497f7 100644
--- a/include/linux/platform_data/media/ir-rx51.h
+++ b/include/linux/platform_data/media/ir-rx51.h
@@ -2,8 +2,6 @@
2#define _LIRC_RX51_H 2#define _LIRC_RX51_H
3 3
4struct lirc_rx51_platform_data { 4struct lirc_rx51_platform_data {
5 int pwm_timer;
6
7 int(*set_max_mpu_wakeup_lat)(struct device *dev, long t); 5 int(*set_max_mpu_wakeup_lat)(struct device *dev, long t);
8 struct pwm_omap_dmtimer_pdata *dmtimer; 6 struct pwm_omap_dmtimer_pdata *dmtimer;
9}; 7};