pwm: add driver for T-THEAD TH1520 SoC
Subsystems (4)
v3 cover pwm: add driver for T-THEAD TH1520 SoC
T-HEAD SoCs such as the TH1520 contain a PWM controller used to control the LCD backlight, fan and so on. Add the PWM driver support for it.
Since the clk part isn't mainlined, so SoC dts(i) changes are not included in this series. However, it can be tested by using fixed-clock.
since v2:
- collect Reviewed-by tag
- add CTRL_ prefix for THEAD_PWM_CTRL register bit macros
- use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() and check its return value.
- remove unnecessary casts
- call pm_runtime_put_sync() when pwm channel is disabled
- use devm_pm_runtime_enable() and then drop .remove()
- properly consider if pwm is programmed by bootloader or other pre-linux env.
- simplify thead_pwm_runtime_resume() code as Uwe suggested
- bool ever_started -> u8 channel_ever_started since we have 6 channels
- use 3 for #pwm-cells
since v1:
- update commit msg and yaml filename to address Conor's comment
- use devm_clk_get_enabled() and devm_pwmchip_add()
- implement .get_state()
- properly handle overflow
- introduce thead_pwm_from_chip() inline function
- document Limitations
- address pm_runtime_get/put pingpong comment
Jisheng Zhang (2):
dt-bindings: pwm: Add T-HEAD PWM controller
pwm: add T-HEAD PWM driver
.../bindings/pwm/thead,th1520-pwm.yaml | 44 +++ drivers/pwm/Kconfig | 11 + drivers/pwm/Makefile | 1 + drivers/pwm/pwm-thead.c | 270 ++++++++++++++++++ 4 files changed, 326 insertions(+) create mode 100644 Documentation/devicetree/bindings/pwm/thead,th1520-pwm.yaml create mode 100644 drivers/pwm/pwm-thead.c
Signature · 1 line
2.40.1
PATCH v3 1/2 dt-bindings: pwm: Add T-HEAD PWM controller
T-HEAD SoCs such as the TH1520 contain a PWM controller used to control the LCD backlight, fan and so on.
--- .../bindings/pwm/thead,th1520-pwm.yaml | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Documentation/devicetree/bindings/pwm/thead,th1520-pwm.yaml
Documentation/devicetree/bindings/pwm/thead,th1520-pwm.yaml new file +44 -0
@@ -0,0 +1,44 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/pwm/thead,th1520-pwm.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: T-HEAD TH1520 PWM + +maintainers: + - Jisheng Zhang <[email protected]> + +allOf: + - $ref: pwm.yaml# + +properties: + compatible: + enum: + - thead,th1520-pwm + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + "#pwm-cells": + const: 3 + +required: + - compatible + - reg + - clocks + +additionalProperties: false + +examples: + - | + + pwm@ec01c000 { + compatible = "thead,th1520-pwm"; + reg = <0xec01c000 0x1000>; + clocks = <&clk 1>; + #pwm-cells = <3>; + };
Signature · 1 line
2.40.1
Re: [PATCH v3 1/2] dt-bindings: pwm: Add T-HEAD PWM controller
Quoted 5 lines · Jisheng Zhang
T-HEAD SoCs such as the TH1520 contain a PWM controller used to control the LCD backlight, fan and so on.
Signed-off-by Jisheng Zhang <[email protected]>Reviewed-by Rob Herring <[email protected]>
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ |
PATCH v3 2/2 pwm: add T-HEAD PWM driver
In reply to Jisheng ZhangT-HEAD SoCs such as the TH1520 contain a PWM controller used to control the LCD backlight, fan and so on. Add driver for it.
--- drivers/pwm/Kconfig | 11 ++ drivers/pwm/Makefile | 1 + drivers/pwm/pwm-thead.c | 270 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 282 insertions(+) create mode 100644 drivers/pwm/pwm-thead.c
drivers/pwm/Kconfig +11 -0
@@ -637,6 +637,17 @@ config PWM_TEGRA To compile this driver as a module, choose M here: the module will be called pwm-tegra. +config PWM_THEAD + tristate "T-HEAD PWM support" + depends on ARCH_THEAD || COMPILE_TEST + depends on HAS_IOMEM + help + Generic PWM framework driver for the PWFM controller found on THEAD + SoCs. + + To compile this driver as a module, choose M here: the module + will be called pwm-thead. + config PWM_TIECAP tristate "ECAP PWM support" depends on ARCH_OMAP2PLUS || ARCH_DAVINCI_DA8XX || ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST
drivers/pwm/Makefile +1 -0
@@ -59,6 +59,7 @@ obj-$(CONFIG_PWM_STMPE) += pwm-stmpe.o obj-$(CONFIG_PWM_SUN4I) += pwm-sun4i.o obj-$(CONFIG_PWM_SUNPLUS) += pwm-sunplus.o obj-$(CONFIG_PWM_TEGRA) += pwm-tegra.o +obj-$(CONFIG_PWM_THEAD) += pwm-thead.o obj-$(CONFIG_PWM_TIECAP) += pwm-tiecap.o obj-$(CONFIG_PWM_TIEHRPWM) += pwm-tiehrpwm.o obj-$(CONFIG_PWM_TWL) += pwm-twl.o
drivers/pwm/pwm-thead.c new file +270 -0
270 lines not on this page · raw message
Signature · 1 line
2.40.1
Re: [PATCH v3 2/2] pwm: add T-HEAD PWM driver
Hello,
Quoted 14 lines · Jisheng Zhang
drivers/pwm/pwm-thead.c new file +8
-0@@ -0,0 +1,270 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* T-HEAD PWM driver +* +* Copyright (C) 2021 Alibaba Group Holding Limited. +* Copyright (C) 2023 Jisheng Zhang <[email protected]> +* +* Limitations:
drivers/pwm/pwm-thead.c line 18
Quoted 10 lines
drivers/pwm/pwm-thead.c new file +10
-0+* - The THEAD_PWM_CTRL_START bit is only effective when 0 -> 1, which is used +* to start the channel, 1 -> 0 doesn't change anything. so 0 % duty cycle +* is used to "disable" the channel. +* - The THEAD_PWM_CTRL_START bit is automatically cleared once PWM channel is +* started. +* - The THEAD_PWM_CFG_UPDATE atomically updates and only updates period and duty. +* - To update period and duty, THEAD_PWM_CFG_UPDATE needs to go through 0 -> 1 +* step, I.E if THEAD_PWM_CFG_UPDATE is already 1, it's necessary to clear it +* to 0 beforehand. +* - Polarity can only be changed if never started before.
Questions I'd like to have answered here additionally are:
- How does the hardware behave when it's disabled? Typical canditates are:
- drives the inactive level
- freezes where it just happens to be when disable gets effective
- disable drivers (HIGH-Z)
- drives low
- Does the hardware complete the current running period when apply is called with enabled=false?
- Does the hardware complete the current running period when apply is called with enabled=true?
drivers/pwm/pwm-thead.c line 255
Quoted 3 lines
drivers/pwm/pwm-thead.c new file +3
-0+static const struct dev_pm_ops thead_pwm_pm_ops = { +SET_RUNTIME_PM_OPS (thead_pwm_runtime_suspend, thead_pwm_runtime_resume,NULL ) +};
Please see
https://lore.kernel.org/linux-pwm/[email protected]/t/
how this can be improved.
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ |
Re: [PATCH v3 2/2] pwm: add T-HEAD PWM driver
In reply to Jisheng ZhangQuoted 4 lines
T-HEAD SoCs such as the TH1520 contain a PWM controller used to control the LCD backlight, fan and so on. Add driver for it.
Signed-off-by Jisheng Zhang <[email protected] > ---
Hello,
I've just tested your driver and it works flawlessly on the BeagleV-Ahead with the last mainline kernel. However, I had to modify some portion of the code to comply with the last kernel needs.
drivers/pwm/pwm-thead.c line 183
Quoted 4 lines
drivers/pwm/pwm-thead.c new file +4
-0+static const struct pwm_ops thead_pwm_ops = { + .apply = thead_pwm_apply, + .get_state = thead_pwm_get_state, + .owner =THIS_MODULE ,
Since commit 384461abcab6, the owner of a pwm_ops structure is implicit and so, you can (must) remove this last line now.
Quoted 21 lines
drivers/pwm/pwm-thead.c new file +20
-0+}; +static int thead_pwm_probe (struct platform_device *pdev) +{ +struct thead_pwm_chip *priv; +int ret, i; +u32 val; + + priv =devm_kzalloc (&pdev->dev,sizeof (*priv),GFP_KERNEL ); +if (!priv) +return -ENOMEM ; + +platform_set_drvdata (pdev, priv); + + priv->mmio_base =devm_platform_ioremap_resource (pdev,0 ); +if (IS_ERR (priv->mmio_base)) +return PTR_ERR (priv->mmio_base); + + priv->clk =devm_clk_get_enabled (&pdev->dev,NULL ); +if (IS_ERR (priv->clk)) +return PTR_ERR (priv->clk);
drivers/pwm/pwm-thead.c line 235
Quoted 10 lines
drivers/pwm/pwm-thead.c new file +10
-0+ + priv->chip.ops = &thead_pwm_ops; + priv->chip.dev = &pdev->dev; + priv->chip.npwm =THEAD_PWM_MAX_NUM ; + +/* check whether PWM is ever started or not */ +for (i =0 ; i < priv->chip.npwm; i++) { + val =readl (priv->mmio_base +THEAD_PWM_FP (i)); +if (val) + priv->channel_ever_started |=1 << i;
BIT(i) ? If the bootloader starts a PWM channel for some reason, it will not be referenced by the PM usage counter, I added this line in the if statement to counter this problem : pm_runtime_get(&pdev->dev);
drivers/pwm/pwm-thead.c line 245
Quoted 10 lines
drivers/pwm/pwm-thead.c new file +10
-0+ } + + ret =devm_pwmchip_add (&pdev->dev, &priv->chip); +if (ret) +return ret; + +devm_pm_runtime_enable (&pdev->dev); + +return 0 ; +}
Thank you for your work. With the above comments addressed:
Do you plan to send out a new iteration of this patch soon ?
Best regards,
Thomas Bonnefille
Quoted 31 lines · Jisheng Zhang
T-HEAD SoCs such as the TH1520 contain a PWM controller used to control the LCD backlight, fan and so on. Add the PWM driver support for it.
Since the clk part isn't mainlined, so SoC dts(i) changes are not included in this series. However, it can be tested by using fixed-clock.
since v2:
- collect Reviewed-by tag
- addCTRL_prefix forTHEAD_PWM_CTRLregister bit macros
- usepm_runtime_resume_and_get()instead ofpm_runtime_get_sync()and check its return value.
- remove unnecessary casts
- callpm_runtime_put_sync()when pwm channel is disabled
- usedevm_pm_runtime_enable()and then drop .remove()
- properly consider if pwm is programmed by bootloader or other pre-linux env.
- simplifythead_pwm_runtime_resume()code as Uwe suggested
- boolever_started-> u8channel_ever_startedsince we have 6 channels
- use 3 for #pwm-cellssince v1:
- update commit msg and yaml filename to address Conor's comment
- usedevm_clk_get_enabled()anddevm_pwmchip_add()
- implement .get_state()
- properly handle overflow
- introducethead_pwm_from_chip()inline function
- document Limitations
- address pm_runtime_get/put pingpong comment
Quoted 3 lines
Jisheng Zhang (2):
dt-bindings: pwm: Add T-HEAD PWM controller
pwm: add T-HEAD PWM driver
Hi Thierry, Uwe,
Kind ping, is there any chance for this series to be merged for v6.7?
Thanks
Quoted 12 lines
.../bindings/pwm/thead,th1520-pwm.yaml | 44 +++ drivers/pwm/Kconfig | 11 + drivers/pwm/Makefile | 1 + drivers/pwm/pwm-thead.c | 270 ++++++++++++++++++ 4 files changed, 326 insertions(+) create mode 100644 Documentation/devicetree/bindings/pwm/thead,th1520-pwm.yaml create mode 100644 drivers/pwm/pwm-thead.cSignature · 1 line
2.40.1
Hi,
Quoted 1 line · Jisheng Zhang
Kind ping, is there any chance for this series to be merged for v6.7?
I didn't forget about reviewing your driver, but as such a review takes quite some time I often fail to do the review in a timely manner. Sorry about that.
Having said that I guess Thierry's tree won't pick up any new patches given that we already crossed the middle of the merge window and patches are supposed to be in next for some time before being sent to Linus.
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ |