From: Wei Ni <wni-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
To: Wei Ni <wni-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Cc: "khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org"
<khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>,
"linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org"
<linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>,
"lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org"
<lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org>,
"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
"linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH RESEND v4] hwmon: (lm90) split set&show temp as common codes
Date: Mon, 9 Sep 2013 14:15:15 +0800 [thread overview]
Message-ID: <522D6773.2090608@nvidia.com> (raw)
In-Reply-To: <5200D354.2080102-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Hi, Jean
Do you have any more suggestions on this patch ?
Thanks.
Wei.
On 08/06/2013 06:43 PM, Wei Ni wrote:
> This patch is separated from my previous v3 series, which is in
> http://www.mail-archive.com/linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org/msg466772.html
>
> Changes from v3:
> 1. Add error handler for lm90_select_remote_channel(), set_temp8(), and
> set_temp11().
>
> Wei.
>
> On 08/06/2013 06:36 PM, Wei Ni wrote:
>> Split set&show temp codes as common functions, so we can use it
>> directly when implement linux thermal framework.
>> And handle error return value for the lm90_select_remote_channel
>> and write_tempx, then set_temp8 and set_temp11 could return it
>> to user-space.
>>
>> Signed-off-by: Wei Ni <wni-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
>> ---
>> drivers/hwmon/lm90.c | 150 +++++++++++++++++++++++++++++++++-----------------
>> 1 file changed, 99 insertions(+), 51 deletions(-)
>>
>> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>> index cdff742..6de8e01 100644
>> --- a/drivers/hwmon/lm90.c
>> +++ b/drivers/hwmon/lm90.c
>> @@ -422,20 +422,29 @@ static int lm90_read16(struct i2c_client *client, u8 regh, u8 regl, u16 *value)
>> * various registers have different meanings as a result of selecting a
>> * non-default remote channel.
>> */
>> -static inline void lm90_select_remote_channel(struct i2c_client *client,
>> +static inline int lm90_select_remote_channel(struct i2c_client *client,
>> struct lm90_data *data,
>> int channel)
>> {
>> u8 config;
>> + int err = 0;
>>
>> if (data->kind == max6696) {
>> lm90_read_reg(client, LM90_REG_R_CONFIG1, &config);
>> config &= ~0x08;
>> if (channel)
>> config |= 0x08;
>> - i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
>> - config);
>> + err = i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
>> + config);
>> + if (err < 0) {
>> + dev_err(&client->dev,
>> + "Failed to select remote channel %d, err %d\n",
>> + channel, err);
>> + return err;
>> + }
>> }
>> +
>> + return err;
>> }
>>
>> /*
>> @@ -702,29 +711,34 @@ static u16 temp_to_u16_adt7461(struct lm90_data *data, long val)
>> * Sysfs stuff
>> */
>>
>> -static ssize_t show_temp8(struct device *dev, struct device_attribute *devattr,
>> - char *buf)
>> +static int read_temp8(struct device *dev, int index)
>> {
>> - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> struct lm90_data *data = lm90_update_device(dev);
>> int temp;
>>
>> if (data->kind == adt7461)
>> - temp = temp_from_u8_adt7461(data, data->temp8[attr->index]);
>> + temp = temp_from_u8_adt7461(data, data->temp8[index]);
>> else if (data->kind == max6646)
>> - temp = temp_from_u8(data->temp8[attr->index]);
>> + temp = temp_from_u8(data->temp8[index]);
>> else
>> - temp = temp_from_s8(data->temp8[attr->index]);
>> + temp = temp_from_s8(data->temp8[index]);
>>
>> /* +16 degrees offset for temp2 for the LM99 */
>> - if (data->kind == lm99 && attr->index == 3)
>> + if (data->kind == lm99 && index == 3)
>> temp += 16000;
>>
>> - return sprintf(buf, "%d\n", temp);
>> + return temp;
>> }
>>
>> -static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
>> - const char *buf, size_t count)
>> +static ssize_t show_temp8(struct device *dev, struct device_attribute *devattr,
>> + char *buf)
>> +{
>> + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> +
>> + return sprintf(buf, "%d\n", read_temp8(dev, attr->index));
>> +}
>> +
>> +static int write_temp8(struct device *dev, int index, long val)
>> {
>> static const u8 reg[8] = {
>> LM90_REG_W_LOCAL_LOW,
>> @@ -737,60 +751,79 @@ static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
>> MAX6659_REG_W_REMOTE_EMERG,
>> };
>>
>> - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> struct i2c_client *client = to_i2c_client(dev);
>> struct lm90_data *data = i2c_get_clientdata(client);
>> - int nr = attr->index;
>> - long val;
>> int err;
>>
>> - err = kstrtol(buf, 10, &val);
>> - if (err < 0)
>> - return err;
>> -
>> /* +16 degrees offset for temp2 for the LM99 */
>> - if (data->kind == lm99 && attr->index == 3)
>> + if (data->kind == lm99 && index == 3)
>> val -= 16000;
>>
>> mutex_lock(&data->update_lock);
>> if (data->kind == adt7461)
>> - data->temp8[nr] = temp_to_u8_adt7461(data, val);
>> + data->temp8[index] = temp_to_u8_adt7461(data, val);
>> else if (data->kind == max6646)
>> - data->temp8[nr] = temp_to_u8(val);
>> + data->temp8[index] = temp_to_u8(val);
>> else
>> - data->temp8[nr] = temp_to_s8(val);
>> -
>> - lm90_select_remote_channel(client, data, nr >= 6);
>> - i2c_smbus_write_byte_data(client, reg[nr], data->temp8[nr]);
>> - lm90_select_remote_channel(client, data, 0);
>> + data->temp8[index] = temp_to_s8(val);
>>
>> + err = lm90_select_remote_channel(client, data, index >= 6);
>> + err |= i2c_smbus_write_byte_data(client, reg[index], data->temp8[index]);
>> + err |= lm90_select_remote_channel(client, data, 0);
>> + if (err)
>> + dev_err(dev, "write_temp8 failed!\n");
>> mutex_unlock(&data->update_lock);
>> +
>> + return err;
>> +}
>> +
>> +static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
>> + const char *buf, size_t count)
>> +{
>> + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> + int index = attr->index;
>> + long val;
>> + int err;
>> +
>> + err = kstrtol(buf, 10, &val);
>> + if (err < 0)
>> + return err;
>> +
>> + err = write_temp8(dev, index, val);
>> + if (err < 0)
>> + return err;
>> +
>> return count;
>> }
>>
>> -static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
>> - char *buf)
>> +static int read_temp11(struct device *dev, int index)
>> {
>> - struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> struct lm90_data *data = lm90_update_device(dev);
>> int temp;
>>
>> if (data->kind == adt7461)
>> - temp = temp_from_u16_adt7461(data, data->temp11[attr->index]);
>> + temp = temp_from_u16_adt7461(data, data->temp11[index]);
>> else if (data->kind == max6646)
>> - temp = temp_from_u16(data->temp11[attr->index]);
>> + temp = temp_from_u16(data->temp11[index]);
>> else
>> - temp = temp_from_s16(data->temp11[attr->index]);
>> + temp = temp_from_s16(data->temp11[index]);
>>
>> /* +16 degrees offset for temp2 for the LM99 */
>> - if (data->kind == lm99 && attr->index <= 2)
>> + if (data->kind == lm99 && index <= 2)
>> temp += 16000;
>>
>> - return sprintf(buf, "%d\n", temp);
>> + return temp;
>> }
>>
>> -static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> - const char *buf, size_t count)
>> +static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
>> + char *buf)
>> +{
>> + struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> +
>> + return sprintf(buf, "%d\n", read_temp11(dev, attr->index));
>> +}
>> +
>> +static int write_temp11(struct device *dev, int nr, int index, long val)
>> {
>> struct {
>> u8 high;
>> @@ -804,18 +837,10 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> { LM90_REG_W_REMOTE_HIGHH, LM90_REG_W_REMOTE_HIGHL, 1 }
>> };
>>
>> - struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> struct i2c_client *client = to_i2c_client(dev);
>> struct lm90_data *data = i2c_get_clientdata(client);
>> - int nr = attr->nr;
>> - int index = attr->index;
>> - long val;
>> int err;
>>
>> - err = kstrtol(buf, 10, &val);
>> - if (err < 0)
>> - return err;
>> -
>> /* +16 degrees offset for temp2 for the LM99 */
>> if (data->kind == lm99 && index <= 2)
>> val -= 16000;
>> @@ -830,15 +855,38 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> else
>> data->temp11[index] = temp_to_s8(val) << 8;
>>
>> - lm90_select_remote_channel(client, data, reg[nr].channel);
>> - i2c_smbus_write_byte_data(client, reg[nr].high,
>> + err = lm90_select_remote_channel(client, data, reg[nr].channel);
>> + err |= i2c_smbus_write_byte_data(client, reg[nr].high,
>> data->temp11[index] >> 8);
>> if (data->flags & LM90_HAVE_REM_LIMIT_EXT)
>> - i2c_smbus_write_byte_data(client, reg[nr].low,
>> - data->temp11[index] & 0xff);
>> - lm90_select_remote_channel(client, data, 0);
>> + err |= i2c_smbus_write_byte_data(client, reg[nr].low,
>> + data->temp11[index] & 0xff);
>> + err |= lm90_select_remote_channel(client, data, 0);
>> + if (err)
>> + dev_err(dev, "write_temp11 failed !\n");
>>
>> mutex_unlock(&data->update_lock);
>> +
>> + return err;
>> +}
>> +
>> +static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> + const char *buf, size_t count)
>> +{
>> + struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> + int nr = attr->nr;
>> + int index = attr->index;
>> + long val;
>> + int err;
>> +
>> + err = kstrtol(buf, 10, &val);
>> + if (err < 0)
>> + return err;
>> +
>> + err = write_temp11(dev, nr, index, val);
>> + if (err < 0)
>> + return err;
>> +
>> return count;
>> }
>>
>>
>
WARNING: multiple messages have this Message-ID (diff)
From: Wei Ni <wni@nvidia.com>
To: Wei Ni <wni-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Cc: "khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org"
<khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>,
"linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org"
<linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>,
"lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org"
<lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org>,
"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
"linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [lm-sensors] [PATCH RESEND v4] hwmon: (lm90) split set&show temp as common codes
Date: Mon, 09 Sep 2013 06:15:15 +0000 [thread overview]
Message-ID: <522D6773.2090608@nvidia.com> (raw)
In-Reply-To: <5200D354.2080102-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Hi, Jean
Do you have any more suggestions on this patch ?
Thanks.
Wei.
On 08/06/2013 06:43 PM, Wei Ni wrote:
> This patch is separated from my previous v3 series, which is in
> http://www.mail-archive.com/linux-kernel@vger.kernel.org/msg466772.html
>
> Changes from v3:
> 1. Add error handler for lm90_select_remote_channel(), set_temp8(), and
> set_temp11().
>
> Wei.
>
> On 08/06/2013 06:36 PM, Wei Ni wrote:
>> Split set&show temp codes as common functions, so we can use it
>> directly when implement linux thermal framework.
>> And handle error return value for the lm90_select_remote_channel
>> and write_tempx, then set_temp8 and set_temp11 could return it
>> to user-space.
>>
>> Signed-off-by: Wei Ni <wni@nvidia.com>
>> ---
>> drivers/hwmon/lm90.c | 150 +++++++++++++++++++++++++++++++++-----------------
>> 1 file changed, 99 insertions(+), 51 deletions(-)
>>
>> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>> index cdff742..6de8e01 100644
>> --- a/drivers/hwmon/lm90.c
>> +++ b/drivers/hwmon/lm90.c
>> @@ -422,20 +422,29 @@ static int lm90_read16(struct i2c_client *client, u8 regh, u8 regl, u16 *value)
>> * various registers have different meanings as a result of selecting a
>> * non-default remote channel.
>> */
>> -static inline void lm90_select_remote_channel(struct i2c_client *client,
>> +static inline int lm90_select_remote_channel(struct i2c_client *client,
>> struct lm90_data *data,
>> int channel)
>> {
>> u8 config;
>> + int err = 0;
>>
>> if (data->kind = max6696) {
>> lm90_read_reg(client, LM90_REG_R_CONFIG1, &config);
>> config &= ~0x08;
>> if (channel)
>> config |= 0x08;
>> - i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
>> - config);
>> + err = i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
>> + config);
>> + if (err < 0) {
>> + dev_err(&client->dev,
>> + "Failed to select remote channel %d, err %d\n",
>> + channel, err);
>> + return err;
>> + }
>> }
>> +
>> + return err;
>> }
>>
>> /*
>> @@ -702,29 +711,34 @@ static u16 temp_to_u16_adt7461(struct lm90_data *data, long val)
>> * Sysfs stuff
>> */
>>
>> -static ssize_t show_temp8(struct device *dev, struct device_attribute *devattr,
>> - char *buf)
>> +static int read_temp8(struct device *dev, int index)
>> {
>> - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> struct lm90_data *data = lm90_update_device(dev);
>> int temp;
>>
>> if (data->kind = adt7461)
>> - temp = temp_from_u8_adt7461(data, data->temp8[attr->index]);
>> + temp = temp_from_u8_adt7461(data, data->temp8[index]);
>> else if (data->kind = max6646)
>> - temp = temp_from_u8(data->temp8[attr->index]);
>> + temp = temp_from_u8(data->temp8[index]);
>> else
>> - temp = temp_from_s8(data->temp8[attr->index]);
>> + temp = temp_from_s8(data->temp8[index]);
>>
>> /* +16 degrees offset for temp2 for the LM99 */
>> - if (data->kind = lm99 && attr->index = 3)
>> + if (data->kind = lm99 && index = 3)
>> temp += 16000;
>>
>> - return sprintf(buf, "%d\n", temp);
>> + return temp;
>> }
>>
>> -static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
>> - const char *buf, size_t count)
>> +static ssize_t show_temp8(struct device *dev, struct device_attribute *devattr,
>> + char *buf)
>> +{
>> + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> +
>> + return sprintf(buf, "%d\n", read_temp8(dev, attr->index));
>> +}
>> +
>> +static int write_temp8(struct device *dev, int index, long val)
>> {
>> static const u8 reg[8] = {
>> LM90_REG_W_LOCAL_LOW,
>> @@ -737,60 +751,79 @@ static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
>> MAX6659_REG_W_REMOTE_EMERG,
>> };
>>
>> - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> struct i2c_client *client = to_i2c_client(dev);
>> struct lm90_data *data = i2c_get_clientdata(client);
>> - int nr = attr->index;
>> - long val;
>> int err;
>>
>> - err = kstrtol(buf, 10, &val);
>> - if (err < 0)
>> - return err;
>> -
>> /* +16 degrees offset for temp2 for the LM99 */
>> - if (data->kind = lm99 && attr->index = 3)
>> + if (data->kind = lm99 && index = 3)
>> val -= 16000;
>>
>> mutex_lock(&data->update_lock);
>> if (data->kind = adt7461)
>> - data->temp8[nr] = temp_to_u8_adt7461(data, val);
>> + data->temp8[index] = temp_to_u8_adt7461(data, val);
>> else if (data->kind = max6646)
>> - data->temp8[nr] = temp_to_u8(val);
>> + data->temp8[index] = temp_to_u8(val);
>> else
>> - data->temp8[nr] = temp_to_s8(val);
>> -
>> - lm90_select_remote_channel(client, data, nr >= 6);
>> - i2c_smbus_write_byte_data(client, reg[nr], data->temp8[nr]);
>> - lm90_select_remote_channel(client, data, 0);
>> + data->temp8[index] = temp_to_s8(val);
>>
>> + err = lm90_select_remote_channel(client, data, index >= 6);
>> + err |= i2c_smbus_write_byte_data(client, reg[index], data->temp8[index]);
>> + err |= lm90_select_remote_channel(client, data, 0);
>> + if (err)
>> + dev_err(dev, "write_temp8 failed!\n");
>> mutex_unlock(&data->update_lock);
>> +
>> + return err;
>> +}
>> +
>> +static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
>> + const char *buf, size_t count)
>> +{
>> + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> + int index = attr->index;
>> + long val;
>> + int err;
>> +
>> + err = kstrtol(buf, 10, &val);
>> + if (err < 0)
>> + return err;
>> +
>> + err = write_temp8(dev, index, val);
>> + if (err < 0)
>> + return err;
>> +
>> return count;
>> }
>>
>> -static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
>> - char *buf)
>> +static int read_temp11(struct device *dev, int index)
>> {
>> - struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> struct lm90_data *data = lm90_update_device(dev);
>> int temp;
>>
>> if (data->kind = adt7461)
>> - temp = temp_from_u16_adt7461(data, data->temp11[attr->index]);
>> + temp = temp_from_u16_adt7461(data, data->temp11[index]);
>> else if (data->kind = max6646)
>> - temp = temp_from_u16(data->temp11[attr->index]);
>> + temp = temp_from_u16(data->temp11[index]);
>> else
>> - temp = temp_from_s16(data->temp11[attr->index]);
>> + temp = temp_from_s16(data->temp11[index]);
>>
>> /* +16 degrees offset for temp2 for the LM99 */
>> - if (data->kind = lm99 && attr->index <= 2)
>> + if (data->kind = lm99 && index <= 2)
>> temp += 16000;
>>
>> - return sprintf(buf, "%d\n", temp);
>> + return temp;
>> }
>>
>> -static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> - const char *buf, size_t count)
>> +static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
>> + char *buf)
>> +{
>> + struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> +
>> + return sprintf(buf, "%d\n", read_temp11(dev, attr->index));
>> +}
>> +
>> +static int write_temp11(struct device *dev, int nr, int index, long val)
>> {
>> struct {
>> u8 high;
>> @@ -804,18 +837,10 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> { LM90_REG_W_REMOTE_HIGHH, LM90_REG_W_REMOTE_HIGHL, 1 }
>> };
>>
>> - struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> struct i2c_client *client = to_i2c_client(dev);
>> struct lm90_data *data = i2c_get_clientdata(client);
>> - int nr = attr->nr;
>> - int index = attr->index;
>> - long val;
>> int err;
>>
>> - err = kstrtol(buf, 10, &val);
>> - if (err < 0)
>> - return err;
>> -
>> /* +16 degrees offset for temp2 for the LM99 */
>> if (data->kind = lm99 && index <= 2)
>> val -= 16000;
>> @@ -830,15 +855,38 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> else
>> data->temp11[index] = temp_to_s8(val) << 8;
>>
>> - lm90_select_remote_channel(client, data, reg[nr].channel);
>> - i2c_smbus_write_byte_data(client, reg[nr].high,
>> + err = lm90_select_remote_channel(client, data, reg[nr].channel);
>> + err |= i2c_smbus_write_byte_data(client, reg[nr].high,
>> data->temp11[index] >> 8);
>> if (data->flags & LM90_HAVE_REM_LIMIT_EXT)
>> - i2c_smbus_write_byte_data(client, reg[nr].low,
>> - data->temp11[index] & 0xff);
>> - lm90_select_remote_channel(client, data, 0);
>> + err |= i2c_smbus_write_byte_data(client, reg[nr].low,
>> + data->temp11[index] & 0xff);
>> + err |= lm90_select_remote_channel(client, data, 0);
>> + if (err)
>> + dev_err(dev, "write_temp11 failed !\n");
>>
>> mutex_unlock(&data->update_lock);
>> +
>> + return err;
>> +}
>> +
>> +static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> + const char *buf, size_t count)
>> +{
>> + struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> + int nr = attr->nr;
>> + int index = attr->index;
>> + long val;
>> + int err;
>> +
>> + err = kstrtol(buf, 10, &val);
>> + if (err < 0)
>> + return err;
>> +
>> + err = write_temp11(dev, nr, index, val);
>> + if (err < 0)
>> + return err;
>> +
>> return count;
>> }
>>
>>
>
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
WARNING: multiple messages have this Message-ID (diff)
From: Wei Ni <wni@nvidia.com>
To: Wei Ni <wni@nvidia.com>
Cc: "khali@linux-fr.org" <khali@linux-fr.org>,
"linux@roeck-us.net" <linux@roeck-us.net>,
"lm-sensors@lm-sensors.org" <lm-sensors@lm-sensors.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-tegra@vger.kernel.org" <linux-tegra@vger.kernel.org>
Subject: Re: [PATCH RESEND v4] hwmon: (lm90) split set&show temp as common codes
Date: Mon, 9 Sep 2013 14:15:15 +0800 [thread overview]
Message-ID: <522D6773.2090608@nvidia.com> (raw)
In-Reply-To: <5200D354.2080102@nvidia.com>
Hi, Jean
Do you have any more suggestions on this patch ?
Thanks.
Wei.
On 08/06/2013 06:43 PM, Wei Ni wrote:
> This patch is separated from my previous v3 series, which is in
> http://www.mail-archive.com/linux-kernel@vger.kernel.org/msg466772.html
>
> Changes from v3:
> 1. Add error handler for lm90_select_remote_channel(), set_temp8(), and
> set_temp11().
>
> Wei.
>
> On 08/06/2013 06:36 PM, Wei Ni wrote:
>> Split set&show temp codes as common functions, so we can use it
>> directly when implement linux thermal framework.
>> And handle error return value for the lm90_select_remote_channel
>> and write_tempx, then set_temp8 and set_temp11 could return it
>> to user-space.
>>
>> Signed-off-by: Wei Ni <wni@nvidia.com>
>> ---
>> drivers/hwmon/lm90.c | 150 +++++++++++++++++++++++++++++++++-----------------
>> 1 file changed, 99 insertions(+), 51 deletions(-)
>>
>> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>> index cdff742..6de8e01 100644
>> --- a/drivers/hwmon/lm90.c
>> +++ b/drivers/hwmon/lm90.c
>> @@ -422,20 +422,29 @@ static int lm90_read16(struct i2c_client *client, u8 regh, u8 regl, u16 *value)
>> * various registers have different meanings as a result of selecting a
>> * non-default remote channel.
>> */
>> -static inline void lm90_select_remote_channel(struct i2c_client *client,
>> +static inline int lm90_select_remote_channel(struct i2c_client *client,
>> struct lm90_data *data,
>> int channel)
>> {
>> u8 config;
>> + int err = 0;
>>
>> if (data->kind == max6696) {
>> lm90_read_reg(client, LM90_REG_R_CONFIG1, &config);
>> config &= ~0x08;
>> if (channel)
>> config |= 0x08;
>> - i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
>> - config);
>> + err = i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
>> + config);
>> + if (err < 0) {
>> + dev_err(&client->dev,
>> + "Failed to select remote channel %d, err %d\n",
>> + channel, err);
>> + return err;
>> + }
>> }
>> +
>> + return err;
>> }
>>
>> /*
>> @@ -702,29 +711,34 @@ static u16 temp_to_u16_adt7461(struct lm90_data *data, long val)
>> * Sysfs stuff
>> */
>>
>> -static ssize_t show_temp8(struct device *dev, struct device_attribute *devattr,
>> - char *buf)
>> +static int read_temp8(struct device *dev, int index)
>> {
>> - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> struct lm90_data *data = lm90_update_device(dev);
>> int temp;
>>
>> if (data->kind == adt7461)
>> - temp = temp_from_u8_adt7461(data, data->temp8[attr->index]);
>> + temp = temp_from_u8_adt7461(data, data->temp8[index]);
>> else if (data->kind == max6646)
>> - temp = temp_from_u8(data->temp8[attr->index]);
>> + temp = temp_from_u8(data->temp8[index]);
>> else
>> - temp = temp_from_s8(data->temp8[attr->index]);
>> + temp = temp_from_s8(data->temp8[index]);
>>
>> /* +16 degrees offset for temp2 for the LM99 */
>> - if (data->kind == lm99 && attr->index == 3)
>> + if (data->kind == lm99 && index == 3)
>> temp += 16000;
>>
>> - return sprintf(buf, "%d\n", temp);
>> + return temp;
>> }
>>
>> -static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
>> - const char *buf, size_t count)
>> +static ssize_t show_temp8(struct device *dev, struct device_attribute *devattr,
>> + char *buf)
>> +{
>> + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> +
>> + return sprintf(buf, "%d\n", read_temp8(dev, attr->index));
>> +}
>> +
>> +static int write_temp8(struct device *dev, int index, long val)
>> {
>> static const u8 reg[8] = {
>> LM90_REG_W_LOCAL_LOW,
>> @@ -737,60 +751,79 @@ static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
>> MAX6659_REG_W_REMOTE_EMERG,
>> };
>>
>> - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> struct i2c_client *client = to_i2c_client(dev);
>> struct lm90_data *data = i2c_get_clientdata(client);
>> - int nr = attr->index;
>> - long val;
>> int err;
>>
>> - err = kstrtol(buf, 10, &val);
>> - if (err < 0)
>> - return err;
>> -
>> /* +16 degrees offset for temp2 for the LM99 */
>> - if (data->kind == lm99 && attr->index == 3)
>> + if (data->kind == lm99 && index == 3)
>> val -= 16000;
>>
>> mutex_lock(&data->update_lock);
>> if (data->kind == adt7461)
>> - data->temp8[nr] = temp_to_u8_adt7461(data, val);
>> + data->temp8[index] = temp_to_u8_adt7461(data, val);
>> else if (data->kind == max6646)
>> - data->temp8[nr] = temp_to_u8(val);
>> + data->temp8[index] = temp_to_u8(val);
>> else
>> - data->temp8[nr] = temp_to_s8(val);
>> -
>> - lm90_select_remote_channel(client, data, nr >= 6);
>> - i2c_smbus_write_byte_data(client, reg[nr], data->temp8[nr]);
>> - lm90_select_remote_channel(client, data, 0);
>> + data->temp8[index] = temp_to_s8(val);
>>
>> + err = lm90_select_remote_channel(client, data, index >= 6);
>> + err |= i2c_smbus_write_byte_data(client, reg[index], data->temp8[index]);
>> + err |= lm90_select_remote_channel(client, data, 0);
>> + if (err)
>> + dev_err(dev, "write_temp8 failed!\n");
>> mutex_unlock(&data->update_lock);
>> +
>> + return err;
>> +}
>> +
>> +static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
>> + const char *buf, size_t count)
>> +{
>> + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>> + int index = attr->index;
>> + long val;
>> + int err;
>> +
>> + err = kstrtol(buf, 10, &val);
>> + if (err < 0)
>> + return err;
>> +
>> + err = write_temp8(dev, index, val);
>> + if (err < 0)
>> + return err;
>> +
>> return count;
>> }
>>
>> -static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
>> - char *buf)
>> +static int read_temp11(struct device *dev, int index)
>> {
>> - struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> struct lm90_data *data = lm90_update_device(dev);
>> int temp;
>>
>> if (data->kind == adt7461)
>> - temp = temp_from_u16_adt7461(data, data->temp11[attr->index]);
>> + temp = temp_from_u16_adt7461(data, data->temp11[index]);
>> else if (data->kind == max6646)
>> - temp = temp_from_u16(data->temp11[attr->index]);
>> + temp = temp_from_u16(data->temp11[index]);
>> else
>> - temp = temp_from_s16(data->temp11[attr->index]);
>> + temp = temp_from_s16(data->temp11[index]);
>>
>> /* +16 degrees offset for temp2 for the LM99 */
>> - if (data->kind == lm99 && attr->index <= 2)
>> + if (data->kind == lm99 && index <= 2)
>> temp += 16000;
>>
>> - return sprintf(buf, "%d\n", temp);
>> + return temp;
>> }
>>
>> -static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> - const char *buf, size_t count)
>> +static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
>> + char *buf)
>> +{
>> + struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> +
>> + return sprintf(buf, "%d\n", read_temp11(dev, attr->index));
>> +}
>> +
>> +static int write_temp11(struct device *dev, int nr, int index, long val)
>> {
>> struct {
>> u8 high;
>> @@ -804,18 +837,10 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> { LM90_REG_W_REMOTE_HIGHH, LM90_REG_W_REMOTE_HIGHL, 1 }
>> };
>>
>> - struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> struct i2c_client *client = to_i2c_client(dev);
>> struct lm90_data *data = i2c_get_clientdata(client);
>> - int nr = attr->nr;
>> - int index = attr->index;
>> - long val;
>> int err;
>>
>> - err = kstrtol(buf, 10, &val);
>> - if (err < 0)
>> - return err;
>> -
>> /* +16 degrees offset for temp2 for the LM99 */
>> if (data->kind == lm99 && index <= 2)
>> val -= 16000;
>> @@ -830,15 +855,38 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> else
>> data->temp11[index] = temp_to_s8(val) << 8;
>>
>> - lm90_select_remote_channel(client, data, reg[nr].channel);
>> - i2c_smbus_write_byte_data(client, reg[nr].high,
>> + err = lm90_select_remote_channel(client, data, reg[nr].channel);
>> + err |= i2c_smbus_write_byte_data(client, reg[nr].high,
>> data->temp11[index] >> 8);
>> if (data->flags & LM90_HAVE_REM_LIMIT_EXT)
>> - i2c_smbus_write_byte_data(client, reg[nr].low,
>> - data->temp11[index] & 0xff);
>> - lm90_select_remote_channel(client, data, 0);
>> + err |= i2c_smbus_write_byte_data(client, reg[nr].low,
>> + data->temp11[index] & 0xff);
>> + err |= lm90_select_remote_channel(client, data, 0);
>> + if (err)
>> + dev_err(dev, "write_temp11 failed !\n");
>>
>> mutex_unlock(&data->update_lock);
>> +
>> + return err;
>> +}
>> +
>> +static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
>> + const char *buf, size_t count)
>> +{
>> + struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
>> + int nr = attr->nr;
>> + int index = attr->index;
>> + long val;
>> + int err;
>> +
>> + err = kstrtol(buf, 10, &val);
>> + if (err < 0)
>> + return err;
>> +
>> + err = write_temp11(dev, nr, index, val);
>> + if (err < 0)
>> + return err;
>> +
>> return count;
>> }
>>
>>
>
next prev parent reply other threads:[~2013-09-09 6:15 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-06 10:36 [PATCH RESEND v4] hwmon: (lm90) split set&show temp as common codes Wei Ni
2013-08-06 10:36 ` Wei Ni
2013-08-06 10:36 ` [lm-sensors] " Wei Ni
[not found] ` <1375785417-13650-1-git-send-email-wni-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-08-06 10:43 ` Wei Ni
2013-08-06 10:43 ` Wei Ni
2013-08-06 10:43 ` [lm-sensors] " Wei Ni
[not found] ` <5200D354.2080102-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-09-09 6:15 ` Wei Ni [this message]
2013-09-09 6:15 ` Wei Ni
2013-09-09 6:15 ` [lm-sensors] " Wei Ni
2013-09-16 19:29 ` Jean Delvare
2013-09-16 19:29 ` Jean Delvare
2013-09-16 19:29 ` [lm-sensors] " Jean Delvare
[not found] ` <20130916212908.25248fae-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2013-09-17 7:04 ` Wei Ni
2013-09-17 7:04 ` Wei Ni
2013-09-17 7:04 ` [lm-sensors] " Wei Ni
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=522D6773.2090608@nvidia.com \
--to=wni-ddmlm1+adcrqt0dzr+alfa@public.gmane.org \
--cc=khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org \
--cc=linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.