1// SPDX-License-Identifier: GPL-2.0+
2/*
3 *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95@gmail.com>
4 */
5
6#include <dm.h>
7#include <i2c.h>
8#include <errno.h>
9#include <sysreset.h>
10#include <power/pmic.h>
11#include <power/palmas.h>
12
13static int palmas_sysreset_request(struct udevice *dev,
14				   enum sysreset_t type)
15{
16	struct palmas_priv *priv = dev_get_priv(dev->parent);
17	int ret;
18
19	/*
20	 * Mask INT3 on second page which detects vbus
21	 * or device will immediately turn on.
22	 */
23	ret = dm_i2c_reg_clrset(priv->chip2, PALMAS_INT3_MASK,
24				MASK_VBUS, MASK_VBUS);
25	if (ret < 0)
26		return ret;
27
28	switch (type) {
29	case SYSRESET_POWER:
30		/* PALMAS: SW_RST > DEV_CTRL */
31		pmic_reg_write(dev->parent, PALMAS_DEV_CTRL, SW_RST);
32		break;
33	case SYSRESET_POWER_OFF:
34		/* PALMAS: DEV_OFF > DEV_CTRL */
35		pmic_reg_write(dev->parent, PALMAS_DEV_CTRL, DEV_OFF);
36		break;
37	default:
38		return -EPROTONOSUPPORT;
39	}
40
41	return -EINPROGRESS;
42}
43
44static struct sysreset_ops palmas_sysreset = {
45	.request = palmas_sysreset_request,
46};
47
48U_BOOT_DRIVER(sysreset_palmas) = {
49	.id	= UCLASS_SYSRESET,
50	.name	= PALMAS_RST_DRIVER,
51	.ops	= &palmas_sysreset,
52};
53