blob: eecd2d56887929df815c8ce09ccf8788bbae78dd [file] [log] [blame]
/*
* Copyright 2004-2011 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
* The code contained herein is licensed under the GNU Lesser General
* Public License. You may obtain a copy of the GNU Lesser General
* Public License Version 2.1 or later at the following locations:
*
* http://www.opensource.org/licenses/lgpl-license.html
* http://www.gnu.org/copyleft/lgpl.html
*/
#ifndef __ASM_ARCH_MXC_PMIC_ADC_H__
#define __ASM_ARCH_MXC_PMIC_ADC_H__
/*!
* @defgroup PMIC_ADC PMIC Digitizer Driver
* @ingroup PMIC_DRVRS
*/
/*!
* @file arch-mxc/pmic_adc.h
* @brief This is the header of PMIC ADC driver.
*
* @ingroup PMIC_ADC
*/
#include <linux/ioctl.h>
#include <linux/pmic_status.h>
#include <linux/pmic_external.h>
/*!
* @name IOCTL user space interface
*/
/*! @{ */
/*!
* Initialize ADC.
* Argument type: none.
*/
#define PMIC_ADC_INIT _IO('p', 0xb0)
/*!
* De-initialize ADC.
* Argument type: none.
*/
#define PMIC_ADC_DEINIT _IO('p', 0xb1)
/*!
* Convert one channel.
* Argument type: pointer to t_adc_convert_param.
*/
#define PMIC_ADC_CONVERT _IOWR('p', 0xb2, int)
/*!
* Convert one channel eight samples.
* Argument type: pointer to t_adc_convert_param.
*/
#define PMIC_ADC_CONVERT_8X _IOWR('p', 0xb3, int)
/*!
* Convert multiple channels.
* Argument type: pointer to t_adc_convert_param.
*/
#define PMIC_ADC_CONVERT_MULTICHANNEL _IOWR('p', 0xb4, int)
/*!
* Set touch screen operation mode.
* Argument type: t_touch_mode.
*/
#define PMIC_ADC_SET_TOUCH_MODE _IOW('p', 0xb5, int)
/*!
* Get touch screen operation mode.
* Argument type: pointer to t_touch_mode.
*/
#define PMIC_ADC_GET_TOUCH_MODE _IOR('p', 0xb6, int)
/*!
* Get touch screen sample.
* Argument type: pointer to t_touch_sample.
*/
#define PMIC_ADC_GET_TOUCH_SAMPLE _IOWR('p', 0xb7, int)
/*!
* Get battery current.
* Argument type: pointer to unsigned short.
*/
#define PMIC_ADC_GET_BATTERY_CURRENT _IOR('p', 0xb8, int)
/*!
* Activate comparator.
* Argument type: pointer to t_adc_comp_param.
*/
#define PMIC_ADC_ACTIVATE_COMPARATOR _IOW('p', 0xb9, int)
/*!
* De-active comparator.
* Argument type: none.
*/
#define PMIC_ADC_DEACTIVE_COMPARATOR _IOW('p', 0xba, int)
/*!
* Install touch screen read interface.
*/
#define TOUCH_SCREEN_READ_INSTALL _IOWR('D', 4, int)
/*!
* Remove touch screen read interface.
*/
#define TOUCH_SCREEN_READ_UNINSTALL _IOWR('D', 5, int)
/*! @{ */
/*!
* @name Touch Screen minimum and maximum values
*/
#define TS_X_MIN 80 /*! < Minimum X */
#define TS_Y_MIN 80 /*! < Minimum Y */
#define TS_X_MAX 1000 /*! < Maximum X */
#define TS_Y_MAX 1000 /*! < Maximum Y */
/*! @} */
/*!
* This enumeration defines input channels for PMIC ADC
*/
typedef enum {
BATTERY_VOLTAGE,
BATTERY_CURRENT,
CHARGE_VOLTAGE,
CHARGE_CURRENT,
APPLICATION_SUPPLY,
TS_X_POS1,
TS_X_POS2,
TS_Y_POS1,
TS_Y_POS2,
GEN_PURPOSE_AD4,
GEN_PURPOSE_AD5,
GEN_PURPOSE_AD6,
GEN_PURPOSE_AD7,
GEN_PURPOSE_AD8,
GEN_PURPOSE_AD9,
GEN_PURPOSE_AD10,
GEN_PURPOSE_AD11,
USB_ID,
LICELL,
RAWEXTBPLUSSENSE,
MPBSENSE,
BATSENSE,
GND,
THERMISTOR,
DIE_TEMP
} t_channel;
/*!
* This enumeration defines reason of ADC Comparator interrupt.
*/
typedef enum {
/*!
* Greater than WHIGH
*/
GTWHIGH,
/*!
* Less than WLOW
*/
LTWLOW,
} t_comp_exception;
/*!
* ADC comparator callback function type
*/
typedef void (*t_comparator_cb) (t_comp_exception reason);
/*!
* This enumeration defines the touch screen operation modes.
*/
typedef enum {
/*!
* Touch Screen X position
*/
TS_X_POSITION = 0,
/*!
* Touch Screen Y position
*/
TS_Y_POSITION = 1,
/*!
* Pressure
*/
TS_PRESSURE = 2,
/*!
* Plate X
*/
TS_PLATE_X = 3,
/*!
* Plate Y
*/
TS_PLATE_Y = 4,
/*!
* Standby
*/
TS_STANDBY = 5,
/*!
* No touch screen, TSX1, TSX2, TSY1 and TSY2 are used as general
* purpose A/D inputs.
*/
TS_NONE = 6,
} t_touch_mode;
/*!
* This structure is used to report touch screen value.
*/
typedef struct {
/*!
* Touch Screen X position
*/
unsigned int x_position;
/*!
* Touch Screen X position1
*/
unsigned int x_position1;
/*!
* Touch Screen X position2
*/
unsigned int x_position2;
/*!
* Touch Screen X position3
*/
unsigned int x_position3;
/*!
* Touch Screen Y position
*/
unsigned int y_position;
/*!
* Touch Screen Y position1
*/
unsigned int y_position1;
/*!
* Touch Screen Y position2
*/
unsigned int y_position2;
/*!
* Touch Screen Y position3
*/
unsigned int y_position3;
/*!
* Touch Screen contact value
*/
unsigned int contact_resistance;
} t_touch_screen;
/*!
* This enumeration defines ADC conversion modes.
*/
typedef enum {
/*!
* Sample 8 channels, 1 sample per channel
*/
ADC_8CHAN_1X = 0,
/*!
* Sample 1 channel 8 times
*/
ADC_1CHAN_8X,
} t_conversion_mode;
/*!
* This structure is used with IOCTL code \a PMIC_ADC_CONVERT,
* \a PMIC_ADC_CONVERT_8X and \a PMIC_ADC_CONVERT_MULTICHANNEL.
*/
typedef struct {
/*!
* channel or channels to be sampled.
*/
t_channel channel;
/*!
* holds up to 16 sampling results
*/
unsigned short result[16];
} t_adc_convert_param;
/*!
* This structure is used to activate/deactivate ADC comparator.
*/
typedef struct {
/*!
* wlow.
*/
unsigned char wlow;
/*!
* whigh.
*/
unsigned char whigh;
/*!
* channel to monitor
*/
t_channel channel;
/*!
* callback function.
*/
t_comparator_cb callback;
} t_adc_comp_param;
/* EXPORTED FUNCTIONS */
#ifdef __KERNEL__
/*!
* This function initializes all ADC registers with default values. This
* function also registers the interrupt events.
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_init(void);
/*!
* This function disables the ADC, de-registers the interrupt events.
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_deinit(void);
/*!
* This function triggers a conversion and returns one sampling result of one
* channel.
*
* @param channel The channel to be sampled
* @param result The pointer to the conversion result. The memory
* should be allocated by the caller of this function.
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_convert(t_channel channel, unsigned short *result);
/*!
* This function triggers a conversion and returns eight sampling results of
* one channel.
*
* @param channel The channel to be sampled
* @param result The pointer to array to store eight sampling results.
* The memory should be allocated by the caller of this
* function.
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_convert_8x(t_channel channel, unsigned short *result);
/*!
* This function triggers a conversion and returns sampling results of each
* specified channel.
*
* @param channels This input parameter is bitmap to specify channels
* to be sampled.
* @param result The pointer to array to store sampling result.
* The order of the result in the array is from lowest
* channel number to highest channel number of the
* sampled channels.
* The memory should be allocated by the caller of this
* function.
* Note that the behavior of this function might differ
* from one platform to another regarding especially
* channels order.
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_convert_multichnnel(t_channel channels,
unsigned short *result);
/*!
* This function sets touch screen operation mode.
*
* @param touch_mode Touch screen operation mode.
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_set_touch_mode(t_touch_mode touch_mode);
/*!
* This function retrieves the current touch screen operation mode.
*
* @param touch_mode Pointer to the retrieved touch screen operation
* mode.
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_get_touch_mode(t_touch_mode *touch_mode);
/*!
* This function retrieves the current touch screen operation mode.
*
* @param touch_sample Pointer to touch sample.
* @param wait Indicates if this function needs to block or not.
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_get_touch_sample(t_touch_screen *ts_value, int wait);
/*!
* This function starts a Battery Current mode conversion.
*
* @param mode Conversion mode.
* @param result Battery Current measurement result.
* if \a mode = ADC_8CHAN_1X, the result is \n
* result[0] = (BATTP - BATT_I) \n
* if \a mode = ADC_1CHAN_8X, the result is \n
* result[0] = BATTP \n
* result[1] = BATT_I \n
* result[2] = BATTP \n
* result[3] = BATT_I \n
* result[4] = BATTP \n
* result[5] = BATT_I \n
* result[6] = BATTP \n
* result[7] = BATT_I
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_get_battery_current(t_conversion_mode mode,
unsigned short *result);
/*!
* This function actives the comparator. When comparator is activated and ADC
* is enabled, the 8th converted value will be digitally compared against the
* window defined by WLOW and WHIGH registers.
*
* @param low Comparison window low threshold (WLOW).
* @param high Comparison window high threshold (WHIGH).
* @param callback Callback function to be called when the converted
* value is beyond the comparison window. The callback
* function will pass a parameter of type
* \b t_comp_expection to indicate the reason of
* comparator exception.
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_active_comparator(unsigned char low,
unsigned char high,
t_channel channel,
t_comparator_cb callback);
/*!
* This function de-actives the comparator.
*
* @return This function returns PMIC_SUCCESS if successful.
*/
PMIC_STATUS pmic_adc_deactive_comparator(void);
/*!
* This function enables the touch screen read interface.
*
* @return This function returns 0 if successful.
*/
PMIC_STATUS pmic_adc_install_ts(void);
/*!
* This function disables the touch screen read interface.
*
* @return This function returns 0 if successful.
*/
PMIC_STATUS pmic_adc_remove_ts(void);
int is_pmic_adc_ready(void);
#endif /* _KERNEL */
#endif /* __ASM_ARCH_MXC_PMIC_ADC_H__ */