diff mbox series

[v3,3/3] hwmon: powr1220: Add support for Lattice's POWR1014 power manager IC

Message ID 20220118075611.10665-4-michaelsh@nvidia.com (mailing list archive)
State Accepted
Headers show
Series hwmon: powr1220: add powr104 support | expand

Commit Message

Michael Shych Jan. 18, 2022, 7:56 a.m. UTC
From: Michael Shych <michaelsh@nvidia.com>

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>
---
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(-)

Comments

Guenter Roeck Jan. 21, 2022, 2:13 p.m. UTC | #1
On Tue, Jan 18, 2022 at 09:56:11AM +0200, michaelsh@nvidia.com wrote:
> From: Michael Shych <michaelsh@nvidia.com>
> 
> 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>

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, },
>  	{ }
>  };
>
diff mbox series

Patch

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