/*
 * (C) Copyright 2001
 * Bill Hunter,  Wave 7 Optics, williamhunter@mediaone.net
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

/*
 * On Semiconductor's LM75 Temperature Sensor
 */

#include <common.h>
#include <i2c.h>
#include <dtt.h>

/*
 * Device code
 */
#if defined(CONFIG_SYS_I2C_DTT_ADDR)
#define DTT_I2C_DEV_CODE CONFIG_SYS_I2C_DTT_ADDR
#else
#define DTT_I2C_DEV_CODE 0x48			/* ON Semi's LM75 device */
#endif
#define DTT_READ_TEMP		0x0
#define DTT_CONFIG		0x1
#define DTT_TEMP_HYST		0x2
#define DTT_TEMP_SET		0x3

int dtt_read(int sensor, int reg)
{
	int dlen;
	uchar data[2];

#ifdef CONFIG_DTT_AD7414
	/*
	 * On AD7414 the first value upon bootup is not read correctly.
	 * This is most likely because of the 800ms update time of the
	 * temp register in normal update mode. To get current values
	 * each time we issue the "dtt" command including upon powerup
	 * we switch into one-short mode.
	 *
	 * Issue one-shot mode command
	 */
	dtt_write(sensor, DTT_CONFIG, 0x64);
#endif

	/* Validate 'reg' param */
	if((reg < 0) || (reg > 3))
		return -1;

	/* Calculate sensor address and register. */
	sensor = DTT_I2C_DEV_CODE + (sensor & 0x07);

	/* Prepare to handle 2 byte result. */
	if ((reg == DTT_READ_TEMP) ||
		(reg == DTT_TEMP_HYST) ||
		(reg == DTT_TEMP_SET))
			dlen = 2;
	else
		dlen = 1;

	/* Now try to read the register. */
	if (i2c_read(sensor, reg, 1, data, dlen) != 0)
		return -1;

	/* Handle 2 byte result. */
	if (dlen == 2)
		return ((int)((short)data[1] + (((short)data[0]) << 8)));

	return (int)data[0];
} /* dtt_read() */


int dtt_write(int sensor, int reg, int val)
{
	int dlen;
	uchar data[2];

	/* Validate 'reg' param */
	if ((reg < 0) || (reg > 3))
		return 1;

	/* Calculate sensor address and register. */
	sensor = DTT_I2C_DEV_CODE + (sensor & 0x07);

	/* Handle 2 byte values. */
	if ((reg == DTT_READ_TEMP) ||
		(reg == DTT_TEMP_HYST) ||
		(reg == DTT_TEMP_SET)) {
			dlen = 2;
		data[0] = (char)((val >> 8) & 0xff);	/* MSB first */
		data[1] = (char)(val & 0xff);
	} else {
		dlen = 1;
		data[0] = (char)(val & 0xff);
	}

	/* Write value to register. */
	if (i2c_write(sensor, reg, 1, data, dlen) != 0)
		return 1;

	return 0;
} /* dtt_write() */


int dtt_init_one(int sensor)
{
	int val;

	/* Setup TSET ( trip point ) register */
	val = ((CONFIG_SYS_DTT_MAX_TEMP * 2) << 7) & 0xff80; /* trip */
	if (dtt_write(sensor, DTT_TEMP_SET, val) != 0)
		return 1;

	/* Setup THYST ( untrip point ) register - Hysteresis */
	val = (((CONFIG_SYS_DTT_MAX_TEMP - CONFIG_SYS_DTT_HYSTERESIS) * 2) << 7) & 0xff80;
	if (dtt_write(sensor, DTT_TEMP_HYST, val) != 0)
		return 1;

	/* Setup configuraton register */
#ifdef CONFIG_DTT_AD7414
	/* config = alert active low and disabled */
	val = 0x60;
#else
	/* config = 6 sample integration, int mode, active low, and enable */
	val = 0x18;
#endif
	if (dtt_write(sensor, DTT_CONFIG, val) != 0)
		return 1;

	return 0;
} /* dtt_init_one() */

int dtt_get_temp(int sensor)
{
	int const ret = dtt_read(sensor, DTT_READ_TEMP);

	if (ret < 0) {
		printf("DTT temperature read failed.\n");
		return 0;
	}
	return (int)((int16_t) ret / 256);
} /* dtt_get_temp() */
