Re: [PATCH v4 2/3] pwm: Add Allwinner's D1/T113-S3/R329 SoCs PWM support
From: kernel test robot
Date: Sat Aug 12 2023 - 10:48:43 EST
Hi Aleksandr,
kernel test robot noticed the following build warnings:
[auto build test WARNING on thierry-reding-pwm/for-next]
[also build test WARNING on sunxi/sunxi/for-next robh/for-next linus/master v6.5-rc5 next-20230809]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Aleksandr-Shubin/dt-bindings-pwm-Add-binding-for-Allwinner-D1-T113-S3-R329-PWM-controller/20230810-225849
base: https://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm.git for-next
patch link: https://lore.kernel.org/r/20230810145443.1053387-3-privatesub2%40gmail.com
patch subject: [PATCH v4 2/3] pwm: Add Allwinner's D1/T113-S3/R329 SoCs PWM support
config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20230812/202308122212.SOHP09RP-lkp@xxxxxxxxx/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: (https://download.01.org/0day-ci/archive/20230812/202308122212.SOHP09RP-lkp@xxxxxxxxx/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@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202308122212.SOHP09RP-lkp@xxxxxxxxx/
All warnings (new ones prefixed by >>):
drivers/pwm/pwm-sun20i.c: In function 'sun20i_pwm_apply':
>> drivers/pwm/pwm-sun20i.c:121:48: warning: unused variable 'tmp' [-Wunused-variable]
121 | u64 bus_rate, hosc_rate, clk_div, val, tmp;
| ^~~
vim +/tmp +121 drivers/pwm/pwm-sun20i.c
115
116 static int sun20i_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
117 const struct pwm_state *state)
118 {
119 struct sun20i_pwm_chip *sun20i_chip = to_sun20i_pwm_chip(chip);
120 u32 clk_gate, clk_cfg, pwm_en, ctl, period;
> 121 u64 bus_rate, hosc_rate, clk_div, val, tmp;
122 u32 prescaler, div_m;
123 bool use_bus_clk;
124 int ret = 0;
125
126 mutex_lock(&sun20i_chip->mutex);
127
128 pwm_en = sun20i_pwm_readl(sun20i_chip, PWM_ENABLE);
129
130 if (state->enabled != pwm->state.enabled)
131 clk_gate = sun20i_pwm_readl(sun20i_chip, PWM_CLK_GATE);
132
133 if (state->enabled != pwm->state.enabled && !state->enabled) {
134 clk_gate &= ~PWM_CLK_GATE_GATING(pwm->hwpwm);
135 pwm_en &= ~PWM_ENABLE_EN(pwm->hwpwm);
136 sun20i_pwm_writel(sun20i_chip, pwm_en, PWM_ENABLE);
137 sun20i_pwm_writel(sun20i_chip, clk_gate, PWM_CLK_GATE);
138 }
139
140 if (state->polarity != pwm->state.polarity ||
141 state->duty_cycle != pwm->state.duty_cycle ||
142 state->period != pwm->state.period) {
143 ctl = sun20i_pwm_readl(sun20i_chip, PWM_CTL(pwm->hwpwm));
144 clk_cfg = sun20i_pwm_readl(sun20i_chip, PWM_CLK_CFG(pwm->hwpwm));
145 hosc_rate = clk_get_rate(sun20i_chip->clk_hosc);
146 bus_rate = clk_get_rate(sun20i_chip->clk_bus);
147 if (pwm_en & PWM_ENABLE_EN(pwm->hwpwm ^ 1)) {
148 /* if the neighbor channel is enable, check period only */
149 use_bus_clk = FIELD_GET(PWM_CLK_CFG_SRC, clk_cfg) != 0;
150 val = state->period * (use_bus_clk ? bus_rate : hosc_rate);
151 do_div(val, NSEC_PER_SEC);
152
153 div_m = FIELD_GET(PWM_CLK_CFG_DIV_M, clk_cfg);
154 } else {
155 /* check period and select clock source */
156 use_bus_clk = false;
157 val = state->period * hosc_rate;
158 do_div(val, NSEC_PER_SEC);
159 if (val <= 1) {
160 use_bus_clk = true;
161 val = state->period * bus_rate;
162 do_div(val, NSEC_PER_SEC);
163 if (val <= 1) {
164 ret = -EINVAL;
165 goto unlock_mutex;
166 }
167 }
168 div_m = fls(DIV_ROUND_DOWN_ULL(val, PWM_MAGIC));
169 if (div_m >= 9) {
170 ret = -EINVAL;
171 goto unlock_mutex;
172 }
173
174 /* set up the CLK_DIV_M and clock CLK_SRC */
175 clk_cfg = FIELD_PREP(PWM_CLK_CFG_DIV_M, div_m);
176 clk_cfg |= FIELD_PREP(PWM_CLK_CFG_SRC, use_bus_clk);
177
178 sun20i_pwm_writel(sun20i_chip, clk_cfg, PWM_CLK_CFG(pwm->hwpwm));
179 }
180
181 /* calculate prescaler, PWM entire cycle */
182 clk_div = val >> div_m;
183 if (clk_div <= 65534) {
184 prescaler = 0;
185 } else {
186 prescaler = DIV_ROUND_UP_ULL(clk_div - 65534, 65535);
187 if (prescaler >= 256) {
188 ret = -EINVAL;
189 goto unlock_mutex;
190 }
191 do_div(clk_div, prescaler + 1);
192 }
193
194 period = FIELD_PREP(PWM_PERIOD_ENTIRE_CYCLE, clk_div);
195
196 /* set duty cycle */
197 val = state->duty_cycle * (use_bus_clk ? bus_rate : hosc_rate);
198 do_div(val, NSEC_PER_SEC);
199 clk_div = val >> div_m;
200 do_div(clk_div, prescaler + 1);
201
202 /*
203 * The formula of the output period and the duty-cycle for PWM are as follows.
204 * T period = (PWM01_CLK / PWM0_PRESCALE_K)^-1 * (PPR0.PWM_ENTIRE_CYCLE + 1)
205 * T high-level = (PWM01_CLK / PWM0_PRESCALE_K)^-1 * PPR0.PWM_ACT_CYCLE
206 * Duty-cycle = T high-level / T period
207 * In accordance with this formula, in order to set the duty-cycle to 100%,
208 * it is necessary that PWM_ACT_CYCLE >= PWM_ENTIRE_CYCLE + 1
209 */
210 if (state->duty_cycle == state->period)
211 clk_div++;
212 period |= FIELD_PREP(PWM_PERIOD_ACT_CYCLE, clk_div);
213 sun20i_pwm_writel(sun20i_chip, period, PWM_PERIOD(pwm->hwpwm));
214
215 ctl = FIELD_PREP(PWM_CTL_PRESCAL_K, prescaler);
216 if (state->polarity == PWM_POLARITY_NORMAL)
217 ctl |= PWM_CTL_ACT_STA;
218
219 sun20i_pwm_writel(sun20i_chip, ctl, PWM_CTL(pwm->hwpwm));
220 }
221
222 if (state->enabled != pwm->state.enabled && state->enabled) {
223 clk_gate &= ~PWM_CLK_GATE_BYPASS(pwm->hwpwm);
224 clk_gate |= PWM_CLK_GATE_GATING(pwm->hwpwm);
225 pwm_en |= PWM_ENABLE_EN(pwm->hwpwm);
226 sun20i_pwm_writel(sun20i_chip, pwm_en, PWM_ENABLE);
227 sun20i_pwm_writel(sun20i_chip, clk_gate, PWM_CLK_GATE);
228 }
229
230 unlock_mutex:
231 mutex_unlock(&sun20i_chip->mutex);
232
233 return ret;
234 }
235
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki