static int conv_time_measure()

in slaves/w1_therm.c [1149:1217]


static int conv_time_measure(struct w1_slave *sl, int *conv_time)
{
	struct therm_info inf,
		*info = &inf;
	struct w1_master *dev_master = sl->master;
	int max_trying = W1_THERM_MAX_TRY;
	int ret = -ENODEV;
	bool strong_pullup;

	if (!sl->family_data)
		goto error;

	strong_pullup = (w1_strong_pullup == 2 ||
		(!SLAVE_POWERMODE(sl) &&
		w1_strong_pullup));

	if (strong_pullup) {
		pr_info("%s: Measure with strong_pullup is not supported.\n", __func__);
		return -EINVAL;
	}

	memset(info->rom, 0, sizeof(info->rom));

	/* prevent the slave from going away in sleep */
	atomic_inc(THERM_REFCNT(sl->family_data));

	if (!bus_mutex_lock(&dev_master->bus_mutex)) {
		ret = -EAGAIN;	/* Didn't acquire the mutex */
		goto dec_refcnt;
	}

	while (max_trying-- && ret) { /* ret should be 0 */
		info->verdict = 0;
		info->crc = 0;
		/* safe version to select slave */
		if (!reset_select_slave(sl)) {
			int j_start, j_end;

			/*no device need pullup */
			w1_write_8(dev_master, W1_CONVERT_TEMP);

			j_start = jiffies;
			ret = w1_poll_completion(dev_master, W1_POLL_CONVERT_TEMP);
			if (ret) {
				dev_dbg(&sl->dev, "%s: Timeout\n", __func__);
				goto mt_unlock;
			}
			j_end = jiffies;
			/* 1.2x increase for variation and changes over temperature range */
			*conv_time = jiffies_to_msecs(j_end-j_start)*12/10;
			pr_debug("W1 Measure complete, conv_time = %d, HZ=%d.\n",
				*conv_time, HZ);
			if (*conv_time <= CONV_TIME_MEASURE) {
				ret = -EIO;
				goto mt_unlock;
			}
			mutex_unlock(&dev_master->bus_mutex);
			ret = read_scratchpad(sl, info);
			goto dec_refcnt;
		}

	}
mt_unlock:
	mutex_unlock(&dev_master->bus_mutex);
dec_refcnt:
	atomic_dec(THERM_REFCNT(sl->family_data));
error:
	return ret;
}