/* Copyright 2016 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/* Commons acc/gyro function for ST sensors oin Chrome EC */

#ifndef __CROS_EC_ST_COMMONS_H
#define __CROS_EC_ST_COMMONS_H

#include "common.h"
#include "util.h"
#include "accelgyro.h"
#include "console.h"
#include "i2c.h"

/* X, Y, Z axis data len */
#define OUT_XYZ_SIZE			6

#define ST_NORMALIZE_RATE(_fs)    (1 << __fls(_fs))

#ifdef CONFIG_ACCEL_FIFO
#define FIFO_BUFFER_NUM_PATTERN		32
/* Define number of data to be read from FIFO each time
 * It must be a multiple of OUT_XYZ_SIZE.
 * In case of LSM6DSM FIFO contains pattern depending ODR
 * of Acc/gyro, be sure that FIFO can contains almost
 * FIFO_BUFFER_NUM_PATTERNpattern
 */
#define FIFO_READ_LEN			(FIFO_BUFFER_NUM_PATTERN * OUT_XYZ_SIZE)

#endif /* CONFIG_ACCEL_FIFO */

/**
 * Read single register
 */
static inline int st_raw_read8(const int port, const int addr, const int reg,
		     int *data_ptr)
{
	/* TODO: Implement SPI interface support */
	return i2c_read8(port, addr, reg, data_ptr);
}

/**
 * Write single register
 */
static inline int st_raw_write8(const int port, const int addr, const int reg,
		      int data)
{
	/* TODO: Implement SPI interface support */
	return i2c_write8(port, addr, reg, data);
}

/**
 * st_raw_read_n - Read n bytes for read
 */
int st_raw_read_n(const int port, const int addr, const uint8_t reg,
	       uint8_t *data_ptr, const int len);

/**
 * st_raw_read_n_noinc - Read n bytes for read (no auto inc address)
 */
int st_raw_read_n_noinc(const int port, const int addr, const uint8_t reg,
	       uint8_t *data_ptr, const int len);

 /**
 * st_write_data_with_mask - Write register with mask
 * @s: Motion sensor pointer
 * @reg: Device register
 * @mask: The mask to search
 * @data: Data pointer
 */
int st_write_data_with_mask(const struct motion_sensor_t *s, int reg,
			 uint8_t mask, uint8_t data);

 /**
 * st_get_resolution - Get bit resolution
 * @s: Motion sensor pointer
 */
int st_get_resolution(const struct motion_sensor_t *s);

/**
 * st_set_offset - Set data offset
 * @s: Motion sensor pointer
 * @offset: offset vector
 * @temp: Temp
 */
int st_set_offset(const struct motion_sensor_t *s,
		  const int16_t *offset, int16_t temp);

/**
 * st_get_offset - Get data offset
 * @s: Motion sensor pointer
 * @offset: offset vector
 * @temp: Temp
 */
int st_get_offset(const struct motion_sensor_t *s,
		  int16_t *offset, int16_t *temp);

/**
 * st_get_data_rate - Get data rate (ODR)
 * @s: Motion sensor pointer
 */
int st_get_data_rate(const struct motion_sensor_t *s);

/**
 * st_normalize - Apply to LSB data sensitivity and rotation
 * @s: Motion sensor pointer
 * @v: vector
 * @data: LSB raw data
 */
void st_normalize(const struct motion_sensor_t *s, intv3_t v, uint8_t *data);

/* Internal data structure for sensors */
struct stprivate_data {
	struct accelgyro_saved_data_t base;
	int16_t offset[3];
	uint8_t resol;
};

#endif /* __CROS_EC_ST_COMMONS_H */
