2024-05-29 10:13:05

by Farouk Bouabid

[permalink] [raw]
Subject: [PATCH 0/6] Add Mule PWM-over-I2C support

Mule is an MCU that emulates a set of I2C devices which are reachable
through an I2C-mux that is implemented in a different patch-series[1].

Device #1 on the mux is a PWM controller that allows users to I2C-configure
the PWM output signal.

On rk3399-puma-haikou, px30-ringneck-haikou, rk3588-tiger-haikou and
rk3588-jaguar boards, this PWM controller is connected to a PWM beeper.

+-----------------------------------------------+
| Mule |
| +---------------+ |
----+----->|Config register| |
| | +--------|------+ |
| | | |
| | V |
| | __ +--------------+ |
| | | \-------->| amc6821 | |
| | | | +--------------+ | +--------+
| | | M |-------->| PWM over I2C |------->| Beeper |
| +------------->| U | +--------------+ | +--------+
| | X |-------->| dev #2 | |
| | | +--------------+ |
| | /-------->| dev #3 | |
| |__/ +--------------+ |
+-----------------------------------------------+

This patch-series add support for Mule PWM-over-I2C controller as well
as the PWM-beeper on theses boards.

The device-tree patches are to be merged after the other patch-series.
The dt-bindings and driver patches can be merged regardless of the state
of the other series.

[1] https://lore.kernel.org/lkml/[email protected]/

Signed-off-by: Farouk Bouabid <[email protected]>
---
Farouk Bouabid (6):
dt-bindings: pwm: add dt-bindings for mule pwm-over-i2c controller
pwm: add mule pwm-over-i2c driver
arm64: dts: rockchip: add pwm-beeper to rk3399-puma-haikou
arm64: dts: rockchip: add pwm-beeper to px30-ringneck-haikou
arm64: dts: rockchip: add pwm-beeper to rk3588-tiger-haikou
arm64: dts: rockchip: add pwm-beeper to rk3588-jaguar

.../devicetree/bindings/pwm/tsd,pwm-mule.yaml | 46 +++++++++
.../boot/dts/rockchip/px30-ringneck-haikou.dts | 5 +
arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi | 13 +++
.../arm64/boot/dts/rockchip/rk3399-puma-haikou.dts | 5 +
arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 13 +++
arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts | 18 ++++
.../boot/dts/rockchip/rk3588-tiger-haikou.dts | 6 ++
arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi | 13 +++
drivers/pwm/Kconfig | 10 ++
drivers/pwm/Makefile | 1 +
drivers/pwm/pwm-mule.c | 115 +++++++++++++++++++++
11 files changed, 245 insertions(+)
---
base-commit: fd8c3f3cd1b029f1851393839f7ce558db9cf202
change-id: 20240515-buzzer_support-33d93c9d0f1b

Best regards,
--
Farouk Bouabid <[email protected]>



2024-05-29 10:13:17

by Farouk Bouabid

[permalink] [raw]
Subject: [PATCH 2/6] pwm: add mule pwm-over-i2c driver

Mule is a device that can output a PWM signal based on I2C commands.

Add pwm driver for Mule PWM-over-I2C controller.

Signed-off-by: Farouk Bouabid <[email protected]>
---
drivers/pwm/Kconfig | 10 +++++
drivers/pwm/Makefile | 1 +
drivers/pwm/pwm-mule.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 126 insertions(+)

diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
index 4b956d661755..eb8cfa113ec7 100644
--- a/drivers/pwm/Kconfig
+++ b/drivers/pwm/Kconfig
@@ -425,6 +425,16 @@ config PWM_MICROCHIP_CORE
To compile this driver as a module, choose M here: the module
will be called pwm-microchip-core.

