static int __devinit tps65217_probe(struct i2c_client *client, const struct i2c_device_id *ids) { struct tps65217 *tps; unsigned int version; unsigned int chip_id = ids->driver_data; const struct of_device_id *match; int ret; if (client->dev.of_node) { match = of_match_device(tps65217_of_match, &client->dev); if (!match) { dev_err(&client->dev, "Failed to find matching dt id\n"); return -EINVAL; } chip_id = (unsigned int)match->data; } if (!chip_id) { dev_err(&client->dev, "id is null.\n"); return -ENODEV; } tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); if (!tps) return -ENOMEM; i2c_set_clientdata(client, tps); tps->dev = &client->dev; tps->id = chip_id; tps->regmap = devm_regmap_init_i2c(client, &tps65217_regmap_config); if (IS_ERR(tps->regmap)) { ret = PTR_ERR(tps->regmap); dev_err(tps->dev, "Failed to allocate register map: %d\n", ret); return ret; } ret = mfd_add_devices(tps->dev, -1, tps65217s, ARRAY_SIZE(tps65217s), NULL, 0, NULL); if (ret < 0) { dev_err(tps->dev, "mfd_add_devices failed: %d\n", ret); return ret; } ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version); if (ret < 0) { dev_err(tps->dev, "Failed to read revision register: %d\n", ret); return ret; } dev_info(tps->dev, "TPS65217 ID %#x version 1.%d\n", (version & TPS65217_CHIPID_CHIP_MASK) >> 4, version & TPS65217_CHIPID_REV_MASK); return 0; }
static irqreturn_t tps65217_charger_irq(int irq, void *dev) { int ret, val; struct tps65217_charger *charger = dev; charger->prev_ac_online = charger->ac_online; ret = tps65217_reg_read(charger->tps, TPS65217_REG_STATUS, &val); if (ret < 0) { dev_err(charger->dev, "%s: Error in reading reg 0x%x\n", __func__, TPS65217_REG_STATUS); return IRQ_HANDLED; } dev_dbg(charger->dev, "%s: 0x%x\n", __func__, val); /* check for AC status bit */ if (val & TPS65217_STATUS_ACPWR) { ret = tps65217_enable_charging(charger); if (ret) { dev_err(charger->dev, "failed to enable charger: %d\n", ret); return IRQ_HANDLED; } } else { charger->ac_online = 0; } if (charger->prev_ac_online != charger->ac_online) power_supply_changed(charger->ac); ret = tps65217_reg_read(charger->tps, TPS65217_REG_CHGCONFIG0, &val); if (ret < 0) { dev_err(charger->dev, "%s: Error in reading reg 0x%x\n", __func__, TPS65217_REG_CHGCONFIG0); return IRQ_HANDLED; } if (val & TPS65217_CHGCONFIG0_ACTIVE) dev_dbg(charger->dev, "%s: charger is charging\n", __func__); else dev_dbg(charger->dev, "%s: charger is NOT charging\n", __func__); return IRQ_HANDLED; }
static int tps65217_pmic_is_enabled(struct regulator_dev *dev) { int ret; struct tps65217 *tps = rdev_get_drvdata(dev); unsigned int data, rid = rdev_get_id(dev); if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4) return -EINVAL; ret = tps65217_reg_read(tps, TPS65217_REG_ENABLE, &data); if (ret) return ret; return (data & tps->info[rid]->enable_mask) ? 1 : 0; }
static int tps65217_pmic_get_voltage_sel(struct regulator_dev *dev) { int ret; struct tps65217 *tps = rdev_get_drvdata(dev); unsigned int selector, rid = rdev_get_id(dev); if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4) return -EINVAL; ret = tps65217_reg_read(tps, tps->info[rid]->set_vout_reg, &selector); if (ret) return ret; selector &= tps->info[rid]->set_vout_mask; return selector; }
/** * tps65217_update_bits: Modify bits w.r.t mask, val and level. * * @tps65217: Device to write to. * @reg: Register to read-write to. * @mask: Mask. * @val: Value to write. * @level: Password protected level */ static int tps65217_update_bits(struct tps65217 *tps, unsigned int reg, unsigned int mask, unsigned int val, unsigned int level) { int ret; unsigned int data; ret = tps65217_reg_read(tps, reg, &data); if (ret) { dev_err(tps->dev, "Read from reg 0x%x failed\n", reg); return ret; } data &= ~mask; data |= val & mask; ret = tps65217_reg_write(tps, reg, data, level); if (ret) dev_err(tps->dev, "Write for reg 0x%x failed\n", reg); return ret; }
void am33xx_spl_board_init(void) { if (!strncmp("A335BONE", header.name, 8)) { /* BeagleBone PMIC Code */ uchar pmic_status_reg; if (i2c_probe(TPS65217_CHIP_PM)) return; if (tps65217_reg_read(STATUS, &pmic_status_reg)) return; /* Increase USB current limit to 1300mA */ if (tps65217_reg_write(PROT_LEVEL_NONE, POWER_PATH, USB_INPUT_CUR_LIMIT_1300MA, USB_INPUT_CUR_LIMIT_MASK)) printf("tps65217_reg_write failure\n"); /* Only perform PMIC configurations if board rev > A1 */ if (!strncmp(header.version, "00A1", 4)) return; /* Set DCDC2 (MPU) voltage to 1.275V */ if (tps65217_voltage_update(DEFDCDC2, DCDC_VOLT_SEL_1275MV)) { printf("tps65217_voltage_update failure\n"); return; } /* Set LDO3, LDO4 output voltage to 3.3V */ if (tps65217_reg_write(PROT_LEVEL_2, DEFLS1, LDO_VOLTAGE_OUT_3_3, LDO_MASK)) printf("tps65217_reg_write failure\n"); if (tps65217_reg_write(PROT_LEVEL_2, DEFLS2, LDO_VOLTAGE_OUT_3_3, LDO_MASK)) printf("tps65217_reg_write failure\n"); if (!(pmic_status_reg & PWR_SRC_AC_BITMASK)) { printf("No AC power, disabling frequency switch\n"); return; } /* Set MPU Frequency to 720MHz */ mpu_pll_config(MPUPLL_M_720); } else { uchar buf[4]; /* * EVM PMIC code. All boards currently want an MPU voltage * of 1.2625V and CORE voltage of 1.1375V to operate at * 720MHz. */ if (i2c_probe(PMIC_CTRL_I2C_ADDR)) return; /* VDD1/2 voltage selection register access by control i/f */ if (i2c_read(PMIC_CTRL_I2C_ADDR, PMIC_DEVCTRL_REG, 1, buf, 1)) return; buf[0] |= PMIC_DEVCTRL_REG_SR_CTL_I2C_SEL_CTL_I2C; if (i2c_write(PMIC_CTRL_I2C_ADDR, PMIC_DEVCTRL_REG, 1, buf, 1)) return; if (!voltage_update(MPU, PMIC_OP_REG_SEL_1_2_6) && !voltage_update(CORE, PMIC_OP_REG_SEL_1_1_3)) { if (board_is_evm_15_or_later()) mpu_pll_config(MPUPLL_M_800); else mpu_pll_config(MPUPLL_M_720); } } }
static int tps65217_probe(struct i2c_client *client, const struct i2c_device_id *ids) { struct tps65217 *tps; unsigned int version; unsigned long chip_id = ids->driver_data; const struct of_device_id *match; bool status_off = false; int ret; if (client->dev.of_node) { match = of_match_device(tps65217_of_match, &client->dev); if (!match) { dev_err(&client->dev, "Failed to find matching dt id\n"); return -EINVAL; } chip_id = (unsigned long)match->data; status_off = of_property_read_bool(client->dev.of_node, "ti,pmic-shutdown-controller"); } if (!chip_id) { dev_err(&client->dev, "id is null.\n"); return -ENODEV; } tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); if (!tps) return -ENOMEM; i2c_set_clientdata(client, tps); tps->dev = &client->dev; tps->id = chip_id; tps->regmap = devm_regmap_init_i2c(client, &tps65217_regmap_config); if (IS_ERR(tps->regmap)) { ret = PTR_ERR(tps->regmap); dev_err(tps->dev, "Failed to allocate register map: %d\n", ret); return ret; } ret = mfd_add_devices(tps->dev, -1, tps65217s, ARRAY_SIZE(tps65217s), NULL, 0, NULL); if (ret < 0) { dev_err(tps->dev, "mfd_add_devices failed: %d\n", ret); return ret; } ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version); if (ret < 0) { dev_err(tps->dev, "Failed to read revision register: %d\n", ret); return ret; } /* Set the PMIC to shutdown on PWR_EN toggle */ if (status_off) { ret = tps65217_set_bits(tps, TPS65217_REG_STATUS, TPS65217_STATUS_OFF, TPS65217_STATUS_OFF, TPS65217_PROTECT_NONE); if (ret) dev_warn(tps->dev, "unable to set the status OFF\n"); } dev_info(tps->dev, "TPS65217 ID %#x version 1.%d\n", (version & TPS65217_CHIPID_CHIP_MASK) >> 4, version & TPS65217_CHIPID_REV_MASK); return 0; }
static int __devinit tps65217_probe(struct i2c_client *client, const struct i2c_device_id *ids) { struct tps65217 *tps; struct tps65217_board *pdata = client->dev.platform_data; int i, ret; unsigned int version; tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); if (!tps) return -ENOMEM; tps->pdata = pdata; tps->regmap = regmap_init_i2c(client, &tps65217_regmap_config); if (IS_ERR(tps->regmap)) { ret = PTR_ERR(tps->regmap); dev_err(tps->dev, "Failed to allocate register map: %d\n", ret); return ret; } i2c_set_clientdata(client, tps); tps->dev = &client->dev; ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version); if (ret < 0) { dev_err(tps->dev, "Failed to read revision" " register: %d\n", ret); goto err_regmap; } /* Set the PMIC to shutdown on PWR_EN toggle */ if (pdata->status_off) { ret = tps65217_set_bits(tps, TPS65217_REG_STATUS, TPS65217_STATUS_OFF, TPS65217_STATUS_OFF, TPS65217_PROTECT_NONE); if (ret) { dev_err(tps->dev, "Failed to set the status OFF\n"); goto err_regmap; } } dev_info(tps->dev, "TPS65217 ID %#x version 1.%d\n", (version & TPS65217_CHIPID_CHIP_MASK) >> 4, version & TPS65217_CHIPID_REV_MASK); for (i = 0; i < TPS65217_NUM_REGULATOR; i++) { struct platform_device *pdev; pdev = platform_device_alloc("tps65217-pmic", i); if (!pdev) { dev_err(tps->dev, "Cannot create regulator %d\n", i); continue; } pdev->dev.parent = tps->dev; platform_device_add_data(pdev, &pdata->tps65217_init_data[i], sizeof(pdata->tps65217_init_data[i])); tps->regulator_pdev[i] = pdev; platform_device_add(pdev); } return 0; err_regmap: regmap_exit(tps->regmap); return ret; }
void am33xx_spl_board_init(void) { struct am335x_baseboard_id header; int mpu_vdd; if (read_eeprom(&header) < 0) { puts("Wrong data in EEPROM.\n"); hang(); } if (!board_is_kalitap(&header) && !board_is_luna(&header) && !board_is_catchwire(&header)) { puts("Could not get board ID (CatchWire/KaliTAP).\n"); hang(); } /* Get the frequency */ dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev); /* BeagleBone and NEWT PMIC Code */ int usb_cur_lim; if (i2c_probe(TPS65217_CHIP_PM)) return; /* * Override what we have detected since we know we have * a CatchWire/KaliTAP that supports 1GHz. */ dpll_mpu_opp100.m = MPUPLL_M_1000; /* * Increase USB current limit to 1300mA or 1800mA and set * the MPU voltage controller as needed. */ if (dpll_mpu_opp100.m == MPUPLL_M_1000) { usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA; mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV; puts("tps65217_reg_write USB_INPUT_CUR_LIMIT_1800MA\n"); } else { usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA; mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV; puts("tps65217_reg_write USB_INPUT_CUR_LIMIT_1300MA\n"); } if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE, TPS65217_POWER_PATH, usb_cur_lim, TPS65217_USB_INPUT_CUR_LIMIT_MASK)) { puts("tps65217_reg_write POWER_PATH failure\n"); } else { uchar pmic_power_path_reg = 0; puts("tps65217_reg_write POWER_PATH success\n"); tps65217_reg_read(TPS65217_POWER_PATH, &pmic_power_path_reg); printf("POWER_PATH : 0%02X\n", pmic_power_path_reg); } /* Set DCDC3 (CORE) voltage to 1.125V */ if (tps65217_voltage_update(TPS65217_DEFDCDC3, TPS65217_DCDC_VOLT_SEL_1125MV)) { puts("tps65217_voltage_update failure\n"); return; } /* Set CORE Frequencies to OPP100 */ do_setup_dpll(&dpll_core_regs, &dpll_core_opp100); /* Set DCDC2 (MPU) voltage */ if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) { puts("tps65217_voltage_update failure\n"); return; } else { puts("tps65217_voltage_update success\n"); } /* * Set LDO3 to 1.8V and LDO4 to 3.3V for CatchWire/KaliTAP. */ if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, TPS65217_DEFLS1, TPS65217_LDO_VOLTAGE_OUT_1_8, TPS65217_LDO_MASK)) puts("tps65217_reg_write failure\n"); if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, TPS65217_DEFLS2, TPS65217_LDO_VOLTAGE_OUT_3_3, TPS65217_LDO_MASK)) puts("tps65217_reg_write failure\n"); /* Set MPU Frequency to what we detected now that voltages are set */ do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100); }