/*
 * Device driver for monitoring ambient light intensity (lux)
 * and proximity (prox) within the TAOS TSL2X7X family of devices.
 *
 * Copyright (c) 2012, TAOS Corporation.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA	02110-1301, USA.
 */

#ifndef __TSL2X7X_H
#define __TSL2X7X_H
#include <linux/pm.h>

/* Max number of segments allowable in LUX table */
#define TSL2X7X_MAX_LUX_TABLE_SIZE		9
#define MAX_DEFAULT_TABLE_BYTES (sizeof(int) * TSL2X7X_MAX_LUX_TABLE_SIZE)

struct iio_dev;

struct tsl2x7x_lux {
	unsigned int ratio;
	unsigned int ch0;
	unsigned int ch1;
};

/**
 * struct tsl2x7x_default_settings - power on defaults unless
 *                                   overridden by platform data.
 *  @als_time:              ALS Integration time - multiple of 50mS
 *  @als_gain:              Index into the ALS gain table.
 *  @als_gain_trim:         default gain trim to account for
 *                          aperture effects.
 *  @wait_time:             Time between PRX and ALS cycles
 *                          in 2.7 periods
 *  @prx_time:              5.2ms prox integration time -
 *                          decrease in 2.7ms periods
 *  @prx_gain:              Proximity gain index
 *  @prox_config:           Prox configuration filters.
 *  @als_cal_target:        Known external ALS reading for
 *                          calibration.
 *  @interrupts_en:         Enable/Disable - 0x00 = none, 0x10 = als,
 *                                           0x20 = prx,  0x30 = bth
 *  @persistence:           H/W Filters, Number of 'out of limits'
 *                          ADC readings PRX/ALS.
 *  @als_thresh_low:        CH0 'low' count to trigger interrupt.
 *  @als_thresh_high:       CH0 'high' count to trigger interrupt.
 *  @prox_thres_low:        Low threshold proximity detection.
 *  @prox_thres_high:       High threshold proximity detection
 *  @prox_pulse_count:      Number if proximity emitter pulses
 *  @prox_max_samples_cal:  Used for prox cal.
 */
struct tsl2x7x_settings {
	int als_time;
	int als_gain;
	int als_gain_trim;
	int wait_time;
	int prx_time;
	int prox_gain;
	int prox_config;
	int als_cal_target;
	u8  interrupts_en;
	u8  persistence;
	int als_thresh_low;
	int als_thresh_high;
	int prox_thres_low;
	int prox_thres_high;
	int prox_pulse_count;
	int prox_max_samples_cal;
};

/**
 * struct tsl2X7X_platform_data - Platform callback, glass and defaults
 * @platform_power:            Suspend/resume platform callback
 * @power_on:                  Power on callback
 * @power_off:                 Power off callback
 * @platform_lux_table:        Device specific glass coefficents
 * @platform_default_settings: Device specific power on defaults
 *
 */
struct tsl2X7X_platform_data {
	int (*platform_power)(struct device *dev, pm_message_t);
	int (*power_on)      (struct iio_dev *indio_dev);
	int (*power_off)     (struct i2c_client *dev);
	struct tsl2x7x_lux platform_lux_table[TSL2X7X_MAX_LUX_TABLE_SIZE];
	struct tsl2x7x_settings *platform_default_settings;
};

#endif /* __TSL2X7X_H */
