Skip to content

Commit

Permalink
hwmon: (powr1220) Add support for Lattice's POWR1014 power manager IC
Browse files Browse the repository at this point in the history
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@nvidia.com>
Reviewed-by: Vadim Pasternak <vadimp@nvidia.com>
Link: https://lore.kernel.org/r/20220118075611.10665-4-michaelsh@nvidia.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
  • Loading branch information
mshych authored and groeck committed Feb 28, 2022
1 parent 915d466 commit 9f93aa1
Showing 1 changed file with 21 additions and 1 deletion.
22 changes: 21 additions & 1 deletion drivers/hwmon/powr1220.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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, },
{ }
};

Expand Down

0 comments on commit 9f93aa1

Please sign in to comment.