/*
 * STMicroelectronics gyroscopes driver
 *
 * Copyright 2012-2013 STMicroelectronics Inc.
 *
 * Denis Ciocca <denis.ciocca@st.com>
 *
 * Licensed under the GPL-2.
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/mutex.h>
#include <linux/interrupt.h>
#include <linux/i2c.h>
#include <linux/gpio.h>
#include <linux/irq.h>
#include <linux/delay.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/iio/trigger.h>
#include <linux/iio/buffer.h>

#include <linux/iio/common/st_sensors.h>
#include "st_gyro.h"

/* DEFAULT VALUE FOR SENSORS */
#define ST_GYRO_DEFAULT_OUT_X_L_ADDR		0x28
#define ST_GYRO_DEFAULT_OUT_Y_L_ADDR		0x2a
#define ST_GYRO_DEFAULT_OUT_Z_L_ADDR		0x2c

/* FULLSCALE */
#define ST_GYRO_FS_AVL_250DPS			250
#define ST_GYRO_FS_AVL_500DPS			500
#define ST_GYRO_FS_AVL_2000DPS			2000

/* CUSTOM VALUES FOR SENSOR 1 */
#define ST_GYRO_1_WAI_EXP			0xd3
#define ST_GYRO_1_ODR_ADDR			0x20
#define ST_GYRO_1_ODR_MASK			0xc0
#define ST_GYRO_1_ODR_AVL_100HZ_VAL		0x00
#define ST_GYRO_1_ODR_AVL_200HZ_VAL		0x01
#define ST_GYRO_1_ODR_AVL_400HZ_VAL		0x02
#define ST_GYRO_1_ODR_AVL_800HZ_VAL		0x03
#define ST_GYRO_1_PW_ADDR			0x20
#define ST_GYRO_1_PW_MASK			0x08
#define ST_GYRO_1_FS_ADDR			0x23
#define ST_GYRO_1_FS_MASK			0x30
#define ST_GYRO_1_FS_AVL_250_VAL		0x00
#define ST_GYRO_1_FS_AVL_500_VAL		0x01
#define ST_GYRO_1_FS_AVL_2000_VAL		0x02
#define ST_GYRO_1_FS_AVL_250_GAIN		IIO_DEGREE_TO_RAD(8750)
#define ST_GYRO_1_FS_AVL_500_GAIN		IIO_DEGREE_TO_RAD(17500)
#define ST_GYRO_1_FS_AVL_2000_GAIN		IIO_DEGREE_TO_RAD(70000)
#define ST_GYRO_1_BDU_ADDR			0x23
#define ST_GYRO_1_BDU_MASK			0x80
#define ST_GYRO_1_DRDY_IRQ_ADDR			0x22
#define ST_GYRO_1_DRDY_IRQ_MASK			0x08
#define ST_GYRO_1_MULTIREAD_BIT			true

/* CUSTOM VALUES FOR SENSOR 2 */
#define ST_GYRO_2_WAI_EXP			0xd4
#define ST_GYRO_2_ODR_ADDR			0x20
#define ST_GYRO_2_ODR_MASK			0xc0
#define ST_GYRO_2_ODR_AVL_95HZ_VAL		0x00
#define ST_GYRO_2_ODR_AVL_190HZ_VAL		0x01
#define ST_GYRO_2_ODR_AVL_380HZ_VAL		0x02
#define ST_GYRO_2_ODR_AVL_760HZ_VAL		0x03
#define ST_GYRO_2_PW_ADDR			0x20
#define ST_GYRO_2_PW_MASK			0x08
#define ST_GYRO_2_FS_ADDR			0x23
#define ST_GYRO_2_FS_MASK			0x30
#define ST_GYRO_2_FS_AVL_250_VAL		0x00
#define ST_GYRO_2_FS_AVL_500_VAL		0x01
#define ST_GYRO_2_FS_AVL_2000_VAL		0x02
#define ST_GYRO_2_FS_AVL_250_GAIN		IIO_DEGREE_TO_RAD(8750)
#define ST_GYRO_2_FS_AVL_500_GAIN		IIO_DEGREE_TO_RAD(17500)
#define ST_GYRO_2_FS_AVL_2000_GAIN		IIO_DEGREE_TO_RAD(70000)
#define ST_GYRO_2_BDU_ADDR			0x23
#define ST_GYRO_2_BDU_MASK			0x80
#define ST_GYRO_2_DRDY_IRQ_ADDR			0x22
#define ST_GYRO_2_DRDY_IRQ_MASK			0x08
#define ST_GYRO_2_MULTIREAD_BIT			true

static const struct iio_chan_spec st_gyro_16bit_channels[] = {
	ST_SENSORS_LSM_CHANNELS(IIO_ANGL_VEL, ST_SENSORS_SCAN_X,
		IIO_MOD_X, IIO_LE, ST_SENSORS_DEFAULT_16_REALBITS,
						ST_GYRO_DEFAULT_OUT_X_L_ADDR),
	ST_SENSORS_LSM_CHANNELS(IIO_ANGL_VEL, ST_SENSORS_SCAN_Y,
		IIO_MOD_Y, IIO_LE, ST_SENSORS_DEFAULT_16_REALBITS,
						ST_GYRO_DEFAULT_OUT_Y_L_ADDR),
	ST_SENSORS_LSM_CHANNELS(IIO_ANGL_VEL, ST_SENSORS_SCAN_Z,
		IIO_MOD_Z, IIO_LE, ST_SENSORS_DEFAULT_16_REALBITS,
						ST_GYRO_DEFAULT_OUT_Z_L_ADDR),
	IIO_CHAN_SOFT_TIMESTAMP(3)
};

static const struct st_sensors st_gyro_sensors[] = {
	{
		.wai = ST_GYRO_1_WAI_EXP,
		.sensors_supported = {
			[0] = L3G4200D_GYRO_DEV_NAME,
			[1] = LSM330DL_GYRO_DEV_NAME,
		},
		.ch = (struct iio_chan_spec *)st_gyro_16bit_channels,
		.odr = {
			.addr = ST_GYRO_1_ODR_ADDR,
			.mask = ST_GYRO_1_ODR_MASK,
			.odr_avl = {
				{ 100, ST_GYRO_1_ODR_AVL_100HZ_VAL, },
				{ 200, ST_GYRO_1_ODR_AVL_200HZ_VAL, },
				{ 400, ST_GYRO_1_ODR_AVL_400HZ_VAL, },
				{ 800, ST_GYRO_1_ODR_AVL_800HZ_VAL, },
			},
		},
		.pw = {
			.addr = ST_GYRO_1_PW_ADDR,
			.mask = ST_GYRO_1_PW_MASK,
			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
		},
		.enable_axis = {
			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
		},
		.fs = {
			.addr = ST_GYRO_1_FS_ADDR,
			.mask = ST_GYRO_1_FS_MASK,
			.fs_avl = {
				[0] = {
					.num = ST_GYRO_FS_AVL_250DPS,
					.value = ST_GYRO_1_FS_AVL_250_VAL,
					.gain = ST_GYRO_1_FS_AVL_250_GAIN,
				},
				[1] = {
					.num = ST_GYRO_FS_AVL_500DPS,
					.value = ST_GYRO_1_FS_AVL_500_VAL,
					.gain = ST_GYRO_1_FS_AVL_500_GAIN,
				},
				[2] = {
					.num = ST_GYRO_FS_AVL_2000DPS,
					.value = ST_GYRO_1_FS_AVL_2000_VAL,
					.gain = ST_GYRO_1_FS_AVL_2000_GAIN,
				},
			},
		},
		.bdu = {
			.addr = ST_GYRO_1_BDU_ADDR,
			.mask = ST_GYRO_1_BDU_MASK,
		},
		.drdy_irq = {
			.addr = ST_GYRO_1_DRDY_IRQ_ADDR,
			.mask = ST_GYRO_1_DRDY_IRQ_MASK,
		},
		.multi_read_bit = ST_GYRO_1_MULTIREAD_BIT,
		.bootime = 2,
	},
	{
		.wai = ST_GYRO_2_WAI_EXP,
		.sensors_supported = {
			[0] = L3GD20_GYRO_DEV_NAME,
			[1] = L3GD20H_GYRO_DEV_NAME,
			[2] = LSM330D_GYRO_DEV_NAME,
			[3] = LSM330DLC_GYRO_DEV_NAME,
			[4] = L3G4IS_GYRO_DEV_NAME,
			[5] = LSM330_GYRO_DEV_NAME,
		},
		.ch = (struct iio_chan_spec *)st_gyro_16bit_channels,
		.odr = {
			.addr = ST_GYRO_2_ODR_ADDR,
			.mask = ST_GYRO_2_ODR_MASK,
			.odr_avl = {
				{ 95, ST_GYRO_2_ODR_AVL_95HZ_VAL, },
				{ 190, ST_GYRO_2_ODR_AVL_190HZ_VAL, },
				{ 380, ST_GYRO_2_ODR_AVL_380HZ_VAL, },
				{ 760, ST_GYRO_2_ODR_AVL_760HZ_VAL, },
			},
		},
		.pw = {
			.addr = ST_GYRO_2_PW_ADDR,
			.mask = ST_GYRO_2_PW_MASK,
			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
		},
		.enable_axis = {
			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
		},
		.fs = {
			.addr = ST_GYRO_2_FS_ADDR,
			.mask = ST_GYRO_2_FS_MASK,
			.fs_avl = {
				[0] = {
					.num = ST_GYRO_FS_AVL_250DPS,
					.value = ST_GYRO_2_FS_AVL_250_VAL,
					.gain = ST_GYRO_2_FS_AVL_250_GAIN,
				},
				[1] = {
					.num = ST_GYRO_FS_AVL_500DPS,
					.value = ST_GYRO_2_FS_AVL_500_VAL,
					.gain = ST_GYRO_2_FS_AVL_500_GAIN,
				},
				[2] = {
					.num = ST_GYRO_FS_AVL_2000DPS,
					.value = ST_GYRO_2_FS_AVL_2000_VAL,
					.gain = ST_GYRO_2_FS_AVL_2000_GAIN,
				},
			},
		},
		.bdu = {
			.addr = ST_GYRO_2_BDU_ADDR,
			.mask = ST_GYRO_2_BDU_MASK,
		},
		.drdy_irq = {
			.addr = ST_GYRO_2_DRDY_IRQ_ADDR,
			.mask = ST_GYRO_2_DRDY_IRQ_MASK,
		},
		.multi_read_bit = ST_GYRO_2_MULTIREAD_BIT,
		.bootime = 2,
	},
};

static int st_gyro_read_raw(struct iio_dev *indio_dev,
			struct iio_chan_spec const *ch, int *val,
							int *val2, long mask)
{
	int err;
	struct st_sensor_data *gdata = iio_priv(indio_dev);

	switch (mask) {
	case IIO_CHAN_INFO_RAW:
		err = st_sensors_read_info_raw(indio_dev, ch, val);
		if (err < 0)
			goto read_error;

		return IIO_VAL_INT;
	case IIO_CHAN_INFO_SCALE:
		*val = 0;
		*val2 = gdata->current_fullscale->gain;
		return IIO_VAL_INT_PLUS_MICRO;
	default:
		return -EINVAL;
	}

read_error:
	return err;
}

static int st_gyro_write_raw(struct iio_dev *indio_dev,
		struct iio_chan_spec const *chan, int val, int val2, long mask)
{
	int err;

	switch (mask) {
	case IIO_CHAN_INFO_SCALE:
		err = st_sensors_set_fullscale_by_gain(indio_dev, val2);
		break;
	default:
		err = -EINVAL;
	}

	return err;
}

static ST_SENSOR_DEV_ATTR_SAMP_FREQ();
static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();
static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_anglvel_scale_available);

static struct attribute *st_gyro_attributes[] = {
	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
	&iio_dev_attr_in_anglvel_scale_available.dev_attr.attr,
	&iio_dev_attr_sampling_frequency.dev_attr.attr,
	NULL,
};

static const struct attribute_group st_gyro_attribute_group = {
	.attrs = st_gyro_attributes,
};

static const struct iio_info gyro_info = {
	.driver_module = THIS_MODULE,
	.attrs = &st_gyro_attribute_group,
	.read_raw = &st_gyro_read_raw,
	.write_raw = &st_gyro_write_raw,
};

#ifdef CONFIG_IIO_TRIGGER
static const struct iio_trigger_ops st_gyro_trigger_ops = {
	.owner = THIS_MODULE,
	.set_trigger_state = ST_GYRO_TRIGGER_SET_STATE,
};
#define ST_GYRO_TRIGGER_OPS (&st_gyro_trigger_ops)
#else
#define ST_GYRO_TRIGGER_OPS NULL
#endif

int st_gyro_common_probe(struct iio_dev *indio_dev)
{
	int err;
	struct st_sensor_data *gdata = iio_priv(indio_dev);

	indio_dev->modes = INDIO_DIRECT_MODE;
	indio_dev->info = &gyro_info;

	err = st_sensors_check_device_support(indio_dev,
				ARRAY_SIZE(st_gyro_sensors), st_gyro_sensors);
	if (err < 0)
		goto st_gyro_common_probe_error;

	gdata->multiread_bit = gdata->sensor->multi_read_bit;
	indio_dev->channels = gdata->sensor->ch;
	indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;

	gdata->current_fullscale = (struct st_sensor_fullscale_avl *)
						&gdata->sensor->fs.fs_avl[0];
	gdata->odr = gdata->sensor->odr.odr_avl[0].hz;

	err = st_sensors_init_sensor(indio_dev);
	if (err < 0)
		goto st_gyro_common_probe_error;

	if (gdata->get_irq_data_ready(indio_dev) > 0) {
		err = st_gyro_allocate_ring(indio_dev);
		if (err < 0)
			goto st_gyro_common_probe_error;

		err = st_sensors_allocate_trigger(indio_dev,
						  ST_GYRO_TRIGGER_OPS);
		if (err < 0)
			goto st_gyro_probe_trigger_error;
	}

	err = iio_device_register(indio_dev);
	if (err)
		goto st_gyro_device_register_error;

	return err;

st_gyro_device_register_error:
	if (gdata->get_irq_data_ready(indio_dev) > 0)
		st_sensors_deallocate_trigger(indio_dev);
st_gyro_probe_trigger_error:
	if (gdata->get_irq_data_ready(indio_dev) > 0)
		st_gyro_deallocate_ring(indio_dev);
st_gyro_common_probe_error:
	return err;
}
EXPORT_SYMBOL(st_gyro_common_probe);

void st_gyro_common_remove(struct iio_dev *indio_dev)
{
	struct st_sensor_data *gdata = iio_priv(indio_dev);

	iio_device_unregister(indio_dev);
	if (gdata->get_irq_data_ready(indio_dev) > 0) {
		st_sensors_deallocate_trigger(indio_dev);
		st_gyro_deallocate_ring(indio_dev);
	}
	iio_device_free(indio_dev);
}
EXPORT_SYMBOL(st_gyro_common_remove);

MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
MODULE_DESCRIPTION("STMicroelectronics gyroscopes driver");
MODULE_LICENSE("GPL v2");
