pwm: stmpe: Allow to compile as a module
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Sat, 15 Feb 2025 14:37:22 +0000 (15:37 +0100)
committerUwe Kleine-König <ukleinek@kernel.org>
Mon, 3 Mar 2025 09:38:54 +0000 (10:38 +0100)
pwm-stmpe is the only driver that cannot be built as a module. Add the
necessary boilerplate to also make this driver modular.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://lore.kernel.org/r/20250215143723.636591-2-u.kleine-koenig@baylibre.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
drivers/pwm/Kconfig
drivers/pwm/pwm-stmpe.c

index 63beb0010e3e491efaf653d24187037ec0147ee4..4731d5b90d7edcc61138e4a5bf7e98906953ece4 100644 (file)
@@ -646,7 +646,7 @@ config PWM_STM32_LP
          will be called pwm-stm32-lp.
 
 config PWM_STMPE
-       bool "STMPE expander PWM export"
+       tristate "STMPE expander PWM export"
        depends on MFD_STMPE
        help
          This enables support for the PWMs found in the STMPE I/O
index bb91062d5f1da1ec9a311e3340415fe8618ee8cc..73f12843999a3b3596f3c92550ec56c97f594c8f 100644 (file)
@@ -326,12 +326,33 @@ static int __init stmpe_pwm_probe(struct platform_device *pdev)
                return ret;
        }
 
+       platform_set_drvdata(pdev, chip);
+
        return 0;
 }
 
-static struct platform_driver stmpe_pwm_driver = {
+static void __exit stmpe_pwm_remove(struct platform_device *pdev)
+{
+       struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent);
+       struct pwm_chip *chip = platform_get_drvdata(pdev);
+
+       pwmchip_remove(chip);
+       stmpe_disable(stmpe, STMPE_BLOCK_PWM);
+}
+
+/*
+ * stmpe_pwm_remove() lives in .exit.text. For drivers registered via
+ * module_platform_driver_probe() this is ok because they cannot get unbound at
+ * runtime. So mark the driver struct with __refdata to prevent modpost
+ * triggering a section mismatch warning.
+ */
+static struct platform_driver stmpe_pwm_driver __refdata = {
        .driver = {
                .name = "stmpe-pwm",
        },
+       .remove = __exit_p(stmpe_pwm_remove),
 };
-builtin_platform_driver_probe(stmpe_pwm_driver, stmpe_pwm_probe);
+module_platform_driver_probe(stmpe_pwm_driver, stmpe_pwm_probe);
+
+MODULE_DESCRIPTION("STMPE expander PWM");
+MODULE_LICENSE("GPL");