[PATCH v2 2/3] iio: tsl2772: add support for Avago APDS9900/9901 ALS/Proximity sensor

Svyatoslav Ryhel
2026-04-19T08:31:54Z

The Avago APDS990x has the same register set as the TAOS/AMS TSL2772 so
just add the correct bindings and the appropriate LUX table derived from
the values in the datasheet. Driver was tested on the LG Optimus Vu P895.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
drivers/iio/light/tsl2772.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)

diff --git a/drivers/iio/light/tsl2772.c b/drivers/iio/light/tsl2772.c
index c8f15ba95267..8dab34bf00ca 100644
--- a/drivers/iio/light/tsl2772.c
+++ b/drivers/iio/light/tsl2772.c
@@ -127,6 +127,7 @@ enum {
tmd2672,
tsl2772,
tmd2772,
+ apds990x,
apds9930,
};

@@ -221,6 +222,12 @@ static const struct tsl2772_lux tmd2x72_lux_table[TSL2772_DEF_LUX_TABLE_SZ] = {
{ 0, 0 },
};

+static const struct tsl2772_lux apds990x_lux_table[TSL2772_DEF_LUX_TABLE_SZ] = {
+ { 52000, 115960 },
+ { 36400, 73840 },
+ { 0, 0 },
+};
+
static const struct tsl2772_lux apds9930_lux_table[TSL2772_DEF_LUX_TABLE_SZ] = {
{ 52000, 96824 },
{ 38792, 67132 },
@@ -238,6 +245,7 @@ static const struct tsl2772_lux *tsl2772_default_lux_table_group[] = {
[tmd2672] = tmd2x72_lux_table,
[tsl2772] = tsl2x72_lux_table,
[tmd2772] = tmd2x72_lux_table,
+ [apds990x] = apds990x_lux_table,
[apds9930] = apds9930_lux_table,
};

@@ -289,6 +297,7 @@ static const int tsl2772_int_time_avail[][6] = {
[tmd2672] = { 0, 2730, 0, 2730, 0, 699000 },
[tsl2772] = { 0, 2730, 0, 2730, 0, 699000 },
[tmd2772] = { 0, 2730, 0, 2730, 0, 699000 },
+ [apds990x] = { 0, 2720, 0, 2720, 0, 696000 },
[apds9930] = { 0, 2730, 0, 2730, 0, 699000 },
};

@@ -316,6 +325,7 @@ static const u8 device_channel_config[] = {
[tmd2672] = PRX2,
[tsl2772] = ALSPRX2,
[tmd2772] = ALSPRX2,
+ [apds990x] = ALSPRX,
[apds9930] = ALSPRX2,
};

@@ -530,6 +540,7 @@ static int tsl2772_get_prox(struct iio_dev *indio_dev)
case tmd2672:
case tsl2772:
case tmd2772:
+ case apds990x:
case apds9930:
if (!(ret & TSL2772_STA_PRX_VALID)) {
ret = -EINVAL;
@@ -1367,6 +1378,7 @@ static int tsl2772_device_id_verif(int id, int target)
return (id & 0xf0) == TRITON_ID;
case tmd2671:
case tmd2771:
+ case apds990x:
return (id & 0xf0) == HALIBUT_ID;
case tsl2572:
case tsl2672:
@@ -1898,6 +1910,8 @@ static const struct i2c_device_id tsl2772_idtable[] = {
{ "tmd2672", tmd2672 },
{ "tsl2772", tsl2772 },
{ "tmd2772", tmd2772 },
+ { "apds9900", apds990x },
+ { "apds9901", apds990x },
{ "apds9930", apds9930 },
{ }
};
@@ -1915,6 +1929,8 @@ static const struct of_device_id tsl2772_of_match[] = {
{ .compatible = "amstaos,tmd2672" },
{ .compatible = "amstaos,tsl2772" },
{ .compatible = "amstaos,tmd2772" },
+ { .compatible = "avago,apds9900" },
+ { .compatible = "avago,apds9901" },
{ .compatible = "avago,apds9930" },
{ }
};
--
2.51.0