From patchwork Tue Jul 30 06:58:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhash Jha X-Patchwork-Id: 13746767 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 E6E532114; Tue, 30 Jul 2024 06:58:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722322726; cv=none; b=dJbVTjdU3YgFuZhUfw96RIv1RwIIn9R8O+RFLeaxorK814MyRL+DomEbRZJtCXpTzJ30DEXwNz8hkQ/mtr82yPNRDEqgFNGp9azxdV84fH1FPL2n+E5FH6UdhwALnygD0kS1vHYj4YBvvxc6BHTP1sI9QebWrBwpS7omeGqDz1A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722322726; c=relaxed/simple; bh=lVtZ+oApslVLsltgzqjCPLzhDTDpeQDuXQpluuf1Sb8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Cbuqm24vPf0YqCVRC3t9Vz/qS9Ckl5ehpzrQ/zIwjZcMwrDwh9aLwGzM1RNy8HV5DkG1tseM2Wp/REhr5qtq9aNqkKbWAMxZVmu4hwXVrdc7FnzgseA4/iwfeuFmEJfd0U+kfdkOxByUhvhri+6i9+7czzv7KuPVBxqwqPnyL/g= 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=APYtndKz; arc=none smtp.client-ip=209.85.214.171 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="APYtndKz" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-1fc569440e1so36585535ad.3; Mon, 29 Jul 2024 23:58:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1722322723; x=1722927523; 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=TLmTWNCcO33qyoawnApG+TtbPb4Atzj5qDibWR/TR3U=; b=APYtndKzTGPNNhnDzIOtK7VVHUo3/iIOgVl90NPsolzGYhY4rG2NzjTYK4fzAl1MOh xd/eDjeY5p1VpzF/RDwfpUbCkPikjgAu2AeDMTu1XwnjmDz2TPM659M87xchsmxARkSj kp3dKfVONH7ybRlucyk0AbQYjBQk54MsPzIB3DcHa0Oeblsj11Bm2gUWA+6fYpgOSdQY Plxv704pSO9JXXCjcWrA/xUXTiPg4pxeDhsgb9KCz5W9LMfuJqA3yxnXB1xdMShKo6E9 ayG+nrXqCpd2tXyzwznYTBBJ11s3U18JouOqX/xmCQGWCM+iEttCFIXDjF5OsFrYjmAx /oJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722322723; x=1722927523; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TLmTWNCcO33qyoawnApG+TtbPb4Atzj5qDibWR/TR3U=; b=tu89mExa8H7dV/Aqdj/zdVT2vYKra1oH0jatWOZK6d44bNOqz7ztNuwGTn74Y4PuXb 3jbPpF45pCZ+jkJRRPoimfUXV+bxfFY6eQigb6j27TDvufRA0xgR45Yi8QiLbUNG9Hg9 9WZxV+qAaMnhp4u+jQJgmyWalp1FXeKEjBKupzb2vtNaHgNcJp8e7E3aNuhJ+OsCdbJ9 Lf6ZDSTOCWwWKcceb5qqW4gBDSaAX+bTtQ/lRDMBbyVHR09RwQTmrHn0TlrwbM4+4Cap /DAQKvKSL7imvrdA90EFpEnpv26UvvZXWWJ0wr8QfElhQQUkhFIjHq0YZL08KfnIiOGQ pqbw== X-Forwarded-Encrypted: i=1; AJvYcCUNrwLl6y6pBhs7v91PXLuvZRZhtG2nV3ru643dNek+ViPnIFOfHz1/RkDQnRlBxVpIsJEJzzhCF+WqjeEiHOYIUS6RTHxijLoEwUPP X-Gm-Message-State: AOJu0YxaN1nVF2v8lhlnd73kV0shmXsQdpcf2gNpWkbBG4GJF08OIlTD u/YVC1dyU6M3uNj5zdCyNBKl/QtqLCoRe6SoHb8ldG2JAEnIn/0OKdydeiX/2Nk5bxbK X-Google-Smtp-Source: AGHT+IHKfKNd59MMxw/02Ma2YZ07KofuvenU8XMxUEvUDA9tHOoGti2ELHhIM/VZzm88kcMqqgWSgA== X-Received: by 2002:a17:902:e54a:b0:1fb:7c7f:6447 with SMTP id d9443c01a7336-1ff0482b7f7mr123913385ad.25.1722322722910; Mon, 29 Jul 2024 23:58:42 -0700 (PDT) Received: from localhost.localdomain ([136.233.9.100]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-1fed7d378a7sm94337605ad.109.2024.07.29.23.58.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 23:58:42 -0700 (PDT) From: Abhash Jha To: linux-iio@vger.kernel.org Cc: anshulusr@gmail.com, jic23@kernel.org, lars@metafoo.de, linux-kernel@vger.kernel.org, Abhash Jha Subject: [PATCH v4 1/3] iio: light: ltr390: Add configurable gain and resolution Date: Tue, 30 Jul 2024 12:28:17 +0530 Message-ID: <20240730065822.5707-2-abhashkumarjha123@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240730065822.5707-1-abhashkumarjha123@gmail.com> References: <20240730065822.5707-1-abhashkumarjha123@gmail.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add support for configuring and reading the gain and resolution (integration time). Also provide the available values for gain and resoltion respectively via `read_avail` callback. Signed-off-by: Abhash Jha --- drivers/iio/light/ltr390.c | 136 ++++++++++++++++++++++++++++++++++--- 1 file changed, 125 insertions(+), 11 deletions(-) diff --git a/drivers/iio/light/ltr390.c b/drivers/iio/light/ltr390.c index fff1e8990..ee3d30075 100644 --- a/drivers/iio/light/ltr390.c +++ b/drivers/iio/light/ltr390.c @@ -23,21 +23,29 @@ #include #include #include +#include #include #include -#define LTR390_MAIN_CTRL 0x00 -#define LTR390_PART_ID 0x06 -#define LTR390_UVS_DATA 0x10 +#define LTR390_MAIN_CTRL 0x00 +#define LTR390_ALS_UVS_MEAS_RATE 0x04 +#define LTR390_ALS_UVS_GAIN 0x05 +#define LTR390_PART_ID 0x06 +#define LTR390_ALS_DATA 0x0D +#define LTR390_UVS_DATA 0x10 +#define LTR390_INT_CFG 0x19 + +#define LTR390_PART_NUMBER_ID 0xb +#define LTR390_ALS_UVS_GAIN_MASK 0x07 +#define LTR390_ALS_UVS_INT_TIME_MASK 0x70 +#define LTR390_ALS_UVS_INT_TIME(x) FIELD_PREP(LTR390_ALS_UVS_INT_TIME_MASK, (x)) #define LTR390_SW_RESET BIT(4) #define LTR390_UVS_MODE BIT(3) #define LTR390_SENSOR_ENABLE BIT(1) -#define LTR390_PART_NUMBER_ID 0xb - /* * At 20-bit resolution (integration time: 400ms) and 18x gain, 2300 counts of * the sensor are equal to 1 UV Index [Datasheet Page#8]. @@ -60,6 +68,8 @@ struct ltr390_data { struct i2c_client *client; /* Protects device from simulataneous reads */ struct mutex lock; + int gain; + int int_time_us; }; static const struct regmap_config ltr390_regmap_config = { @@ -75,8 +85,6 @@ static int ltr390_register_read(struct ltr390_data *data, u8 register_address) int ret; u8 recieve_buffer[3]; - guard(mutex)(&data->lock); - ret = regmap_bulk_read(data->regmap, register_address, recieve_buffer, sizeof(recieve_buffer)); if (ret) { @@ -94,6 +102,7 @@ static int ltr390_read_raw(struct iio_dev *iio_device, int ret; struct ltr390_data *data = iio_priv(iio_device); + guard(mutex)(&data->lock); switch (mask) { case IIO_CHAN_INFO_RAW: ret = ltr390_register_read(data, LTR390_UVS_DATA); @@ -105,18 +114,118 @@ static int ltr390_read_raw(struct iio_dev *iio_device, *val = LTR390_WINDOW_FACTOR; *val2 = LTR390_COUNTS_PER_UVI; return IIO_VAL_FRACTIONAL; + + case IIO_CHAN_INFO_INT_TIME: + *val = data->int_time_us; + return IIO_VAL_INT; + default: return -EINVAL; } } -static const struct iio_info ltr390_info = { - .read_raw = ltr390_read_raw, -}; +/* integration time in us */ +static const int ltr390_int_time_map_us[] = { 400000, 200000, 100000, 50000, 25000, 12500 }; +static const int ltr390_gain_map[] = { 1, 3, 6, 9, 18 }; static const struct iio_chan_spec ltr390_channel = { .type = IIO_UVINDEX, - .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE) + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME), + .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) | BIT(IIO_CHAN_INFO_SCALE) +}; + +static int ltr390_set_gain(struct ltr390_data *data, int val) +{ + int ret, idx; + + for (idx = 0; idx < ARRAY_SIZE(ltr390_gain_map); idx++) { + if (ltr390_gain_map[idx] != val) + continue; + + guard(mutex)(&data->lock); + ret = regmap_update_bits(data->regmap, + LTR390_ALS_UVS_GAIN, + LTR390_ALS_UVS_GAIN_MASK, idx); + if (ret) + return ret; + + data->gain = ltr390_gain_map[idx]; + return 0; + } + + return -EINVAL; +} + +static int ltr390_set_int_time(struct ltr390_data *data, int val) +{ + int ret, idx; + + for (idx = 0; idx < ARRAY_SIZE(ltr390_int_time_map_us); idx++) { + if (ltr390_int_time_map_us[idx] != val) + continue; + + guard(mutex)(&data->lock); + ret = regmap_update_bits(data->regmap, + LTR390_ALS_UVS_MEAS_RATE, + LTR390_ALS_UVS_INT_TIME_MASK, + LTR390_ALS_UVS_INT_TIME(idx)); + if (ret) + return ret; + + data->int_time_us = ltr390_int_time_map_us[idx]; + return 0; + } + + return -EINVAL; +} + +static int ltr390_read_avail(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, + const int **vals, int *type, int *length, long mask) +{ + switch (mask) { + case IIO_CHAN_INFO_SCALE: + *length = ARRAY_SIZE(ltr390_gain_map); + *type = IIO_VAL_INT; + *vals = ltr390_gain_map; + return IIO_AVAIL_LIST; + case IIO_CHAN_INFO_INT_TIME: + *length = ARRAY_SIZE(ltr390_int_time_map_us); + *type = IIO_VAL_INT; + *vals = ltr390_int_time_map_us; + return IIO_AVAIL_LIST; + default: + return -EINVAL; + } +} + +static int ltr390_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, + int val, int val2, long mask) +{ + struct ltr390_data *data = iio_priv(indio_dev); + + switch (mask) { + case IIO_CHAN_INFO_SCALE: + if (val2 != 0) + return -EINVAL; + + return ltr390_set_gain(data, val); + + case IIO_CHAN_INFO_INT_TIME: + if (val2 != 0) + return -EINVAL; + + return ltr390_set_int_time(data, val); + + default: + return -EINVAL; + } +} + +static const struct iio_info ltr390_info = { + .read_raw = ltr390_read_raw, + .write_raw = ltr390_write_raw, + .read_avail = ltr390_read_avail, }; static int ltr390_probe(struct i2c_client *client) @@ -139,6 +248,11 @@ static int ltr390_probe(struct i2c_client *client) "regmap initialization failed\n"); data->client = client; + /* default value of integration time from pg: 15 of the datasheet */ + data->int_time_us = 100000; + /* default value of gain from pg: 16 of the datasheet */ + data->gain = 3; + mutex_init(&data->lock); indio_dev->info = <r390_info; From patchwork Tue Jul 30 06:58:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhash Jha X-Patchwork-Id: 13746768 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (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 B4C3118FDCF; Tue, 30 Jul 2024 06:58:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722322731; cv=none; b=uvx7JelB0zKVhz5aYQrv5kA/CMXA+p0Wbz0VmpalUMFMV4nVvqAlQ/5CLHDe80A7nIz+AHezQLaNif6b41xaU4fBnWmkp7uEEtZ546p42MyPnFZod7riZHNzScMpXC2W+LLrfAU7tdPixBSGhCw1G7bQ9c4D6rq2NFd5czAUhbc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722322731; c=relaxed/simple; bh=KH3WiUbPFjX2b0GbewcbZQdwYcpIGQdzDK0aD52ND+s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jK/ddlYVXKc3yGrjpM36wP3nxWHQOBmHMezWkDl9pHAiIEdcR8G/38z6YWHjp2d8W99sYo0sj+sAL0JQTU0L2p74MI6XMuI0aNwd0d1GjAcmmcPt4GVjsZKC31sf5eKRRJIFb3p/0DVpMAW1LM9px53ZoXE2H/rm3AIpR1Ck/qE= 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=QL9ntevD; arc=none smtp.client-ip=209.85.210.180 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="QL9ntevD" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-70d199fb3dfso3546445b3a.3; Mon, 29 Jul 2024 23:58:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1722322728; x=1722927528; 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=rtbsN7ycxw2Dhmlhyg4JZ9X6Xr4H9ar+tBVNOnCfR0A=; b=QL9ntevDGCueGh9wOIBG7OWqcYOunWC2B4ptTgeK3efHYa10sH+ntZrQzyOEAvsQTd E9Z6rkPwVt+7CbXY5cQDpSRlUXRryUg/qrw9AlmNEQq6/mmm7PQ25pwiE5spTndwL2kw MuAo09wcri7dejaUQCxe6RxZarHOp6hDxCcoPUrdNppnVapOloBjPJQEY+LEGZxlbGKF e2ziT6BhCxjAKcJ0NExLI76iKxgXOMbxBH637PYLUgJO0PUMPzqnpZjLuT1pOSqQCStJ ZcxujH+O86INgDDxg47No2Y/Jw00eNvJvVm8uCiUYZfPGdOrr7PEWXq2dknlvqxyQ8NT Rk5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722322728; x=1722927528; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rtbsN7ycxw2Dhmlhyg4JZ9X6Xr4H9ar+tBVNOnCfR0A=; b=R3QrLO9t+vnS5kCRL1Sbu9GJm67LDKAd0HiU6TtyHmt2J3FXQrAZ+PjAQQ2JzHYNrg m9dwWHPR7It33E+/AWc8ApscagDbwn6Y3B/2ilueKvuGcxS4x3cWyuUB33jXngUBjh0a 9qgnVb/94q8DFIoo82+KEPLplgBexGNyzTx1iMKr1gUYQTPk+PNlTL5D9PfOW7wAcSua Ak9R26c6DVd+ruXMfQmwA+cYhTziIY8jdpsjTHAQmiW3S99OeDP+0DJ6NWXMrfnYho90 uiJdlPWU7KU7WuyITMYFYSz32J+THfcUcvllNK2LfxVBdMihmwUTBSheW/bDINppkCED MPSA== X-Forwarded-Encrypted: i=1; AJvYcCXT3pvNUGRs6TQOi1fuLjAL5nolr02SabcSn6KAqwtSyxRP5OAyI+XRVkzDgu5F4+JgjPHApKYuss7Gr966rJs6lJENpblWLADG6a1t X-Gm-Message-State: AOJu0Yz5msn8f+BF+3UpAPWV6nl4aEeFMwTaYmrL2wLOlflYsCqM4P9A q7eJ7cRxMXRW7dW//2gVnqE9r10LMsDATaP+uI39lkf1J6j0tZPzXqH8XIlR+YFm+fSY X-Google-Smtp-Source: AGHT+IGrE8jtukt92/uv2sW34IwXqfYyV6JwCW7f2A+oGC+pKawGgtsQnE4MfUX/56JS/t9yHWhdqw== X-Received: by 2002:a05:6a20:ce43:b0:1c0:e9f5:f6bd with SMTP id adf61e73a8af0-1c4a14c78f9mr13879824637.41.1722322728191; Mon, 29 Jul 2024 23:58:48 -0700 (PDT) Received: from localhost.localdomain ([136.233.9.100]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-1fed7d378a7sm94337605ad.109.2024.07.29.23.58.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 23:58:47 -0700 (PDT) From: Abhash Jha To: linux-iio@vger.kernel.org Cc: anshulusr@gmail.com, jic23@kernel.org, lars@metafoo.de, linux-kernel@vger.kernel.org, Abhash Jha Subject: [PATCH v4 2/3] iio: light: ltr390: Add ALS channel and support for gain and resolution Date: Tue, 30 Jul 2024 12:28:18 +0530 Message-ID: <20240730065822.5707-3-abhashkumarjha123@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240730065822.5707-1-abhashkumarjha123@gmail.com> References: <20240730065822.5707-1-abhashkumarjha123@gmail.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add new ALS channel and allow reading raw and scale values. Also provide gain and resolution configuration for ALS channel. Add automatic mode switching between the UVS and ALS channel based on which channel is being accessed. The default mode in which the sensor start is ALS mode. Signed-off-by: Abhash Jha --- drivers/iio/light/ltr390.c | 109 ++++++++++++++++++++++++++++++++----- 1 file changed, 94 insertions(+), 15 deletions(-) diff --git a/drivers/iio/light/ltr390.c b/drivers/iio/light/ltr390.c index ee3d30075..953c1ed3d 100644 --- a/drivers/iio/light/ltr390.c +++ b/drivers/iio/light/ltr390.c @@ -63,11 +63,17 @@ */ #define LTR390_WINDOW_FACTOR 1 +enum ltr390_mode { + LTR390_SET_ALS_MODE, + LTR390_SET_UVS_MODE, +}; + struct ltr390_data { struct regmap *regmap; struct i2c_client *client; /* Protects device from simulataneous reads */ struct mutex lock; + enum ltr390_mode mode; int gain; int int_time_us; }; @@ -95,6 +101,25 @@ static int ltr390_register_read(struct ltr390_data *data, u8 register_address) return get_unaligned_le24(recieve_buffer); } +static int ltr390_set_mode(struct ltr390_data *data, enum ltr390_mode mode) +{ + if (data->mode == mode) + return 0; + + switch (mode) { + case LTR390_SET_ALS_MODE: + regmap_clear_bits(data->regmap, LTR390_MAIN_CTRL, LTR390_UVS_MODE); + break; + + case LTR390_SET_UVS_MODE: + regmap_set_bits(data->regmap, LTR390_MAIN_CTRL, LTR390_UVS_MODE); + break; + } + + data->mode = mode; + return 0; +} + static int ltr390_read_raw(struct iio_dev *iio_device, struct iio_chan_spec const *chan, int *val, int *val2, long mask) @@ -105,15 +130,56 @@ static int ltr390_read_raw(struct iio_dev *iio_device, guard(mutex)(&data->lock); switch (mask) { case IIO_CHAN_INFO_RAW: - ret = ltr390_register_read(data, LTR390_UVS_DATA); - if (ret < 0) - return ret; + switch (chan->type) { + case IIO_UVINDEX: + ret = ltr390_set_mode(data, LTR390_SET_UVS_MODE); + if (ret < 0) + return ret; + + ret = ltr390_register_read(data, LTR390_UVS_DATA); + if (ret < 0) + return ret; + break; + + case IIO_INTENSITY: + ret = ltr390_set_mode(data, LTR390_SET_ALS_MODE); + if (ret < 0) + return ret; + + ret = ltr390_register_read(data, LTR390_ALS_DATA); + if (ret < 0) + return ret; + break; + + default: + return -EINVAL; + } + *val = ret; return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: - *val = LTR390_WINDOW_FACTOR; - *val2 = LTR390_COUNTS_PER_UVI; - return IIO_VAL_FRACTIONAL; + switch (chan->type) { + case IIO_UVINDEX: + ret = ltr390_set_mode(data, LTR390_SET_UVS_MODE); + if (ret < 0) + return ret; + + *val = LTR390_WINDOW_FACTOR; + *val2 = LTR390_COUNTS_PER_UVI; + return IIO_VAL_FRACTIONAL; + + case IIO_INTENSITY: + ret = ltr390_set_mode(data, LTR390_SET_ALS_MODE); + if (ret < 0) + return ret; + + *val = LTR390_WINDOW_FACTOR; + *val2 = data->gain; + return IIO_VAL_FRACTIONAL; + + default: + return -EINVAL; + } case IIO_CHAN_INFO_INT_TIME: *val = data->int_time_us; @@ -128,11 +194,23 @@ static int ltr390_read_raw(struct iio_dev *iio_device, static const int ltr390_int_time_map_us[] = { 400000, 200000, 100000, 50000, 25000, 12500 }; static const int ltr390_gain_map[] = { 1, 3, 6, 9, 18 }; -static const struct iio_chan_spec ltr390_channel = { - .type = IIO_UVINDEX, - .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), - .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME), - .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) | BIT(IIO_CHAN_INFO_SCALE) +static const struct iio_chan_spec ltr390_channels[] = { + /* UV sensor */ + { + .type = IIO_UVINDEX, + .scan_index = 0, + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME), + .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) | BIT(IIO_CHAN_INFO_SCALE) + }, + /* ALS sensor */ + { + .type = IIO_INTENSITY, + .scan_index = 1, + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME), + .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) | BIT(IIO_CHAN_INFO_SCALE) + }, }; static int ltr390_set_gain(struct ltr390_data *data, int val) @@ -252,12 +330,14 @@ static int ltr390_probe(struct i2c_client *client) data->int_time_us = 100000; /* default value of gain from pg: 16 of the datasheet */ data->gain = 3; + /* default mode for ltr390 is ALS mode */ + data->mode = LTR390_SET_ALS_MODE; mutex_init(&data->lock); indio_dev->info = <r390_info; - indio_dev->channels = <r390_channel; - indio_dev->num_channels = 1; + indio_dev->channels = ltr390_channels; + indio_dev->num_channels = ARRAY_SIZE(ltr390_channels); indio_dev->name = "ltr390"; ret = regmap_read(data->regmap, LTR390_PART_ID, &part_number); @@ -275,8 +355,7 @@ static int ltr390_probe(struct i2c_client *client) /* Wait for the registers to reset before proceeding */ usleep_range(1000, 2000); - ret = regmap_set_bits(data->regmap, LTR390_MAIN_CTRL, - LTR390_SENSOR_ENABLE | LTR390_UVS_MODE); + ret = regmap_set_bits(data->regmap, LTR390_MAIN_CTRL, LTR390_SENSOR_ENABLE); if (ret) return dev_err_probe(dev, ret, "failed to enable the sensor\n"); From patchwork Tue Jul 30 06:58:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhash Jha X-Patchwork-Id: 13746769 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 9D56818F2F5; Tue, 30 Jul 2024 06:58:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722322735; cv=none; b=EtAdkBEMdIgXDnX149rdrVRWqTwlAu4A4x5J5i/ZRnVy+5p061ikxOLMEs3gKvOJ+EmEv3kozcJQlS69p3/j0qXNZ39v1+el7/MIARvcCuwKt3I/tAeaN8yeqdUpwlBJe9Tb42MAxRH3oCQ4jK1dj0gG6EAbUitMEFvUUUjBkZU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722322735; c=relaxed/simple; bh=RJRTCMhlH7Fc9vbEkQUaF70v2Eh9DbASAQCpiVqvqAs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aS0H3jyBJfkFyaTdRwpuNAjiX8yOfJPsoyeFYDvDk9iWu4AFiVkz+Culjljnuk/muVSNRyIiYshRn00RNyQjJEBzEjxOUAltePcxBmgaEscNjqjQ3B5sybXNM0gER7PsYLbkPC7gvcGTYh6SKj8g+uVt07BKlV10bzjnL8lOa0U= 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=BAHJbkvi; arc=none smtp.client-ip=209.85.214.173 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="BAHJbkvi" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-1fd6ed7688cso28262375ad.3; Mon, 29 Jul 2024 23:58:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1722322733; x=1722927533; 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=Fxvk9Af0s6iPTi/YQ9TeTPKr8vJhK9Sz/kM7gcjsmlk=; b=BAHJbkviIIPNhlQF+BcbcsBKXN20ib7RV1CpMQtqDyiI6Uo9wVE9J58hx2UGjg1m9R 9crirDPOozYpfprUZAM8bn9ODRZevNSml+8Hd3Q8kfAgc7ntHYl0vFfIjmIBud92Uips 7sErkhqZP/MPdi2LCQ7NdKD+TQL/mg2pOLyAWD8il2x5efTTWVUkjvyyFyReFl0onP5q k0srz1cAx+53u6+JiRNqXZRLuhG5xno+8yg26TZZqRg+71395H1CihSoWBmsf9s68gEm HL0HcYlHyPs18hxZXuv2NaI4AeepGqsFxCdSJx0y+gtrEZp+xCLv7dAuoeIalP23y7qm dRAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722322733; x=1722927533; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Fxvk9Af0s6iPTi/YQ9TeTPKr8vJhK9Sz/kM7gcjsmlk=; b=g6h+nIH4+xZkqB+tRBvqwvOHoK+3so/GAuZRnJrJWoeAk0gOdsKQTwrJV92+AO1VJo D8L2ke09ULaZ6mWL/74p5bxhUM0wjsxsKQUcBTsZBymxqtIfdXNFbpJV47pgBgF8cz5M ss21foGmwEKkXuBB5tp9Pa2l05FpVPjhQlWeJPMu3htr6n8lFfdFRbTLJU+nB0YgqHJu 8Jr1A4c97A7J6KAmsuF2cbcbU5q+sMbhAhcl7NFjCGajYkQQloraErWewE5bq4YusSlS fwx88INPQ7ilDpdBww/4uUhF+7imFO7+h3GIK4qkxR6ZXjhyDBv95T4zmLQL1R4h0WNR TZkw== X-Forwarded-Encrypted: i=1; AJvYcCWaWv1PK4a1NNZnpKrVf9lFMihr0D2G8ZtOuXp6nzQ6M4VJjm12gxiL5tAkMdG37IWt/lzPaNqo0SiIpPAzBoR1r8gkfnFJPO0MAYSf X-Gm-Message-State: AOJu0YyRlIszegYD6aEY5J7AOqIG7dwXv1APQRPBlH1kaHMWXgyi16Pa ydoFnfkRZJdCtqIuDnELcHnd2147IeOQ9VSFbD94dzZ8A6DRLRfYRrpCv3H3zxLoER2W X-Google-Smtp-Source: AGHT+IGxH2f42Il+6H/TfeYNaAkdVMluK6Pe5GBG8nT+HgFIgKIgSX19icEZr3lw4QG5nX+N89atfw== X-Received: by 2002:a17:902:ea01:b0:1fd:d4c2:a2ef with SMTP id d9443c01a7336-1ff04839437mr88328275ad.21.1722322732787; Mon, 29 Jul 2024 23:58:52 -0700 (PDT) Received: from localhost.localdomain ([136.233.9.100]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-1fed7d378a7sm94337605ad.109.2024.07.29.23.58.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 23:58:52 -0700 (PDT) From: Abhash Jha To: linux-iio@vger.kernel.org Cc: anshulusr@gmail.com, jic23@kernel.org, lars@metafoo.de, linux-kernel@vger.kernel.org, Abhash Jha Subject: [PATCH v4 3/3] iio: light: ltr390: Calculate 'counts_per_uvi' dynamically Date: Tue, 30 Jul 2024 12:28:19 +0530 Message-ID: <20240730065822.5707-4-abhashkumarjha123@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240730065822.5707-1-abhashkumarjha123@gmail.com> References: <20240730065822.5707-1-abhashkumarjha123@gmail.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 counts_per_uvi depends on the current value of gain and resolution. Hence, we cannot use the hardcoded value 96. The `counts_per_uvi` function gives the count based on the current gain and resolution (integration time). Signed-off-by: Abhash Jha --- drivers/iio/light/ltr390.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/iio/light/ltr390.c b/drivers/iio/light/ltr390.c index 953c1ed3d..37a017843 100644 --- a/drivers/iio/light/ltr390.c +++ b/drivers/iio/light/ltr390.c @@ -46,6 +46,8 @@ #define LTR390_UVS_MODE BIT(3) #define LTR390_SENSOR_ENABLE BIT(1) +#define LTR390_FRACTIONAL_PRECISION 100 + /* * At 20-bit resolution (integration time: 400ms) and 18x gain, 2300 counts of * the sensor are equal to 1 UV Index [Datasheet Page#8]. @@ -120,6 +122,16 @@ static int ltr390_set_mode(struct ltr390_data *data, enum ltr390_mode mode) return 0; } +static int ltr390_counts_per_uvi(struct ltr390_data *data) +{ + int orig_gain = 18; + int orig_int_time = 400; + int divisor = orig_gain * orig_int_time; + int gain = data->gain; + + return DIV_ROUND_CLOSEST(23 * gain * data->int_time_us, 10 * divisor); +} + static int ltr390_read_raw(struct iio_dev *iio_device, struct iio_chan_spec const *chan, int *val, int *val2, long mask) @@ -164,8 +176,8 @@ static int ltr390_read_raw(struct iio_dev *iio_device, if (ret < 0) return ret; - *val = LTR390_WINDOW_FACTOR; - *val2 = LTR390_COUNTS_PER_UVI; + *val = LTR390_WINDOW_FACTOR * LTR390_FRACTIONAL_PRECISION; + *val2 = ltr390_counts_per_uvi(data); return IIO_VAL_FRACTIONAL; case IIO_INTENSITY: