[PATCH 1/4] serial: stm32: implement prescaler tuning to compute low baudrate
kernel test robot
lkp at intel.com
Thu Jan 11 22:57:57 PST 2024
Hi Valentin,
kernel test robot noticed the following build errors:
[auto build test ERROR on atorgue-stm32/stm32-next]
[also build test ERROR on tty/tty-testing tty/tty-next tty/tty-linus usb/usb-testing usb/usb-next usb/usb-linus linus/master v6.7 next-20240111]
[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/Valentin-Caron/serial-stm32-implement-prescaler-tuning-to-compute-low-baudrate/20240111-233406
base: https://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32.git stm32-next
patch link: https://lore.kernel.org/r/20240111152712.1842790-2-valentin.caron%40foss.st.com
patch subject: [PATCH 1/4] serial: stm32: implement prescaler tuning to compute low baudrate
config: i386-buildonly-randconfig-003-20240112 (https://download.01.org/0day-ci/archive/20240112/202401121426.pnTJrQes-lkp@intel.com/config)
compiler: ClangBuiltLinux clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240112/202401121426.pnTJrQes-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 at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401121426.pnTJrQes-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/tty/serial/stm32-usart.c:1303:7: error: call to undeclared function 'FIELD_FIT'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
1303 | if (FIELD_FIT(USART_BRR_MASK, brr)) {
| ^
1 error generated.
vim +/FIELD_FIT +1303 drivers/tty/serial/stm32-usart.c
1156
1157 static void stm32_usart_set_termios(struct uart_port *port,
1158 struct ktermios *termios,
1159 const struct ktermios *old)
1160 {
1161 struct stm32_port *stm32_port = to_stm32_port(port);
1162 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
1163 const struct stm32_usart_config *cfg = &stm32_port->info->cfg;
1164 struct serial_rs485 *rs485conf = &port->rs485;
1165 unsigned int baud, bits, uart_clk, uart_clk_pres;
1166 u32 usartdiv, mantissa, fraction, oversampling;
1167 tcflag_t cflag = termios->c_cflag;
1168 u32 cr1, cr2, cr3, isr, brr, presc;
1169 unsigned long flags;
1170 int ret;
1171
1172 if (!stm32_port->hw_flow_control)
1173 cflag &= ~CRTSCTS;
1174
1175 uart_clk = clk_get_rate(stm32_port->clk);
1176
1177 baud = uart_get_baud_rate(port, termios, old, 0, uart_clk / 8);
1178
1179 uart_port_lock_irqsave(port, &flags);
1180
1181 ret = readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr,
1182 isr,
1183 (isr & USART_SR_TC),
1184 10, 100000);
1185
1186 /* Send the TC error message only when ISR_TC is not set. */
1187 if (ret)
1188 dev_err(port->dev, "Transmission is not complete\n");
1189
1190 /* Stop serial port and reset value */
1191 writel_relaxed(0, port->membase + ofs->cr1);
1192
1193 /* flush RX & TX FIFO */
1194 if (ofs->rqr != UNDEF_REG)
1195 writel_relaxed(USART_RQR_TXFRQ | USART_RQR_RXFRQ,
1196 port->membase + ofs->rqr);
1197
1198 cr1 = USART_CR1_TE | USART_CR1_RE;
1199 if (stm32_port->fifoen)
1200 cr1 |= USART_CR1_FIFOEN;
1201 cr2 = stm32_port->swap ? USART_CR2_SWAP : 0;
1202
1203 /* Tx and RX FIFO configuration */
1204 cr3 = readl_relaxed(port->membase + ofs->cr3);
1205 cr3 &= USART_CR3_TXFTIE | USART_CR3_RXFTIE;
1206 if (stm32_port->fifoen) {
1207 if (stm32_port->txftcfg >= 0)
1208 cr3 |= stm32_port->txftcfg << USART_CR3_TXFTCFG_SHIFT;
1209 if (stm32_port->rxftcfg >= 0)
1210 cr3 |= stm32_port->rxftcfg << USART_CR3_RXFTCFG_SHIFT;
1211 }
1212
1213 if (cflag & CSTOPB)
1214 cr2 |= USART_CR2_STOP_2B;
1215
1216 bits = tty_get_char_size(cflag);
1217 stm32_port->rdr_mask = (BIT(bits) - 1);
1218
1219 if (cflag & PARENB) {
1220 bits++;
1221 cr1 |= USART_CR1_PCE;
1222 }
1223
1224 /*
1225 * Word length configuration:
1226 * CS8 + parity, 9 bits word aka [M1:M0] = 0b01
1227 * CS7 or (CS6 + parity), 7 bits word aka [M1:M0] = 0b10
1228 * CS8 or (CS7 + parity), 8 bits word aka [M1:M0] = 0b00
1229 * M0 and M1 already cleared by cr1 initialization.
1230 */
1231 if (bits == 9) {
1232 cr1 |= USART_CR1_M0;
1233 } else if ((bits == 7) && cfg->has_7bits_data) {
1234 cr1 |= USART_CR1_M1;
1235 } else if (bits != 8) {
1236 dev_dbg(port->dev, "Unsupported data bits config: %u bits\n"
1237 , bits);
1238 cflag &= ~CSIZE;
1239 cflag |= CS8;
1240 termios->c_cflag = cflag;
1241 bits = 8;
1242 if (cflag & PARENB) {
1243 bits++;
1244 cr1 |= USART_CR1_M0;
1245 }
1246 }
1247
1248 if (ofs->rtor != UNDEF_REG && (stm32_port->rx_ch ||
1249 (stm32_port->fifoen &&
1250 stm32_port->rxftcfg >= 0))) {
1251 if (cflag & CSTOPB)
1252 bits = bits + 3; /* 1 start bit + 2 stop bits */
1253 else
1254 bits = bits + 2; /* 1 start bit + 1 stop bit */
1255
1256 /* RX timeout irq to occur after last stop bit + bits */
1257 stm32_port->cr1_irq = USART_CR1_RTOIE;
1258 writel_relaxed(bits, port->membase + ofs->rtor);
1259 cr2 |= USART_CR2_RTOEN;
1260 /*
1261 * Enable fifo threshold irq in two cases, either when there is no DMA, or when
1262 * wake up over usart, from low power until the DMA gets re-enabled by resume.
1263 */
1264 stm32_port->cr3_irq = USART_CR3_RXFTIE;
1265 }
1266
1267 cr1 |= stm32_port->cr1_irq;
1268 cr3 |= stm32_port->cr3_irq;
1269
1270 if (cflag & PARODD)
1271 cr1 |= USART_CR1_PS;
1272
1273 port->status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS);
1274 if (cflag & CRTSCTS) {
1275 port->status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS;
1276 cr3 |= USART_CR3_CTSE | USART_CR3_RTSE;
1277 }
1278
1279 for (presc = 0; presc <= USART_PRESC_MAX; presc++) {
1280 uart_clk_pres = DIV_ROUND_CLOSEST(uart_clk, stm32_usart_presc_val[presc]);
1281 usartdiv = DIV_ROUND_CLOSEST(uart_clk_pres, baud);
1282
1283 /*
1284 * The USART supports 16 or 8 times oversampling.
1285 * By default we prefer 16 times oversampling, so that the receiver
1286 * has a better tolerance to clock deviations.
1287 * 8 times oversampling is only used to achieve higher speeds.
1288 */
1289 if (usartdiv < 16) {
1290 oversampling = 8;
1291 cr1 |= USART_CR1_OVER8;
1292 stm32_usart_set_bits(port, ofs->cr1, USART_CR1_OVER8);
1293 } else {
1294 oversampling = 16;
1295 cr1 &= ~USART_CR1_OVER8;
1296 stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_OVER8);
1297 }
1298
1299 mantissa = (usartdiv / oversampling) << USART_BRR_DIV_M_SHIFT;
1300 fraction = usartdiv % oversampling;
1301 brr = mantissa | fraction;
1302
> 1303 if (FIELD_FIT(USART_BRR_MASK, brr)) {
1304 if (ofs->presc != UNDEF_REG) {
1305 port->uartclk = uart_clk_pres;
1306 writel_relaxed(presc, port->membase + ofs->presc);
1307 } else if (presc) {
1308 /* We need a prescaler but we don't have it (STM32F4, STM32F7) */
1309 dev_err(port->dev,
1310 "unable to set baudrate, input clock is too high");
1311 }
1312 break;
1313 } else if (presc == USART_PRESC_MAX) {
1314 /* Even with prescaler and brr at max value we can't set baudrate */
1315 dev_err(port->dev, "unable to set baudrate, input clock is too high");
1316 break;
1317 }
1318 }
1319
1320 writel_relaxed(brr, port->membase + ofs->brr);
1321
1322 uart_update_timeout(port, cflag, baud);
1323
1324 port->read_status_mask = USART_SR_ORE;
1325 if (termios->c_iflag & INPCK)
1326 port->read_status_mask |= USART_SR_PE | USART_SR_FE;
1327 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
1328 port->read_status_mask |= USART_SR_FE;
1329
1330 /* Characters to ignore */
1331 port->ignore_status_mask = 0;
1332 if (termios->c_iflag & IGNPAR)
1333 port->ignore_status_mask = USART_SR_PE | USART_SR_FE;
1334 if (termios->c_iflag & IGNBRK) {
1335 port->ignore_status_mask |= USART_SR_FE;
1336 /*
1337 * If we're ignoring parity and break indicators,
1338 * ignore overruns too (for real raw support).
1339 */
1340 if (termios->c_iflag & IGNPAR)
1341 port->ignore_status_mask |= USART_SR_ORE;
1342 }
1343
1344 /* Ignore all characters if CREAD is not set */
1345 if ((termios->c_cflag & CREAD) == 0)
1346 port->ignore_status_mask |= USART_SR_DUMMY_RX;
1347
1348 if (stm32_port->rx_ch) {
1349 /*
1350 * Setup DMA to collect only valid data and enable error irqs.
1351 * This also enables break reception when using DMA.
1352 */
1353 cr1 |= USART_CR1_PEIE;
1354 cr3 |= USART_CR3_EIE;
1355 cr3 |= USART_CR3_DMAR;
1356 cr3 |= USART_CR3_DDRE;
1357 }
1358
1359 if (stm32_port->tx_ch)
1360 cr3 |= USART_CR3_DMAT;
1361
1362 if (rs485conf->flags & SER_RS485_ENABLED) {
1363 stm32_usart_config_reg_rs485(&cr1, &cr3,
1364 rs485conf->delay_rts_before_send,
1365 rs485conf->delay_rts_after_send,
1366 baud);
1367 if (rs485conf->flags & SER_RS485_RTS_ON_SEND) {
1368 cr3 &= ~USART_CR3_DEP;
1369 rs485conf->flags &= ~SER_RS485_RTS_AFTER_SEND;
1370 } else {
1371 cr3 |= USART_CR3_DEP;
1372 rs485conf->flags |= SER_RS485_RTS_AFTER_SEND;
1373 }
1374
1375 } else {
1376 cr3 &= ~(USART_CR3_DEM | USART_CR3_DEP);
1377 cr1 &= ~(USART_CR1_DEDT_MASK | USART_CR1_DEAT_MASK);
1378 }
1379
1380 /* Configure wake up from low power on start bit detection */
1381 if (stm32_port->wakeup_src) {
1382 cr3 &= ~USART_CR3_WUS_MASK;
1383 cr3 |= USART_CR3_WUS_START_BIT;
1384 }
1385
1386 writel_relaxed(cr3, port->membase + ofs->cr3);
1387 writel_relaxed(cr2, port->membase + ofs->cr2);
1388 writel_relaxed(cr1, port->membase + ofs->cr1);
1389
1390 stm32_usart_set_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit));
1391 uart_port_unlock_irqrestore(port, flags);
1392
1393 /* Handle modem control interrupts */
1394 if (UART_ENABLE_MS(port, termios->c_cflag))
1395 stm32_usart_enable_ms(port);
1396 else
1397 stm32_usart_disable_ms(port);
1398 }
1399
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
More information about the linux-arm-kernel
mailing list