--- v5
+++ v8
@@ -5,6 +5,15 @@
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
+
+Changes since v7:
+ - Remove unwarranted RPI_PWM_DEF_DUTY_REG usage
+
+ Changes since v6:
+- Use %pe
+- Round divisions properly
+- Use dev_err_probe()
+- Pass check_patch
Changes since v3:
- Rename compatible string to be more explicit WRT to bus's limitations
@@ -24,15 +33,15 @@
drivers/pwm/Kconfig | 9 ++
drivers/pwm/Makefile | 1 +
- drivers/pwm/pwm-raspberrypi-poe.c | 216 ++++++++++++++++++++++++++++++
- 3 files changed, 226 insertions(+)
+ drivers/pwm/pwm-raspberrypi-poe.c | 206 ++++++++++++++++++++++++++++++
+ 3 files changed, 216 insertions(+)
create mode 100644 drivers/pwm/pwm-raspberrypi-poe.c
diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
-index 0937e1c047ac..75e2344703b3 100644
+index a7a7a9f26aef..d3371ac7b871 100644
--- a/drivers/pwm/Kconfig
+++ b/drivers/pwm/Kconfig
-@@ -423,6 +423,15 @@ config PWM_PXA
+@@ -431,6 +431,15 @@ config PWM_PXA
To compile this driver as a module, choose M here: the module
will be called pwm-pxa.
@@ -49,10 +58,10 @@
tristate "Renesas R-Car PWM support"
depends on ARCH_RENESAS || COMPILE_TEST
diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
-index 18b89d7fd092..ed28d7bd4c64 100644
+index 4e35a55fa7b6..d3879619bd76 100644
--- a/drivers/pwm/Makefile
+++ b/drivers/pwm/Makefile
-@@ -38,6 +38,7 @@ obj-$(CONFIG_PWM_MXS) += pwm-mxs.o
+@@ -39,6 +39,7 @@ obj-$(CONFIG_PWM_NTXEC) += pwm-ntxec.o
obj-$(CONFIG_PWM_OMAP_DMTIMER) += pwm-omap-dmtimer.o
obj-$(CONFIG_PWM_PCA9685) += pwm-pca9685.o
obj-$(CONFIG_PWM_PXA) += pwm-pxa.o
@@ -62,10 +71,10 @@
obj-$(CONFIG_PWM_ROCKCHIP) += pwm-rockchip.o
diff --git a/drivers/pwm/pwm-raspberrypi-poe.c b/drivers/pwm/pwm-raspberrypi-poe.c
new file mode 100644
-index 000000000000..24b498839fcc
+index 000000000000..71ade5e55069
--- /dev/null
+++ b/drivers/pwm/pwm-raspberrypi-poe.c
-@@ -0,0 +1,216 @@
+@@ -0,0 +1,206 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2020 Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
@@ -92,7 +101,6 @@
+#define RPI_PWM_PERIOD_NS 80000 /* 12.5 kHz */
+
+#define RPI_PWM_CUR_DUTY_REG 0x0
-+#define RPI_PWM_DEF_DUTY_REG 0x1
+
+struct raspberrypi_pwm {
+ struct rpi_firmware *firmware;
@@ -106,7 +114,8 @@
+ __le32 ret;
+} __packed;
+
-+static inline struct raspberrypi_pwm *to_raspberrypi_pwm(struct pwm_chip *chip)
++static inline
++struct raspberrypi_pwm *raspberrypi_pwm_from_chip(struct pwm_chip *chip)
+{
+ return container_of(chip, struct raspberrypi_pwm, chip);
+}
@@ -154,33 +163,33 @@
+ struct pwm_device *pwm,
+ struct pwm_state *state)
+{
-+ struct raspberrypi_pwm *rpipwm = to_raspberrypi_pwm(chip);
++ struct raspberrypi_pwm *rpipwm = raspberrypi_pwm_from_chip(chip);
+
+ state->period = RPI_PWM_PERIOD_NS;
-+ state->duty_cycle = DIV_ROUND_CLOSEST(rpipwm->duty_cycle * RPI_PWM_PERIOD_NS,
-+ RPI_PWM_MAX_DUTY);
++ state->duty_cycle = DIV_ROUND_UP(rpipwm->duty_cycle * RPI_PWM_PERIOD_NS,
++ RPI_PWM_MAX_DUTY);
+ state->enabled = !!(rpipwm->duty_cycle);
+ state->polarity = PWM_POLARITY_NORMAL;
+}
+
+static int raspberrypi_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
-+ const struct pwm_state *state)
-+{
-+ struct raspberrypi_pwm *rpipwm = to_raspberrypi_pwm(chip);
++ const struct pwm_state *state)
++{
++ struct raspberrypi_pwm *rpipwm = raspberrypi_pwm_from_chip(chip);
+ unsigned int duty_cycle;
+ int ret;
+
-+ if (state->period < RPI_PWM_PERIOD_NS ||
-+ state->polarity != PWM_POLARITY_NORMAL)
-+ return -EINVAL;
-+
-+ if (!state->enabled)
-+ duty_cycle = 0;
-+ else if (state->duty_cycle < RPI_PWM_PERIOD_NS)
-+ duty_cycle = DIV_ROUND_CLOSEST_ULL(state->duty_cycle * RPI_PWM_MAX_DUTY,
-+ RPI_PWM_PERIOD_NS);
-+ else
-+ duty_cycle = RPI_PWM_MAX_DUTY;
++ if (state->period < RPI_PWM_PERIOD_NS ||
++ state->polarity != PWM_POLARITY_NORMAL)
++ return -EINVAL;
++
++ if (!state->enabled)
++ duty_cycle = 0;
++ else if (state->duty_cycle < RPI_PWM_PERIOD_NS)
++ duty_cycle = DIV_ROUND_DOWN_ULL(state->duty_cycle * RPI_PWM_MAX_DUTY,
++ RPI_PWM_PERIOD_NS);
++ else
++ duty_cycle = RPI_PWM_MAX_DUTY;
+
+ if (duty_cycle == rpipwm->duty_cycle)
+ return 0;
@@ -188,23 +197,12 @@
+ ret = raspberrypi_pwm_set_property(rpipwm->firmware, RPI_PWM_CUR_DUTY_REG,
+ duty_cycle);
+ if (ret) {
-+ dev_err(chip->dev, "Failed to set duty cycle: %d\n", ret);
++ dev_err(chip->dev, "Failed to set duty cycle: %pe\n",
++ ERR_PTR(ret));
+ return ret;
+ }
+
-+ /*
-+ * This sets the default duty cycle after resetting the board, we
-+ * updated it every time to mimic Raspberry Pi's downstream's driver
-+ * behaviour.
-+ */
-+ ret = raspberrypi_pwm_set_property(rpipwm->firmware, RPI_PWM_DEF_DUTY_REG,
-+ duty_cycle);
-+ if (ret) {
-+ dev_err(chip->dev, "Failed to set default duty cycle: %d\n", ret);
-+ return ret;
-+ }
-+
-+ rpipwm->duty_cycle = duty_cycle;
++ rpipwm->duty_cycle = duty_cycle;
+
+ return 0;
+}
@@ -232,7 +230,8 @@
+ firmware = devm_rpi_firmware_get(&pdev->dev, firmware_node);
+ of_node_put(firmware_node);
+ if (!firmware)
-+ return -EPROBE_DEFER;
++ return dev_err_probe(dev, -EPROBE_DEFER,
++ "Failed to get firmware handle\n");
+
+ rpipwm = devm_kzalloc(&pdev->dev, sizeof(*rpipwm), GFP_KERNEL);
+ if (!rpipwm)
@@ -249,7 +248,7 @@
+ ret = raspberrypi_pwm_get_property(rpipwm->firmware, RPI_PWM_CUR_DUTY_REG,
+ &rpipwm->duty_cycle);
+ if (ret) {
-+ dev_err(dev, "Failed to get duty cycle: %d\n", ret);
++ dev_err(dev, "Failed to get duty cycle: %pe\n", ERR_PTR(ret));
+ return ret;
+ }
+
@@ -280,8 +279,8 @@
+module_platform_driver(raspberrypi_pwm_driver);
+
+MODULE_AUTHOR("Nicolas Saenz Julienne <nsaenzjulienne@suse.de>");
-+MODULE_DESCRIPTION("Raspberry Pi Firwmare Based PWM Bus Driver");
++MODULE_DESCRIPTION("Raspberry Pi Firmware Based PWM Bus Driver");
+MODULE_LICENSE("GPL v2");
--
-2.29.2
-
+2.30.1
+