[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1abf4238-5bf4-44e9-9a4b-41838cc9e472@baylibre.com>
Date: Wed, 23 Jul 2025 15:14:25 -0500
From: David Lechner <dlechner@...libre.com>
To: Akshay Jindal <akshayaj.lkd@...il.com>, anshulusr@...il.com,
jic23@...nel.org, nuno.sa@...log.com, andy@...nel.org
Cc: shuah@...nel.org, linux-iio@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2] iio: light: ltr390: Add debugfs register access
support
On 7/23/25 1:04 PM, Akshay Jindal wrote:
> Add support for debugfs_reg_access through the driver's iio_info structure
> to enable low-level register read/write access for debugging.
>
> Signed-off-by: Akshay Jindal <akshayaj.lkd@...il.com>
> ---
>
> Changes since v1:
> =================
> - Replaced _[0|1|2] macros with a respective common parameterized macro.
> - Retained base macros to avoid churn.
> - Swapped regmap_write with regmap_read to avoid negate operator.
> - Simplified debugfs function by directly returning return value of
> regmap_[read|write].
> - Replaced [readable|writeable]_reg with regmap ranges by using
> [rd|wr]_table property of regmap_config.
>
> Testing details(updated):
> ========================
> -> Tested on Raspberrypi 4B. Follow for more details.
>
> akshayajpi@...pberrypi:~ $ uname -r
> 6.12.35-v8+
> akshayajpi@...pberrypi:~ $ uname -a
> Linux raspberrypi 6.12.35-v8+ #5 SMP PREEMPT Tue Jul 15 17:38:06 IST 2025 aarch64 GNU/Linux
>
> -> Sensor Detection, overlaying of device tree and Driver loading
> akshayajpi@...pberrypi:~ $ i2cdetect -y 1
> 0 1 2 3 4 5 6 7 8 9 a b c d e f
> 00: -- -- -- -- -- -- -- --
> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
> 50: -- -- -- 53 -- -- -- -- -- -- -- -- -- -- -- --
> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
> 70: -- -- -- -- -- -- -- --
>
> akshayajpi@...pberrypi:~ $ sudo dtoverlay i2c-sensor ltr390
> akshayajpi@...pberrypi:~ $ lsmod|grep ltr390
> ltr390 16384 0
> industrialio 110592 1 ltr390
> regmap_i2c 12288 1 ltr390
>
>
> 1. Disable sensor via debugfs, verify from i2cget and debugfs.
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x0 | sudo tee direct_reg_access
> 0x0
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x2
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x0 0x0 | sudo tee direct_reg_access
> 0x0 0x0
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x0
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ i2cget -f -y 1 0x53 0x0
> 0x00
>
> 2. Disable sensor via debugfs and read data status via debugfs.
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat /sys/bus/iio/devices/iio\:device0/in_illuminance_raw
> 603
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat /sys/bus/iio/devices/iio\:device0/in_illuminance_raw
> 603
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat /sys/bus/iio/devices/iio\:device0/in_illuminance_raw
> 603
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ i2cget -f -y 1 0x53 0x7
> 0x28
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ i2cget -f -y 1 0x53 0x7
> 0x00
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x7 | sudo tee direct_reg_access
> 0x7
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x0
>
> 3. Re-enable sensor via debugfs and read data status via debugfs.
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x0 0x2 | sudo tee direct_reg_access
> 0x0 0x2
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x2
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat /sys/bus/iio/devices/iio\:device0/in_illuminance_raw
> 608
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat /sys/bus/iio/devices/iio\:device0/in_illuminance_raw
> 614
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat /sys/bus/iio/devices/iio\:device0/in_illuminance_raw
> 601
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x7 | sudo tee direct_reg_access
> 0x7
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x8
>
> 4. Enable interrupts via sysfs and verify via debugfs.
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 1 | sudo tee /sys/bus/iio/devices/iio\:device0/events/in_illuminance_thresh_either_en
> 1
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ i2cget -f -y 1 0x53 0x19
> 0x14
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x19 | sudo tee direct_reg_access
> 0x19
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x14
>
> 5. Write falling threshold via debugfs, verify the threshold written via sysfs.
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x24 0x32 | sudo tee direct_reg_access
> 0x24 0x32
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x32
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x25 0x0 | sudo tee direct_reg_access
> 0x25 0x0
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x0
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x26 0x0 | sudo tee direct_reg_access
> 0x26 0x0
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x0
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat /sys/bus/iio/devices/iio\:device0/events/in_illuminance_thresh_falling_value
> 50
> final value = 0x0 << 16 | 0x0 << 8 | 0x32 = 50
>
> 6. Block light and verify interrupts getting generated.
> -> Before blocking light
> cat /proc/interrupts|grep ltr390
> 58: 0 0 0 0 pinctrl-bcm2835 4 Edge ltr390_thresh_event
>
> ->After blocking light
> 58: 63 0 0 0 pinctrl-bcm2835 4 Edge ltr390_thresh_event
>
> 7. write value to a non-writeable reg via debugfs.
> -> LTR390_ALS_DATA_0|1|2 are non-writeable registers. Writing to them gives I/O error as expected.
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0xd 0x1 | sudo tee direct_reg_access
> 0xd 0x1
> tee: direct_reg_access: Input/output error
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0xe 0x1 | sudo tee direct_reg_access
> 0xe 0x1
> tee: direct_reg_access: Input/output error
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0xf 0x1 | sudo tee direct_reg_access
> 0xf 0x1
> tee: direct_reg_access: Input/output error
>
> 8. read value from a non-readable reg via debugfs.
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x2 |sudo tee direct_reg_access
> 0x2
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> cat: direct_reg_access: Input/output error
>
> 9. do simple raw reads from debugfs.
> -> reading raw value via sysfs:
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat /sys/bus/iio/devices/iio\:device0/in_illuminance_raw
> 627
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat /sys/bus/iio/devices/iio\:device0/in_illuminance_raw
> 622
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat /sys/bus/iio/devices/iio\:device0/in_illuminance_raw
> 616
>
> -> reading via debugfs (should be in the same ballpark of sysfs)
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0xd | sudo tee direct_reg_access
> 0xd
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0xC7
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0xe | sudo tee direct_reg_access
> 0xe
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x2
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0xf | sudo tee direct_reg_access
> 0xf
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> 0x0
> final value = 0x0 << 16 | 0x2 << 8 | 0x70 = 624
>
> 10. Testing reads on registers beyond max_register.
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x27 | sudo tee direct_reg_access
> 0x27
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> cat: direct_reg_access: Input/output error
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ echo 0x28 | sudo tee direct_reg_access
> 0x28
> akshayajpi@...pberrypi:/sys/kernel/debug/iio/iio:device0 $ cat direct_reg_access
> cat: direct_reg_access: Input/output error
>
> drivers/iio/light/ltr390.c | 55 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 55 insertions(+)
>
> diff --git a/drivers/iio/light/ltr390.c b/drivers/iio/light/ltr390.c
> index ee59bbb8aa09..b63301648689 100644
> --- a/drivers/iio/light/ltr390.c
> +++ b/drivers/iio/light/ltr390.c
> @@ -38,12 +38,21 @@
> #define LTR390_ALS_UVS_GAIN 0x05
> #define LTR390_PART_ID 0x06
> #define LTR390_MAIN_STATUS 0x07
> +
> #define LTR390_ALS_DATA 0x0D
> +#define LTR390_ALS_DATA_BYTE(n) ((LTR390_ALS_DATA) + (n))
> +
> #define LTR390_UVS_DATA 0x10
> +#define LTR390_UVS_DATA_BYTE(n) ((LTR390_UVS_DATA) + (n))
> +
> #define LTR390_INT_CFG 0x19
> #define LTR390_INT_PST 0x1A
> +
> #define LTR390_THRESH_UP 0x21
> +#define LTR390_THRESH_UP_BYTE(n) ((LTR390_THRESH_UP) + (n))
> +
> #define LTR390_THRESH_LOW 0x24
> +#define LTR390_THRESH_LOW_BYTE(n) ((LTR390_THRESH_LOW) + (n))
>
> #define LTR390_PART_NUMBER_ID 0xb
> #define LTR390_ALS_UVS_GAIN_MASK GENMASK(2, 0)
> @@ -98,11 +107,42 @@ struct ltr390_data {
> int int_time_us;
> };
>
> +static const struct regmap_range ltr390_readable_reg_ranges[] = {
> + regmap_reg_range(LTR390_MAIN_CTRL, LTR390_MAIN_CTRL),
> + regmap_reg_range(LTR390_ALS_UVS_MEAS_RATE, LTR390_MAIN_STATUS),
> + regmap_reg_range(LTR390_ALS_DATA_BYTE(0), LTR390_ALS_DATA_BYTE(2)),
> + regmap_reg_range(LTR390_UVS_DATA_BYTE(0), LTR390_UVS_DATA_BYTE(2)),
> + regmap_reg_range(LTR390_INT_CFG, LTR390_INT_PST),
> + regmap_reg_range(LTR390_THRESH_UP_BYTE(0), LTR390_THRESH_UP_BYTE(2)),
> + regmap_reg_range(LTR390_THRESH_LOW_BYTE(0), LTR390_THRESH_LOW_BYTE(2)),
We don't need separate lines if there is no gap. I didn't check all of the lines
but at least these last two can be combined since LTR390_THRESH_UP_BYTE(2) is
0x23 and LTR390_THRESH_LOW_BYTE(0) is 0x24.
regmap_reg_range(LTR390_THRESH_UP, LTR390_THRESH_LOW + 2),
And we could avoid adding the extra macros just for this since they
aren't used anywhere else.
> +};
> +
Powered by blists - more mailing lists