/*
 * Copyright (C) 2013 Samsung Electronics
 * Piotr Wilczek <p.wilczek@samsung.com>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <common.h>
#include <power/pmic.h>
#include <power/max77693_pmic.h>
#include <i2c.h>
#include <errno.h>

static int max77693_charger_state(struct pmic *p, int state, int current)
{
	unsigned int val;

	if (pmic_probe(p))
		return -1;

	/* unlock write capability */
	val = MAX77693_CHG_UNLOCK;
	pmic_reg_write(p, MAX77693_CHG_CNFG_06, val);

	if (state == CHARGER_DISABLE) {
		puts("Disable the charger.\n");
		pmic_reg_read(p, MAX77693_CHG_CNFG_00, &val);
		val &= ~0x01;
		pmic_reg_write(p, MAX77693_CHG_CNFG_00, val);
		return -1;
	}

	if (current < CHARGER_MIN_CURRENT || current > CHARGER_MAX_CURRENT) {
		printf("%s: Wrong charge current: %d [mA]\n",
		       __func__, current);
		return -1;
	}

	/* set charging current */
	pmic_reg_read(p, MAX77693_CHG_CNFG_02, &val);
	val &= ~MAX77693_CHG_CC;
	val |= current * 10 / 333;	/* 0.1A/3 steps */
	pmic_reg_write(p, MAX77693_CHG_CNFG_02, val);

	/* enable charging */
	val = MAX77693_CHG_MODE_ON;
	pmic_reg_write(p, MAX77693_CHG_CNFG_00, val);

	/* check charging current */
	pmic_reg_read(p, MAX77693_CHG_CNFG_02, &val);
	val &= 0x3f;
	printf("Enable the charger @ %d [mA]\n", val * 333 / 10);

	return 0;
}

static int max77693_charger_bat_present(struct pmic *p)
{
	unsigned int val;

	if (pmic_probe(p))
		return -1;

	pmic_reg_read(p, MAX77693_CHG_INT_OK, &val);

	return !(val & MAX77693_CHG_DETBAT);
}

static struct power_chrg power_chrg_pmic_ops = {
	.chrg_bat_present = max77693_charger_bat_present,
	.chrg_state = max77693_charger_state,
};

int pmic_init_max77693(unsigned char bus)
{
	static const char name[] = "MAX77693_PMIC";
	struct pmic *p = pmic_alloc();

	if (!p) {
		printf("%s: POWER allocation error!\n", __func__);
		return -ENOMEM;
	}

	debug("Board PMIC init\n");

	p->name = name;
	p->interface = PMIC_I2C;
	p->number_of_regs = PMIC_NUM_OF_REGS;
	p->hw.i2c.addr = MAX77693_PMIC_I2C_ADDR;
	p->hw.i2c.tx_num = 1;
	p->bus = bus;

	p->chrg = &power_chrg_pmic_ops;

	return 0;
}
