Re: [PATCH v4] iio: proximity: sx_common: Add old register mapping

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 10 Feb 2023 16:24:21 -0800
Gwendal Grignou <gwendal@xxxxxxxxxxxx> wrote:

> Older firmwares still send sensor configuration using a list of
> registers with opaque values defined during sensor tuning.
> sx9234 and sx9360 sensor on ACPI based devices are concerned.
> More schema to configure the sensors will be needed to support devices
> designed for windows, like Samsung Galaxy Book2.
> 
> Support schema is: "<_HID>.<register_name>". For instance
> "STH9324,reg_adv_ctrl2" in:
> 
>     Scope (\_SB.PCI0.I2C2)
>     {
>         Device (SX28)
>         {
>             Name (_HID, "STH9324")  // _HID: Hardware ID
> ...
>             Name (_DSD, Package (0x02)  // _DSD: Device-Specific Data
>             {
>                 ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /*
> Device Properties for _DSD */,
>                 Package (0x3F)
>                 {
> ...
>                     Package (0x02)
>                     {
>                         "STH9324,reg_adv_ctrl2",
>                         Zero
>                     },`
> 
> Signed-off-by: Gwendal Grignou <gwendal@xxxxxxxxxxxx>
Applied to the togreg branch of iio.git but for now I'll only push it out as
testing until I can rebase that tree on rc1 in a few weeks time.

I'd slightly have preferred adding the stubs to the ACPI header but that
can always happen at a later date.

Jonathan

> ---
> Changes since v3:
> - Fix compilation issue when CONFIG_ACPI is not defined (ARM).
> 
> Changes since v2:
> - Use snprintf instead of scnprintf
> - Use acpi_device_hid() from the ACPI companion device to get the device
>   name.
> 
> Changes since v1:
> - remove double empty lines.
> - Add |property| field at end of structure to minimize changes.
> - Cache acpi_id entry, use standard API to retrieve it from parent
>   device.
> - Use that entry to see if a legacy APCI entry exists.
> 
>  drivers/iio/proximity/sx9324.c    | 96 ++++++++++++++++---------------
>  drivers/iio/proximity/sx9360.c    | 32 +++++------
>  drivers/iio/proximity/sx_common.c | 21 +++++++
>  drivers/iio/proximity/sx_common.h |  5 ++
>  4 files changed, 92 insertions(+), 62 deletions(-)
> 
> diff --git a/drivers/iio/proximity/sx9324.c b/drivers/iio/proximity/sx9324.c
> index 977cf17cec52b..9a40ca32bb1ca 100644
> --- a/drivers/iio/proximity/sx9324.c
> +++ b/drivers/iio/proximity/sx9324.c
> @@ -783,73 +783,75 @@ static int sx9324_write_raw(struct iio_dev *indio_dev,
>  
>  static const struct sx_common_reg_default sx9324_default_regs[] = {
>  	{ SX9324_REG_IRQ_MSK, 0x00 },
> -	{ SX9324_REG_IRQ_CFG0, 0x00 },
> -	{ SX9324_REG_IRQ_CFG1, SX9324_REG_IRQ_CFG1_FAILCOND },
> -	{ SX9324_REG_IRQ_CFG2, 0x00 },
> -	{ SX9324_REG_GNRL_CTRL0, SX9324_REG_GNRL_CTRL0_SCANPERIOD_100MS },
> +	{ SX9324_REG_IRQ_CFG0, 0x00, "irq_cfg0" },
> +	{ SX9324_REG_IRQ_CFG1, SX9324_REG_IRQ_CFG1_FAILCOND, "irq_cfg1" },
> +	{ SX9324_REG_IRQ_CFG2, 0x00, "irq_cfg2" },
> +	{ SX9324_REG_GNRL_CTRL0, SX9324_REG_GNRL_CTRL0_SCANPERIOD_100MS, "gnrl_ctrl0" },
>  	/*
>  	 * The lower 4 bits should not be set as it enable sensors measurements.
>  	 * Turning the detection on before the configuration values are set to
>  	 * good values can cause the device to return erroneous readings.
>  	 */
> -	{ SX9324_REG_GNRL_CTRL1, SX9324_REG_GNRL_CTRL1_PAUSECTRL },
> +	{ SX9324_REG_GNRL_CTRL1, SX9324_REG_GNRL_CTRL1_PAUSECTRL, "gnrl_ctrl1" },
>  
> -	{ SX9324_REG_AFE_CTRL0, SX9324_REG_AFE_CTRL0_RINT_LOWEST },
> -	{ SX9324_REG_AFE_CTRL3, 0x00 },
> +	{ SX9324_REG_AFE_CTRL0, SX9324_REG_AFE_CTRL0_RINT_LOWEST, "afe_ctrl0" },
> +	{ SX9324_REG_AFE_CTRL3, 0x00, "afe_ctrl3" },
>  	{ SX9324_REG_AFE_CTRL4, SX9324_REG_AFE_CTRL4_FREQ_83_33HZ |
> -		SX9324_REG_AFE_CTRL4_RES_100 },
> -	{ SX9324_REG_AFE_CTRL6, 0x00 },
> +		SX9324_REG_AFE_CTRL4_RES_100, "afe_ctrl4" },
> +	{ SX9324_REG_AFE_CTRL6, 0x00, "afe_ctrl6" },
>  	{ SX9324_REG_AFE_CTRL7, SX9324_REG_AFE_CTRL4_FREQ_83_33HZ |
> -		SX9324_REG_AFE_CTRL4_RES_100 },
> +		SX9324_REG_AFE_CTRL4_RES_100, "afe_ctrl7" },
>  
>  	/* TODO(gwendal): PHx use chip default or all grounded? */
> -	{ SX9324_REG_AFE_PH0, 0x29 },
> -	{ SX9324_REG_AFE_PH1, 0x26 },
> -	{ SX9324_REG_AFE_PH2, 0x1a },
> -	{ SX9324_REG_AFE_PH3, 0x16 },
> +	{ SX9324_REG_AFE_PH0, 0x29, "afe_ph0" },
> +	{ SX9324_REG_AFE_PH1, 0x26, "afe_ph1" },
> +	{ SX9324_REG_AFE_PH2, 0x1a, "afe_ph2" },
> +	{ SX9324_REG_AFE_PH3, 0x16, "afe_ph3" },
>  
>  	{ SX9324_REG_AFE_CTRL8, SX9324_REG_AFE_CTRL8_RESERVED |
> -		SX9324_REG_AFE_CTRL8_RESFILTIN_4KOHM },
> -	{ SX9324_REG_AFE_CTRL9, SX9324_REG_AFE_CTRL9_AGAIN_1 },
> +		SX9324_REG_AFE_CTRL8_RESFILTIN_4KOHM, "afe_ctrl8" },
> +	{ SX9324_REG_AFE_CTRL9, SX9324_REG_AFE_CTRL9_AGAIN_1, "afe_ctrl9" },
>  
>  	{ SX9324_REG_PROX_CTRL0,
>  		SX9324_REG_PROX_CTRL0_GAIN_1 << SX9324_REG_PROX_CTRL0_GAIN_SHIFT |
> -		SX9324_REG_PROX_CTRL0_RAWFILT_1P50 },
> +		SX9324_REG_PROX_CTRL0_RAWFILT_1P50, "prox_ctrl0" },
>  	{ SX9324_REG_PROX_CTRL1,
>  		SX9324_REG_PROX_CTRL0_GAIN_1 << SX9324_REG_PROX_CTRL0_GAIN_SHIFT |
> -		SX9324_REG_PROX_CTRL0_RAWFILT_1P50 },
> -	{ SX9324_REG_PROX_CTRL2, SX9324_REG_PROX_CTRL2_AVGNEG_THRESH_16K },
> +		SX9324_REG_PROX_CTRL0_RAWFILT_1P50, "prox_ctrl1" },
> +	{ SX9324_REG_PROX_CTRL2, SX9324_REG_PROX_CTRL2_AVGNEG_THRESH_16K, "prox_ctrl2" },
>  	{ SX9324_REG_PROX_CTRL3, SX9324_REG_PROX_CTRL3_AVGDEB_2SAMPLES |
> -		SX9324_REG_PROX_CTRL3_AVGPOS_THRESH_16K },
> +		SX9324_REG_PROX_CTRL3_AVGPOS_THRESH_16K, "prox_ctrl3" },
>  	{ SX9324_REG_PROX_CTRL4, SX9324_REG_PROX_CTRL4_AVGNEG_FILT_2 |
> -		SX9324_REG_PROX_CTRL4_AVGPOS_FILT_256 },
> -	{ SX9324_REG_PROX_CTRL5, 0x00 },
> -	{ SX9324_REG_PROX_CTRL6, SX9324_REG_PROX_CTRL6_PROXTHRESH_32 },
> -	{ SX9324_REG_PROX_CTRL7, SX9324_REG_PROX_CTRL6_PROXTHRESH_32 },
> -	{ SX9324_REG_ADV_CTRL0, 0x00 },
> -	{ SX9324_REG_ADV_CTRL1, 0x00 },
> -	{ SX9324_REG_ADV_CTRL2, 0x00 },
> -	{ SX9324_REG_ADV_CTRL3, 0x00 },
> -	{ SX9324_REG_ADV_CTRL4, 0x00 },
> +		SX9324_REG_PROX_CTRL4_AVGPOS_FILT_256, "prox_ctrl4" },
> +	{ SX9324_REG_PROX_CTRL5, 0x00, "prox_ctrl5" },
> +	{ SX9324_REG_PROX_CTRL6, SX9324_REG_PROX_CTRL6_PROXTHRESH_32, "prox_ctrl6" },
> +	{ SX9324_REG_PROX_CTRL7, SX9324_REG_PROX_CTRL6_PROXTHRESH_32, "prox_ctrl7" },
> +	{ SX9324_REG_ADV_CTRL0, 0x00, "adv_ctrl0" },
> +	{ SX9324_REG_ADV_CTRL1, 0x00, "adv_ctrl1" },
> +	{ SX9324_REG_ADV_CTRL2, 0x00, "adv_ctrl2" },
> +	{ SX9324_REG_ADV_CTRL3, 0x00, "adv_ctrl3" },
> +	{ SX9324_REG_ADV_CTRL4, 0x00, "adv_ctrl4" },
>  	{ SX9324_REG_ADV_CTRL5, SX9324_REG_ADV_CTRL5_STARTUP_SENSOR_1 |
> -		SX9324_REG_ADV_CTRL5_STARTUP_METHOD_1 },
> -	{ SX9324_REG_ADV_CTRL6, 0x00 },
> -	{ SX9324_REG_ADV_CTRL7, 0x00 },
> -	{ SX9324_REG_ADV_CTRL8, 0x00 },
> -	{ SX9324_REG_ADV_CTRL9, 0x00 },
> +		SX9324_REG_ADV_CTRL5_STARTUP_METHOD_1, "adv_ctrl5" },
> +	{ SX9324_REG_ADV_CTRL6, 0x00, "adv_ctrl6" },
> +	{ SX9324_REG_ADV_CTRL7, 0x00, "adv_ctrl7" },
> +	{ SX9324_REG_ADV_CTRL8, 0x00, "adv_ctrl8" },
> +	{ SX9324_REG_ADV_CTRL9, 0x00, "adv_ctrl9" },
>  	/* Body/Table threshold */
> -	{ SX9324_REG_ADV_CTRL10, 0x00 },
> -	{ SX9324_REG_ADV_CTRL11, 0x00 },
> -	{ SX9324_REG_ADV_CTRL12, 0x00 },
> +	{ SX9324_REG_ADV_CTRL10, 0x00, "adv_ctrl10" },
> +	{ SX9324_REG_ADV_CTRL11, 0x00, "adv_ctrl11" },
> +	{ SX9324_REG_ADV_CTRL12, 0x00, "adv_ctrl12" },
>  	/* TODO(gwendal): SAR currenly disabled */
> -	{ SX9324_REG_ADV_CTRL13, 0x00 },
> -	{ SX9324_REG_ADV_CTRL14, 0x00 },
> -	{ SX9324_REG_ADV_CTRL15, 0x00 },
> -	{ SX9324_REG_ADV_CTRL16, 0x00 },
> -	{ SX9324_REG_ADV_CTRL17, 0x00 },
> -	{ SX9324_REG_ADV_CTRL18, 0x00 },
> -	{ SX9324_REG_ADV_CTRL19, SX9324_REG_ADV_CTRL19_HIGHT_FAILURE_THRESH_SATURATION },
> -	{ SX9324_REG_ADV_CTRL20, SX9324_REG_ADV_CTRL19_HIGHT_FAILURE_THRESH_SATURATION },
> +	{ SX9324_REG_ADV_CTRL13, 0x00, "adv_ctrl13" },
> +	{ SX9324_REG_ADV_CTRL14, 0x00, "adv_ctrl14" },
> +	{ SX9324_REG_ADV_CTRL15, 0x00, "adv_ctrl15" },
> +	{ SX9324_REG_ADV_CTRL16, 0x00, "adv_ctrl16" },
> +	{ SX9324_REG_ADV_CTRL17, 0x00, "adv_ctrl17" },
> +	{ SX9324_REG_ADV_CTRL18, 0x00, "adv_ctrl18" },
> +	{ SX9324_REG_ADV_CTRL19,
> +		SX9324_REG_ADV_CTRL19_HIGHT_FAILURE_THRESH_SATURATION, "adv_ctrl19" },
> +	{ SX9324_REG_ADV_CTRL20,
> +		SX9324_REG_ADV_CTRL19_HIGHT_FAILURE_THRESH_SATURATION, "adv_ctrl20" },
>  };
>  
>  /* Activate all channels and perform an initial compensation. */
> @@ -889,13 +891,15 @@ sx9324_get_default_reg(struct device *dev, int idx,
>  	const char *res;
>  
>  	memcpy(reg_def, &sx9324_default_regs[idx], sizeof(*reg_def));
> +
> +	sx_common_get_raw_register_config(dev, reg_def);
>  	switch (reg_def->reg) {
>  	case SX9324_REG_AFE_PH0:
>  	case SX9324_REG_AFE_PH1:
>  	case SX9324_REG_AFE_PH2:
>  	case SX9324_REG_AFE_PH3:
>  		ph = reg_def->reg - SX9324_REG_AFE_PH0;
> -		scnprintf(prop, ARRAY_SIZE(prop), "semtech,ph%d-pin", ph);
> +		snprintf(prop, ARRAY_SIZE(prop), "semtech,ph%d-pin", ph);
>  
>  		count = device_property_count_u32(dev, prop);
>  		if (count != ARRAY_SIZE(pin_defs))
> diff --git a/drivers/iio/proximity/sx9360.c b/drivers/iio/proximity/sx9360.c
> index 6e19d22e6a015..a50d9176411a1 100644
> --- a/drivers/iio/proximity/sx9360.c
> +++ b/drivers/iio/proximity/sx9360.c
> @@ -663,37 +663,37 @@ static int sx9360_write_raw(struct iio_dev *indio_dev,
>  
>  static const struct sx_common_reg_default sx9360_default_regs[] = {
>  	{ SX9360_REG_IRQ_MSK, 0x00 },
> -	{ SX9360_REG_IRQ_CFG, 0x00 },
> +	{ SX9360_REG_IRQ_CFG, 0x00, "irq_cfg" },
>  	/*
>  	 * The lower 2 bits should not be set as it enable sensors measurements.
>  	 * Turning the detection on before the configuration values are set to
>  	 * good values can cause the device to return erroneous readings.
>  	 */
> -	{ SX9360_REG_GNRL_CTRL0, 0x00 },
> -	{ SX9360_REG_GNRL_CTRL1, 0x00 },
> -	{ SX9360_REG_GNRL_CTRL2, SX9360_REG_GNRL_CTRL2_PERIOD_102MS },
> +	{ SX9360_REG_GNRL_CTRL0, 0x00, "gnrl_ctrl0" },
> +	{ SX9360_REG_GNRL_CTRL1, 0x00, "gnrl_ctrl1" },
> +	{ SX9360_REG_GNRL_CTRL2, SX9360_REG_GNRL_CTRL2_PERIOD_102MS, "gnrl_ctrl2" },
>  
> -	{ SX9360_REG_AFE_CTRL1, SX9360_REG_AFE_CTRL1_RESFILTIN_0OHMS },
> +	{ SX9360_REG_AFE_CTRL1, SX9360_REG_AFE_CTRL1_RESFILTIN_0OHMS, "afe_ctrl0" },
>  	{ SX9360_REG_AFE_PARAM0_PHR, SX9360_REG_AFE_PARAM0_RSVD |
> -		SX9360_REG_AFE_PARAM0_RESOLUTION_128 },
> +		SX9360_REG_AFE_PARAM0_RESOLUTION_128, "afe_param0_phr" },
>  	{ SX9360_REG_AFE_PARAM1_PHR, SX9360_REG_AFE_PARAM1_AGAIN_PHM_6PF |
> -		SX9360_REG_AFE_PARAM1_FREQ_83_33HZ },
> +		SX9360_REG_AFE_PARAM1_FREQ_83_33HZ, "afe_param1_phr" },
>  	{ SX9360_REG_AFE_PARAM0_PHM, SX9360_REG_AFE_PARAM0_RSVD |
> -		SX9360_REG_AFE_PARAM0_RESOLUTION_128 },
> +		SX9360_REG_AFE_PARAM0_RESOLUTION_128, "afe_param0_phm" },
>  	{ SX9360_REG_AFE_PARAM1_PHM, SX9360_REG_AFE_PARAM1_AGAIN_PHM_6PF |
> -		SX9360_REG_AFE_PARAM1_FREQ_83_33HZ },
> +		SX9360_REG_AFE_PARAM1_FREQ_83_33HZ, "afe_param1_phm" },
>  
>  	{ SX9360_REG_PROX_CTRL0_PHR, SX9360_REG_PROX_CTRL0_GAIN_1 |
> -		SX9360_REG_PROX_CTRL0_RAWFILT_1P50 },
> +		SX9360_REG_PROX_CTRL0_RAWFILT_1P50, "prox_ctrl0_phr" },
>  	{ SX9360_REG_PROX_CTRL0_PHM, SX9360_REG_PROX_CTRL0_GAIN_1 |
> -		SX9360_REG_PROX_CTRL0_RAWFILT_1P50 },
> -	{ SX9360_REG_PROX_CTRL1, SX9360_REG_PROX_CTRL1_AVGNEG_THRESH_16K },
> +		SX9360_REG_PROX_CTRL0_RAWFILT_1P50, "prox_ctrl0_phm" },
> +	{ SX9360_REG_PROX_CTRL1, SX9360_REG_PROX_CTRL1_AVGNEG_THRESH_16K, "prox_ctrl1" },
>  	{ SX9360_REG_PROX_CTRL2, SX9360_REG_PROX_CTRL2_AVGDEB_2SAMPLES |
> -		SX9360_REG_PROX_CTRL2_AVGPOS_THRESH_16K },
> +		SX9360_REG_PROX_CTRL2_AVGPOS_THRESH_16K, "prox_ctrl2" },
>  	{ SX9360_REG_PROX_CTRL3, SX9360_REG_PROX_CTRL3_AVGNEG_FILT_2 |
> -		SX9360_REG_PROX_CTRL3_AVGPOS_FILT_256 },
> -	{ SX9360_REG_PROX_CTRL4, 0x00 },
> -	{ SX9360_REG_PROX_CTRL5, SX9360_REG_PROX_CTRL5_PROXTHRESH_32 },
> +		SX9360_REG_PROX_CTRL3_AVGPOS_FILT_256, "prox_ctrl3" },
> +	{ SX9360_REG_PROX_CTRL4, 0x00, "prox_ctrl4" },
> +	{ SX9360_REG_PROX_CTRL5, SX9360_REG_PROX_CTRL5_PROXTHRESH_32, "prox_ctrl5" },
>  };
>  
>  /* Activate all channels and perform an initial compensation. */
> diff --git a/drivers/iio/proximity/sx_common.c b/drivers/iio/proximity/sx_common.c
> index eba9256730ec1..fe07d1444ac37 100644
> --- a/drivers/iio/proximity/sx_common.c
> +++ b/drivers/iio/proximity/sx_common.c
> @@ -424,6 +424,27 @@ static const struct iio_buffer_setup_ops sx_common_buffer_setup_ops = {
>  	.postdisable = sx_common_buffer_postdisable,
>  };
>  
> +void sx_common_get_raw_register_config(struct device *dev,
> +				       struct sx_common_reg_default *reg_def)
> +{
> +#ifdef CONFIG_ACPI
> +	struct acpi_device *adev = ACPI_COMPANION(dev);
> +	u32 raw = 0, ret;
> +	char prop[80];
> +
> +	if (!reg_def->property || !adev)
> +		return;
> +
> +	snprintf(prop, ARRAY_SIZE(prop), "%s,reg_%s", acpi_device_hid(adev), reg_def->property);
> +	ret = device_property_read_u32(dev, prop, &raw);
> +	if (ret)
> +		return;
> +
> +	reg_def->def = raw;
> +#endif
> +}
> +EXPORT_SYMBOL_NS_GPL(sx_common_get_raw_register_config, SEMTECH_PROX);
> +
>  #define SX_COMMON_SOFT_RESET				0xde
>  
>  static int sx_common_init_device(struct device *dev, struct iio_dev *indio_dev)
> diff --git a/drivers/iio/proximity/sx_common.h b/drivers/iio/proximity/sx_common.h
> index 49d4517103b0f..85bb5af7c6ea0 100644
> --- a/drivers/iio/proximity/sx_common.h
> +++ b/drivers/iio/proximity/sx_common.h
> @@ -8,6 +8,7 @@
>  #ifndef IIO_SX_COMMON_H
>  #define IIO_SX_COMMON_H
>  
> +#include <linux/acpi.h>
>  #include <linux/iio/iio.h>
>  #include <linux/iio/types.h>
>  #include <linux/regulator/consumer.h>
> @@ -26,6 +27,7 @@ static_assert(SX_COMMON_MAX_NUM_CHANNELS < BITS_PER_LONG);
>  struct sx_common_reg_default {
>  	u8 reg;
>  	u8 def;
> +	const char *property;
>  };
>  
>  /**
> @@ -149,6 +151,9 @@ int sx_common_probe(struct i2c_client *client,
>  		    const struct sx_common_chip_info *chip_info,
>  		    const struct regmap_config *regmap_config);
>  
> +void sx_common_get_raw_register_config(struct device *dev,
> +				       struct sx_common_reg_default *reg_def);
> +
>  /* 3 is the number of events defined by a single phase. */
>  extern const struct iio_event_spec sx_common_events[3];
>  




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux