/*
 * arch/arm/mach-tegra/board-cardhu-powermon.c
 *
 * Copyright (c) 2011-2013, NVIDIA, All Rights Reserved.
 *
 * 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 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#include <linux/i2c.h>
#include <linux/ina219.h>

#include "board.h"
#include "board-cardhu.h"

enum {
	VDD_AC_BAT,
	VDD_DRAM_IN,
	VDD_BACKLIGHT_IN,
	VDD_CPU_IN,
	VDD_CORE_IN,
	VDD_DISPLAY_IN,
	VDD_3V3_TEGRA,
	VDD_OTHER_PMU_IN,
	VDD_1V8_TEGRA,
	VDD_1V8_OTHER,
	UNUSED_RAIL,
};

static struct ina219_platform_data power_mon_info[] = {
	[VDD_AC_BAT] = {
		.calibration_data  = 0xa000,
		.power_lsb = 2,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "VDD_AC_BAT",
		.divisor = 20,
		.shunt_resistor = 10, /*mOhms*/
	},

	[VDD_DRAM_IN] = {
		.calibration_data  = 0xa000,
		.power_lsb = 2,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "VDD_DRAM_IN",
		.divisor = 20,
		.shunt_resistor = 10,
	},

	[VDD_BACKLIGHT_IN] = {
		.calibration_data  = 0x6aaa,
		.power_lsb = 1,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "VDD_BACKLIGHT_IN",
		.divisor = 20,
		.shunt_resistor = 30,
	},

	[VDD_CPU_IN] = {
		.calibration_data  = 0xa000,
		.power_lsb = 1,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "VDD_CPU_IN",
		.divisor = 20,
		.shunt_resistor = 20,
	},

	[VDD_CORE_IN] = {
		.calibration_data  = 0x6aaa,
		.power_lsb = 1,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "VDD_CORE_IN",
		.divisor = 20,
		.shunt_resistor = 30,
	},

	[VDD_DISPLAY_IN] = {
		.calibration_data  = 0x4000,
		.power_lsb = 1,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "VDD_DISPLAY_IN",
		.divisor = 20,
		.shunt_resistor = 50,
	},

	[VDD_3V3_TEGRA] = {
		.calibration_data  = 0x6aaa,
		.power_lsb = 1,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "VDD_3V3_TEGRA",
		.divisor = 20,
		.shunt_resistor = 30,
	},

	[VDD_OTHER_PMU_IN] = {
		.calibration_data  = 0xa000,
		.power_lsb = 1,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "VDD_OTHER_PMU_IN",
		.divisor = 20,
		.shunt_resistor = 20,
	},

	[VDD_1V8_TEGRA] = {
		.calibration_data  = 0x4000,
		.power_lsb = 1,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "VDD_1V8_TEGRA",
		.divisor = 20,
		.shunt_resistor = 50,
	},

	[VDD_1V8_OTHER] = {
		.calibration_data  = 0xa000,
		.power_lsb = 1,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "VDD_1V8_OTHER",
		.divisor = 20,
		.shunt_resistor = 10,
	},

	/* All unused INA219 devices use below data*/
	[UNUSED_RAIL] = {
		.calibration_data  = 0x4000,
		.power_lsb = 1,
		.cont_conf = 0x3FFF,
		.trig_conf = 0x1DF,
		.rail_name = "unused_rail",
		.divisor = 20,
		.shunt_resistor = 10,
	},
};

enum {
	INA_I2C_ADDR_40,
	INA_I2C_ADDR_41,
	INA_I2C_ADDR_42,
	INA_I2C_ADDR_43,
	INA_I2C_ADDR_44,
	INA_I2C_ADDR_45,
	INA_I2C_ADDR_46,
	INA_I2C_ADDR_47,
	INA_I2C_ADDR_48,
	INA_I2C_ADDR_49,
	INA_I2C_ADDR_4A,
	INA_I2C_ADDR_4B,
	INA_I2C_ADDR_4C,
	INA_I2C_ADDR_4D,
	INA_I2C_ADDR_4E,
	INA_I2C_ADDR_4F,
};

static struct i2c_board_info cardhu_i2c0_ina219_board_info[] = {
	[INA_I2C_ADDR_40] = {
		I2C_BOARD_INFO("ina219", 0x40),
		.platform_data = &power_mon_info[VDD_AC_BAT],
		.irq = -1,
	},

	[INA_I2C_ADDR_41] = {
		I2C_BOARD_INFO("ina219", 0x41),
		.platform_data = &power_mon_info[VDD_DRAM_IN],
		.irq = -1,
	},

	[INA_I2C_ADDR_42] = {
		I2C_BOARD_INFO("ina219", 0x42),
		.platform_data = &power_mon_info[VDD_BACKLIGHT_IN],
		.irq = -1,
	},

	[INA_I2C_ADDR_43] = {
		I2C_BOARD_INFO("ina219", 0x43),
		.platform_data = &power_mon_info[VDD_CPU_IN],
		.irq = -1,
	},

	[INA_I2C_ADDR_44] = {
		I2C_BOARD_INFO("ina219", 0x44),
		.platform_data = &power_mon_info[VDD_CORE_IN],
		.irq = -1,
	},

	[INA_I2C_ADDR_45] = {
		I2C_BOARD_INFO("ina219", 0x45),
		.platform_data = &power_mon_info[VDD_DISPLAY_IN],
		.irq = -1,
	},

	[INA_I2C_ADDR_46] = {
		I2C_BOARD_INFO("ina219", 0x46),
		.platform_data = &power_mon_info[VDD_3V3_TEGRA],
		.irq = -1,
	},

	[INA_I2C_ADDR_47] = {
		I2C_BOARD_INFO("ina219", 0x47),
		.platform_data = &power_mon_info[VDD_OTHER_PMU_IN],
		.irq = -1,
	},

	[INA_I2C_ADDR_48] = {
		I2C_BOARD_INFO("ina219", 0x48),
		.platform_data = &power_mon_info[VDD_1V8_TEGRA],
		.irq = -1,
	},

	[INA_I2C_ADDR_49] = {
		I2C_BOARD_INFO("ina219", 0x49),
		.platform_data = &power_mon_info[VDD_1V8_OTHER],
		.irq = -1,
	},

	[INA_I2C_ADDR_4A] = {
		I2C_BOARD_INFO("ina219", 0x4A),
		.platform_data = &power_mon_info[UNUSED_RAIL],
		.irq = -1,
	},

	[INA_I2C_ADDR_4B] = {
		I2C_BOARD_INFO("ina219", 0x4B),
		.platform_data = &power_mon_info[UNUSED_RAIL],
		.irq = -1,
	},

	[INA_I2C_ADDR_4C] = {
		I2C_BOARD_INFO("ina219", 0x4C),
		.platform_data = &power_mon_info[UNUSED_RAIL],
		.irq = -1,
	},

	[INA_I2C_ADDR_4D] = {
		I2C_BOARD_INFO("ina219", 0x4D),
		.platform_data = &power_mon_info[UNUSED_RAIL],
		.irq = -1,
	},

	[INA_I2C_ADDR_4E] = {
		I2C_BOARD_INFO("ina219", 0x4E),
		.platform_data = &power_mon_info[UNUSED_RAIL],
		.irq = -1,
	},

	[INA_I2C_ADDR_4F] = {
		I2C_BOARD_INFO("ina219", 0x4F),
		.platform_data = &power_mon_info[UNUSED_RAIL],
		.irq = -1,
	},
};

int __init cardhu_pmon_init(void)
{
	struct board_info bi;

	tegra_get_board_info(&bi);

	/* for fab A04 VDD_CORE_IN changed from ina with addr 0x44 to 0x4A */
	if (bi.fab == BOARD_FAB_A04) {
		cardhu_i2c0_ina219_board_info[INA_I2C_ADDR_44].platform_data =
			&power_mon_info[UNUSED_RAIL];
		cardhu_i2c0_ina219_board_info[INA_I2C_ADDR_4A].platform_data =
			&power_mon_info[VDD_CORE_IN];
	}

	if (bi.board_id != BOARD_PM269 || bi.board_id != BOARD_PM315) {
		i2c_register_board_info(0, cardhu_i2c0_ina219_board_info,
			ARRAY_SIZE(cardhu_i2c0_ina219_board_info));
	}

	return 0;
}

