> 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 <ak@xxxxxxxxxxxxx> > --- > 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 <ak@xxxxxxxxxxxxx> > + * Copyright (c) 2016, 2017 Andreas Klinger <ak@xxxxxxxxxxxxx> > * > * 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 <ak@xxxxxxxxxxxxx>"); > -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