+config PWM_MULE
+ tristate "Mule PWM-over-I2C support"
+ depends on I2C && OF
+ help
+ PWM driver for Mule PWM-over-I2C controller. Mule is a device
+ that can output a PWM signal based on I2C commands.
+
+ To compile this driver as a module, choose M here: the module
+ will be called pwm-mule.
+
config PWM_MXS
tristate "Freescale MXS PWM support"
depends on ARCH_MXS || COMPILE_TEST
diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
index c5ec9e168ee7..cdd736ea3244 100644
--- a/drivers/pwm/Makefile
+++ b/drivers/pwm/Makefile
@@ -38,6 +38,7 @@ obj-$(CONFIG_PWM_MESON) += pwm-meson.o
obj-$(CONFIG_PWM_MEDIATEK) += pwm-mediatek.o
obj-$(CONFIG_PWM_MICROCHIP_CORE) += pwm-microchip-core.o
obj-$(CONFIG_PWM_MTK_DISP) += pwm-mtk-disp.o
+obj-$(CONFIG_PWM_MULE) += pwm-mule.o
obj-$(CONFIG_PWM_MXS) += pwm-mxs.o
obj-$(CONFIG_PWM_NTXEC) += pwm-ntxec.o
obj-$(CONFIG_PWM_OMAP_DMTIMER) += pwm-omap-dmtimer.o
diff --git a/drivers/pwm/pwm-mule.c b/drivers/pwm/pwm-mule.c
new file mode 100644
index 000000000000..e8593a48b16e
--- /dev/null
+++ b/drivers/pwm/pwm-mule.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Mule PWM-over-I2C controller driver
+ *
+ * Copyright (C) 2024 Theobroma Systems Design und Consulting GmbH
+ */
+
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/pwm.h>
+#include <linux/regmap.h>
+
+struct mule_pwm {
+ struct mutex lock;
+ struct regmap *regmap;
+};
+
+static const struct regmap_config pwm_mule_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+};
+
+#define MULE_PWM_DCY_REG 0x0
+#define MULE_PWM_FREQ_L_REG 0x1 /* LSB register */
+#define MULE_PWM_FREQ_H_REG 0x2 /* MSB register */
+
+#define NANOSECONDS_TO_HZ(x) (1000000000UL/(x))
+
+static int pwm_mule_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+ const struct pwm_state *state)
+{
+ struct mule_pwm *priv = pwmchip_get_drvdata(chip);
+ u8 duty_cycle;
+ u64 freq;
+ int ret;
+
+ freq = NANOSECONDS_TO_HZ(state->period);
+
+ if (freq > U16_MAX) /* Frequency is 16-bit wide */ {
+ dev_err(chip->dev,
+ "Failed to set frequency: %llu Hz: out of 16-bit range\n", freq);
+ return -EINVAL;
+ }
+
+ if (state->enabled)
+ duty_cycle = pwm_get_relative_duty_cycle(state, 100);
+ else
+ duty_cycle = 0;
+
+ mutex_lock(&priv->lock);
+
+ ret = regmap_bulk_write(priv->regmap, MULE_PWM_FREQ_L_REG, &freq, 2);
+ if (ret) {
+ dev_err(chip->dev,
+ "Failed to set frequency: %llu Hz: %d\n", freq, ret);
+ goto out;
+ }
+
+ ret = regmap_write(priv->regmap, MULE_PWM_DCY_REG, duty_cycle);
+ if (ret)
+ dev_err(chip->dev,
+ "Failed to set duty cycle: %u: %d\n", duty_cycle, ret);
+
+out:
+ mutex_unlock(&priv->lock);
+ return ret;
+}
+
+static const struct pwm_ops pwm_mule_ops = {
+ .apply = pwm_mule_apply,
+};
+
+static int pwm_mule_probe(struct i2c_client *client)
+{
+ struct device *dev = &client->dev;
+ struct pwm_chip *chip;
+ struct mule_pwm *priv;
+
+ chip = devm_pwmchip_alloc(dev, 1, sizeof(*priv));
+ if (IS_ERR(chip))
+ return PTR_ERR(chip);
+
+ priv = pwmchip_get_drvdata(chip);
+
+ mutex_init(&priv->lock);
+
+ priv->regmap = devm_regmap_init_i2c(client, &pwm_mule_config);
+ if (IS_ERR(priv->regmap))
+ return dev_err_probe(dev, PTR_ERR(priv->regmap),
+ "Failed to allocate i2c register map\n");
+
+ chip->ops = &pwm_mule_ops;
+
+ return devm_pwmchip_add(dev, chip);
+}
+
+static const struct of_device_id pwm_mule_of_match[] = {
+ { .compatible = "tsd,pwm-mule", },
+ { },
+};
+MODULE_DEVICE_TABLE(of, pwm_mule_of_match);
+
+static struct i2c_driver pwm_mule_driver = {
+ .driver = {
+ .name = "pwm-mule",
+ .of_match_table = pwm_mule_of_match,
+ },
+ .probe = pwm_mule_probe,
+};
+module_i2c_driver(pwm_mule_driver);
+
+MODULE_AUTHOR("Farouk Bouabid <[email protected]>");
+MODULE_DESCRIPTION("Mule PWM driver");
+MODULE_LICENSE("GPL");

--
2.34.1


2024-05-29 10:13:18

by Farouk Bouabid

[permalink] [raw]
Subject: [PATCH 4/6] arm64: dts: rockchip: add pwm-beeper to px30-ringneck-haikou

Add PWM-beeper that uses Mule PWM-over-I2C controller on i2c-mux (0x18).

Signed-off-by: Farouk Bouabid <[email protected]>
---
arch/arm64/boot/dts/rockchip/px30-ringneck-haikou.dts | 5 +++++
arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi | 13 +++++++++++++
2 files changed, 18 insertions(+)

diff --git a/arch/arm64/boot/dts/rockchip/px30-ringneck-haikou.dts b/arch/arm64/boot/dts/rockchip/px30-ringneck-haikou.dts
index ae398acdcf45..513ecb382ccd 100644
--- a/arch/arm64/boot/dts/rockchip/px30-ringneck-haikou.dts
+++ b/arch/arm64/boot/dts/rockchip/px30-ringneck-haikou.dts
@@ -17,6 +17,11 @@ aliases {
mmc2 = &sdmmc;
};

+ beeper {
+ compatible = "pwm-beeper";
+ pwms = <&mule_pwm 0 250000>;
+ };
+
chosen {
stdout-path = "serial0:115200n8";
};
diff --git a/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi b/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi
index eea906379983..0eee06024484 100644
--- a/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi
+++ b/arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi
@@ -10,6 +10,7 @@
/ {
aliases {
i2c10 = &i2c10;
+ i2c11 = &i2c11;
mmc0 = &emmc;
mmc1 = &sdio;
rtc0 = &rtc_twi;
@@ -309,6 +310,18 @@ fan: fan@18 {
#cooling-cells = <2>;
};
};
+
+ i2c11: i2c@1 {
+ reg = <0x1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ mule_pwm: pwm@18 {
+ compatible = "tsd,pwm-mule";
+ reg = <0x18>;
+ #pwm-cells = <2>;
+ };
+ };
};

rtc_twi: rtc@6f {

--
2.34.1


2024-05-29 10:13:22

by Farouk Bouabid

[permalink] [raw]
Subject: [PATCH 1/6] dt-bindings: pwm: add dt-bindings for mule pwm-over-i2c controller

Mule is a device that controls a PWM output signal based on I2C commands.

Signed-off-by: Farouk Bouabid <[email protected]>
---
.../devicetree/bindings/pwm/tsd,pwm-mule.yaml | 46 ++++++++++++++++++++++
1 file changed, 46 insertions(+)

diff --git a/Documentation/devicetree/bindings/pwm/tsd,pwm-mule.yaml b/Documentation/devicetree/bindings/pwm/tsd,pwm-mule.yaml
new file mode 100644
index 000000000000..71a940a2a644
--- /dev/null
+++ b/Documentation/devicetree/bindings/pwm/tsd,pwm-mule.yaml
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/pwm/tsd,pwm-mule.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mule PWM-over-I2C controller
+
+description: |
+ A device that outputs a PWM signal based on I2C commands.
+
+maintainers:
+ - Farouk Bouabid <[email protected]>
+ - Quentin Schulz <[email protected]>
+
+allOf:
+ - $ref: pwm.yaml#
+
+properties:
+ compatible:
+ const: tsd,pwm-mule
+
+ reg:
+ maxItems: 1
+
+ "#pwm-cells":
+ const: 2
+
+required:
+ - compatible
+ - reg
+
+additionalProperties: false
+
+examples:
+ - |
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ pwm@18 {
+ compatible = "tsd,pwm-mule";
+ reg = <0x18>;
+ #pwm-cells = <2>;
+ };
+ };

