On Tue, Jan 18, 2022 at 09:56:11AM +0200, michaelsh@xxxxxxxxxx wrote: > From: Michael Shych <michaelsh@xxxxxxxxxx> > > This patch adds support for Lattice's POWR1014 power manager IC. > Read access to all the ADCs on the chip are supported through > the "hwmon" "sysfs" files. > > The main differences of POWR1014 compared to POWR1220 are > amount of VMON input lines: 10 on POWR1014 and 12 lines on POWR1220 and > number of output control signals: 14 on POWR1014 and 20 on POWR1220. > > Signed-off-by: Michael Shych <michaelsh@xxxxxxxxxx> > Reviewed-by: Vadim Pasternak <vadimp@xxxxxxxxxx> Applied. Thanks, Guenter > --- > v2->v3 > Fixes according to Guenter Roeck notes > 1. Correct commit notes. > 2. Don't use usleep_range > 3. Change devicenames in alphanumeric order. > 4. Chanhge if statement > v1->v2 > Fix added by Michael: Fix incorrect device id. > --- > drivers/hwmon/powr1220.c | 22 +++++++++++++++++++++- > 1 file changed, 21 insertions(+), 1 deletion(-) > > diff --git a/drivers/hwmon/powr1220.c b/drivers/hwmon/powr1220.c > index 1d4e005977b6..2a5e168a52a9 100644 > --- a/drivers/hwmon/powr1220.c > +++ b/drivers/hwmon/powr1220.c > @@ -22,6 +22,8 @@ > #define ADC_STEP_MV 2 > #define ADC_MAX_LOW_MEASUREMENT_MV 2000 > > +enum powr1xxx_chips { powr1014, powr1220 }; > + > enum powr1220_regs { > VMON_STATUS0, > VMON_STATUS1, > @@ -74,6 +76,7 @@ enum powr1220_adc_values { > struct powr1220_data { > struct i2c_client *client; > struct mutex update_lock; > + u8 max_channels; > bool adc_valid[MAX_POWR1220_ADC_VALUES]; > /* the next value is in jiffies */ > unsigned long adc_last_updated[MAX_POWR1220_ADC_VALUES]; > @@ -171,6 +174,11 @@ static umode_t > powr1220_is_visible(const void *data, enum hwmon_sensor_types type, u32 > attr, int channel) > { > + struct powr1220_data *chip_data = (struct powr1220_data *)data; > + > + if (channel >= chip_data->max_channels) > + return 0; > + > switch (type) { > case hwmon_in: > switch (attr) { > @@ -271,6 +279,8 @@ static const struct hwmon_chip_info powr1220_chip_info = { > .info = powr1220_info, > }; > > +static const struct i2c_device_id powr1220_ids[]; > + > static int powr1220_probe(struct i2c_client *client) > { > struct powr1220_data *data; > @@ -283,6 +293,15 @@ static int powr1220_probe(struct i2c_client *client) > if (!data) > return -ENOMEM; > > + switch (i2c_match_id(powr1220_ids, client)->driver_data) { > + case powr1014: > + data->max_channels = 10; > + break; > + default: > + data->max_channels = 12; > + break; > + } > + > mutex_init(&data->update_lock); > data->client = client; > > @@ -296,7 +315,8 @@ static int powr1220_probe(struct i2c_client *client) > } > > static const struct i2c_device_id powr1220_ids[] = { > - { "powr1220", 0, }, > + { "powr1014", powr1014, }, > + { "powr1220", powr1220, }, > { } > }; >