Skip to content

Commit 5a094fa

Browse files
author
Przemysław Bida
authored
Merge branch 'main' into mod_carrier
2 parents 28cc4fd + 7c7950a commit 5a094fa

File tree

13 files changed

+176
-79
lines changed

13 files changed

+176
-79
lines changed

drivers/usb/common/nrf_usbd_common/nrf_usbd_common.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -834,9 +834,10 @@ static void usbd_dmareq_process(void)
834834
{
835835
if ((m_ep_dma_waiting & m_ep_ready) &&
836836
(k_sem_take(&dma_available, K_NO_WAIT) == 0)) {
837+
const bool low_power = nrf_usbd_common_suspend_check();
837838
uint32_t req;
838839

839-
while (0 != (req = m_ep_dma_waiting & m_ep_ready)) {
840+
while (!low_power && 0 != (req = m_ep_dma_waiting & m_ep_ready)) {
840841
uint8_t pos;
841842

842843
if (NRFX_USBD_CONFIG_DMASCHEDULER_ISO_BOOST &&
@@ -1310,7 +1311,11 @@ bool nrf_usbd_common_is_started(void)
13101311
bool nrf_usbd_common_suspend(void)
13111312
{
13121313
bool suspended = false;
1313-
unsigned int irq_lock_key = irq_lock();
1314+
unsigned int irq_lock_key;
1315+
1316+
/* DMA doesn't work in Low Power mode, ensure there is no active DMA */
1317+
k_sem_take(&dma_available, K_FOREVER);
1318+
irq_lock_key = irq_lock();
13141319

13151320
if (m_bus_suspend) {
13161321
if (!(NRF_USBD->EVENTCAUSE & USBD_EVENTCAUSE_RESUME_Msk)) {
@@ -1327,6 +1332,7 @@ bool nrf_usbd_common_suspend(void)
13271332
}
13281333

13291334
irq_unlock(irq_lock_key);
1335+
k_sem_give(&dma_available);
13301336

13311337
return suspended;
13321338
}

drivers/usb/udc/udc_dwc2.c

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,11 +1387,12 @@ static void udc_dwc2_ep_disable(const struct device *dev,
13871387
uint8_t ep_idx = USB_EP_GET_IDX(cfg->addr);
13881388
mem_addr_t dxepctl_reg;
13891389
uint32_t dxepctl;
1390+
const bool is_iso = dwc2_ep_is_iso(cfg);
13901391

13911392
dxepctl_reg = dwc2_get_dxepctl_reg(dev, cfg->addr);
13921393
dxepctl = sys_read32(dxepctl_reg);
13931394

1394-
if (dxepctl & USB_DWC2_DEPCTL_NAKSTS) {
1395+
if (!is_iso && (dxepctl & USB_DWC2_DEPCTL_NAKSTS)) {
13951396
/* Endpoint already sends forced NAKs. STALL if necessary. */
13961397
if (stall) {
13971398
dxepctl |= USB_DWC2_DEPCTL_STALL;
@@ -1401,6 +1402,19 @@ static void udc_dwc2_ep_disable(const struct device *dev,
14011402
return;
14021403
}
14031404

1405+
/* FIXME: This function needs to be changed to not synchronously wait
1406+
* for the events to happen because the actions here are racing against
1407+
* the USB host packets. It is possible that the IN token or OUT DATA
1408+
* gets sent shortly before this function disables the endpoint. If this
1409+
* happens, the XferCompl would be set and driver will incorrectly think
1410+
* that either:
1411+
* * never queued transfer finished, OR
1412+
* * transfer queued in incompisoin handler finished (before it really
1413+
* does and then it'll "double"-finish when it actually finishes)
1414+
*
1415+
* For the time being XferCompl is cleared as a workaround.
1416+
*/
1417+
14041418
if (USB_EP_DIR_IS_OUT(cfg->addr)) {
14051419
mem_addr_t dctl_reg, gintsts_reg, doepint_reg;
14061420
uint32_t dctl;
@@ -1439,7 +1453,7 @@ static void udc_dwc2_ep_disable(const struct device *dev,
14391453
}
14401454

14411455
/* Clear Endpoint Disabled interrupt */
1442-
sys_write32(USB_DWC2_DIEPINT_EPDISBLD, doepint_reg);
1456+
sys_write32(USB_DWC2_DOEPINT_EPDISBLD | USB_DWC2_DOEPINT_XFERCOMPL, doepint_reg);
14431457

14441458
dctl |= USB_DWC2_DCTL_CGOUTNAK;
14451459
sys_write32(dctl, dctl_reg);
@@ -1463,7 +1477,7 @@ static void udc_dwc2_ep_disable(const struct device *dev,
14631477
dwc2_wait_for_bit(dev, diepint_reg, USB_DWC2_DIEPINT_EPDISBLD);
14641478

14651479
/* Clear Endpoint Disabled interrupt */
1466-
sys_write32(USB_DWC2_DIEPINT_EPDISBLD, diepint_reg);
1480+
sys_write32(USB_DWC2_DIEPINT_EPDISBLD | USB_DWC2_DIEPINT_XFERCOMPL, diepint_reg);
14671481

14681482
/* TODO: Read DIEPTSIZn here? Programming Guide suggest it to
14691483
* let application know how many bytes of interrupted transfer
@@ -2571,7 +2585,11 @@ static void dwc2_handle_incompisoin(const struct device *dev)
25712585

25722586
buf = udc_buf_get(dev, cfg->addr);
25732587
if (buf) {
2588+
/* Data is no longer relevant */
25742589
udc_submit_ep_event(dev, buf, 0);
2590+
2591+
/* Try to queue next packet before SOF */
2592+
dwc2_handle_xfer_next(dev, cfg);
25752593
}
25762594
}
25772595
}

drivers/usb/udc/udc_dwc2_vendor_quirks.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ static inline int usbhs_enable_core(const struct device *dev)
201201
wrapper->ENABLE = USBHS_ENABLE_PHY_Msk | USBHS_ENABLE_CORE_Msk;
202202
wrapper->TASKS_START = 1UL;
203203

204+
/* Wait for clock to start to avoid hang on too early register read */
205+
k_busy_wait(1);
206+
204207
/* Enable interrupts */
205208
wrapper->INTENSET = 1UL;
206209

drivers/usb/udc/udc_nrf.c

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,22 @@ static void udc_nrf_thread(void *p1, void *p2, void *p3)
443443
case UDC_NRF_EVT_HAL:
444444
ep = evt.hal_evt.data.eptransfer.ep;
445445
switch (evt.hal_evt.type) {
446+
case NRF_USBD_COMMON_EVT_SUSPEND:
447+
LOG_INF("SUSPEND state detected");
448+
nrf_usbd_common_suspend();
449+
udc_set_suspended(udc_nrf_dev, true);
450+
udc_submit_event(udc_nrf_dev, UDC_EVT_SUSPEND, 0);
451+
break;
452+
case NRF_USBD_COMMON_EVT_RESUME:
453+
LOG_INF("RESUMING from suspend");
454+
udc_set_suspended(udc_nrf_dev, false);
455+
udc_submit_event(udc_nrf_dev, UDC_EVT_RESUME, 0);
456+
break;
457+
case NRF_USBD_COMMON_EVT_WUREQ:
458+
LOG_INF("Remote wakeup initiated");
459+
udc_set_suspended(udc_nrf_dev, false);
460+
udc_submit_event(udc_nrf_dev, UDC_EVT_RESUME, 0);
461+
break;
446462
case NRF_USBD_COMMON_EVT_EPTRANSFER:
447463
start_xfer = true;
448464
if (USB_EP_DIR_IS_IN(ep)) {
@@ -499,22 +515,6 @@ static void udc_sof_check_iso_out(const struct device *dev)
499515
static void usbd_event_handler(nrf_usbd_common_evt_t const *const hal_evt)
500516
{
501517
switch (hal_evt->type) {
502-
case NRF_USBD_COMMON_EVT_SUSPEND:
503-
LOG_INF("SUSPEND state detected");
504-
nrf_usbd_common_suspend();
505-
udc_set_suspended(udc_nrf_dev, true);
506-
udc_submit_event(udc_nrf_dev, UDC_EVT_SUSPEND, 0);
507-
break;
508-
case NRF_USBD_COMMON_EVT_RESUME:
509-
LOG_INF("RESUMING from suspend");
510-
udc_set_suspended(udc_nrf_dev, false);
511-
udc_submit_event(udc_nrf_dev, UDC_EVT_RESUME, 0);
512-
break;
513-
case NRF_USBD_COMMON_EVT_WUREQ:
514-
LOG_INF("Remote wakeup initiated");
515-
udc_set_suspended(udc_nrf_dev, false);
516-
udc_submit_event(udc_nrf_dev, UDC_EVT_RESUME, 0);
517-
break;
518518
case NRF_USBD_COMMON_EVT_RESET:
519519
LOG_INF("Reset");
520520
udc_submit_event(udc_nrf_dev, UDC_EVT_RESET, 0);
@@ -523,6 +523,9 @@ static void usbd_event_handler(nrf_usbd_common_evt_t const *const hal_evt)
523523
udc_submit_event(udc_nrf_dev, UDC_EVT_SOF, 0);
524524
udc_sof_check_iso_out(udc_nrf_dev);
525525
break;
526+
case NRF_USBD_COMMON_EVT_SUSPEND:
527+
case NRF_USBD_COMMON_EVT_RESUME:
528+
case NRF_USBD_COMMON_EVT_WUREQ:
526529
case NRF_USBD_COMMON_EVT_EPTRANSFER:
527530
case NRF_USBD_COMMON_EVT_SETUP: {
528531
struct udc_nrf_evt evt = {

dts/common/nordic/nrf54l20.dtsi

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,84 @@
501501
status = "disabled";
502502
};
503503

504+
i2c23: i2c@ed000 {
505+
compatible = "nordic,nrf-twim";
506+
#address-cells = <1>;
507+
#size-cells = <0>;
508+
reg = <0xed000 0x1000>;
509+
interrupts = <237 NRF_DEFAULT_IRQ_PRIORITY>;
510+
easydma-maxcnt-bits = <16>;
511+
status = "disabled";
512+
zephyr,pm-device-runtime-auto;
513+
};
514+
515+
spi23: spi@ed000 {
516+
/*
517+
* This spi node can be either SPIM or SPIS,
518+
* for the user to pick:
519+
* compatible = "nordic,nrf-spim" or
520+
* "nordic,nrf-spis".
521+
*/
522+
compatible = "nordic,nrf-spim";
523+
#address-cells = <1>;
524+
#size-cells = <0>;
525+
reg = <0xed000 0x1000>;
526+
interrupts = <237 NRF_DEFAULT_IRQ_PRIORITY>;
527+
max-frequency = <DT_FREQ_M(8)>;
528+
easydma-maxcnt-bits = <16>;
529+
rx-delay-supported;
530+
rx-delay = <1>;
531+
status = "disabled";
532+
};
533+
534+
uart23: uart@ed000 {
535+
compatible = "nordic,nrf-uarte";
536+
reg = <0xed000 0x1000>;
537+
interrupts = <237 NRF_DEFAULT_IRQ_PRIORITY>;
538+
status = "disabled";
539+
endtx-stoptx-supported;
540+
frame-timeout-supported;
541+
};
542+
543+
i2c24: i2c@ee000 {
544+
compatible = "nordic,nrf-twim";
545+
#address-cells = <1>;
546+
#size-cells = <0>;
547+
reg = <0xee000 0x1000>;
548+
interrupts = <238 NRF_DEFAULT_IRQ_PRIORITY>;
549+
easydma-maxcnt-bits = <16>;
550+
status = "disabled";
551+
zephyr,pm-device-runtime-auto;
552+
};
553+
554+
spi24: spi@ee000 {
555+
/*
556+
* This spi node can be either SPIM or SPIS,
557+
* for the user to pick:
558+
* compatible = "nordic,nrf-spim" or
559+
* "nordic,nrf-spis".
560+
*/
561+
compatible = "nordic,nrf-spim";
562+
#address-cells = <1>;
563+
#size-cells = <0>;
564+
reg = <0xee000 0x1000>;
565+
interrupts = <238 NRF_DEFAULT_IRQ_PRIORITY>;
566+
max-frequency = <DT_FREQ_M(8)>;
567+
easydma-maxcnt-bits = <16>;
568+
rx-delay-supported;
569+
rx-delay = <1>;
570+
status = "disabled";
571+
};
572+
573+
uart24: uart@ee000 {
574+
compatible = "nordic,nrf-uarte";
575+
reg = <0xee000 0x1000>;
576+
interrupts = <238 NRF_DEFAULT_IRQ_PRIORITY>;
577+
status = "disabled";
578+
endtx-stoptx-supported;
579+
frame-timeout-supported;
580+
};
581+
504582
dppic30: dppic@102000 {
505583
compatible = "nordic,nrf-dppic";
506584
reg = <0x102000 0x808>;

modules/hal_nordic/nrfx/CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,12 @@ zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54H20_CPUPPR NRF54H20_XXAA
4444
NRF_PPR)
4545
zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54H20_CPUFLPR NRF54H20_XXAA
4646
NRF_FLPR)
47-
zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54L05 NRF54L05_XXAA)
47+
zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54L05 NRF54L05_XXAA
48+
DEVELOP_IN_NRF54L15)
4849
zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54L05_CPUAPP NRF_APPLICATION)
4950
zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54L05_CPUFLPR NRF_FLPR)
50-
zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54L10 NRF54L10_XXAA)
51+
zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54L10 NRF54L10_XXAA
52+
DEVELOP_IN_NRF54L15)
5153
zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54L10_CPUAPP NRF_APPLICATION)
5254
zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54L10_CPUFLPR NRF_FLPR)
5355
zephyr_compile_definitions_ifdef(CONFIG_SOC_NRF54L15 NRF54L15_XXAA)

soc/nordic/common/soc_lrcconf.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ void soc_lrcconf_poweron_request(sys_snode_t *node, nrf_lrcconf_power_domain_mas
2424
} else {
2525
return;
2626
}
27+
2728
K_SPINLOCK(&lock) {
2829
if (sys_slist_len(poweron_list) == 0) {
2930
nrf_lrcconf_poweron_force_set(NRF_LRCCONF010, domain, true);

soc/nordic/nrf54h/power.c

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@
1616
#include "soc.h"
1717
#include "pm_s2ram.h"
1818

19+
extern sys_snode_t soc_node;
20+
1921
static void common_suspend(void)
2022
{
21-
sys_snode_t *node;
22-
23-
node = soc_pd_sys_snode_get();
24-
2523
if (IS_ENABLED(CONFIG_DCACHE)) {
2624
/* Flush, disable and power down DCACHE */
2725
sys_cache_data_flush_all();
@@ -37,15 +35,11 @@ static void common_suspend(void)
3735
RAMBLOCK_CONTROL_BIT_ICACHE, false);
3836
}
3937

40-
soc_lrcconf_poweron_release(node, NRF_LRCCONF_POWER_DOMAIN_0);
38+
soc_lrcconf_poweron_release(&soc_node, NRF_LRCCONF_POWER_DOMAIN_0);
4139
}
4240

4341
static void common_resume(void)
4442
{
45-
sys_snode_t *node;
46-
47-
node = soc_pd_sys_snode_get();
48-
4943
if (IS_ENABLED(CONFIG_ICACHE)) {
5044
/* Power up and re-enable ICACHE */
5145
nrf_memconf_ramblock_control_enable_set(NRF_MEMCONF, RAMBLOCK_POWER_ID,
@@ -60,15 +54,15 @@ static void common_resume(void)
6054
sys_cache_data_enable();
6155
}
6256

63-
soc_lrcconf_poweron_request(node, NRF_LRCCONF_POWER_DOMAIN_0);
57+
soc_lrcconf_poweron_request(&soc_node, NRF_LRCCONF_POWER_DOMAIN_0);
6458
}
6559

6660
void nrf_poweroff(void)
6761
{
6862
nrf_resetinfo_resetreas_local_set(NRF_RESETINFO, 0);
6963
nrf_resetinfo_restore_valid_set(NRF_RESETINFO, false);
7064

71-
#if !defined(NRF_RADIOCORE)
65+
#if !defined(CONFIG_SOC_NRF54H20_CPURAD)
7266
/* Disable retention */
7367
nrf_lrcconf_retain_set(NRF_LRCCONF010, NRF_LRCCONF_POWER_MAIN, false);
7468
nrf_lrcconf_retain_set(NRF_LRCCONF010, NRF_LRCCONF_POWER_DOMAIN_0, false);
@@ -87,19 +81,15 @@ void nrf_poweroff(void)
8781

8882
static void s2idle_enter(uint8_t substate_id)
8983
{
90-
sys_snode_t *node;
91-
92-
node = soc_pd_sys_snode_get();
93-
9484
switch (substate_id) {
9585
case 0:
9686
/* Substate for idle with cache powered on - not implemented yet. */
9787
break;
9888
case 1: /* Substate for idle with cache retained - not implemented yet. */
9989
break;
10090
case 2: /* Substate for idle with cache disabled. */
101-
#if !defined(NRF_RADIOCORE)
102-
soc_lrcconf_poweron_request(node, NRF_LRCCONF_POWER_MAIN);
91+
#if !defined(CONFIG_SOC_NRF54H20_CPURAD)
92+
soc_lrcconf_poweron_request(&soc_node, NRF_LRCCONF_POWER_MAIN);
10393
#endif
10494
common_suspend();
10595
break;
@@ -115,10 +105,6 @@ static void s2idle_enter(uint8_t substate_id)
115105

116106
static void s2idle_exit(uint8_t substate_id)
117107
{
118-
sys_snode_t *node;
119-
120-
node = soc_pd_sys_snode_get();
121-
122108
switch (substate_id) {
123109
case 0:
124110
/* Substate for idle with cache powered on - not implemented yet. */
@@ -127,8 +113,8 @@ static void s2idle_exit(uint8_t substate_id)
127113
break;
128114
case 2: /* Substate for idle with cache disabled. */
129115
common_resume();
130-
#if !defined(NRF_RADIOCORE)
131-
soc_lrcconf_poweron_release(node, NRF_LRCCONF_POWER_MAIN);
116+
#if !defined(CONFIG_SOC_NRF54H20_CPURAD)
117+
soc_lrcconf_poweron_release(&soc_node, NRF_LRCCONF_POWER_MAIN);
132118
#endif
133119
default: /* Unknown substate. */
134120
return;
@@ -140,7 +126,7 @@ static void s2idle_exit(uint8_t substate_id)
140126
static void s2ram_exit(void)
141127
{
142128
common_resume();
143-
#if !defined(NRF_RADIOCORE)
129+
#if !defined(CONFIG_SOC_NRF54H20_CPURAD)
144130
/* Re-enable domain retention. */
145131
nrf_lrcconf_retain_set(NRF_LRCCONF010, NRF_LRCCONF_POWER_DOMAIN_0, true);
146132
#endif
@@ -156,7 +142,7 @@ static int sys_suspend_to_ram(void)
156142
NRF_RESETINFO_RESETREAS_LOCAL_UNRETAINED_MASK);
157143
nrf_resetinfo_restore_valid_set(NRF_RESETINFO, true);
158144

159-
#if !defined(NRF_RADIOCORE)
145+
#if !defined(CONFIG_SOC_NRF54H20_CPURAD)
160146
/* Disable retention */
161147
nrf_lrcconf_retain_set(NRF_LRCCONF010, NRF_LRCCONF_POWER_DOMAIN_0, false);
162148
#endif

0 commit comments

Comments
 (0)