|  | 
 | #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 |