Skip to content

Commit 67cdccc

Browse files
jfischer-nofabiobaltieri
authored andcommitted
drivers: udc_dwc2: rework controller initialization
Move most of the controller initialization to a separate function called during udc_enable(). This allows us to add support for the platform where the device controller is only available when VBUS is present and the PHY is powered. Signed-off-by: Johann Fischer <[email protected]>
1 parent 5f1e1c7 commit 67cdccc

File tree

1 file changed

+49
-43
lines changed

1 file changed

+49
-43
lines changed

drivers/usb/udc/udc_dwc2.c

Lines changed: 49 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,30 +1324,6 @@ static enum udc_bus_speed udc_dwc2_device_speed(const struct device *dev)
13241324
}
13251325
}
13261326

1327-
static int udc_dwc2_enable(const struct device *dev)
1328-
{
1329-
struct usb_dwc2_reg *const base = dwc2_get_base(dev);
1330-
mem_addr_t dctl_reg = (mem_addr_t)&base->dctl;
1331-
1332-
/* Disable soft disconnect */
1333-
sys_clear_bits(dctl_reg, USB_DWC2_DCTL_SFTDISCON);
1334-
LOG_DBG("Enable device %p", base);
1335-
1336-
return 0;
1337-
}
1338-
1339-
static int udc_dwc2_disable(const struct device *dev)
1340-
{
1341-
struct usb_dwc2_reg *const base = dwc2_get_base(dev);
1342-
mem_addr_t dctl_reg = (mem_addr_t)&base->dctl;
1343-
1344-
/* Enable soft disconnect */
1345-
sys_set_bits(dctl_reg, USB_DWC2_DCTL_SFTDISCON);
1346-
LOG_DBG("Disable device %p", dev);
1347-
1348-
return 0;
1349-
}
1350-
13511327
static int dwc2_core_soft_reset(const struct device *dev)
13521328
{
13531329
struct usb_dwc2_reg *const base = dwc2_get_base(dev);
@@ -1386,7 +1362,7 @@ static int dwc2_core_soft_reset(const struct device *dev)
13861362
return 0;
13871363
}
13881364

1389-
static int udc_dwc2_init(const struct device *dev)
1365+
static int udc_dwc2_init_controller(const struct device *dev)
13901366
{
13911367
const struct udc_dwc2_config *const config = dev->config;
13921368
struct udc_dwc2_data *const priv = udc_get_private(dev);
@@ -1399,19 +1375,6 @@ static int udc_dwc2_init(const struct device *dev)
13991375
uint32_t ghwcfg4;
14001376
int ret;
14011377

1402-
if (config->quirks != NULL && config->quirks->clk_enable != NULL) {
1403-
LOG_DBG("Enable vendor clock");
1404-
ret = config->quirks->clk_enable(dev);
1405-
if (ret) {
1406-
return ret;
1407-
}
1408-
}
1409-
1410-
ret = dwc2_init_pinctrl(dev);
1411-
if (ret) {
1412-
return ret;
1413-
}
1414-
14151378
ret = dwc2_core_soft_reset(dev);
14161379
if (ret) {
14171380
return ret;
@@ -1551,27 +1514,49 @@ static int udc_dwc2_init(const struct device *dev)
15511514
USB_DWC2_GINTSTS_SOF,
15521515
(mem_addr_t)&base->gintmsk);
15531516

1517+
return 0;
1518+
}
1519+
1520+
static int udc_dwc2_enable(const struct device *dev)
1521+
{
1522+
const struct udc_dwc2_config *const config = dev->config;
1523+
struct usb_dwc2_reg *const base = dwc2_get_base(dev);
1524+
int err;
1525+
1526+
err = udc_dwc2_init_controller(dev);
1527+
if (err) {
1528+
return err;
1529+
}
15541530

15551531
/* Call vendor-specific function to enable peripheral */
15561532
if (config->quirks != NULL && config->quirks->pwr_on != NULL) {
15571533
LOG_DBG("Enable vendor power");
1558-
ret = config->quirks->pwr_on(dev);
1559-
if (ret) {
1560-
return ret;
1534+
err = config->quirks->pwr_on(dev);
1535+
if (err) {
1536+
return err;
15611537
}
15621538
}
15631539

15641540
/* Enable global interrupt */
15651541
sys_set_bits((mem_addr_t)&base->gahbcfg, USB_DWC2_GAHBCFG_GLBINTRMASK);
15661542
config->irq_enable_func(dev);
15671543

1544+
/* Disable soft disconnect */
1545+
sys_clear_bits((mem_addr_t)&base->dctl, USB_DWC2_DCTL_SFTDISCON);
1546+
LOG_DBG("Enable device %p", base);
1547+
15681548
return 0;
15691549
}
15701550

1571-
static int udc_dwc2_shutdown(const struct device *dev)
1551+
static int udc_dwc2_disable(const struct device *dev)
15721552
{
15731553
const struct udc_dwc2_config *const config = dev->config;
1574-
struct usb_dwc2_reg *const base = config->base;
1554+
struct usb_dwc2_reg *const base = dwc2_get_base(dev);
1555+
mem_addr_t dctl_reg = (mem_addr_t)&base->dctl;
1556+
1557+
/* Enable soft disconnect */
1558+
sys_set_bits(dctl_reg, USB_DWC2_DCTL_SFTDISCON);
1559+
LOG_DBG("Disable device %p", dev);
15751560

15761561
config->irq_disable_func(dev);
15771562
sys_clear_bits((mem_addr_t)&base->gahbcfg, USB_DWC2_GAHBCFG_GLBINTRMASK);
@@ -1589,6 +1574,27 @@ static int udc_dwc2_shutdown(const struct device *dev)
15891574
return 0;
15901575
}
15911576

1577+
static int udc_dwc2_init(const struct device *dev)
1578+
{
1579+
const struct udc_dwc2_config *const config = dev->config;
1580+
int ret;
1581+
1582+
if (config->quirks != NULL && config->quirks->clk_enable != NULL) {
1583+
LOG_DBG("Enable vendor clock");
1584+
ret = config->quirks->clk_enable(dev);
1585+
if (ret) {
1586+
return ret;
1587+
}
1588+
}
1589+
1590+
return dwc2_init_pinctrl(dev);
1591+
}
1592+
1593+
static int udc_dwc2_shutdown(const struct device *dev)
1594+
{
1595+
return 0;
1596+
}
1597+
15921598
static int dwc2_driver_preinit(const struct device *dev)
15931599
{
15941600
const struct udc_dwc2_config *config = dev->config;

0 commit comments

Comments
 (0)