/*
* arch/arm/mach-tegra/board-pluto-powermon.c
*
* Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope 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 .
*
*/
#include
#include
#include
#include
#include "board.h"
#include "board-pluto.h"
#define PRECISION_MULTIPLIER_PLUTO 1000
enum {
UNUSED_RAIL,
};
enum {
VDD_SYS_SUM,
VDD_SYS_SMPS123,
VDD_SYS_SMPS45,
VDD_SYS_SMPS6,
VDD_SYS_SMPS7,
VDD_SYS_SMPS8,
VDD_SYS_BL,
VDD_SYS_LDO8,
VDD_MMC_LDO9,
VDD_5V0_LDOUSB,
VDD_1V8_AP,
VDD_MMC_LCD,
VDDIO_HSIC_BB,
AVDD_PLL_BB,
};
enum {
AVDD_1V05_LDO1,
VDDIO_1V8_BB,
};
static struct ina219_platform_data power_mon_info_0[] = {
/* All unused INA219 devices use below data*/
[UNUSED_RAIL] = {
.calibration_data = 0x369c,
.power_lsb = 3.051979018 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "unused_rail",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
};
static struct ina230_platform_data power_mon_info_1[] = {
[VDD_SYS_SUM] = {
.calibration_data = 0x369c,
.power_lsb = 3.051979018 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_SYS_SUM",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_SYS_SMPS123] = {
.calibration_data = 0x2bb0,
.power_lsb = 2.288984263 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_SYS_SMPS123",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_SYS_SMPS45] = {
.calibration_data = 0x4188,
.power_lsb = 1.525989509 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_SYS_SMPS45",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_SYS_SMPS6] = {
.calibration_data = 0x2bb0,
.power_lsb = 0.381497377 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_SYS_SMPS6",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_SYS_SMPS7] = {
.calibration_data = 0x2bb0,
.power_lsb = 0.228898426 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_SYS_SMPS7",
.resistor = 50,
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_SYS_SMPS8] = {
.calibration_data = 0x2bb0,
.power_lsb = 0.228898426 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_SYS_SMPS8",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_SYS_BL] = {
.calibration_data = 0x4188,
.power_lsb = 0.152598951 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_SYS_BL",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_SYS_LDO8] = {
.calibration_data = 0x2d82,
.power_lsb = 0.054935622 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_SYS_LDO8",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_MMC_LDO9] = {
.calibration_data = 0x51ea,
.power_lsb = 0.03051979 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_MMC_LDO9",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_5V0_LDOUSB] = {
.calibration_data = 0x2f7d,
.power_lsb = 0.052644567 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_5V0_LDOUSB",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_1V8_AP] = {
.calibration_data = 0x4feb,
.power_lsb = 0.125128305 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_1V8_AP",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDD_MMC_LCD] = {
.calibration_data = 0x346d,
.power_lsb = 0.047686462 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDD_MMC_LCD",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDDIO_HSIC_BB] = {
.calibration_data = 0x6d39,
.power_lsb = 0.00915561 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDDIO_HSIC_BB",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[AVDD_PLL_BB] = {
.calibration_data = 0x7fff,
.power_lsb = 0.007812738 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "AVDD_PLL_BB",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
};
static struct ina230_platform_data power_mon_info_2[] = {
[AVDD_1V05_LDO1] = {
.calibration_data = 0x7fff,
.power_lsb = 0.195318461 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "AVDD_1V05_LDO1",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
[VDDIO_1V8_BB] = {
.calibration_data = 0x7fff,
.power_lsb = 0.078127384 * PRECISION_MULTIPLIER_PLUTO,
.rail_name = "VDDIO_1V8_BB",
.divisor = 25,
.precision_multiplier = PRECISION_MULTIPLIER_PLUTO,
},
};
enum {
INA_I2C_2_0_ADDR_40,
INA_I2C_2_0_ADDR_41,
INA_I2C_2_0_ADDR_42,
INA_I2C_2_0_ADDR_43,
};
enum {
INA_I2C_2_1_ADDR_40,
INA_I2C_2_1_ADDR_41,
INA_I2C_2_1_ADDR_42,
INA_I2C_2_1_ADDR_43,
INA_I2C_2_1_ADDR_44,
INA_I2C_2_1_ADDR_45,
INA_I2C_2_1_ADDR_46,
INA_I2C_2_1_ADDR_47,
INA_I2C_2_1_ADDR_48,
INA_I2C_2_1_ADDR_49,
INA_I2C_2_1_ADDR_4B,
INA_I2C_2_1_ADDR_4C,
INA_I2C_2_1_ADDR_4E,
INA_I2C_2_1_ADDR_4F,
};
enum {
INA_I2C_2_2_ADDR_49,
INA_I2C_2_2_ADDR_4C,
};
static struct i2c_board_info pluto_i2c2_0_ina219_board_info[] = {
[INA_I2C_2_0_ADDR_40] = {
I2C_BOARD_INFO("ina219", 0x40),
.platform_data = &power_mon_info_0[UNUSED_RAIL],
.irq = -1,
},
[INA_I2C_2_0_ADDR_41] = {
I2C_BOARD_INFO("ina219", 0x41),
.platform_data = &power_mon_info_0[UNUSED_RAIL],
.irq = -1,
},
[INA_I2C_2_0_ADDR_42] = {
I2C_BOARD_INFO("ina219", 0x42),
.platform_data = &power_mon_info_0[UNUSED_RAIL],
.irq = -1,
},
[INA_I2C_2_0_ADDR_43] = {
I2C_BOARD_INFO("ina219", 0x43),
.platform_data = &power_mon_info_0[UNUSED_RAIL],
.irq = -1,
},
};
static struct i2c_board_info pluto_i2c2_1_ina230_board_info[] = {
[INA_I2C_2_1_ADDR_40] = {
I2C_BOARD_INFO("ina230", 0x40),
.platform_data = &power_mon_info_1[VDD_SYS_SUM],
.irq = -1,
},
[INA_I2C_2_1_ADDR_41] = {
I2C_BOARD_INFO("ina230", 0x41),
.platform_data = &power_mon_info_1[VDD_SYS_SMPS123],
.irq = -1,
},
[INA_I2C_2_1_ADDR_42] = {
I2C_BOARD_INFO("ina230", 0x42),
.platform_data = &power_mon_info_1[VDD_SYS_SMPS45],
.irq = -1,
},
[INA_I2C_2_1_ADDR_43] = {
I2C_BOARD_INFO("ina230", 0x43),
.platform_data = &power_mon_info_1[VDD_SYS_SMPS6],
.irq = -1,
},
[INA_I2C_2_1_ADDR_44] = {
I2C_BOARD_INFO("ina230", 0x44),
.platform_data = &power_mon_info_1[VDD_SYS_SMPS7],
.irq = -1,
},
[INA_I2C_2_1_ADDR_45] = {
I2C_BOARD_INFO("ina230", 0x45),
.platform_data = &power_mon_info_1[VDD_SYS_SMPS8],
.irq = -1,
},
[INA_I2C_2_1_ADDR_46] = {
I2C_BOARD_INFO("ina230", 0x46),
.platform_data = &power_mon_info_1[VDD_SYS_BL],
.irq = -1,
},
[INA_I2C_2_1_ADDR_47] = {
I2C_BOARD_INFO("ina230", 0x47),
.platform_data = &power_mon_info_1[VDD_SYS_LDO8],
.irq = -1,
},
[INA_I2C_2_1_ADDR_48] = {
I2C_BOARD_INFO("ina230", 0x48),
.platform_data = &power_mon_info_1[VDD_MMC_LDO9],
.irq = -1,
},
[INA_I2C_2_1_ADDR_49] = {
I2C_BOARD_INFO("ina230", 0x49),
.platform_data = &power_mon_info_1[VDD_5V0_LDOUSB],
.irq = -1,
},
[INA_I2C_2_1_ADDR_4B] = {
I2C_BOARD_INFO("ina230", 0x4B),
.platform_data = &power_mon_info_1[VDD_1V8_AP],
.irq = -1,
},
[INA_I2C_2_1_ADDR_4C] = {
I2C_BOARD_INFO("ina230", 0x4C),
.platform_data = &power_mon_info_1[VDD_MMC_LCD],
.irq = -1,
},
[INA_I2C_2_1_ADDR_4E] = {
I2C_BOARD_INFO("ina230", 0x4E),
.platform_data = &power_mon_info_1[VDDIO_HSIC_BB],
.irq = -1,
},
[INA_I2C_2_1_ADDR_4F] = {
I2C_BOARD_INFO("ina230", 0x4F),
.platform_data = &power_mon_info_1[AVDD_PLL_BB],
.irq = -1,
},
};
static struct i2c_board_info pluto_i2c2_2_ina230_board_info[] = {
[INA_I2C_2_2_ADDR_49] = {
I2C_BOARD_INFO("ina230", 0x49),
.platform_data = &power_mon_info_2[AVDD_1V05_LDO1],
.irq = -1,
},
[INA_I2C_2_2_ADDR_4C] = {
I2C_BOARD_INFO("ina230", 0x4C),
.platform_data = &power_mon_info_2[VDDIO_1V8_BB],
.irq = -1,
},
};
static struct pca954x_platform_mode pluto_pca954x_modes[] = {
{ .adap_id = PCA954x_I2C_BUS0, .deselect_on_exit = true, },
{ .adap_id = PCA954x_I2C_BUS1, .deselect_on_exit = true, },
{ .adap_id = PCA954x_I2C_BUS2, .deselect_on_exit = true, },
{ .adap_id = PCA954x_I2C_BUS3, .deselect_on_exit = true, },
};
static struct pca954x_platform_data pluto_pca954x_data = {
.modes = pluto_pca954x_modes,
.num_modes = ARRAY_SIZE(pluto_pca954x_modes),
};
static const struct i2c_board_info pluto_i2c2_board_info[] = {
{
I2C_BOARD_INFO("pca9546", 0x71),
.platform_data = &pluto_pca954x_data,
},
};
int __init pluto_pmon_init(void)
{
i2c_register_board_info(1, pluto_i2c2_board_info,
ARRAY_SIZE(pluto_i2c2_board_info));
i2c_register_board_info(PCA954x_I2C_BUS0,
pluto_i2c2_0_ina219_board_info,
ARRAY_SIZE(pluto_i2c2_0_ina219_board_info));
i2c_register_board_info(PCA954x_I2C_BUS1,
pluto_i2c2_1_ina230_board_info,
ARRAY_SIZE(pluto_i2c2_1_ina230_board_info));
i2c_register_board_info(PCA954x_I2C_BUS2,
pluto_i2c2_2_ina230_board_info,
ARRAY_SIZE(pluto_i2c2_2_ina230_board_info));
return 0;
}