Re: [PATCH] iio: gyro: bmi055 gyro sensor driver

From: Jonathan Cameron
Date: Sun Sep 14 2014 - 13:42:41 EST


On 02/09/14 11:59, Irina Tirdea wrote:
> Add support for the BMI055 gyroscope sensor. BMI055 is a package
> consisting of an acceleration sensor and a gyroscope. This patch
> adds support for the gyroscope only.
>
> Spec downloaded from:
> http://ae-bst.resource.bosch.com/media/products/dokumente/bmi055/BST-BMI055-DS000-06.pdf
>
> The BMI055 gyroscope uses the same register definition as BMG160,
> but does not specify a temp register. However, the temp register
> seems to be working in the same way as for BMG160, so this patch
> does not remove the temp channel for BMI055.
>
> Signed-off-by: Irina Tirdea <irina.tirdea@xxxxxxxxx>
> Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx>
I would have slightly preferred this as a two patch series. The first
would do the reworked sections of code, and the second actually add the device.
Still it is pretty simple, so I'll let it go

applied to the togreg branch of iio.git - pushed out initially as testing for the
autobuilders to play.

Thanks,

Jonathan
> ---
> drivers/iio/gyro/Kconfig | 2 +-
> drivers/iio/gyro/bmg160.c | 39 +++++++++++++++++++++++++++------------
> 2 files changed, 28 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/iio/gyro/Kconfig b/drivers/iio/gyro/Kconfig
> index d630ae9..b3d0e94 100644
> --- a/drivers/iio/gyro/Kconfig
> +++ b/drivers/iio/gyro/Kconfig
> @@ -56,7 +56,7 @@ config BMG160
> select IIO_TRIGGERED_BUFFER if IIO_BUFFER
> help
> Say yes here to build support for Bosch BMG160 Tri-axis Gyro Sensor
> - driver.
> + driver. This driver also supports BMI055 gyroscope.
>
> This driver can also be built as a module. If so, the module
> will be called bmg160.
> diff --git a/drivers/iio/gyro/bmg160.c b/drivers/iio/gyro/bmg160.c
> index 80f92a6..7524698 100644
> --- a/drivers/iio/gyro/bmg160.c
> +++ b/drivers/iio/gyro/bmg160.c
> @@ -947,10 +947,10 @@ static irqreturn_t bmg160_data_rdy_trig_poll(int irq, void *private)
>
> }
>
> -static int bmg160_acpi_gpio_probe(struct i2c_client *client,
> - struct bmg160_data *data)
> +static int bmg160_gpio_probe(struct i2c_client *client,
> + struct bmg160_data *data)
> +
> {
> - const struct acpi_device_id *id;
> struct device *dev;
> struct gpio_desc *gpio;
> int ret;
> @@ -959,12 +959,6 @@ static int bmg160_acpi_gpio_probe(struct i2c_client *client,
> return -EINVAL;
>
> dev = &client->dev;
> - if (!ACPI_HANDLE(dev))
> - return -ENODEV;
> -
> - id = acpi_match_device(dev->driver->acpi_match_table, dev);
> - if (!id)
> - return -ENODEV;
>
> /* data ready gpio interrupt pin */
> gpio = devm_gpiod_get_index(dev, BMG160_GPIO_NAME, 0);
> @@ -984,12 +978,24 @@ static int bmg160_acpi_gpio_probe(struct i2c_client *client,
> return ret;
> }
>
> +static const char *bmg160_match_acpi_device(struct device *dev)
> +{
> + const struct acpi_device_id *id;
> +
> + id = acpi_match_device(dev->driver->acpi_match_table, dev);
> + if (!id)
> + return NULL;
> +
> + return dev_name(dev);
> +}
> +
> static int bmg160_probe(struct i2c_client *client,
> const struct i2c_device_id *id)
> {
> struct bmg160_data *data;
> struct iio_dev *indio_dev;
> int ret;
> + const char *name = NULL;
>
> indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
> if (!indio_dev)
> @@ -1005,15 +1011,21 @@ static int bmg160_probe(struct i2c_client *client,
>
> mutex_init(&data->mutex);
>
> + if (id)
> + name = id->name;
> +
> + if (ACPI_HANDLE(&client->dev))
> + name = bmg160_match_acpi_device(&client->dev);
> +
> indio_dev->dev.parent = &client->dev;
> indio_dev->channels = bmg160_channels;
> indio_dev->num_channels = ARRAY_SIZE(bmg160_channels);
> - indio_dev->name = BMG160_DRV_NAME;
> + indio_dev->name = name;
> indio_dev->modes = INDIO_DIRECT_MODE;
> indio_dev->info = &bmg160_info;
>
> if (client->irq <= 0)
> - client->irq = bmg160_acpi_gpio_probe(client, data);
> + client->irq = bmg160_gpio_probe(client, data);
>
> if (client->irq > 0) {
> ret = devm_request_threaded_irq(&client->dev,
> @@ -1183,12 +1195,15 @@ static const struct dev_pm_ops bmg160_pm_ops = {
>
> static const struct acpi_device_id bmg160_acpi_match[] = {
> {"BMG0160", 0},
> - { },
> + {"BMI055B", 0},
> + {},
> };
> +
> MODULE_DEVICE_TABLE(acpi, bmg160_acpi_match);
>
> static const struct i2c_device_id bmg160_id[] = {
> {"bmg160", 0},
> + {"bmi055_gyro", 0},
> {}
> };
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/