/* ST Microelectronics LIS2DS12 3-axis accelerometer driver
 *
 * Copyright (c) 2019 STMicroelectronics
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Datasheet:
 * https://www.st.com/resource/en/datasheet/lis2ds12.pdf
 */

#include <string.h>
#include <i2c.h>
#include <logging/log.h>

#include "lis2ds12.h"

#ifdef DT_ST_LIS2DS12_BUS_I2C

static u16_t lis2ds12_i2c_slave_addr = DT_ST_LIS2DS12_0_BASE_ADDRESS;

#define LOG_LEVEL CONFIG_SENSOR_LOG_LEVEL
LOG_MODULE_DECLARE(LIS2DS12);

static int lis2ds12_i2c_read_data(struct lis2ds12_data *data, u8_t reg_addr,
				 u8_t *value, u8_t len)
{
	return i2c_burst_read(data->comm_master, lis2ds12_i2c_slave_addr,
			      reg_addr, value, len);
}

static int lis2ds12_i2c_write_data(struct lis2ds12_data *data, u8_t reg_addr,
				  u8_t *value, u8_t len)
{
	return i2c_burst_write(data->comm_master, lis2ds12_i2c_slave_addr,
			       reg_addr, value, len);
}

static int lis2ds12_i2c_read_reg(struct lis2ds12_data *data, u8_t reg_addr,
				u8_t *value)
{
	return i2c_reg_read_byte(data->comm_master, lis2ds12_i2c_slave_addr,
				 reg_addr, value);
}

static int lis2ds12_i2c_write_reg(struct lis2ds12_data *data, u8_t reg_addr,
				u8_t value)
{
	return i2c_reg_write_byte(data->comm_master, lis2ds12_i2c_slave_addr,
				 reg_addr, value);
}

static int lis2ds12_i2c_update_reg(struct lis2ds12_data *data, u8_t reg_addr,
				  u8_t mask, u8_t value)
{
	return i2c_reg_update_byte(data->comm_master, lis2ds12_i2c_slave_addr,
				   reg_addr, mask, value);
}

static const struct lis2ds12_transfer_function lis2ds12_i2c_transfer_fn = {
	.read_data = lis2ds12_i2c_read_data,
	.write_data = lis2ds12_i2c_write_data,
	.read_reg  = lis2ds12_i2c_read_reg,
	.write_reg  = lis2ds12_i2c_write_reg,
	.update_reg = lis2ds12_i2c_update_reg,
};

int lis2ds12_i2c_init(struct device *dev)
{
	struct lis2ds12_data *data = dev->driver_data;

	data->hw_tf = &lis2ds12_i2c_transfer_fn;

	return 0;
}
#endif /* DT_ST_LIS2DS12_BUS_I2C */
