Hi Jean, > The usual coding style says: no blank line between assignation and > error test. OK, fixed. > > + > > channel &= 0x7; > > > > - return (sample[channel % 4] >> (channel > 3 ? 14 : 2)) & 0x3ff; > > + *res = (sample[channel % 4] >> (channel > 3 ? 14 : 2)) & 0x3ff; > > + > > + return ret; > > This will always be 0, so you might as well make it clearer. ditto. > > } > > > > static ssize_t mc13783_adc_read_bp(struct device *dev, > > struct device_attribute *devattr, char *buf) > > { > > - unsigned res = mc13783_adc_read(dev, devattr); > > + unsigned res; > > + int ret = mc13783_adc_read(dev, devattr, &res); > > Having two variables named "res" and "ret" respectively in the same > scope seems to be a recipe for disaster. I renamed res to val. Thanks for your input. Best regards Uwe ---->8---- >From d9310e1c256d8f40964aee0b85f5b5c4302bcdd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <u.kleine-koenig@xxxxxxxxxxxxxx> Date: Mon, 12 Oct 2009 10:15:00 +0200 Subject: [PATCH] [hwmon] mc13783-adc: handle failure of mc13783_adc_do_conversion ... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If reading the result of a channel fails pass the failure to userspace. res is renamed to val to prevent confusion with the new variable ret. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> --- drivers/hwmon/mc13783-adc.c | 36 +++++++++++++++++++++++++----------- 1 files changed, 25 insertions(+), 11 deletions(-) diff --git a/drivers/hwmon/mc13783-adc.c b/drivers/hwmon/mc13783-adc.c index fafb193..ed0453d 100644 --- a/drivers/hwmon/mc13783-adc.c +++ b/drivers/hwmon/mc13783-adc.c @@ -40,49 +40,63 @@ static ssize_t mc13783_adc_show_name(struct device *dev, struct device_attribute return sprintf(buf, "mc13783_adc\n"); } -static unsigned int mc13783_adc_read(struct device *dev, - struct device_attribute *devattr) +static int mc13783_adc_read(struct device *dev, + struct device_attribute *devattr, unsigned int *val) { struct platform_device *pdev = to_platform_device(dev); struct mc13783_adc_priv *priv = platform_get_drvdata(pdev); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); unsigned int channel = attr->index; unsigned int sample[4]; + int ret; - mc13783_adc_do_conversion(priv->mc13783, MC13783_ADC_MODE_MULT_CHAN, + ret = mc13783_adc_do_conversion(priv->mc13783, + MC13783_ADC_MODE_MULT_CHAN, channel, sample); + if (ret) + return ret; channel &= 0x7; - return (sample[channel % 4] >> (channel > 3 ? 14 : 2)) & 0x3ff; + *val = (sample[channel % 4] >> (channel > 3 ? 14 : 2)) & 0x3ff; + + return 0; } static ssize_t mc13783_adc_read_bp(struct device *dev, struct device_attribute *devattr, char *buf) { - unsigned res = mc13783_adc_read(dev, devattr); + unsigned val; + int ret = mc13783_adc_read(dev, devattr, &val); + + if (ret) + return ret; /* * BP (channel 2) reports with offset 2.4V to the actual value to fit * the input range of the ADC. unit = 2.25mV = 9/4 mV. */ - res = DIV_ROUND_CLOSEST(res * 9, 4) + 2400; + val = DIV_ROUND_CLOSEST(val * 9, 4) + 2400; - return sprintf(buf, "%u\n", res); + return sprintf(buf, "%u\n", val); } static ssize_t mc13783_adc_read_gp(struct device *dev, struct device_attribute *devattr, char *buf) { - unsigned res = mc13783_adc_read(dev, devattr); + unsigned val; + int ret = mc13783_adc_read(dev, devattr, &val); + + if (ret) + return ret; /* - * input range is [0, 2.3V], res has 10 bits, so each bit + * input range is [0, 2.3V], val has 10 bits, so each bit * is worth 9/4 mV. */ - res = DIV_ROUND_CLOSEST(res * 9, 4); + val = DIV_ROUND_CLOSEST(val * 9, 4); - return sprintf(buf, "%u\n", res); + return sprintf(buf, "%u\n", val); } static DEVICE_ATTR(name, S_IRUGO, mc13783_adc_show_name, NULL); -- 1.6.5.2 -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ | _______________________________________________ lm-sensors mailing list lm-sensors@xxxxxxxxxxxxxx http://lists.lm-sensors.org/mailman/listinfo/lm-sensors