Message ID | 20200519065749.4624-4-jonathan.albrieux@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iio: magnetometer: ak8975: Add gpio reset support | expand |
On Tue, May 19, 2020 at 08:57:43AM +0200, Jonathan Albrieux wrote: Thanks for an update, my comments below. > According to AK09911 datasheet, if reset gpio is provided then Trailing whitespace. > deassert reset on ak8975_power_on and assert reset on ak8975_power_off. > > Without reset's deassertion during ak8975_power_on, driver's probe fails on > ak8975_who_i_am while checking for device identity for AK09911 chip > > AK09911 has an active low reset gpio to handle register's reset. > AK09911 datasheed says that, if not used, reset pin should be connected > to VID. This patch emulates this situation Please, put periods at the end of the phrases. > /* > - * According to the datasheet the power supply rise time i 200us > + * According to the datasheet the power supply rise time is 200us > * and the minimum wait time before mode setting is 100us, in > - * total 300 us. Add some margin and say minimum 500us here. > + * total 300us. Add some margin and say minimum 500us here. > */ This is not related change (perhaps, you may do in separate patch), but I'm not against it. Up to maintainer. > + /* > + * According to AK09911 datasheet, if reset gpio is provided then > + * deassert reset on ak8975_power_on and assert reset on > + * ak8975_power_off. We try to refer to the code accordingly to the kernel doc recommendations (even for non-kdoc comments). So, here, 'function' as 'function()' (without quotes) and so on. > + */ > + reset_gpiod = devm_gpiod_get_optional(&client->dev, > + "reset", GPIOD_OUT_HIGH); > + if (IS_ERR(reset_gpiod)) > + return PTR_ERR(reset_gpiod); > + > /* Register with IIO */ > indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); > if (indio_dev == NULL) > @@ -866,6 +883,7 @@ static int ak8975_probe(struct i2c_client *client, > > data->client = client; > data->eoc_gpiod = eoc_gpiod; > + data->reset_gpiod = reset_gpiod; > data->eoc_irq = 0; > > err = iio_read_mount_matrix(&client->dev, "mount-matrix", &data->orientation); > -- > 2.17.1 >
On Tue, May 19, 2020 at 12:21:27PM +0300, Andy Shevchenko wrote: > On Tue, May 19, 2020 at 08:57:43AM +0200, Jonathan Albrieux wrote: > > Thanks for an update, my comments below. > Thanks to you for taking time to review the code! > > According to AK09911 datasheet, if reset gpio is provided then > > Trailing whitespace. > > > deassert reset on ak8975_power_on and assert reset on ak8975_power_off. > > > > Without reset's deassertion during ak8975_power_on, driver's probe fails on > > ak8975_who_i_am while checking for device identity for AK09911 chip > > > > AK09911 has an active low reset gpio to handle register's reset. > > AK09911 datasheed says that, if not used, reset pin should be connected > > to VID. This patch emulates this situation > > Please, put periods at the end of the phrases. > > > /* > > - * According to the datasheet the power supply rise time i 200us > > + * According to the datasheet the power supply rise time is 200us > > * and the minimum wait time before mode setting is 100us, in > > - * total 300 us. Add some margin and say minimum 500us here. > > + * total 300us. Add some margin and say minimum 500us here. > > */ > > This is not related change (perhaps, you may do in separate patch), but I'm not > against it. Up to maintainer. > Ok I will separate the patch > > + /* > > + * According to AK09911 datasheet, if reset gpio is provided then > > + * deassert reset on ak8975_power_on and assert reset on > > + * ak8975_power_off. > > We try to refer to the code accordingly to the kernel doc recommendations (even > for non-kdoc comments). So, here, 'function' as 'function()' (without quotes) > and so on. > Will fix this as like as the other changes you pointed out about periods and trailing spaces as soon as possible > > + */ > > + reset_gpiod = devm_gpiod_get_optional(&client->dev, > > + "reset", GPIOD_OUT_HIGH); > > + if (IS_ERR(reset_gpiod)) > > + return PTR_ERR(reset_gpiod); > > + > > /* Register with IIO */ > > indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); > > if (indio_dev == NULL) > > @@ -866,6 +883,7 @@ static int ak8975_probe(struct i2c_client *client, > > > > data->client = client; > > data->eoc_gpiod = eoc_gpiod; > > + data->reset_gpiod = reset_gpiod; > > data->eoc_irq = 0; > > > > err = iio_read_mount_matrix(&client->dev, "mount-matrix", &data->orientation); > > -- > > 2.17.1 > > > > -- > With Best Regards, > Andy Shevchenko > > Again, thank you, Best regards, Jonathan Albrieux
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c index 3c881541ae72..84dea520db02 100644 --- a/drivers/iio/magnetometer/ak8975.c +++ b/drivers/iio/magnetometer/ak8975.c @@ -358,6 +358,7 @@ struct ak8975_data { u8 asa[3]; long raw_to_gauss[3]; struct gpio_desc *eoc_gpiod; + struct gpio_desc *reset_gpiod; int eoc_irq; wait_queue_head_t data_ready_queue; unsigned long flags; @@ -384,10 +385,13 @@ static int ak8975_power_on(const struct ak8975_data *data) "Failed to enable specified Vid supply\n"); return ret; } + + gpiod_set_value_cansleep(data->reset_gpiod, 0); + /* - * According to the datasheet the power supply rise time i 200us + * According to the datasheet the power supply rise time is 200us * and the minimum wait time before mode setting is 100us, in - * total 300 us. Add some margin and say minimum 500us here. + * total 300us. Add some margin and say minimum 500us here. */ usleep_range(500, 1000); return 0; @@ -396,6 +400,8 @@ static int ak8975_power_on(const struct ak8975_data *data) /* Disable attached power regulator if any. */ static void ak8975_power_off(const struct ak8975_data *data) { + gpiod_set_value_cansleep(data->reset_gpiod, 1); + regulator_disable(data->vid); regulator_disable(data->vdd); } @@ -839,6 +845,7 @@ static int ak8975_probe(struct i2c_client *client, struct ak8975_data *data; struct iio_dev *indio_dev; struct gpio_desc *eoc_gpiod; + struct gpio_desc *reset_gpiod; const void *match; unsigned int i; int err; @@ -856,6 +863,16 @@ static int ak8975_probe(struct i2c_client *client, if (eoc_gpiod) gpiod_set_consumer_name(eoc_gpiod, "ak_8975"); + /* + * According to AK09911 datasheet, if reset gpio is provided then + * deassert reset on ak8975_power_on and assert reset on + * ak8975_power_off. + */ + reset_gpiod = devm_gpiod_get_optional(&client->dev, + "reset", GPIOD_OUT_HIGH); + if (IS_ERR(reset_gpiod)) + return PTR_ERR(reset_gpiod); + /* Register with IIO */ indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (indio_dev == NULL) @@ -866,6 +883,7 @@ static int ak8975_probe(struct i2c_client *client, data->client = client; data->eoc_gpiod = eoc_gpiod; + data->reset_gpiod = reset_gpiod; data->eoc_irq = 0; err = iio_read_mount_matrix(&client->dev, "mount-matrix", &data->orientation);
According to AK09911 datasheet, if reset gpio is provided then deassert reset on ak8975_power_on and assert reset on ak8975_power_off. Without reset's deassertion during ak8975_power_on, driver's probe fails on ak8975_who_i_am while checking for device identity for AK09911 chip AK09911 has an active low reset gpio to handle register's reset. AK09911 datasheed says that, if not used, reset pin should be connected to VID. This patch emulates this situation Signed-off-by: Jonathan Albrieux <jonathan.albrieux@gmail.com> --- drivers/iio/magnetometer/ak8975.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-)