RE: [PATCH v5 2/4] hwmon: max31827: Add support for max31828 and max31829

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Guenter Roeck <groeck7@xxxxxxxxx> On Behalf Of Guenter Roeck
> Sent: Friday, October 27, 2023 8:02 AM
> To: Matyas, Daniel <Daniel.Matyas@xxxxxxxxxx>
> Cc: no To-header on input <;>; Jean Delvare <jdelvare@xxxxxxxx>;
> Jonathan Corbet <corbet@xxxxxxx>; linux-hwmon@xxxxxxxxxxxxxxx; linux-
> doc@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx
> Subject: Re: [PATCH v5 2/4] hwmon: max31827: Add support for
> max31828 and max31829
> 
> [External]
> 
> On Thu, Oct 26, 2023 at 05:44:02PM +0300, Daniel Matyas wrote:
> > When adi,flt-q and/or adi,alrm-pol are not mentioned, the default
> > configuration is loaded.
> >
> That isn't really a complete patch description.
> It should include (even if repeated) that support for additional chips is
> added.
> 
> > Signed-off-by: Daniel Matyas <daniel.matyas@xxxxxxxxxx>
> > ---
> >
> > v4 -> v5: Passed i2c_client to init_client(), because I needed it to
> > retrieve device id.
> > Used a simple if to load default configuration. No more switch.
> >
> > v3 -> v4: No change.
> >
> > v3: Added patch.
> >
> >  drivers/hwmon/max31827.c | 51
> > +++++++++++++++++++++++++++++++---------
> >  1 file changed, 40 insertions(+), 11 deletions(-)
> >
> > diff --git a/drivers/hwmon/max31827.c b/drivers/hwmon/max31827.c
> index
> > 7976d668ffd4..446232fa1710 100644
> > --- a/drivers/hwmon/max31827.c
> > +++ b/drivers/hwmon/max31827.c
> > @@ -39,10 +39,15 @@
> >
> >  #define MAX31827_12_BIT_CNV_TIME	140
> >
> > +#define MAX31827_ALRM_POL_HIGH	0x1
> > +#define MAX31827_FLT_Q_4	0x2
> > +
> >  #define MAX31827_16_BIT_TO_M_DGR(x)	(sign_extend32(x, 15) *
> 1000 / 16)
> >  #define MAX31827_M_DGR_TO_16_BIT(x)	(((x) << 4) / 1000)
> >  #define MAX31827_DEVICE_ENABLE(x)	((x) ? 0xA : 0x0)
> >
> > +enum chips { max31827, max31828, max31829 };
> > +
> >  enum max31827_cnv {
> >  	MAX31827_CNV_1_DIV_64_HZ = 1,
> >  	MAX31827_CNV_1_DIV_32_HZ,
> > @@ -373,12 +378,22 @@ static int max31827_write(struct device *dev,
> enum hwmon_sensor_types type,
> >  	return -EOPNOTSUPP;
> >  }
> >
> > +static const struct i2c_device_id max31827_i2c_ids[] = {
> > +	{ "max31827", max31827 },
> > +	{ "max31828", max31828 },
> > +	{ "max31829", max31829 },
> > +	{ }
> > +};
> > +MODULE_DEVICE_TABLE(i2c, max31827_i2c_ids);
> > +
> >  static int max31827_init_client(struct max31827_state *st,
> > -				struct device *dev)
> > +				struct i2c_client *client)
> >  {
> > +	struct device *dev = &client->dev;
> >  	struct fwnode_handle *fwnode;
> >  	unsigned int res = 0;
> >  	u32 data, lsb_idx;
> > +	enum chips type;
> >  	bool prop;
> >  	int ret;
> >
> > @@ -395,13 +410,20 @@ static int max31827_init_client(struct
> max31827_state *st,
> >  	prop = fwnode_property_read_bool(fwnode, "adi,timeout-
> enable");
> >  	res |=
> FIELD_PREP(MAX31827_CONFIGURATION_TIMEOUT_MASK, !prop);
> >
> > +	if (dev->of_node)
> > +		type = (enum chips)of_device_get_match_data(dev);
> > +	else
> > +		type = i2c_match_id(max31827_i2c_ids, client)-
> >driver_data;
> > +
> 
> This should be something like
> 
> 	type = (enum chips)(uintptr_t)device_get_match_data(dev);
> 
> though that requires that the enum values start with 1. This avoids having
> to pass client to the function and is more generic.
> 
> >  	if (fwnode_property_present(fwnode, "adi,alarm-pol")) {
> >  		ret = fwnode_property_read_u32(fwnode, "adi,alarm-
> pol", &data);
> >  		if (ret)
> >  			return ret;
> >
> >  		res |=
> FIELD_PREP(MAX31827_CONFIGURATION_ALRM_POL_MASK, !!data);
> > -	}
> > +	} else if (type == max31829)
> 
> Not sure why checkpatch ignores this (maybe because of 'else if'), but the
> else path should also be in {}.
> 
> But why is this only for max31829 ? I mean, sure, the default for that chip
> is different, but that doesn't mean the other chips have that bit set. There
> is no guarantee that the chip is in its default state when the driver is
> loaded.
> 
> > +		res |=
> FIELD_PREP(MAX31827_CONFIGURATION_ALRM_POL_MASK,
> > +				  MAX31827_ALRM_POL_HIGH);
> >
> >  	if (fwnode_property_present(fwnode, "adi,fault-q")) {
> >  		ret = fwnode_property_read_u32(fwnode, "adi,fault-q",
> &data); @@
> > -418,7 +440,9 @@ static int max31827_init_client(struct
> max31827_state *st,
> >  		}
> >
> >  		res |=
> FIELD_PREP(MAX31827_CONFIGURATION_FLT_Q_MASK, lsb_idx);
> > -	}
> > +	} else if ((type == max31828) || (type == max31829))
> 
> I _really_ dislike the notion of excessive ( ). Also, {} for the else branch.
> 
> I also don't understand why that would be chip specific. I don't see
> anything along that line in the datasheet.
> 
> Ah, wait ... I guess that is supposed to reflect the chip default.
> I don't see why the chip default makes a difference - a well defined default
> must be set either way. Again, there is no guarantee that the chip is in its
> default state when the driver is loaded.

The well defined default was set in v4, but I deleted it, because the default value in hex for max31827 and max31828 alarm polarity, and max31827 fault queue is 0x0. I had 2 #defines for these values, but you said:
" Since MAX31827_ALRM_POL_LOW is 0, this code doesn't really do anything and just pollutes the code. "

So, I thought I should remove it altogether, since res is set to 0 in the beginning and the default value of these chips (i.e. 0) is implicitly set.

> 
> Also, why are the default values added in this patch and not in the
> previous patch ?
>

In v4 these default values were set in the previous patch.
 
> > +		res |=
> FIELD_PREP(MAX31827_CONFIGURATION_FLT_Q_MASK,
> > +				  MAX31827_FLT_Q_4);
> >
> >  	return regmap_write(st->regmap,
> MAX31827_CONFIGURATION_REG, res);  }
> > @@ -464,7 +488,7 @@ static int max31827_probe(struct i2c_client
> *client)
> >  		return dev_err_probe(dev, PTR_ERR(st->regmap),
> >  				     "Failed to allocate regmap.\n");
> >
> > -	err = max31827_init_client(st, dev);
> > +	err = max31827_init_client(st, client);
> >  	if (err)
> >  		return err;
> >
> > @@ -475,14 +499,19 @@ static int max31827_probe(struct i2c_client
> *client)
> >  	return PTR_ERR_OR_ZERO(hwmon_dev);
> >  }
> >
> > -static const struct i2c_device_id max31827_i2c_ids[] = {
> > -	{ "max31827", 0 },
> > -	{ }
> > -};
> > -MODULE_DEVICE_TABLE(i2c, max31827_i2c_ids);
> > -
> >  static const struct of_device_id max31827_of_match[] = {
> > -	{ .compatible = "adi,max31827" },
> > +	{
> > +		.compatible = "adi,max31827",
> > +		.data = (void *)max31827
> > +	},
> > +	{
> > +		.compatible = "adi,max31828",
> > +		.data = (void *)max31828
> > +	},
> > +	{
> > +		.compatible = "adi,max31829",
> > +		.data = (void *)max31829
> > +	},
> >  	{ }
> >  };
> >  MODULE_DEVICE_TABLE(of, max31827_of_match);





[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux