From patchwork Sat Aug 3 18:09:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhash Jha X-Patchwork-Id: 13752398 Received: from mail-oi1-f171.google.com (mail-oi1-f171.google.com [209.85.167.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 9574A1AACA; Sat, 3 Aug 2024 18:10:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722708612; cv=none; b=DozLh0Cy4GXlrX+EBQWVZgL2mwA97omk3TJmd0qd0c6MftjZP4pBXpjWAbYpK3ckF1z/bPMylhVDv2q4K1/sRwQEiCDsrck4yBI5Zq2z7/5HccFJ/90kDaJiM2moAjzVrbNlAfhCOCK/iD1sZLbdm2ms6vezSQ1PlgTQAw52SP8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722708612; c=relaxed/simple; bh=2S4ndyfQHwkjcEZcx/Ka7S17KLYzJ1IGETFUdLbsDfc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FPpZArkqX5+ELQkrSS8N7C68m5NhyVrn4nyMMBUDo2/zyPV2uLBan6sCK5uNMgHv7WFfAMwZS5sdXsI0Zch/ckpDv5Cyn8P9tYm2fP4aht4s6Z63lT4a7ELk2WwXfrJZyvcNxjDHVcEheKDHWBnlgmDm0VONzywnIx+MbWDfzkI= 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=YaLxfKs5; arc=none smtp.client-ip=209.85.167.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="YaLxfKs5" Received: by mail-oi1-f171.google.com with SMTP id 5614622812f47-3daf0e73a5bso6193363b6e.0; Sat, 03 Aug 2024 11:10:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1722708609; x=1723313409; 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=mER8v84ARA8XH2Iogvf2g55/SOmWGGANj/bW9FdhDhA=; b=YaLxfKs5jZJpwLCqGqR6edyup1Ayoxt1FaU4U20//dfFSVsCoenr+jGCv7D/nsWW3c f25rXN9Q4TMJ67d5VSoaubgS1YEaw6x/sbtkPJ/+sSX+IVWPRog0HVNM/k8rj10ezmDl AHKNPa34sxSpHryc+WcCADA2fgqCXNwHPXELlQGBkKU0qbsp2M/DRsI4hw30iPWLliT8 J6r+TJzXrFx+2FziwOjVT+f5VrZo34T6FrGEQ14VoYbB+hS2tJMLRmgMTHCQNb+RH8My NxX6fI2q7hVrRhXCoHoNWohCrouBIJ2168Hs0YyQ6vt+4PpPSAyAoOLoG/KbMDS6+ABr 65sA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722708609; x=1723313409; 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=mER8v84ARA8XH2Iogvf2g55/SOmWGGANj/bW9FdhDhA=; b=w9a6gwxGiAoXJxSUSFouGZPv63gI36XyO8s7NZZIOZtMoY2R789OtoRkEGlwudxaV0 OTkdUzXs5tmPByYhmNyh3IDaIvYy2oSg3jloKIG+OhUq6F2mN+7KpVckPcVSyaU/lz4V yq5NShZX+Dae75Q801w3+8pkFDaHue/ZEHhMRD7wpt6xAxWIku9dB+MkOya5v4brdKmk Of7TEZ2w0nPbHpJmRV4yhcNx8IHf9K/3ZNkeMhq1vlK6V8P8XbIrfjuoMEdla4LTXnLD Ho2Hf4kaIcTYKgNI1TsaHq4456mdUNxE2op2ixx3G1HJWlqX1VlxpFzleh9is1qdcL9V 89FQ== X-Forwarded-Encrypted: i=1; AJvYcCUSjuc2R2W0nFpNLqPyq6TjvAbRexQVBTcFZd+k8ePURzRFSCgK79kUjjCzXPl42ff9A3F8nCEbkkHIXLUI1gnQMNSe5JgLqnSRmNe0 X-Gm-Message-State: AOJu0YyLI/UNyZ7BGfmIuQwsDSSNGEAXfDdFM4ha/XuCDHttSEuyieAP 2q6S+vxOavMMUDSHc9gQ2exwIhtEJyTzdU4jK0fgdBVAU2x9HEHbwkTU/iNd8JA= X-Google-Smtp-Source: AGHT+IHGoDDAN7qvnO2zDL7IH6VysKk6C6tEF1jthmdLX+k5bZkD3O50lZb42S58dxV20BP3u3Y/Xw== X-Received: by 2002:a05:6871:582a:b0:268:880c:9de3 with SMTP id 586e51a60fabf-26891a9aea9mr9289995fac.14.1722708609125; Sat, 03 Aug 2024 11:10:09 -0700 (PDT) Received: from localhost.localdomain ([136.233.9.100]) by smtp.googlemail.com with ESMTPSA id 41be03b00d2f7-7b762e9f5aasm3046128a12.6.2024.08.03.11.10.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Aug 2024 11:10:08 -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 v6 1/2] iio: light: ltr390: Add ALS channel and support for gain and resolution Date: Sat, 3 Aug 2024 23:39:48 +0530 Message-ID: <20240803180950.32821-2-abhashkumarjha123@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240803180950.32821-1-abhashkumarjha123@gmail.com> References: <20240803180950.32821-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 lux 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 | 100 +++++++++++++++++++++++++++++++------ 1 file changed, 85 insertions(+), 15 deletions(-) diff --git a/drivers/iio/light/ltr390.c b/drivers/iio/light/ltr390.c index ee3d30075..44ca4b04a 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,47 @@ 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_LIGHT: + 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: + *val = LTR390_WINDOW_FACTOR; + *val2 = LTR390_COUNTS_PER_UVI; + return IIO_VAL_FRACTIONAL; + + case IIO_LIGHT: + *val = LTR390_WINDOW_FACTOR * 6 * 100; + *val2 = data->gain * data->int_time_us; + return IIO_VAL_FRACTIONAL; + + default: + return -EINVAL; + } case IIO_CHAN_INFO_INT_TIME: *val = data->int_time_us; @@ -128,11 +185,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_LIGHT, + .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 +321,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 +346,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 Sat Aug 3 18:09:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhash Jha X-Patchwork-Id: 13752399 Received: from mail-io1-f44.google.com (mail-io1-f44.google.com [209.85.166.44]) (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 E67D91CA93; Sat, 3 Aug 2024 18:10:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722708616; cv=none; b=Xl5aZDvnVRbMf4R8J/62joLj8msDWzbhJu8affTRHrJKuZozXZnLTSqnt/btjk51ysLiuSZjMNSbdtMSPjNuYc/an5CmZUaczzCXBjI8VFhfA+d4k9r0jd5xjEFN6vxnyQScwxkS891UUewCAo3b7S++SMkjIjM8mLYssS9yZgo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722708616; c=relaxed/simple; bh=vSuewzdIUu+7519qJBAfxGFGrc2KaLKBcCuXLN6LH5U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Eih2tEPt/6ZLn3n3vSTWUxx/ow0G/03HCpIuySZPLDhQNYVq4z/bI7M0ud+0lScaN3D4Rl4NOtXr8lLDA96ZLT7VgNVS6XybTvOPOP/OK2+MDH7/Ze+H80ThJ9IIFcxb2XYKz5rNt8wvIV9/hRvlv9LzMXTcEVFM0d08RXgJzQc= 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=FU5F1AoH; arc=none smtp.client-ip=209.85.166.44 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="FU5F1AoH" Received: by mail-io1-f44.google.com with SMTP id ca18e2360f4ac-81fd925287eso68138739f.3; Sat, 03 Aug 2024 11:10:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1722708613; x=1723313413; 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=ilYHZIwKOnRvQ2z2qrooGbgYja3yrOQMh4ORr99byFI=; b=FU5F1AoHgnh8M+E3JP/QtFgT6SOphmh6KPOhVdQHAdl/6xdkANFfNupScieQXc5Gkn TqA5rvpxzcyJEY6hGMmbsSaQvrCrFfqPPFHkCS+v0rlm/FYV4igIXqJ8pquf8KBjEqIe 9dFpJBqOO/j/J1iU/LuF4REnIESf6vXBJSqrTl97/K5lPkv2JyXok9Kzf4+2jan1LBoY 3lSoMF6nHdV5RwVLeuOTebo3JdbWM4W8sh3jSmDUVakybj6xWLdjdAKVDpjtjCs54QTG 7DVDuYL3ZJ4VIUwF+ivBODH5ffAsFQhHgVKGNYBK5T1bufRFr5aFl1xWSl0NmDsT7mMW 7NXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722708613; x=1723313413; 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=ilYHZIwKOnRvQ2z2qrooGbgYja3yrOQMh4ORr99byFI=; b=iNQoMbGWjd2CH5jkpt3yzqKxQn9gfeQli9DzHYMeGtFhzspk1O7bElBWDBZtTnnj+2 1gBknVD0w36wnmc+0zxK4k6cLolLKp+ceVrRH1tVF8VDMKfVowISVL022JAKr3IyeucC paubqTbR0uJgXdcOMt4LTzY6XSUxJMZsnNihmnMLvng2bv4NZ10b9FXdZC0W6l3wUyC0 EFG1COrZr95GnY4/Dg9D2ps/cLDns3oGics9t4dOBGO5evQgLVQz64Tr06aLkbaHWBDP cgSyiTolpfr+PJotxYaLPoWP3sa+f4UHPht6gCXuqQIt/2Vb8cfkm3IRB1nv+6KHV1Aa aLoQ== X-Forwarded-Encrypted: i=1; AJvYcCVDoVX7TSPOt+zLs8CZM8iO46j2sarTUDG14QWTcld3HtuT8dp1Nbo/fsPJFq8ghhu0QXzYGx63yt8BkkAuv7bMJtsGVODzzuWY89FI X-Gm-Message-State: AOJu0Yxv+stkRSuIr9xElgVAkKLLX2jdF8OGGa4sa2NHAYXH/MUnJqa8 jHbOIxlIyAfHlLTooz0dTpoxbEJmEJS97fmdBSRfPxHVxBQjXvez1aLxtvgraGM= X-Google-Smtp-Source: AGHT+IHWEfGy/ODC5LuvM9xRj/YSrQfrkizxnX4LXllhmMC3P9783SLtr5sQfiRiP6VK6iDzKqYQhQ== X-Received: by 2002:a05:6e02:1b0f:b0:39a:16c0:4bef with SMTP id e9e14a558f8ab-39b1fc32f14mr103595985ab.23.1722708613449; Sat, 03 Aug 2024 11:10:13 -0700 (PDT) Received: from localhost.localdomain ([136.233.9.100]) by smtp.googlemail.com with ESMTPSA id 41be03b00d2f7-7b762e9f5aasm3046128a12.6.2024.08.03.11.10.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Aug 2024 11:10:12 -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 v6 2/2] iio: light: ltr390: Calculate 'counts_per_uvi' dynamically Date: Sat, 3 Aug 2024 23:39:49 +0530 Message-ID: <20240803180950.32821-3-abhashkumarjha123@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240803180950.32821-1-abhashkumarjha123@gmail.com> References: <20240803180950.32821-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 | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/iio/light/ltr390.c b/drivers/iio/light/ltr390.c index 44ca4b04a..3a2807101 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,14 @@ 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) +{ + const int orig_gain = 18; + const int orig_int_time = 400; + + return DIV_ROUND_CLOSEST(23 * data->gain * data->int_time_us, 10 * orig_gain * orig_int_time); +} + static int ltr390_read_raw(struct iio_dev *iio_device, struct iio_chan_spec const *chan, int *val, int *val2, long mask) @@ -159,8 +169,8 @@ static int ltr390_read_raw(struct iio_dev *iio_device, case IIO_CHAN_INFO_SCALE: switch (chan->type) { case IIO_UVINDEX: - *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_LIGHT: