1*23684d0eSYann Gautier /* 2*23684d0eSYann Gautier * Copyright (c) 2017-2019, STMicroelectronics - All Rights Reserved 3*23684d0eSYann Gautier * 4*23684d0eSYann Gautier * SPDX-License-Identifier: BSD-3-Clause 5*23684d0eSYann Gautier */ 6*23684d0eSYann Gautier 7*23684d0eSYann Gautier #include <errno.h> 8*23684d0eSYann Gautier #include <stdbool.h> 9*23684d0eSYann Gautier 10*23684d0eSYann Gautier #include <libfdt.h> 11*23684d0eSYann Gautier 12*23684d0eSYann Gautier #include <platform_def.h> 13*23684d0eSYann Gautier 14*23684d0eSYann Gautier #include <common/debug.h> 15*23684d0eSYann Gautier #include <drivers/delay_timer.h> 16*23684d0eSYann Gautier #include <drivers/st/stm32mp_pmic.h> 17*23684d0eSYann Gautier #include <drivers/st/stm32_gpio.h> 18*23684d0eSYann Gautier #include <drivers/st/stm32mp1_clk.h> 19*23684d0eSYann Gautier #include <drivers/st/stpmic1.h> 20*23684d0eSYann Gautier #include <lib/mmio.h> 21*23684d0eSYann Gautier #include <lib/utils_def.h> 22*23684d0eSYann Gautier 23*23684d0eSYann Gautier /* I2C Timing hard-coded value, for I2C clock source is HSI at 64MHz */ 24*23684d0eSYann Gautier #define I2C_TIMING 0x10D07DB5 25*23684d0eSYann Gautier 26*23684d0eSYann Gautier #define I2C_TIMEOUT 0xFFFFF 27*23684d0eSYann Gautier 28*23684d0eSYann Gautier #define MASK_RESET_BUCK3 BIT(2) 29*23684d0eSYann Gautier 30*23684d0eSYann Gautier #define STPMIC1_LDO12356_OUTPUT_MASK (uint8_t)(GENMASK(6, 2)) 31*23684d0eSYann Gautier #define STPMIC1_LDO12356_OUTPUT_SHIFT 2 32*23684d0eSYann Gautier #define STPMIC1_LDO3_MODE (uint8_t)(BIT(7)) 33*23684d0eSYann Gautier #define STPMIC1_LDO3_DDR_SEL 31U 34*23684d0eSYann Gautier #define STPMIC1_LDO3_1800000 (9U << STPMIC1_LDO12356_OUTPUT_SHIFT) 35*23684d0eSYann Gautier 36*23684d0eSYann Gautier #define STPMIC1_BUCK_OUTPUT_SHIFT 2 37*23684d0eSYann Gautier #define STPMIC1_BUCK3_1V8 (39U << STPMIC1_BUCK_OUTPUT_SHIFT) 38*23684d0eSYann Gautier 39*23684d0eSYann Gautier #define STPMIC1_DEFAULT_START_UP_DELAY_MS 1 40*23684d0eSYann Gautier 41*23684d0eSYann Gautier static struct i2c_handle_s i2c_handle; 42*23684d0eSYann Gautier static uint32_t pmic_i2c_addr; 43*23684d0eSYann Gautier 44*23684d0eSYann Gautier static int dt_get_pmic_node(void *fdt) 45*23684d0eSYann Gautier { 46*23684d0eSYann Gautier return fdt_node_offset_by_compatible(fdt, -1, "st,stpmic1"); 47*23684d0eSYann Gautier } 48*23684d0eSYann Gautier 49*23684d0eSYann Gautier bool dt_check_pmic(void) 50*23684d0eSYann Gautier { 51*23684d0eSYann Gautier int node; 52*23684d0eSYann Gautier void *fdt; 53*23684d0eSYann Gautier 54*23684d0eSYann Gautier if (fdt_get_address(&fdt) == 0) { 55*23684d0eSYann Gautier return false; 56*23684d0eSYann Gautier } 57*23684d0eSYann Gautier 58*23684d0eSYann Gautier node = dt_get_pmic_node(fdt); 59*23684d0eSYann Gautier if (node < 0) { 60*23684d0eSYann Gautier VERBOSE("%s: No PMIC node found in DT\n", __func__); 61*23684d0eSYann Gautier return false; 62*23684d0eSYann Gautier } 63*23684d0eSYann Gautier 64*23684d0eSYann Gautier return fdt_check_status(node); 65*23684d0eSYann Gautier } 66*23684d0eSYann Gautier 67*23684d0eSYann Gautier static int dt_pmic_i2c_config(struct dt_node_info *i2c_info) 68*23684d0eSYann Gautier { 69*23684d0eSYann Gautier int pmic_node, i2c_node; 70*23684d0eSYann Gautier void *fdt; 71*23684d0eSYann Gautier const fdt32_t *cuint; 72*23684d0eSYann Gautier 73*23684d0eSYann Gautier if (fdt_get_address(&fdt) == 0) { 74*23684d0eSYann Gautier return -ENOENT; 75*23684d0eSYann Gautier } 76*23684d0eSYann Gautier 77*23684d0eSYann Gautier pmic_node = dt_get_pmic_node(fdt); 78*23684d0eSYann Gautier if (pmic_node < 0) { 79*23684d0eSYann Gautier return -FDT_ERR_NOTFOUND; 80*23684d0eSYann Gautier } 81*23684d0eSYann Gautier 82*23684d0eSYann Gautier cuint = fdt_getprop(fdt, pmic_node, "reg", NULL); 83*23684d0eSYann Gautier if (cuint == NULL) { 84*23684d0eSYann Gautier return -FDT_ERR_NOTFOUND; 85*23684d0eSYann Gautier } 86*23684d0eSYann Gautier 87*23684d0eSYann Gautier pmic_i2c_addr = fdt32_to_cpu(*cuint) << 1; 88*23684d0eSYann Gautier if (pmic_i2c_addr > UINT16_MAX) { 89*23684d0eSYann Gautier return -EINVAL; 90*23684d0eSYann Gautier } 91*23684d0eSYann Gautier 92*23684d0eSYann Gautier i2c_node = fdt_parent_offset(fdt, pmic_node); 93*23684d0eSYann Gautier if (i2c_node < 0) { 94*23684d0eSYann Gautier return -FDT_ERR_NOTFOUND; 95*23684d0eSYann Gautier } 96*23684d0eSYann Gautier 97*23684d0eSYann Gautier dt_fill_device_info(i2c_info, i2c_node); 98*23684d0eSYann Gautier if (i2c_info->base == 0U) { 99*23684d0eSYann Gautier return -FDT_ERR_NOTFOUND; 100*23684d0eSYann Gautier } 101*23684d0eSYann Gautier 102*23684d0eSYann Gautier return dt_set_pinctrl_config(i2c_node); 103*23684d0eSYann Gautier } 104*23684d0eSYann Gautier 105*23684d0eSYann Gautier int dt_pmic_enable_boot_on_regulators(void) 106*23684d0eSYann Gautier { 107*23684d0eSYann Gautier int pmic_node, regulators_node, regulator_node; 108*23684d0eSYann Gautier void *fdt; 109*23684d0eSYann Gautier 110*23684d0eSYann Gautier if (fdt_get_address(&fdt) == 0) { 111*23684d0eSYann Gautier return -ENOENT; 112*23684d0eSYann Gautier } 113*23684d0eSYann Gautier 114*23684d0eSYann Gautier pmic_node = dt_get_pmic_node(fdt); 115*23684d0eSYann Gautier if (pmic_node < 0) { 116*23684d0eSYann Gautier return -FDT_ERR_NOTFOUND; 117*23684d0eSYann Gautier } 118*23684d0eSYann Gautier 119*23684d0eSYann Gautier regulators_node = fdt_subnode_offset(fdt, pmic_node, "regulators"); 120*23684d0eSYann Gautier 121*23684d0eSYann Gautier fdt_for_each_subnode(regulator_node, fdt, regulators_node) { 122*23684d0eSYann Gautier const fdt32_t *cuint; 123*23684d0eSYann Gautier const char *node_name; 124*23684d0eSYann Gautier uint16_t voltage; 125*23684d0eSYann Gautier 126*23684d0eSYann Gautier if (fdt_getprop(fdt, regulator_node, "regulator-boot-on", 127*23684d0eSYann Gautier NULL) == NULL) { 128*23684d0eSYann Gautier continue; 129*23684d0eSYann Gautier } 130*23684d0eSYann Gautier 131*23684d0eSYann Gautier cuint = fdt_getprop(fdt, regulator_node, 132*23684d0eSYann Gautier "regulator-min-microvolt", NULL); 133*23684d0eSYann Gautier if (cuint == NULL) { 134*23684d0eSYann Gautier continue; 135*23684d0eSYann Gautier } 136*23684d0eSYann Gautier 137*23684d0eSYann Gautier /* DT uses microvolts, whereas driver awaits millivolts */ 138*23684d0eSYann Gautier voltage = (uint16_t)(fdt32_to_cpu(*cuint) / 1000U); 139*23684d0eSYann Gautier node_name = fdt_get_name(fdt, regulator_node, NULL); 140*23684d0eSYann Gautier 141*23684d0eSYann Gautier if (stpmic1_is_regulator_enabled(node_name) == 0U) { 142*23684d0eSYann Gautier int status; 143*23684d0eSYann Gautier 144*23684d0eSYann Gautier status = stpmic1_regulator_voltage_set(node_name, 145*23684d0eSYann Gautier voltage); 146*23684d0eSYann Gautier if (status != 0) { 147*23684d0eSYann Gautier return status; 148*23684d0eSYann Gautier } 149*23684d0eSYann Gautier 150*23684d0eSYann Gautier status = stpmic1_regulator_enable(node_name); 151*23684d0eSYann Gautier if (status != 0) { 152*23684d0eSYann Gautier return status; 153*23684d0eSYann Gautier } 154*23684d0eSYann Gautier } 155*23684d0eSYann Gautier } 156*23684d0eSYann Gautier 157*23684d0eSYann Gautier return 0; 158*23684d0eSYann Gautier } 159*23684d0eSYann Gautier 160*23684d0eSYann Gautier void initialize_pmic_i2c(void) 161*23684d0eSYann Gautier { 162*23684d0eSYann Gautier int ret; 163*23684d0eSYann Gautier struct dt_node_info i2c_info; 164*23684d0eSYann Gautier 165*23684d0eSYann Gautier if (dt_pmic_i2c_config(&i2c_info) != 0) { 166*23684d0eSYann Gautier ERROR("I2C configuration failed\n"); 167*23684d0eSYann Gautier panic(); 168*23684d0eSYann Gautier } 169*23684d0eSYann Gautier 170*23684d0eSYann Gautier if (stm32mp1_clk_enable((uint32_t)i2c_info.clock) < 0) { 171*23684d0eSYann Gautier ERROR("I2C clock enable failed\n"); 172*23684d0eSYann Gautier panic(); 173*23684d0eSYann Gautier } 174*23684d0eSYann Gautier 175*23684d0eSYann Gautier /* Initialize PMIC I2C */ 176*23684d0eSYann Gautier i2c_handle.i2c_base_addr = i2c_info.base; 177*23684d0eSYann Gautier i2c_handle.i2c_init.timing = I2C_TIMING; 178*23684d0eSYann Gautier i2c_handle.i2c_init.own_address1 = pmic_i2c_addr; 179*23684d0eSYann Gautier i2c_handle.i2c_init.addressing_mode = I2C_ADDRESSINGMODE_7BIT; 180*23684d0eSYann Gautier i2c_handle.i2c_init.dual_address_mode = I2C_DUALADDRESS_DISABLE; 181*23684d0eSYann Gautier i2c_handle.i2c_init.own_address2 = 0; 182*23684d0eSYann Gautier i2c_handle.i2c_init.own_address2_masks = I2C_OAR2_OA2NOMASK; 183*23684d0eSYann Gautier i2c_handle.i2c_init.general_call_mode = I2C_GENERALCALL_DISABLE; 184*23684d0eSYann Gautier i2c_handle.i2c_init.no_stretch_mode = I2C_NOSTRETCH_DISABLE; 185*23684d0eSYann Gautier 186*23684d0eSYann Gautier ret = stm32_i2c_init(&i2c_handle); 187*23684d0eSYann Gautier if (ret != 0) { 188*23684d0eSYann Gautier ERROR("Cannot initialize I2C %x (%d)\n", 189*23684d0eSYann Gautier i2c_handle.i2c_base_addr, ret); 190*23684d0eSYann Gautier panic(); 191*23684d0eSYann Gautier } 192*23684d0eSYann Gautier 193*23684d0eSYann Gautier ret = stm32_i2c_config_analog_filter(&i2c_handle, 194*23684d0eSYann Gautier I2C_ANALOGFILTER_ENABLE); 195*23684d0eSYann Gautier if (ret != 0) { 196*23684d0eSYann Gautier ERROR("Cannot initialize I2C analog filter (%d)\n", ret); 197*23684d0eSYann Gautier panic(); 198*23684d0eSYann Gautier } 199*23684d0eSYann Gautier 200*23684d0eSYann Gautier ret = stm32_i2c_is_device_ready(&i2c_handle, (uint16_t)pmic_i2c_addr, 1, 201*23684d0eSYann Gautier I2C_TIMEOUT); 202*23684d0eSYann Gautier if (ret != 0) { 203*23684d0eSYann Gautier ERROR("I2C device not ready (%d)\n", ret); 204*23684d0eSYann Gautier panic(); 205*23684d0eSYann Gautier } 206*23684d0eSYann Gautier 207*23684d0eSYann Gautier stpmic1_bind_i2c(&i2c_handle, (uint16_t)pmic_i2c_addr); 208*23684d0eSYann Gautier } 209*23684d0eSYann Gautier 210*23684d0eSYann Gautier void initialize_pmic(void) 211*23684d0eSYann Gautier { 212*23684d0eSYann Gautier int status; 213*23684d0eSYann Gautier uint8_t read_val; 214*23684d0eSYann Gautier 215*23684d0eSYann Gautier initialize_pmic_i2c(); 216*23684d0eSYann Gautier 217*23684d0eSYann Gautier status = stpmic1_register_read(VERSION_STATUS_REG, &read_val); 218*23684d0eSYann Gautier if (status != 0) { 219*23684d0eSYann Gautier panic(); 220*23684d0eSYann Gautier } 221*23684d0eSYann Gautier 222*23684d0eSYann Gautier INFO("PMIC version = 0x%x\n", read_val); 223*23684d0eSYann Gautier 224*23684d0eSYann Gautier /* Keep VDD on during the reset cycle */ 225*23684d0eSYann Gautier status = stpmic1_register_update(MASK_RESET_BUCK_REG, 226*23684d0eSYann Gautier MASK_RESET_BUCK3, 227*23684d0eSYann Gautier MASK_RESET_BUCK3); 228*23684d0eSYann Gautier if (status != 0) { 229*23684d0eSYann Gautier panic(); 230*23684d0eSYann Gautier } 231*23684d0eSYann Gautier } 232*23684d0eSYann Gautier 233*23684d0eSYann Gautier int pmic_ddr_power_init(enum ddr_type ddr_type) 234*23684d0eSYann Gautier { 235*23684d0eSYann Gautier bool buck3_at_1v8 = false; 236*23684d0eSYann Gautier uint8_t read_val; 237*23684d0eSYann Gautier int status; 238*23684d0eSYann Gautier 239*23684d0eSYann Gautier switch (ddr_type) { 240*23684d0eSYann Gautier case STM32MP_DDR3: 241*23684d0eSYann Gautier /* Set LDO3 to sync mode */ 242*23684d0eSYann Gautier status = stpmic1_register_read(LDO3_CONTROL_REG, &read_val); 243*23684d0eSYann Gautier if (status != 0) { 244*23684d0eSYann Gautier return status; 245*23684d0eSYann Gautier } 246*23684d0eSYann Gautier 247*23684d0eSYann Gautier read_val &= ~STPMIC1_LDO3_MODE; 248*23684d0eSYann Gautier read_val &= ~STPMIC1_LDO12356_OUTPUT_MASK; 249*23684d0eSYann Gautier read_val |= STPMIC1_LDO3_DDR_SEL << 250*23684d0eSYann Gautier STPMIC1_LDO12356_OUTPUT_SHIFT; 251*23684d0eSYann Gautier 252*23684d0eSYann Gautier status = stpmic1_register_write(LDO3_CONTROL_REG, read_val); 253*23684d0eSYann Gautier if (status != 0) { 254*23684d0eSYann Gautier return status; 255*23684d0eSYann Gautier } 256*23684d0eSYann Gautier 257*23684d0eSYann Gautier status = stpmic1_regulator_voltage_set("buck2", 1350); 258*23684d0eSYann Gautier if (status != 0) { 259*23684d0eSYann Gautier return status; 260*23684d0eSYann Gautier } 261*23684d0eSYann Gautier 262*23684d0eSYann Gautier status = stpmic1_regulator_enable("buck2"); 263*23684d0eSYann Gautier if (status != 0) { 264*23684d0eSYann Gautier return status; 265*23684d0eSYann Gautier } 266*23684d0eSYann Gautier 267*23684d0eSYann Gautier mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS); 268*23684d0eSYann Gautier 269*23684d0eSYann Gautier status = stpmic1_regulator_enable("vref_ddr"); 270*23684d0eSYann Gautier if (status != 0) { 271*23684d0eSYann Gautier return status; 272*23684d0eSYann Gautier } 273*23684d0eSYann Gautier 274*23684d0eSYann Gautier mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS); 275*23684d0eSYann Gautier 276*23684d0eSYann Gautier status = stpmic1_regulator_enable("ldo3"); 277*23684d0eSYann Gautier if (status != 0) { 278*23684d0eSYann Gautier return status; 279*23684d0eSYann Gautier } 280*23684d0eSYann Gautier 281*23684d0eSYann Gautier mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS); 282*23684d0eSYann Gautier break; 283*23684d0eSYann Gautier 284*23684d0eSYann Gautier case STM32MP_LPDDR2: 285*23684d0eSYann Gautier /* 286*23684d0eSYann Gautier * Set LDO3 to 1.8V 287*23684d0eSYann Gautier * Set LDO3 to bypass mode if BUCK3 = 1.8V 288*23684d0eSYann Gautier * Set LDO3 to normal mode if BUCK3 != 1.8V 289*23684d0eSYann Gautier */ 290*23684d0eSYann Gautier status = stpmic1_register_read(BUCK3_CONTROL_REG, &read_val); 291*23684d0eSYann Gautier if (status != 0) { 292*23684d0eSYann Gautier return status; 293*23684d0eSYann Gautier } 294*23684d0eSYann Gautier 295*23684d0eSYann Gautier if ((read_val & STPMIC1_BUCK3_1V8) == STPMIC1_BUCK3_1V8) { 296*23684d0eSYann Gautier buck3_at_1v8 = true; 297*23684d0eSYann Gautier } 298*23684d0eSYann Gautier 299*23684d0eSYann Gautier status = stpmic1_register_read(LDO3_CONTROL_REG, &read_val); 300*23684d0eSYann Gautier if (status != 0) { 301*23684d0eSYann Gautier return status; 302*23684d0eSYann Gautier } 303*23684d0eSYann Gautier 304*23684d0eSYann Gautier read_val &= ~STPMIC1_LDO3_MODE; 305*23684d0eSYann Gautier read_val &= ~STPMIC1_LDO12356_OUTPUT_MASK; 306*23684d0eSYann Gautier read_val |= STPMIC1_LDO3_1800000; 307*23684d0eSYann Gautier if (buck3_at_1v8) { 308*23684d0eSYann Gautier read_val |= STPMIC1_LDO3_MODE; 309*23684d0eSYann Gautier } 310*23684d0eSYann Gautier 311*23684d0eSYann Gautier status = stpmic1_register_write(LDO3_CONTROL_REG, read_val); 312*23684d0eSYann Gautier if (status != 0) { 313*23684d0eSYann Gautier return status; 314*23684d0eSYann Gautier } 315*23684d0eSYann Gautier 316*23684d0eSYann Gautier status = stpmic1_regulator_voltage_set("buck2", 1200); 317*23684d0eSYann Gautier if (status != 0) { 318*23684d0eSYann Gautier return status; 319*23684d0eSYann Gautier } 320*23684d0eSYann Gautier 321*23684d0eSYann Gautier status = stpmic1_regulator_enable("ldo3"); 322*23684d0eSYann Gautier if (status != 0) { 323*23684d0eSYann Gautier return status; 324*23684d0eSYann Gautier } 325*23684d0eSYann Gautier 326*23684d0eSYann Gautier mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS); 327*23684d0eSYann Gautier 328*23684d0eSYann Gautier status = stpmic1_regulator_enable("buck2"); 329*23684d0eSYann Gautier if (status != 0) { 330*23684d0eSYann Gautier return status; 331*23684d0eSYann Gautier } 332*23684d0eSYann Gautier 333*23684d0eSYann Gautier mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS); 334*23684d0eSYann Gautier 335*23684d0eSYann Gautier status = stpmic1_regulator_enable("vref_ddr"); 336*23684d0eSYann Gautier if (status != 0) { 337*23684d0eSYann Gautier return status; 338*23684d0eSYann Gautier } 339*23684d0eSYann Gautier 340*23684d0eSYann Gautier mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS); 341*23684d0eSYann Gautier break; 342*23684d0eSYann Gautier 343*23684d0eSYann Gautier default: 344*23684d0eSYann Gautier break; 345*23684d0eSYann Gautier }; 346*23684d0eSYann Gautier 347*23684d0eSYann Gautier return 0; 348*23684d0eSYann Gautier } 349