Skip to content

Commit 68801c6

Browse files
committed
[nrf fromlist] drivers: udc_dwc2: Set bit 17 if needed on Hibernation Exit
Programming Guide states that bit 17 on PCGCCTL writes should be set if the controller was enumerated for High Speed operation. Add the missing bit set to adhere to the Programming Guide. Upstream PR #: 85039 Signed-off-by: Tomasz Moń <[email protected]>
1 parent a2eaddb commit 68801c6

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

drivers/usb/common/usb_dwc2_hw.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,33 @@ USB_DWC2_SET_FIELD_DEFINE(doeptsizn_xfersize, DOEPTSIZN_XFERSIZE)
997997

998998
/* Power and Clock Gating Control Register */
999999
#define USB_DWC2_PCGCCTL 0x0E00UL
1000+
#define USB_DWC2_PCGCCTL_IF_DEV_MODE_POS 31UL
1001+
#define USB_DWC2_PCGCCTL_IF_DEV_MODE BIT(USB_DWC2_PCGCCTL_IF_DEV_MODE_POS)
1002+
#define USB_DWC2_PCGCCTL_P2HD_PRT_SPD_POS 29UL
1003+
#define USB_DWC2_PCGCCTL_P2HD_PRT_SPD_MASK (0x3UL << USB_DWC2_PCGCCTL_P2HD_PRT_SPD_POS)
1004+
#define USB_DWC2_PCGCCTL_P2HD_PRT_SPD_LS 2
1005+
#define USB_DWC2_PCGCCTL_P2HD_PRT_SPD_FS 1
1006+
#define USB_DWC2_PCGCCTL_P2HD_PRT_SPD_HS 0
1007+
#define USB_DWC2_PCGCCTL_P2HD_DEV_ENUM_SPD_POS 27UL
1008+
#define USB_DWC2_PCGCCTL_P2HD_DEV_ENUM_SPD_MASK (0x3UL << USB_DWC2_PCGCCTL_P2HD_DEV_ENUM_SPD_POS)
1009+
#define USB_DWC2_PCGCCTL_P2HD_DEV_ENUM_SPD_FS48 3
1010+
#define USB_DWC2_PCGCCTL_P2HD_DEV_ENUM_SPD_LS 2
1011+
#define USB_DWC2_PCGCCTL_P2HD_DEV_ENUM_SPD_FS 1
1012+
#define USB_DWC2_PCGCCTL_P2HD_DEV_ENUM_SPD_HS 0
1013+
#define USB_DWC2_PCGCCTL_MAC_DEV_ADDR_POS 20UL
1014+
#define USB_DWC2_PCGCCTL_MAC_DEV_ADDR_MASK (0x7FUL << USB_DWC2_PCGCCTL_MAC_DEV_ADDR_POS)
1015+
#define USB_DWC2_PCGCCTL_MAX_TERMSELECT_POS 19UL
1016+
#define USB_DWC2_PCGCCTL_MAX_TERMSELECT BIT(USB_DWC2_PCGCCTL_MAX_TERMSELECT_POS)
1017+
#define USB_DWC2_PCGCCTL_MAC_XCVRSELECT_POS 17UL
1018+
#define USB_DWC2_PCGCCTL_MAC_XCVRSELECT_MASK (0x3UL << USB_DWC2_PCGCCTL_MAC_XCVRSELECT_POS)
1019+
#define USB_DWC2_PCGCCTL_MAC_XCVRSELECT_LFS 3
1020+
#define USB_DWC2_PCGCCTL_MAC_XCVRSELECT_LS 2
1021+
#define USB_DWC2_PCGCCTL_MAC_XCVRSELECT_FS 1
1022+
#define USB_DWC2_PCGCCTL_MAC_XCVRSELECT_HS 0
1023+
#define USB_DWC2_PCGCCTL_SH2PL_PRT_CTL0_POS 16UL
1024+
#define USB_DWC2_PCGCCTL_SH2PL_PRT_CTL0 BIT(USB_DWC2_PCGCCTL_SH2PL_PRT_CTL0_POS)
1025+
#define USB_DWC2_PCGCCTL_PRT_CLK_SEL_POS 14UL
1026+
#define USB_DWC2_PCGCCTL_PRT_CLK_SEL_MASK (0x3UL << USB_DWC2_PCGCCTL_PRT_CLK_SEL_POS)
10001027
#define USB_DWC2_PCGCCTL_RESTOREVALUE_POS 14UL
10011028
#define USB_DWC2_PCGCCTL_RESTOREVALUE_MASK (0x3FFFFUL << USB_DWC2_PCGCCTL_RESTOREVALUE_POS)
10021029
#define USB_DWC2_PCGCCTL_ESSREGRESTORED_POS 13UL
@@ -1016,6 +1043,11 @@ USB_DWC2_SET_FIELD_DEFINE(doeptsizn_xfersize, DOEPTSIZN_XFERSIZE)
10161043
#define USB_DWC2_PCGCCTL_STOPPCLK_POS 0UL
10171044
#define USB_DWC2_PCGCCTL_STOPPCLK BIT(USB_DWC2_PCGCCTL_STOPPCLK_POS)
10181045

1046+
USB_DWC2_GET_FIELD_DEFINE(pcgcctl_p2hd_prt_spd, PCGCCTL_P2HD_PRT_SPD)
1047+
USB_DWC2_GET_FIELD_DEFINE(pcgcctl_p2hd_dev_enum_spd, PCGCCTL_P2HD_DEV_ENUM_SPD)
1048+
USB_DWC2_GET_FIELD_DEFINE(pcgcctl_mac_dev_addr, PCGCCTL_MAC_DEV_ADDR)
1049+
USB_DWC2_GET_FIELD_DEFINE(pcgcctl_mac_xcvrselect, PCGCCTL_MAC_XCVRSELECT)
1050+
USB_DWC2_GET_FIELD_DEFINE(pcgcctl_prt_clk_sel, PCGCCTL_PRT_CLK_SEL)
10191051
USB_DWC2_GET_FIELD_DEFINE(pcgcctl_restorevalue, PCGCCTL_RESTOREVALUE)
10201052
USB_DWC2_SET_FIELD_DEFINE(pcgcctl_restorevalue, PCGCCTL_RESTOREVALUE)
10211053

drivers/usb/udc/udc_dwc2.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,11 @@ static void dwc2_restore_essential_registers(const struct device *dev,
915915
struct dwc2_reg_backup *backup = &priv->backup;
916916
uint32_t pcgcctl = backup->pcgcctl & USB_DWC2_PCGCCTL_RESTOREVALUE_MASK;
917917

918+
if (usb_dwc2_get_pcgcctl_p2hd_dev_enum_spd(pcgcctl) ==
919+
USB_DWC2_PCGCCTL_P2HD_DEV_ENUM_SPD_HS) {
920+
pcgcctl |= BIT(17);
921+
}
922+
918923
sys_write32(backup->glpmcfg, (mem_addr_t)&base->glpmcfg);
919924
sys_write32(backup->gi2cctl, (mem_addr_t)&base->gi2cctl);
920925
sys_write32(pcgcctl, (mem_addr_t)&base->pcgcctl);

0 commit comments

Comments
 (0)