Re: [PATCH] iio: accel: mma8452: remove the reset operation during driver probe

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

 



On Tue, 22 Feb 2022 12:45:51 +0800
<haibo.chen@xxxxxxx> wrote:

> From: Haibo Chen <haibo.chen@xxxxxxx>
> 
> Though Sensor Datasheet define this reset bit in it's CTRL_REG2
> register, but seems the actual hardware behavior do not align with
> the doc expect. Once the reset bit is set, sensor can’t give back
> an I2C ack, which will cause the probe fail. So just remove this
> reset operation.
> 
> Signed-off-by: Haibo Chen <haibo.chen@xxxxxxx>

Hi Haibo,

I'm not really that keen to remove reset on probe as it's normally
a good way to ensure we get a device into a sane state as we have no
idea what has run before we load the driver.

Wolfram is there a standard way to work around missing ACK in cases
like this?  Would just ignoring the return value be fine or are their
i2c masters that will get stuck if they don't get the expected ack?

Jonathan

> ---
>  drivers/iio/accel/mma8452.c | 28 ----------------------------
>  1 file changed, 28 deletions(-)
> 
> diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
> index 0016bb947c10..ec9e26fdfb2a 100644
> --- a/drivers/iio/accel/mma8452.c
> +++ b/drivers/iio/accel/mma8452.c
> @@ -1481,30 +1481,6 @@ static void mma8452_trigger_cleanup(struct iio_dev *indio_dev)
>  		iio_trigger_unregister(indio_dev->trig);
>  }
>  
> -static int mma8452_reset(struct i2c_client *client)
> -{
> -	int i;
> -	int ret;
> -
> -	ret = i2c_smbus_write_byte_data(client,	MMA8452_CTRL_REG2,
> -					MMA8452_CTRL_REG2_RST);
> -	if (ret < 0)
> -		return ret;
> -
> -	for (i = 0; i < 10; i++) {
> -		usleep_range(100, 200);
> -		ret = i2c_smbus_read_byte_data(client, MMA8452_CTRL_REG2);
> -		if (ret == -EIO)
> -			continue; /* I2C comm reset */
> -		if (ret < 0)
> -			return ret;
> -		if (!(ret & MMA8452_CTRL_REG2_RST))
> -			return 0;
> -	}
> -
> -	return -ETIMEDOUT;
> -}
> -
>  static const struct of_device_id mma8452_dt_ids[] = {
>  	{ .compatible = "fsl,mma8451", .data = &mma_chip_info_table[mma8451] },
>  	{ .compatible = "fsl,mma8452", .data = &mma_chip_info_table[mma8452] },
> @@ -1591,10 +1567,6 @@ static int mma8452_probe(struct i2c_client *client,
>  	indio_dev->num_channels = data->chip_info->num_channels;
>  	indio_dev->available_scan_masks = mma8452_scan_masks;
>  
> -	ret = mma8452_reset(client);
> -	if (ret < 0)
> -		goto disable_regulators;
> -
>  	data->data_cfg = MMA8452_DATA_CFG_FS_2G;
>  	ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG,
>  					data->data_cfg);




[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