--
2.34.1


2024-05-29 10:13:33

by Farouk Bouabid

[permalink] [raw]
Subject: [PATCH 6/6] arm64: dts: rockchip: add pwm-beeper to rk3588-jaguar

Add PWM-beeper that uses Mule PWM-over-I2C controller on i2c-mux (0x18).

Signed-off-by: Farouk Bouabid <[email protected]>
---
arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)

diff --git a/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts b/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts
index 14f1322c162f..c7c8683dc1ef 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts
@@ -33,11 +33,17 @@ button-bios-disable {
aliases {
ethernet0 = &gmac0;
i2c10 = &i2c10;
+ i2c11 = &i2c11;
mmc0 = &sdhci;
mmc1 = &sdmmc;
rtc0 = &rtc_twi;
};

+ beeper {
+ compatible = "pwm-beeper";
+ pwms = <&mule_pwm 0 250000>;
+ };
+
chosen {
stdout-path = "serial2:115200n8";
};
@@ -267,6 +273,18 @@ fan: fan@18 {
#cooling-cells = <2>;
};
};
+
+ i2c11: i2c@1 {
+ reg = <0x1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ mule_pwm: pwm@18 {
+ compatible = "tsd,pwm-mule";
+ reg = <0x18>;
+ #pwm-cells = <2>;
+ };
+ };
};

vdd_npu_s0: regulator@42 {

--
2.34.1


2024-05-29 10:14:06

by Farouk Bouabid

[permalink] [raw]
Subject: [PATCH 5/6] arm64: dts: rockchip: add pwm-beeper to rk3588-tiger-haikou

Add PWM-beeper that uses Mule PWM-over-I2C controller on i2c-mux (0x18).

Signed-off-by: Farouk Bouabid <[email protected]>
---
arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts | 6 ++++++
arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi | 13 +++++++++++++
2 files changed, 19 insertions(+)

diff --git a/arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts b/arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts
index d672198c6b64..cd5f07ef70c5 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts
@@ -16,6 +16,12 @@ aliases {
mmc1 = &sdmmc;
};

+
+ beeper {
+ compatible = "pwm-beeper";
+ pwms = <&mule_pwm 0 250000>;
+ };
+
chosen {
stdout-path = "serial2:115200n8";
};
diff --git a/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi
index 5ed7d51717bb..7b95bede4621 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi
@@ -13,6 +13,7 @@ / {

aliases {
i2c10 = &i2c10;
+ i2c11 = &i2c11;
mmc0 = &sdhci;
rtc0 = &rtc_twi;
};
@@ -228,6 +229,18 @@ fan: fan@18 {
#cooling-cells = <2>;
};
};
+
+ i2c11: i2c@1 {
+ reg = <0x1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ mule_pwm: pwm@18 {
+ compatible = "tsd,pwm-mule";
+ reg = <0x18>;
+ #pwm-cells = <2>;
+ };
+ };
};

