[U-Boot] [PATCH v4 1/2] pwm: sunxi: add support for PWM found on Allwinner A64
Jagan Teki
jagannadh.teki at gmail.com
Tue May 15 06:45:59 UTC 2018
On Mon, May 14, 2018 at 8:46 PM, Vasily Khoruzhick <anarsoul at gmail.com> wrote:
> This commit adds basic support for PWM found on Allwinner A64.
> It can be used for pwm_backlight driver (e.g. for Pinebook)
>
> Signed-off-by: Vasily Khoruzhick <anarsoul at gmail.com>
> ---
> arch/arm/include/asm/arch-sunxi/gpio.h | 1 +
> arch/arm/include/asm/arch-sunxi/pwm.h | 12 ++
> drivers/pwm/Kconfig | 7 +
> drivers/pwm/Makefile | 1 +
> drivers/pwm/sunxi_pwm.c | 178 +++++++++++++++++++++++++
> 5 files changed, 199 insertions(+)
> create mode 100644 drivers/pwm/sunxi_pwm.c
>
> diff --git a/arch/arm/include/asm/arch-sunxi/gpio.h b/arch/arm/include/asm/arch-sunxi/gpio.h
> index 3334fb51f0..e4fe54d8b8 100644
> --- a/arch/arm/include/asm/arch-sunxi/gpio.h
> +++ b/arch/arm/include/asm/arch-sunxi/gpio.h
> @@ -172,6 +172,7 @@ enum sunxi_gpio_number {
> #define SUN8I_GPD_SDC1 3
> #define SUNXI_GPD_LCD0 2
> #define SUNXI_GPD_LVDS0 3
> +#define SUNXI_GPD_PWM 2
>
> #define SUN5I_GPE_SDC2 3
> #define SUN8I_GPE_TWI2 3
> diff --git a/arch/arm/include/asm/arch-sunxi/pwm.h b/arch/arm/include/asm/arch-sunxi/pwm.h
> index 47eb433fb6..dca283c7a9 100644
> --- a/arch/arm/include/asm/arch-sunxi/pwm.h
> +++ b/arch/arm/include/asm/arch-sunxi/pwm.h
> @@ -10,8 +10,15 @@
> #define SUNXI_PWM_CH0_PERIOD (SUNXI_PWM_BASE + 4)
>
> #define SUNXI_PWM_CTRL_PRESCALE0(x) ((x) & 0xf)
> +#define SUNXI_PWM_CTRL_PRESCALE0_MASK 0xf
> #define SUNXI_PWM_CTRL_ENABLE0 (0x5 << 4)
> #define SUNXI_PWM_CTRL_POLARITY0(x) ((x) << 5)
> +#define SUNXI_PWM_CTRL_CH0_ACT_STA BIT(5)
> +#define SUNXI_PWM_CTRL_CLK_GATE BIT(6)
> +
> +#define SUNXI_PWM_CH0_PERIOD_MAX (0xffff)
> +#define SUNXI_PWM_CH0_PERIOD_PRD(x) ((x & 0xffff) << 16)
> +#define SUNXI_PWM_CH0_PERIOD_DUTY(x) ((x) & 0xffff)
>
> #define SUNXI_PWM_PERIOD_80PCT 0x04af03c0
>
> @@ -30,4 +37,9 @@
> #define SUNXI_PWM_MUX SUN8I_GPH_PWM
> #endif
>
> +struct sunxi_pwm {
> + u32 ctrl;
> + u32 ch0_period;
> +};
> +
> #endif
> diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
> index e827558052..2984b79766 100644
> --- a/drivers/pwm/Kconfig
> +++ b/drivers/pwm/Kconfig
> @@ -43,3 +43,10 @@ config PWM_TEGRA
> four channels with a programmable period and duty cycle. Only a
> 32KHz clock is supported by the driver but the duty cycle is
> configurable.
> +
> +config PWM_SUNXI
> + bool "Enable support for the Allwinner Sunxi PWM"
> + depends on DM_PWM
> + help
> + This PWM is found on H3, A64 and other Allwinner SoCs. It supports a
> + programmable period and duty cycle. A 16-bit counter is used.
> diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
> index 16739e7fda..a837c35ed2 100644
> --- a/drivers/pwm/Makefile
> +++ b/drivers/pwm/Makefile
> @@ -15,3 +15,4 @@ obj-$(CONFIG_PWM_IMX) += pwm-imx.o pwm-imx-util.o
> obj-$(CONFIG_PWM_ROCKCHIP) += rk_pwm.o
> obj-$(CONFIG_PWM_SANDBOX) += sandbox_pwm.o
> obj-$(CONFIG_PWM_TEGRA) += tegra_pwm.o
> +obj-$(CONFIG_PWM_SUNXI) += sunxi_pwm.o
> diff --git a/drivers/pwm/sunxi_pwm.c b/drivers/pwm/sunxi_pwm.c
> new file mode 100644
> index 0000000000..3c7dffdd90
> --- /dev/null
> +++ b/drivers/pwm/sunxi_pwm.c
> @@ -0,0 +1,178 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (c) 2017-2018 Vasily Khoruzhick <anarsoul at gmail.com>
> + */
> +
> +#include <common.h>
> +#include <div64.h>
> +#include <dm.h>
> +#include <pwm.h>
> +#include <regmap.h>
> +#include <syscon.h>
> +#include <asm/io.h>
> +#include <asm/arch/pwm.h>
> +#include <asm/arch/gpio.h>
> +#include <power/regulator.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define OSC_24MHZ 24000000
> +
> +struct sunxi_pwm_priv {
> + struct sunxi_pwm *regs;
> + bool invert;
> + u32 prescaler;
> +};
> +
> +static const u32 prescaler_table[] = {
> + 120, /* 0000 */
> + 180, /* 0001 */
> + 240, /* 0010 */
> + 360, /* 0011 */
> + 480, /* 0100 */
> + 0, /* 0101 */
> + 0, /* 0110 */
> + 0, /* 0111 */
> + 12000, /* 1000 */
> + 24000, /* 1001 */
> + 36000, /* 1010 */
> + 48000, /* 1011 */
> + 72000, /* 1100 */
> + 0, /* 1101 */
> + 0, /* 1110 */
> + 1, /* 1111 */
> +};
> +
> +static int sunxi_pwm_config_pinmux(void)
> +{
> +#ifdef CONFIG_MACH_SUN50I
> + sunxi_gpio_set_cfgpin(SUNXI_GPD(22), SUNXI_GPD_PWM);
> +#endif
Drop this ifdef, can be done through drivers_data.
More information about the U-Boot
mailing list