From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2ECD739935E for ; Sat, 13 Jun 2026 19:10:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.45 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781377843; cv=none; b=HCSXQ0sh1CMk0QJL9nxHcRAIRX98pm3UW79W0ZCTuwOc0mKSqIE0pOusbG4WDZV9eANzQdN+F/LJtZMSTvIKaaNsCZor1VxYVemk2cyuHZ4zvf0SOrf6KcSo9dftVzJ7X/FKH/xj3b+qDVuSH22/os1gL1iMQclFWLn1bvd0c1A= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781377843; c=relaxed/simple; bh=P7pHfBuzRGXNEHM0qtcu5fedmFVFkDeg8kglyBrhLbA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZMpLJtg+08GiGynw6p9Az0A59kSDDrAEDwKvGnoZSc3dchv7t6HWyP6MywUEA5xQEab+gSNOoPo3tEbNaujRtDQw3Nyyev5NmHBmSGxd4z+0ae6r60MDDn7IB1aM2ua8bo0tvNOAr3STsEv5snoe9oobj98c/Ol8g4qSEfxvXXQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nEUAXmcj; arc=none smtp.client-ip=209.85.218.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nEUAXmcj" Received: by mail-ej1-f45.google.com with SMTP id a640c23a62f3a-bed2b9bfa02so267893866b.1 for ; Sat, 13 Jun 2026 12:10:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781377841; x=1781982641; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kjXinVBWr5oKzZT7R8oqfYcCkCKQtwdSjnXjkSKyW/w=; b=nEUAXmcjD3ATLqvi+Hu8IBVjxVJwlSTOq7SA+trCzFT/H63cQNEzubMeCFIO15NKQ/ VLwKVmbjBrOaGA8t9zcL6GqdY5HH6r1UaB/Y4ok1zCzEgfZpkvW81vaj4c4vTIlhnn5R 9ymjOCXBORRPhTowj7oq5mSruqyiWtuLe+XX2pPOSsc1ucIrTENaup6WD+i39WQ/qtjt FStphAd52lPYvQfIvnqjmiXvJ+01dGkxfoomja7h63DYM1UDTGu2IBgZOmWZi19XZmTR 4gRFnJfnuHWXh+ViIkfO88fYAzkGq/k7+hEa3ctkRqIy++fMKypmPwfP2kt5o0ReBgXq Cnbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781377841; x=1781982641; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=kjXinVBWr5oKzZT7R8oqfYcCkCKQtwdSjnXjkSKyW/w=; b=YUi7lm9VVa3RVQRU5d5bm8WJUEECpkepdbG8qGIF4K50vYN95AU8QOtnxMCZj9jEVm IHN4Tg0wPgoYzC1JDCGf01OrPjV+CWthnNXAl1QXVADBWL7R9yCSLeh9K9G7KVC1oBaR 1E5zLueHfyJCqw8rphTZ4CFq3Kh10EUAH7MWIl4W9SAD99T6NJj6tnwR/hORcP1bj7du iupB5ZfBK9zYuClBsO20YZl54GWfkSAtfa8CE8vxY6UPpvEjW9GkvKa9/0+Ova11AA1x i2S/qf33/v3eh3ZEx22y8xH88QVCtrE5VHnx5Z9eKsf7MQD822M38hZheWjvghuCV9Y7 wOAw== X-Forwarded-Encrypted: i=1; AFNElJ8jvSbIaPdR2fabyOuxzK2EaHE48XxGQq69XDYVBtC2izSHbb+570LK8ol28QSu6xxZAAvdMpfsYjLXH9w=@vger.kernel.org X-Gm-Message-State: AOJu0Yw0c6uAOj9FQSJiuV0FmxNSg0cnMaoazEJFokcNne6HDci+nl0L 2UpJyXivWtzsQOenXGeX9GieFynArIIg0hVa9Ye+T15rdsMUV0q+U/Ow X-Gm-Gg: Acq92OHo8eeDx+xzShLBKE3tCb44bvQFnisO6aG4dQhmMASdJHH/D0t0piMcpvpM6cg y0uPnwK0Oed1prQ0UCXkGRr19PpXchBcAtGJK1S1Jd/foGwHBeG7JVndeZp+j8cn6zNmEiJ0df0 qp4n1/WrGAtzMFfGpvvMkuRF1olRdY8V4Tm4zgmb9OjQwWjf1v8EA0dpDwXgn9ayuRlFpyzfKmi zh92BaNsTzyhmFUa4wSTYV/Aab8o5IWEbzxdbc7i4ine7fKFT2MJPQuESkY1KJfT067QX/HQo0B Ah1mU4N/xY/QcUDClRm/Ba6+BSecY7sDDqDEJEo8ChQ93DRiow/ATi3KxYh9X58vMdnG6kjB6UF I+TyqAqOHsIhbor9Npt2vzSDCj2ssEs1E01eI9Q/7o4NEyFOwoNIDfHs/nT1AoJSigdWvZ1U4Ns d+EZ+sRqJp7WvjKnKAKRmhvNU9v/lcn+PU+m4doJgFW29BpJ4ZVhFTSs6kJg== X-Received: by 2002:a17:907:9414:b0:beb:7979:47dd with SMTP id a640c23a62f3a-bff4bbfb265mr241347866b.27.1781377840480; Sat, 13 Jun 2026 12:10:40 -0700 (PDT) Received: from MSI-LINUX.kielce.vectranet.pl ([2a02:2a40:27ec:2900:9790:7740:8855:4d8c]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-bfdb4b2276fsm237193366b.17.2026.06.13.12.10.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Jun 2026 12:10:40 -0700 (PDT) From: Jakub Szczudlo To: linux-iio@vger.kernel.org Cc: andy@kernel.org, antoniu.miclaus@analog.com, conor+dt@kernel.org, devicetree@vger.kernel.org, dlechner@baylibre.com, duje@dujemihanovic.xyz, jic23@kernel.org, jishnu.prakash@oss.qualcomm.com, jorge.marques@analog.com, krzk+dt@kernel.org, linusw@kernel.org, linux-kernel@vger.kernel.org, marcelo.schmitt@analog.com, mazziesaccount@gmail.com, mike.looijmans@topic.nl, nuno.sa@analog.com, robh@kernel.org, sakari.ailus@linux.intel.com, wens@kernel.org, joshua.crofts1@gmail.com, Jakub Szczudlo Subject: [PATCH v3 3/3] iio: adc: Fix incorrect reading when datarate changed in single mode Date: Sat, 13 Jun 2026 21:09:57 +0200 Message-ID: <20260613190957.654798-4-jakubszczudlo40@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260613190957.654798-1-jakubszczudlo40@gmail.com> References: <20260613190957.654798-1-jakubszczudlo40@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit When device is suspended and it is in single mode then changing datarate doesn't make it actual wait for new measurement, so to be sure that read after change is correct functions that changes datarate and gain will wait for new data. Signed-off-by: Jakub Szczudlo --- drivers/iio/adc/ti-ads1100.c | 55 ++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/drivers/iio/adc/ti-ads1100.c b/drivers/iio/adc/ti-ads1100.c index 76de2466dc53..195394665cd1 100644 --- a/drivers/iio/adc/ti-ads1100.c +++ b/drivers/iio/adc/ti-ads1100.c @@ -123,6 +123,36 @@ static int ads1100_get_voltage_microvolts(struct ads1100_data *data) return ads1100_get_voltage_milivolts(data) * MICRO / MILLI; } +static bool ads1100_new_data_ready(struct ads1100_data *data) +{ + int ret; + u8 buffer[3]; + + ret = i2c_master_recv(data->client, (char *)&buffer, sizeof(buffer)); + if (ret < 3) { + dev_err(&data->client->dev, "I2C read fail: %d\n", ret); + return ret; + } + + return FIELD_GET(ADS1100_CFG_ST_BSY, buffer[2]); +} + +static int ads1100_poll_data_ready(struct ads1100_data *data) +{ + u8 buffer[3]; + bool data_ready; + int datarate = data->ads_config->data_rate[FIELD_GET(ADS1100_DR_MASK, data->config)]; + // To be sure we wait 5 times more than datarate + unsigned long wait_time = DIV_ROUND_CLOSEST(MICRO, 5 * datarate); + + /* To be sure that polled value will have value after config change */ + i2c_master_recv(data->client, (char *)&buffer, sizeof(buffer)); + + return read_poll_timeout(ads1100_new_data_ready, data_ready, + !data_ready, wait_time, + ADS1100_MAX_DRDY_TIMEOUT, false, data); +} + static int ads1100_data_bits(struct ads1100_data *data) { return ads1100_data_rate_bits[FIELD_GET(ADS1100_DR_MASK, data->config)]; @@ -165,6 +194,7 @@ static int ads1100_set_scale(struct ads1100_data *data, int val, int val2) { int microvolts; int gain; + int ret; /* With Vdd between 2.7 and 5V, the scale is always below 1 */ if (val) @@ -185,21 +215,40 @@ static int ads1100_set_scale(struct ads1100_data *data, int val, int val2) if (gain < BIT(0) || gain > BIT(3)) return -EINVAL; + ret = pm_runtime_resume_and_get(&data->client->dev); + if (ret < 0) + return ret; + ads1100_set_config_bits(data, ADS1100_PGA_MASK, ffs(gain) - 1); - return 0; + ret = ads1100_poll_data_ready(data); + + pm_runtime_put_autosuspend(&data->client->dev); + + return ret; } static int ads1100_set_data_rate(struct ads1100_data *data, int chan, int rate) { unsigned int i; unsigned int size; + int ret; size = data->supports_data_rate ? ARRAY_SIZE(ads1100_data_rate) : 1; for (i = 0; i < size; i++) { - if (data->ads_config->data_rate[i] == rate) - return ads1100_set_config_bits(data, ADS1100_DR_MASK, + if (data->ads_config->data_rate[i] != rate) + continue; + + ret = pm_runtime_resume_and_get(&data->client->dev); + if (ret < 0) + return ret; + + ads1100_set_config_bits(data, ADS1100_DR_MASK, FIELD_PREP(ADS1100_DR_MASK, i)); + ret = ads1100_poll_data_ready(data); + + pm_runtime_put_autosuspend(&data->client->dev); + return ret; } return -EINVAL; -- 2.47.3