* (unknown),
@ 2016-07-10 9:24 Neil Armstrong
2016-07-10 9:24 ` [PATCH v2 1/4] pwm: Add support for Meson PWM Controller Neil Armstrong
` (4 more replies)
0 siblings, 5 replies; 15+ messages in thread
From: Neil Armstrong @ 2016-07-10 9:24 UTC (permalink / raw)
To: thierry.reding, carlo, khilman
Cc: Neil Armstrong, linux-pwm, linux-arm-kernel, linux-amlogic,
linux-kernel
Subject: [PATCH v2 0/4] pwm: Add Amlogic Meson SoC PWM Controller
Add support for the PWM controller found in Amlogic Meson SoCs.
This controller provides a dual PWM output with 4 selectable clock source
and a two level divider to achieve a better PWM range.
Currently Meson8b and GXBB SoCs are supported.
Changes since v1 at http://lkml.kernel.org/r/1466173784-15625-1-git-send-email-narmstrong@baylibre.com :
- fix meson8b dtsi
Neil Armstrong (4):
pwm: Add support for Meson PWM Controller
dt-bindings: pwm: Add bindings for Meson PWM Controller
ARM64: dts: meson-gxbb: Add Meson GXBB PWM Controller nodes
ARM: dts: meson8b: Add Meson8b PWM Controller nodes
.../devicetree/bindings/pwm/pwm-meson.txt | 21 +
arch/arm/boot/dts/meson8b.dtsi | 21 +
arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 28 ++
drivers/pwm/Kconfig | 9 +
drivers/pwm/Makefile | 1 +
drivers/pwm/pwm-meson.c | 491 +++++++++++++++++++++
6 files changed, 571 insertions(+)
create mode 100644 Documentation/devicetree/bindings/pwm/pwm-meson.txt
create mode 100644 drivers/pwm/pwm-meson.c
--
2.7.0
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v2 1/4] pwm: Add support for Meson PWM Controller 2016-07-10 9:24 (unknown), Neil Armstrong @ 2016-07-10 9:24 ` Neil Armstrong 2016-08-15 16:55 ` Martin Blumenstingl 2016-07-10 9:24 ` [PATCH v2 2/4] dt-bindings: pwm: Add bindings " Neil Armstrong ` (3 subsequent siblings) 4 siblings, 1 reply; 15+ messages in thread From: Neil Armstrong @ 2016-07-10 9:24 UTC (permalink / raw) To: thierry.reding, carlo, khilman Cc: Neil Armstrong, linux-pwm, linux-arm-kernel, linux-amlogic, linux-kernel Add support for the PWM controller found in the Amlogic SoCs. This driver supports the Meson8b and GXBB SoCs. Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> --- drivers/pwm/Kconfig | 9 + drivers/pwm/Makefile | 1 + drivers/pwm/pwm-meson.c | 491 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 501 insertions(+) create mode 100644 drivers/pwm/pwm-meson.c diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig index c182efc..cad5286 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig @@ -245,6 +245,15 @@ config PWM_LPSS_PLATFORM To compile this driver as a module, choose M here: the module will be called pwm-lpss-platform. +config PWM_MESON + tristate "Amlogic Meson PWM driver" + depends on ARCH_MESON + help + The platform driver for Amlogic Meson PWM controller. + + To compile this driver as a module, choose M here: the module + will be called pwm-meson. + config PWM_MTK_DISP tristate "MediaTek display PWM driver" depends on ARCH_MEDIATEK || COMPILE_TEST diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile index dd35bc1..3c8843e 100644 --- a/drivers/pwm/Makefile +++ b/drivers/pwm/Makefile @@ -22,6 +22,7 @@ obj-$(CONFIG_PWM_LPC32XX) += pwm-lpc32xx.o obj-$(CONFIG_PWM_LPSS) += pwm-lpss.o obj-$(CONFIG_PWM_LPSS_PCI) += pwm-lpss-pci.o obj-$(CONFIG_PWM_LPSS_PLATFORM) += pwm-lpss-platform.o +obj-$(CONFIG_PWM_MESON) += pwm-meson.o obj-$(CONFIG_PWM_MTK_DISP) += pwm-mtk-disp.o obj-$(CONFIG_PWM_MXS) += pwm-mxs.o obj-$(CONFIG_PWM_OMAP_DMTIMER) += pwm-omap-dmtimer.o diff --git a/drivers/pwm/pwm-meson.c b/drivers/pwm/pwm-meson.c new file mode 100644 index 0000000..9e7ecf5 --- /dev/null +++ b/drivers/pwm/pwm-meson.c @@ -0,0 +1,491 @@ +/* + * This file is provided under a dual BSD/GPLv2 license. When using or + * redistributing this file, you may do so under either license. + * + * GPL LICENSE SUMMARY + * + * Copyright (c) 2016 BayLibre, SAS. + * Author: Neil Armstrong <narmstrong@baylibre.com> + * Copyright (C) 2014 Amlogic, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * The full GNU General Public License is included in this distribution + * in the file called COPYING. + * + * BSD LICENSE + * + * Copyright (c) 2016 BayLibre, SAS. + * Author: Neil Armstrong <narmstrong@baylibre.com> + * Copyright (C) 2014 Amlogic, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/clk-provider.h> +#include <linux/platform_device.h> +#include <linux/spinlock.h> +#include <linux/slab.h> +#include <linux/clk.h> +#include <linux/err.h> +#include <linux/pwm.h> +#include <linux/io.h> +#include <linux/clk.h> +#include <linux/of.h> + +#define REG_PWM_A 0x0 +#define REG_PWM_B 0x4 +#define PWM_HIGH_SHIFT 16 + +#define REG_MISC_AB 0x8 +#define MISC_B_CLK_EN BIT(23) +#define MISC_A_CLK_EN BIT(15) +#define MISC_CLK_DIV_MASK 0x7f +#define MISC_B_CLK_DIV_SHIFT 16 +#define MISC_A_CLK_DIV_SHIFT 8 +#define MISC_B_CLK_SEL_SHIFT 6 +#define MISC_A_CLK_SEL_SHIFT 4 +#define MISC_CLK_SEL_WIDTH 2 +#define MISC_B_EN BIT(1) +#define MISC_A_EN BIT(0) + +#define PWM_NUM 2 + +static const unsigned int mux_reg_shifts[PWM_NUM] = { + MISC_A_CLK_SEL_SHIFT, MISC_B_CLK_SEL_SHIFT +}; + +static const char * const pwm_parents[] = { + "xtal", "vid_pll", "fclk_div4", "fclk_div3", NULL +}; + +enum pwm_channel { + PWM_A = 0, + PWM_B, +}; + +struct meson_pwm_channel { + unsigned int pwm_hi; + unsigned int pwm_lo; + u8 pwm_pre_div; + int period; + int duty; +}; + +struct meson_pwm_chip { + struct platform_device *pdev; + struct pwm_chip chip; + void __iomem *base; + u8 inverter_mask; + spinlock_t lock; + struct clk *clk_parents[PWM_NUM]; + struct clk_mux mux[PWM_NUM]; + struct clk *clk[PWM_NUM]; +}; + +#define to_meson_pwm_chip(chip) \ + container_of(chip, struct meson_pwm_chip, chip) + +static int meson_pwm_calc(struct meson_pwm_chip *chip, + struct meson_pwm_channel *pwm_chan, + unsigned int id, + int duty_ns, unsigned int period_ns) +{ + unsigned int pwm_pre_div; + unsigned int pwm_cnt; + unsigned int pwm_duty_cnt; + unsigned long fin_freq = -1; + unsigned long fin_ns; + unsigned int i = 0; + + if (duty_ns > period_ns) + return -EINVAL; + + switch (id) { + case PWM_A: + fin_freq = clk_get_rate(chip->clk[0]); + break; + case PWM_B: + fin_freq = clk_get_rate(chip->clk[1]); + break; + } + if (fin_freq <= 0) { + dev_err(chip->chip.dev, "invalid source clock frequency\n"); + return -EINVAL; + } + dev_dbg(chip->chip.dev, "fin_freq: %luHz\n", fin_freq); + fin_ns = NSEC_PER_SEC / fin_freq; + + /* Calc pre_div with the period */ + for (i = 0; i < MISC_CLK_DIV_MASK; i++) { + pwm_pre_div = i; + pwm_cnt = DIV_ROUND_CLOSEST(period_ns, + fin_ns * (pwm_pre_div + 1)); + dev_dbg(chip->chip.dev, "fin_ns=%lu pre_div=%d cnt=%d\n", + fin_ns, pwm_pre_div, pwm_cnt); + if (pwm_cnt <= 0xffff) + break; + } + if (i == MISC_CLK_DIV_MASK) { + dev_err(chip->chip.dev, "Unable to get period pre_div"); + return -EINVAL; + } + dev_dbg(chip->chip.dev, "period_ns=%d pre_div=%d pwm_cnt=%d\n", + period_ns, pwm_pre_div, pwm_cnt); + + if (duty_ns == period_ns) { + pwm_chan->pwm_pre_div = pwm_pre_div; + pwm_chan->pwm_hi = pwm_cnt; + pwm_chan->pwm_lo = 0; + } else if (duty_ns == 0) { + pwm_chan->pwm_pre_div = pwm_pre_div; + pwm_chan->pwm_hi = 0; + pwm_chan->pwm_lo = pwm_cnt; + } else { + /* Then check is we can have the duty with the same pre_div */ + pwm_duty_cnt = DIV_ROUND_CLOSEST(duty_ns, + fin_ns * (pwm_pre_div + 1)); + if (pwm_cnt > 0xffff) { + dev_err(chip->chip.dev, "Unable to get duty period, differences are too high"); + return -EINVAL; + } + dev_dbg(chip->chip.dev, "duty_ns=%d pre_div=%d pwm_cnt=%d\n", + duty_ns, pwm_pre_div, pwm_duty_cnt); + + pwm_chan->pwm_pre_div = pwm_pre_div; + pwm_chan->pwm_hi = pwm_duty_cnt; + pwm_chan->pwm_lo = pwm_cnt - pwm_chan->pwm_hi; + } + + return 0; +} + +static int meson_pwm_request(struct pwm_chip *chip, + struct pwm_device *pwm) +{ + struct meson_pwm_channel *pwm_chan; + + pwm_chan = devm_kzalloc(chip->dev, sizeof(*pwm_chan), GFP_KERNEL); + if (!pwm_chan) + return -ENOMEM; + + pwm_set_chip_data(pwm, pwm_chan); + + return 0; +} + +static void meson_pwm_free(struct pwm_chip *chip, + struct pwm_device *pwm) +{ + devm_kfree(chip->dev, pwm_get_chip_data(pwm)); + pwm_set_chip_data(pwm, NULL); +} + +static int meson_pwm_enable(struct pwm_chip *chip, + struct pwm_device *pwm) +{ + struct meson_pwm_chip *pwm_data = to_meson_pwm_chip(chip); + unsigned int id = pwm->hwpwm; + unsigned long flags; + + spin_lock_irqsave(&pwm_data->lock, flags); + switch (id) { + case PWM_A: + writel(readl(pwm_data->base + REG_MISC_AB) | MISC_A_EN, + pwm_data->base + REG_MISC_AB); + break; + + case PWM_B: + writel(readl(pwm_data->base + REG_MISC_AB) | MISC_B_EN, + pwm_data->base + REG_MISC_AB); + break; + + default: + break; + } + spin_unlock_irqrestore(&pwm_data->lock, flags); + + return 0; +} + +static void meson_pwm_disable(struct pwm_chip *chip, + struct pwm_device *pwm) +{ + struct meson_pwm_chip *pwm_data = to_meson_pwm_chip(chip); + unsigned int id = pwm->hwpwm; + unsigned long flags; + + spin_lock_irqsave(&pwm_data->lock, flags); + switch (id) { + case PWM_A: + writel(readl(pwm_data->base + REG_MISC_AB) & ~MISC_A_EN, + pwm_data->base + REG_MISC_AB); + break; + + case PWM_B: + writel(readl(pwm_data->base + REG_MISC_AB) & ~MISC_B_EN, + pwm_data->base + REG_MISC_AB); + break; + + default: + break; + } + spin_unlock_irqrestore(&pwm_data->lock, flags); +} + +static int meson_pwm_config(struct pwm_chip *chip, + struct pwm_device *pwm, + int duty_ns, + int period_ns) +{ + struct meson_pwm_chip *pwm_data = to_meson_pwm_chip(chip); + struct meson_pwm_channel *pwm_chan = pwm_get_chip_data(pwm); + unsigned int id = pwm->hwpwm; + int ret; + + if ((~(pwm_data->inverter_mask >> id) & 0x1)) + duty_ns = period_ns - duty_ns; + + if (period_ns == pwm_chan->period && duty_ns == pwm_chan->duty) + return 0; + + ret = meson_pwm_calc(pwm_data, pwm_chan, id, duty_ns, period_ns); + if (ret) { + dev_err(chip->dev, "error while calculating pwm parameters\n"); + return ret; + } + + switch (id) { + case PWM_A: + writel((readl(pwm_data->base + REG_MISC_AB) & + ~(MISC_CLK_DIV_MASK << MISC_A_CLK_DIV_SHIFT)) | + ((pwm_chan->pwm_pre_div << MISC_A_CLK_DIV_SHIFT) | + MISC_A_CLK_EN), + pwm_data->base + REG_MISC_AB); + + writel((pwm_chan->pwm_hi << PWM_HIGH_SHIFT) | + (pwm_chan->pwm_lo), + pwm_data->base + REG_PWM_A); + break; + + case PWM_B: + writel((readl(pwm_data->base + REG_MISC_AB) & + ~(MISC_CLK_DIV_MASK << MISC_B_CLK_DIV_SHIFT)) | + ((pwm_chan->pwm_pre_div << MISC_B_CLK_DIV_SHIFT) | + MISC_B_CLK_EN), + pwm_data->base + REG_MISC_AB); + + writel((pwm_chan->pwm_hi << PWM_HIGH_SHIFT) | + (pwm_chan->pwm_lo), + pwm_data->base + REG_PWM_B); + break; + + default: + break; + } + + pwm_chan->period = period_ns; + pwm_chan->duty = duty_ns; + + return 0; +} + +static int meson_pwm_set_polarity(struct pwm_chip *chip, + struct pwm_device *pwm, + enum pwm_polarity polarity) +{ + struct meson_pwm_chip *pwm_data = to_meson_pwm_chip(chip); + struct meson_pwm_channel *pwm_chan = pwm_get_chip_data(pwm); + bool invert = (polarity == PWM_POLARITY_NORMAL); + unsigned long flags; + + spin_lock_irqsave(&pwm_data->lock, flags); + + if (invert) + pwm_data->inverter_mask |= BIT(pwm->hwpwm); + else + pwm_data->inverter_mask &= ~BIT(pwm->hwpwm); + + meson_pwm_config(chip, pwm, pwm_chan->duty, pwm_chan->period); + + spin_unlock_irqrestore(&pwm_data->lock, flags); + + return 0; +} + +static const struct pwm_ops meson_pwm_ops = { + .request = meson_pwm_request, + .free = meson_pwm_free, + .enable = meson_pwm_enable, + .disable = meson_pwm_disable, + .config = meson_pwm_config, + .set_polarity = meson_pwm_set_polarity, + .owner = THIS_MODULE, +}; + +static const struct of_device_id meson_pwm_matches[] = { + { .compatible = "amlogic,meson8b-pwm", }, + { .compatible = "amlogic,meson-gxbb-pwm", }, + {}, +}; +MODULE_DEVICE_TABLE(of, meson_pwm_matches); + +static int meson_pwm_mux_init(struct meson_pwm_chip *chip) +{ + struct device *dev = &chip->pdev->dev; + struct clk_init_data init; + char clk_name[255]; + int ret; + int i; + + for (i = 0 ; i < PWM_NUM ; ++i) { + sprintf(clk_name, "%s#mux%d", + of_node_full_name(dev->of_node), i); + + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_mux_ops; + init.flags = CLK_IS_BASIC; + init.parent_names = pwm_parents; + init.num_parents = 1 << MISC_CLK_SEL_WIDTH; + + chip->mux[i].reg = chip->base + REG_MISC_AB; + chip->mux[i].shift = mux_reg_shifts[i]; + chip->mux[i].mask = BIT(MISC_CLK_SEL_WIDTH) - 1; + chip->mux[i].flags = 0; + chip->mux[i].lock = &chip->lock; + chip->mux[i].table = NULL; + chip->mux[i].hw.init = &init; + + chip->clk[i] = devm_clk_register(dev, &chip->mux[i].hw); + if (IS_ERR(chip->clk[i])) { + dev_err(dev, "Failed to register %s\n", clk_name); + return PTR_ERR(chip->clk[i]); + } + + if (chip->clk_parents[i]) { + ret = clk_set_parent(chip->clk[i], + chip->clk_parents[i]); + if (ret) { + dev_err(dev, "Failed to set %s parent\n", + clk_name); + return ret; + } + } + } + + return 0; +} + +static int meson_pwm_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct meson_pwm_chip *chip; + struct resource *res; + int ret; + + chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); + if (chip == NULL) + return -ENOMEM; + + chip->pdev = pdev; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + chip->base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(chip->base)) + return PTR_ERR(chip->base); + + chip->clk_parents[0] = devm_clk_get(dev, "clkin0"); + if (IS_ERR(chip->clk_parents[0])) { + if (PTR_ERR(chip->clk_parents[0]) == -EPROBE_DEFER) + return PTR_ERR(chip->clk_parents[0]); + chip->clk_parents[0] = NULL; + } + + chip->clk_parents[1] = devm_clk_get(dev, "clkin1"); + if (IS_ERR(chip->clk_parents[1])) { + if (PTR_ERR(chip->clk_parents[1]) == -EPROBE_DEFER) + return PTR_ERR(chip->clk_parents[1]); + chip->clk_parents[1] = NULL; + } + + ret = meson_pwm_mux_init(chip); + if (ret) + return ret; + + clk_prepare_enable(chip->clk[0]); + clk_prepare_enable(chip->clk[1]); + + chip->chip.dev = dev; + chip->chip.ops = &meson_pwm_ops; + chip->chip.base = -1; + chip->chip.npwm = PWM_NUM; + chip->chip.of_xlate = of_pwm_xlate_with_flags; + chip->chip.of_pwm_n_cells = 3; + chip->inverter_mask = BIT(PWM_NUM) - 1; + + ret = pwmchip_add(&chip->chip); + if (ret < 0) { + dev_err(dev, "failed to register PWM chip\n"); + return ret; + } + + platform_set_drvdata(pdev, chip); + + return 0; +} + +static int meson_pwm_remove(struct platform_device *pdev) +{ + struct meson_pwm_chip *chip = platform_get_drvdata(pdev); + + return pwmchip_remove(&chip->chip); +} + +static struct platform_driver meson_pwm_driver = { + .driver = { + .name = "meson-pwm", + .of_match_table = of_match_ptr(meson_pwm_matches), + }, + .probe = meson_pwm_probe, + .remove = meson_pwm_remove, +}; +module_platform_driver(meson_pwm_driver); + +MODULE_ALIAS("platform:meson-pwm"); +MODULE_DESCRIPTION("Amlogic Meson PWM Generator driver"); +MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>"); +MODULE_LICENSE("Dual BSD/GPL"); -- 2.7.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/4] pwm: Add support for Meson PWM Controller 2016-07-10 9:24 ` [PATCH v2 1/4] pwm: Add support for Meson PWM Controller Neil Armstrong @ 2016-08-15 16:55 ` Martin Blumenstingl 2016-08-16 13:50 ` Neil Armstrong 0 siblings, 1 reply; 15+ messages in thread From: Martin Blumenstingl @ 2016-08-15 16:55 UTC (permalink / raw) To: Neil Armstrong Cc: thierry.reding, carlo, khilman, linux-pwm, linux-amlogic, linux-kernel, linux-arm-kernel On Sun, Jul 10, 2016 at 11:24 AM, Neil Armstrong <narmstrong@baylibre.com> wrote: > Add support for the PWM controller found in the Amlogic SoCs. > This driver supports the Meson8b and GXBB SoCs. > > Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> > --- > drivers/pwm/Kconfig | 9 + > drivers/pwm/Makefile | 1 + > drivers/pwm/pwm-meson.c | 491 ++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 501 insertions(+) > create mode 100644 drivers/pwm/pwm-meson.c > > diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig > index c182efc..cad5286 100644 > --- a/drivers/pwm/Kconfig > +++ b/drivers/pwm/Kconfig > @@ -245,6 +245,15 @@ config PWM_LPSS_PLATFORM > To compile this driver as a module, choose M here: the module > will be called pwm-lpss-platform. > > +config PWM_MESON > + tristate "Amlogic Meson PWM driver" > + depends on ARCH_MESON > + help > + The platform driver for Amlogic Meson PWM controller. > + > + To compile this driver as a module, choose M here: the module > + will be called pwm-meson. > + > config PWM_MTK_DISP > tristate "MediaTek display PWM driver" > depends on ARCH_MEDIATEK || COMPILE_TEST > diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile > index dd35bc1..3c8843e 100644 > --- a/drivers/pwm/Makefile > +++ b/drivers/pwm/Makefile > @@ -22,6 +22,7 @@ obj-$(CONFIG_PWM_LPC32XX) += pwm-lpc32xx.o > obj-$(CONFIG_PWM_LPSS) += pwm-lpss.o > obj-$(CONFIG_PWM_LPSS_PCI) += pwm-lpss-pci.o > obj-$(CONFIG_PWM_LPSS_PLATFORM) += pwm-lpss-platform.o > +obj-$(CONFIG_PWM_MESON) += pwm-meson.o > obj-$(CONFIG_PWM_MTK_DISP) += pwm-mtk-disp.o > obj-$(CONFIG_PWM_MXS) += pwm-mxs.o > obj-$(CONFIG_PWM_OMAP_DMTIMER) += pwm-omap-dmtimer.o > diff --git a/drivers/pwm/pwm-meson.c b/drivers/pwm/pwm-meson.c > new file mode 100644 > index 0000000..9e7ecf5 > --- /dev/null > +++ b/drivers/pwm/pwm-meson.c > @@ -0,0 +1,491 @@ > +/* > + * This file is provided under a dual BSD/GPLv2 license. When using or > + * redistributing this file, you may do so under either license. > + * > + * GPL LICENSE SUMMARY > + * > + * Copyright (c) 2016 BayLibre, SAS. > + * Author: Neil Armstrong <narmstrong@baylibre.com> > + * Copyright (C) 2014 Amlogic, Inc. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of version 2 of the GNU General Public License as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, see <http://www.gnu.org/licenses/>. > + * The full GNU General Public License is included in this distribution > + * in the file called COPYING. > + * > + * BSD LICENSE > + * > + * Copyright (c) 2016 BayLibre, SAS. > + * Author: Neil Armstrong <narmstrong@baylibre.com> > + * Copyright (C) 2014 Amlogic, Inc. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in > + * the documentation and/or other materials provided with the > + * distribution. > + * * Neither the name of Intel Corporation nor the names of its > + * contributors may be used to endorse or promote products derived > + * from this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR > + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT > + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > +#include <linux/kernel.h> > +#include <linux/module.h> > +#include <linux/clk-provider.h> > +#include <linux/platform_device.h> > +#include <linux/spinlock.h> > +#include <linux/slab.h> > +#include <linux/clk.h> > +#include <linux/err.h> > +#include <linux/pwm.h> > +#include <linux/io.h> > +#include <linux/clk.h> > +#include <linux/of.h> > + > +#define REG_PWM_A 0x0 > +#define REG_PWM_B 0x4 > +#define PWM_HIGH_SHIFT 16 > + > +#define REG_MISC_AB 0x8 > +#define MISC_B_CLK_EN BIT(23) > +#define MISC_A_CLK_EN BIT(15) > +#define MISC_CLK_DIV_MASK 0x7f > +#define MISC_B_CLK_DIV_SHIFT 16 > +#define MISC_A_CLK_DIV_SHIFT 8 > +#define MISC_B_CLK_SEL_SHIFT 6 > +#define MISC_A_CLK_SEL_SHIFT 4 > +#define MISC_CLK_SEL_WIDTH 2 > +#define MISC_B_EN BIT(1) > +#define MISC_A_EN BIT(0) > + > +#define PWM_NUM 2 > + > +static const unsigned int mux_reg_shifts[PWM_NUM] = { > + MISC_A_CLK_SEL_SHIFT, MISC_B_CLK_SEL_SHIFT > +}; > + > +static const char * const pwm_parents[] = { > + "xtal", "vid_pll", "fclk_div4", "fclk_div3", NULL > +}; > + > +enum pwm_channel { > + PWM_A = 0, > + PWM_B, > +}; > + > +struct meson_pwm_channel { > + unsigned int pwm_hi; > + unsigned int pwm_lo; > + u8 pwm_pre_div; > + int period; > + int duty; > +}; > + > +struct meson_pwm_chip { > + struct platform_device *pdev; > + struct pwm_chip chip; > + void __iomem *base; > + u8 inverter_mask; > + spinlock_t lock; > + struct clk *clk_parents[PWM_NUM]; > + struct clk_mux mux[PWM_NUM]; > + struct clk *clk[PWM_NUM]; > +}; > + > +#define to_meson_pwm_chip(chip) \ > + container_of(chip, struct meson_pwm_chip, chip) > + > +static int meson_pwm_calc(struct meson_pwm_chip *chip, > + struct meson_pwm_channel *pwm_chan, > + unsigned int id, > + int duty_ns, unsigned int period_ns) > +{ > + unsigned int pwm_pre_div; > + unsigned int pwm_cnt; > + unsigned int pwm_duty_cnt; > + unsigned long fin_freq = -1; > + unsigned long fin_ns; > + unsigned int i = 0; > + > + if (duty_ns > period_ns) > + return -EINVAL; > + > + switch (id) { > + case PWM_A: > + fin_freq = clk_get_rate(chip->clk[0]); > + break; > + case PWM_B: > + fin_freq = clk_get_rate(chip->clk[1]); > + break; > + } > + if (fin_freq <= 0) { > + dev_err(chip->chip.dev, "invalid source clock frequency\n"); > + return -EINVAL; > + } > + dev_dbg(chip->chip.dev, "fin_freq: %luHz\n", fin_freq); > + fin_ns = NSEC_PER_SEC / fin_freq; > + > + /* Calc pre_div with the period */ > + for (i = 0; i < MISC_CLK_DIV_MASK; i++) { > + pwm_pre_div = i; according to the public (S905) datasheet the hardware wants "value +1": "Selects the divider (N+1) for the PWM A clock" so shouldn't this be pwm_pre_div = i + 1? all your calculations below are already adding 1 to pwm_pre_div, but pwm_pre_div is directly written to the hardware register in meson_pwm_config() > + pwm_cnt = DIV_ROUND_CLOSEST(period_ns, > + fin_ns * (pwm_pre_div + 1)); > + dev_dbg(chip->chip.dev, "fin_ns=%lu pre_div=%d cnt=%d\n", > + fin_ns, pwm_pre_div, pwm_cnt); > + if (pwm_cnt <= 0xffff) > + break; > + } > + if (i == MISC_CLK_DIV_MASK) { > + dev_err(chip->chip.dev, "Unable to get period pre_div"); > + return -EINVAL; > + } > + dev_dbg(chip->chip.dev, "period_ns=%d pre_div=%d pwm_cnt=%d\n", > + period_ns, pwm_pre_div, pwm_cnt); > + > + if (duty_ns == period_ns) { > + pwm_chan->pwm_pre_div = pwm_pre_div; > + pwm_chan->pwm_hi = pwm_cnt; > + pwm_chan->pwm_lo = 0; > + } else if (duty_ns == 0) { > + pwm_chan->pwm_pre_div = pwm_pre_div; > + pwm_chan->pwm_hi = 0; > + pwm_chan->pwm_lo = pwm_cnt; > + } else { > + /* Then check is we can have the duty with the same pre_div */ > + pwm_duty_cnt = DIV_ROUND_CLOSEST(duty_ns, > + fin_ns * (pwm_pre_div + 1)); > + if (pwm_cnt > 0xffff) { > + dev_err(chip->chip.dev, "Unable to get duty period, differences are too high"); > + return -EINVAL; > + } > + dev_dbg(chip->chip.dev, "duty_ns=%d pre_div=%d pwm_cnt=%d\n", > + duty_ns, pwm_pre_div, pwm_duty_cnt); > + > + pwm_chan->pwm_pre_div = pwm_pre_div; > + pwm_chan->pwm_hi = pwm_duty_cnt; > + pwm_chan->pwm_lo = pwm_cnt - pwm_chan->pwm_hi; > + } > + > + return 0; > +} > + > +static int meson_pwm_request(struct pwm_chip *chip, > + struct pwm_device *pwm) > +{ > + struct meson_pwm_channel *pwm_chan; > + > + pwm_chan = devm_kzalloc(chip->dev, sizeof(*pwm_chan), GFP_KERNEL); > + if (!pwm_chan) > + return -ENOMEM; > + > + pwm_set_chip_data(pwm, pwm_chan); > + > + return 0; > +} > + > +static void meson_pwm_free(struct pwm_chip *chip, > + struct pwm_device *pwm) > +{ > + devm_kfree(chip->dev, pwm_get_chip_data(pwm)); > + pwm_set_chip_data(pwm, NULL); > +} > + > +static int meson_pwm_enable(struct pwm_chip *chip, > + struct pwm_device *pwm) > +{ > + struct meson_pwm_chip *pwm_data = to_meson_pwm_chip(chip); > + unsigned int id = pwm->hwpwm; > + unsigned long flags; > + > + spin_lock_irqsave(&pwm_data->lock, flags); > + switch (id) { > + case PWM_A: > + writel(readl(pwm_data->base + REG_MISC_AB) | MISC_A_EN, > + pwm_data->base + REG_MISC_AB); > + break; > + > + case PWM_B: > + writel(readl(pwm_data->base + REG_MISC_AB) | MISC_B_EN, > + pwm_data->base + REG_MISC_AB); > + break; > + > + default: > + break; > + } > + spin_unlock_irqrestore(&pwm_data->lock, flags); > + > + return 0; > +} > + > +static void meson_pwm_disable(struct pwm_chip *chip, > + struct pwm_device *pwm) > +{ > + struct meson_pwm_chip *pwm_data = to_meson_pwm_chip(chip); > + unsigned int id = pwm->hwpwm; > + unsigned long flags; > + > + spin_lock_irqsave(&pwm_data->lock, flags); > + switch (id) { > + case PWM_A: > + writel(readl(pwm_data->base + REG_MISC_AB) & ~MISC_A_EN, > + pwm_data->base + REG_MISC_AB); > + break; > + > + case PWM_B: > + writel(readl(pwm_data->base + REG_MISC_AB) & ~MISC_B_EN, > + pwm_data->base + REG_MISC_AB); > + break; > + > + default: > + break; > + } > + spin_unlock_irqrestore(&pwm_data->lock, flags); > +} > + > +static int meson_pwm_config(struct pwm_chip *chip, > + struct pwm_device *pwm, > + int duty_ns, > + int period_ns) > +{ > + struct meson_pwm_chip *pwm_data = to_meson_pwm_chip(chip); > + struct meson_pwm_channel *pwm_chan = pwm_get_chip_data(pwm); > + unsigned int id = pwm->hwpwm; > + int ret; > + > + if ((~(pwm_data->inverter_mask >> id) & 0x1)) > + duty_ns = period_ns - duty_ns; > + > + if (period_ns == pwm_chan->period && duty_ns == pwm_chan->duty) > + return 0; > + > + ret = meson_pwm_calc(pwm_data, pwm_chan, id, duty_ns, period_ns); > + if (ret) { > + dev_err(chip->dev, "error while calculating pwm parameters\n"); > + return ret; > + } > + > + switch (id) { > + case PWM_A: > + writel((readl(pwm_data->base + REG_MISC_AB) & > + ~(MISC_CLK_DIV_MASK << MISC_A_CLK_DIV_SHIFT)) | > + ((pwm_chan->pwm_pre_div << MISC_A_CLK_DIV_SHIFT) | > + MISC_A_CLK_EN), > + pwm_data->base + REG_MISC_AB); > + > + writel((pwm_chan->pwm_hi << PWM_HIGH_SHIFT) | > + (pwm_chan->pwm_lo), > + pwm_data->base + REG_PWM_A); > + break; > + > + case PWM_B: > + writel((readl(pwm_data->base + REG_MISC_AB) & > + ~(MISC_CLK_DIV_MASK << MISC_B_CLK_DIV_SHIFT)) | > + ((pwm_chan->pwm_pre_div << MISC_B_CLK_DIV_SHIFT) | > + MISC_B_CLK_EN), > + pwm_data->base + REG_MISC_AB); > + > + writel((pwm_chan->pwm_hi << PWM_HIGH_SHIFT) | > + (pwm_chan->pwm_lo), > + pwm_data->base + REG_PWM_B); > + break; > + > + default: > + break; > + } > + > + pwm_chan->period = period_ns; > + pwm_chan->duty = duty_ns; > + > + return 0; > +} > + > +static int meson_pwm_set_polarity(struct pwm_chip *chip, > + struct pwm_device *pwm, > + enum pwm_polarity polarity) > +{ > + struct meson_pwm_chip *pwm_data = to_meson_pwm_chip(chip); > + struct meson_pwm_channel *pwm_chan = pwm_get_chip_data(pwm); > + bool invert = (polarity == PWM_POLARITY_NORMAL); > + unsigned long flags; > + > + spin_lock_irqsave(&pwm_data->lock, flags); > + > + if (invert) > + pwm_data->inverter_mask |= BIT(pwm->hwpwm); > + else > + pwm_data->inverter_mask &= ~BIT(pwm->hwpwm); > + > + meson_pwm_config(chip, pwm, pwm_chan->duty, pwm_chan->period); > + > + spin_unlock_irqrestore(&pwm_data->lock, flags); > + > + return 0; > +} > + > +static const struct pwm_ops meson_pwm_ops = { > + .request = meson_pwm_request, > + .free = meson_pwm_free, > + .enable = meson_pwm_enable, > + .disable = meson_pwm_disable, > + .config = meson_pwm_config, > + .set_polarity = meson_pwm_set_polarity, > + .owner = THIS_MODULE, > +}; > + > +static const struct of_device_id meson_pwm_matches[] = { > + { .compatible = "amlogic,meson8b-pwm", }, > + { .compatible = "amlogic,meson-gxbb-pwm", }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, meson_pwm_matches); > + > +static int meson_pwm_mux_init(struct meson_pwm_chip *chip) > +{ > + struct device *dev = &chip->pdev->dev; > + struct clk_init_data init; > + char clk_name[255]; > + int ret; > + int i; > + > + for (i = 0 ; i < PWM_NUM ; ++i) { > + sprintf(clk_name, "%s#mux%d", > + of_node_full_name(dev->of_node), i); > + > + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); > + init.ops = &clk_mux_ops; > + init.flags = CLK_IS_BASIC; > + init.parent_names = pwm_parents; > + init.num_parents = 1 << MISC_CLK_SEL_WIDTH; > + > + chip->mux[i].reg = chip->base + REG_MISC_AB; > + chip->mux[i].shift = mux_reg_shifts[i]; > + chip->mux[i].mask = BIT(MISC_CLK_SEL_WIDTH) - 1; > + chip->mux[i].flags = 0; > + chip->mux[i].lock = &chip->lock; > + chip->mux[i].table = NULL; > + chip->mux[i].hw.init = &init; > + > + chip->clk[i] = devm_clk_register(dev, &chip->mux[i].hw); > + if (IS_ERR(chip->clk[i])) { > + dev_err(dev, "Failed to register %s\n", clk_name); > + return PTR_ERR(chip->clk[i]); > + } > + > + if (chip->clk_parents[i]) { > + ret = clk_set_parent(chip->clk[i], > + chip->clk_parents[i]); > + if (ret) { > + dev_err(dev, "Failed to set %s parent\n", > + clk_name); > + return ret; > + } > + } > + } > + > + return 0; > +} > + > +static int meson_pwm_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct meson_pwm_chip *chip; > + struct resource *res; > + int ret; > + > + chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); > + if (chip == NULL) > + return -ENOMEM; > + > + chip->pdev = pdev; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + chip->base = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR(chip->base)) > + return PTR_ERR(chip->base); > + > + chip->clk_parents[0] = devm_clk_get(dev, "clkin0"); > + if (IS_ERR(chip->clk_parents[0])) { > + if (PTR_ERR(chip->clk_parents[0]) == -EPROBE_DEFER) > + return PTR_ERR(chip->clk_parents[0]); > + chip->clk_parents[0] = NULL; > + } > + > + chip->clk_parents[1] = devm_clk_get(dev, "clkin1"); > + if (IS_ERR(chip->clk_parents[1])) { > + if (PTR_ERR(chip->clk_parents[1]) == -EPROBE_DEFER) > + return PTR_ERR(chip->clk_parents[1]); > + chip->clk_parents[1] = NULL; > + } > + > + ret = meson_pwm_mux_init(chip); > + if (ret) > + return ret; > + > + clk_prepare_enable(chip->clk[0]); > + clk_prepare_enable(chip->clk[1]); > + > + chip->chip.dev = dev; > + chip->chip.ops = &meson_pwm_ops; > + chip->chip.base = -1; > + chip->chip.npwm = PWM_NUM; > + chip->chip.of_xlate = of_pwm_xlate_with_flags; > + chip->chip.of_pwm_n_cells = 3; > + chip->inverter_mask = BIT(PWM_NUM) - 1; > + > + ret = pwmchip_add(&chip->chip); > + if (ret < 0) { > + dev_err(dev, "failed to register PWM chip\n"); > + return ret; > + } > + > + platform_set_drvdata(pdev, chip); > + > + return 0; > +} > + > +static int meson_pwm_remove(struct platform_device *pdev) > +{ > + struct meson_pwm_chip *chip = platform_get_drvdata(pdev); > + > + return pwmchip_remove(&chip->chip); > +} > + > +static struct platform_driver meson_pwm_driver = { > + .driver = { > + .name = "meson-pwm", > + .of_match_table = of_match_ptr(meson_pwm_matches), > + }, > + .probe = meson_pwm_probe, > + .remove = meson_pwm_remove, > +}; > +module_platform_driver(meson_pwm_driver); > + > +MODULE_ALIAS("platform:meson-pwm"); > +MODULE_DESCRIPTION("Amlogic Meson PWM Generator driver"); > +MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>"); > +MODULE_LICENSE("Dual BSD/GPL"); > -- > 2.7.0 > > > _______________________________________________ > linux-amlogic mailing list > linux-amlogic@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-amlogic ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/4] pwm: Add support for Meson PWM Controller 2016-08-15 16:55 ` Martin Blumenstingl @ 2016-08-16 13:50 ` Neil Armstrong 0 siblings, 0 replies; 15+ messages in thread From: Neil Armstrong @ 2016-08-16 13:50 UTC (permalink / raw) To: Martin Blumenstingl Cc: thierry.reding, carlo, khilman, linux-pwm, linux-amlogic, linux-kernel, linux-arm-kernel Hi Martin, On 08/15/2016 06:55 PM, Martin Blumenstingl wrote: > On Sun, Jul 10, 2016 at 11:24 AM, Neil Armstrong [...] >> +static int meson_pwm_calc(struct meson_pwm_chip *chip, >> + struct meson_pwm_channel *pwm_chan, >> + unsigned int id, >> + int duty_ns, unsigned int period_ns) >> +{ >> + unsigned int pwm_pre_div; >> + unsigned int pwm_cnt; >> + unsigned int pwm_duty_cnt; >> + unsigned long fin_freq = -1; >> + unsigned long fin_ns; >> + unsigned int i = 0; >> + >> + if (duty_ns > period_ns) >> + return -EINVAL; >> + >> + switch (id) { >> + case PWM_A: >> + fin_freq = clk_get_rate(chip->clk[0]); >> + break; >> + case PWM_B: >> + fin_freq = clk_get_rate(chip->clk[1]); >> + break; >> + } >> + if (fin_freq <= 0) { >> + dev_err(chip->chip.dev, "invalid source clock frequency\n"); >> + return -EINVAL; >> + } >> + dev_dbg(chip->chip.dev, "fin_freq: %luHz\n", fin_freq); >> + fin_ns = NSEC_PER_SEC / fin_freq; >> + >> + /* Calc pre_div with the period */ >> + for (i = 0; i < MISC_CLK_DIV_MASK; i++) { >> + pwm_pre_div = i; > according to the public (S905) datasheet the hardware wants "value > +1": "Selects the divider (N+1) for the PWM A clock" > so shouldn't this be pwm_pre_div = i + 1? > all your calculations below are already adding 1 to pwm_pre_div, but > pwm_pre_div is directly written to the hardware register in > meson_pwm_config() You misread the datasheet, usually the phrase : "PWM_A_CLK_DIV: Selects the divider (N+1) for the PWM A clock" Means, the divider that will be applied will be "N + 1", N is the value written in the register. This is why we start from 0 and for the following calculation, I add +1 : >> + pwm_cnt = DIV_ROUND_CLOSEST(period_ns, >> + fin_ns * (pwm_pre_div + 1)); This behavior was also present in the original vendor's driver. >> + dev_dbg(chip->chip.dev, "fin_ns=%lu pre_div=%d cnt=%d\n", >> + fin_ns, pwm_pre_div, pwm_cnt); >> + if (pwm_cnt <= 0xffff) >> + break; >> + } >> + if (i == MISC_CLK_DIV_MASK) { >> + dev_err(chip->chip.dev, "Unable to get period pre_div"); >> + return -EINVAL; >> + } >> + dev_dbg(chip->chip.dev, "period_ns=%d pre_div=%d pwm_cnt=%d\n", >> + period_ns, pwm_pre_div, pwm_cnt); >> + >> + if (duty_ns == period_ns) { >> + pwm_chan->pwm_pre_div = pwm_pre_div; >> + pwm_chan->pwm_hi = pwm_cnt; >> + pwm_chan->pwm_lo = 0; >> + } else if (duty_ns == 0) { >> + pwm_chan->pwm_pre_div = pwm_pre_div; >> + pwm_chan->pwm_hi = 0; >> + pwm_chan->pwm_lo = pwm_cnt; >> + } else { >> + /* Then check is we can have the duty with the same pre_div */ >> + pwm_duty_cnt = DIV_ROUND_CLOSEST(duty_ns, >> + fin_ns * (pwm_pre_div + 1)); >> + if (pwm_cnt > 0xffff) { >> + dev_err(chip->chip.dev, "Unable to get duty period, differences are too high"); >> + return -EINVAL; >> + } >> + dev_dbg(chip->chip.dev, "duty_ns=%d pre_div=%d pwm_cnt=%d\n", >> + duty_ns, pwm_pre_div, pwm_duty_cnt); >> + >> + pwm_chan->pwm_pre_div = pwm_pre_div; >> + pwm_chan->pwm_hi = pwm_duty_cnt; >> + pwm_chan->pwm_lo = pwm_cnt - pwm_chan->pwm_hi; >> + } >> + >> + return 0; >> +} Neil ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 2/4] dt-bindings: pwm: Add bindings for Meson PWM Controller 2016-07-10 9:24 (unknown), Neil Armstrong 2016-07-10 9:24 ` [PATCH v2 1/4] pwm: Add support for Meson PWM Controller Neil Armstrong @ 2016-07-10 9:24 ` Neil Armstrong 2016-07-10 9:24 ` [PATCH v2 3/4] ARM64: dts: meson-gxbb: Add Meson GXBB PWM Controller nodes Neil Armstrong ` (2 subsequent siblings) 4 siblings, 0 replies; 15+ messages in thread From: Neil Armstrong @ 2016-07-10 9:24 UTC (permalink / raw) To: thierry.reding, carlo, khilman Cc: Neil Armstrong, linux-pwm, linux-arm-kernel, linux-amlogic, linux-kernel Add bindings for the Amlogic PWM Controller in Meson8b and GXBB SoCs. Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> --- Documentation/devicetree/bindings/pwm/pwm-meson.txt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Documentation/devicetree/bindings/pwm/pwm-meson.txt diff --git a/Documentation/devicetree/bindings/pwm/pwm-meson.txt b/Documentation/devicetree/bindings/pwm/pwm-meson.txt new file mode 100644 index 0000000..e06aed0 --- /dev/null +++ b/Documentation/devicetree/bindings/pwm/pwm-meson.txt @@ -0,0 +1,21 @@ +Amlogic Meson PWM Controller +================================= + +Required properties: +- compatible: Shall contain "amlogic,meson8b-pwm" or "amlogic,meson-gxbb-pwm". +- #pwm-cells: Should be 3. See pwm.txt in this directory for a description of + the cells format. + +Optional properties: +- clocks: Could contain one or two parents clocks phandle for each of the two pwm channels. +- clock-names: Could contain at least the "clkin0" and/or "clkin1" names. + +Example: +pwm_ab: pwm@8550 { + compatible = "amlogic,meson-gxbb-pwm"; + reg = <0x0 0x08550 0x0 0x10>; + #pwm-cells = <3>; + status = "disabled"; + clocks = <&xtal>, <&xtal>; + clock-names = "clkin0", "clkin1"; +} -- 2.7.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 3/4] ARM64: dts: meson-gxbb: Add Meson GXBB PWM Controller nodes 2016-07-10 9:24 (unknown), Neil Armstrong 2016-07-10 9:24 ` [PATCH v2 1/4] pwm: Add support for Meson PWM Controller Neil Armstrong 2016-07-10 9:24 ` [PATCH v2 2/4] dt-bindings: pwm: Add bindings " Neil Armstrong @ 2016-07-10 9:24 ` Neil Armstrong 2016-07-10 9:24 ` [PATCH v2 4/4] ARM: dts: meson8b: Add Meson8b " Neil Armstrong 2016-08-04 0:25 ` [PATCH v2 0/4] pwm: Add Amlogic Meson SoC PWM Controller Kevin Hilman 4 siblings, 0 replies; 15+ messages in thread From: Neil Armstrong @ 2016-07-10 9:24 UTC (permalink / raw) To: thierry.reding, carlo, khilman Cc: Neil Armstrong, linux-pwm, linux-arm-kernel, linux-amlogic, linux-kernel, devicetree Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> --- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi index 806b903..2eacef0 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi @@ -153,6 +153,27 @@ status = "disabled"; }; + pwm_ab: pwm@8550 { + compatible = "amlogic,meson-gxbb-pwm"; + reg = <0x0 0x08550 0x0 0x10>; + #pwm-cells = <3>; + status = "disabled"; + }; + + pwm_cd: pwm@8650 { + compatible = "amlogic,meson-gxbb-pwm"; + reg = <0x0 0x08650 0x0 0x10>; + #pwm-cells = <3>; + status = "disabled"; + }; + + pwm_ef: pwm@86c0 { + compatible = "amlogic,meson-gxbb-pwm"; + reg = <0x0 0x086c0 0x0 0x10>; + #pwm-cells = <3>; + status = "disabled"; + }; + uart_C: serial@8700 { compatible = "amlogic,meson-uart"; reg = <0x0 0x8700 0x0 0x14>; @@ -212,6 +233,13 @@ clocks = <&xtal>; status = "disabled"; }; + + pwm_ab_AO: pwm@550 { + compatible = "amlogic,meson-gxbb-pwm"; + reg = <0x0 0x0550 0x0 0x10>; + #pwm-cells = <3>; + status = "disabled"; + }; }; periphs: periphs@c8834000 { -- 2.7.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 4/4] ARM: dts: meson8b: Add Meson8b PWM Controller nodes 2016-07-10 9:24 (unknown), Neil Armstrong ` (2 preceding siblings ...) 2016-07-10 9:24 ` [PATCH v2 3/4] ARM64: dts: meson-gxbb: Add Meson GXBB PWM Controller nodes Neil Armstrong @ 2016-07-10 9:24 ` Neil Armstrong 2016-08-04 0:25 ` [PATCH v2 0/4] pwm: Add Amlogic Meson SoC PWM Controller Kevin Hilman 4 siblings, 0 replies; 15+ messages in thread From: Neil Armstrong @ 2016-07-10 9:24 UTC (permalink / raw) To: thierry.reding, carlo, khilman Cc: Neil Armstrong, linux-pwm, linux-arm-kernel, linux-amlogic, linux-kernel, devicetree Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> --- arch/arm/boot/dts/meson8b.dtsi | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/arch/arm/boot/dts/meson8b.dtsi b/arch/arm/boot/dts/meson8b.dtsi index fc4080d..41fd536 100644 --- a/arch/arm/boot/dts/meson8b.dtsi +++ b/arch/arm/boot/dts/meson8b.dtsi @@ -162,6 +162,27 @@ reg = <0xc1108000 0x4>, <0xc1104000 0x460>; }; + pwm_ab: pwm@8550 { + compatible = "amlogic,meson8b-pwm"; + reg = <0xc1108550 0x10>; + #pwm-cells = <3>; + status = "disabled"; + }; + + pwm_cd: pwm@8650 { + compatible = "amlogic,meson8b-pwm"; + reg = <0xc1108650 0x10>; + #pwm-cells = <3>; + status = "disabled"; + }; + + pwm_ef: pwm@86c0 { + compatible = "amlogic,meson8b-pwm"; + reg = <0xc11086c0 0x10>; + #pwm-cells = <3>; + status = "disabled"; + }; + pinctrl_cbus: pinctrl@c1109880 { compatible = "amlogic,meson8b-cbus-pinctrl"; reg = <0xc1109880 0x10>; -- 2.7.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/4] pwm: Add Amlogic Meson SoC PWM Controller 2016-07-10 9:24 (unknown), Neil Armstrong ` (3 preceding siblings ...) 2016-07-10 9:24 ` [PATCH v2 4/4] ARM: dts: meson8b: Add Meson8b " Neil Armstrong @ 2016-08-04 0:25 ` Kevin Hilman 2016-08-16 13:20 ` Kevin Hilman 4 siblings, 1 reply; 15+ messages in thread From: Kevin Hilman @ 2016-08-04 0:25 UTC (permalink / raw) To: Neil Armstrong Cc: Thierry Reding, Carlo Caione, linux-pwm, linux-arm-kernel, linux-amlogic, lkml Hi Thierry, On Sun, Jul 10, 2016 at 2:27 AM, Neil Armstrong <narmstrong@baylibre.com> wrote: > Add support for the PWM controller found in Amlogic Meson SoCs. > This controller provides a dual PWM output with 4 selectable clock source > and a two level divider to achieve a better PWM range. > > Currently Meson8b and GXBB SoCs are supported. > > Changes since v1 at http://lkml.kernel.org/r/1466173784-15625-1-git-send-email-narmstrong@baylibre.com : > - fix meson8b dtsi Gentle reminder ping on this series. Thanks, Kevin ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/4] pwm: Add Amlogic Meson SoC PWM Controller 2016-08-04 0:25 ` [PATCH v2 0/4] pwm: Add Amlogic Meson SoC PWM Controller Kevin Hilman @ 2016-08-16 13:20 ` Kevin Hilman 0 siblings, 0 replies; 15+ messages in thread From: Kevin Hilman @ 2016-08-16 13:20 UTC (permalink / raw) To: Thierry Reding Cc: Carlo Caione, linux-pwm, linux-arm-kernel, linux-amlogic, lkml, Neil Armstrong On Wed, Aug 3, 2016 at 7:25 PM, Kevin Hilman <khilman@baylibre.com> wrote: > Hi Thierry, > > On Sun, Jul 10, 2016 at 2:27 AM, Neil Armstrong <narmstrong@baylibre.com> wrote: >> Add support for the PWM controller found in Amlogic Meson SoCs. >> This controller provides a dual PWM output with 4 selectable clock source >> and a two level divider to achieve a better PWM range. >> >> Currently Meson8b and GXBB SoCs are supported. >> >> Changes since v1 at http://lkml.kernel.org/r/1466173784-15625-1-git-send-email-narmstrong@baylibre.com : >> - fix meson8b dtsi > > Gentle reminder ping on this series. > One more... :) ^ permalink raw reply [flat|nested] 15+ messages in thread
* (unknown) @ 2020-05-08 23:41 Barbara D Wilkins 0 siblings, 0 replies; 15+ messages in thread From: Barbara D Wilkins @ 2020-05-08 23:41 UTC (permalink / raw) Hallo, Wir sind eine christliche Organisation, die gegründet wurde, um Menschen zu helfen, die Hilfe benötigen, beispielsweise finanzielle Hilfe. Wenn Sie also finanzielle Schwierigkeiten haben oder sich in einem finanziellen Chaos befinden und Geld benötigen, um Ihr eigenes Unternehmen zu gründen, oder wenn Sie einen Kredit benötigen Begleichen Sie Ihre Schulden oder zahlen Sie Ihre Rechnungen ab, gründen Sie ein gutes Geschäft oder es fällt Ihnen schwer, einen Kapitalkredit von lokalen Banken zu erhalten. Kontaktieren Sie uns noch heute per E-Mail: Lassen Sie sich diese Gelegenheit also nicht entgehen weil Jesus gestern, heute und für immer derselbe ist. Bitte, diese sind für ernsthafte und gottesfürchtige Menschen.Dein Name:Darlehensbetrag:Leihdauer:Gülti ge Handynummer:Vielen Dank für Ihr Verständnis für Ihren Kontakt, während wir warten: mrsbarbarawilkinsfunds.usagmail.comGrüßeVerwaltung ^ permalink raw reply [flat|nested] 15+ messages in thread
* (unknown) @ 2020-03-05 2:33 Maria Alessandra Filippi 0 siblings, 0 replies; 15+ messages in thread From: Maria Alessandra Filippi @ 2020-03-05 2:33 UTC (permalink / raw) Hallo, Ich bin Frau Maria Elisabeth Schaeffler, eine deutsche Wirtschaftsmagnatin, Investorin und Philanthropin. Ich bin der Vorsitzende von Wipro Limited. Ich habe 25 Prozent meines persönlichen Vermögens für wohltätige Zwecke ausgegeben. Und ich habe auch versprochen, den Rest von 25% in diesem Jahr 2020 an Einzelpersonen zu verschenken. Ich habe beschlossen, 1.000.000,00 Euro an Sie zu spenden. Wenn Sie an meiner Spende interessiert sind, kontaktieren Sie mich für weitere Informationen. Sie können auch mehr über mich über den Link unten lesen https://en.wikipedia.org/wiki/Maria-Elisabeth_Schaeffler Herzlicher Gruss Geschäftsführer Wipro Limited Maria-Elisabeth_Schaeffler E-Mail: mrsmariaelisabethschaeffler11@gmail.com ^ permalink raw reply [flat|nested] 15+ messages in thread
[parent not found: <491603614.2711416.1420447432492.JavaMail.yahoo@jws100153.mail.ne1.yahoo.com>]
[parent not found: <791409998.2699745.1420449010721.JavaMail.yahoo@jws10094.mail.ne1.yahoo.com>]
[parent not found: <2097467700.2731314.1420449474531.JavaMail.yahoo@jws10033.mail.ne1.yahoo.com>]
[parent not found: <240226799.2727140.1420449969125.JavaMail.yahoo@jws10067.mail.ne1.yahoo.com>]
[parent not found: <1939115871.2753921.1420457274798.JavaMail.yahoo@jws10085.mail.ne1.yahoo.com>]
[parent not found: <1994957961.2730912.1420457695514.JavaMail.yahoo@jws10056.mail.ne1.yahoo.com>]
[parent not found: <1680079570.2743238.1420458170796.JavaMail.yahoo@jws100211.mail.ne1.yahoo.com>]
[parent not found: <1659658722.2746194.1420458683277.JavaMail.yahoo@jws10057.mail.ne1.yahoo.com>]
[parent not found: <676811817.2753620.1420459085042.JavaMail.yahoo@jws100122.mail.ne1.yahoo.com>]
[parent not found: <292828112.2728941.1420459779830.JavaMail.yahoo@jws10062.mail.ne1.yahoo.com>]
[parent not found: <175440141 0.2748317.1420460266117.JavaMail.yahoo@jws10086.mail.ne1.yahoo.com>]
[parent not found: <1860808438.2753482.1420460950827.JavaMail.yahoo@jws100138.mail.ne1.yahoo.com>]
[parent not found: <509045745.2731669.1420461374473.JavaMail.yahoo@jws10063.mail.ne1.yahoo.com>]
[parent not found: <2027814345.1724383.1420461875563.JavaMail.yahoo@jws10002g.mail.ne1.yahoo.com>]
[parent not found: <1968321735.2759124.1420462309628.JavaMail.yahoo@jws100110.mail.ne1.yahoo.com>]
[parent not found: <463667213.2418879.1420462687894.JavaMail.yahoo@jws10077.mail.ne1.yahoo.com>]
[parent not found: <1379589304.738623.1420475580420.JavaMail.yahoo@jws100105.mail.ne1.yahoo.com>]
[parent not found: <755691156.2814422.1420475746824.JavaMail.yahoo@jws10032.mail.ne1.yahoo.com>]
[parent not found: <472406141.2821728.1420476367350.JavaMail.yahoo@jws100120.mail.ne1.yahoo.com>]
[parent not found: <221715421.2841474.1420477779861.JavaMail.yahoo@jws100168.mail.ne1.yahoo.com>]
[parent not found: <254713802.2842121.142047836 5372.JavaMail.yahoo@jws10038.mail.ne1.yahoo.com>]
[parent not found: <1464384704.2848608.1420478734002.JavaMail.yahoo@jws100207.mail.ne1.yahoo.com>]
[parent not found: <4065663.2836254.1420480471129.JavaMail.yahoo@jws10042.mail.ne1.yahoo.com>]
[parent not found: <1320938856.2854165.1420481033791.JavaMail.yahoo@jws100151.mail.ne1.yahoo.com>]
[parent not found: <1135342988.2849228.1420481646955.JavaMail.yahoo@jws100179.mail.ne1.yahoo.com>]
[parent not found: <2074478185.2848501.1420482268248.JavaMail.yahoo@jws10082.mail.ne1.yahoo.com>]
[parent not found: <1712723305.2866482.1420482691782.JavaMail.yahoo@jws100183.mail.ne1.yahoo.com>]
[parent not found: <252627126.2892667.1420488068173.JavaMail.yahoo@jws10029.mail.ne1.yahoo.com>]
[parent not found: <1065493696.2895450.1420488484721.JavaMail.yahoo@jws10076.mail.ne1.yahoo.com>]
[parent not found: <1203194643.2918350.1420491573271.JavaMail.yahoo@jws100108.mail.ne1.yahoo.com>]
[parent not found: <1046709736.2914723.1420491997552.JavaMail.yah oo@jws10054.mail.ne1.yahoo.com>]
[parent not found: <1995371219.2936216.1420492558117.JavaMail.yahoo@jws100142.mail.ne1.yahoo.com>]
[parent not found: <2001229887.2923985.1420493570028.JavaMail.yahoo@jws100125.mail.ne1.yahoo.com>]
[parent not found: <348533999.2937953.1420493983611.JavaMail.yahoo@jws10053.mail.ne1.yahoo.com>]
[parent not found: <1340159510.32526.1420519464410.JavaMail.yahoo@jws10081.mail.ne1.yahoo.com>]
[parent not found: <962476274.1899010.1420521106577.JavaMail.yahoo@jws10001g.mail.ne1.yahoo.com>]
[parent not found: <1458665553.3048449.1420521913960.JavaMail.yahoo@jws100107.mail.ne1.yahoo.com>]
[parent not found: <1012235344.3036312.1420522405591.JavaMail.yahoo@jws100104.mail.ne1.yahoo.com>]
[parent not found: <1547653530.3020536.1420523662414.JavaMail.yahoo@jws10040.mail.ne1.yahoo.com>]
[parent not found: <1790092626.3029305.1420524241447.JavaMail.yahoo@jws100209.mail.ne1.yahoo.com>]
[parent not found: <2092522293.3046570.1420524984091.JavaMail.yahoo@jws100135.mai l.ne1.yahoo.com>]
[parent not found: <1252881721.3050693.1420525551385.JavaMail.yahoo@jws100140.mail.ne1.yahoo.com>]
[parent not found: <51065461.3051024.1420526361766.JavaMail.yahoo@jws10035.mail.ne1.yahoo.com>]
[parent not found: <2088659211.3041886.1420527084737.JavaMail.yahoo@jws10091.mail.ne1.yahoo.com>]
[parent not found: <1146750372.3050740.1420527826885.JavaMail.yahoo@jws100148.mail.ne1.yahoo.com>]
[parent not found: <200807348.3052863.1420529187986.JavaMail.yahoo@jws100165.mail.ne1.yahoo.com>]
[parent not found: <318130978.3851172.1420732530471.JavaMail.yahoo@jws10041.mail.ne1.yahoo.com>]
[parent not found: <1581418323.3896621.1420740180883.JavaMail.yahoo@jws100132.mail.ne1.yahoo.com>]
[parent not found: <1141109426.3909408.1420741083576.JavaMail.yahoo@jws100165.mail.ne1.yahoo.com>]
[parent not found: <319184965.3917235.1420743616835.JavaMail.yahoo@jws10029.mail.ne1.yahoo.com>]
[parent not found: <324427432.3992904.1420755522887.JavaMail.yahoo@jws100134.mail.ne1.yahoo.com>]
[parent not found: <1454203836.464995.1421052471046.JavaMail.yahoo@jws10038.mail.ne1.yahoo.com>]
* (unknown) [not found] ` <1454203836.464995.1421052471046.JavaMail.yahoo@jws10038.mail.ne1.yahoo.com> @ 2015-01-12 18:09 ` MR. MORGAN W. THABO 0 siblings, 0 replies; 15+ messages in thread From: MR. MORGAN W. THABO @ 2015-01-12 18:09 UTC (permalink / raw) [-- Attachment #1: Type: text/plain, Size: 160 bytes --] DEAR FRIEND, PLEASE OPEN THE ATTACHED FILE, CAREFULLY GO THROUGH MY PROPOSAL AND GET BACK TO ME AS SOON AS POSSIBLE. BEST REGARDS, MR. MORGAN W. THABO. [-- Attachment #2: Fund Transfer.doc --] [-- Type: application/msword, Size: 33280 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
[parent not found: <1570038211.167595.1414613146892.JavaMail.yahoo@jws10056.mail.ne1.yahoo.com>]
[parent not found: <1835234304.171617.1414613165674.JavaMail.yahoo@jws10089.mail.ne1.yahoo.com>]
[parent not found: <1938862685.172387.1414613200459.JavaMail.yahoo@jws100180.mail.ne1.yahoo.com>]
[parent not found: <705402329.170339.1414613213653.JavaMail.yahoo@jws10087.mail.ne1.yahoo.com>]
[parent not found: <760168749.169371.1414613227586.JavaMail.yahoo@jws10082.mail.ne1.yahoo.com>]
[parent not found: <1233923671.167957.1414613439879.JavaMail.yahoo@jws10091.mail.ne1.yahoo.com>]
[parent not found: <925985882.172122.1414613520734.JavaMail.yahoo@jws100207.mail.ne1.yahoo.com>]
[parent not found: <1216694778.172990.1414613570775.JavaMail.yahoo@jws100152.mail.ne1.yahoo.com>]
[parent not found: <1213035306.169838.1414613612716.JavaMail.yahoo@jws10097.mail.ne1.yahoo.com>]
[parent not found: <2058591563.172973.1414613668636.JavaMail.yahoo@jws10089.mail.ne1.yahoo.com>]
[parent not found: <1202030640.175493 .1414613712352.JavaMail.yahoo@jws10036.mail.ne1.yahoo.com>]
[parent not found: <1111049042.175610.1414613739099.JavaMail.yahoo@jws100165.mail.ne1.yahoo.com>]
[parent not found: <574125160.175950.1414613784216.JavaMail.yahoo@jws100158.mail.ne1.yahoo.com>]
[parent not found: <1726966600.175552.1414613846198.JavaMail.yahoo@jws100190.mail.ne1.yahoo.com>]
[parent not found: <976499752.219775.1414613888129.JavaMail.yahoo@jws100101.mail.ne1.yahoo.com>]
[parent not found: <1400960529.171566.1414613936238.JavaMail.yahoo@jws10059.mail.ne1.yahoo.com>]
[parent not found: <1333619289.175040.1414613999304.JavaMail.yahoo@jws100196.mail.ne1.yahoo.com>]
[parent not found: <1038759122.176173.1414614054070.JavaMail.yahoo@jws100138.mail.ne1.yahoo.com>]
[parent not found: <1109995533.176150.1414614101940.JavaMail.yahoo@jws100140.mail.ne1.yahoo.com>]
[parent not found: <809474730.174920.1414614143971.JavaMail.yahoo@jws100154.mail.ne1.yahoo.com>]
[parent not found: <1234226428.170349.1414614189490.JavaMail .yahoo@jws10056.mail.ne1.yahoo.com>]
[parent not found: <1122464611.177103.1414614228916.JavaMail.yahoo@jws100161.mail.ne1.yahoo.com>]
[parent not found: <1350859260.174219.1414614279095.JavaMail.yahoo@jws100176.mail.ne1.yahoo.com>]
[parent not found: <1730751880.171557.1414614322033.JavaMail.yahoo@jws10060.mail.ne1.yahoo.com>]
[parent not found: <642429550.177328.1414614367628.JavaMail.yahoo@jws100165.mail.ne1.yahoo.com>]
[parent not found: <1400780243.20511.1414614418178.JavaMail.yahoo@jws100162.mail.ne1.yahoo.com>]
[parent not found: <2025652090.173204.1414614462119.JavaMail.yahoo@jws10087.mail.ne1.yahoo.com>]
[parent not found: <859211720.180077.1414614521867.JavaMail.yahoo@jws100147.mail.ne1.yahoo.com>]
[parent not found: <258705675.173585.1414614563057.JavaMail.yahoo@jws10078.mail.ne1.yahoo.com>]
[parent not found: <1773234186.173687.1414614613736.JavaMail.yahoo@jws10078.mail.ne1.yahoo.com>]
[parent not found: <1132079010.173033.1414614645153.JavaMail.yahoo@jws10066.mail.ne1.ya hoo.com>]
[parent not found: <1972302405.176488.1414614708676.JavaMail.yahoo@jws100166.mail.ne1.yahoo.com>]
[parent not found: <1713123000.176308.1414614771694.JavaMail.yahoo@jws10045.mail.ne1.yahoo.com>]
[parent not found: <299800233.173413.1414614817575.JavaMail.yahoo@jws10066.mail.ne1.yahoo.com>]
[parent not found: <494469968.179875.1414614903152.JavaMail.yahoo@jws100144.mail.ne1.yahoo.com>]
[parent not found: <2136945987.171995.1414614942776.JavaMail.yahoo@jws10091.mail.ne1.yahoo.com>]
[parent not found: <257674219.177708.1414615022592.JavaMail.yahoo@jws100181.mail.ne1.yahoo.com>]
[parent not found: <716927833.181664.1414615075308.JavaMail.yahoo@jws100145.mail.ne1.yahoo.com>]
[parent not found: <874940984.178797.1414615132802.JavaMail.yahoo@jws100157.mail.ne1.yahoo.com>]
[parent not found: <1283488887.176736.1414615187657.JavaMail.yahoo@jws100183.mail.ne1.yahoo.com>]
[parent not found: <777665713.175887.1414615236293.JavaMail.yahoo@jws10083.mail.ne1.yahoo.com>]
[parent not found: <585395776.176325.1 414615298260.JavaMail.yahoo@jws10033.mail.ne1.yahoo.com>]
[parent not found: <178352191.221832.1414615355071.JavaMail.yahoo@jws100104.mail.ne1.yahoo.com>]
[parent not found: <108454213.176606.1414615522058.JavaMail.yahoo@jws10053.mail.ne1.yahoo.com>]
[parent not found: <1617229176.177502.1414615563724.JavaMail.yahoo@jws10030.mail.ne1.yahoo.com>]
[parent not found: <324334617.178254.1414615625247.JavaMail.yahoo@jws10089.mail.ne1.yahoo.com>]
[parent not found: <567135865.82376.1414615664442.JavaMail.yahoo@jws100136.mail.ne1.yahoo.com>]
[parent not found: <764758300.179669.1414615711821.JavaMail.yahoo@jws100107.mail.ne1.yahoo.com>]
[parent not found: <1072855470.183388.1414615775798.JavaMail.yahoo@jws100147.mail.ne1.yahoo.com>]
[parent not found: <2134283632.173314.1414615831322.JavaMail.yahoo@jws10094.mail.ne1.yahoo.com>]
[parent not found: <1454491902.178612.1414615875076.JavaMail.yahoo@jws100209.mail.ne1.yahoo.com>]
[parent not found: <1480763910.146593.1414958012342.JavaMail.yahoo@jws10033.mail.ne1.yahoo.com>]
* (unknown) [not found] ` <1480763910.146593.1414958012342.JavaMail.yahoo@jws10033.mail.ne1.yahoo.com> @ 2014-11-02 19:54 ` MRS GRACE MANDA 0 siblings, 0 replies; 15+ messages in thread From: MRS GRACE MANDA @ 2014-11-02 19:54 UTC (permalink / raw) [-- Attachment #1: Type: text/plain, Size: 71 bytes --] This is Mrs Grace Manda ( Please I need your Help is Urgent). [-- Attachment #2: Mrs Grace Manda.rtf --] [-- Type: application/rtf, Size: 35796 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* (unknown), @ 2014-07-10 16:27 Christian Organization 0 siblings, 0 replies; 15+ messages in thread From: Christian Organization @ 2014-07-10 16:27 UTC (permalink / raw) Good day we are christian organization we give loan to those who are in need of help contacts us for more information at marieloanlenders@gmail.com ^ permalink raw reply [flat|nested] 15+ messages in thread
* (unknown), @ 2014-01-13 10:29 Lothar Waßmann 0 siblings, 0 replies; 15+ messages in thread From: Lothar Waßmann @ 2014-01-13 10:29 UTC (permalink / raw) To: linux-arm-kernel, Shawn Guo, Sascha Hauer, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, Russell King, Thierry Reding, devicetree, linux-kernel, linux-pwm This patchset adds support for inverting the PWM output in hardware by setting the POUTC bit in the PWMCR register. This feature is controlled via the standard DT flas for PWMs. The first patch does a minor source cleanup without any functional change. ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2020-05-08 23:51 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-07-10 9:24 (unknown), Neil Armstrong
2016-07-10 9:24 ` [PATCH v2 1/4] pwm: Add support for Meson PWM Controller Neil Armstrong
2016-08-15 16:55 ` Martin Blumenstingl
2016-08-16 13:50 ` Neil Armstrong
2016-07-10 9:24 ` [PATCH v2 2/4] dt-bindings: pwm: Add bindings " Neil Armstrong
2016-07-10 9:24 ` [PATCH v2 3/4] ARM64: dts: meson-gxbb: Add Meson GXBB PWM Controller nodes Neil Armstrong
2016-07-10 9:24 ` [PATCH v2 4/4] ARM: dts: meson8b: Add Meson8b " Neil Armstrong
2016-08-04 0:25 ` [PATCH v2 0/4] pwm: Add Amlogic Meson SoC PWM Controller Kevin Hilman
2016-08-16 13:20 ` Kevin Hilman
-- strict thread matches above, loose matches on Subject: below --
2020-05-08 23:41 (unknown) Barbara D Wilkins
2020-03-05 2:33 (unknown) Maria Alessandra Filippi
[not found] <491603614.2711416.1420447432492.JavaMail.yahoo@jws100153.mail.ne1.yahoo.com>
[not found] ` <791409998.2699745.1420449010721.JavaMail.yahoo@jws10094.mail.ne1.yahoo.com>
[not found] ` <2097467700.2731314.1420449474531.JavaMail.yahoo@jws10033.mail.ne1.yahoo.com>
[not found] ` <240226799.2727140.1420449969125.JavaMail.yahoo@jws10067.mail.ne1.yahoo.com>
[not found] ` <1939115871.2753921.1420457274798.JavaMail.yahoo@jws10085.mail.ne1.yahoo.com>
[not found] ` <1994957961.2730912.1420457695514.JavaMail.yahoo@jws10056.mail.ne1.yahoo.com>
[not found] ` <1680079570.2743238.1420458170796.JavaMail.yahoo@jws100211.mail.ne1.yahoo.com>
[not found] ` <1659658722.2746194.1420458683277.JavaMail.yahoo@jws10057.mail.ne1.yahoo.com>
[not found] ` <676811817.2753620.1420459085042.JavaMail.yahoo@jws100122.mail.ne1.yahoo.com>
[not found] ` <292828112.2728941.1420459779830.JavaMail.yahoo@jws10062.mail.ne1.yahoo.com>
[not found] ` <175440141 0.2748317.1420460266117.JavaMail.yahoo@jws10086.mail.ne1.yahoo.com>
[not found] ` <1860808438.2753482.1420460950827.JavaMail.yahoo@jws100138.mail.ne1.yahoo.com>
[not found] ` <509045745.2731669.1420461374473.JavaMail.yahoo@jws10063.mail.ne1.yahoo.com>
[not found] ` <2027814345.1724383.1420461875563.JavaMail.yahoo@jws10002g.mail.ne1.yahoo.com>
[not found] ` <1968321735.2759124.1420462309628.JavaMail.yahoo@jws100110.mail.ne1.yahoo.com>
[not found] ` <463667213.2418879.1420462687894.JavaMail.yahoo@jws10077.mail.ne1.yahoo.com>
[not found] ` <1379589304.738623.1420475580420.JavaMail.yahoo@jws100105.mail.ne1.yahoo.com>
[not found] ` <755691156.2814422.1420475746824.JavaMail.yahoo@jws10032.mail.ne1.yahoo.com>
[not found] ` <472406141.2821728.1420476367350.JavaMail.yahoo@jws100120.mail.ne1.yahoo.com>
[not found] ` <221715421.2841474.1420477779861.JavaMail.yahoo@jws100168.mail.ne1.yahoo.com>
[not found] ` <254713802.2842121.142047836 5372.JavaMail.yahoo@jws10038.mail.ne1.yahoo.com>
[not found] ` <1464384704.2848608.1420478734002.JavaMail.yahoo@jws100207.mail.ne1.yahoo.com>
[not found] ` <4065663.2836254.1420480471129.JavaMail.yahoo@jws10042.mail.ne1.yahoo.com>
[not found] ` <1320938856.2854165.1420481033791.JavaMail.yahoo@jws100151.mail.ne1.yahoo.com>
[not found] ` <1135342988.2849228.1420481646955.JavaMail.yahoo@jws100179.mail.ne1.yahoo.com>
[not found] ` <2074478185.2848501.1420482268248.JavaMail.yahoo@jws10082.mail.ne1.yahoo.com>
[not found] ` <1712723305.2866482.1420482691782.JavaMail.yahoo@jws100183.mail.ne1.yahoo.com>
[not found] ` <252627126.2892667.1420488068173.JavaMail.yahoo@jws10029.mail.ne1.yahoo.com>
[not found] ` <1065493696.2895450.1420488484721.JavaMail.yahoo@jws10076.mail.ne1.yahoo.com>
[not found] ` <1203194643.2918350.1420491573271.JavaMail.yahoo@jws100108.mail.ne1.yahoo.com>
[not found] ` <1046709736.2914723.1420491997552.JavaMail.yah oo@jws10054.mail.ne1.yahoo.com>
[not found] ` <1995371219.2936216.1420492558117.JavaMail.yahoo@jws100142.mail.ne1.yahoo.com>
[not found] ` <2001229887.2923985.1420493570028.JavaMail.yahoo@jws100125.mail.ne1.yahoo.com>
[not found] ` <348533999.2937953.1420493983611.JavaMail.yahoo@jws10053.mail.ne1.yahoo.com>
[not found] ` <1340159510.32526.1420519464410.JavaMail.yahoo@jws10081.mail.ne1.yahoo.com>
[not found] ` <962476274.1899010.1420521106577.JavaMail.yahoo@jws10001g.mail.ne1.yahoo.com>
[not found] ` <1458665553.3048449.1420521913960.JavaMail.yahoo@jws100107.mail.ne1.yahoo.com>
[not found] ` <1012235344.3036312.1420522405591.JavaMail.yahoo@jws100104.mail.ne1.yahoo.com>
[not found] ` <1547653530.3020536.1420523662414.JavaMail.yahoo@jws10040.mail.ne1.yahoo.com>
[not found] ` <1790092626.3029305.1420524241447.JavaMail.yahoo@jws100209.mail.ne1.yahoo.com>
[not found] ` <2092522293.3046570.1420524984091.JavaMail.yahoo@jws100135.mai l.ne1.yahoo.com>
[not found] ` <1252881721.3050693.1420525551385.JavaMail.yahoo@jws100140.mail.ne1.yahoo.com>
[not found] ` <51065461.3051024.1420526361766.JavaMail.yahoo@jws10035.mail.ne1.yahoo.com>
[not found] ` <2088659211.3041886.1420527084737.JavaMail.yahoo@jws10091.mail.ne1.yahoo.com>
[not found] ` <1146750372.3050740.1420527826885.JavaMail.yahoo@jws100148.mail.ne1.yahoo.com>
[not found] ` <200807348.3052863.1420529187986.JavaMail.yahoo@jws100165.mail.ne1.yahoo.com>
[not found] ` <318130978.3851172.1420732530471.JavaMail.yahoo@jws10041.mail.ne1.yahoo.com>
[not found] ` <1581418323.3896621.1420740180883.JavaMail.yahoo@jws100132.mail.ne1.yahoo.com>
[not found] ` <1141109426.3909408.1420741083576.JavaMail.yahoo@jws100165.mail.ne1.yahoo.com>
[not found] ` <319184965.3917235.1420743616835.JavaMail.yahoo@jws10029.mail.ne1.yahoo.com>
[not found] ` <324427432.3992904.1420755522887.JavaMail.yahoo@jws100134.mail.ne1.yahoo.com>
[not found] ` <1454203836.464995.1421052471046.JavaMail.yahoo@jws10038.mail.ne1.yahoo.com>
2015-01-12 18:09 ` (unknown) MR. MORGAN W. THABO
[not found] <1570038211.167595.1414613146892.JavaMail.yahoo@jws10056.mail.ne1.yahoo.com>
[not found] ` <1835234304.171617.1414613165674.JavaMail.yahoo@jws10089.mail.ne1.yahoo.com>
[not found] ` <1938862685.172387.1414613200459.JavaMail.yahoo@jws100180.mail.ne1.yahoo.com>
[not found] ` <705402329.170339.1414613213653.JavaMail.yahoo@jws10087.mail.ne1.yahoo.com>
[not found] ` <760168749.169371.1414613227586.JavaMail.yahoo@jws10082.mail.ne1.yahoo.com>
[not found] ` <1233923671.167957.1414613439879.JavaMail.yahoo@jws10091.mail.ne1.yahoo.com>
[not found] ` <925985882.172122.1414613520734.JavaMail.yahoo@jws100207.mail.ne1.yahoo.com>
[not found] ` <1216694778.172990.1414613570775.JavaMail.yahoo@jws100152.mail.ne1.yahoo.com>
[not found] ` <1213035306.169838.1414613612716.JavaMail.yahoo@jws10097.mail.ne1.yahoo.com>
[not found] ` <2058591563.172973.1414613668636.JavaMail.yahoo@jws10089.mail.ne1.yahoo.com>
[not found] ` <1202030640.175493 .1414613712352.JavaMail.yahoo@jws10036.mail.ne1.yahoo.com>
[not found] ` <1111049042.175610.1414613739099.JavaMail.yahoo@jws100165.mail.ne1.yahoo.com>
[not found] ` <574125160.175950.1414613784216.JavaMail.yahoo@jws100158.mail.ne1.yahoo.com>
[not found] ` <1726966600.175552.1414613846198.JavaMail.yahoo@jws100190.mail.ne1.yahoo.com>
[not found] ` <976499752.219775.1414613888129.JavaMail.yahoo@jws100101.mail.ne1.yahoo.com>
[not found] ` <1400960529.171566.1414613936238.JavaMail.yahoo@jws10059.mail.ne1.yahoo.com>
[not found] ` <1333619289.175040.1414613999304.JavaMail.yahoo@jws100196.mail.ne1.yahoo.com>
[not found] ` <1038759122.176173.1414614054070.JavaMail.yahoo@jws100138.mail.ne1.yahoo.com>
[not found] ` <1109995533.176150.1414614101940.JavaMail.yahoo@jws100140.mail.ne1.yahoo.com>
[not found] ` <809474730.174920.1414614143971.JavaMail.yahoo@jws100154.mail.ne1.yahoo.com>
[not found] ` <1234226428.170349.1414614189490.JavaMail .yahoo@jws10056.mail.ne1.yahoo.com>
[not found] ` <1122464611.177103.1414614228916.JavaMail.yahoo@jws100161.mail.ne1.yahoo.com>
[not found] ` <1350859260.174219.1414614279095.JavaMail.yahoo@jws100176.mail.ne1.yahoo.com>
[not found] ` <1730751880.171557.1414614322033.JavaMail.yahoo@jws10060.mail.ne1.yahoo.com>
[not found] ` <642429550.177328.1414614367628.JavaMail.yahoo@jws100165.mail.ne1.yahoo.com>
[not found] ` <1400780243.20511.1414614418178.JavaMail.yahoo@jws100162.mail.ne1.yahoo.com>
[not found] ` <2025652090.173204.1414614462119.JavaMail.yahoo@jws10087.mail.ne1.yahoo.com>
[not found] ` <859211720.180077.1414614521867.JavaMail.yahoo@jws100147.mail.ne1.yahoo.com>
[not found] ` <258705675.173585.1414614563057.JavaMail.yahoo@jws10078.mail.ne1.yahoo.com>
[not found] ` <1773234186.173687.1414614613736.JavaMail.yahoo@jws10078.mail.ne1.yahoo.com>
[not found] ` <1132079010.173033.1414614645153.JavaMail.yahoo@jws10066.mail.ne1.ya hoo.com>
[not found] ` <1972302405.176488.1414614708676.JavaMail.yahoo@jws100166.mail.ne1.yahoo.com>
[not found] ` <1713123000.176308.1414614771694.JavaMail.yahoo@jws10045.mail.ne1.yahoo.com>
[not found] ` <299800233.173413.1414614817575.JavaMail.yahoo@jws10066.mail.ne1.yahoo.com>
[not found] ` <494469968.179875.1414614903152.JavaMail.yahoo@jws100144.mail.ne1.yahoo.com>
[not found] ` <2136945987.171995.1414614942776.JavaMail.yahoo@jws10091.mail.ne1.yahoo.com>
[not found] ` <257674219.177708.1414615022592.JavaMail.yahoo@jws100181.mail.ne1.yahoo.com>
[not found] ` <716927833.181664.1414615075308.JavaMail.yahoo@jws100145.mail.ne1.yahoo.com>
[not found] ` <874940984.178797.1414615132802.JavaMail.yahoo@jws100157.mail.ne1.yahoo.com>
[not found] ` <1283488887.176736.1414615187657.JavaMail.yahoo@jws100183.mail.ne1.yahoo.com>
[not found] ` <777665713.175887.1414615236293.JavaMail.yahoo@jws10083.mail.ne1.yahoo.com>
[not found] ` <585395776.176325.1 414615298260.JavaMail.yahoo@jws10033.mail.ne1.yahoo.com>
[not found] ` <178352191.221832.1414615355071.JavaMail.yahoo@jws100104.mail.ne1.yahoo.com>
[not found] ` <108454213.176606.1414615522058.JavaMail.yahoo@jws10053.mail.ne1.yahoo.com>
[not found] ` <1617229176.177502.1414615563724.JavaMail.yahoo@jws10030.mail.ne1.yahoo.com>
[not found] ` <324334617.178254.1414615625247.JavaMail.yahoo@jws10089.mail.ne1.yahoo.com>
[not found] ` <567135865.82376.1414615664442.JavaMail.yahoo@jws100136.mail.ne1.yahoo.com>
[not found] ` <764758300.179669.1414615711821.JavaMail.yahoo@jws100107.mail.ne1.yahoo.com>
[not found] ` <1072855470.183388.1414615775798.JavaMail.yahoo@jws100147.mail.ne1.yahoo.com>
[not found] ` <2134283632.173314.1414615831322.JavaMail.yahoo@jws10094.mail.ne1.yahoo.com>
[not found] ` <1454491902.178612.1414615875076.JavaMail.yahoo@jws100209.mail.ne1.yahoo.com>
[not found] ` <1480763910.146593.1414958012342.JavaMail.yahoo@jws10033.mail.ne1.yahoo.com>
2014-11-02 19:54 ` (unknown) MRS GRACE MANDA
2014-07-10 16:27 (unknown), Christian Organization
2014-01-13 10:29 (unknown), Lothar Waßmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox