
#include <common.h>

#include <ssi.h>

#ifdef CONFIG_DS1722

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;
}

#endif
