1 /*
2  * Copyright (c) 2024-2025 Renesas Electronics Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include "udc_common.h"
8 
9 #include <soc.h>
10 #include <zephyr/drivers/pinctrl.h>
11 #include <zephyr/drivers/clock_control/renesas_ra_cgc.h>
12 #include <zephyr/drivers/usb/udc.h>
13 #include "r_usb_device.h"
14 
15 #include <zephyr/logging/log.h>
16 LOG_MODULE_REGISTER(udc_renesas_ra, CONFIG_UDC_DRIVER_LOG_LEVEL);
17 
18 struct udc_renesas_ra_config {
19 	const struct pinctrl_dev_config *pcfg;
20 	const struct device **clocks;
21 	size_t num_of_clocks;
22 	size_t num_of_eps;
23 	struct udc_ep_config *ep_cfg_in;
24 	struct udc_ep_config *ep_cfg_out;
25 	void (*make_thread)(const struct device *dev);
26 	int speed_idx;
27 };
28 
29 struct udc_renesas_ra_data {
30 	struct k_thread thread_data;
31 	struct st_usbd_instance_ctrl udc;
32 	struct st_usbd_cfg udc_cfg;
33 };
34 
35 enum udc_renesas_ra_event_type {
36 	/* An event generated by the HAL driver */
37 	UDC_RENESAS_RA_EVT_HAL,
38 	/* Shim driver event to trigger next transfer */
39 	UDC_RENESAS_RA_EVT_XFER,
40 	/* Let controller perform status stage */
41 	UDC_RENESAS_RA_EVT_STATUS,
42 };
43 
44 struct udc_renesas_ra_evt {
45 	enum udc_renesas_ra_event_type type;
46 	usbd_event_t hal_evt;
47 	uint8_t ep;
48 };
49 
50 K_MSGQ_DEFINE(drv_msgq, sizeof(struct udc_renesas_ra_evt), CONFIG_UDC_RENESAS_RA_MAX_QMESSAGES,
51 	      sizeof(uint32_t));
52 
53 extern void usb_device_isr(void);
54 
udc_renesas_ra_event_handler(usbd_callback_arg_t * p_args)55 static void udc_renesas_ra_event_handler(usbd_callback_arg_t *p_args)
56 {
57 	const struct device *dev = p_args->p_context;
58 	struct udc_renesas_ra_evt evt;
59 
60 	switch (p_args->event.event_id) {
61 	case USBD_EVENT_BUS_RESET:
62 		udc_submit_event(dev, UDC_EVT_RESET, 0);
63 		break;
64 
65 	case USBD_EVENT_VBUS_RDY:
66 		udc_submit_event(dev, UDC_EVT_VBUS_READY, 0);
67 		break;
68 
69 	case USBD_EVENT_VBUS_REMOVED:
70 		udc_submit_event(dev, UDC_EVT_VBUS_REMOVED, 0);
71 		break;
72 
73 	case USBD_EVENT_SUSPEND:
74 		udc_submit_event(dev, UDC_EVT_SUSPEND, 0);
75 		break;
76 
77 	case USBD_EVENT_RESUME:
78 		udc_submit_event(dev, UDC_EVT_RESUME, 0);
79 		break;
80 
81 	case USBD_EVENT_SOF:
82 		udc_submit_event(dev, UDC_EVT_SOF, 0);
83 		break;
84 
85 	default:
86 		evt.type = UDC_RENESAS_RA_EVT_HAL;
87 		evt.hal_evt = p_args->event;
88 		k_msgq_put(&drv_msgq, &evt, K_NO_WAIT);
89 		break;
90 	}
91 }
92 
udc_renesas_ra_interrupt_handler(void * arg)93 static void udc_renesas_ra_interrupt_handler(void *arg)
94 {
95 	ARG_UNUSED(arg);
96 	usb_device_isr();
97 }
98 
udc_event_xfer_next(const struct device * dev,const uint8_t ep)99 static void udc_event_xfer_next(const struct device *dev, const uint8_t ep)
100 {
101 	struct udc_renesas_ra_data *data = udc_get_private(dev);
102 	struct net_buf *buf;
103 
104 	if (udc_ep_is_busy(dev, ep)) {
105 		return;
106 	}
107 
108 	buf = udc_buf_peek(dev, ep);
109 	if (buf != NULL) {
110 		int err;
111 
112 		if (USB_EP_DIR_IS_IN(ep)) {
113 			err = R_USBD_XferStart(&data->udc, ep, buf->data, buf->len);
114 		} else {
115 			err = R_USBD_XferStart(&data->udc, ep, buf->data, buf->size);
116 		}
117 
118 		if (err != FSP_SUCCESS) {
119 			LOG_ERR("ep 0x%02x error", ep);
120 			udc_submit_ep_event(dev, buf, -ECONNREFUSED);
121 		} else {
122 			udc_ep_set_busy(dev, ep, true);
123 		}
124 	}
125 }
126 
usbd_ctrl_feed_dout(const struct device * dev,const size_t length)127 static int usbd_ctrl_feed_dout(const struct device *dev, const size_t length)
128 {
129 	struct udc_ep_config *cfg = udc_get_ep_cfg(dev, USB_CONTROL_EP_OUT);
130 	struct net_buf *buf;
131 	struct udc_renesas_ra_data *data = udc_get_private(dev);
132 
133 	buf = udc_ctrl_alloc(dev, USB_CONTROL_EP_OUT, length);
134 	if (buf == NULL) {
135 		return -ENOMEM;
136 	}
137 
138 	k_fifo_put(&cfg->fifo, buf);
139 
140 	if (FSP_SUCCESS != R_USBD_XferStart(&data->udc, cfg->addr, buf->data, buf->size)) {
141 		return -EIO;
142 	}
143 
144 	return 0;
145 }
146 
udc_event_xfer_setup(const struct device * dev,struct udc_renesas_ra_evt * evt)147 static int udc_event_xfer_setup(const struct device *dev, struct udc_renesas_ra_evt *evt)
148 {
149 	struct net_buf *buf;
150 	int err;
151 
152 	struct usb_setup_packet *setup_packet =
153 		(struct usb_setup_packet *)&evt->hal_evt.setup_received;
154 
155 	buf = udc_ctrl_alloc(dev, USB_CONTROL_EP_OUT, sizeof(struct usb_setup_packet));
156 	if (buf == NULL) {
157 		LOG_ERR("Failed to allocate for setup");
158 		return -ENOMEM;
159 	}
160 
161 	udc_ep_buf_set_setup(buf);
162 	net_buf_add_mem(buf, setup_packet, sizeof(struct usb_setup_packet));
163 
164 	/* Update to next stage of control transfer */
165 	udc_ctrl_update_stage(dev, buf);
166 
167 	if (udc_ctrl_stage_is_data_out(dev)) {
168 		/*  Allocate and feed buffer for data OUT stage */
169 		LOG_DBG("s:%p|feed for -out-", buf);
170 		err = usbd_ctrl_feed_dout(dev, udc_data_stage_length(buf));
171 		if (err == -ENOMEM) {
172 			err = udc_submit_ep_event(dev, buf, err);
173 		}
174 	} else if (udc_ctrl_stage_is_data_in(dev)) {
175 		err = udc_ctrl_submit_s_in_status(dev);
176 	} else {
177 		err = udc_ctrl_submit_s_status(dev);
178 	}
179 
180 	return err;
181 }
182 
udc_event_xfer_ctrl_in(const struct device * dev,struct net_buf * const buf)183 static void udc_event_xfer_ctrl_in(const struct device *dev, struct net_buf *const buf)
184 {
185 	if (udc_ctrl_stage_is_status_in(dev) || udc_ctrl_stage_is_no_data(dev)) {
186 		/* Status stage finished, notify upper layer */
187 		udc_ctrl_submit_status(dev, buf);
188 	}
189 
190 	/* Update to next stage of control transfer */
191 	udc_ctrl_update_stage(dev, buf);
192 
193 	if (udc_ctrl_stage_is_status_out(dev)) {
194 		/* IN transfer finished, perform status stage OUT and release buffer */
195 		usbd_ctrl_feed_dout(dev, 0);
196 		net_buf_unref(buf);
197 	}
198 }
199 
udc_event_status_in(const struct device * dev)200 static void udc_event_status_in(const struct device *dev)
201 {
202 	struct udc_renesas_ra_data *data = udc_get_private(dev);
203 	struct net_buf *buf;
204 
205 	buf = udc_buf_get(dev, USB_CONTROL_EP_IN);
206 	if (unlikely(buf == NULL)) {
207 		LOG_DBG("ep 0x%02x queue is empty", USB_CONTROL_EP_IN);
208 		return;
209 	}
210 
211 	/* Perform status stage IN */
212 	R_USBD_XferStart(&data->udc, USB_CONTROL_EP_IN, NULL, 0);
213 
214 	udc_event_xfer_ctrl_in(dev, buf);
215 }
216 
udc_event_xfer_ctrl_out(const struct device * dev,struct net_buf * const buf,uint32_t len)217 static void udc_event_xfer_ctrl_out(const struct device *dev, struct net_buf *const buf,
218 				    uint32_t len)
219 {
220 	net_buf_add(buf, len);
221 
222 	if (udc_ctrl_stage_is_status_out(dev)) {
223 		/* Status stage finished, notify upper layer */
224 		udc_ctrl_submit_status(dev, buf);
225 	}
226 
227 	/* Update to next stage of control transfer */
228 	udc_ctrl_update_stage(dev, buf);
229 
230 	if (udc_ctrl_stage_is_status_in(dev)) {
231 		udc_ctrl_submit_s_out_status(dev, buf);
232 	}
233 }
234 
udc_event_xfer_complete(const struct device * dev,struct udc_renesas_ra_evt * evt)235 static void udc_event_xfer_complete(const struct device *dev, struct udc_renesas_ra_evt *evt)
236 {
237 	struct net_buf *buf;
238 	struct udc_renesas_ra_data *data = udc_get_private(dev);
239 
240 	uint8_t ep = evt->hal_evt.xfer_complete.ep_addr;
241 	usbd_xfer_result_t result = evt->hal_evt.xfer_complete.result;
242 	uint32_t len = evt->hal_evt.xfer_complete.len;
243 
244 	udc_ep_set_busy(dev, ep, false);
245 
246 	buf = udc_buf_peek(dev, ep);
247 	if (buf == NULL) {
248 		return;
249 	}
250 
251 	if (result != USBD_XFER_RESULT_SUCCESS) {
252 		goto error;
253 	}
254 
255 	if (USB_EP_DIR_IS_IN(ep) && udc_ep_buf_has_zlp(buf)) {
256 		/* Send ZLP, notification about transfer complete should come again */
257 		udc_ep_buf_clear_zlp(buf);
258 		if (FSP_SUCCESS != R_USBD_XferStart(&data->udc, ep, NULL, 0)) {
259 			goto error;
260 		}
261 
262 		return;
263 	}
264 
265 	buf = udc_buf_get(dev, ep);
266 
267 	if (ep == USB_CONTROL_EP_IN) {
268 		udc_event_xfer_ctrl_in(dev, buf);
269 	} else if (ep == USB_CONTROL_EP_OUT) {
270 		udc_event_xfer_ctrl_out(dev, buf, len);
271 	} else {
272 		if (USB_EP_DIR_IS_OUT(ep)) {
273 			net_buf_add(buf, len);
274 		}
275 		udc_submit_ep_event(dev, buf, 0);
276 	}
277 
278 	return;
279 error:
280 	udc_submit_ep_event(dev, buf, -EIO);
281 }
282 
renesas_ra_thread_handler(void * const arg)283 static ALWAYS_INLINE void renesas_ra_thread_handler(void *const arg)
284 {
285 	const struct device *dev = (const struct device *)arg;
286 
287 	LOG_DBG("Driver %p thread started", dev);
288 	while (true) {
289 		struct udc_renesas_ra_evt evt;
290 
291 		k_msgq_get(&drv_msgq, &evt, K_FOREVER);
292 		switch (evt.type) {
293 		case UDC_RENESAS_RA_EVT_HAL: {
294 			switch (evt.hal_evt.event_id) {
295 			case USBD_EVENT_SETUP_RECEIVED:
296 				udc_event_xfer_setup(dev, &evt);
297 				break;
298 
299 			case USBD_EVENT_XFER_COMPLETE:
300 				udc_event_xfer_complete(dev, &evt);
301 				break;
302 
303 			default:
304 				break;
305 			}
306 			break;
307 		}
308 
309 		case UDC_RENESAS_RA_EVT_XFER:
310 			udc_event_xfer_next(dev, evt.ep);
311 			break;
312 
313 		case UDC_RENESAS_RA_EVT_STATUS:
314 			udc_event_status_in(dev);
315 			break;
316 
317 		default:
318 			break;
319 		}
320 	}
321 }
322 
udc_renesas_ra_ep_enqueue(const struct device * dev,struct udc_ep_config * const cfg,struct net_buf * buf)323 static int udc_renesas_ra_ep_enqueue(const struct device *dev, struct udc_ep_config *const cfg,
324 				     struct net_buf *buf)
325 {
326 	struct udc_renesas_ra_evt evt = {};
327 
328 	LOG_DBG("%p enqueue %p", dev, buf);
329 
330 	udc_buf_put(cfg, buf);
331 
332 	evt.ep = cfg->addr;
333 	if (cfg->addr == USB_CONTROL_EP_IN && buf->len == 0) {
334 		evt.type = UDC_RENESAS_RA_EVT_STATUS;
335 	} else {
336 		evt.type = UDC_RENESAS_RA_EVT_XFER;
337 	}
338 
339 	k_msgq_put(&drv_msgq, &evt, K_NO_WAIT);
340 
341 	if (cfg->stat.halted) {
342 		LOG_DBG("ep 0x%02x halted", cfg->addr);
343 	}
344 
345 	return 0;
346 }
347 
udc_renesas_ra_ep_dequeue(const struct device * dev,struct udc_ep_config * const cfg)348 static int udc_renesas_ra_ep_dequeue(const struct device *dev, struct udc_ep_config *const cfg)
349 {
350 	struct udc_renesas_ra_data *data = udc_get_private(dev);
351 	unsigned int lock_key;
352 	struct net_buf *buf;
353 
354 	lock_key = irq_lock();
355 
356 	buf = udc_buf_get_all(dev, cfg->addr);
357 	if (buf != NULL) {
358 		udc_submit_ep_event(dev, buf, -ECONNABORTED);
359 	}
360 
361 	if (FSP_SUCCESS != R_USBD_XferAbort(&data->udc, cfg->addr)) {
362 		return -EIO;
363 	}
364 
365 	udc_ep_set_busy(dev, cfg->addr, false);
366 
367 	irq_unlock(lock_key);
368 
369 	return 0;
370 }
371 
udc_renesas_ra_ep_enable(const struct device * dev,struct udc_ep_config * const cfg)372 static int udc_renesas_ra_ep_enable(const struct device *dev, struct udc_ep_config *const cfg)
373 {
374 	struct udc_renesas_ra_data *data = udc_get_private(dev);
375 	usbd_desc_endpoint_t ep_desc;
376 
377 	if (USB_EP_GET_IDX(cfg->addr) == 0) {
378 		return 0;
379 	}
380 
381 	ep_desc.bLength = sizeof(struct usb_ep_descriptor);
382 	ep_desc.bDescriptorType = USB_DESC_ENDPOINT;
383 	ep_desc.bEndpointAddress = cfg->addr;
384 	ep_desc.bmAttributes = cfg->attributes;
385 	ep_desc.wMaxPacketSize = cfg->mps;
386 	ep_desc.bInterval = cfg->interval;
387 
388 	if (FSP_SUCCESS != R_USBD_EdptOpen(&data->udc, &ep_desc)) {
389 		return -EIO;
390 	}
391 
392 	LOG_DBG("Enable ep 0x%02x", cfg->addr);
393 
394 	return 0;
395 }
396 
udc_renesas_ra_ep_disable(const struct device * dev,struct udc_ep_config * const cfg)397 static int udc_renesas_ra_ep_disable(const struct device *dev, struct udc_ep_config *const cfg)
398 {
399 	struct udc_renesas_ra_data *data = udc_get_private(dev);
400 
401 	if (USB_EP_GET_IDX(cfg->addr) == 0) {
402 		return 0;
403 	}
404 
405 	if (FSP_SUCCESS != R_USBD_EdptClose(&data->udc, cfg->addr)) {
406 		return -EIO;
407 	}
408 
409 	LOG_DBG("Disable ep 0x%02x", cfg->addr);
410 
411 	return 0;
412 }
413 
udc_renesas_ra_ep_set_halt(const struct device * dev,struct udc_ep_config * const cfg)414 static int udc_renesas_ra_ep_set_halt(const struct device *dev, struct udc_ep_config *const cfg)
415 {
416 	struct udc_renesas_ra_data *data = udc_get_private(dev);
417 
418 	LOG_DBG("Set halt ep 0x%02x", cfg->addr);
419 
420 	if (FSP_SUCCESS != R_USBD_EdptStall(&data->udc, cfg->addr)) {
421 		return -EIO;
422 	}
423 
424 	cfg->stat.halted = true;
425 
426 	return 0;
427 }
428 
udc_renesas_ra_ep_clear_halt(const struct device * dev,struct udc_ep_config * const cfg)429 static int udc_renesas_ra_ep_clear_halt(const struct device *dev, struct udc_ep_config *const cfg)
430 {
431 	struct udc_renesas_ra_data *data = udc_get_private(dev);
432 
433 	LOG_DBG("Clear halt ep 0x%02x", cfg->addr);
434 
435 	if (FSP_SUCCESS != R_USBD_EdptClearStall(&data->udc, cfg->addr)) {
436 		return -EIO;
437 	}
438 
439 	cfg->stat.halted = false;
440 
441 	return 0;
442 }
443 
udc_renesas_ra_set_address(const struct device * dev,const uint8_t addr)444 static int udc_renesas_ra_set_address(const struct device *dev, const uint8_t addr)
445 {
446 	/* The USB controller will automatically perform a response to the SET_ADRRESS request. */
447 	LOG_DBG("Set new address %u for %p", addr, dev);
448 
449 	return 0;
450 }
451 
udc_renesas_ra_host_wakeup(const struct device * dev)452 static int udc_renesas_ra_host_wakeup(const struct device *dev)
453 {
454 	struct udc_renesas_ra_data *data = udc_get_private(dev);
455 
456 	if (FSP_SUCCESS != R_USBD_RemoteWakeup(&data->udc)) {
457 		return -EIO;
458 	}
459 
460 	LOG_DBG("Remote wakeup from %p", dev);
461 
462 	return 0;
463 }
464 
udc_renesas_ra_device_speed(const struct device * dev)465 static enum udc_bus_speed udc_renesas_ra_device_speed(const struct device *dev)
466 {
467 	struct udc_data *data = dev->data;
468 
469 	return data->caps.hs ? UDC_BUS_SPEED_HS : UDC_BUS_SPEED_FS;
470 }
471 
udc_renesas_ra_enable(const struct device * dev)472 static int udc_renesas_ra_enable(const struct device *dev)
473 {
474 	struct udc_renesas_ra_data *data = udc_get_private(dev);
475 
476 	if (FSP_SUCCESS != R_USBD_Connect(&data->udc)) {
477 		return -EIO;
478 	}
479 
480 	LOG_DBG("Enable device %p", dev);
481 
482 	return 0;
483 }
484 
udc_renesas_ra_disable(const struct device * dev)485 static int udc_renesas_ra_disable(const struct device *dev)
486 {
487 	struct udc_renesas_ra_data *data = udc_get_private(dev);
488 
489 	if (FSP_SUCCESS != R_USBD_Disconnect(&data->udc)) {
490 		return -EIO;
491 	}
492 
493 	LOG_DBG("Disable device %p", dev);
494 
495 	return 0;
496 }
497 
udc_renesas_ra_init(const struct device * dev)498 static int udc_renesas_ra_init(const struct device *dev)
499 {
500 	struct udc_renesas_ra_data *data = udc_get_private(dev);
501 
502 	if (FSP_SUCCESS != R_USBD_Open(&data->udc, &data->udc_cfg)) {
503 		return -EIO;
504 	}
505 
506 	if (udc_ep_enable_internal(dev, USB_CONTROL_EP_OUT, USB_EP_TYPE_CONTROL, 64, 0)) {
507 		LOG_ERR("Failed to enable control endpoint");
508 		return -EIO;
509 	}
510 
511 	if (udc_ep_enable_internal(dev, USB_CONTROL_EP_IN, USB_EP_TYPE_CONTROL, 64, 0)) {
512 		LOG_ERR("Failed to enable control endpoint");
513 		return -EIO;
514 	}
515 
516 #if DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_usbhs)
517 	if (data->udc_cfg.hs_irq != (IRQn_Type)BSP_IRQ_DISABLED) {
518 		irq_enable(data->udc_cfg.hs_irq);
519 	}
520 #endif
521 
522 	if (data->udc_cfg.irq != (IRQn_Type)BSP_IRQ_DISABLED) {
523 		irq_enable(data->udc_cfg.irq);
524 	}
525 
526 	if (data->udc_cfg.irq_r != (IRQn_Type)BSP_IRQ_DISABLED) {
527 		irq_enable(data->udc_cfg.irq_r);
528 	}
529 
530 	return 0;
531 }
532 
udc_renesas_ra_shutdown(const struct device * dev)533 static int udc_renesas_ra_shutdown(const struct device *dev)
534 {
535 	struct udc_renesas_ra_data *data = udc_get_private(dev);
536 
537 	if (udc_ep_disable_internal(dev, USB_CONTROL_EP_OUT)) {
538 		LOG_ERR("Failed to disable control endpoint");
539 		return -EIO;
540 	}
541 
542 	if (udc_ep_disable_internal(dev, USB_CONTROL_EP_IN)) {
543 		LOG_ERR("Failed to disable control endpoint");
544 		return -EIO;
545 	}
546 
547 	if (FSP_SUCCESS != R_USBD_Close(&data->udc)) {
548 		return -EIO;
549 	}
550 
551 	return 0;
552 }
553 
udc_renesas_ra_clock_check(const struct device * dev)554 static int udc_renesas_ra_clock_check(const struct device *dev)
555 {
556 	const struct udc_renesas_ra_config *config = dev->config;
557 
558 #if USBHS_PHY_CLOCK_SOURCE_IS_XTAL
559 	if (config->speed_idx == UDC_BUS_SPEED_HS) {
560 		if (BSP_CFG_XTAL_HZ == 0) {
561 			LOG_ERR("XTAL clock should be provided");
562 			return -EINVAL;
563 		}
564 
565 		return 0;
566 	}
567 #endif
568 
569 	for (size_t i = 0; i < config->num_of_clocks; i++) {
570 		const struct device *clock_dev = *(config->clocks + i);
571 		const struct clock_control_ra_pclk_cfg *clock_cfg = clock_dev->config;
572 		uint32_t clk_src_rate;
573 		uint32_t clock_rate;
574 
575 		if (!device_is_ready(clock_dev)) {
576 			LOG_ERR("%s is not ready", clock_dev->name);
577 			return -ENODEV;
578 		}
579 
580 		clk_src_rate = R_BSP_SourceClockHzGet(clock_cfg->clk_src);
581 		clock_rate = clk_src_rate / clock_cfg->clk_div;
582 
583 		if (strcmp(clock_dev->name, "uclk") == 0 && clock_rate != MHZ(48)) {
584 			LOG_ERR("Setting for uclk should be 48Mhz");
585 			return -ENOTSUP;
586 		}
587 
588 #if DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_usbhs)
589 		if (strcmp(clock_dev->name, "u60clk") == 0 && clock_rate != MHZ(60)) {
590 			LOG_ERR("Setting for u60clk should be 60Mhz");
591 			return -ENOTSUP;
592 		}
593 #endif
594 	}
595 
596 	return 0;
597 }
598 
udc_renesas_ra_driver_preinit(const struct device * dev)599 static int udc_renesas_ra_driver_preinit(const struct device *dev)
600 {
601 	const struct udc_renesas_ra_config *config = dev->config;
602 	struct udc_renesas_ra_data *priv = udc_get_private(dev);
603 	struct udc_data *data = dev->data;
604 	uint16_t mps = 1023;
605 	int err;
606 
607 #if !USBHS_PHY_CLOCK_SOURCE_IS_XTAL
608 	if (priv->udc_cfg.usb_speed == USBD_SPEED_HS) {
609 		LOG_ERR("High-speed operation is not supported in case PHY clock source is not "
610 			"XTAL");
611 		return -ENOTSUP;
612 	}
613 #endif
614 
615 	if (config->speed_idx == UDC_BUS_SPEED_HS) {
616 		if (!(priv->udc_cfg.usb_speed == USBD_SPEED_HS ||
617 		      priv->udc_cfg.usb_speed == USBD_SPEED_FS)) {
618 			LOG_ERR("USBHS module only support high-speed and full-speed device");
619 			return -ENOTSUP;
620 		}
621 	} else {
622 		/* config->speed_idx == UDC_BUS_SPEED_FS */
623 		if (priv->udc_cfg.usb_speed != USBD_SPEED_FS) {
624 			LOG_ERR("USBFS module only support full-speed device");
625 			return -ENOTSUP;
626 		}
627 	}
628 
629 	err = udc_renesas_ra_clock_check(dev);
630 	if (err < 0) {
631 		return err;
632 	}
633 
634 	err = pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT);
635 	if (err < 0) {
636 		return err;
637 	}
638 
639 	k_mutex_init(&data->mutex);
640 
641 	data->caps.rwup = true;
642 	data->caps.mps0 = UDC_MPS0_64;
643 	if (priv->udc_cfg.usb_speed == USBD_SPEED_HS) {
644 		data->caps.hs = true;
645 		mps = 1024;
646 	}
647 
648 	for (int i = 0; i < config->num_of_eps; i++) {
649 		config->ep_cfg_out[i].caps.out = 1;
650 		if (i == 0) {
651 			config->ep_cfg_out[i].caps.control = 1;
652 			config->ep_cfg_out[i].caps.mps = 64;
653 		} else {
654 			config->ep_cfg_out[i].caps.bulk = 1;
655 			config->ep_cfg_out[i].caps.interrupt = 1;
656 			config->ep_cfg_out[i].caps.iso = 1;
657 			config->ep_cfg_out[i].caps.mps = mps;
658 		}
659 
660 		config->ep_cfg_out[i].addr = USB_EP_DIR_OUT | i;
661 		err = udc_register_ep(dev, &config->ep_cfg_out[i]);
662 		if (err != 0) {
663 			LOG_ERR("Failed to register endpoint");
664 			return err;
665 		}
666 	}
667 
668 	for (int i = 0; i < config->num_of_eps; i++) {
669 		config->ep_cfg_in[i].caps.in = 1;
670 		if (i == 0) {
671 			config->ep_cfg_in[i].caps.control = 1;
672 			config->ep_cfg_in[i].caps.mps = 64;
673 		} else {
674 			config->ep_cfg_in[i].caps.bulk = 1;
675 			config->ep_cfg_in[i].caps.interrupt = 1;
676 			config->ep_cfg_in[i].caps.iso = 1;
677 			config->ep_cfg_in[i].caps.mps = mps;
678 		}
679 
680 		config->ep_cfg_in[i].addr = USB_EP_DIR_IN | i;
681 		err = udc_register_ep(dev, &config->ep_cfg_in[i]);
682 		if (err != 0) {
683 			LOG_ERR("Failed to register endpoint");
684 			return err;
685 		}
686 	}
687 
688 #if DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_usbhs)
689 	if (priv->udc_cfg.hs_irq != (IRQn_Type)BSP_IRQ_DISABLED) {
690 		R_ICU->IELSR[priv->udc_cfg.hs_irq] = BSP_PRV_IELS_ENUM(EVENT_USBHS_USB_INT_RESUME);
691 	}
692 #endif
693 
694 	if (priv->udc_cfg.irq != (IRQn_Type)BSP_IRQ_DISABLED) {
695 		R_ICU->IELSR[priv->udc_cfg.irq] = BSP_PRV_IELS_ENUM(EVENT_USBFS_INT);
696 	}
697 
698 	if (priv->udc_cfg.irq_r != (IRQn_Type)BSP_IRQ_DISABLED) {
699 		R_ICU->IELSR[priv->udc_cfg.irq_r] = BSP_PRV_IELS_ENUM(EVENT_USBFS_RESUME);
700 	}
701 
702 	config->make_thread(dev);
703 	LOG_INF("Device %p (max. speed %d)", dev, priv->udc_cfg.usb_speed);
704 
705 	return 0;
706 }
707 
udc_renesas_ra_lock(const struct device * dev)708 static void udc_renesas_ra_lock(const struct device *dev)
709 {
710 	udc_lock_internal(dev, K_FOREVER);
711 }
712 
udc_renesas_ra_unlock(const struct device * dev)713 static void udc_renesas_ra_unlock(const struct device *dev)
714 {
715 	udc_unlock_internal(dev);
716 }
717 
718 static const struct udc_api udc_renesas_ra_api = {
719 	.lock = udc_renesas_ra_lock,
720 	.unlock = udc_renesas_ra_unlock,
721 	.device_speed = udc_renesas_ra_device_speed,
722 	.init = udc_renesas_ra_init,
723 	.enable = udc_renesas_ra_enable,
724 	.disable = udc_renesas_ra_disable,
725 	.shutdown = udc_renesas_ra_shutdown,
726 	.set_address = udc_renesas_ra_set_address,
727 	.host_wakeup = udc_renesas_ra_host_wakeup,
728 	.ep_enable = udc_renesas_ra_ep_enable,
729 	.ep_disable = udc_renesas_ra_ep_disable,
730 	.ep_set_halt = udc_renesas_ra_ep_set_halt,
731 	.ep_clear_halt = udc_renesas_ra_ep_clear_halt,
732 	.ep_enqueue = udc_renesas_ra_ep_enqueue,
733 	.ep_dequeue = udc_renesas_ra_ep_dequeue,
734 };
735 
736 #define DT_DRV_COMPAT renesas_ra_udc
737 
738 #define USB_RENESAS_RA_MODULE_NUMBER(id) (DT_REG_ADDR(id) == R_USB_FS0_BASE ? 0 : 1)
739 
740 #define USB_RENESAS_RA_IRQ_GET(id, name, cell)                                                     \
741 	COND_CODE_1(DT_IRQ_HAS_NAME(id, name), (DT_IRQ_BY_NAME(id, name, cell)),                   \
742 		    ((IRQn_Type) BSP_IRQ_DISABLED))
743 
744 #define USB_RENESAS_RA_MAX_SPEED_IDX(id)                                                           \
745 	(DT_NODE_HAS_COMPAT(id, renesas_ra_usbhs) ? UDC_BUS_SPEED_HS : UDC_BUS_SPEED_FS)
746 
747 #define USB_RENESAS_RA_SPEED_IDX(id)                                                               \
748 	(DT_NODE_HAS_COMPAT(id, renesas_ra_usbhs)                                                  \
749 		 ? DT_ENUM_IDX_OR(id, maximum_speed, UDC_BUS_SPEED_HS)                             \
750 		 : DT_ENUM_IDX_OR(id, maximum_speed, UDC_BUS_SPEED_FS))
751 
752 #define USB_RENESAS_RA_IRQ_CONNECT(idx, n)                                                         \
753 	IRQ_CONNECT(DT_IRQ_BY_IDX(DT_INST_PARENT(n), idx, irq),                                    \
754 		    DT_IRQ_BY_IDX(DT_INST_PARENT(n), idx, priority),                               \
755 		    udc_renesas_ra_interrupt_handler, DEVICE_DT_INST_GET(n), 0)
756 
757 #define USB_RENESAS_RA_CLOCKS_GET(idx, id)                                                         \
758 	DEVICE_DT_GET_OR_NULL(DT_PHANDLE_BY_IDX(id, phys_clock, idx))
759 
760 #define UDC_RENESAS_RA_DEVICE_DEFINE(n)                                                            \
761 	PINCTRL_DT_DEFINE(DT_INST_PARENT(n));                                                      \
762 	K_THREAD_STACK_DEFINE(udc_renesas_ra_stack_##n, CONFIG_UDC_RENESAS_RA_STACK_SIZE);         \
763                                                                                                    \
764 	static const struct device *udc_renesas_ra_clock_dev_##n[] = {                             \
765 		LISTIFY(DT_PROP_LEN_OR(DT_INST_PARENT(n), phys_clock, 0),                          \
766 			USB_RENESAS_RA_CLOCKS_GET, (,), DT_INST_PARENT(n))                         \
767 	};                                                                                         \
768                                                                                                    \
769 	static void udc_renesas_ra_thread_##n(void *dev, void *arg1, void *arg2)                   \
770 	{                                                                                          \
771 		renesas_ra_thread_handler(dev);                                                    \
772 	}                                                                                          \
773                                                                                                    \
774 	static void udc_renesas_ra_make_thread_##n(const struct device *dev)                       \
775 	{                                                                                          \
776 		struct udc_renesas_ra_data *priv = udc_get_private(dev);                           \
777                                                                                                    \
778 		k_thread_create(&priv->thread_data, udc_renesas_ra_stack_##n,                      \
779 				K_THREAD_STACK_SIZEOF(udc_renesas_ra_stack_##n),                   \
780 				udc_renesas_ra_thread_##n, (void *)dev, NULL, NULL,                \
781 				K_PRIO_COOP(CONFIG_UDC_RENESAS_RA_THREAD_PRIORITY), K_ESSENTIAL,   \
782 				K_NO_WAIT);                                                        \
783 		k_thread_name_set(&priv->thread_data, dev->name);                                  \
784 	}                                                                                          \
785                                                                                                    \
786 	static struct udc_ep_config ep_cfg_in##n[DT_PROP(DT_INST_PARENT(n), num_bidir_endpoints)]; \
787 	static struct udc_ep_config                                                                \
788 		ep_cfg_out##n[DT_PROP(DT_INST_PARENT(n), num_bidir_endpoints)];                    \
789                                                                                                    \
790 	static const struct udc_renesas_ra_config udc_renesas_ra_config_##n = {                    \
791 		.pcfg = PINCTRL_DT_DEV_CONFIG_GET(DT_INST_PARENT(n)),                              \
792 		.clocks = udc_renesas_ra_clock_dev_##n,                                            \
793 		.num_of_clocks = DT_PROP_LEN_OR(DT_INST_PARENT(n), phys_clock, 0),                 \
794 		.num_of_eps = DT_PROP(DT_INST_PARENT(n), num_bidir_endpoints),                     \
795 		.ep_cfg_in = ep_cfg_in##n,                                                         \
796 		.ep_cfg_out = ep_cfg_out##n,                                                       \
797 		.make_thread = udc_renesas_ra_make_thread_##n,                                     \
798 		.speed_idx = USB_RENESAS_RA_MAX_SPEED_IDX(DT_INST_PARENT(n)),                      \
799 	};                                                                                         \
800                                                                                                    \
801 	static struct udc_renesas_ra_data udc_priv_##n = {                                         \
802 		.udc_cfg = {                                                                       \
803 			.module_number = USB_RENESAS_RA_MODULE_NUMBER(DT_INST_PARENT(n)),          \
804 			.usb_speed = USB_RENESAS_RA_SPEED_IDX(DT_INST_PARENT(n)),                  \
805 			.irq = USB_RENESAS_RA_IRQ_GET(DT_INST_PARENT(n), usbfs_i, irq),            \
806 			.irq_r = USB_RENESAS_RA_IRQ_GET(DT_INST_PARENT(n), usbfs_r, irq),          \
807 			.hs_irq = USB_RENESAS_RA_IRQ_GET(DT_INST_PARENT(n), usbhs_ir, irq),        \
808 			.ipl = USB_RENESAS_RA_IRQ_GET(DT_INST_PARENT(n), usbfs_i, priority),       \
809 			.ipl_r = USB_RENESAS_RA_IRQ_GET(DT_INST_PARENT(n), usbfs_r, priority),     \
810 			.hsipl = USB_RENESAS_RA_IRQ_GET(DT_INST_PARENT(n), usbhs_ir, priority),    \
811 			.p_context = DEVICE_DT_INST_GET(n),                                        \
812 			.p_callback = udc_renesas_ra_event_handler,                                \
813 		},                                                                                 \
814 	};                                                                                         \
815                                                                                                    \
816 	static struct udc_data udc_data_##n = {                                                    \
817 		.mutex = Z_MUTEX_INITIALIZER(udc_data_##n.mutex),                                  \
818 		.priv = &udc_priv_##n,                                                             \
819 	};                                                                                         \
820                                                                                                    \
821 	int udc_renesas_ra_driver_preinit##n(const struct device *dev)                             \
822 	{                                                                                          \
823 		LISTIFY(DT_NUM_IRQS(DT_INST_PARENT(n)), USB_RENESAS_RA_IRQ_CONNECT, (;), n);       \
824 		return udc_renesas_ra_driver_preinit(dev);                                         \
825 	}                                                                                          \
826                                                                                                    \
827 	DEVICE_DT_INST_DEFINE(n, udc_renesas_ra_driver_preinit##n, NULL, &udc_data_##n,            \
828 			      &udc_renesas_ra_config_##n, POST_KERNEL,                             \
829 			      CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &udc_renesas_ra_api);
830 
831 DT_INST_FOREACH_STATUS_OKAY(UDC_RENESAS_RA_DEVICE_DEFINE)
832