Commit 0781fe8c695530efc048414c8774c0db92497f96

Authored by Frank Li
Committed by Ye Li
1 parent 4f943c429d
Exists in emb_lf_v2022.04

MLK-19181-2: i.MX850: SPL enable usb support

Enable DWC3 USB support at i.MX850D platform

Signed-off-by: Li Jun <jun.li@nxp.com>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
(cherry picked from commit 7c3d2a17bf85e97a486d01e231480baaa7e7a167)
(cherry picked from commit 1dd830df85ef684d8b6acd4655204ce7bd6be997)
(cherry picked from commit 830584d72ad856fa71e37bfc61f3f590fbaea7e2)
(cherry picked from commit 87775f78ddadfeb5208a4eb8982ef210bb56a059)
(cherry picked from commit a0571396a38b11a524e7165be9a7c4aa8f531a78)

Showing 1 changed file with 43 additions and 2 deletions Side-by-side Diff

arch/arm/mach-imx/imx8m/soc.c
... ... @@ -1299,17 +1299,58 @@
1299 1299 }
1300 1300 #endif
1301 1301  
1302   -int imx8m_usb_power(int usb_id, bool on)
  1302 +#ifdef CONFIG_SPL_BUILD
  1303 +static uint32_t gpc_pu_m_core_offset[11] = {
  1304 + 0xc00, 0xc40, 0xc80, 0xcc0,
  1305 + 0xdc0, 0xe00, 0xe40, 0xe80,
  1306 + 0xec0, 0xf00, 0xf40,
  1307 +};
  1308 +
  1309 +#define PGC_PCR 0
  1310 +
  1311 +void imx_gpc_set_m_core_pgc(unsigned int offset, bool pdn)
1303 1312 {
1304   - struct arm_smccc_res res;
  1313 + uint32_t val;
  1314 + uintptr_t reg = GPC_BASE_ADDR + offset;
1305 1315  
  1316 + val = readl(reg);
  1317 + val &= ~(0x1 << PGC_PCR);
  1318 +
  1319 + if(pdn)
  1320 + val |= 0x1 << PGC_PCR;
  1321 + writel(val, reg);
  1322 +}
  1323 +
  1324 +void imx8m_usb_power_domain(uint32_t domain_id, bool on)
  1325 +{
  1326 + uint32_t val;
  1327 + uintptr_t reg;
  1328 +
  1329 + imx_gpc_set_m_core_pgc(gpc_pu_m_core_offset[domain_id], true);
  1330 +
  1331 + reg = GPC_BASE_ADDR + (on ? 0xf8 : 0x104);
  1332 + val = 1 << (domain_id > 3 ? (domain_id + 3) : domain_id);
  1333 + writel(val, reg);
  1334 + while (readl(reg) & val)
  1335 + ;
  1336 + imx_gpc_set_m_core_pgc(gpc_pu_m_core_offset[domain_id], false);
  1337 +}
  1338 +#endif
  1339 +
  1340 +int imx8m_usb_power(int usb_id, bool on)
  1341 +{
1306 1342 if (usb_id > 1)
1307 1343 return -EINVAL;
1308 1344  
  1345 +#ifdef CONFIG_SPL_BUILD
  1346 + imx8m_usb_power_domain(2 + usb_id, on);
  1347 +#else
  1348 + struct arm_smccc_res res;
1309 1349 arm_smccc_smc(IMX_SIP_GPC, IMX_SIP_GPC_PM_DOMAIN,
1310 1350 2 + usb_id, on, 0, 0, 0, 0, &res);
1311 1351 if (res.a0)
1312 1352 return -EPERM;
  1353 +#endif
1313 1354  
1314 1355 return 0;
1315 1356 }