1 /*
2  * Copyright (c) 2021,2025 Henrik Brix Andersen <henrik@brixandersen.dk>
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #define DT_DRV_COMPAT neorv32_uart
8 
9 #include <zephyr/device.h>
10 #include <zephyr/drivers/syscon.h>
11 #include <zephyr/drivers/uart.h>
12 #include <zephyr/irq.h>
13 #include <zephyr/logging/log.h>
14 #include <zephyr/pm/device.h>
15 #include <zephyr/spinlock.h>
16 #include <zephyr/sys/sys_io.h>
17 
18 #include <soc.h>
19 
20 LOG_MODULE_REGISTER(uart_neorv32, CONFIG_UART_LOG_LEVEL);
21 
22 /* NEORV32 UART registers offsets */
23 #define NEORV32_UART_CTRL 0x00
24 #define NEORV32_UART_DATA 0x04
25 
26 /* NEORV32 UART CTRL register bits */
27 #define NEORV32_UART_CTRL_EN               BIT(0)
28 #define NEORV32_UART_CTRL_SIM_MODE         BIT(1)
29 #define NEORV32_UART_CTRL_HWFC_EN          BIT(2)
30 #define NEORV32_UART_CTRL_PRSC             GENMASK(5, 3)
31 #define NEORV32_UART_CTRL_BAUD             GENMASK(15, 6)
32 #define NEORV32_UART_CTRL_RX_NEMPTY        BIT(16)
33 #define NEORV32_UART_CTRL_RX_HALF          BIT(17)
34 #define NEORV32_UART_CTRL_RX_FULL          BIT(18)
35 #define NEORV32_UART_CTRL_TX_EMPTY         BIT(19)
36 #define NEORV32_UART_CTRL_TX_NHALF         BIT(20)
37 #define NEORV32_UART_CTRL_TX_FULL          BIT(21)
38 #define NEORV32_UART_CTRL_IRQ_RX_NEMPTY    BIT(22)
39 #define NEORV32_UART_CTRL_IRQ_RX_HALF      BIT(23)
40 #define NEORV32_UART_CTRL_IRQ_RX_FULL      BIT(24)
41 #define NEORV32_UART_CTRL_IRQ_TX_EMPTY     BIT(25)
42 #define NEORV32_UART_CTRL_IRQ_TX_NHALF     BIT(26)
43 #define NEORV32_UART_CTRL_UART_CTRL_RX_CLR BIT(28)
44 #define NEORV32_UART_CTRL_UART_CTRL_TX_CLR BIT(29)
45 #define NEORV32_UART_CTRL_RX_OVER          BIT(30)
46 #define NEORV32_UART_CTRL_TX_BUSY          BIT(31)
47 
48 /* NEORV32 UART DATA register bits */
49 #define NEORV32_UART_DATA_RTX          GENMASK(7, 0)
50 #define NEORV32_UART_DATA_RX_FIFO_SIZE GENMASK(11, 8)
51 #define NEORV32_UART_DATA_TX_FIFO_SIZE GENMASK(15, 12)
52 
53 struct neorv32_uart_config {
54 	const struct device *syscon;
55 	uint32_t feature_mask;
56 	mm_reg_t base;
57 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
58 	void (*irq_config_func)(const struct device *dev);
59 #endif /* CONFIG_UART_INTERRUPT_DRIVEN */
60 };
61 
62 struct neorv32_uart_data {
63 	struct uart_config uart_cfg;
64 	struct k_spinlock lock;
65 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
66 	uart_irq_callback_user_data_t callback;
67 	void *callback_data;
68 	uint32_t last_ctrl;
69 #endif /* CONFIG_UART_INTERRUPT_DRIVEN */
70 };
71 
neorv32_uart_read_ctrl(const struct device * dev)72 static inline uint32_t neorv32_uart_read_ctrl(const struct device *dev)
73 {
74 	const struct neorv32_uart_config *config = dev->config;
75 
76 	return sys_read32(config->base + NEORV32_UART_CTRL);
77 }
78 
neorv32_uart_write_ctrl(const struct device * dev,uint32_t ctrl)79 static inline void neorv32_uart_write_ctrl(const struct device *dev, uint32_t ctrl)
80 {
81 	const struct neorv32_uart_config *config = dev->config;
82 
83 	sys_write32(ctrl, config->base + NEORV32_UART_CTRL);
84 }
85 
neorv32_uart_read_data(const struct device * dev)86 static inline uint32_t neorv32_uart_read_data(const struct device *dev)
87 {
88 	const struct neorv32_uart_config *config = dev->config;
89 
90 	return sys_read32(config->base + NEORV32_UART_DATA);
91 }
92 
neorv32_uart_write_data(const struct device * dev,uint32_t data)93 static inline void neorv32_uart_write_data(const struct device *dev, uint32_t data)
94 {
95 	const struct neorv32_uart_config *config = dev->config;
96 
97 	sys_write32(data, config->base + NEORV32_UART_DATA);
98 }
99 
neorv32_uart_poll_in(const struct device * dev,unsigned char * c)100 static int neorv32_uart_poll_in(const struct device *dev, unsigned char *c)
101 {
102 	uint32_t ctrl;
103 
104 	ctrl = neorv32_uart_read_ctrl(dev);
105 	if ((ctrl & NEORV32_UART_CTRL_RX_NEMPTY) != 0U) {
106 		*c = neorv32_uart_read_data(dev) & NEORV32_UART_DATA_RTX;
107 		return 0;
108 	}
109 
110 	return -1;
111 }
112 
neorv32_uart_poll_out(const struct device * dev,unsigned char c)113 static void neorv32_uart_poll_out(const struct device *dev, unsigned char c)
114 {
115 	while ((neorv32_uart_read_ctrl(dev) & NEORV32_UART_CTRL_TX_FULL) != 0U) {
116 	}
117 
118 	neorv32_uart_write_data(dev, c);
119 }
120 
neorv32_uart_configure(const struct device * dev,const struct uart_config * cfg)121 static int neorv32_uart_configure(const struct device *dev, const struct uart_config *cfg)
122 {
123 	const uint16_t baudxx_max = FIELD_GET(NEORV32_UART_CTRL_BAUD, NEORV32_UART_CTRL_BAUD);
124 	const uint8_t prscx_max = FIELD_GET(NEORV32_UART_CTRL_PRSC, NEORV32_UART_CTRL_PRSC);
125 	const struct neorv32_uart_config *config = dev->config;
126 	struct neorv32_uart_data *data = dev->data;
127 	k_spinlock_key_t key;
128 	uint16_t baudxx = 0;
129 	uint8_t prscx = 0;
130 	uint32_t ctrl;
131 	bool hwfc_en;
132 	uint32_t clk;
133 	int err;
134 
135 	__ASSERT_NO_MSG(cfg != NULL);
136 
137 	if (cfg->stop_bits != UART_CFG_STOP_BITS_1) {
138 		LOG_ERR("hardware only supports one stop bit");
139 		return -ENOTSUP;
140 	}
141 
142 	if (cfg->data_bits != UART_CFG_DATA_BITS_8) {
143 		LOG_ERR("hardware only supports 8 data bits");
144 		return -ENOTSUP;
145 	}
146 
147 	if (cfg->parity != UART_CFG_PARITY_NONE) {
148 		LOG_ERR("hardware only supports parity mode none");
149 		return -ENOTSUP;
150 	}
151 
152 	switch (cfg->flow_ctrl) {
153 	case UART_CFG_FLOW_CTRL_NONE:
154 		hwfc_en = false;
155 		break;
156 	case UART_CFG_FLOW_CTRL_RTS_CTS:
157 		hwfc_en = true;
158 		break;
159 	default:
160 		LOG_ERR("unsupported flow control mode %d", cfg->flow_ctrl);
161 		return -ENOTSUP;
162 	}
163 
164 	err = syscon_read_reg(config->syscon, NEORV32_SYSINFO_CLK, &clk);
165 	if (err < 0) {
166 		LOG_ERR("failed to determine clock rate (err %d)", err);
167 		return -EIO;
168 	}
169 
170 	if (cfg->baudrate == 0) {
171 		LOG_ERR("invalid baud rate 0");
172 		return -EINVAL;
173 	}
174 
175 	/*
176 	 * Calculate clock prescaler and baud prescaler. Initial prscx = 0 is
177 	 * clock / 2.
178 	 */
179 	baudxx = clk / (2 * cfg->baudrate);
180 	while (baudxx >= baudxx_max) {
181 		if ((prscx == 2) || (prscx == 4)) {
182 			baudxx >>= 3;
183 		} else {
184 			baudxx >>= 1;
185 		}
186 
187 		prscx++;
188 	}
189 
190 	if (prscx > prscx_max) {
191 		LOG_ERR("unsupported baud rate %d", cfg->baudrate);
192 		return -ENOTSUP;
193 	}
194 
195 	key = k_spin_lock(&data->lock);
196 
197 	ctrl = neorv32_uart_read_ctrl(dev);
198 	ctrl |= NEORV32_UART_CTRL_EN;
199 
200 	if (hwfc_en) {
201 		ctrl |= NEORV32_UART_CTRL_HWFC_EN;
202 	} else {
203 		ctrl &= ~NEORV32_UART_CTRL_HWFC_EN;
204 	}
205 
206 	ctrl &= ~(NEORV32_UART_CTRL_BAUD | NEORV32_UART_CTRL_PRSC);
207 	ctrl |= FIELD_PREP(NEORV32_UART_CTRL_BAUD, baudxx - 1U) |
208 		FIELD_PREP(NEORV32_UART_CTRL_PRSC, prscx);
209 
210 	neorv32_uart_write_ctrl(dev, ctrl);
211 	data->uart_cfg = *cfg;
212 
213 	k_spin_unlock(&data->lock, key);
214 
215 	return 0;
216 }
217 
218 #ifdef CONFIG_UART_USE_RUNTIME_CONFIGURE
neorv32_uart_config_get(const struct device * dev,struct uart_config * cfg)219 static int neorv32_uart_config_get(const struct device *dev, struct uart_config *cfg)
220 {
221 	struct neorv32_uart_data *data = dev->data;
222 
223 	__ASSERT_NO_MSG(cfg != NULL);
224 
225 	*cfg = data->uart_cfg;
226 
227 	return 0;
228 }
229 #endif /* CONFIG_UART_USE_RUNTIME_CONFIGURE */
230 
231 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
neorv32_uart_fifo_fill(const struct device * dev,const uint8_t * tx_data,int size)232 static int neorv32_uart_fifo_fill(const struct device *dev, const uint8_t *tx_data, int size)
233 {
234 	int count = 0;
235 
236 	if (size <= 0) {
237 		return 0;
238 	}
239 
240 	__ASSERT_NO_MSG(tx_data != NULL);
241 
242 	while (count < size && (neorv32_uart_read_ctrl(dev) & NEORV32_UART_CTRL_TX_FULL) == 0U) {
243 		neorv32_uart_write_data(dev, tx_data[count++]);
244 	}
245 
246 	return count;
247 }
248 
neorv32_uart_fifo_read(const struct device * dev,uint8_t * rx_data,const int size)249 static int neorv32_uart_fifo_read(const struct device *dev, uint8_t *rx_data, const int size)
250 {
251 	int count = 0;
252 
253 	if (size <= 0) {
254 		return 0;
255 	}
256 
257 	__ASSERT_NO_MSG(rx_data != NULL);
258 
259 	while (count < size && (neorv32_uart_read_ctrl(dev) & NEORV32_UART_CTRL_RX_NEMPTY) != 0U) {
260 		rx_data[count++] = neorv32_uart_read_data(dev) & NEORV32_UART_DATA_RTX;
261 	}
262 
263 	return count;
264 }
265 
neorv32_uart_irq_tx_enable(const struct device * dev)266 static void neorv32_uart_irq_tx_enable(const struct device *dev)
267 {
268 	struct neorv32_uart_data *data = dev->data;
269 	k_spinlock_key_t key;
270 	uint32_t ctrl;
271 
272 	key = k_spin_lock(&data->lock);
273 
274 	ctrl = neorv32_uart_read_ctrl(dev);
275 	ctrl |= NEORV32_UART_CTRL_IRQ_TX_EMPTY;
276 	neorv32_uart_write_ctrl(dev, ctrl);
277 
278 	k_spin_unlock(&data->lock, key);
279 }
280 
neorv32_uart_irq_tx_disable(const struct device * dev)281 static void neorv32_uart_irq_tx_disable(const struct device *dev)
282 {
283 	struct neorv32_uart_data *data = dev->data;
284 	k_spinlock_key_t key;
285 	uint32_t ctrl;
286 
287 	key = k_spin_lock(&data->lock);
288 
289 	ctrl = neorv32_uart_read_ctrl(dev);
290 	ctrl &= ~NEORV32_UART_CTRL_IRQ_TX_EMPTY;
291 	neorv32_uart_write_ctrl(dev, ctrl);
292 
293 	k_spin_unlock(&data->lock, key);
294 }
295 
neorv32_uart_irq_tx_ready(const struct device * dev)296 static int neorv32_uart_irq_tx_ready(const struct device *dev)
297 {
298 	struct neorv32_uart_data *data = dev->data;
299 
300 	if ((data->last_ctrl & NEORV32_UART_CTRL_IRQ_TX_EMPTY) == 0U) {
301 		return 0;
302 	}
303 
304 	return (data->last_ctrl & NEORV32_UART_CTRL_TX_FULL) == 0U;
305 }
306 
neorv32_uart_irq_rx_enable(const struct device * dev)307 static void neorv32_uart_irq_rx_enable(const struct device *dev)
308 {
309 	struct neorv32_uart_data *data = dev->data;
310 	k_spinlock_key_t key;
311 	uint32_t ctrl;
312 
313 	key = k_spin_lock(&data->lock);
314 
315 	ctrl = neorv32_uart_read_ctrl(dev);
316 	ctrl |= NEORV32_UART_CTRL_IRQ_RX_NEMPTY;
317 	neorv32_uart_write_ctrl(dev, ctrl);
318 
319 	k_spin_unlock(&data->lock, key);
320 }
321 
neorv32_uart_irq_rx_disable(const struct device * dev)322 static void neorv32_uart_irq_rx_disable(const struct device *dev)
323 {
324 	struct neorv32_uart_data *data = dev->data;
325 	k_spinlock_key_t key;
326 	uint32_t ctrl;
327 
328 	key = k_spin_lock(&data->lock);
329 
330 	ctrl = neorv32_uart_read_ctrl(dev);
331 	ctrl &= ~NEORV32_UART_CTRL_IRQ_RX_NEMPTY;
332 	neorv32_uart_write_ctrl(dev, ctrl);
333 
334 	k_spin_unlock(&data->lock, key);
335 }
336 
neorv32_uart_irq_tx_complete(const struct device * dev)337 static int neorv32_uart_irq_tx_complete(const struct device *dev)
338 {
339 	struct neorv32_uart_data *data = dev->data;
340 
341 	return (data->last_ctrl & NEORV32_UART_CTRL_TX_BUSY) == 0U;
342 }
343 
neorv32_uart_irq_rx_ready(const struct device * dev)344 static int neorv32_uart_irq_rx_ready(const struct device *dev)
345 {
346 	struct neorv32_uart_data *data = dev->data;
347 
348 	if ((data->last_ctrl & NEORV32_UART_CTRL_IRQ_RX_NEMPTY) == 0U) {
349 		return 0;
350 	}
351 
352 	return (data->last_ctrl & NEORV32_UART_CTRL_RX_NEMPTY) != 0U;
353 }
354 
neorv32_uart_irq_is_pending(const struct device * dev)355 static int neorv32_uart_irq_is_pending(const struct device *dev)
356 {
357 	return (neorv32_uart_irq_tx_ready(dev) ||
358 		neorv32_uart_irq_rx_ready(dev));
359 }
360 
neorv32_uart_irq_update(const struct device * dev)361 static int neorv32_uart_irq_update(const struct device *dev)
362 {
363 	struct neorv32_uart_data *data = dev->data;
364 
365 	/* Cache the CTRL register for use in the following functions:
366 	 * - neorv32_uart_irq_tx_complete()
367 	 * - neorv32_uart_irq_tx_ready()
368 	 * - neorv32_uart_irq_rx_ready()
369 	 */
370 	data->last_ctrl = neorv32_uart_read_ctrl(dev);
371 
372 	return 1;
373 }
374 
neorv32_uart_irq_callback_set(const struct device * dev,uart_irq_callback_user_data_t cb,void * user_data)375 static void neorv32_uart_irq_callback_set(const struct device *dev,
376 					  uart_irq_callback_user_data_t cb, void *user_data)
377 {
378 	struct neorv32_uart_data *data = dev->data;
379 
380 	data->callback = cb;
381 	data->callback_data = user_data;
382 }
383 
neorv32_uart_isr(const struct device * dev)384 static void neorv32_uart_isr(const struct device *dev)
385 {
386 	struct neorv32_uart_data *data = dev->data;
387 	uart_irq_callback_user_data_t callback = data->callback;
388 
389 	if (callback) {
390 		callback(dev, data->callback_data);
391 	}
392 }
393 #endif /* CONFIG_UART_INTERRUPT_DRIVEN */
394 
neorv32_uart_init(const struct device * dev)395 static int neorv32_uart_init(const struct device *dev)
396 {
397 	const struct neorv32_uart_config *config = dev->config;
398 	struct neorv32_uart_data *data = dev->data;
399 	uint32_t features;
400 	int err;
401 
402 	if (!device_is_ready(config->syscon)) {
403 		LOG_ERR("syscon device not ready");
404 		return -EINVAL;
405 	}
406 
407 	err = syscon_read_reg(config->syscon, NEORV32_SYSINFO_SOC, &features);
408 	if (err < 0) {
409 		LOG_ERR("failed to determine implemented features (err %d)", err);
410 		return -EIO;
411 	}
412 
413 	if ((features & config->feature_mask) == 0) {
414 		LOG_ERR("neorv32 uart instance not supported");
415 		return -ENODEV;
416 	}
417 
418 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
419 	config->irq_config_func(dev);
420 #endif /* CONFIG_UART_INTERRUPT_DRIVEN */
421 
422 	return neorv32_uart_configure(dev, &data->uart_cfg);
423 }
424 
425 #ifdef CONFIG_PM_DEVICE
neorv32_uart_pm_action(const struct device * dev,enum pm_device_action action)426 static int neorv32_uart_pm_action(const struct device *dev,
427 				  enum pm_device_action action)
428 {
429 	struct neorv32_uart_data *data = dev->data;
430 	k_spinlock_key_t key;
431 	uint32_t ctrl;
432 
433 	key = k_spin_lock(&data->lock);
434 	ctrl = neorv32_uart_read_ctrl(dev);
435 
436 	switch (action) {
437 	case PM_DEVICE_ACTION_SUSPEND:
438 		ctrl &= ~(NEORV32_UART_CTRL_EN);
439 		break;
440 	case PM_DEVICE_ACTION_RESUME:
441 		ctrl |= NEORV32_UART_CTRL_EN;
442 		break;
443 	default:
444 		return -ENOTSUP;
445 	}
446 
447 	neorv32_uart_write_ctrl(dev, ctrl);
448 	k_spin_unlock(&data->lock, key);
449 
450 	return 0;
451 }
452 #endif /* CONFIG_PM_DEVICE */
453 
454 static DEVICE_API(uart, neorv32_uart_driver_api) = {
455 	.poll_in = neorv32_uart_poll_in,
456 	.poll_out = neorv32_uart_poll_out,
457 #ifdef CONFIG_UART_USE_RUNTIME_CONFIGURE
458 	.configure = neorv32_uart_configure,
459 	.config_get = neorv32_uart_config_get,
460 #endif /* CONFIG_UART_USE_RUNTIME_CONFIGURE */
461 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
462 	.fifo_fill = neorv32_uart_fifo_fill,
463 	.fifo_read = neorv32_uart_fifo_read,
464 	.irq_tx_enable = neorv32_uart_irq_tx_enable,
465 	.irq_tx_disable = neorv32_uart_irq_tx_disable,
466 	.irq_tx_ready = neorv32_uart_irq_tx_ready,
467 	.irq_rx_enable = neorv32_uart_irq_rx_enable,
468 	.irq_rx_disable = neorv32_uart_irq_rx_disable,
469 	.irq_tx_complete = neorv32_uart_irq_tx_complete,
470 	.irq_rx_ready = neorv32_uart_irq_rx_ready,
471 	.irq_is_pending = neorv32_uart_irq_is_pending,
472 	.irq_update = neorv32_uart_irq_update,
473 	.irq_callback_set = neorv32_uart_irq_callback_set,
474 #endif /* CONFIG_UART_INTERRUPT_DRIVEN */
475 };
476 
477 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
478 #define NEORV32_UART_CONFIG_FUNC(node_id, n)	\
479 	static void neorv32_uart_config_func_##n(const struct device *dev) \
480 	{								\
481 		IRQ_CONNECT(DT_IRQ_BY_NAME(node_id, tx, irq),		\
482 			    DT_IRQ_BY_NAME(node_id, tx, priority),	\
483 			    neorv32_uart_isr,				\
484 			    DEVICE_DT_GET(node_id), 0);			\
485 		irq_enable(DT_IRQ_BY_NAME(node_id, tx, irq));		\
486 									\
487 		IRQ_CONNECT(DT_IRQ_BY_NAME(node_id, rx, irq),		\
488 			    DT_IRQ_BY_NAME(node_id, rx, priority),	\
489 			    neorv32_uart_isr,				\
490 			    DEVICE_DT_GET(node_id), 0);			\
491 		irq_enable(DT_IRQ_BY_NAME(node_id, rx, irq));		\
492 	}
493 #define NEORV32_UART_CONFIG_INIT(node_id, n)				\
494 	.irq_config_func = neorv32_uart_config_func_##n,
495 #else
496 #define NEORV32_UART_CONFIG_FUNC(node_id, n)
497 #define NEORV32_UART_CONFIG_INIT(node_id, n)
498 #endif /* CONFIG_UART_INTERRUPT_DRIVEN */
499 
500 #define NEORV32_UART_INIT(node_id, n)					\
501 	NEORV32_UART_CONFIG_FUNC(node_id, n)				\
502 									\
503 	static struct neorv32_uart_data neorv32_uart_##n##_data = {	\
504 		.uart_cfg = {						\
505 			.baudrate = DT_PROP(node_id, current_speed),	\
506 			.parity = DT_ENUM_IDX(node_id, parity),		\
507 			.stop_bits = UART_CFG_STOP_BITS_1,		\
508 			.data_bits = UART_CFG_DATA_BITS_8,		\
509 			.flow_ctrl = DT_PROP(node_id, hw_flow_control) ? \
510 				UART_CFG_FLOW_CTRL_RTS_CTS :		\
511 				UART_CFG_FLOW_CTRL_NONE,		\
512 		},							\
513 	};								\
514 									\
515 	static const struct neorv32_uart_config neorv32_uart_##n##_config = { \
516 		.syscon = DEVICE_DT_GET(DT_PHANDLE(node_id, syscon)),	\
517 		.feature_mask = NEORV32_SYSINFO_SOC_IO_UART##n,	\
518 		.base = DT_REG_ADDR(node_id),				\
519 		NEORV32_UART_CONFIG_INIT(node_id, n)			\
520 	};								\
521 									\
522 	PM_DEVICE_DT_DEFINE(node_id, neorv32_uart_pm_action);		\
523 									\
524 	DEVICE_DT_DEFINE(node_id, &neorv32_uart_init,			\
525 			 PM_DEVICE_DT_GET(node_id),			\
526 			 &neorv32_uart_##n##_data,			\
527 			 &neorv32_uart_##n##_config,			\
528 			 PRE_KERNEL_1,					\
529 			 CONFIG_SERIAL_INIT_PRIORITY,			\
530 			 &neorv32_uart_driver_api)
531 
532 #if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(uart0), DT_DRV_COMPAT, okay)
533 NEORV32_UART_INIT(DT_NODELABEL(uart0), 0);
534 #endif
535 
536 #if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(uart1), DT_DRV_COMPAT, okay)
537 NEORV32_UART_INIT(DT_NODELABEL(uart1), 1);
538 #endif
539