void spl_board_init(void) { int ret; struct rk3399_cru *cru = rockchip_get_cru(); /* * The RK3399 resets only 'almost all logic' (see also in the TRM * "3.9.4 Global software reset"), when issuing a software reset. * This may cause issues during boot-up for some configurations of * the application software stack. * * To work around this, we test whether the last reset reason was * a power-on reset and (if not) issue an overtemp-reset to reset * the entire module. * * While this was previously fixed by modifying the various places * that could generate a software reset (e.g. U-Boot's sysreset * driver, the ATF or Linux), we now have it here to ensure that * we no longer have to track this through the various components. */ if (cru->glb_rst_st != 0) rk3399_force_power_on_reset(); /* * Turning the eMMC and SPI back on (if disabled via the Qseven * BIOS_ENABLE) signal is done through a always-on regulator). */ ret = regulators_enable_boot_on(false); if (ret) debug("%s: Cannot enable boot on regulator\n", __func__); preloader_console_init(); }
int board_init(void) { struct udevice *pinctrl, *regulator; int ret; /* * The PWM do not have decicated interrupt number in dts and can * not get periph_id by pinctrl framework, so let's init them here. * The PWM2 and PWM3 are for pwm regulater. */ ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl); if (ret) { debug("%s: Cannot find pinctrl device\n", __func__); goto out; } /* Enable pwm0 for panel backlight */ ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_PWM0); if (ret) { debug("%s PWM0 pinctrl init fail! (ret=%d)\n", __func__, ret); goto out; } ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_PWM2); if (ret) { debug("%s PWM2 pinctrl init fail!\n", __func__); goto out; } ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_PWM3); if (ret) { debug("%s PWM3 pinctrl init fail!\n", __func__); goto out; } ret = regulators_enable_boot_on(false); if (ret) debug("%s: Cannot enable boot on regulator\n", __func__); ret = regulator_get_by_platname("vcc5v0_host", ®ulator); if (ret) { debug("%s vcc5v0_host init fail! ret %d\n", __func__, ret); goto out; } ret = regulator_set_enable(regulator, true); if (ret) { debug("%s vcc5v0-host-en set fail!\n", __func__); goto out; } out: return 0; }
int exynos_power_init(void) { struct udevice *dev; int ret; ret = pmic_get("max77686", &dev); if (!ret) { /* TODO([email protected]): Move into the clock/pmic API */ ret = pmic_clrsetbits(dev, MAX77686_REG_PMIC_32KHZ, 0, MAX77686_32KHCP_EN); if (ret) return ret; ret = pmic_clrsetbits(dev, MAX77686_REG_PMIC_BBAT, 0, MAX77686_BBCHOSTEN | MAX77686_BBCVS_3_5V); if (ret) return ret; } else { ret = pmic_get("s5m8767-pmic", &dev); /* TODO([email protected]): Use driver model to access clock */ #ifdef CONFIG_PMIC_S5M8767 if (!ret) s5m8767_enable_32khz_cp(dev); #endif } if (ret == -ENODEV) return 0; ret = regulators_enable_boot_on(false); if (ret) return ret; ret = exynos_set_regulator("vdd_mif", 1100000); if (ret) return ret; /* * This would normally be 1.3V, but since we are running slowly 1.1V * is enough. For spring it helps reduce CPU temperature and avoid * hangs with the case open. 1.1V is minimum voltage borderline for * chained bootloaders. */ ret = exynos_set_regulator("vdd_arm", 1100000); if (ret) return ret; ret = exynos_set_regulator("vdd_int", 1012500); if (ret) return ret; ret = exynos_set_regulator("vdd_g3d", 1200000); if (ret) return ret; return 0; }
int board_init(void) { int ret; /* * We need to call into regulators_enable_boot_on() again, as the call * during SPL may have not included all regulators. */ ret = regulators_enable_boot_on(false); if (ret) debug("%s: Cannot enable boot on regulator\n", __func__); return 0; }
static int veyron_init(void) { struct udevice *dev; struct clk clk; int ret; ret = regulator_get_by_platname("vdd_arm", &dev); if (ret) { debug("Cannot set regulator name\n"); return ret; } /* Slowly raise to max CPU voltage to prevent overshoot */ ret = regulator_set_value(dev, 1200000); if (ret) return ret; udelay(175); /* Must wait for voltage to stabilize, 2mV/us */ ret = regulator_set_value(dev, 1400000); if (ret) return ret; udelay(100); /* Must wait for voltage to stabilize, 2mV/us */ ret = rockchip_get_clk(&clk.dev); if (ret) return ret; clk.id = PLL_APLL; ret = clk_set_rate(&clk, 1800000000); if (IS_ERR_VALUE(ret)) return ret; ret = regulator_get_by_platname("vcc33_sd", &dev); if (ret) { debug("Cannot get regulator name\n"); return ret; } ret = regulator_set_value(dev, 3300000); if (ret) return ret; ret = regulators_enable_boot_on(false); if (ret) { debug("%s: Cannot enable boot on regulators\n", __func__); return ret; } return 0; }
int exynos_power_init(void) { struct udevice *dev; int ret; ret = pmic_get("max77686", &dev); if (!ret) { /* TODO([email protected]): Move into the clock/pmic API */ ret = pmic_clrsetbits(dev, MAX77686_REG_PMIC_32KHZ, 0, MAX77686_32KHCP_EN); if (ret) return ret; ret = pmic_clrsetbits(dev, MAX77686_REG_PMIC_BBAT, 0, MAX77686_BBCHOSTEN | MAX77686_BBCVS_3_5V); if (ret) return ret; } else { ret = pmic_get("s5m8767-pmic", &dev); /* TODO([email protected]): Use driver model to access clock */ #ifdef CONFIG_PMIC_S5M8767 if (!ret) s5m8767_enable_32khz_cp(dev); #endif } if (ret == -ENODEV) return 0; ret = regulators_enable_boot_on(false); if (ret) return ret; ret = exynos_set_regulator("vdd_mif", 1100000); if (ret) return ret; ret = exynos_set_regulator("vdd_arm", 1300000); if (ret) return ret; ret = exynos_set_regulator("vdd_int", 1012500); if (ret) return ret; ret = exynos_set_regulator("vdd_g3d", 1200000); if (ret) return ret; return 0; }