iBoot/drivers/dialog/pmu/d2355.h

845 lines
25 KiB
C

/* Euphrates / Arno
* <rdar://problem/18528237> Euphrates: Specification and Data-sheet from Vendor (Dialog)
*
* NOTE: Arno is d2370
*
* Copyright (C) 2014 Apple Inc. All rights reserved.
*
* This document is the property of Apple Inc.
* It is considered confidential and proprietary.
*
* This document may not be reproduced or transmitted in any form,
* in whole or in part, without the express written permission of
* Apple Inc.
*/
#ifndef __DIALOG_D2355_H
#define __DIALOG_D2355_H
#define PMU_HAS_SWI 0
#define PMU_HAS_DWI 0
#define PMU_HAS_LCM_LDO 0
#define PMU_HAS_BIST_ADC 0
#define PMU_HAS_CHG_ABCC_FLAG 1
#define PMU_HAS_VIB 0
#define PMU_HAS_RAM 0
#define PMU_HAS_WLED 0
#define PMU_HAS_32K_RTC 0
// TODO: enable accumulators
#define PMU_HAS_ACCUMULATORS 0
#define PMU_HAS_SYS 0
#define PMU_HAS_WDT 0
#define PMU_HAS_CHARGER 1
#define PMU_HAS_ISET_BAT_2BYTES 1
#define PMU_DRV_NEW_DRIVER 1
enum {
kDIALOG_ADDR_R = 0xeb,
kDIALOG_ADDR_W = 0xea,
kDIALOG_REG_BYTES = 2,
};
enum {
kDIALOG_EVENT_COUNT = 10,
kDIALOG_STATUS_COUNT = 10,
kDIALOG_FAULTLOG_COUNT = 3,
kDIALOG_CHIPID_COUNT = 9,
kDIALOG_GPIO_COUNT = 8,
};
#include "dCommon.h"
// ---------------------------------
// Chip Identification
// ---------------------------------
enum {
kDIALOG_MASK_REV_CODE = 0x0000,
kDIALOG_TRIM_REL_CODE = 0x0001,
kDIALOG_PLATFORM_ID = 0x0002,
kDIALOG_PARITY = 0x0003,
kDIALOG_DEVICE_ID1 = 0x0004,
kDIALOG_DEVICE_ID2 = 0x0005,
kDIALOG_DEVICE_ID3 = 0x0006,
kDIALOG_DEVICE_ID4 = 0x0007,
kDIALOG_DEVICE_ID5 = 0x0008,
kDIALOG_CHIP_ID = kDIALOG_MASK_REV_CODE,
};
// ---------------------------------
// System Configuration
// ---------------------------------
// ---------------------------------
// Faultlog (virtual)
// ---------------------------------
enum {
kD2355_FAULT_LOG_A = 0x0050,
kD2355_FAULT_LOG_B,
kD2355_FAULT_LOG_C,
kDIALOG_FAULT_LOG = kD2355_FAULT_LOG_A,
};
// ---------------------------------
// Event Register (virtual)
// ---------------------------------
enum {
kD2355_EVENT_A = 0x0060,
kD2355_EVENT_B,
kD2355_EVENT_C,
kD2355_EVENT_D,
kD2355_EVENT_E,
kD2355_EVENT_F,
kD2355_EVENT_G,
kD2355_EVENT_H,
kD2355_EVENT_I,
kD2355_EVENT_J,
kDIALOG_EVENT_A = kD2355_EVENT_A,
};
// ---------------------------------
// Status Register (virtual)
// ---------------------------------
enum {
kD2355_STATUS_A = 0x0080,
kD2355_STATUS_B,
kD2355_STATUS_C,
kD2355_STATUS_D,
kD2355_STATUS_E,
kD2355_STATUS_F,
kD2355_STATUS_G,
kD2355_STATUS_H,
kD2355_STATUS_I,
kD2355_STATUS_J,
kDIALOG_STATUS_A = kD2355_STATUS_A,
};
// ---------------------------------
// IRQ Mask Register (virtual)
// ---------------------------------
enum {
kD2355_IRQ_MASK_A = 0x0a0,
kD2355_IRQ_MASK_B,
kD2355_IRQ_MASK_C,
kD2355_IRQ_MASK_D,
kD2355_IRQ_MASK_E,
kD2355_IRQ_MASK_F,
kD2355_IRQ_MASK_G,
kD2355_IRQ_MASK_H,
kD2355_IRQ_MASK_I,
kD2355_IRQ_MASK_J,
kDIALOG_IRQ_MASK_A = kD2355_IRQ_MASK_A,
};
// ---------------------------------
// MAIN FSM & IRQ Control
// ---------------------------------
enum {
kD2355_MFSM_FAULT_LOG1 = 0x0100,
};
enum {
kD2355_MFSM_CONF_A = 0x0140,
kD2355_MFSM_CONF_B,
kD2355_MFSM_CONF_C,
};
// ---------------------------------
// GPIO: control
// ---------------------------------
enum {
kD2355_GPIO_GPIO1 = 0x01c0,
kD2355_GPIO_GPIO2,
kD2355_GPIO_GPIO3,
kD2355_GPIO_GPIO4,
kD2355_GPIO_GPIO5,
kD2355_GPIO_GPIO6,
kD2355_GPIO_GPIO7,
kD2355_GPIO_GPIO8 = 0x01c7,
};
// ---------------------------------
// GPIO: Event/Status/IRQ_CTL
// ---------------------------------
// ---------------------------------
// GPIO: Debouncer Configuration
// ---------------------------------
// ---------------------------------
// GPADC
// ---------------------------------
enum {
kD2355_ADC_EVENT_A = 0x0310,
kD2355_ADC_EVENT_B,
kD2355_ADC_EVENT_C,
kD2355_ADC_STATUS_A = 0x320,
kD2355_ADC_STATUS_B,
kD2355_ADC_STATUS_C,
kD2355_ADC_IRQ_MASK_A = 0x0330,
kD2355_ADC_IRQ_MASK_B,
kD2355_ADC_IRQ_MASK_C,
};
// ---------------------------------
// Temperature & Sensor Control
// ---------------------------------
enum {
kD2355_T_OFFSET_MSB = 0x033f,
kD2355_T_OFFSET_LSB = 0x0340,
};
// ---------------------------------
// Charging Control
// ---------------------------------
enum {
kD2355_ADC_CHG_TRIM4 = 0x341,
kD2355_ADC_ICHG_END,
kD2355_ADC_TBAT_0,
kD2355_ADC_TBAT_1,
kD2355_ADC_TBAT_2,
kD2355_ADC_TBAT_3,
kD2355_ADC_TBAT_4,
kD2355_ADC_TBAT_MAX,
// Hysteresis,
// ...
kD2355_ADC_ICHG_AVG = 0x035e,
kD2355_ADC_ICHG6A_AVG = 0x035f,
kD2355_ADC_ACTUAL_TBAT_BAND,
};
// ---------------------------------
// GPADC Control and Result
// ---------------------------------
enum {
kD2355_ADC_CTRL1 = 0x0361,
kD2355_ADC_RES_LSB,
kD2355_ADC_RES_MSB,
kD2355_ADC_CTRL2,
kD2355_ADC_CTRL3,
kD2355_ADC_FSM_TRIM0,
kD2355_ADC_FSM_TRIM1,
kD2355_ADC_FSM_TRIM2,
kD2355_ADC_FSM_SAR,
kD2355_ADC_ANA_TRIM0,
kD2355_ADC_ANA_TRIM1,
};
// ---------------------------------
// CHARGER SYSTEM
// ---------------------------------
// Event, Status & IRQ Control
enum {
kD2355_CHG_EVENT_A = 0x0410,
kD2355_CHG_EVENT_B,
kD2355_CHG_EVENT_C,
kD2355_CHG_EVENT_D,
kD2355_CHG_STATUS_A = 0x0420,
kD2355_CHG_STATUS_B,
kD2355_CHG_STATUS_C,
kD2355_CHG_STATUS_D,
kD2355_CHG_IRQ_MASK_A =0x0430,
kD2355_CHG_IRQ_MASK_B,
kD2355_CHG_IRQ_MASK_C,
kD2355_CHG_IRQ_MASK_D,
};
enum {
kD2355_CHG_CTRL_A = 0x0440,
kD2355_CHG_CTRL_B = 0x0441,
kD2355_CHG_CTRL_C,
kD2355_CHG_CTRL_D = 0x0443,
kD2355_CHG_CTRL_E,
kD2355_CHG_CTRL_F,
kD2355_CHG_TIME = 0x0447,
kD2355_CHG_TIME_PRE,
// USB Current Limit
kD2355_CHG_ISET_BUCK = 0x044e,
kD2355_CHG_ISET_BUCK_SHADOW,
kD2355_CHG_ISET_BUCK_LV_ABSMAX,
kD2355_CHG_ISET_BUCK_HV_ABSMAX,
kD2355_CHG_ISET_BUCK_ACTUAL = 0x0452,
kD2355_CHG_ISET_BUCK_ALT,
// Battery Current Limit
kD2355_CHG_ICHG_PRE_MSB = 0x0454,
kD2355_CHG_ICHG_PRE_LSB,
kD2355_CHG_ICHG_BAT_MSB = 0x0456,
kD2355_CHG_ICHG_BAT_LSB,
kD2355_CHG_ICHG_BAT_MAX_MSB = 0x0458,
kD2355_CHG_ICHG_BAT_MAX_LSB,
// ??
kD2355_CHG_ICHG_BAT_ACTUAL_MSB = 0x045b,
kD2355_CHG_ICHG_BAT_ACTUAL_LSB,
};
// ---------------------------------
// Misc/DEBUG
// ---------------------------------
enum {
kDIALOG_TEST_ACCESS = 0x0B10,
kDIALOG_TEST_ACCESS_ENA = 0x1D,
kDIALOG_TEST_ACCESS_DIS = 0x00,
};
enum {
// <rdar://problem/21879203> J99 EVT not recognizing lightning connection
kDIALOG_OTP_RELOAD_CONF = kD2355_MFSM_CONF_A,
kDIALOG_OTP_SKIP_RELOAD_TO_ACT = (1<<4),
};
// ---------------------------------
// Events
// ---------------------------------
#if 0
// Synthetic Accumulator Registers
enum {
kDIALOG_ACCUMULATOR_SEL_COUNT = 2,
kDIALOG_IBUS_ACCUMULATOR = 0,
kDIALOG_VBUS_ACCUMULATOR = 1,
kDIALOG_IBUCK0_ACCUMULATOR = 0,
kDIALOG_IBUCK1_ACCUMULATOR = 0,
};
#endif
// ---------------------------------
// Events (virtual)
// ---------------------------------
enum {
// 0: DEB_EVENT_A
kD2355_EVENT_A_GPIO8 = (1 << 7),
kD2355_EVENT_A_GPIO7 = (1 << 6),
kD2355_EVENT_A_GPIO6 = (1 << 5),
kD2355_EVENT_A_GPIO5 = (1 << 4),
kD2355_EVENT_A_GPIO4 = (1 << 3),
kD2355_EVENT_A_GPIO3 = (1 << 2),
kD2355_EVENT_A_GPIO2 = (1 << 1),
kD2355_EVENT_A_GPIO1 = (1 << 0),
// 1: DEB_EVENT_B
kD2355_EVENT_B_CHG_BG_HIGH_TEMP = (1 <<1),
kD2355_EVENT_B_CHG_VBUS_ATT = (1 <<0),
// 2: ADC_EVENT_A
kD2355_EVENT_C_PBUS_CNT_OVERFLOW= (1 << 4),
kD2355_EVENT_C_EOMC = (1 << 3),
kD2355_EVENT_C_IBUS_OVERFLOW = (1 << 2),
kD2355_EVENT_C_TBAT = (1 << 1),
kD2355_EVENT_C_VDD_LOW = (1 << 0),
// 3: ADC_EVENT_B
kD2355_EVENT_D_VDDREF_CHG_FALL = (1 << 5),
kD2355_EVENT_D_TMID_DIE_FALL = (1 << 4),
kD2355_EVENT_D_TLINCHG_FALL = (1 << 3),
kD2355_EVENT_D_TVCENTER2_FALL = (1 << 2),
kD2355_EVENT_D_TVCENTER1_FALL = (1 << 1),
kD2355_EVENT_D_TCBUCK_FALL = (1 << 0),
// 4: ADC_EVENT_C
kD2355_EVENT_E_VDDREF_CHG_RISE = (1 << 5),
kD2355_EVENT_E_TMID_DIE_RISE = (1 << 4),
kD2355_EVENT_E_TLINCHG_RISE = (1 << 3),
kD2355_EVENT_E_TVCENTER2_RISE = (1 << 2),
kD2355_EVENT_E_TVCENTER1_RISE = (1 << 1),
kD2355_EVENT_E_TBUCK_RISE = (1 << 0),
// 5: CHG_EVENT_A
kD2355_EVENT_F_CV_LOOP_AVERAGE_SATURATED = (1 << 7),
kD2355_EVENT_F_FAULTY_ADAPTER = (1 << 6),
kD2355_EVENT_F_VBUS_OV = (1 << 5),
kD2355_EVENT_F_VBUS_EXT_REM = (1 << 4),
kD2355_EVENT_F_CHG_HV_ATT = (1 << 3),
kD2355_EVENT_F_VBUS_EXT_DET = (1 << 2),
kD2355_EVENT_F_HV_MODE = (1 << 1),
kD2355_EVENT_F_VCENTER_DET = (1 << 0),
// 6: CHG_EVENT_B
kD2355_EVENT_G_CHG_SLOW = (1 << 7),
kD2355_EVENT_G_CHG_BUCK_FLG = (1 << 6),
kD2355_EVENT_G_CHG_ABCC_ACT = (1 << 5),
kD2355_EVENT_G_CHG_TIMEOUT = (1 << 4),
kD2355_EVENT_G_CHG_PRECHG_TIMEOUT = (1 << 3),
kD2355_EVENT_G_CHG_END = (1 << 2),
kD2355_EVENT_G_CHG_FAST = (1 << 1),
kD2355_EVENT_G_CHG_PRE = (1 << 0),
// 7: CHG_EVENT_C
// ... kD2355_EVENT_H
// 8: CHG_EVENT_D
// ... kD2355_EVENT_I
// 9: THRCTL_EVENT_A
// ... kD2355_EVENT_J
};
enum {
// 0: DEB_STATUS_A
kD2355_STATUS_A_GPIO8 = (1 << 7),
kD2355_STATUS_A_GPIO7 = (1 << 6),
kD2355_STATUS_A_GPIO6 = (1 << 5),
kD2355_STATUS_A_GPIO5 = (1 << 4),
kD2355_STATUS_A_GPIO4 = (1 << 3),
kD2355_STATUS_A_GPIO3 = (1 << 2),
kD2355_STATUS_A_GPIO2 = (1 << 1),
kD2355_STATUS_A_GPIO1 = (1 << 0),
// 1: DEB_STATUS_B
kD2355_STATUS_B_CHG_ATT = (1 <<7),
kD2355_STATUS_B_CHG_BG_HIGH_TEMP = (1 <<1),
kD2355_STATUS_B_CHG_VBUS_ATT = (1 <<0),
// 2: ADC_STATUS_A
kD2355_STATUS_C_PBUS_CNT_OVERFLOW= (1 << 3),
kD2355_STATUS_C_IBUS_OVERFLOW = (1 << 2),
kD2355_STATUS_C_TBAT = (1 << 1),
kD2355_STATUS_C_VDD_LOW = (1 << 0),
// 3: ADC_STATUS_B
kD2355_STATUS_D_VDDREF_CHG_FALL = (1 << 5),
kD2355_STATUS_D_TMID_DIE_FALL = (1 << 4),
kD2355_STATUS_D_TLINCHG_FALL = (1 << 3),
kD2355_STATUS_D_TVCENTER2_FALL = (1 << 2),
kD2355_STATUS_D_TVCENTER1_FALL = (1 << 1),
kD2355_STATUS_D_TCBUCK_FALL = (1 << 0),
// 4: ADC_STATUS_C
kD2355_STATUS_C_VDDREF_CHG_RISE = (1 << 5),
kD2355_STATUS_C_TMID_DIE_RISE = (1 << 4),
kD2355_STATUS_C_TLINCHG_RISE = (1 << 3),
kD2355_STATUS_C_TVCENTER2_RISE = (1 << 2),
kD2355_STATUS_C_TVCENTER1_RISE = (1 << 1),
kD2355_STATUS_C_TBUCK_RISE = (1 << 0),
// 5: CHG_STATUS_A
kD2355_STATUS_F_CV_LOOP_AVERAGE_SATURATED = (1 << 7),
kD2355_STATUS_F_FAULTY_ADAPTER = (1 << 6),
kD2355_STATUS_F_VBUS_OV = (1 << 5),
kD2355_STATUS_F_RES0 = (1 << 4),
kD2355_STATUS_F_CHG_HV_ATT = (1 << 3),
kD2355_STATUS_F_VBUS_EXT_DET = (1 << 2),
kD2355_STATUS_F_HV_MODE = (1 << 1),
kD2355_STATUS_F_VCENTER_DET = (1 << 0),
// 6: CHG_STATUS_B
kD2355_STATUS_G_CHG_SLOW = (1 << 7),
kD2355_STATUS_G_CHG_BUCK_FLG = (1 << 6),
kD2355_STATUS_G_CHG_ABCC_ACT = (1 << 5),
kD2355_STATUS_G_CHG_TIMEOUT = (1 << 4),
kD2355_STATUS_G_CHG_PRECHG_TIMEOUT = (1 << 3),
kD2355_STATUS_G_CHG_END = (1 << 2),
kD2355_STATUS_G_CHG_FAST = (1 << 1),
kD2355_STATUS_G_CHG_PRE = (1 << 0),
// 7: CHG_STATUS_C
// ... kD2355_STATUS_H
// 8: CHG_STATUS_D
// ... kD2355_STATUS_I
// 9: THRCTL_STATUS_A
// ... kD2355_STATUS_J
};
enum {
kD2355_CHG_CTRL_A_TCTR_MASK = 0xf0,
kD2355_CHG_CTRL_A_PCTR_MASK = 0x07,
kD2355_CHG_CTRL_D_FORCE_VSYS_HI_UVLO = ( 1<<7 ),
kD2355_CHG_CTRL_D_SW_BOOST_OFF = ( 1<<6 ),
kD2355_CHG_CTRL_D_BUCK_BUS_PWR_SUSPEND = ( 1<<5 ),
kD2355_CHG_CTRL_D_ALT_USB_DIS1 = ( 1<<4 ),
kD2355_CHG_CTRL_D_SUSPEND = ( 1<<3 ),
kD2355_CHG_CTRL_D_BAT_PWR_SUSP = ( 1<<2 ),
kD2355_CHG_CTRL_D_HV_CHG_ALLOW = ( 1<<1 ),
kD2355_CHG_CTRL_D_OVP_DIS = ( 1<<0 ),
kD2355_CHG_CTRL_E_BUCK_EN = ( 1<<7 ),
};
enum {
// kDIALOG_CHARGE_CONTROL_EN
// used only in iBoot to clear USB_DIS1 and allow control of usb charge limit via ISET_BUCK
//
// kDIALOG_SYS_CONTROL
// Here used only for kD2355_CHG_CTRL_D_BAT_PWR_SUSP
// kDIALOG_CHARGE_CONTROL_ICHG_BAT_MSB
// Battery current limit (in charger_set_charging() )
// kDIALOG_CHARGE_BUCK_CONTROL
// USB input current limit, used in charger_set_charging()
kDIALOG_CHARGE_CONTROL_ICHG_BAT_MSB = kD2355_CHG_ICHG_BAT_MSB,
kDIALOG_OTP_ISET_BAT_MSB = kD2355_CHG_ICHG_BAT_MAX_MSB,
kDIALOG_CHARGE_STATUS_MSB = kD2355_CHG_ICHG_BAT_ACTUAL_MSB,
kDIALOG_CHARGE_BUCK_CONTROL = kD2355_CHG_ISET_BUCK,
kDIALOG_CHARGE_BUCK_STATUS = kD2355_CHG_ISET_BUCK_ACTUAL,
kDIALOG_SYS_CONTROL = kD2355_CHG_CTRL_D,
kDIALOG_SYS_CONTROL_BAT_PWR_SUSPEND = kD2355_CHG_CTRL_D_BAT_PWR_SUSP,
// masks
kDIALOG_SYS_CONTROL_HIBERNATE_ALWAYS = 0,
kDIALOG_SYS_CONTROL_CHRG_CONTROLS = kDIALOG_SYS_CONTROL_BAT_PWR_SUSPEND,
kDIALOG_CHARGE_CONTROL_EN = kD2355_CHG_CTRL_D,
kDIALOG_CHARGE_CONTROL_ALT_USB_DIS = kD2355_CHG_CTRL_D_ALT_USB_DIS1,
// for HighVoltage Charging
kDIALOG_HV_CHG_ALLOW = kD2355_CHG_CTRL_D_HV_CHG_ALLOW,
kDIALOG_HV_CHG_ALLOW_MASK = ( 1<<1 ),
};
enum {
// for ISET_BUCK (USB current limit)
kDIALOG_CHARGE_BUCK_CONTROL_MIN = 80,
kDIALOG_CHARGE_BUCK_CONTROL_STEP_PER_100MA = 10,
kDIALOG_CHARGE_BUCK_CONTROL_MAX = 2550,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_MIN = 0x08,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_100 = 0x0a,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_200 = 0x14,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_500 = 0x32,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_1000 = 0x64,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_1900 = 0xbf,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_2000 = 0xc9,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_2100 = 0xd2,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_2400 = 0xf0,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_2560 = 0xff,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_MAX = 0xff,
kDIALOG_CHARGE_BUCK_CONTROL_ISET_BUCK_MASK = 0xff,
};
enum {
// for ICHG_BAT (Battery Current Limit)
kDIALOG_CHARGE_CONTROL_A_ISET_BAT_MASK = 0x3ff,
kDIALOG_CHARGE_CONTROL_A_ISET_BAT_SHIFT = 0,
kDIALOG_OTP_ISET_BAT_SHIFT = kDIALOG_CHARGE_CONTROL_A_ISET_BAT_SHIFT,
kDIALOG_CHARGE_CONTROL_B_CHG_SUSP = (1 << 5),
kDIALOG_CHARGE_CONTROL_CHG_HIB = 0,
// these are ok, the one above not (not in CHARGE_CONTROL_A!!!)
kDIALOG_CHARGE_CONTROL_ISET_BAT_MASK = 0x3ff,
kDIALOG_CHARGE_CONTROL_ISET_BAT_SHIFT = 0,
kDIALOG_CHARGE_CONTROL_STEP = 10,
kDIALOG_CHARGE_CONTROL_MAX = 6390,
};
enum {
kDIALOG_CHARGE_CONTROL_TIME = kD2355_CHG_CTRL_A,
kDIALOG_CHARGE_CONTROL_TIME_TCTR_MASK = kD2355_CHG_CTRL_A_TCTR_MASK,
kDIALOG_CHARGE_CONTROL_TIME_TCTR_DISABLED = 0x00,
kDIALOG_CHARGE_CONTROL_TIME_PCTR_MASK = kD2355_CHG_CTRL_A_PCTR_MASK,
kDIALOG_CHARGE_CONTROL_TIME_PCTR_DISABLED = 0x00,
};
// ---------------------------------
// GPADC Control and Result
// ---------------------------------
// channels
enum {
kD2355_ADC_MUX_SEL_VSYS_LO = 0,
kD2355_ADC_MUX_SEL_ICH_1A,
kD2355_ADC_MUX_SEL_TBAT,
kD2355_ADC_MUX_SEL_VBAT,
kD2355_ADC_MUX_SEL_IBUS_IN_LG,
kD2355_ADC_MUX_SEL_ADC_IN_P,
kD2355_ADC_MUX_SEL_ADC_IN_N,
kD2355_ADC_MUX_SEL_TJINT,
kD2355_ADC_MUX_SEL_IBUS_IN_HG,
kD2355_ADC_MUX_SEL_VBUS = 10,
kD2355_ADC_MUX_SEL_VCENTER,
kD2355_ADC_MUX_SEL_VSYS_HI,
kD2355_ADC_MUX_SEL_VCENTER_TEMP1,
kD2355_ADC_MUX_SEL_LINCHG_TEMP,
kD2355_ADC_MUX_SEL_CHG_BUCK_TEMP,
kD2355_ADC_MUX_SEL_VCENTER_TEMP0,
kD2355_ADC_MUX_SEL_MID_DIE_TEMP,
kD2355_ADC_MUX_SEL_LV_LDO_TEMP = 18,
kD2355_ADC_MUX_SEL_BOOST_TEMP = 19,
kD2355_ADC_MUX_SEL_ICH_6A = 29,
};
enum {
kDIALOG_ADC_CONTROL_MUX_SEL_VDD_OUT = kD2355_ADC_MUX_SEL_VSYS_LO, // TODO: verify
kDIALOG_ADC_CONTROL_MUX_SEL_ICH_1A = kD2355_ADC_MUX_SEL_ICH_1A,
kDIALOG_ADC_CONTROL_MUX_SEL_TBAT = kD2355_ADC_MUX_SEL_TBAT,
kDIALOG_ADC_CONTROL_MUX_SEL_VBAT = kD2355_ADC_MUX_SEL_VBAT,
kDIALOG_ADC_CONTROL_MUX_SEL_IBUS_IN_LG = kD2355_ADC_MUX_SEL_IBUS_IN_LG,
kDIALOG_ADC_CONTROL_MUX_SEL_VIBUS = kDIALOG_ADC_CONTROL_MUX_SEL_IBUS_IN_LG,
kDIALOG_ADC_CONTROL_MUX_SEL_ADC_IN_P = kD2355_ADC_MUX_SEL_ADC_IN_P,
kDIALOG_ADC_CONTROL_MUX_SEL_ADC_IN_N = kD2355_ADC_MUX_SEL_ADC_IN_N,
kDIALOG_ADC_CONTROL_MUX_SEL_TJUNC = kD2355_ADC_MUX_SEL_TJINT,
kDIALOG_ADC_CONTROL_MUX_SEL_IBUS_IN_HG = kD2355_ADC_MUX_SEL_IBUS_IN_HG,
kDIALOG_ADC_CONTROL_MUX_SEL_VBUS = kD2355_ADC_MUX_SEL_VBUS,
kDIALOG_ADC_CONTROL_MUX_SEL_VCENTER_TEMP1 = kD2355_ADC_MUX_SEL_VCENTER_TEMP1,
kDIALOG_ADC_CONTROL_MUX_SEL_LINCHG_TEMP = kD2355_ADC_MUX_SEL_LINCHG_TEMP,
kDIALOG_ADC_CONTROL_MUX_SEL_CHG_BUCK_TEMP = kD2355_ADC_MUX_SEL_CHG_BUCK_TEMP,
kDIALOG_ADC_CONTROL_MUX_SEL_MID_DIE_TEMP = kD2355_ADC_MUX_SEL_MID_DIE_TEMP,
kDIALOG_ADC_CONTROL_MUX_SEL_ICH_6A = kD2355_ADC_MUX_SEL_ICH_6A,
kDIALOG_ADC_CONTROL_MUX_SEL_ICH = kD2355_ADC_MUX_SEL_ICH_1A,
kDIALOG_ADC_CONTROL_MUX_SEL_TINT_START = kD2355_ADC_MUX_SEL_VCENTER_TEMP1,
kDIALOG_ADC_CONTROL_MUX_SEL_TINT_END = kD2355_ADC_MUX_SEL_LV_LDO_TEMP,
kDIALOG_ADC_CONTROL2_AUTO_VDD_OUT_EN = (1 << 7),
kDIALOG_ADC_CONTROL2_ICH6A_EN = (1 << 1),
kDIALOG_ADC_CONTROL2_IBUS_EN = (1 << 0),
kDIALOG_ADC_CONTROL_MAN_CONV = (1 << 7),
kDIALOG_ADC_CONTROL_MUX_SEL_MASK = (0x1f << 0),
kDIALOG_ADC_LSB_ADC_OVL = (1 << 7),
kDIALOG_ADC_LSB_MANADC_ERROR = (1 << 6),
kDIALOG_ICHG_AVG = kD2355_ADC_ICHG_AVG,
kDIALOG_ADC_RESOLUTION_BITS = 12,
kDIALOG_ADC_FULL_SCALE_MV = 1500,
kDIALOG_ADC_BRICK_ID_OFFSET_MV = 40, // TODO: verify
kDIALOG_ADC_MAN_CTL = kD2355_ADC_CTRL1,
kDIALOG_ADC_CONTROL = kD2355_ADC_CTRL1,
kDIALOG_ADC_LSB = kD2355_ADC_RES_LSB,
kDIALOG_ADC_MSB = kD2355_ADC_RES_MSB,
kDIALOG_T_OFFSET_MSB = kD2355_T_OFFSET_MSB,
kDIALOG_T_OFFSET_LSB = kD2355_T_OFFSET_LSB,
};
enum {
kDIALOG_ADC_CONTROL_DEFAULTS = 0, // TODO: verify
kDIALOG_ADC_CONTROL2_DEFAULTS = 0, // TODO: verify
};
// -------------------------------------------------------------------------
//
// -------------------------------------------------------------------------
enum {
kDIALOG_SYS_GPIO_OUTPUT_LEVEL_LOW = (0 << 1),
kDIALOG_SYS_GPIO_OUTPUT_LEVEL_HIGH = (1 << 1),
kDIALOG_SYS_GPIO_DIRECTION_MASK = (1 << 6) | (1 << 1),
kDIALOG_SYS_GPIO_DIRECTION_OUT = (1 << 6),
kDIALOG_SYS_GPIO_DIRECTION_IN_LEVEL_HIGH = (0 << 6) | (0 << 1),
kDIALOG_SYS_GPIO_DIRECTION_IN_LEVEL_LOW = (0 << 6) | (1 << 1),
kDIALOG_SYS_GPIO_DIRECTION_OUT_32KHZ = kDIALOG_SYS_GPIO_DIRECTION_OUT, // not supported
kDIALOG_SYS_GPIO_REG_START = kD2355_GPIO_GPIO1,
};
#define IS_GPIO_OUTPUT(gpio) (((gpio)&kDIALOG_SYS_GPIO_DIRECTION_OUT) == kDIALOG_SYS_GPIO_DIRECTION_OUT)
// -------------------------------------------------------------------------
//
// -------------------------------------------------------------------------
enum {
// N.B. index in Virtual Registers
kDIALOG_FAULT_LOG_RST = FAULTLOG_FLAG_MAKE(0, (1 << 3)),
kDIALOG_FAULT_LOG_POR = FAULTLOG_FLAG_MAKE(0, (1 << 2)),
kDIALOG_FAULT_LOG_OVER_TEMP = FAULTLOG_FLAG_MAKE(0, (1 << 1)),
kDIALOG_FAULT_LOG_VDD_UNDER = FAULTLOG_FLAG_MAKE(0, (1 << 0)),
kDIALOG_FAULT_LOG_WDOG = kDIALOG_NOTEXIST_MASK,
kDIALOG_FAULT_LOG_RESET_IN_3 = kDIALOG_NOTEXIST_MASK,
kDIALOG_FAULT_LOG_RESET_IN_2 = kDIALOG_NOTEXIST_MASK,
kDIALOG_FAULT_LOG_RESET_IN_1 = kDIALOG_NOTEXIST_MASK,
kDIALOG_FAULT_LOG_BTN_SHUTDOWN = kDIALOG_NOTEXIST_MASK,
kDIALOG_FAULT_LOG_TWO_FINGER_RESET = kDIALOG_NOTEXIST_MASK,
kDIALOG_FAULT_LOG_NTC_SHDN = kDIALOG_NOTEXIST_MASK,
};
enum {
// N.B. index in Virtual Registers
kDIALOG_EVENT_HOLD_BUTTON_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_MENU_BUTTON_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_RINGER_BUTTON_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_BUTTON4_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_BUTTONS_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_PWR_BUTTON_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_ALARM_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_ACC_DET_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_VBUS_DET_MASK = EVENT_FLAG_MAKE(5, kD2355_EVENT_F_VBUS_EXT_DET),
kDIALOG_EVENT_VBUS_EXT_REM_MASK = EVENT_FLAG_MAKE(5, kD2355_EVENT_F_VBUS_EXT_REM),
kDIALOG_EVENT_EOMC_MASK = EVENT_FLAG_MAKE(2, kD2355_EVENT_C_EOMC),
kDIALOG_EVENT_HIB_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_ABCC_MASK = EVENT_FLAG_MAKE(6, kD2355_EVENT_G_CHG_ABCC_ACT),
kDIALOG_EVENT_CHG_END_MASK = EVENT_FLAG_MAKE(6, kD2355_EVENT_G_CHG_END),
kDIALOG_EVENT_TBAT_MASK = EVENT_FLAG_MAKE(2, kD2355_EVENT_C_TBAT),
kDIALOG_EVENT_GPIO1_MASK = EVENT_FLAG_MAKE(0, kD2355_EVENT_A_GPIO1),
kDIALOG_EVENT_GPIO2_MASK = EVENT_FLAG_MAKE(0, kD2355_EVENT_A_GPIO2),
kDIALOG_EVENT_GPIO3_MASK = EVENT_FLAG_MAKE(0, kD2355_EVENT_A_GPIO3),
kDIALOG_EVENT_GPIO4_MASK = EVENT_FLAG_MAKE(0, kD2355_EVENT_A_GPIO4),
kDIALOG_EVENT_GPIO5_MASK = EVENT_FLAG_MAKE(0, kD2355_EVENT_A_GPIO5),
kDIALOG_EVENT_GPIO6_MASK = EVENT_FLAG_MAKE(0, kD2355_EVENT_A_GPIO6),
kDIALOG_EVENT_GPIO7_MASK = EVENT_FLAG_MAKE(0, kD2355_EVENT_A_GPIO7),
kDIALOG_EVENT_GPIO8_MASK = EVENT_FLAG_MAKE(0, kD2355_EVENT_A_GPIO8),
kDIALOG_EVENT_GPIO9_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO10_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO11_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO12_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO13_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO14_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO15_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO16_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO17_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO18_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO19_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO20_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_GPIO21_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_HOLD_DBL_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_MENU_DBL_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_RINGER_DBL_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_VHP_DET_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_ON_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_EVENT_LDO2_EN_MASK = kDIALOG_NOTEXIST_MASK,
};
enum {
// N.B. index in Virtual Registers
kDIALOG_STATUS_USB_MASK = STATUS_FLAG_MAKE(5, kD2355_STATUS_F_VBUS_EXT_DET),
kDIALOG_STATUS_VBUS_MASK = STATUS_FLAG_MAKE(5, kD2355_STATUS_F_VCENTER_DET),
kDIALOG_STATUS_FW_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_STATUS_ACC_DET_MASK = kDIALOG_NOTEXIST_MASK,
kDIALOG_STATUS_CHARGING_MASK = STATUS_FLAG_MAKE(6, kD2355_EVENT_G_CHG_PRE | kD2355_EVENT_G_CHG_FAST),
kDIALOG_STATUS_CHG_TO_MASK = STATUS_FLAG_MAKE(6, kD2355_EVENT_G_CHG_TIMEOUT),
kDIALOG_STATUS_CHG_END_MASK = STATUS_FLAG_MAKE(6, kD2355_EVENT_G_CHG_END),
kDIALOG_STATUS_TBAT_MASK = STATUS_FLAG_MAKE(2, kD2355_STATUS_C_TBAT),
kDIALOG_STATUS_CHG_ATT_MASK = STATUS_FLAG_MAKE(1, kD2355_STATUS_B_CHG_ATT),
kDIALOG_STATUS_ABCC_MASK = STATUS_FLAG_MAKE(6, kD2355_EVENT_G_CHG_ABCC_ACT),
#define kDIALOG_STATUS_GPIO_MASK(gpio) STATUS_FLAG_MAKE(0, (1 << ((gpio) % 8)))
};
static const statusRegisters kDialogStatusFWMask = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static const statusRegisters kDialogStatusChargingMask = {0, 0, 0, 0, 0, 0, kD2355_STATUS_G_CHG_PRE | kD2355_STATUS_G_CHG_FAST, 0 , 0 , 0};
enum {
kD2355_EVENT_A_WAKEMASK = ( kD2355_EVENT_A_GPIO1 | kD2355_EVENT_A_GPIO2 | kD2355_EVENT_A_GPIO3 | kD2355_EVENT_A_GPIO4 |
kD2355_EVENT_A_GPIO5 | kD2355_EVENT_A_GPIO6 | kD2355_EVENT_A_GPIO7 | kD2355_EVENT_A_GPIO8 ),
kD2355_EVENT_B_WAKEMASK = 0,
kD2355_EVENT_C_WAKEMASK = 0,
kD2355_EVENT_D_WAKEMASK = 0,
kD2355_EVENT_E_WAKEMASK = 0,
kD2355_EVENT_F_WAKEMASK = kD2355_EVENT_F_VBUS_EXT_DET | kD2355_EVENT_F_VBUS_EXT_REM | kD2355_EVENT_F_VCENTER_DET,
kD2355_EVENT_G_WAKEMASK = kD2355_EVENT_G_CHG_TIMEOUT | kD2355_EVENT_G_CHG_PRECHG_TIMEOUT | kD2355_EVENT_G_CHG_END,
kD2355_EVENT_H_WAKEMASK = 0,
kD2355_EVENT_I_WAKEMASK = 0,
kD2355_EVENT_J_WAKEMASK = 0,
};
// All events that are masked during shutdown - inverse of the wake mask,
// events that wake up the system
static const eventRegisters kDialogEventIntMasks = {
(UInt8)~kD2355_EVENT_A_WAKEMASK, // really LLDB? really?
~kD2355_EVENT_B_WAKEMASK,
~kD2355_EVENT_C_WAKEMASK,
~kD2355_EVENT_D_WAKEMASK,
~kD2355_EVENT_E_WAKEMASK,
~kD2355_EVENT_F_WAKEMASK,
~kD2355_EVENT_G_WAKEMASK,
~kD2355_EVENT_H_WAKEMASK,
~kD2355_EVENT_I_WAKEMASK,
~kD2355_EVENT_J_WAKEMASK,
};
// All wake events without the buttons
static const eventRegisters kDialogEventNotButtonMasks = {
kD2355_EVENT_A_WAKEMASK,
kD2355_EVENT_B_WAKEMASK,
kD2355_EVENT_C_WAKEMASK,
kD2355_EVENT_D_WAKEMASK,
kD2355_EVENT_E_WAKEMASK,
kD2355_EVENT_F_WAKEMASK,
kD2355_EVENT_G_WAKEMASK,
kD2355_EVENT_H_WAKEMASK,
kD2355_EVENT_I_WAKEMASK,
kD2355_EVENT_J_WAKEMASK,
};
// All events indicating external power supply
static const eventRegisters kDialogEventPwrsupplyMask = {
0,
0,
0,
0,
0,
kD2355_EVENT_F_VBUS_EXT_DET | kD2355_EVENT_F_VCENTER_DET,
0,
0,
0,
0,
};
static const eventRegisters kDialogEventUSBMask = {
// in d2231.h only include kD2231_EVENT_A_VBUS_EXT_DET: VCENTER can come and go while charger still usable
0,
0,
0,
0,
0,
kD2355_EVENT_F_VBUS_EXT_DET | kD2355_EVENT_F_VCENTER_DET,
0, // kD2355_STATUS_G_CHG_ABCC_ACT ?
0,
0,
0,
};
static const eventRegisters kDialogEventFWMask = {
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
};
enum {
// TODO: verify this guys
kDialogEventPwrsupplyCount = 2,
kDialogEventUSBCount = 2,
kDialogEventFWCount = 0,
};
// -------------------------------------------------------------------------
//
// -------------------------------------------------------------------------
#define NUM_LDOS 0
static const struct ldo_params ldo_d2355[NUM_LDOS] = {
};
#define LDOP ldo_d2355
#endif