PWM and keyboard backlight driver for ARM Macs
Subsystems (3)
v2 cover PWM and keyboard backlight driver for ARM Macs
Hi,
This is the v2 of the patch series to add PWM and keyboard backlight drivers for ARM macs. The changes from v1 address the review comments on that patch set.
v1: https://www.spinics.net/lists/linux-pwm/msg19500.html
Best Regards.
Sasha Finkelstein (4):
dt-bindings: pwm: Add Apple PWM controller
pwm: Add Apple PWM controller
arm64: dts: apple: t8103: Add PWM controller
MAINTAINERS: Add entries for Apple PWM driver
.../bindings/pwm/apple,s5l-fpwm.yaml | 51 +++++++ MAINTAINERS | 2 + arch/arm64/boot/dts/apple/t8103-j293.dts | 20 +++ arch/arm64/boot/dts/apple/t8103-j313.dts | 20 +++ arch/arm64/boot/dts/apple/t8103.dtsi | 9 ++ drivers/pwm/Kconfig | 12 ++ drivers/pwm/Makefile | 1 + drivers/pwm/pwm-apple.c | 127 ++++++++++++++++++ 8 files changed, 242 insertions(+) create mode 100644 Documentation/devicetree/bindings/pwm/apple,s5l-fpwm.yaml create mode 100644 drivers/pwm/pwm-apple.c
Signature · 1 line
2.37.3
PATCH v2 1/4 dt-bindings: pwm: Add Apple PWM controller
Apple SoCs such as the M1 contain a PWM controller used among other things to control the keyboard backlight.
--- .../bindings/pwm/apple,s5l-fpwm.yaml | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Documentation/devicetree/bindings/pwm/apple,s5l-fpwm.yaml
Documentation/devicetree/bindings/pwm/apple,s5l-fpwm.yaml new file +51 -0
@@ -0,0 +1,51 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/pwm/apple,s5l-fpwm.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Apple FPWM controller + +maintainers: + - [email protected] + - Sasha Finkelstein <[email protected]> + +description: PWM controller used for keyboard backlight on ARM Macs + +properties: + compatible: + items: + - enum: + - apple,t8103-fpwm + - apple,t6000-fpwm + - apple,t8112-fpwm + - const: apple,s5l-fpwm + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + power-domains: + maxItems: 1 + + "#pwm-cells": + const: 2 + +required: + - compatible + - reg + - clocks + +additionalProperties: false + +examples: + - | + pwm@235044000 { + compatible = "apple,t8103-fpwm", "apple,s5l-fpwm"; + reg = <0x35044000 0x4000>; + power-domains = <&ps_fpwm1>; + clocks = <&clkref>; + #pwm-cells = <2>; + };
Signature · 1 line
2.37.3
Re: [PATCH v2 1/4] dt-bindings: pwm: Add Apple PWM controller
Quoted 4 lines · Sasha Finkelstein
Apple SoCs such as the M1 contain a PWM controller used among other things to control the keyboard backlight.
Signed-off-by Sasha Finkelstein <[email protected]>
Best regards,
Krzysztof
PATCH v2 2/4 pwm: Add Apple PWM controller
In reply to Sasha FinkelsteinAdds the Apple PWM controller driver.
--- drivers/pwm/Kconfig | 12 ++++ drivers/pwm/Makefile | 1 + drivers/pwm/pwm-apple.c | 127 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 drivers/pwm/pwm-apple.c
drivers/pwm/Kconfig +12 -0
@@ -51,6 +51,18 @@ config PWM_AB8500 To compile this driver as a module, choose M here: the module will be called pwm-ab8500. +config PWM_APPLE + tristate "Apple SoC PWM support" + depends on ARCH_APPLE || COMPILE_TEST + help + Generic PWM framework driver for PWM controller present on + Apple SoCs + + Say Y here if you have an ARM Apple laptop, otherwise say N + + To compile this driver as a module, choose M here: the module + will be called pwm-apple. + config PWM_ATMEL tristate "Atmel PWM support" depends on ARCH_AT91 || COMPILE_TEST
drivers/pwm/Makefile +1 -0
@@ -2,6 +2,7 @@ obj-$(CONFIG_PWM) += core.o obj-$(CONFIG_PWM_SYSFS) += sysfs.o obj-$(CONFIG_PWM_AB8500) += pwm-ab8500.o +obj-$(CONFIG_PWM_APPLE) += pwm-apple.o obj-$(CONFIG_PWM_ATMEL) += pwm-atmel.o obj-$(CONFIG_PWM_ATMEL_HLCDC_PWM) += pwm-atmel-hlcdc.o obj-$(CONFIG_PWM_ATMEL_TCB) += pwm-atmel-tcb.o
drivers/pwm/pwm-apple.c new file +127 -0
127 lines not on this page · raw message
Signature · 1 line
2.37.3
RE: [PATCH v2 2/4] pwm: Add Apple PWM controller
Hi Sasha Finkelstein,
Thanks for the patch.
Quoted 58 lines
Subject: [PATCH v2 2/4] pwm: Add Apple PWM controller
Adds the Apple PWM controller driver.
Signed-off-by Sasha Finkelstein <[email protected]>--- drivers/pwm/Kconfig | 12 ++++ drivers/pwm/Makefile | 1 + drivers/pwm/pwm-apple.c | 127 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 drivers/pwm/pwm-apple.cdrivers/pwm/Kconfig index renamed from drivers/pwm/Kconfig +0
-0
60d13a949bc5..c3be11468414100644drivers/pwm/Kconfig +12
-0@@ -51,6 +51,18 @@ config PWM_AB8500 To compile this driver as a module, choose M here: the module will be called pwm-ab8500. +config PWM_APPLE + tristate "Apple SoC PWM support" + depends on ARCH_APPLE || COMPILE_TEST + help + Generic PWM framework driver for PWM controller present on + Apple SoCs + + Say Y here if you have an ARM Apple laptop, otherwise say N + + To compile this driver as a module, choose M here: the module + will be called pwm-apple. + config PWM_ATMEL tristate "Atmel PWM support" depends on ARCH_AT91 || COMPILE_TESTdrivers/pwm/Makefile index renamed from drivers/pwm/Makefile +0
-0
7bf1a29f02b8..19899b912e00100644drivers/pwm/Makefile +1
-0@@ -2,6 +2,7 @@ obj-$(CONFIG_PWM) += core.o obj-$(CONFIG_PWM_SYSFS) += sysfs.o obj-$(CONFIG_PWM_AB8500) += pwm-ab8500.o +obj-$(CONFIG_PWM_APPLE) += pwm-apple.o obj-$(CONFIG_PWM_ATMEL) += pwm-atmel.o obj-$(CONFIG_PWM_ATMEL_HLCDC_PWM) += pwm-atmel-hlcdc.o obj-$(CONFIG_PWM_ATMEL_TCB) += pwm-atmel-tcb.odrivers/pwm/pwm-apple.c new renamed from drivers/pwm/pwm-apple.c +0
-0file mode 100644 index 000000000000..7b2936346f4e
drivers/pwm/pwm-apple.c new file +5
-0@@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-2.0 OR MIT +/* +* Driver for the Apple SoC PWM controller +* +* Copyright The Asahi Linux Contributors */
drivers/pwm/pwm-apple.c line 15
Quoted 10 lines
drivers/pwm/pwm-apple.c new file +10
-0+ +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> +#include <linux/pwm.h> +#include <linux/io.h> +#include <linux/clk.h> +#include <linux/pm_runtime.h> +#include <linux/math64.h>
May be sort header alphabetically??
Quoted 77 lines
drivers/pwm/pwm-apple.c new file +19
-0+ +#define PWM_CONTROL 0x00 +#define PWM_ON_CYCLES 0x1c +#define PWM_OFF_CYCLES 0x18 + +#define CTRL_ENABLE BIT(0) +#define CTRL_MODE BIT(2) +#define CTRL_UPDATE BIT(5) +#define CTRL_TRIGGER BIT(9) +#define CTRL_INVERT BIT(10) +#define CTRL_OUTPUT_ENABLE BIT(14) + +struct apple_pwm { +struct pwm_chip chip; +void __iomem *base; +u64 clkrate; +}; + +static int apple_pwm_apply(struct pwm_chip *chip, struct pwm_device*pwm,
drivers/pwm/pwm-apple.c new file +11
-0+ const struct pwm_state *state) +{ +struct apple_pwm *fpwm; +u64 on_cycles, off_cycles; + + fpwm = container_of(chip, struct apple_pwm, chip); +if (state->enabled) { + on_cycles =mul_u64_u64_div_u64 (fpwm->clkrate, + state->duty_cycle,NSEC_PER_SEC ); + off_cycles =mul_u64_u64_div_u64 (fpwm->clkrate, + state->period, NSEC_PER_SEC) -
on_cycles;drivers/pwm/pwm-apple.c new file +11
-0+writel (on_cycles, fpwm->base +PWM_ON_CYCLES ); +writel (off_cycles, fpwm->base +PWM_OFF_CYCLES ); +writel (CTRL_ENABLE |CTRL_OUTPUT_ENABLE |CTRL_UPDATE , + fpwm->base +PWM_CONTROL ); + }else { +writel (0 , fpwm->base +PWM_CONTROL ); + } +return 0 ; +} + +static void apple_pwm_get_state(struct pwm_chip *chip, struct
pwm_device*pwm,drivers/pwm/pwm-apple.c new file +12
-0+ struct pwm_state *state) +{ +struct apple_pwm *fpwm; +u32 on_cycles, off_cycles, ctrl; + + fpwm = container_of(chip, struct apple_pwm, chip); + + ctrl =readl (fpwm->base +PWM_CONTROL ); + on_cycles =readl (fpwm->base +PWM_ON_CYCLES ); + off_cycles =readl (fpwm->base +PWM_OFF_CYCLES ); + + state->enabled = (ctrl & CTRL_ENABLE) && (ctrl &
CTRL_OUTPUT_ENABLE);drivers/pwm/pwm-apple.c new file +2
-0+ state->polarity =PWM_POLARITY_NORMAL ; + state->duty_cycle = div_u64(on_cycles, fpwm->clkrate) *
NSEC_PER_SEC;drivers/pwm/pwm-apple.c new file +17
-0+ state->period =div_u64 (off_cycles + on_cycles, fpwm->clkrate) * +NSEC_PER_SEC ; } + +static const struct pwm_ops apple_pwm_ops = { + .apply = apple_pwm_apply, + .get_state = apple_pwm_get_state, + .owner =THIS_MODULE , +}; + +static int apple_pwm_probe (struct platform_device *pdev) { +struct apple_pwm *pwm; +struct clk *clk; +int ret; + + pwm =devm_kzalloc (&pdev->dev,sizeof (*pwm),GFP_KERNEL ); +if (!pwm) +return -ENOMEM ;
drivers/pwm/pwm-apple.c line 99
Quoted 10 lines
drivers/pwm/pwm-apple.c new file +10
-0+ + pwm->base =devm_platform_ioremap_resource (pdev,0 ); +if (IS_ERR (pwm->base)) +return PTR_ERR (pwm->base); + +platform_set_drvdata (pdev, pwm); + + clk =devm_clk_get_enabled (&pdev->dev,NULL ); +if (IS_ERR (clk)) +return PTR_ERR (clk);
What is your use case?
PWM is configured by bootloader intially??
Or
PWM is configured by Linux not by the bootloader?
Or
Driver needs to support both ??
Cheers,
Biju
Quoted 42 lines
drivers/pwm/pwm-apple.c new file +28
-1+ + pwm->clkrate =clk_get_rate (clk); + pwm->chip.dev = &pdev->dev; + pwm->chip.npwm =1 ; + pwm->chip.ops = &apple_pwm_ops; + + ret =devm_pwmchip_add (&pdev->dev, &pwm->chip); +return ret; +} + +static const struct of_device_id apple_pwm_of_match[] = { + { .compatible ="apple,s5l-fpwm" }, + {} +}; +MODULE_DEVICE_TABLE (of, apple_pwm_of_match); + +static struct platform_driver apple_pwm_driver = { + .probe = apple_pwm_probe, + .driver = { + .name ="apple-pwm" , + .owner =THIS_MODULE , + .of_match_table = apple_pwm_of_match, + }, +}; +module_platform_driver (apple_pwm_driver); + +MODULE_DESCRIPTION("Apple SoC PWM driver"); MODULE_LICENSE("Dual +MIT/GPL"); --2.37.3
_______________________________________________
linux-arm-kernel mailing list [email protected]
https://jpn01.safelinks.protection.outlook.com/?url=http%3A%2F%2Flists
.infradead.org%2Fmailman%2Flistinfo%2Flinux-arm- kernel&data=05%7C01%7Cbiju.das.jz%40bp.renesas.com%7C0ff5a9275b954 eff39ae08dabcde3c28%7C53d82571da1947e49cb4625a166a4a2a%7C0%7C0%7C63802 9959918512569%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2lu MzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=zdoRENBcN FUDLdqC8wOspyvoOzRsTkBkS01Q8ff9okk%3D&reserved=0
Re: [PATCH v2 2/4] pwm: Add Apple PWM controller
Quoted 8 lines · Biju Das
drivers/pwm/pwm-apple.c line 99
Quoted 3 lines
drivers/pwm/pwm-apple.c new file +3
-0+ clk =devm_clk_get_enabled (&pdev->dev,NULL ); +if (IS_ERR (clk)) +return PTR_ERR (clk);What is your use case?
PWM is configured by bootloader intially??
Quoted 7 lines
Or
PWM is configured by Linux not by the bootloader?
Or
Driver needs to support both ??
The PWM device itself is configured by linux, but the clock it uses is the systemwide 24 MHz clock, and that is configured by platform firmware.
RE: [PATCH v2 2/4] pwm: Add Apple PWM controller
Quoted 16 lines
Subject: Re: [PATCH v2 2/4] pwm: Add Apple PWM controller
Quoted 12 lines · Biju Das
drivers/pwm/pwm-apple.c line 99
Quoted 3 lines
drivers/pwm/pwm-apple.c new file +3
-0+ clk =devm_clk_get_enabled (&pdev->dev,NULL ); +if (IS_ERR (clk)) +return PTR_ERR (clk);What is your use case?
PWM is configured by bootloader intially??
Or
PWM is configured by Linux not by the bootloader?
Quoted 7 lines
Quoted 3 lines
Or
Driver needs to support both ??
The PWM device itself is configured by linux, but the clock it uses is the systemwide 24 MHz clock, and that is configured by platform firmware.
I just asked, because you are unnecessarily turning on the clock or increasing the usage Count, even if it is not used by anyone during probe.
Cheers,
Biju
Re: [PATCH v2 2/4] pwm: Add Apple PWM controller
Quoted 2 lines · Biju Das
I just asked, because you are unnecessarily turning on the clock or increasing the usage Count, even if it is not used by anyone during probe.
It is used to get the clock rate so it can be used to convert between seconds and pwm ticks, and the pwm uses that clock, so it is kept enabled while the pwm is active.
RE: [PATCH v2 2/4] pwm: Add Apple PWM controller
Quoted 6 lines
Subject: Re: [PATCH v2 2/4] pwm: Add Apple PWM controller
On Wed, 2 Nov 2022 at 19:02, Biju Das <[email protected]> wrote:
Quoted 7 lines
Quoted 2 lines
I just asked, because you are unnecessarily turning on the clock or increasing the usage Count, even if it is not used by anyone during
probe.
It is used to get the clock rate so it can be used to convert between seconds and pwm ticks, and the pwm uses that clock, so it is kept enabled while the pwm is active.
You don't need to enable the pwm clock for getting the clock rate. devm_clk_get() and then get the rate.
Then enable the clk whenever pwm is enabled
And disable the clk whenever pwm is disabled.
Cheers,
Biju
Re: [PATCH v2 2/4] pwm: Add Apple PWM controller
Quoted 3 lines · Biju Das
Then enable the clk whenever pwm is enabled
And disable the clk whenever pwm is disabled.
I can do that, but I do not see the point in doing that. This clock is active whenever the system is turned on, all this will result in is some unnecessary clock refcount increments/decrements.
RE: [PATCH v2 2/4] pwm: Add Apple PWM controller
Quoted 10 lines
Subject: Re: [PATCH v2 2/4] pwm: Add Apple PWM controller
Quoted 3 lines · Biju Das
Then enable the clk whenever pwm is enabled And disable the clk whenever pwm is disabled.
I can do that, but I do not see the point in doing that. This clock is active whenever the system is turned on, all this will result in is some unnecessary clock refcount increments/decrements.
OK for me, as I do not know about your system. I just pointed out you are unnecessarily turning on the clock during probe even if the pwm is not used.
Cheers,
Biju
PATCH v2 3/4 arm64: dts: apple: t8103: Add PWM controller
In reply to Sasha FinkelsteinAdds PWM controller and keyboard backlight bindings for M1 MacBooks
--- arch/arm64/boot/dts/apple/t8103-j293.dts | 20 ++++++++++++++++++++ arch/arm64/boot/dts/apple/t8103-j313.dts | 20 ++++++++++++++++++++ arch/arm64/boot/dts/apple/t8103.dtsi | 9 +++++++++ 3 files changed, 49 insertions(+)
arch/arm64/boot/dts/apple/t8103-j293.dts +20 -0
@@ -11,6 +11,7 @@ #include "t8103.dtsi" #include "t8103-jxxx.dtsi" +#include <dt-bindings/leds/common.h> / { compatible = "apple,j293", "apple,t8103", "apple,arm-platform";
@@ -43,3 +44,22 @@ &i2c2 { &i2c4 { status = "okay"; }; + +/ { + led-controller { + compatible = "pwm-leds"; + led-0 { + pwms = <&fpwm1 0 40000>; + pwm-names = "kbd-backlight"; + label = "kbd_backlight"; + function = LED_FUNCTION_KBD_BACKLIGHT; + color = <LED_COLOR_ID_WHITE>; + max-brightness = <255>; + default-state = "keep"; + }; + }; +}; + +&fpwm1 { + status = "okay"; +};
arch/arm64/boot/dts/apple/t8103-j313.dts +20 -0
@@ -11,6 +11,7 @@ #include "t8103.dtsi" #include "t8103-jxxx.dtsi" +#include <dt-bindings/leds/common.h> / { compatible = "apple,j313", "apple,t8103", "apple,arm-platform";
@@ -35,3 +36,22 @@ &pcie0_dart_2 { /delete-node/ &port01; /delete-node/ &port02; + +/ { + led-controller { + compatible = "pwm-leds"; + led-0 { + pwms = <&fpwm1 0 40000>; + pwm-names = "kbd-backlight"; + label = "kbd_backlight"; + function = LED_FUNCTION_KBD_BACKLIGHT; + color = <LED_COLOR_ID_WHITE>; + max-brightness = <255>; + default-state = "keep"; + }; + }; +}; + +&fpwm1 { + status = "okay"; +};
arch/arm64/boot/dts/apple/t8103.dtsi +9 -0
@@ -191,6 +191,15 @@ i2c4: i2c@235020000 { status = "disabled"; /* only used in J293 */ }; + fpwm1: pwm@235044000 { + compatible = "apple,t8103-fpwm", "apple,s5l-fpwm"; + reg = <0x2 0x35044000 0x0 0x4000>; + power-domains = <&ps_fpwm1>; + clocks = <&clkref>; + #pwm-cells = <2>; + status = "disabled"; + }; + serial0: serial@235200000 { compatible = "apple,s5l-uart"; reg = <0x2 0x35200000 0x0 0x1000>;
Signature · 1 line
2.37.3
PATCH v2 4/4 MAINTAINERS: Add entries for Apple PWM driver
In reply to Sasha FinkelsteinAdd the MAINTAINERS entries for the driver
--- MAINTAINERS | 2 ++ 1 file changed, 2 insertions(+)
MAINTAINERS +2 -0
@@ -1908,6 +1908,7 @@ F: Documentation/devicetree/bindings/nvmem/apple,efuses.yaml F: Documentation/devicetree/bindings/pci/apple,pcie.yaml F: Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml F: Documentation/devicetree/bindings/power/apple* +F: Documentation/devicetree/bindings/pwm/apple,s5l-fpwm.yaml F: Documentation/devicetree/bindings/watchdog/apple,wdt.yaml F: arch/arm64/boot/dts/apple/ F: drivers/clk/clk-apple-nco.c
@@ -1921,6 +1922,7 @@ F: drivers/mailbox/apple-mailbox.c F: drivers/nvme/host/apple.c F: drivers/nvmem/apple-efuses.c F: drivers/pinctrl/pinctrl-apple-gpio.c +F: drivers/pwm/pwm-apple.c F: drivers/soc/apple/* F: drivers/watchdog/apple_wdt.c F: include/dt-bindings/interrupt-controller/apple-aic.h
Signature · 1 line
2.37.3
Hi,
Quoted 16 lines · Sasha Finkelstein
Hi,
This is the v2 of the patch series to add PWM and keyboard backlight drivers for ARM macs. The changes from v1 address the review comments on that patch set.
v1: https://www.spinics.net/lists/linux-pwm/msg19500.html
Best Regards.
Sasha Finkelstein (4):
dt-bindings: pwm: Add Apple PWM controller
pwm: Add Apple PWM controller
arm64: dts: apple: t8103: Add PWM controller
MAINTAINERS: Add entries for Apple PWM driver
Quoted 14 lines
.../bindings/pwm/apple,s5l-fpwm.yaml | 51 +++++++ MAINTAINERS | 2 + arch/arm64/boot/dts/apple/t8103-j293.dts | 20 +++ arch/arm64/boot/dts/apple/t8103-j313.dts | 20 +++ arch/arm64/boot/dts/apple/t8103.dtsi | 9 ++ drivers/pwm/Kconfig | 12 ++ drivers/pwm/Makefile | 1 + drivers/pwm/pwm-apple.c | 127 ++++++++++++++++++ 8 files changed, 242 insertions(+) create mode 100644 Documentation/devicetree/bindings/pwm/apple,s5l-fpwm.yaml create mode 100644 drivers/pwm/pwm-apple.cSignature · 1 line
2.37.3
this looks good to me, entire series:
Best,
Sven