blob: 4f0e406d560626d28950859c32757306c0d07126 [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
Felipe Balbiee27db32015-01-06 09:14:36 -06007#include <i2c.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +09008#include <linux/errno.h>
Felipe Balbiee27db32015-01-06 09:14:36 -06009#include <power/pmic.h>
10#include <power/tps62362.h>
11
Igor Opaniukf7c91762021-02-09 13:52:45 +020012#if CONFIG_IS_ENABLED(DM_I2C)
Marek BehĂșn4bebdd32021-05-20 13:23:52 +020013struct udevice *tps62362_dev __section(".data") = NULL;
Jean-Jacques Hiblot77a13972018-12-07 14:50:46 +010014#endif
15
Felipe Balbiee27db32015-01-06 09:14:36 -060016/**
17 * tps62362_voltage_update() - Function to change a voltage level, as this
18 * is a multi-step process.
19 * @reg: Register address to write to
20 * @volt_sel: Voltage register value to write
21 * @return: 0 on success, 1 on failure
22 */
23int tps62362_voltage_update(unsigned char reg, unsigned char volt_sel)
24{
25 if (reg > TPS62362_NUM_REGS)
26 return 1;
27
Igor Opaniukf7c91762021-02-09 13:52:45 +020028#if !CONFIG_IS_ENABLED(DM_I2C)
Felipe Balbiee27db32015-01-06 09:14:36 -060029 return i2c_write(TPS62362_I2C_ADDR, reg, 1, &volt_sel, 1);
Jean-Jacques Hiblot77a13972018-12-07 14:50:46 +010030#else
31 if (!tps62362_dev)
32 return -ENODEV;
33 return dm_i2c_reg_write(tps62362_dev, reg, volt_sel);
34#endif
Felipe Balbiee27db32015-01-06 09:14:36 -060035}
36
Igor Opaniukf7c91762021-02-09 13:52:45 +020037#if !CONFIG_IS_ENABLED(DM_I2C)
Felipe Balbiee27db32015-01-06 09:14:36 -060038int power_tps62362_init(unsigned char bus)
39{
40 static const char name[] = "TPS62362";
41 struct pmic *p = pmic_alloc();
42
43 if (!p) {
44 printf("%s: POWER allocation error!\n", __func__);
45 return -ENOMEM;
46 }
47
48 p->name = name;
49 p->interface = PMIC_I2C;
50 p->number_of_regs = TPS62362_NUM_REGS;
51 p->hw.i2c.addr = TPS62362_I2C_ADDR;
52 p->hw.i2c.tx_num = 1;
53 p->bus = bus;
54
Jean-Jacques Hiblot77a13972018-12-07 14:50:46 +010055 return 0;
56}
57#else
58int power_tps62362_init(unsigned char bus)
59{
60 struct udevice *dev = NULL;
61 int rc;
62
63 rc = i2c_get_chip_for_busnum(bus, TPS62362_I2C_ADDR, 1, &dev);
64 if (rc)
65 return rc;
66 tps62362_dev = dev;
Felipe Balbiee27db32015-01-06 09:14:36 -060067 return 0;
68}
Jean-Jacques Hiblot77a13972018-12-07 14:50:46 +010069#endif