int __init atlantis_regulator_init(void) { struct board_info board_info; void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE); u32 pmc_ctrl; int i; bool wdt_disable; /* configure the power management controller to trigger PMU * interrupts when high */ pmc_ctrl = readl(pmc + PMC_CTRL); writel(pmc_ctrl & ~PMC_CTRL_INTR_LOW, pmc + PMC_CTRL); tegra_get_board_info(&board_info); for (i = 0; i < PALMAS_NUM_REGS ; i++) { pmic_platform.reg_data[i] = atlantis_reg_data[i]; pmic_platform.reg_init[i] = atlantis_reg_init[i]; } reg_init_data_ldo5.tracking_regulator = PALMAS_REG_SMPS6; /* Enable full constraints to disable unused rails */ regulator_has_full_constraints(); /* Set LDO11 startup time to 600us */ reg_idata_ldo11.constraints.startup_delay = 600; if (((board_info.fab != BOARD_FAB_A00) || (board_info.board_id == BOARD_E1740))) reg_idata_regen7.num_consumer_supplies = 0; if (board_info.sku == BOARD_SKU_110) { pmic_platform.reg_data[PALMAS_REG_SMPS12] = NULL; pmic_platform.reg_init[PALMAS_REG_SMPS12] = NULL; lp8755_regulator_init(); } else if (board_info.sku == BOARD_SKU_100 || board_info.board_id == BOARD_E1740) { reg_init_data_smps12.roof_floor = PALMAS_EXT_CONTROL_ENABLE1; } else if (board_info.sku == BOARD_SKU_120) { pmic_platform.reg_data[PALMAS_REG_SMPS12] = atlantis_reg_data[PALMAS_REG_SMPS6]; pmic_platform.reg_data[PALMAS_REG_SMPS12]->constraints.name = palmas_rails(smps12); pmic_platform.reg_init[PALMAS_REG_SMPS12] = atlantis_reg_init[PALMAS_REG_SMPS6]; pmic_platform.reg_data[PALMAS_REG_SMPS6] = NULL; pmic_platform.reg_init[PALMAS_REG_SMPS6] = NULL; reg_init_data_ldo5.config_flags = PALMAS_REGULATOR_CONFIG_TRACKING_ENABLE; reg_init_data_ldo5.tracking_regulator = PALMAS_REG_SMPS12; lp8755_regulator_init(); } platform_device_register(&power_supply_extcon_device); if (board_info.board_id == BOARD_E1670) { gadc_thermal_battery_pdata.adc_temp_lookup = atlanties_ers_batt_temperature_table; gadc_thermal_battery_pdata.lookup_table_size = ARRAY_SIZE(atlanties_ers_batt_temperature_table); gadc_thermal_battery_pdata.first_index_temp = 119; gadc_thermal_battery_pdata.last_index_temp = -40; } else if (board_info.board_id == BOARD_E1740) { gadc_thermal_battery_pdata.adc_temp_lookup = atlantis_ffd_batt_temperature_table; gadc_thermal_battery_pdata.lookup_table_size = ARRAY_SIZE(atlantis_ffd_batt_temperature_table); gadc_thermal_battery_pdata.first_index_temp = 125; gadc_thermal_battery_pdata.last_index_temp = -40; } if (get_power_supply_type() == POWER_SUPPLY_TYPE_BATTERY) { palmas_pdata.battery_pdata->is_battery_present = true; palmas_pdata.charger_pdata->bcharger_pdata = &palmas_bcharger_pdata; platform_device_register(&gadc_thermal_battery); } wdt_disable = is_pmic_wdt_disabled_at_boot(); if (wdt_disable) palmas_pdata.watchdog_timer_initial_period = 0; i2c_register_board_info(4, palma_device, ARRAY_SIZE(palma_device)); return 0; }
static int lp8755_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret, icnt; struct lp8755_chip *pchip; struct lp8755_platform_data *pdata = client->dev.platform_data; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "i2c functionality check fail.\n"); return -EOPNOTSUPP; } pchip = devm_kzalloc(&client->dev, sizeof(struct lp8755_chip), GFP_KERNEL); if (!pchip) return -ENOMEM; pchip->dev = &client->dev; pchip->regmap = devm_regmap_init_i2c(client, &lp8755_regmap); if (IS_ERR(pchip->regmap)) { ret = PTR_ERR(pchip->regmap); dev_err(&client->dev, "fail to allocate regmap %d\n", ret); return ret; } i2c_set_clientdata(client, pchip); if (pdata != NULL) { pchip->pdata = pdata; pchip->mphase = pdata->mphase; } else { pchip->pdata = devm_kzalloc(pchip->dev, sizeof(struct lp8755_platform_data), GFP_KERNEL); if (!pchip->pdata) return -ENOMEM; ret = lp8755_init_data(pchip); if (ret < 0) { dev_err(&client->dev, "fail to initialize chip\n"); return ret; } } ret = lp8755_regulator_init(pchip); if (ret < 0) { dev_err(&client->dev, "fail to initialize regulators\n"); goto err_regulator; } pchip->irq = client->irq; ret = lp8755_int_config(pchip); if (ret < 0) { dev_err(&client->dev, "fail to irq config\n"); goto err_irq; } return ret; err_irq: for (icnt = 0; icnt < mphase_buck[pchip->mphase].nreg; icnt++) regulator_unregister(pchip->rdev[icnt]); err_regulator: /* output disable */ for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++) lp8755_write(pchip, icnt, 0x00); return ret; }