X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fw1%2Fw1_therm.c;h=d986c601ffd51adc64d2a42e2f52baaffa19b2eb;hb=a9fdee76789476a10f923f9fb3c84993042da3ac;hp=8ca23df9da7b03ff3289595eadbc6419918d05db;hpb=8d40237c730b8be87c1b80a5d96b9c603fefa829;p=linux-2.6.git diff --git a/drivers/w1/w1_therm.c b/drivers/w1/w1_therm.c index 8ca23df9d..d986c601f 100644 --- a/drivers/w1/w1_therm.c +++ b/drivers/w1/w1_therm.c @@ -59,28 +59,19 @@ static ssize_t w1_therm_read_name(struct device *dev, char *buf) return sprintf(buf, "%s\n", sl->name); } -static inline int w1_convert_temp(u8 rom[9]) -{ - int t, h; - - if (rom[1] == 0) - t = ((s32)rom[0] >> 1)*1000; - else - t = 1000*(-1*(s32)(0x100-rom[0]) >> 1); - - t -= 250; - h = 1000*((s32)rom[7] - (s32)rom[6]); - h /= (s32)rom[7]; - t += h; - - return t; -} - static ssize_t w1_therm_read_temp(struct device *dev, char *buf) { struct w1_slave *sl = container_of(dev, struct w1_slave, dev); + s16 temp; - return sprintf(buf, "%d\n", w1_convert_temp(sl->rom)); + /* + * Must be more precise. + */ + temp = 0; + temp <<= sl->rom[1] / 2; + temp |= sl->rom[0] / 2; + + return sprintf(buf, "%d\n", temp * 1000); } static int w1_therm_check_rom(u8 rom[9]) @@ -101,6 +92,7 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si struct w1_master *dev = sl->master; u8 rom[9], crc, verdict; int i, max_trying = 10; + u16 temp; atomic_inc(&sl->refcnt); if (down_interruptible(&sl->master->mutex)) { @@ -128,7 +120,6 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si if (!w1_reset_bus (dev)) { int count = 0; u8 match[9] = {W1_MATCH_ROM, }; - unsigned long tm; memcpy(&match[1], (u64 *) & sl->reg_num, 8); @@ -136,29 +127,24 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si w1_write_8(dev, W1_CONVERT_TEMP); - tm = jiffies + msecs_to_jiffies(750); - while(time_before(jiffies, tm)) { - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(tm-jiffies); - - if (signal_pending(current)) - flush_signals(current); - } - - if (!w1_reset_bus (dev)) { - w1_write_block(dev, match, 9); - - w1_write_8(dev, W1_READ_SCRATCHPAD); - if ((count = w1_read_block(dev, rom, 9)) != 9) { - dev_warn(&dev->dev, "w1_read_block() returned %d instead of 9.\n", count); - } + if (count < 10) { + if (!w1_reset_bus(dev)) { + w1_write_block(dev, match, 9); - crc = w1_calc_crc8(rom, 8); + w1_write_8(dev, W1_READ_SCRATCHPAD); + if ((count = w1_read_block(dev, rom, 9)) != 9) { + dev_warn(&dev->dev, "w1_read_block() returned %d instead of 9.\n", count); + } - if (rom[8] == crc && rom[0]) - verdict = 1; + crc = w1_calc_crc8(rom, 8); + if (rom[8] == crc && rom[0]) + verdict = 1; + } } + else + dev_warn(&dev->dev, + "18S20 doesn't respond to CONVERT_TEMP.\n"); } if (!w1_therm_check_rom(rom)) @@ -171,13 +157,12 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si crc, (verdict) ? "YES" : "NO"); if (verdict) memcpy(sl->rom, rom, sizeof(sl->rom)); - else - dev_warn(&dev->dev, "18S20 doesn't respond to CONVERT_TEMP.\n"); - for (i = 0; i < 9; ++i) count += sprintf(buf + count, "%02x ", sl->rom[i]); - - count += sprintf(buf + count, "t=%d\n", w1_convert_temp(rom)); + temp = 0; + temp <<= sl->rom[1] / 2; + temp |= sl->rom[0] / 2; + count += sprintf(buf + count, "t=%u\n", temp); out: up(&dev->mutex); out_dec: