History

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.

Ivaylo Dimitrov committed 10 years ago

Commit 3fdd1521 parent a74a1984 files · +44 −45Browse files

Unified · Split

4 files
  1. arch/arm/mach-omap2/board-rx51-peripherals.c +0 −1
  2. arch/arm/mach-omap2/pdata-quirks.c +0 −1
  3. drivers/media/rc/ir-rx51.c +44 −41
  4. include/linux/platform_data/media/ir-rx51.h +0 −2
arch/arm/mach-omap2/board-rx51-peripherals.c+0−1
@@ -1242,7 +1242,6 @@ static struct pwm_omap_dmtimer_pdata __maybe_unused pwm_dmtimer_pdata = { · 1241 unmodified lines
12421242 #if defined(CONFIG_IR_RX51) || defined(CONFIG_IR_RX51_MODULE)
12431243 static struct lirc_rx51_platform_data rx51_lirc_data = {
12441244 .set_max_mpu_wakeup_lat = omap_pm_set_max_mpu_wakeup_lat,
1245− .pwm_timer = 9, /* Use GPT 9 for CIR */
12461245 #if IS_ENABLED(CONFIG_OMAP_DM_TIMER)
12471246 .dmtimer = &pwm_dmtimer_pdata,
12481247 #endif
arch/arm/mach-omap2/pdata-quirks.c+0−1
@@ -491,7 +491,6 @@ static struct pwm_omap_dmtimer_pdata pwm_dmtimer_pdata = { · 490 unmodified lines
491491
492492 static struct lirc_rx51_platform_data __maybe_unused rx51_lirc_data = {
493493 .set_max_mpu_wakeup_lat = omap_pm_set_max_mpu_wakeup_lat,
494− .pwm_timer = 9, /* Use GPT 9 for CIR */
495494 #if IS_ENABLED(CONFIG_OMAP_DM_TIMER)
496495 .dmtimer = &pwm_dmtimer_pdata,
497496 #endif
drivers/media/rc/ir-rx51.c+44−41
@@ -12,13 +12,7 @@ · 11 unmodified lines
1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1313 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1414 * 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− *
2015 */
21−
2216 #include <linux/clk.h>
2317 #include <linux/module.h>
2418 #include <linux/interrupt.h>
@@ -26,6 +20,7 @@ · 1 unmodified line
2620 #include <linux/platform_device.h>
2721 #include <linux/sched.h>
2822 #include <linux/wait.h>
23+#include <linux/pwm.h>
2924
3025 #include <media/lirc.h>
3126 #include <media/lirc_dev.h>
@@ -43,7 +38,7 @@ · 11 unmodified lines
4338 #define TIMER_MAX_VALUE 0xffffffff
4439
4540 struct lirc_rx51 {
46− pwm_omap_dmtimer *pwm_timer;
41+ struct pwm_device *pwm;
4742 pwm_omap_dmtimer *pulse_timer;
4843 struct pwm_omap_dmtimer_pdata *dmtimer;
4944 struct device *dev;
@@ -58,32 +53,28 @@ struct lirc_rx51 { · 8 unmodified lines
5853 int wbuf[WBUF_LEN];
5954 int wbuf_index;
6055 unsigned long device_is_open;
61− int pwm_timer_num;
6256 };
6357
6458 static void lirc_rx51_on(struct lirc_rx51 *lirc_rx51)
6559 {
66− lirc_rx51->dmtimer->set_pwm(lirc_rx51->pwm_timer, 0, 1,
67− PWM_OMAP_DMTIMER_TRIGGER_OVERFLOW_AND_COMPARE);
60+ pwm_enable(lirc_rx51->pwm);
6861 }
6962
7063 static void lirc_rx51_off(struct lirc_rx51 *lirc_rx51)
7164 {
72− lirc_rx51->dmtimer->set_pwm(lirc_rx51->pwm_timer, 0, 1,
73− PWM_OMAP_DMTIMER_TRIGGER_NONE);
65+ pwm_disable(lirc_rx51->pwm);
7466 }
7567
7668 static int init_timing_params(struct lirc_rx51 *lirc_rx51)
7769 {
78− u32 load, match;
79−
80− load = -(lirc_rx51->fclk_khz * 1000 / lirc_rx51->freq);
81− match = -(lirc_rx51->duty_cycle * -load / 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);
70+ struct pwm_device *pwm = lirc_rx51->pwm;
71+ int duty, period = DIV_ROUND_CLOSEST(NSEC_PER_SEC, lirc_rx51->freq);
72+
73+ duty = DIV_ROUND_CLOSEST(lirc_rx51->duty_cycle * period, 100);
8674 lirc_rx51->dmtimer->set_int_enable(lirc_rx51->pulse_timer, 0);
75+
76+ pwm_config(pwm, duty, period);
77+
8778 lirc_rx51->dmtimer->start(lirc_rx51->pulse_timer);
8879
8980 lirc_rx51->match = 0;
@@ -165,7 +156,7 @@ end: · 75 unmodified lines
165156 /* Stop TX here */
166157 lirc_rx51_off(lirc_rx51);
167158 lirc_rx51->wbuf_index = -1;
168− lirc_rx51->dmtimer->stop(lirc_rx51->pwm_timer);
159+
169160 lirc_rx51->dmtimer->stop(lirc_rx51->pulse_timer);
170161 lirc_rx51->dmtimer->set_int_enable(lirc_rx51->pulse_timer, 0);
171162 wake_up_interruptible(&lirc_rx51->wqueue);
@@ -176,13 +167,13 @@ end: · 4 unmodified lines
176167 static int lirc_rx51_init_port(struct lirc_rx51 *lirc_rx51)
177168 {
178169 struct clk *clk_fclk;
179− int retval, pwm_timer = lirc_rx51->pwm_timer_num;
170+ int retval;
180171
181− lirc_rx51->pwm_timer = lirc_rx51->dmtimer->request_specific(pwm_timer);
182− if (lirc_rx51->pwm_timer == NULL) {
183− dev_err(lirc_rx51->dev, ": Error requesting GPT%d timer\n",
184− pwm_timer);
185− return -EBUSY;
172+ lirc_rx51->pwm = pwm_get(lirc_rx51->dev, NULL);
173+ if (IS_ERR(lirc_rx51->pwm)) {
174+ retval = PTR_ERR(lirc_rx51->pwm);
175+ dev_err(lirc_rx51->dev, ": pwm_get failed: %d\n", retval);
176+ return retval;
186177 }
187178
188179 lirc_rx51->pulse_timer = lirc_rx51->dmtimer->request();
@@ -192,15 +183,11 @@ static int lirc_rx51_init_port(struct lirc_rx51 *lirc_rx51) · 3 unmodified lines
192183 goto err1;
193184 }
194185
195− lirc_rx51->dmtimer->set_source(lirc_rx51->pwm_timer,
196− PWM_OMAP_DMTIMER_SRC_SYS_CLK);
197186 lirc_rx51->dmtimer->set_source(lirc_rx51->pulse_timer,
198187 PWM_OMAP_DMTIMER_SRC_SYS_CLK);
199−
200− lirc_rx51->dmtimer->enable(lirc_rx51->pwm_timer);
201188 lirc_rx51->dmtimer->enable(lirc_rx51->pulse_timer);
202−
203− lirc_rx51->irq_num = lirc_rx51->dmtimer->get_irq(lirc_rx51->pulse_timer);
189+ lirc_rx51->irq_num =
190+ lirc_rx51->dmtimer->get_irq(lirc_rx51->pulse_timer);
204191 retval = request_irq(lirc_rx51->irq_num, lirc_rx51_interrupt_handler,
205192 IRQF_SHARED, "lirc_pulse_timer", lirc_rx51);
206193 if (retval) {
@@ -208,7 +195,7 @@ static int lirc_rx51_init_port(struct lirc_rx51 *lirc_rx51) · 1 unmodified line
208195 goto err2;
209196 }
210197
211− clk_fclk = lirc_rx51->dmtimer->get_fclk(lirc_rx51->pwm_timer);
198+ clk_fclk = lirc_rx51->dmtimer->get_fclk(lirc_rx51->pulse_timer);
212199 lirc_rx51->fclk_khz = clk_get_rate(clk_fclk) / 1000;
213200
214201 return 0;
@@ -216,7 +203,7 @@ static int lirc_rx51_init_port(struct lirc_rx51 *lirc_rx51) · 1 unmodified line
216203 err2:
217204 lirc_rx51->dmtimer->free(lirc_rx51->pulse_timer);
218205 err1:
219− lirc_rx51->dmtimer->free(lirc_rx51->pwm_timer);
206+ pwm_put(lirc_rx51->pwm);
220207
221208 return retval;
222209 }
@@ -226,11 +213,10 @@ static int lirc_rx51_free_port(struct lirc_rx51 *lirc_rx51) · 3 unmodified lines
226213 lirc_rx51->dmtimer->set_int_enable(lirc_rx51->pulse_timer, 0);
227214 free_irq(lirc_rx51->irq_num, lirc_rx51);
228215 lirc_rx51_off(lirc_rx51);
229− lirc_rx51->dmtimer->disable(lirc_rx51->pwm_timer);
230216 lirc_rx51->dmtimer->disable(lirc_rx51->pulse_timer);
231− lirc_rx51->dmtimer->free(lirc_rx51->pwm_timer);
232217 lirc_rx51->dmtimer->free(lirc_rx51->pulse_timer);
233218 lirc_rx51->wbuf_index = -1;
219+ pwm_put(lirc_rx51->pwm);
234220
235221 return 0;
236222 }
@@ -387,7 +373,6 @@ static int lirc_rx51_release(struct inode *inode, struct file *file) · 150 unmodified lines
387373 }
388374
389375 static struct lirc_rx51 lirc_rx51 = {
390− .freq = 38000,
391376 .duty_cycle = 50,
392377 .wbuf_index = -1,
393378 };
@@ -445,14 +430,34 @@ static int lirc_rx51_resume(struct platform_device *dev) · 51 unmodified lines
445430
446431 static int lirc_rx51_probe(struct platform_device *dev)
447432 {
433+ struct pwm_device *pwm;
434+
448435 lirc_rx51_driver.features = LIRC_RX51_DRIVER_FEATURES;
449436 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+
450443 if (!lirc_rx51.pdata->dmtimer) {
451444 dev_err(&dev->dev, "no dmtimer?\n");
452445 return -ENODEV;
453446 }
454447
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+
456461 lirc_rx51.dmtimer = lirc_rx51.pdata->dmtimer;
457462 lirc_rx51.dev = &dev->dev;
458463 lirc_rx51_driver.dev = &dev->dev;
@@ -464,8 +469,6 @@ static int lirc_rx51_probe(struct platform_device *dev) · 5 unmodified lines
464469 lirc_rx51_driver.minor);
465470 return lirc_rx51_driver.minor;
466471 }
467− dev_info(lirc_rx51.dev, "registration ok, minor: %d, pwm: %d\n",
468− lirc_rx51_driver.minor, lirc_rx51.pwm_timer_num);
469472
470473 return 0;
471474 }
include/linux/platform_data/media/ir-rx51.h+0−2
@@ -2,8 +2,6 @@ · 1 unmodified line
22 #define _LIRC_RX51_H
33
44 struct lirc_rx51_platform_data {
5− int pwm_timer;
6−
75 int(*set_max_mpu_wakeup_lat)(struct device *dev, long t);
86 struct pwm_omap_dmtimer_pdata *dmtimer;
97 };