blob: 6426d1488a5c2bee1f8ca1cf3f6d009fa314baba [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Felipe Balbiee27db32015-01-06 09:14:36 -06002/*
Nishanth Menoneaa39c62023-11-01 15:56:03 -05003 * (C) Copyright 2014 Texas Instruments Incorporated - https://www.ti.com
Felipe Balbiee27db32015-01-06 09:14:36 -06004 * Author: Felipe Balbi <balbi@ti.com>
Felipe Balbiee27db32015-01-06 09:14:36 -06005 */
6
7#include <common.h>
8#include <i2c.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +09009#include <linux/errno.h>
Felipe Balbiee27db32015-01-06 09:14:36 -060010#include <power/pmic.h>
11#include <power/tps62362.h>
12
Igor Opaniukf7c91762021-02-09 13:52:45 +020013#if CONFIG_IS_ENABLED(DM_I2C)
Marek BehĂșn4bebdd32021-05-20 13:23:52 +020014struct udevice *tps62362_dev __section(".data") = NULL;
Jean-Jacques Hiblot77a13972018-12-07 14:50:46 +010015#endif
16
Felipe Balbiee27db32015-01-06 09:14:36 -060017/**
18 * tps62362_voltage_update() - Function to change a voltage level, as this
19 * is a multi-step process.
20 * @reg: Register address to write to
21 * @volt_sel: Voltage register value to write
22 * @return: 0 on success, 1 on failure
23 */
24int tps62362_voltage_update(unsigned char reg, unsigned char volt_sel)
25{
26 if (reg > TPS62362_NUM_REGS)
27 return 1;
28
Igor Opaniukf7c91762021-02-09 13:52:45 +020029#if !CONFIG_IS_ENABLED(DM_I2C)
Felipe Balbiee27db32015-01-06 09:14:36 -060030 return i2c_write(TPS62362_I2C_ADDR, reg, 1, &volt_sel, 1);
Jean-Jacques Hiblot77a13972018-12-07 14:50:46 +010031#else
32 if (!tps62362_dev)
33 return -ENODEV;
34 return dm_i2c_reg_write(tps62362_dev, reg, volt_sel);
35#endif
Felipe Balbiee27db32015-01-06 09:14:36 -060036}
37
Igor Opaniukf7c91762021-02-09 13:52:45 +020038#if !CONFIG_IS_ENABLED(DM_I2C)
Felipe Balbiee27db32015-01-06 09:14:36 -060039int power_tps62362_init(unsigned char bus)
40{
41 static const char name[] = "TPS62362";
42 struct pmic *p = pmic_alloc();
43
44 if (!p) {
45 printf("%s: POWER allocation error!\n", __func__);
46 return -ENOMEM;
47 }
48
49 p->name = name;
50 p->interface = PMIC_I2C;
51 p->number_of_regs = TPS62362_NUM_REGS;
52 p->hw.i2c.addr = TPS62362_I2C_ADDR;
53 p->hw.i2c.tx_num = 1;
54 p->bus = bus;
55
Jean-Jacques Hiblot77a13972018-12-07 14:50:46 +010056 return 0;
57}
58#else
59int power_tps62362_init(unsigned char bus)
60{
61 struct udevice *dev = NULL;
62 int rc;
63
64 rc = i2c_get_chip_for_busnum(bus, TPS62362_I2C_ADDR, 1, &dev);
65 if (rc)
66 return rc;
67 tps62362_dev = dev;
Felipe Balbiee27db32015-01-06 09:14:36 -060068 return 0;
69}
Jean-Jacques Hiblot77a13972018-12-07 14:50:46 +010070#endif