Commit 0781fe8c695530efc048414c8774c0db92497f96
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 | } |