blob: 8e0dba4650c33c9176bc0d644d7ad73391d3e9b1 [file] [log] [blame]
/* Copyright (c) 2016, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _PM_VADC_HC_H_
#define PM_VADC_HC_H_
#include <sys/types.h>
#include <bits.h>
/* HC_ peripheral */
#define HC_STATUS1 0x8
#define HC_DATA_HOLD_CTL 0x3f
#define HC_DATA_HOLD_CTL_FIELD BIT(1)
#define HC_ADC_DIG_PARAM 0x42
#define HC_CAL_VAL BIT(6)
#define HC_CAL_VAL_SHIFT 6
#define HC_CAL_SEL_MASK 0x30
#define HC_CAL_SEL_SHIFT 4
#define HC_DEC_RATIO_SEL 0xc
#define HC_DEC_RATIO_SHIFT 2
#define HC_FAST_AVG_CTL 0x43
#define HC_FAST_AVG_SAMPLES_MASK 0x7
#define HC_ADC_CH_SEL_CTL 0x44
#define HC_DELAY_CTL 0x45
#define HC_DELAY_CTL_MASK 0xf
#define HC_EN_CTL1 0x46
#define HC_ADC_EN BIT(7)
#define HC_CONV_REQ 0x47
#define HC_CONV_REQ_START BIT(7)
#define HC_DATA0 0x50
#define HC_DATA1 0x51
#define HC_DATA_CHECK_USR 0x8000
#define HC_CONV_TIME 250
#define HC_ERR_COUNT 1600
#define HC_VREF_CODE 0x4000
enum adc_type {
PM_VADC_HC = 0,
PMI_VADC_HC = 1,
VADC_INVALID
};
struct adc_dev {
enum adc_type adc_type;
};
enum adc_fast_avg_sample {
AVG_1_SAMPLE = 0,
AVG_2_SAMPLES,
AVG_4_SAMPLES,
AVG_8_SAMPLES,
AVG_16_SAMPLES,
AVG_SAMPLES_INVALID
};
enum adc_channel_prediv_type {
SCALE_DIV1 = 0,
SCALE_DIV3,
SCALE_DIV4,
SCALE_DIV6,
SCALE_DIV20,
SCALE_DIV8,
SCALE10_DIV81,
SCALE_DIV10,
};
struct adc_pre_scale_ratio {
uint8_t num;
uint8_t den;
};
enum adc_dig_cal_sel {
HC_NO_CAL = 0,
HC_RATIO_CAL,
HC_ABS_CAL,
HC_CAL_INVALID
};
enum adc_hc_channel {
HC_VREF_GND = 0,
HC_CALIB_VREF_1P25 = 1,
HC_CALIB_VREF = 2,
HC_CALIB_VREF_1_DIV_3 = 0x82,
HC_VPH_PWR = 0x83,
HC_VBAT_SNS = 0x84,
HC_VCOIN = 0x85,
HC_DIE_TEMP = 6,
HC_CHG_TEMP = 7,
HC_USB_IN = 8,
HC_IREG_FB = 9,
/* External input connection */
HC_BAT_THERM = 0xa,
HC_BAT_ID = 0xb,
HC_XO_THERM = 0xc,
HC_AMUX_THM1 = 0xd,
HC_AMUX_THM2 = 0xe,
HC_AMUX_THM3 = 0xf,
HC_AMUX_THM4 = 0x10,
HC_AMUX_THM5 = 0x11,
HC_AMUX1_GPIO = 0x12,
HC_AMUX2_GPIO = 0x13,
HC_AMUX3_GPIO = 0x14,
HC_AMUX4_GPIO = 0x15,
HC_AMUX5_GPIO = 0x16,
HC_AMUX6_GPIO = 0x17,
HC_AMUX7_GPIO = 0x18,
HC_AMUX8_GPIO = 0x19,
HC_ATEST1 = 0x1a,
HC_ATEST2 = 0x1b,
HC_ATEST3 = 0x1c,
HC_ATEST4 = 0x1d,
HC_OFF = 0xff,
/* PU1 is 30K pull up */
HC_BAT_THERM_PU1 = 0x2a,
HC_BAT_ID_PU1 = 0x2b,
HC_XO_THERM_PU1 = 0x2c,
HC_AMUX_THM1_PU1 = 0x2d,
HC_AMUX_THM2_PU1 = 0x2e,
HC_AMUX_THM3_PU1 = 0x2f,
HC_AMUX_THM4_PU1 = 0x30,
HC_AMUX_THM5_PU1 = 0x31,
HC_AMUX1_GPIO_PU1 = 0x32,
HC_AMUX2_GPIO_PU1 = 0x33,
HC_AMUX3_GPIO_PU1 = 0x34,
HC_AMUX4_GPIO_PU1 = 0x35,
HC_AMUX5_GPIO_PU1 = 0x36,
HC_AMUX6_GPIO_PU1 = 0x37,
HC_AMUX7_GPIO_PU1 = 0x38,
HC_AMUX8_GPIO_PU1 = 0x39,
/* PU2 is 100K pull up */
HC_BAT_THERM_PU2 = 0x4a,
HC_BAT_ID_PU2 = 0x4b,
HC_XO_THERM_PU2 = 0x4c,
HC_AMUX_THM1_PU2 = 0x4d,
HC_AMUX_THM2_PU2 = 0x4e,
HC_AMUX_THM3_PU2 = 0x4f,
HC_AMUX_THM4_PU2 = 0x50,
HC_AMUX_THM5_PU2 = 0x51,
HC_AMUX1_GPIO_PU2 = 0x52,
HC_AMUX2_GPIO_PU2 = 0x53,
HC_AMUX3_GPIO_PU2 = 0x54,
HC_AMUX4_GPIO_PU2 = 0x55,
HC_AMUX5_GPIO_PU2 = 0x56,
HC_AMUX6_GPIO_PU2 = 0x57,
HC_AMUX7_GPIO_PU2 = 0x58,
HC_AMUX8_GPIO_PU2 = 0x59,
/* PU3 is 400K pull up */
HC_BAT_THERM_PU3 = 0x6a,
HC_BAT_ID_PU3 = 0x6b,
HC_XO_THERM_PU3 = 0x6c,
HC_AMUX_THM1_PU3 = 0x6d,
HC_AMUX_THM2_PU3 = 0x6e,
HC_AMUX_THM3_PU3 = 0x6f,
HC_AMUX_THM4_PU3 = 0x70,
HC_AMUX_THM5_PU3 = 0x71,
HC_AMUX1_GPIO_PU3 = 0x72,
HC_AMUX2_GPIO_PU3 = 0x73,
HC_AMUX3_GPIO_PU3 = 0x74,
HC_AMUX4_GPIO_PU3 = 0x75,
HC_AMUX5_GPIO_PU3 = 0x76,
HC_AMUX6_GPIO_PU3 = 0x77,
HC_AMUX7_GPIO_PU3 = 0x78,
HC_AMUX8_GPIO_PU3 = 0x79,
/* External input connection with 1/3 div */
HC_AMUX1_GPIO_DIV_3 = 0x92,
HC_AMUX2_GPIO_DIV_3 = 0x93,
HC_AMUX3_GPIO_DIV_3 = 0x94,
HC_AMUX4_GPIO_DIV_3 = 0x95,
HC_AMUX5_GPIO_DIV_3 = 0x96,
HC_AMUX6_GPIO_DIV_3 = 0x97,
HC_AMUX7_GPIO_DIV_3 = 0x98,
HC_AMUX8_GPIO_DIV_3 = 0x99,
HC_ATEST1_DIV_3 = 0x9a,
HC_ATEST2_DIV_3 = 0x9b,
HC_ATEST3_DIV_3 = 0x9c,
HC_ATEST4_DIV_3 = 0x9d,
HC_INVALID = 0xffff
};
enum adc_usr_delay_ctl {
HC_HW_SETTLE_DELAY_0US = 0,
HC_HW_SETTLE_DELAY_100US,
HC_HW_SETTLE_DELAY_200US,
HC_HW_SETTLE_DELAY_300US,
HC_HW_SETTLE_DELAY_400US,
HC_HW_SETTLE_DELAY_500US,
HC_HW_SETTLE_DELAY_600US,
HC_HW_SETTLE_DELAY_700US,
HC_HW_SETTLE_DELAY_800US,
HC_HW_SETTLE_DELAY_900US,
HC_HW_SETTLE_DELAY_1MS,
HC_HW_SETTLE_DELAY_2MS,
HC_HW_SETTLE_DELAY_4MS,
HC_HW_SETTLE_DELAY_6MS,
HC_HW_SETTLE_DELAY_8MS,
HC_HW_SETTLE_DELAY_10MS,
HC_HW_SETTLE_DELAY_INVALID
};
struct adc_result {
uint16_t adc_code;
int64_t physical;
};
int vadc_hc_read(struct adc_dev *dev, enum adc_hc_channel channel,
struct adc_result *result);
#endif /* _PM_VADC_HC_H_ */