1*c06c4d79SBrian Masney /* SPDX-License-Identifier: GPL-2.0+ */ 2*c06c4d79SBrian Masney /* 3*c06c4d79SBrian Masney * Device driver for monitoring ambient light intensity (lux) 4*c06c4d79SBrian Masney * and proximity (prox) within the TAOS TSL2772 family of devices. 5*c06c4d79SBrian Masney * 6*c06c4d79SBrian Masney * Copyright (c) 2012, TAOS Corporation. 7*c06c4d79SBrian Masney * Copyright (c) 2017-2018 Brian Masney <[email protected]> 8*c06c4d79SBrian Masney */ 9*c06c4d79SBrian Masney 10*c06c4d79SBrian Masney #ifndef __TSL2772_H 11*c06c4d79SBrian Masney #define __TSL2772_H 12*c06c4d79SBrian Masney 13*c06c4d79SBrian Masney struct tsl2772_lux { 14*c06c4d79SBrian Masney unsigned int ch0; 15*c06c4d79SBrian Masney unsigned int ch1; 16*c06c4d79SBrian Masney }; 17*c06c4d79SBrian Masney 18*c06c4d79SBrian Masney /* Max number of segments allowable in LUX table */ 19*c06c4d79SBrian Masney #define TSL2772_MAX_LUX_TABLE_SIZE 6 20*c06c4d79SBrian Masney /* The default LUX tables all have 3 elements. */ 21*c06c4d79SBrian Masney #define TSL2772_DEF_LUX_TABLE_SZ 3 22*c06c4d79SBrian Masney #define TSL2772_DEFAULT_TABLE_BYTES (sizeof(struct tsl2772_lux) * \ 23*c06c4d79SBrian Masney TSL2772_DEF_LUX_TABLE_SZ) 24*c06c4d79SBrian Masney 25*c06c4d79SBrian Masney /* Proximity diode to use */ 26*c06c4d79SBrian Masney #define TSL2772_DIODE0 0x01 27*c06c4d79SBrian Masney #define TSL2772_DIODE1 0x02 28*c06c4d79SBrian Masney #define TSL2772_DIODE_BOTH 0x03 29*c06c4d79SBrian Masney 30*c06c4d79SBrian Masney /* LED Power */ 31*c06c4d79SBrian Masney #define TSL2772_100_mA 0x00 32*c06c4d79SBrian Masney #define TSL2772_50_mA 0x01 33*c06c4d79SBrian Masney #define TSL2772_25_mA 0x02 34*c06c4d79SBrian Masney #define TSL2772_13_mA 0x03 35*c06c4d79SBrian Masney 36*c06c4d79SBrian Masney /** 37*c06c4d79SBrian Masney * struct tsl2772_settings - Settings for the tsl2772 driver 38*c06c4d79SBrian Masney * @als_time: Integration time of the ALS channel ADCs in 2.73 ms 39*c06c4d79SBrian Masney * increments. Total integration time is 40*c06c4d79SBrian Masney * (256 - als_time) * 2.73. 41*c06c4d79SBrian Masney * @als_gain: Index into the tsl2772_als_gain array. 42*c06c4d79SBrian Masney * @als_gain_trim: Default gain trim to account for aperture effects. 43*c06c4d79SBrian Masney * @wait_time: Time between proximity and ALS cycles in 2.73 44*c06c4d79SBrian Masney * periods. 45*c06c4d79SBrian Masney * @prox_time: Integration time of the proximity ADC in 2.73 ms 46*c06c4d79SBrian Masney * increments. Total integration time is 47*c06c4d79SBrian Masney * (256 - prx_time) * 2.73. 48*c06c4d79SBrian Masney * @prox_gain: Index into the tsl2772_prx_gain array. 49*c06c4d79SBrian Masney * @als_prox_config: The value of the ALS / Proximity configuration 50*c06c4d79SBrian Masney * register. 51*c06c4d79SBrian Masney * @als_cal_target: Known external ALS reading for calibration. 52*c06c4d79SBrian Masney * @als_persistence: H/W Filters, Number of 'out of limits' ALS readings. 53*c06c4d79SBrian Masney * @als_interrupt_en: Enable/Disable ALS interrupts 54*c06c4d79SBrian Masney * @als_thresh_low: CH0 'low' count to trigger interrupt. 55*c06c4d79SBrian Masney * @als_thresh_high: CH0 'high' count to trigger interrupt. 56*c06c4d79SBrian Masney * @prox_persistence: H/W Filters, Number of 'out of limits' proximity 57*c06c4d79SBrian Masney * readings. 58*c06c4d79SBrian Masney * @prox_interrupt_en: Enable/Disable proximity interrupts. 59*c06c4d79SBrian Masney * @prox_thres_low: Low threshold proximity detection. 60*c06c4d79SBrian Masney * @prox_thres_high: High threshold proximity detection. 61*c06c4d79SBrian Masney * @prox_pulse_count: Number if proximity emitter pulses. 62*c06c4d79SBrian Masney * @prox_max_samples_cal: The number of samples that are taken when performing 63*c06c4d79SBrian Masney * a proximity calibration. 64*c06c4d79SBrian Masney * @prox_diode Which diode(s) to use for driving the external 65*c06c4d79SBrian Masney * LED(s) for proximity sensing. 66*c06c4d79SBrian Masney * @prox_power The amount of power to use for the external LED(s). 67*c06c4d79SBrian Masney */ 68*c06c4d79SBrian Masney struct tsl2772_settings { 69*c06c4d79SBrian Masney int als_time; 70*c06c4d79SBrian Masney int als_gain; 71*c06c4d79SBrian Masney int als_gain_trim; 72*c06c4d79SBrian Masney int wait_time; 73*c06c4d79SBrian Masney int prox_time; 74*c06c4d79SBrian Masney int prox_gain; 75*c06c4d79SBrian Masney int als_prox_config; 76*c06c4d79SBrian Masney int als_cal_target; 77*c06c4d79SBrian Masney u8 als_persistence; 78*c06c4d79SBrian Masney bool als_interrupt_en; 79*c06c4d79SBrian Masney int als_thresh_low; 80*c06c4d79SBrian Masney int als_thresh_high; 81*c06c4d79SBrian Masney u8 prox_persistence; 82*c06c4d79SBrian Masney bool prox_interrupt_en; 83*c06c4d79SBrian Masney int prox_thres_low; 84*c06c4d79SBrian Masney int prox_thres_high; 85*c06c4d79SBrian Masney int prox_pulse_count; 86*c06c4d79SBrian Masney int prox_max_samples_cal; 87*c06c4d79SBrian Masney int prox_diode; 88*c06c4d79SBrian Masney int prox_power; 89*c06c4d79SBrian Masney }; 90*c06c4d79SBrian Masney 91*c06c4d79SBrian Masney /** 92*c06c4d79SBrian Masney * struct tsl2772_platform_data - Platform callback, glass and defaults 93*c06c4d79SBrian Masney * @platform_lux_table: Device specific glass coefficents 94*c06c4d79SBrian Masney * @platform_default_settings: Device specific power on defaults 95*c06c4d79SBrian Masney */ 96*c06c4d79SBrian Masney struct tsl2772_platform_data { 97*c06c4d79SBrian Masney struct tsl2772_lux platform_lux_table[TSL2772_MAX_LUX_TABLE_SIZE]; 98*c06c4d79SBrian Masney struct tsl2772_settings *platform_default_settings; 99*c06c4d79SBrian Masney }; 100*c06c4d79SBrian Masney 101*c06c4d79SBrian Masney #endif /* __TSL2772_H */ 102