/*
 *  Copyright (C) 2017, Teknique Ltd.
 *
 *  This program is free software; you can redistribute it and/or modify it
 *  under  the terms of the GNU General  Public License as published by the
 *  Free Software Foundation;  either version 2 of the License, or (at your
 *  option) any later version.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#ifndef __LINUX_POWER_NEST_RQ_BATTERY_H__
#define __LINUX_POWER_NEST_RQ_BATTERY_H__

#include <linux/power_supply.h>
#include <linux/types.h>

struct nest_rq_battery {
	struct device* dev;
	const struct nest_rq_battery_platform_data *pdata;
	spinlock_t lock;

	struct power_supply battery;
	struct power_supply charger;
};

/**
 * struct nest_vega_battery_platform_data - platform_data for gpio_charger devices
 * @name:		Name for the chargers power_supply device
 * @supplied_to:	Array of battery names to which this chargers supplies power
 * @num_supplicants:		Number of entries in the supplied_to array
 * @vmax_gpio:				GPIO which is used to set the Vsys voltage
 * @status_gpio:			GPIO which is used to indicate the charger status
 * @adc_enable_gpio:		GPIO which is used to en/disable the adcs
 * @temp_adc_chan:			ADC channel for reading battery NTC
 * @volt_adc_chan:			ADC channel for reading battery voltage
 * @charger_disable_gpio:	GPIO which is used to en/disable the charger
 * @charger_rate_gpio:		GPIO which is used to toggle the charger current
 * @vbridge_adc_chan:		ADC channel for reading the vbridge voltage
 */
struct nest_rq_battery_platform_data {
	const char *name;

	char **supplied_to;
	size_t num_supplicants;

	//Battery
	u32 disconnect_gpio;
	u32 vmax_gpio;
	u32 status_gpio;
	u32 adc_enable_gpio;
	u32 heater_enable_gpio;
	u32 temp_adc_chan;
	u32 volt_adc_chan;
	//Charger
	u32 charger_enable_gpio;
	u32 charger_rate_gpio;
	//Vbridge
	u32 vbridge_adc_chan;
	u32 vbridge_disable_gpio;
	u32 acok_gpio;
};

extern struct nest_rq_battery *nest_rq_battery;

void nest_rq_battery_vbridge_disable(struct nest_rq_battery *batt, int state);
int nest_rq_battery_get_voltage(struct nest_rq_battery *batt);
int nest_rq_battery_get_temp(struct nest_rq_battery *batt, int *temp);

#endif //__LINUX_POWER_NEST_RQ_BATTERY_H__
