/*
 * Copyright (c) 2019 Thomas Schmid <tom@lfence.de>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define DT_DRV_COMPAT meas_ms5607

#include <string.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/sys/byteorder.h>
#include "ms5607.h"

#define LOG_LEVEL CONFIG_SENSOR_LOG_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_DECLARE(ms5607);

#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)

static int ms5607_spi_raw_cmd(const struct ms5607_config *config, uint8_t cmd)
{
	const struct spi_buf buf = {
		.buf = &cmd,
		.len = 1,
	};

	const struct spi_buf_set buf_set = {
		.buffers = &buf,
		.count = 1,
	};

	return spi_write_dt(&config->bus_cfg.spi_bus, &buf_set);
}

static int ms5607_spi_reset(const struct ms5607_config *config)
{
	int err = ms5607_spi_raw_cmd(config, MS5607_CMD_RESET);

	if (err < 0) {
		return err;
	}

	k_sleep(K_MSEC(3));
	return 0;
}

static int ms5607_spi_read_prom(const struct ms5607_config *config, uint8_t cmd,
				uint16_t *val)
{
	int err;

	uint8_t tx[3] = { cmd, 0, 0 };
	const struct spi_buf tx_buf = {
		.buf = tx,
		.len = 3,
	};

	union {
		struct {
			uint8_t pad;
			uint16_t prom_value;
		} __packed;
		uint8_t rx[3];
	} rx;


	const struct spi_buf rx_buf = {
		.buf = &rx,
		.len = 3,
	};

	const struct spi_buf_set rx_buf_set = {
		.buffers = &rx_buf,
		.count = 1,
	};

	const struct spi_buf_set tx_buf_set = {
		.buffers = &tx_buf,
		.count = 1,
	};

	err = spi_transceive_dt(&config->bus_cfg.spi_bus,
			     &tx_buf_set,
			     &rx_buf_set);
	if (err < 0) {
		return err;
	}

	*val = sys_be16_to_cpu(rx.prom_value);

	return 0;
}


static int ms5607_spi_start_conversion(const struct ms5607_config *config, uint8_t cmd)
{
	return ms5607_spi_raw_cmd(config, cmd);
}

static int ms5607_spi_read_adc(const struct ms5607_config *config, uint32_t *val)
{
	int err;

	uint8_t tx[4] = { MS5607_CMD_CONV_READ_ADC, 0, 0, 0 };
	const struct spi_buf tx_buf = {
		.buf = tx,
		.len = 4,
	};

	union {
		struct {
			uint32_t adc_value;
		} __packed;
		uint8_t rx[4];
	} rx;

	const struct spi_buf rx_buf = {
		.buf = &rx,
		.len = 4,
	};

	const struct spi_buf_set rx_buf_set = {
		.buffers = &rx_buf,
		.count = 1,
	};

	const struct spi_buf_set tx_buf_set = {
		.buffers = &tx_buf,
		.count = 1,
	};

	err = spi_transceive_dt(&config->bus_cfg.spi_bus,
			     &tx_buf_set,
			     &rx_buf_set);
	if (err < 0) {
		return err;
	}

	rx.rx[0] = 0;
	*val = sys_be32_to_cpu(rx.adc_value);
	return 0;
}

static int ms5607_spi_check(const struct ms5607_config *config)
{
	if (!spi_is_ready(&config->bus_cfg.spi_bus)) {
		LOG_DBG("SPI bus %s not ready", config->bus->name);
		return -ENODEV;
	}

	return 0;
}

const struct ms5607_transfer_function ms5607_spi_transfer_function = {
	.bus_check = ms5607_spi_check,
	.reset = ms5607_spi_reset,
	.read_prom = ms5607_spi_read_prom,
	.start_conversion = ms5607_spi_start_conversion,
	.read_adc = ms5607_spi_read_adc,
};

#endif
