From 82588056cffacb947e64eb907e87ac4fdb6136cf Mon Sep 17 00:00:00 2001 From: Alisa-Dariana Roman Date: Thu, 12 Jun 2025 16:17:14 +0300 Subject: [PATCH 1/4] pwm: pwm-rp1.c: Update driver Update driver to match both the current pwm and the platform_driver interface. Signed-off-by: Alisa-Dariana Roman --- drivers/pwm/pwm-rp1.c | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/drivers/pwm/pwm-rp1.c b/drivers/pwm/pwm-rp1.c index 40ce14412817a9..dfbe7bb3a4d363 100644 --- a/drivers/pwm/pwm-rp1.c +++ b/drivers/pwm/pwm-rp1.c @@ -34,15 +34,13 @@ #define PWM_MODE_MASK GENMASK(1, 0) struct rp1_pwm { - struct pwm_chip chip; - struct device *dev; void __iomem *base; struct clk *clk; }; static inline struct rp1_pwm *to_rp1_pwm(struct pwm_chip *chip) { - return container_of(chip, struct rp1_pwm, chip); + return pwmchip_get_drvdata(chip); } static void rp1_pwm_apply_config(struct pwm_chip *chip, struct pwm_device *pwm) @@ -83,7 +81,7 @@ static int rp1_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, u32 value; if (!clk_rate) { - dev_err(pc->dev, "failed to get clock rate\n"); + dev_err(&chip->dev, "failed to get clock rate\n"); return -EINVAL; } @@ -122,45 +120,34 @@ static const struct pwm_ops rp1_pwm_ops = { .request = rp1_pwm_request, .free = rp1_pwm_free, .apply = rp1_pwm_apply, - .owner = THIS_MODULE, }; static int rp1_pwm_probe(struct platform_device *pdev) { + struct pwm_chip *chip; struct rp1_pwm *pc; - struct resource *res; int ret; - pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL); - if (!pc) - return -ENOMEM; + chip = devm_pwmchip_alloc(&pdev->dev, 4, sizeof(*pc)); - pc->dev = &pdev->dev; + if (IS_ERR(chip)) + return PTR_ERR(chip); - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - pc->base = devm_ioremap_resource(&pdev->dev, res); + pc = to_rp1_pwm(chip); + + pc->base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(pc->base)) return PTR_ERR(pc->base); - pc->clk = devm_clk_get(&pdev->dev, NULL); + pc->clk = devm_clk_get_enabled(&pdev->dev, NULL); if (IS_ERR(pc->clk)) return dev_err_probe(&pdev->dev, PTR_ERR(pc->clk), "clock not found\n"); - ret = clk_prepare_enable(pc->clk); - if (ret) - return ret; - - pc->chip.dev = &pdev->dev; - pc->chip.ops = &rp1_pwm_ops; - pc->chip.base = -1; - pc->chip.npwm = 4; - pc->chip.of_xlate = of_pwm_xlate_with_flags; - pc->chip.of_pwm_n_cells = 3; + chip->ops = &rp1_pwm_ops; + chip->of_xlate = of_pwm_xlate_with_flags; - platform_set_drvdata(pdev, pc); - - ret = pwmchip_add(&pc->chip); + ret = devm_pwmchip_add(&pdev->dev, chip); if (ret < 0) goto add_fail; @@ -177,8 +164,6 @@ static int rp1_pwm_remove(struct platform_device *pdev) clk_disable_unprepare(pc->clk); - pwmchip_remove(&pc->chip); - return 0; } From 89f7e0c0f0002ef77e27996ac45fc2943c56715e Mon Sep 17 00:00:00 2001 From: Alisa-Dariana Roman Date: Tue, 3 Jun 2025 16:31:38 +0300 Subject: [PATCH 2/4] pwm: pwm-pio-rp1.c: Update driver Update driver to match the rpi 6.13 linux repository analog driver. Since pwm interface was backported to this version, this driver was no longer matching the interface. Also match the current platform_driver interface. Signed-off-by: Alisa-Dariana Roman --- drivers/pwm/pwm-pio-rp1.c | 52 ++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/drivers/pwm/pwm-pio-rp1.c b/drivers/pwm/pwm-pio-rp1.c index 9bed7ba8719718..867510d8c52236 100644 --- a/drivers/pwm/pwm-pio-rp1.c +++ b/drivers/pwm/pwm-pio-rp1.c @@ -30,8 +30,8 @@ struct pwm_pio_rp1 { uint sm; uint offset; uint gpio; - uint32_t period; /* In SM cycles */ - uint32_t duty_cycle; /* In SM cycles */ + uint32_t period; /* In SM cycles */ + uint32_t duty_cycle; /* In SM cycles */ enum pwm_polarity polarity; bool enabled; }; @@ -42,7 +42,7 @@ struct pwm_pio_rp1 { #define pwm_loop_ticks 3 static const uint16_t pwm_program_instructions[] = { - // .wrap_target + // .wrap_target 0x9080, // 0: pull noblock side 0 0xa027, // 1: mov x, osr 0xa046, // 2: mov y, isr @@ -50,7 +50,7 @@ static const uint16_t pwm_program_instructions[] = { 0x1806, // 4: jmp 6 side 1 0xa042, // 5: nop 0x0083, // 6: jmp y--, 3 - // .wrap + // .wrap }; static const struct pio_program pwm_program = { @@ -96,7 +96,7 @@ static void pio_pwm_set_level(PIO pio, uint sm, uint32_t level) } static int pwm_pio_rp1_apply(struct pwm_chip *chip, struct pwm_device *pwm, - const struct pwm_state *state) + const struct pwm_state *state) { struct pwm_pio_rp1 *ppwm = container_of(chip, struct pwm_pio_rp1, chip); uint32_t new_duty_cycle; @@ -131,8 +131,10 @@ static int pwm_pio_rp1_apply(struct pwm_chip *chip, struct pwm_device *pwm, if (state->polarity != ppwm->polarity) { pio_gpio_set_outover(ppwm->pio, ppwm->gpio, - (state->polarity == PWM_POLARITY_INVERSED) ? - GPIO_OVERRIDE_INVERT : GPIO_OVERRIDE_NORMAL); + (state->polarity == + PWM_POLARITY_INVERSED) ? + GPIO_OVERRIDE_INVERT : + GPIO_OVERRIDE_NORMAL); ppwm->polarity = state->polarity; } @@ -159,11 +161,11 @@ static int pwm_pio_rp1_probe(struct platform_device *pdev) struct pwm_chip *chip; bool is_rp1; - ppwm = devm_kzalloc(dev, sizeof(*ppwm), GFP_KERNEL); - if (IS_ERR(ppwm)) - return PTR_ERR(ppwm); + chip = devm_pwmchip_alloc(dev, 1, sizeof(*ppwm)); + if (IS_ERR(chip)) + return PTR_ERR(chip); - chip = &ppwm->chip; + ppwm = pwmchip_get_drvdata(chip); mutex_init(&ppwm->mutex); @@ -182,8 +184,7 @@ static int pwm_pio_rp1_probe(struct platform_device *pdev) is_rp1 = of_device_is_compatible(of_args.np, "raspberrypi,rp1-gpio"); of_node_put(of_args.np); if (!is_rp1 || of_args.args_count != 2) - return dev_err_probe(dev, -EINVAL, - "not an RP1 gpio\n"); + return dev_err_probe(dev, -EINVAL, "not an RP1 gpio\n"); ppwm->gpio = of_args.args[0]; @@ -196,8 +197,7 @@ static int pwm_pio_rp1_probe(struct platform_device *pdev) ppwm->sm = pio_claim_unused_sm(ppwm->pio, false); if ((int)ppwm->sm < 0) { pio_close(ppwm->pio); - return dev_err_probe(dev, -EBUSY, - "%pfw: no free PIO SM\n", + return dev_err_probe(dev, -EBUSY, "%pfw: no free PIO SM\n", dev_fwnode(dev)); } @@ -211,9 +211,9 @@ static int pwm_pio_rp1_probe(struct platform_device *pdev) pwm_program_init(ppwm->pio, ppwm->sm, ppwm->offset, ppwm->gpio); - pwm_pio_resolution = (1000u * 1000 * 1000 * pwm_loop_ticks) / clock_get_hz(clk_sys); + pwm_pio_resolution = + (1000u * 1000 * 1000 * pwm_loop_ticks) / clock_get_hz(clk_sys); - chip->dev = dev; chip->ops = &pwm_pio_rp1_ops; chip->atomic = true; chip->npwm = 1; @@ -223,11 +223,13 @@ static int pwm_pio_rp1_probe(struct platform_device *pdev) return devm_pwmchip_add(dev, chip); } -static void pwm_pio_rp1_remove(struct platform_device *pdev) +static int pwm_pio_rp1_remove(struct platform_device *pdev) { struct pwm_pio_rp1 *ppwm = platform_get_drvdata(pdev); pio_close(ppwm->pio); + + return 0; } static const struct of_device_id pwm_pio_rp1_dt_ids[] = { @@ -237,13 +239,13 @@ static const struct of_device_id pwm_pio_rp1_dt_ids[] = { MODULE_DEVICE_TABLE(of, pwm_pio_rp1_dt_ids); static struct platform_driver pwm_pio_rp1_driver = { - .driver = { - .name = "pwm-pio-rp1", - .of_match_table = pwm_pio_rp1_dt_ids, - }, - .probe = pwm_pio_rp1_probe, - .remove_new = pwm_pio_rp1_remove, -}; + .driver = { + .name = "pwm-pio-rp1", + .of_match_table = pwm_pio_rp1_dt_ids, + }, + .probe = pwm_pio_rp1_probe, + .remove = pwm_pio_rp1_remove, + }; module_platform_driver(pwm_pio_rp1_driver); MODULE_DESCRIPTION("PWM PIO RP1 driver"); From 23f7f3891b4b2cc4877be1fdb80caa84eea1dd0a Mon Sep 17 00:00:00 2001 From: Alisa-Dariana Roman Date: Thu, 5 Jun 2025 15:00:51 +0300 Subject: [PATCH 3/4] Add module imports Add module import statements for drivers. The build was failing because of missing symbols. Signed-off-by: Alisa-Dariana Roman --- drivers/iio/adc/ad4134.c | 1 + drivers/iio/adc/ad4630.c | 1 + drivers/iio/adc/ad7768-1.c | 1 + drivers/iio/adc/ad7768.c | 1 + drivers/iio/adc/ad7944.c | 1 + drivers/iio/adc/ad_adc.c | 1 + drivers/iio/adc/ad_pulsar.c | 1 + drivers/iio/adc/admc_adc.c | 1 + drivers/iio/adc/admc_speed.c | 1 + drivers/iio/adc/cf_axi_adc_core.c | 1 + drivers/iio/adc/ltc2387.c | 1 + drivers/iio/dac/ad5791.c | 1 + drivers/iio/frequency/cf_axi_dds.c | 1 + drivers/iio/frequency/m2k-dac.c | 1 + drivers/iio/imu/adis16550.c | 2 +- drivers/iio/logic/m2k-logic-analyzer.c | 1 + 16 files changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/iio/adc/ad4134.c b/drivers/iio/adc/ad4134.c index 2a078f7e355259..ad2d7a293c7f52 100644 --- a/drivers/iio/adc/ad4134.c +++ b/drivers/iio/adc/ad4134.c @@ -566,3 +566,4 @@ module_exit(ad4134_exit); MODULE_AUTHOR("Cosmin Tanislav "); MODULE_DESCRIPTION("Analog Devices AD4134 SPI driver"); MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/adc/ad4630.c b/drivers/iio/adc/ad4630.c index c4218198fc73af..ebe11a53168e09 100644 --- a/drivers/iio/adc/ad4630.c +++ b/drivers/iio/adc/ad4630.c @@ -1683,3 +1683,4 @@ MODULE_AUTHOR("Marcelo Schmitt "); MODULE_AUTHOR("Liviu Adace "); MODULE_DESCRIPTION("Analog Devices AD4630 and ADAQ4224 ADC family driver"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/adc/ad7768-1.c b/drivers/iio/adc/ad7768-1.c index 9eaeaf1eb36a14..5d0f5246d72a03 100644 --- a/drivers/iio/adc/ad7768-1.c +++ b/drivers/iio/adc/ad7768-1.c @@ -966,3 +966,4 @@ module_spi_driver(ad7768_driver); MODULE_AUTHOR("Stefan Popa "); MODULE_DESCRIPTION("Analog Devices AD7768-1 ADC driver"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index db4e46171fc1d7..43c1f6c1c82666 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -883,3 +883,4 @@ module_spi_driver(ad7768_driver); MODULE_AUTHOR("Stefan Popa "); MODULE_DESCRIPTION("Analog Devices AD7768 ADC"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/adc/ad7944.c b/drivers/iio/adc/ad7944.c index 05a38adb99e2d8..bc53878dbae9bb 100644 --- a/drivers/iio/adc/ad7944.c +++ b/drivers/iio/adc/ad7944.c @@ -788,3 +788,4 @@ module_spi_driver(ad7944_driver); MODULE_AUTHOR("David Lechner "); MODULE_DESCRIPTION("Analog Devices AD7944 PulSAR ADC family driver"); MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/adc/ad_adc.c b/drivers/iio/adc/ad_adc.c index 275c27fbe7d64d..b8daba9cbb4142 100644 --- a/drivers/iio/adc/ad_adc.c +++ b/drivers/iio/adc/ad_adc.c @@ -788,3 +788,4 @@ module_platform_driver(adc_driver); MODULE_AUTHOR("Dragos Bogdan "); MODULE_DESCRIPTION("Analog Devices ADC"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/adc/ad_pulsar.c b/drivers/iio/adc/ad_pulsar.c index b3a9a5f3fdf736..38a23d233579e4 100644 --- a/drivers/iio/adc/ad_pulsar.c +++ b/drivers/iio/adc/ad_pulsar.c @@ -1010,3 +1010,4 @@ module_spi_driver(ad_pulsar_driver); MODULE_AUTHOR("Sergiu Cuciurean "); MODULE_DESCRIPTION("Analog Devices PulSAR ADC family driver"); MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/adc/admc_adc.c b/drivers/iio/adc/admc_adc.c index 057df00195d97e..3dd1c0f9991710 100644 --- a/drivers/iio/adc/admc_adc.c +++ b/drivers/iio/adc/admc_adc.c @@ -227,3 +227,4 @@ module_platform_driver(axiadc_driver); MODULE_AUTHOR("Dragos Bogdan "); MODULE_DESCRIPTION("Analog Devices MC-ADC"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/adc/admc_speed.c b/drivers/iio/adc/admc_speed.c index 935644a572214b..ff2060a9d6900e 100644 --- a/drivers/iio/adc/admc_speed.c +++ b/drivers/iio/adc/admc_speed.c @@ -222,3 +222,4 @@ module_platform_driver(axiadc_of_driver); MODULE_AUTHOR("Dragos Bogdan "); MODULE_DESCRIPTION("Analog Devices MC-Speed"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/adc/cf_axi_adc_core.c b/drivers/iio/adc/cf_axi_adc_core.c index 1e597a05296be7..cb5716db8f1d07 100644 --- a/drivers/iio/adc/cf_axi_adc_core.c +++ b/drivers/iio/adc/cf_axi_adc_core.c @@ -1240,3 +1240,4 @@ module_platform_driver(axiadc_driver); MODULE_AUTHOR("Michael Hennerich "); MODULE_DESCRIPTION("Analog Devices ADI-AIM"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/adc/ltc2387.c b/drivers/iio/adc/ltc2387.c index 46f19952b79d28..7655dfc972b3cc 100644 --- a/drivers/iio/adc/ltc2387.c +++ b/drivers/iio/adc/ltc2387.c @@ -417,3 +417,4 @@ module_platform_driver(ltc2387_driver); MODULE_AUTHOR("Sergiu Cuciurean "); MODULE_DESCRIPTION("Linear Technology LTC2387 ADC"); MODULE_LICENSE("Dual BSD/GPL"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/dac/ad5791.c b/drivers/iio/dac/ad5791.c index 9af0ae913953cd..87377fe95798b7 100644 --- a/drivers/iio/dac/ad5791.c +++ b/drivers/iio/dac/ad5791.c @@ -661,3 +661,4 @@ module_spi_driver(ad5791_driver); MODULE_AUTHOR("Michael Hennerich "); MODULE_DESCRIPTION("Analog Devices AD5760/AD5780/AD5781/AD5790/AD5791 DAC"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/frequency/cf_axi_dds.c b/drivers/iio/frequency/cf_axi_dds.c index ef2275be1220de..8b2cd4e6d1c8dc 100644 --- a/drivers/iio/frequency/cf_axi_dds.c +++ b/drivers/iio/frequency/cf_axi_dds.c @@ -2674,3 +2674,4 @@ module_platform_driver(cf_axi_dds_driver); MODULE_AUTHOR("Michael Hennerich "); MODULE_DESCRIPTION("Analog Devices DDS"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/frequency/m2k-dac.c b/drivers/iio/frequency/m2k-dac.c index 2ff5c1b9b9edbf..bf8b65fe8d7090 100644 --- a/drivers/iio/frequency/m2k-dac.c +++ b/drivers/iio/frequency/m2k-dac.c @@ -861,3 +861,4 @@ module_platform_driver(m2k_dac_driver); MODULE_AUTHOR("Lars-Peter Clausen "); MODULE_DESCRIPTION("Analog Devices M2K DAC driver"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); diff --git a/drivers/iio/imu/adis16550.c b/drivers/iio/imu/adis16550.c index 4ca6a059c0da71..8948b7063377d7 100644 --- a/drivers/iio/imu/adis16550.c +++ b/drivers/iio/imu/adis16550.c @@ -1154,5 +1154,5 @@ MODULE_AUTHOR("Ramona Gradinariu "); MODULE_AUTHOR("Antoniu Miclaus "); MODULE_AUTHOR("Robert Budai "); MODULE_DESCRIPTION("Analog Devices ADIS16550 IMU driver"); -MODULE_IMPORT_NS("IIO_ADISLIB"); +MODULE_IMPORT_NS(IIO_ADISLIB); MODULE_LICENSE("GPL"); diff --git a/drivers/iio/logic/m2k-logic-analyzer.c b/drivers/iio/logic/m2k-logic-analyzer.c index 3a8ef4429ceb40..afd577a12162cc 100644 --- a/drivers/iio/logic/m2k-logic-analyzer.c +++ b/drivers/iio/logic/m2k-logic-analyzer.c @@ -1163,3 +1163,4 @@ module_platform_driver(m2k_la_driver); MODULE_AUTHOR(""); MODULE_DESCRIPTION(""); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); From c3eb47be8604ff0f1208bb84a83342330e8cb17b Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Mon, 2 Jun 2025 15:01:40 +0100 Subject: [PATCH 4/4] firmware: rp1: Rename to rp1-fw to avoid module name collision There is already the driver in drivers/mfd/rp1.ko, so having drivers/firmware/rp1.ko can cause issues when using modinfo and similar, and we can get errors with "Module rp1 is already loaded" when trying to load it. Rename the module so that the name is unique. Signed-off-by: Dave Stevenson (cherry picked from commit 564a5ad0b40b9ca7f1c33697f3a983ff22fd2bad) --- drivers/firmware/Makefile | 2 +- drivers/firmware/{rp1.c => rp1-fw.c} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename drivers/firmware/{rp1.c => rp1-fw.c} (100%) diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index 12185bc9e49508..216209f313c597 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -17,7 +17,7 @@ obj-$(CONFIG_ISCSI_IBFT) += iscsi_ibft.o obj-$(CONFIG_FIRMWARE_MEMMAP) += memmap.o obj-$(CONFIG_MTK_ADSP_IPC) += mtk-adsp-ipc.o obj-$(CONFIG_RASPBERRYPI_FIRMWARE) += raspberrypi.o -obj-$(CONFIG_FIRMWARE_RP1) += rp1.o +obj-$(CONFIG_FIRMWARE_RP1) += rp1-fw.o obj-$(CONFIG_FW_CFG_SYSFS) += qemu_fw_cfg.o obj-$(CONFIG_QCOM_SCM) += qcom-scm.o qcom-scm-objs += qcom_scm.o qcom_scm-smc.o qcom_scm-legacy.o diff --git a/drivers/firmware/rp1.c b/drivers/firmware/rp1-fw.c similarity index 100% rename from drivers/firmware/rp1.c rename to drivers/firmware/rp1-fw.c