From: Jonathan Cameron <jic23@kernel.org>
To: Guenter Roeck <linux@roeck-us.net>
Cc: Mike Looijmans <mike.looijmans@topic.nl>,
linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-iio@vger.kernel.org, jdelvare@suse.com
Subject: Re: [PATCH] hwmon: Add LTC2471/LTC2473 driver
Date: Sat, 1 Jul 2017 10:58:29 +0100 [thread overview]
Message-ID: <20170701105829.1597d426@kernel.org> (raw)
In-Reply-To: <d85cd7a1-a9c2-63c1-1038-f032299c66c9@roeck-us.net>
On Thu, 29 Jun 2017 06:34:22 -0700
Guenter Roeck <linux@roeck-us.net> wrote:
> On 06/29/2017 03:45 AM, Mike Looijmans wrote:
> > The LTC2741 and LTC2473 are single voltage monitoring chips. The LTC2473
> > is similar to the LTC2471 but outputs a signed differential value.
> >
> > Datasheet:
> > http://cds.linear.com/docs/en/datasheet/24713fb.pdf
> >
> > Signed-off-by: Mike Looijmans <mike.looijmans@topic.nl>
>
> Hi Mike,
>
> that looks like a perfect candidate for an iio driver, since its use is
> not limited to hardware monitoring, it has a high sample rate, and it
> doesn't have limit registers or actions.
>
> Jonathan, what do you think ?
Late response given I just applied the IIO driver ;)
Yes, fine for IIO. Whilst they list hwmon as one of the possible
uses they list a whole load of others as well so IIO probably
makes more sense for this one.
Thanks,
Jonathan
>
> Thanks,
> Guenter
>
> > ---
> > drivers/hwmon/Kconfig | 10 ++++
> > drivers/hwmon/Makefile | 1 +
> > drivers/hwmon/ltc2471.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++
> > 3 files changed, 138 insertions(+)
> > create mode 100644 drivers/hwmon/ltc2471.c
> >
> > diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> > index fbde226..c9a2a87 100644
> > --- a/drivers/hwmon/Kconfig
> > +++ b/drivers/hwmon/Kconfig
> > @@ -673,6 +673,16 @@ config SENSORS_LINEAGE
> > This driver can also be built as a module. If so, the module
> > will be called lineage-pem.
> >
> > +config SENSORS_LTC2471
> > + tristate "Linear Technology LTC2471 and LTC2473"
> > + depends on I2C
> > + help
> > + If you say yes here you get support for Linear Technology LTC2471
> > + and LTC2473 voltage monitors.
> > +
> > + This driver can also be built as a module. If so, the module will
> > + be called ltc2471.
> > +
> > config SENSORS_LTC2945
> > tristate "Linear Technology LTC2945"
> > depends on I2C
> > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
> > index 58cc3ac..6f60fe7 100644
> > --- a/drivers/hwmon/Makefile
> > +++ b/drivers/hwmon/Makefile
> > @@ -99,6 +99,7 @@ obj-$(CONFIG_SENSORS_LM93) += lm93.o
> > obj-$(CONFIG_SENSORS_LM95234) += lm95234.o
> > obj-$(CONFIG_SENSORS_LM95241) += lm95241.o
> > obj-$(CONFIG_SENSORS_LM95245) += lm95245.o
> > +obj-$(CONFIG_SENSORS_LTC2471) += ltc2471.o
> > obj-$(CONFIG_SENSORS_LTC2945) += ltc2945.o
> > obj-$(CONFIG_SENSORS_LTC2990) += ltc2990.o
> > obj-$(CONFIG_SENSORS_LTC4151) += ltc4151.o
> > diff --git a/drivers/hwmon/ltc2471.c b/drivers/hwmon/ltc2471.c
> > new file mode 100644
> > index 0000000..17eaad8
> > --- /dev/null
> > +++ b/drivers/hwmon/ltc2471.c
> > @@ -0,0 +1,127 @@
> > +/*
> > + * Driver for Linear Technology LTC2471 and LTC2473 voltage monitors
> > + * The LTC2473 is identical to the 2471, but reports a differential signal.
> > + *
> > + * Copyright (C) 2017 Topic Embedded Products
> > + * Author: Mike Looijmans <mike.looijmans@topic.nl>
> > + *
> > + * License: GPLv2
> > + */
> > +
> > +#include <linux/err.h>
> > +#include <linux/hwmon.h>
> > +#include <linux/hwmon-sysfs.h>
> > +#include <linux/i2c.h>
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> > +
> > +enum chips {
> > + ltc2471,
> > + ltc2473
> > +};
> > +
> > +struct ltc2471_data {
> > + struct i2c_client *i2c;
> > + bool differential;
> > +};
> > +
> > +/* Reference voltage is 1.25V */
> > +#define LTC2471_VREF 1250
> > +
> > +/* Read two bytes from the I2C bus to obtain the ADC result */
> > +static int ltc2471_get_value(struct i2c_client *i2c)
> > +{
> > + int ret;
> > + __be16 buf;
> > +
> > + ret = i2c_master_recv(i2c, (char *)&buf, 2);
> > + if (ret < 0)
> > + return ret;
> > + if (ret != 2)
> > + return -EIO;
> > +
> > + /* MSB first */
> > + return be16_to_cpu(buf);
> > +}
> > +
> > +static ssize_t ltc2471_show_value(struct device *dev,
> > + struct device_attribute *da, char *buf)
> > +{
> > + struct ltc2471_data *data = dev_get_drvdata(dev);
> > + int value;
> > +
> > + value = ltc2471_get_value(data->i2c);
> > + if (unlikely(value < 0))
> > + return value;
> > +
> > + if (data->differential)
> > + /* Ranges from -VREF to +VREF with "0" at 0x8000 */
> > + value = ((s32)LTC2471_VREF * (s32)(value - 0x8000)) >> 15;
> > + else
> > + /* Ranges from 0 to +VREF */
> > + value = ((u32)LTC2471_VREF * (u32)value) >> 16;
> > +
> > + return snprintf(buf, PAGE_SIZE, "%d\n", value);
> > +}
> > +
> > +static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, ltc2471_show_value, NULL, 0);
> > +
> > +static struct attribute *ltc2471_attrs[] = {
> > + &sensor_dev_attr_in0_input.dev_attr.attr,
> > + NULL
> > +};
> > +
> > +ATTRIBUTE_GROUPS(ltc2471);
> > +
> > +static int ltc2471_i2c_probe(struct i2c_client *i2c,
> > + const struct i2c_device_id *id)
> > +{
> > + int ret;
> > + struct device *hwmon_dev;
> > + struct ltc2471_data *data;
> > +
> > + if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C))
> > + return -ENODEV;
> > +
> > + data = devm_kzalloc(&i2c->dev, sizeof(struct ltc2471_data), GFP_KERNEL);
> > + if (unlikely(!data))
> > + return -ENOMEM;
> > +
> > + data->i2c = i2c;
> > + data->differential = (id->driver_data == ltc2473);
> > +
> > + /* Trigger once to start conversion and check if chip is there */
> > + ret = ltc2471_get_value(i2c);
> > + if (ret < 0) {
> > + dev_err(&i2c->dev, "Cannot read from device.\n");
> > + return ret;
> > + }
> > +
> > + hwmon_dev = devm_hwmon_device_register_with_groups(&i2c->dev,
> > + i2c->name,
> > + data,
> > + ltc2471_groups);
> > +
> > + return PTR_ERR_OR_ZERO(hwmon_dev);
> > +}
> > +
> > +static const struct i2c_device_id ltc2471_i2c_id[] = {
> > + { "ltc2471", ltc2471 },
> > + { "ltc2473", ltc2473 },
> > + {}
> > +};
> > +MODULE_DEVICE_TABLE(i2c, ltc2471_i2c_id);
> > +
> > +static struct i2c_driver ltc2471_i2c_driver = {
> > + .driver = {
> > + .name = "ltc2471",
> > + },
> > + .probe = ltc2471_i2c_probe,
> > + .id_table = ltc2471_i2c_id,
> > +};
> > +
> > +module_i2c_driver(ltc2471_i2c_driver);
> > +
> > +MODULE_DESCRIPTION("LTC2471/LTC2473 Sensor Driver");
> > +MODULE_AUTHOR("Topic Embedded Products");
> > +MODULE_LICENSE("GPL v2");
> >
>
prev parent reply other threads:[~2017-07-01 9:58 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-29 10:45 [PATCH] hwmon: Add LTC2471/LTC2473 driver Mike Looijmans
2017-06-29 11:18 ` Frans Klaver
2017-06-29 11:30 ` Mike Looijmans
2017-06-29 11:38 ` Frans Klaver
2017-06-29 12:08 ` Mike Looijmans
2017-06-29 13:37 ` Guenter Roeck
2017-06-29 12:13 ` [PATCH v2] " Mike Looijmans
2017-06-29 12:30 ` Lars-Peter Clausen
2017-06-29 13:22 ` Mike Looijmans
2017-06-29 13:41 ` Guenter Roeck
2017-06-29 13:40 ` Guenter Roeck
2017-06-29 14:11 ` Mike Looijmans
2017-06-29 15:08 ` Guenter Roeck
2017-06-29 15:30 ` Lars-Peter Clausen
2017-06-29 13:34 ` [PATCH] " Guenter Roeck
2017-07-01 9:58 ` Jonathan Cameron [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170701105829.1597d426@kernel.org \
--to=jic23@kernel.org \
--cc=jdelvare@suse.com \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=mike.looijmans@topic.nl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox