Re: [PATCH v3 6/8] iio: adc: ad4030: Add SPI offload support

Jonathan Cameron
2025-09-28T10:02:52Z

On Sat, 27 Sep 2025 20:59:36 +0800
kernel test robot <lkp@intel.com> wrote:

> Hi Marcelo,
>
> kernel test robot noticed the following build errors:

So, question is stubs or add a dependency.
(Assuming there isn't a patch in flight already to add the stubs).

Uwe, does it make sense to add stubs for these, similar to many of the
other consumer interfaces?

Jonathan

>
> [auto build test ERROR on 561285d048053fec8a3d6d1e3ddc60df11c393a0]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Marcelo-Schmitt/dt-bindings-iio-adc-adi-ad4030-Reference-spi-peripheral-props/20250927-044546
> base: 561285d048053fec8a3d6d1e3ddc60df11c393a0
> patch link: https://lore.kernel.org/r/0028720d2cb21898ef044458065ac8a0bc829588.1758916484.git.marcelo.schmitt%40analog.com
> patch subject: [PATCH v3 6/8] iio: adc: ad4030: Add SPI offload support
> config: i386-randconfig-014-20250927 (https://download.01.org/0day-ci/archive/20250927/202509272028.0zLNiR5w-lkp@intel.com/config)
> compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250927/202509272028.0zLNiR5w-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202509272028.0zLNiR5w-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> drivers/spi/spi-offload-trigger-pwm.c: In function 'spi_offload_trigger_pwm_validate':
> >> drivers/spi/spi-offload-trigger-pwm.c:55:15: error: implicit declaration of function 'pwm_round_waveform_might_sleep' [-Wimplicit-function-declaration]
> 55 | ret = pwm_round_waveform_might_sleep(st->pwm, &wf);
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> drivers/spi/spi-offload-trigger-pwm.c: In function 'spi_offload_trigger_pwm_enable':
> >> drivers/spi/spi-offload-trigger-pwm.c:81:16: error: implicit declaration of function 'pwm_set_waveform_might_sleep' [-Wimplicit-function-declaration]
> 81 | return pwm_set_waveform_might_sleep(st->pwm, &wf, false);
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> drivers/spi/spi-offload-trigger-pwm.c: In function 'spi_offload_trigger_pwm_disable':
> >> drivers/spi/spi-offload-trigger-pwm.c:90:15: error: implicit declaration of function 'pwm_get_waveform_might_sleep' [-Wimplicit-function-declaration]
> 90 | ret = pwm_get_waveform_might_sleep(st->pwm, &wf);
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> Kconfig warnings: (for reference only)
> WARNING: unmet direct dependencies detected for SPI_OFFLOAD_TRIGGER_PWM
> Depends on [n]: SPI [=y] && SPI_OFFLOAD [=y] && PWM [=n]
> Selected by [y]:
> - AD4030 [=y] && IIO [=y] && SPI [=y] && GPIOLIB [=y]
>
>
> vim +/pwm_round_waveform_might_sleep +55 drivers/spi/spi-offload-trigger-pwm.c
>
> ebb398ae1e052c David Lechner 2025-02-07 36
> ebb398ae1e052c David Lechner 2025-02-07 37 static int spi_offload_trigger_pwm_validate(struct spi_offload_trigger *trigger,
> ebb398ae1e052c David Lechner 2025-02-07 38 struct spi_offload_trigger_config *config)
> ebb398ae1e052c David Lechner 2025-02-07 39 {
> ebb398ae1e052c David Lechner 2025-02-07 40 struct spi_offload_trigger_pwm_state *st = spi_offload_trigger_get_priv(trigger);
> ebb398ae1e052c David Lechner 2025-02-07 41 struct spi_offload_trigger_periodic *periodic = &config->periodic;
> ebb398ae1e052c David Lechner 2025-02-07 42 struct pwm_waveform wf = { };
> ebb398ae1e052c David Lechner 2025-02-07 43 int ret;
> ebb398ae1e052c David Lechner 2025-02-07 44
> ebb398ae1e052c David Lechner 2025-02-07 45 if (config->type != SPI_OFFLOAD_TRIGGER_PERIODIC)
> ebb398ae1e052c David Lechner 2025-02-07 46 return -EINVAL;
> ebb398ae1e052c David Lechner 2025-02-07 47
> ebb398ae1e052c David Lechner 2025-02-07 48 if (!periodic->frequency_hz)
> ebb398ae1e052c David Lechner 2025-02-07 49 return -EINVAL;
> ebb398ae1e052c David Lechner 2025-02-07 50
> ebb398ae1e052c David Lechner 2025-02-07 51 wf.period_length_ns = DIV_ROUND_UP_ULL(NSEC_PER_SEC, periodic->frequency_hz);
> ebb398ae1e052c David Lechner 2025-02-07 52 /* REVISIT: 50% duty-cycle for now - may add config parameter later */
> ebb398ae1e052c David Lechner 2025-02-07 53 wf.duty_length_ns = wf.period_length_ns / 2;
> ebb398ae1e052c David Lechner 2025-02-07 54
> ebb398ae1e052c David Lechner 2025-02-07 @55 ret = pwm_round_waveform_might_sleep(st->pwm, &wf);
> ebb398ae1e052c David Lechner 2025-02-07 56 if (ret < 0)
> ebb398ae1e052c David Lechner 2025-02-07 57 return ret;
> ebb398ae1e052c David Lechner 2025-02-07 58
> ebb398ae1e052c David Lechner 2025-02-07 59 periodic->frequency_hz = DIV_ROUND_UP_ULL(NSEC_PER_SEC, wf.period_length_ns);
> ebb398ae1e052c David Lechner 2025-02-07 60
> ebb398ae1e052c David Lechner 2025-02-07 61 return 0;
> ebb398ae1e052c David Lechner 2025-02-07 62 }
> ebb398ae1e052c David Lechner 2025-02-07 63
> ebb398ae1e052c David Lechner 2025-02-07 64 static int spi_offload_trigger_pwm_enable(struct spi_offload_trigger *trigger,
> ebb398ae1e052c David Lechner 2025-02-07 65 struct spi_offload_trigger_config *config)
> ebb398ae1e052c David Lechner 2025-02-07 66 {
> ebb398ae1e052c David Lechner 2025-02-07 67 struct spi_offload_trigger_pwm_state *st = spi_offload_trigger_get_priv(trigger);
> ebb398ae1e052c David Lechner 2025-02-07 68 struct spi_offload_trigger_periodic *periodic = &config->periodic;
> ebb398ae1e052c David Lechner 2025-02-07 69 struct pwm_waveform wf = { };
> ebb398ae1e052c David Lechner 2025-02-07 70
> ebb398ae1e052c David Lechner 2025-02-07 71 if (config->type != SPI_OFFLOAD_TRIGGER_PERIODIC)
> ebb398ae1e052c David Lechner 2025-02-07 72 return -EINVAL;
> ebb398ae1e052c David Lechner 2025-02-07 73
> ebb398ae1e052c David Lechner 2025-02-07 74 if (!periodic->frequency_hz)
> ebb398ae1e052c David Lechner 2025-02-07 75 return -EINVAL;
> ebb398ae1e052c David Lechner 2025-02-07 76
> ebb398ae1e052c David Lechner 2025-02-07 77 wf.period_length_ns = DIV_ROUND_UP_ULL(NSEC_PER_SEC, periodic->frequency_hz);
> ebb398ae1e052c David Lechner 2025-02-07 78 /* REVISIT: 50% duty-cycle for now - may add config parameter later */
> ebb398ae1e052c David Lechner 2025-02-07 79 wf.duty_length_ns = wf.period_length_ns / 2;
> ebb398ae1e052c David Lechner 2025-02-07 80
> ebb398ae1e052c David Lechner 2025-02-07 @81 return pwm_set_waveform_might_sleep(st->pwm, &wf, false);
> ebb398ae1e052c David Lechner 2025-02-07 82 }
> ebb398ae1e052c David Lechner 2025-02-07 83
> ebb398ae1e052c David Lechner 2025-02-07 84 static void spi_offload_trigger_pwm_disable(struct spi_offload_trigger *trigger)
> ebb398ae1e052c David Lechner 2025-02-07 85 {
> ebb398ae1e052c David Lechner 2025-02-07 86 struct spi_offload_trigger_pwm_state *st = spi_offload_trigger_get_priv(trigger);
> ebb398ae1e052c David Lechner 2025-02-07 87 struct pwm_waveform wf;
> ebb398ae1e052c David Lechner 2025-02-07 88 int ret;
> ebb398ae1e052c David Lechner 2025-02-07 89
> ebb398ae1e052c David Lechner 2025-02-07 @90 ret = pwm_get_waveform_might_sleep(st->pwm, &wf);
> ebb398ae1e052c David Lechner 2025-02-07 91 if (ret < 0) {
> ebb398ae1e052c David Lechner 2025-02-07 92 dev_err(st->dev, "failed to get waveform: %d\n", ret);
> ebb398ae1e052c David Lechner 2025-02-07 93 return;
> ebb398ae1e052c David Lechner 2025-02-07 94 }
> ebb398ae1e052c David Lechner 2025-02-07 95
> ebb398ae1e052c David Lechner 2025-02-07 96 wf.duty_length_ns = 0;
> ebb398ae1e052c David Lechner 2025-02-07 97
> ebb398ae1e052c David Lechner 2025-02-07 98 ret = pwm_set_waveform_might_sleep(st->pwm, &wf, false);
> ebb398ae1e052c David Lechner 2025-02-07 99 if (ret < 0)
> ebb398ae1e052c David Lechner 2025-02-07 100 dev_err(st->dev, "failed to disable PWM: %d\n", ret);
> ebb398ae1e052c David Lechner 2025-02-07 101 }
> ebb398ae1e052c David Lechner 2025-02-07 102
>