> srf02 added with support for i2c interface
> 
> Attributes for setting max range or sensitivity are omitted for the case of
> srf02 type sensor, because they are not supported by the hardware.

comments below
 
> Signed-off-by: Andreas Klinger <a...@it-klinger.de>
> ---
>  drivers/iio/proximity/Kconfig |  8 ++---
>  drivers/iio/proximity/srf08.c | 77 
> ++++++++++++++++++++++++++++++++-----------
>  2 files changed, 62 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/iio/proximity/Kconfig b/drivers/iio/proximity/Kconfig
> index df33ccc0d035..ae070950f920 100644
> --- a/drivers/iio/proximity/Kconfig
> +++ b/drivers/iio/proximity/Kconfig
> @@ -57,12 +57,12 @@ config SX9500
>         module will be called sx9500.
>  
>  config SRF08
> -     tristate "Devantech SRF08/SRF10 ultrasonic ranger sensor"
> +     tristate "Devantech SRF02/SRF08/SRF10 ultrasonic ranger sensor"
>       depends on I2C
>       help
> -       Say Y here to build a driver for Devantech SRF08/SRF10 ultrasonic
> -       ranger sensor. This driver can be used to measure the distance
> -       of objects.
> +       Say Y here to build a driver for Devantech SRF02/SRF08/SRF10
> +       ultrasonic ranger sensors with i2c interface.
> +       This driver can be used to measure the distance of objects.
>  
>         To compile this driver as a module, choose M here: the
>         module will be called srf08.
> diff --git a/drivers/iio/proximity/srf08.c b/drivers/iio/proximity/srf08.c
> index 52573b013313..6ccf8f9fd703 100644
> --- a/drivers/iio/proximity/srf08.c
> +++ b/drivers/iio/proximity/srf08.c
> @@ -1,15 +1,17 @@
>  /*
> - * srf08.c - Support for Devantech SRF08 ultrasonic ranger
> + * srf08.c - Support for Devantech SRF02/SRF08/SRF10 ultrasonic ranger
> + *           with I2C-Interface
>   *
> - * Copyright (c) 2016 Andreas Klinger <a...@it-klinger.de>
> + * Copyright (c) 2016, 2017 Andreas Klinger <a...@it-klinger.de>
>   *
>   * This file is subject to the terms and conditions of version 2 of
> - * the GNU General Public License.  See the file COPYING in the main
> + * the GNU General Public License. See the file COPYING in the main
>   * directory of this archive for more details.
>   *
>   * For details about the device see:
>   * http://www.robot-electronics.co.uk/htm/srf08tech.html
>   * http://www.robot-electronics.co.uk/htm/srf10tech.htm
> + * http://www.robot-electronics.co.uk/htm/srf02tech.htm
>   */
>  
>  #include <linux/err.h>
> @@ -34,11 +36,10 @@
>  
>  #define SRF08_CMD_RANGING_CM 0x51    /* Ranging Mode - Result in cm */
>  
> -#define SRF08_DEFAULT_RANGE  6020    /* default value of Range in mm */
> -
>  #define SRF08_MAX_SENSITIVITY        32      /* number of Gain Register 
> values */
>  
>  enum srf08_sensor_type {
> +     SRF02,
>       SRF08,
>       SRF10,
>       SRF_MAX_TYPE
> @@ -75,6 +76,8 @@ struct srf08_data {
>   * is called "Sensitivity" here.
>   */
>  static const int srf08_sensitivity[SRF_MAX_TYPE][SRF08_MAX_SENSITIVITY] = {
> +     [SRF02] = {
> +     },
>       [SRF08] = {
>        94,  97, 100, 103, 107, 110, 114, 118,
>       123, 128, 133, 139, 145, 152, 159, 168,
> @@ -93,6 +96,11 @@ static const int srf08_default_sensitivity[SRF_MAX_TYPE] = 
> {
>       [SRF10] = 700,
>  };
>  
> +static const int srf08_default_range[SRF_MAX_TYPE] = {

the information regarding range unit (mm) is lost, maybe add a comment?

> +     [SRF08] = 6020,
> +     [SRF10] = 6020,
> +};
> +
>  static int srf08_read_ranging(struct srf08_data *data)
>  {
>       struct i2c_client *client = data->client;
> @@ -409,6 +417,15 @@ static const struct iio_info srf08_info = {
>       .driver_module = THIS_MODULE,
>  };
>  
> +/*
> + * srf02 don't have an adjustable range or sensitivity,
> + * so we don't need attributes at all
> + */
> +static const struct iio_info srf02_info = {
> +     .read_raw = srf08_read_raw,
> +     .driver_module = THIS_MODULE,
> +};
> +
>  static int srf08_probe(struct i2c_client *client,
>                                        const struct i2c_device_id *id)
>  {
> @@ -434,7 +451,13 @@ static int srf08_probe(struct i2c_client *client,
>       indio_dev->name = id->name;
>       indio_dev->dev.parent = &client->dev;
>       indio_dev->modes = INDIO_DIRECT_MODE;
> -     indio_dev->info = &srf08_info;
> +
> +     /* srf02 is not using sensitivity nor max_range */
> +     if (id->driver_data == SRF02)
> +             indio_dev->info = &srf02_info;
> +     else
> +             indio_dev->info = &srf08_info;
> +
>       indio_dev->channels = srf08_channels;
>       indio_dev->num_channels = ARRAY_SIZE(srf08_channels);
>  
> @@ -447,24 +470,39 @@ static int srf08_probe(struct i2c_client *client,
>               return ret;
>       }
>  
> -     /*
> -      * set default values of device here
> -      * these register values cannot be read from the hardware
> -      * therefore set driver specific default values
> -      */
> -     ret = srf08_write_range_mm(data, SRF08_DEFAULT_RANGE);
> -     if (ret < 0)
> -             return ret;
> +     if (srf08_default_range[id->driver_data]) {


it would be nice to have a chip_info struct with chip-specific 
information, so we can point to the relevant struct once instead of 
picking the correct entry from srf08_default_sensitivity and 
srf08_default_range separately

so far, we have only two defaults tables... no big deal

> +             /*
> +              * set default range of device here
> +              * these register values cannot be read from he hardware
> +              * therefore set driver specific default values
> +              *
> +              * srf02 don't have a default value so it'll be omitted
> +              */
> +             ret = srf08_write_range_mm(data,
> +                                     srf08_default_range[id->driver_data]);
> +             if (ret < 0)
> +                     return ret;
> +     }
>  
> -     ret = srf08_write_sensitivity(data,
> -                     srf08_default_sensitivity[id->driver_data]);
> -     if (ret < 0)
> -             return ret;
> +     if (srf08_default_sensitivity[id->driver_data]) {
> +             /*
> +              * set default sensitivity of device here
> +              * these register values cannot be read from the hardware
> +              * therefore set driver specific default values
> +              *
> +              * srf02 don't have a default value so it'll be omitted
> +              */
> +             ret = srf08_write_sensitivity(data,
> +                             srf08_default_sensitivity[id->driver_data]);
> +             if (ret < 0)
> +                     return ret;
> +     }
>  
>       return devm_iio_device_register(&client->dev, indio_dev);
>  }
>  
>  static const struct of_device_id of_srf08_match[] = {
> +     { .compatible = "devantech,srf02", (void *)SRF02},
>       { .compatible = "devantech,srf08", (void *)SRF08},
>       { .compatible = "devantech,srf10", (void *)SRF10},
>       {},
> @@ -473,6 +511,7 @@ static const struct of_device_id of_srf08_match[] = {
>  MODULE_DEVICE_TABLE(of, of_srf08_match);
>  
>  static const struct i2c_device_id srf08_id[] = {
> +     { "srf02", SRF02 },
>       { "srf08", SRF08 },
>       { "srf10", SRF10 },
>       { }
> @@ -490,5 +529,5 @@ static struct i2c_driver srf08_driver = {
>  module_i2c_driver(srf08_driver);
>  
>  MODULE_AUTHOR("Andreas Klinger <a...@it-klinger.de>");
> -MODULE_DESCRIPTION("Devantech SRF08/SRF10 ultrasonic ranger driver");
> +MODULE_DESCRIPTION("Devantech SRF02/SRF08/SRF10 i2c ultrasonic ranger 
> driver");
>  MODULE_LICENSE("GPL");
> 

-- 

Peter Meerwald-Stadler
Mobile: +43 664 24 44 418

Reply via email to