rtc_twi: rtc@6f {

--
2.34.1


2024-05-29 10:19:43

by Farouk Bouabid

[permalink] [raw]
Subject: [PATCH 3/6] arm64: dts: rockchip: add pwm-beeper to rk3399-puma-haikou

Add PWM-beeper that uses Mule PWM-over-I2C controller on i2c-mux (0x18).

Signed-off-by: Farouk Bouabid <[email protected]>
---
arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts | 5 +++++
arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 13 +++++++++++++
2 files changed, 18 insertions(+)

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts
index f6f15946579e..3d57c606707b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts
@@ -15,6 +15,11 @@ aliases {
mmc1 = &sdmmc;
};

+ beeper {
+ compatible = "pwm-beeper";
+ pwms = <&mule_pwm 0 250000>;
+ };
+
chosen {
stdout-path = "serial0:115200n8";
};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
index 69b57cde7d78..e3d2d27d4ca3 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi
@@ -11,6 +11,7 @@ / {
aliases {
ethernet0 = &gmac;
i2c10 = &i2c10;
+ i2c11 = &i2c11;
mmc0 = &sdhci;
};

@@ -395,6 +396,18 @@ fan: fan@18 {
#cooling-cells = <2>;
};
};
+
+ i2c11: i2c@1 {
+ reg = <0x1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ mule_pwm: pwm@18 {
+ compatible = "tsd,pwm-mule";
+ reg = <0x18>;
+ #pwm-cells = <2>;
+ };
+ };
};

rtc_twi: rtc@6f {

--
2.34.1


2024-05-29 20:30:26

by Conor Dooley

[permalink] [raw]
Subject: Re: [PATCH 1/6] dt-bindings: pwm: add dt-bindings for mule pwm-over-i2c controller

On Wed, May 29, 2024 at 12:10:30PM +0200, Farouk Bouabid wrote:
> Mule is a device that controls a PWM output signal based on I2C commands.
>
> Signed-off-by: Farouk Bouabid <[email protected]>
> ---
> .../devicetree/bindings/pwm/tsd,pwm-mule.yaml | 46 ++++++++++++++++++++++
> 1 file changed, 46 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/pwm/tsd,pwm-mule.yaml b/Documentation/devicetree/bindings/pwm/tsd,pwm-mule.yaml
> new file mode 100644
> index 000000000000..71a940a2a644
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/pwm/tsd,pwm-mule.yaml
> @@ -0,0 +1,46 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/pwm/tsd,pwm-mule.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Mule PWM-over-I2C controller
> +
> +description: |

This | is not needed.

> + A device that outputs a PWM signal based on I2C commands.
> +
> +maintainers:
> + - Farouk Bouabid <[email protected]>
> + - Quentin Schulz <[email protected]>
> +
> +allOf:
> + - $ref: pwm.yaml#
> +
> +properties:
> + compatible:
> + const: tsd,pwm-mule
> +
> + reg:
> + maxItems: 1
> +
> + "#pwm-cells":
> + const: 2

No clocks or supplies?
I tried to google for some documentation for this device, but only found
archives of this mail thread..

Thanks,
Conor.

> +
> +required:
> + - compatible
> + - reg
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + i2c {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + pwm@18 {
> + compatible = "tsd,pwm-mule";
> + reg = <0x18>;
> + #pwm-cells = <2>;
> + };
> + };
>
> --
> 2.34.1
>


Attachments:
(No filename) (1.77 kB)
signature.asc (235.00 B)
Download all attachments

2024-05-31 16:20:03

by Farouk Bouabid

[permalink] [raw]
Subject: Re: [PATCH 1/6] dt-bindings: pwm: add dt-bindings for mule pwm-over-i2c controller

Hi Conor,

On 29.05.24 22:29, Conor Dooley wrote:
> On Wed, May 29, 2024 at 12:10:30PM +0200, Farouk Bouabid wrote:


..


>> + A device that outputs a PWM signal based on I2C commands.
>> +
>> +maintainers:
>> + - Farouk Bouabid <[email protected]>
>> + - Quentin Schulz <[email protected]>
>> +
>> +allOf:
>> + - $ref: pwm.yaml#
>> +
>> +properties:
>> + compatible:
>> + const: tsd,pwm-mule
>> +
>> + reg:
>> + maxItems: 1
>> +
>> + "#pwm-cells":
>> + const: 2
> No clocks or supplies?
> I tried to google for some documentation for this device, but only found
> archives of this mail thread..

You can't find documentation for this device because we don't sell it
standalone. It is part of our boards.

This device handles its clock internally. So there is no need for clock.
As for the power-supply, it is so far

always enabled but I will add a property.


Cheers,

Farouk