/* * Copyright 2009-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_IMX_ADC_H__ #define __ASM_ARCH_IMX_ADC_H__ /*! * @defgroup IMX_ADC Digitizer Driver * @ingroup IMX_DRVRS */ /*! * @file arch-mxc/imx_adc.h * @brief This is the header of IMX ADC driver. * * @ingroup IMX_ADC */ #include /*! * @enum IMX_ADC_STATUS * @brief Define return values for all IMX_ADC APIs. * * These return values are used by all of the IMX_ADC APIs. * * @ingroup IMX_ADC */ enum IMX_ADC_STATUS { /*! The requested operation was successfully completed. */ IMX_ADC_SUCCESS = 0, /*! The requested operation could not be completed due to an error. */ IMX_ADC_ERROR = -1, /*! * The requested operation failed because one or more of the * parameters was invalid. */ IMX_ADC_PARAMETER_ERROR = -2, /*! * The requested operation could not be completed because the ADC * hardware does not support it. */ IMX_ADC_NOT_SUPPORTED = -3, /*! Error in malloc function */ IMX_ADC_MALLOC_ERROR = -5, /*! Error in un-subscribe event */ IMX_ADC_UNSUBSCRIBE_ERROR = -6, /*! Event occur and not subscribed */ IMX_ADC_EVENT_NOT_SUBSCRIBED = -7, /*! Error - bad call back */ IMX_ADC_EVENT_CALL_BACK = -8, /*! * The requested operation could not be completed because there * are too many ADC client requests */ IMX_ADC_CLIENT_NBOVERFLOW = -9, }; /* * Macros implementing error handling */ #define CHECK_ERROR(a) \ do { \ int ret = (a); \ if (ret != IMX_ADC_SUCCESS) \ return ret; \ } while (0) #define CHECK_ERROR_KFREE(func, freeptrs) \ do { \ int ret = (func); \ if (ret != IMX_ADC_SUCCESS) { \ freeptrs; \ return ret; \ } \ } while (0) #define MOD_NAME "mxcadc" /*! * @name IOCTL user space interface */ /*! * Initialize ADC. * Argument type: none. */ #define IMX_ADC_INIT _IO('p', 0xb0) /*! * De-initialize ADC. * Argument type: none. */ #define IMX_ADC_DEINIT _IO('p', 0xb1) /*! * Convert one channel. * Argument type: pointer to t_adc_convert_param. */ #define IMX_ADC_CONVERT _IOWR('p', 0xb2, int) /*! * Convert multiple channels. * Argument type: pointer to t_adc_convert_param. */ #define IMX_ADC_CONVERT_MULTICHANNEL _IOWR('p', 0xb4, int) /*! @{ */ /*! * @name Touch Screen minimum and maximum values */ #define IMX_ADC_DEVICE "/dev/imx_adc" /* * Maximun allowed variation in the three X/Y co-ordinates acquired from * touch screen */ #define DELTA_Y_MAX 100 #define DELTA_X_MAX 100 /* Upon clearing the filter, this is the delay in restarting the filter */ #define FILTER_MIN_DELAY 4 /* Length of X and Y touch screen filters */ #define FILTLEN 3 #define TS_X_MAX 1000 #define TS_Y_MAX 1000 #define TS_X_MIN 80 #define TS_Y_MIN 80 /*! @} */ /*! * This enumeration defines input channels for IMX ADC */ enum t_channel { TS_X_POS, TS_Y_POS, GER_PURPOSE_ADC0, GER_PURPOSE_ADC1, GER_PURPOSE_ADC2, GER_PURPOSE_MULTICHNNEL, }; /*! * This structure is used to report touch screen value. */ struct t_touch_screen { /* 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; /* Flag indicate the data usability */ unsigned int valid_flag; }; /*! * This structure is used with IOCTL code \a IMX_ADC_CONVERT, * \a IMX_ADC_CONVERT_8X and \a IMX_ADC_CONVERT_MULTICHANNEL. */ struct t_adc_convert_param { /* channel or channels to be sampled. */ enum t_channel channel; /* holds up to 16 sampling results */ unsigned short result[16]; }; /* EXPORTED FUNCTIONS */ #ifdef __KERNEL__ /* Driver data */ struct imx_adc_data { u32 irq; struct clk *adc_clk; }; /*! * This function initializes all ADC registers with default values. This * function also registers the interrupt events. * * @return This function returns IMX_ADC_SUCCESS if successful. */ enum IMX_ADC_STATUS imx_adc_init(void); /*! * This function disables the ADC, de-registers the interrupt events. * * @return This function returns IMX_ADC_SUCCESS if successful. */ enum IMX_ADC_STATUS imx_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 IMX_ADC_SUCCESS if successful. */ enum IMX_ADC_STATUS imx_adc_convert(enum 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 IMX_ADC_SUCCESS if successful. */ enum IMX_ADC_STATUS imx_adc_convert_multichnnel(enum t_channel channels, unsigned short *result); /*! * This function retrieves the current touch screen operation mode. * * @param touch_sample Pointer to touch sample. * @param wait_tsi if true, we wait until interrupt occurs * @return This function returns IMX_ADC_SUCCESS if successful. */ enum IMX_ADC_STATUS imx_adc_get_touch_sample(struct t_touch_screen *ts_value, int wait_tsi); /*! * This function read the touch screen value. * * @param touch_sample return value of touch screen * @param wait_tsi if true, we need wait until interrupt occurs * @return This function returns 0. */ enum IMX_ADC_STATUS imx_adc_read_ts(struct t_touch_screen *touch_sample, int wait_tsi); int is_imx_adc_ready(void); #endif /* _KERNEL */ #endif /* __ASM_ARCH_IMX_ADC_H__ */