#include <common.h>
#include <asm/ic/ssi.h>
#include <ds1722.h>

static void ds1722_select(int dev)
{
	ssi_set_interface(4096, 0, 0, 0);
	ssi_chip_select(0);
	udelay(1);
	ssi_chip_select(dev);
	udelay(1);
}


u8 ds1722_read(int dev, int addr)
{
	u8 res;

	ds1722_select(dev);

	ssi_tx_byte(addr);
	res = ssi_rx_byte();

	ssi_chip_select(0);

	return res;
}

void ds1722_write(int dev, int addr, u8 data)
{
	ds1722_select(dev);

	ssi_tx_byte(0x80|addr);
	ssi_tx_byte(data);

	ssi_chip_select(0);
}


u16 ds1722_temp(int dev, int resolution)
{
	static int useconds[] = {
		75000, 150000, 300000, 600000, 1200000
	};
	char temp;
	u16 res;


	/* set up the desired resulotion ... */
	ds1722_write(dev, 0, 0xe0 | (resolution << 1));

	/* wait while the chip measures the tremperature */
	udelay(useconds[resolution]);

	res = (temp = ds1722_read(dev, 2)) << 8;

	if (temp < 0) {
		temp = (16 - (ds1722_read(dev, 1) >> 4)) & 0x0f;
	} else {
		temp = (ds1722_read(dev, 1) >> 4);
	}

	switch (temp) {
	case 0:
		/* .0000 */
		break;
	case 1:
		/* .0625 */
		res |=1;
		break;
	case 2:
		/* .1250 */
		res |=1;
		break;
	case 3:
		/* .1875 */
		res |=2;
		break;
	case 4:
		/* .2500 */
		res |=3;
		break;
	case 5:
		/* .3125 */
		res |=3;
		break;
	case 6:
		/* .3750 */
		res |=4;
		break;
	case 7:
		/* .4375 */
		res |=4;
		break;
	case 8:
		/* .5000 */
		res |=5;
		break;
	case 9:
		/* .5625 */
		res |=6;
		break;
	case 10:
		/* .6250 */
		res |=6;
		break;
	case 11:
		/* .6875 */
		res |=7;
		break;
	case 12:
		/* .7500 */
		res |=8;
		break;
	case 13:
		/* .8125 */
		res |=8;
		break;
	case 14:
		/* .8750 */
		res |=9;
		break;
	case 15:
		/* .9375 */
		res |=9;
		break;
	}
	return res;

}

int ds1722_probe(int dev)
{
	u16 temp = ds1722_temp(dev, DS1722_RESOLUTION_12BIT);
	printf("%d.%d deg C\n\n", (char)(temp >> 8), temp & 0xff);
	return 0;
}