diff options
Diffstat (limited to 'arch/arm/plat-mxs/include/mach/ddi_bc.h')
-rw-r--r-- | arch/arm/plat-mxs/include/mach/ddi_bc.h | 715 |
1 files changed, 715 insertions, 0 deletions
diff --git a/arch/arm/plat-mxs/include/mach/ddi_bc.h b/arch/arm/plat-mxs/include/mach/ddi_bc.h new file mode 100644 index 000000000000..21ca9217cdaa --- /dev/null +++ b/arch/arm/plat-mxs/include/mach/ddi_bc.h @@ -0,0 +1,715 @@ +/* + * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved. + */ + +/* + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +#ifndef _DDI_BC_H +#define _DDI_BC_H + +#include <linux/types.h> + +#define DDI_BC_MAX_RESTART_CYCLES 100 + +#define DDI_BC_LIION_CHARGING_VOLTAGE 4200 +#define DDI_BC_ALKALINE_NIMH_CHARGING_VOLTAGE 1750 + +/* brief Defines battery charger states. */ +typedef enum _ddi_bc_State { + /* brief TBD */ + DDI_BC_STATE_UNINITIALIZED = 0, + /* brief TBD */ + DDI_BC_STATE_BROKEN = 1, + /* brief TBD */ + DDI_BC_STATE_DISABLED = 2, + /* brief TBD */ + DDI_BC_STATE_WAITING_TO_CHARGE = 3, + /* brief TBD */ + DDI_BC_STATE_CONDITIONING = 4, + /* brief TBD */ + DDI_BC_STATE_CHARGING = 5, + /* brief TBD */ + DDI_BC_STATE_TOPPING_OFF = 6, + /* brief TBD */ + DDI_BC_STATE_DCDC_MODE_WAITING_TO_CHARGE = 7, + +} ddi_bc_State_t; + +typedef enum _ddi_bc_BrokenReason { + /* brief TBD */ + DDI_BC_BROKEN_UNINITIALIZED = 0, + /* brief TBD */ + DDI_BC_BROKEN_CHARGING_TIMEOUT = 1, + /* brief TBD */ + DDI_BC_BROKEN_FORCED_BY_APPLICATION = 2, + /* brief TBD */ + DDI_BC_BROKEN_EXTERNAL_BATTERY_VOLTAGE_DETECTED = 3, + /* brief TBD */ + DDI_BC_BROKEN_NO_BATTERY_DETECTED = 4, + +} ddi_bc_BrokenReason_t; + +/* brief Defines the battery charger configuration. */ +typedef struct _ddi_bc_Cfg { + /* brief Units in milliseconds. */ + /* */ + /* This field configures the expected period between calls to */ + /* ddi_bc_StateMachine. If die temperature monitoring is */ + /* enabled, then the data sheet recommends the period be around */ + /* 100ms or less. */ + /* */ + /* Note that this period defines the minimum time resolution of */ + /* the battery charger. */ + + uint32_t u32StateMachinePeriod; + + /* brief Units in mA/s. */ + /* */ + /* This field configures the slope of the current ramp. Any */ + /* time the battery charger increases its current draw, it will */ + /* ramp up the current no faster than this rate. */ + /* */ + /* Note that the minimum time resolution of the battery charger */ + /* is the configured period between calls to advance the state */ + /* machine. Also, the hardware has a minimum current resolution */ + /* of 10mA. If the given ramp slope cannot be expressed */ + /* exactly, then the largest expressible smaller slope will be */ + /* the result. If the actual period between calls to */ + /* ddi_bc_StateMachine is irregular, the current may ramp faster */ + /* than indicated. */ + + uint16_t u16CurrentRampSlope; + + /* brief Units in millivolts. */ + /* */ + /* This field configures the threshold conditioning voltage. If */ + /* the battery's voltage is below this value, it will be */ + /* conditioned until its voltage rises above the maximum */ + /* conditioning voltage. After that, the battery will be */ + /* charged normally. */ + /* */ + /* Note that the hardware has a minimum resolution of 8mV. If */ + /* the given voltage cannot be expressed exactly, then the */ + /* smallest expressible larger value will be used. */ + + uint16_t u16ConditioningThresholdVoltage; + + /* brief Units in millivolts. */ + /* */ + /* This field configures the maximum conditioning voltage. If */ + /* the battery charger is conditioning a battery, normal */ + /* charging begins when the voltage rises above this value. */ + /* */ + /* This value should be slightly higher than the threshold */ + /* conditioning voltage because it is measured while a */ + /* conditioning current is actually flowing to the battery. */ + /* With a conditioning current of 0.1C, reasonable values for */ + /* the threshold and maximum conditioning voltages are 2.9V */ + /* and 3.0V respectively. */ + /* */ + /* Note that the hardware has a minimum resolution of 8mV. If */ + /* the given voltage cannot be expressed exactly, then the */ + /* smallest expressible larger value will be used. */ + + uint16_t u16ConditioningMaxVoltage; + + /* brief Units in milliamps. */ + /* */ + /* This field configures the maximum conditioning current. */ + /* This is the maximum current that will be offered to a */ + /* battery while it is being conditioned. A typical value is */ + /* 0.1C. */ + /* */ + /* Note that the hardware has a minimum resolution of 10mA */ + /* (see the data sheet for details). If the given current */ + /* cannot be expressed exactly, then the largest expressible */ + /* smaller value will be used. */ + + uint16_t u16ConditioningCurrent; + + /* brief Units in milliseconds. */ + /* */ + /* This field configures the conditioning time-out. This is */ + /* the maximum amount of time that a battery will be */ + /* conditioned before the battery charger declares it to be */ + /* broken. */ + /* */ + /* Note that the minimum time resolution of the battery */ + /* charger is the configured period between calls to advance */ + /* the state machine. If the given time-out cannot be */ + /* expressed exactly, then the shortest expressible longer */ + /* value will be used. */ + + uint32_t u32ConditioningTimeout; + + /* brief Units in millivolts. */ + /* */ + /* This field configures the final charging voltage. At this */ + /* writing, only two values are permitted: 4100 or 4200. */ + + uint16_t u16ChargingVoltage; + + /* brief Units in milliamps. */ + /* */ + /* This field configures the maximum current offered to a */ + /* charging battery. */ + /* */ + /* Note that the hardware has a minimum resolution of 10mA */ + /* (see the data sheet for details). If the given current */ + /* cannot be expressed exactly, then the largest expressible */ + /* smaller value will be used. */ + + uint16_t u16ChargingCurrent; + + /* brief Units in milliamps. */ + /* */ + /* This field configures the current flow below which a */ + /* charging battery is regarded as fully charged (typical */ + /* 0.1C). At this point, the battery will be topped off. */ + /* */ + /* Note that the hardware has a minimum resolution of 10mA */ + /* (see the data sheet for details). If the given current */ + /* cannot be expressed exactly, then the largest expressible */ + /* smaller value will be used. */ + + uint16_t u16ChargingThresholdCurrent; + + /* brief Units in milliamps. */ + /* */ + /* When charging while the DCDC converter's are enabled, the charger */ + /* is suppling current to both the battery and the Vbat input of the */ + /* DCDC converter. Once the total battery charger current falls */ + /* below this level, the charger will then stop charging until the */ + /* the battery voltage reaches the BC_LOW_DCDCMODE_BATTERY_VOLTAGE */ + /* threshold or until the DCDCs are no longer enabled. */ + /* */ + /* Typically, this value should be left at 180 to avoid the risk */ + /* of topping off the battery too long in DCDC mode and avoid */ + /* exceeding the BC_CHARGING_TIMEOUT time which would put the charger */ + /* driver in the broken state and completely disable charging. */ + /* */ + /* Note that the hardware has a minimum resolution of 10mA */ + /* (see the data sheet for details). If the given current */ + /* cannot be expressed exactly, then the largest expressible */ + /* smaller value will be used. */ + uint16_t u16DdcdModeChargingThresholdCurrent; + + /* brief Units in milliseconds. */ + /* */ + /* This field configures the charging time-out. This is the */ + /* maximum amount of time that a battery will be charged */ + /* before the battery charger declares it to be broken. */ + /* */ + /* Note that the minimum time resolution of the battery */ + /* charger is the configured period between calls to advance */ + /* the state machine. If the given time-out cannot be */ + /* expressed exactly, then the shortest expressible longer */ + /* value will be used. */ + + uint32_t u32ChargingTimeout; + + /* brief Units in milliseconds. */ + /* */ + /* This field configures the top-off period. This is the */ + /* amount of time a battery will be held in the Topping Off */ + /* state before it is declared fully charged. */ + /* */ + /* Note that the minimum time resolution of the battery */ + /* charger is the configured period between calls to advance */ + /* the state machine. If the given time-out cannot be */ + /* expressed exactly, then the shortest expressible longer */ + /* value will be used. */ + + uint32_t u32TopOffPeriod; + + /* brief Units in milliseconds. */ + /* */ + /* This field configures the top-off period when the DCDC */ + /* converters are enabled. To avoid topping off the LiIon */ + /* battery too long and reducing it's long term capacity, */ + /* This time should be kept failry short. */ + /* */ + /* Note that the minimum time resolution of the battery */ + /* charger is the configured period between calls to advance */ + /* the state machine. If the given time-out cannot be */ + /* expressed exactly, then the shortest expressible longer */ + /* value will be used. */ + uint32_t u32DcdcModeTopOffPeriod; + + /* brief Causes the battery charger to use an externally generated bias current */ + /* */ + /* If cleared, this causes the battery charger to use an */ + /* externally generated bias current, which is expected to be */ + /* quite precise. Otherwise, the battery charger will */ + /* generate a lesser-quality bias current internally. */ + + uint8_t useInternalBias:1; + + /* brief Indicates that the battery charger is to monitor the die temperature. */ + /* */ + /* If set, this field indicates that the battery charger is to */ + /* monitor the die temperature. See below for fields that */ + /* configure the details. */ + + uint8_t monitorDieTemp:1; + + /* brief Indicates that the battery charger is to monitor the battery temperature. */ + /* */ + /* If set, this field indicates that the battery charger is to */ + /* monitor the battery temperature. See below for fields that */ + /* configure the details. */ + + uint8_t monitorBatteryTemp:1; + + /* brief Units in degrees centigrade. */ + /* */ + /* Note that the hardware reports die temperature in ranges of */ + /* 10 degree resolution minimum (see the data sheet for */ + /* details). If the battery charger is monitoring the die */ + /* temperature, and it rises to a range that includes a */ + /* temperature greater than or equal to this value, the */ + /* charging current will be clamped to the safe current. */ + + int8_t u8DieTempHigh; + + /* brief Units in degrees centigrade. */ + /* */ + /* Note that the hardware reports die temperature in ranges of */ + /* 10 degrees minimum (see the data sheet for details). If the */ + /* charging current is being clamped because of a high die */ + /* temperature, and it falls to a range that doesn't include a */ + /* temperatures greater than or equal to this value, the */ + /* charging current clamp will be released. */ + + int8_t u8DieTempLow; + + /* brief Units in milliamps. */ + /* */ + /* If the battery charger detects a high die temperature, it */ + /* will clamp the charging current at or below this value. */ + + uint16_t u16DieTempSafeCurrent; + + /* brief If the battery charger is monitoring the battery */ + /* temperature, this field indicates the LRADC channel to */ + /* read. */ + + uint8_t u8BatteryTempChannel; + + /* brief If the battery charger is monitoring the battery */ + /* temperature, and it rises to a measurement greater than or */ + /* equal to this value, the charging current will be clamped */ + /* to the corresponding safe current. */ + + uint16_t u16BatteryTempHigh; + + /* brief If the charging current is being clamped because of a high */ + /* battery temperature, and it falls below this value, the */ + /* charging current clamp will be released. */ + + uint16_t u16BatteryTempLow; + + /* brief Units in milliamps. */ + /* */ + /* If the battery charger detects a high battery temperature, */ + /* it will clamp the charging current at or below this value. */ + + uint16_t u16BatteryTempSafeCurrent; + + /* brief Units in millivolts. */ + /* */ + /* In the WaitingToCharge state, if we are in DCDC */ + /* operating modes, if the battery voltage measurement */ + /* is below this value, we immediately proceed with charging. */ + /* the low criteria for this value is that it must be high */ + /* to not risk the battery voltage getting too low. The */ + /* upper criteria is that you do not want the IR voltage */ + /* drop under heavy loads to make you start charging too soon */ + /* because the goal in DCDC operating mode is to not be constantly */ + /* topping off the battery which can shorten its life */ + + uint16_t u16LowDcdcBatteryVoltage_mv; + + uint32_t u32StateMachineNonChargingPeriod; +} ddi_bc_Cfg_t; + +/* Status returned by Battery Charger functions. */ + +typedef enum _ddi_bc_Status { + /* brief TBD */ + DDI_BC_STATUS_SUCCESS = 0, + /* brief TBD */ + DDI_BC_STATUS_HARDWARE_DISABLED, + /* brief TBD */ + DDI_BC_STATUS_BAD_BATTERY_MODE, + /* brief TBD */ + DDI_BC_STATUS_CLOCK_GATE_CLOSED, + /* brief TBD */ + DDI_BC_STATUS_NOT_INITIALIZED, + /* brief TBD */ + DDI_BC_STATUS_ALREADY_INITIALIZED, + /* brief TBD */ + DDI_BC_STATUS_BROKEN, + /* brief TBD */ + DDI_BC_STATUS_NOT_BROKEN, + /* brief TBD */ + DDI_BC_STATUS_NOT_DISABLED, + /* brief TBD */ + DDI_BC_STATUS_BAD_ARGUMENT, + /* brief TBD */ + DDI_BC_STATUS_CFG_BAD_BATTERY_TEMP_CHANNEL, + /* brief TBD */ + DDI_BC_STATUS_CFG_BAD_CHARGING_VOLTAGE, +} ddi_bc_Status_t; + + +/* BCM Event Codes */ + +/* These are the codes that might be published to PMI Subscribers. */ + + +#define DDI_BC_EVENT_GROUP (11<<10) + +/* brief TBD */ +/* todo [PUBS] Add definition(s)... */ +typedef enum { + /* Use the error code group value to make events unique for the EOI */ + /* brief TBD */ + ddi_bc_MinEventCode = DDI_BC_EVENT_GROUP, + /* brief TBD */ + ddi_bc_WaitingToChargeCode, + /* brief TBD */ + ddi_bc_State_ConditioningCode, + /* brief TBD */ + ddi_bc_State_Topping_OffCode, + /* brief TBD */ + ddi_bc_State_BrokenCode, + /* brief TBD */ + ddi_bc_SettingChargeCode, + /* brief TBD */ + ddi_bc_RaisingDieTempAlarmCode, + /* brief TBD */ + ddi_bc_DroppingDieTempAlarmCode, + + /* brief TBD */ + ddi_bc_MaxEventCode, + /* brief TBD */ + ddi_bc_DcdcModeWaitingToChargeCode +} ddi_bc_Event_t; + + +/* Prototypes */ + + + +/* brief Initialize the Battery Charger. */ +/* */ +/* fntype Function */ +/* */ +/* This function initializes the Battery Charger. */ +/* */ +/* param[in] pCfg A pointer to the new configuration. */ +/* */ +/* retval DDI_BC_STATUS_SUCCESS */ +/* If the operation succeeded. */ +/* retval DDI_BC_STATUS_ALREADY_INITIALIZED */ +/* If the Battery Charger is already initialized. */ +/* retval DDI_BC_STATUS_HARDWARE_DISABLED */ +/* If the Battery Charger hardware is disabled by a laser fuse. */ +/* retval DDI_BC_STATUS_BAD_BATTERY_MODE */ +/* If the power supply is set up for a non-rechargeable battery. */ +/* retval DDI_BC_STATUS_CLOCK_GATE_CLOSED */ +/* If the clock gate for the power supply registers is closed. */ +/* retval DDI_BC_STATUS_CFG_BAD_CHARGING_VOLTAGE */ +/* If the charging voltage is not either 4100 or 4200. */ +/* retval DDI_BC_STATUS_CFG_BAD_BATTERY_TEMP_CHANNEL */ +/* If the LRADC channel number for monitoring battery temperature */ +/* is bad. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_init.c. */ + +extern ddi_bc_Status_t ddi_bc_Init(ddi_bc_Cfg_t *pCfg); + +/* */ +/* brief Report the Battery Charger configuration. */ +/* */ +/* fntype Function */ +/* */ +/* This function reports the Battery Charger configuration. */ +/* */ +/* Note that, if the Battery Charger has not yet been initialized, the data */ +/* returned by this function is unknown. */ +/* */ +/* param[in,out] pCfg A pointer to a structure that will receive the data. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_api.c. */ + +extern void ddi_bc_QueryCfg(ddi_bc_Cfg_t *pCfg); + +/* */ +/* brief Shut down the Battery Charger. */ +/* */ +/* fntype Function */ +/* */ +/* This function immediately shuts down the Battery Charger hardware and */ +/* returns the state machine to the Uninitialized state. Use this function to */ +/* safely mummify the battery charger before retiring it from memory. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_api.c. */ + +extern void ddi_bc_ShutDown(void); + +/* */ +/* brief Advances the state machine. */ +/* */ +/* fntype Function */ +/* */ +/* This function advances the state machine. */ +/* */ +/* retval DDI_BC_STATUS_SUCCESS If all goes well */ +/* retval DDI_BC_STATUS_NOT_INITIALIZED If the Battery Charger is not yet */ +/* initialized. */ +/* retval DDI_BC_STATUS_BROKEN If the battery violated a time-out */ +/* and has been declared broken. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_api.c. */ + +extern ddi_bc_Status_t ddi_bc_StateMachine(void); + +/* */ +/* brief Get the Battery Charger's current state. */ +/* */ +/* fntype Function */ +/* */ +/* This function returns the current state. */ +/* */ +/* retval The current state. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_api.c. */ + +extern ddi_bc_State_t ddi_bc_GetState(void); + +/* */ +/* brief Disable the Battery Charger. */ +/* */ +/* fntype Function */ +/* */ +/* This function forces the Battery Charger into the Disabled state. */ +/* */ +/* retval DDI_BC_STATUS_SUCCESS If all goes well */ +/* retval DDI_BC_STATUS_NOT_INITIALIZED If the Battery Charger is not yet */ +/* initialized. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_api.c. */ + +extern ddi_bc_Status_t ddi_bc_SetDisable(void); + +/* */ +/* brief Enable the Battery Charger. */ +/* */ +/* fntype Function */ +/* */ +/* If the Battery Charger is in the Disabled state, this function moves it to */ +/* the Waiting to Charge state. */ +/* */ +/* retval DDI_BC_STATUS_SUCCESS If all goes well */ +/* retval DDI_BC_STATUS_NOT_INITIALIZED If the Battery Charger is not yet */ +/* initialized. */ +/* retval DDI_BC_STATUS_NOT_DISABLED If the Battery Charger is not */ +/* disabled. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_api.c. */ + +extern ddi_bc_Status_t ddi_bc_SetEnable(void); + +/* */ +/* brief Declare the battery to be broken. */ +/* */ +/* fntype Function */ +/* */ +/* This function forces the Battery Charger into the Broken state. */ +/* */ +/* retval DDI_BC_STATUS_SUCCESS If all goes well */ +/* retval DDI_BC_STATUS_NOT_INITIALIZED If the Battery Charger is not yet */ +/* initialized. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_api.c. */ + +extern ddi_bc_Status_t ddi_bc_SetBroken(void); + +/* */ +/* brief Declare the battery to be fixed. */ +/* */ +/* fntype Function */ +/* */ +/* If the Battery Charger is in the Broken state, this function moves it to */ +/* the Disabled state. */ +/* */ +/* retval DDI_BC_STATUS_SUCCESS If all goes well */ +/* retval DDI_BC_STATUS_NOT_INITIALIZED If the Battery Charger is not yet */ +/* initialized. */ +/* retval DDI_BC_STATUS_NOT_BROKEN If the Battery Charger is not broken. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_api.c. */ + +extern ddi_bc_Status_t ddi_bc_SetFixed(void); + +/* */ +/* brief Set the current limit. */ +/* */ +/* fntype Function */ +/* */ +/* This function applies a limit to the current that the Battery Charger can */ +/* draw. */ +/* */ +/* param[in] u16Limit The maximum current the Battery Charger can draw */ +/* (in mA). */ +/* */ +/* retval The expressible version of the limit. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_api.c. */ + +extern uint16_t ddi_bc_SetCurrentLimit(uint16_t u16Limit); + + +/* */ +/* brief Report the current limit. */ +/* */ +/* fntype Function */ +/* */ +/* This function reports the limit to the current that the Battery Charger can */ +/* draw. */ +/* */ +/* retval The current limit. */ +/* */ +/* internal */ +/* see To view the function definition, see ddi_bc_api.c. */ + +extern uint16_t ddi_bc_GetCurrentLimit(void); + + +/* */ +/* brief Set the current threshold. */ +/* */ +/* fntype Function */ +/* */ +/* */ +/* param[in] u16Current Current threshold where charger deactivates (in mA). */ +/* */ +/* */ + +extern uint16_t ddi_bc_SetCurrentThreshold(uint16_t u16Current); + + +/* */ +/* brief Set the battery charger state machine period. */ +/* */ +/* fntype Function */ +/* */ +/* This function sets a new state machine period. The Period and Slope should */ +/* be coordinated to achieve the minimal ramp step current which will minimize */ +/* transients on the system. */ +/* */ +/* param[in] u32StateMachinePeriod (in milliseconds) */ +/* param[in] u16CurrentRampSlope (in mA/s) */ +/* */ +/* retval SUCCESS If all goes well */ +/* retval ERROR_DDI_BCM_NOT_INITIALIZED If the Battery Charger is not yet */ +/* initialized. */ +/* */ + +extern ddi_bc_Status_t ddi_bc_SetNewPeriodAndSlope(uint32_t + u32StateMachinePeriod, + uint16_t + u16CurrentRampSlope); + + +/* */ +/* brief Report the state machine period. */ +/* */ +/* fntype Function */ +/* */ +/* This function reports the battery charger period. */ +/* */ +/* retval The battery charger period (in milliseconds). */ +/* */ + +extern uint32_t ddi_bc_GetStateMachinePeriod(void); + + +/* */ +/* brief Report the current ramp slope. */ +/* */ +/* fntype Function */ +/* */ +/* This function reports the current ramp slope. */ +/* */ +/* retval The current ramp slope (in mA/s). */ +/* */ + +extern uint32_t ddi_bc_GetCurrentRampSlope(void); + + +/* */ +/* brief Report the time spent in the present state (milliseconds) */ +/* */ +/* fntype Function */ +/* */ +/* This function reports the time spent in the present charging state. Note that */ +/* for the states that actually charge the battery, this time does not include the */ +/* time spent under alarm conditions such as die termperature alarm or battery */ +/* temperature alarm. */ +/* */ +/* retval The time spent in the current state in milliseconds. */ +/* */ + +uint32_t ddi_bc_GetStateTime(void); + + +/* */ +/* brief Report the reason for being in the broken state */ +/* */ +/* fntype Function */ +/* */ +/* */ +/* retval ddi_bc_BrokenReason_t enumeration */ +/* */ + +ddi_bc_BrokenReason_t ddi_bc_GetBrokenReason(void); + + +/* */ +/* brief Restart the charge cycle */ +/* */ +/* fntype Function */ +/* */ +/* retval SUCCESS */ +/* */ + +ddi_bc_Status_t ddi_bc_ForceChargingToStart(void); + +void fsl_enable_usb_plugindetect(void); + +int fsl_is_usb_plugged(void); + +/* End of file */ + +#endif /* _DDI_BC_H */ +/* @} */ |