[PATCH v2 10/26] MIPS: JZ4740: Add PWM support

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Lars-Peter Clausen
Date: Friday, June 18, 2010 - 10:08 pm

This patch adds support for the PWM part of the timer unit on a JZ4740 SoC.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 arch/mips/jz4740/pwm.c |  169 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 169 insertions(+), 0 deletions(-)
 create mode 100644 arch/mips/jz4740/pwm.c

diff --git a/arch/mips/jz4740/pwm.c b/arch/mips/jz4740/pwm.c
new file mode 100644
index 0000000..f28369c
--- /dev/null
+++ b/arch/mips/jz4740/pwm.c
@@ -0,0 +1,169 @@
+/*
+ *  Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
+ *  JZ4740 platform PWM support
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under  the terms of the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <linux/kernel.h>
+
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/pwm.h>
+#include <linux/gpio.h>
+
+#include <asm/mach-jz4740/gpio.h>
+#include "timer.h"
+
+static struct clk *jz4740_pwm_clk;
+
+DEFINE_MUTEX(jz4740_pwm_mutex);
+
+struct pwm_device {
+	unsigned int id;
+	unsigned int gpio;
+	bool used;
+};
+
+static struct pwm_device jz4740_pwm_list[] = {
+	{ 2, JZ_GPIO_PWM2, false },
+	{ 3, JZ_GPIO_PWM3, false },
+	{ 4, JZ_GPIO_PWM4, false },
+	{ 5, JZ_GPIO_PWM5, false },
+	{ 6, JZ_GPIO_PWM6, false },
+	{ 7, JZ_GPIO_PWM7, false },
+};
+
+struct pwm_device *pwm_request(int id, const char *label)
+{
+	int ret = 0;
+	struct pwm_device *pwm;
+
+	if (!jz4740_pwm_clk) {
+		jz4740_pwm_clk = clk_get(NULL, "ext");
+
+		if (IS_ERR(jz4740_pwm_clk))
+			return ERR_CAST(jz4740_pwm_clk);
+	}
+
+	if (id < 2 || id > 7)
+		return ERR_PTR(-ENOENT);
+
+	mutex_lock(&jz4740_pwm_mutex);
+
+	pwm = &jz4740_pwm_list[id - 2];
+	if (pwm->used)
+		ret = -EBUSY;
+	else
+		pwm->used = true;
+
+	mutex_unlock(&jz4740_pwm_mutex);
+
+	if (ret)
+		return ERR_PTR(ret);
+
+	ret = gpio_request(pwm->gpio, label);
+
+	if (ret) {
+		printk(KERN_ERR "Failed to request pwm gpio: %d\n", ret);
+		pwm->used = false;
+		return ERR_PTR(ret);
+	}
+
+	jz_gpio_set_function(pwm->gpio, JZ_GPIO_FUNC_PWM);
+
+	jz4740_timer_start(id);
+
+	return pwm;
+}
+
+void pwm_free(struct pwm_device *pwm)
+{
+	pwm_disable(pwm);
+	jz4740_timer_set_ctrl(pwm->id, 0);
+
+	jz_gpio_set_function(pwm->gpio, JZ_GPIO_FUNC_NONE);
+	gpio_free(pwm->gpio);
+
+	jz4740_timer_stop(pwm->id);
+
+	pwm->used = false;
+}
+
+int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
+{
+	unsigned long long tmp;
+	unsigned long period, duty;
+	unsigned int prescaler = 0;
+	unsigned int id = pwm->id;
+	uint16_t ctrl;
+	bool is_enabled;
+
+	if (duty_ns < 0 || duty_ns > period_ns)
+		return -EINVAL;
+
+	tmp = (unsigned long long)clk_get_rate(jz4740_pwm_clk) * period_ns;
+	do_div(tmp, 1000000000);
+	period = tmp;
+
+	while (period > 0xffff && prescaler < 6) {
+		period >>= 2;
+		++prescaler;
+	}
+
+	if (prescaler == 6)
+		return -EINVAL;
+
+	tmp = (unsigned long long)period * duty_ns;
+	do_div(tmp, period_ns);
+	duty = period - tmp;
+
+	if (duty >= period)
+		duty = period - 1;
+
+	is_enabled = jz4740_timer_is_enabled(id);
+	if (is_enabled)
+		pwm_disable(pwm);
+
+	jz4740_timer_set_count(id, 0);
+	jz4740_timer_set_duty(id, duty);
+	jz4740_timer_set_period(id, period);
+
+	ctrl = JZ_TIMER_CTRL_PRESCALER(prescaler) | JZ_TIMER_CTRL_SRC_EXT |
+		JZ_TIMER_CTRL_PWM_ABBRUPT_SHUTDOWN;
+
+	jz4740_timer_set_ctrl(id, ctrl);
+
+	if (is_enabled)
+		pwm_enable(pwm);
+
+	return 0;
+}
+
+int pwm_enable(struct pwm_device *pwm)
+{
+	uint32_t ctrl = jz4740_timer_get_ctrl(pwm->id);
+
+	ctrl |= JZ_TIMER_CTRL_PWM_ENABLE;
+	jz4740_timer_set_ctrl(pwm->id, ctrl);
+	jz4740_timer_enable(pwm->id);
+
+	return 0;
+}
+
+void pwm_disable(struct pwm_device *pwm)
+{
+	uint32_t ctrl = jz4740_timer_get_ctrl(pwm->id);
+
+	ctrl &= ~JZ_TIMER_CTRL_PWM_ENABLE;
+	jz4740_timer_disable(pwm->id);
+	jz4740_timer_set_ctrl(pwm->id, ctrl);
+}
-- 
1.5.6.5

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH v2 00/26] Add support for the Ingenic JZ4740 System ..., Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 01/26] MIPS: Add base support for Ingenic JZ4740 ..., Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 02/26] MIPS: jz4740: Add IRQ handler code, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 03/26] MIPS: JZ4740: Add clock API support., Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 04/26] MIPS: JZ4740: Add timer support, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 05/26] MIPS: JZ4740: Add clocksource/clockevent ..., Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 06/26] MIPS: JZ4740: Add power-management and sy ..., Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 07/26] MIPS: JZ4740: Add setup code, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 08/26] MIPS: JZ4740: Add gpio support, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 09/26] MIPS: JZ4740: Add DMA support., Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 10/26] MIPS: JZ4740: Add PWM support, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 11/26] MIPS: JZ4740: Add serial support, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 12/26] MIPS: JZ4740: Add prom support, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 13/26] MIPS: JZ4740: Add platform devices, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 14/26] MIPS: JZ4740: Add Kbuild files, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 15/26] RTC: Add JZ4740 RTC driver, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 16/26] fbdev: Add JZ4740 framebuffer driver, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 17/26] MTD: Nand: Add JZ4740 NAND driver, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 18/26] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 19/26] USB: Add JZ4740 ohci support, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 20/26] alsa: ASoC: Add JZ4740 codec driver, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 21/26] alsa: ASoC: Add JZ4740 ASoC support, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 22/26] MFD: Add JZ4740 ADC driver, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 23/26] hwmon: Add JZ4740 ADC driver, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 24/26] power: Add JZ4740 battery driver., Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 25/26] MIPS: JZ4740: Add qi_lb60 board support, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
[PATCH v2 26/26] alsa: ASoC: JZ4740: Add qi_lb60 board driver, Lars-Peter Clausen, (Fri Jun 18, 10:08 pm)
Re: [PATCH v2 15/26] RTC: Add JZ4740 RTC driver, Marek Vasut, (Sat Jun 19, 3:43 am)
Re: [lm-sensors] [PATCH v2 23/26] hwmon: Add JZ4740 ADC driver, Lars-Peter Clausen, (Sat Jun 19, 5:58 am)
Re: [PATCH v2 15/26] RTC: Add JZ4740 RTC driver, Lars-Peter Clausen, (Sat Jun 19, 6:05 am)
Re: [PATCH v2 15/26] RTC: Add JZ4740 RTC driver, Wan ZongShun, (Sat Jun 19, 6:37 am)
Re: [PATCH v2 15/26] RTC: Add JZ4740 RTC driver, Lars-Peter Clausen, (Sat Jun 19, 6:53 am)
Re: [PATCH v2 15/26] RTC: Add JZ4740 RTC driver, Marek Vasut, (Sat Jun 19, 7:04 am)
Re: [PATCH v2 15/26] RTC: Add JZ4740 RTC driver, Wan ZongShun, (Sat Jun 19, 7:36 am)
Re: [PATCH v2 18/26] MMC: Add JZ4740 mmc driver, Matt Fleming, (Sat Jun 19, 7:46 am)
[PATCH v3] hwmon: Add JZ4740 ADC driver, Lars-Peter Clausen, (Sat Jun 19, 7:47 am)
[PATCH v3] alsa: ASoC: Add JZ4740 codec driver, Lars-Peter Clausen, (Sat Jun 19, 7:49 am)
[PATCH v3] alsa: ASoC: Add JZ4740 ASoC support, Lars-Peter Clausen, (Sat Jun 19, 7:50 am)
[PATCH v3] alsa: ASoC: JZ4740: Add qi_lb60 board driver, Lars-Peter Clausen, (Sat Jun 19, 7:52 am)
Re: [PATCH v2 18/26] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Sat Jun 19, 8:29 am)
Re: [PATCH v2 19/26] USB: Add JZ4740 ohci support, Greg KH, (Sat Jun 19, 10:17 am)
Re: [PATCH v2 15/26] RTC: Add JZ4740 RTC driver, Lars-Peter Clausen, (Sat Jun 19, 10:42 am)
Re: [PATCH v2 15/26] RTC: Add JZ4740 RTC driver, Geert Uytterhoeven, (Sat Jun 19, 10:53 am)
Re: [lm-sensors] [PATCH v3] hwmon: Add JZ4740 ADC driver, Lars-Peter Clausen, (Sat Jun 19, 10:59 am)
[PATCH v3] RTC: Add JZ4740 RTC driver, Lars-Peter Clausen, (Sat Jun 19, 12:29 pm)
[PATCH v4] hwmon: Add JZ4740 ADC driver, Lars-Peter Clausen, (Sat Jun 19, 12:32 pm)
Re: [rtc-linux] [PATCH v3] RTC: Add JZ4740 RTC driver, Wan ZongShun, (Sat Jun 19, 6:13 pm)
Re: [rtc-linux] [PATCH v3] RTC: Add JZ4740 RTC driver, Lars-Peter Clausen, (Sat Jun 19, 6:23 pm)
Re: [rtc-linux] [PATCH v3] RTC: Add JZ4740 RTC driver, Wan ZongShun, (Sat Jun 19, 6:30 pm)
Re: [lm-sensors] [PATCH v4] hwmon: Add JZ4740 ADC driver, Jean Delvare, (Sat Jun 19, 11:32 pm)
Re: [PATCH v3] alsa: ASoC: Add JZ4740 codec driver, Mark Brown, (Sun Jun 20, 6:11 am)
Re: [PATCH v2 00/26] Add support for the Ingenic JZ4740 Sy ..., Lars-Peter Clausen, (Sun Jun 20, 7:31 am)
Re: [PATCH v2 00/26] Add support for the Ingenic JZ4740 Sy ..., Thomas Bogendoerfer, (Sun Jun 20, 9:34 am)
Re: [PATCH v2 00/26] Add support for the Ingenic JZ4740 Sy ..., Lars-Peter Clausen, (Sun Jun 20, 9:49 am)
Re: [PATCH v2 00/26] Add support for the Ingenic JZ4740 Sy ..., Thomas Bogendoerfer, (Sun Jun 20, 10:01 am)
Re: [PATCH v2 00/26] Add support for the Ingenic JZ4740 Sy ..., Florian Fainelli, (Sun Jun 20, 10:57 am)
Re: [PATCH v2 00/26] Add support for the Ingenic JZ4740 Sy ..., Lars-Peter Clausen, (Sun Jun 20, 11:30 am)
[PATCH v4] alsa: ASoC: Add JZ4740 codec driver, Lars-Peter Clausen, (Mon Jun 21, 3:46 pm)
Re: [PATCH v3] RTC: Add JZ4740 RTC driver, Alessandro Zummo, (Mon Jun 21, 10:53 pm)
Re: [PATCH v4] alsa: ASoC: Add JZ4740 codec driver, Liam Girdwood, (Tue Jun 22, 3:12 am)
Re: [PATCH v4] alsa: ASoC: Add JZ4740 codec driver, Mark Brown, (Tue Jun 22, 4:12 pm)
Re: [PATCH v2 24/26] power: Add JZ4740 battery driver., Lars-Peter Clausen, (Sat Jun 26, 6:58 pm)
[PATCH v3] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Sun Jun 27, 6:20 pm)
[PATCH v3 10/26] MIPS: JZ4740: Add PWM support, Lars-Peter Clausen, (Sun Jun 27, 6:23 pm)
[PATCH v3 03/26] MIPS: JZ4740: Add clock API support., Lars-Peter Clausen, (Sun Jun 27, 6:24 pm)
Re: [PATCH v2 24/26] power: Add JZ4740 battery driver., Anton Vorontsov, (Mon Jun 28, 4:43 am)
Re: [PATCH v3] MMC: Add JZ4740 mmc driver, Matt Fleming, (Tue Jun 29, 1:17 pm)
Re: [PATCH v3] MMC: Add JZ4740 mmc driver, Andrew Morton, (Wed Jun 30, 1:55 pm)
Re: [PATCH v3] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Thu Jul 1, 8:45 am)
Re: [PATCH v3] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Thu Jul 1, 8:47 am)
Re: [PATCH v2 16/26] fbdev: Add JZ4740 framebuffer driver, Lars-Peter Clausen, (Sun Jul 4, 3:27 pm)
Re: [PATCH v2 17/26] MTD: Nand: Add JZ4740 NAND , Lars-Peter Clausen, (Sun Jul 4, 3:35 pm)
Re: [PATCH v2 22/26] MFD: Add JZ4740 ADC driver, Lars-Peter Clausen, (Sun Jul 4, 3:47 pm)
Re: [PATCH v2 22/26] MFD: Add JZ4740 ADC driver, Samuel Ortiz, (Mon Jul 5, 7:53 am)
Re: [PATCH v2 22/26] MFD: Add JZ4740 ADC driver, Lars-Peter Clausen, (Mon Jul 5, 8:43 am)
Re: [PATCH v2 22/26] MFD: Add JZ4740 ADC driver, Samuel Ortiz, (Mon Jul 5, 8:53 am)
Re: [PATCH v2 17/26] MTD: Nand: Add JZ4740 NAND driver, Artem Bityutskiy, (Wed Jul 7, 11:06 pm)
Re: [PATCH v2 17/26] MTD: Nand: Add JZ4740 NAND driver, Artem Bityutskiy, (Thu Jul 8, 6:19 am)
Re: [PATCH v2 17/26] MTD: Nand: Add JZ4740 NAND driver, Lars-Peter Clausen, (Thu Jul 8, 6:20 am)
Re: [PATCH v2 16/26] fbdev: Add JZ4740 framebuffer driver, Lars-Peter Clausen, (Thu Jul 8, 6:28 am)
Re: [PATCH v2 17/26] MTD: Nand: Add JZ4740 NAND driver, Lars-Peter Clausen, (Thu Jul 8, 7:02 am)
Re: [PATCH v2 17/26] MTD: Nand: Add JZ4740 NAND driver, Artem Bityutskiy, (Thu Jul 8, 7:14 am)
Re: [PATCH v2 16/26] fbdev: Add JZ4740 framebuffer driver, Lars-Peter Clausen, (Fri Jul 9, 8:31 am)
[PATCH v3] MFD: Add JZ4740 ADC driver, Lars-Peter Clausen, (Sun Jul 11, 6:48 pm)
[PATCH v4] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Mon Jul 12, 2:33 pm)
Re: [PATCH v4] MMC: Add JZ4740 mmc driver, Randy Dunlap, (Mon Jul 12, 2:41 pm)
Re: [PATCH v4] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Mon Jul 12, 3:07 pm)
[PATCH v5] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Mon Jul 12, 3:20 pm)
Re: [PATCH v5] MMC: Add JZ4740 mmc driver, Joe Perches, (Mon Jul 12, 3:45 pm)
Re: [PATCH v5] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Mon Jul 12, 4:45 pm)
Re: [PATCH v3] MFD: Add JZ4740 ADC driver, Samuel Ortiz, (Wed Jul 14, 2:19 am)
[PATCH v6] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Thu Jul 15, 2:06 pm)
Re: [PATCH v6] MMC: Add JZ4740 mmc driver, Andrew Morton, (Thu Jul 15, 2:16 pm)
Re: [PATCH v6] MMC: Add JZ4740 mmc driver, Lars-Peter Clausen, (Thu Jul 15, 2:37 pm)
[PATCH v3] MIPS: jz4740: Add IRQ handler code, Lars-Peter Clausen, (Sat Jul 17, 5:08 am)
[PATCH v4] MIPS: JZ4740: Add clock API support., Lars-Peter Clausen, (Sat Jul 17, 5:10 am)
[PATCH v3] MIPS: JZ4740: Add gpio support, Lars-Peter Clausen, (Sat Jul 17, 5:11 am)
[PATCH v4] MIPS: JZ4740: Add PWM support, Lars-Peter Clausen, (Sat Jul 17, 5:12 am)
[PATCH v3] MIPS: JZ4740: Add platform devices, Lars-Peter Clausen, (Sat Jul 17, 5:13 am)
[PATCH v3] fbdev: Add JZ4740 framebuffer driver, Lars-Peter Clausen, (Sat Jul 17, 5:14 am)
[PATCH v3] MTD: Nand: Add JZ4740 NAND driver, Lars-Peter Clausen, (Sat Jul 17, 5:15 am)