All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eliav Farber <farbere@amazon.com>
To: <jdelvare@suse.com>, <linux@roeck-us.net>, <robh+dt@kernel.org>,
	<p.zabel@pengutronix.de>, <rtanwar@maxlinear.com>,
	<andriy.shevchenko@intel.com>, <linux-hwmon@vger.kernel.org>,
	<devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Cc: <farbere@amazon.com>, <hhhawa@amazon.com>, <jonnyc@amazon.com>,
	"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>
Subject: [PATCH v5 12/21] hwmon: (mr75203) add VM active channel support
Date: Thu, 8 Sep 2022 15:24:40 +0000	[thread overview]
Message-ID: <20220908152449.35457-13-farbere@amazon.com> (raw)
In-Reply-To: <20220908152449.35457-1-farbere@amazon.com>

Add active channel support per voltage monitor.
The number of active channels is read from the device-tree.
When absent in device-tree, all channels are assumed to be used.

This shall be useful to expose sysfs only for inputs that are connected
to a voltage source.

Setting number of active channels to 0, means that entire VM sensor is
not used.

Signed-off-by: Eliav Farber <farbere@amazon.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
V4 -> V3:
- Convert comments to kernel doc.
- Repalce for loop with memset.
- Add {} to outer for loop.

V3 -> V2:
- Refactor the code changes (move code to a new function and group
  parameters in dedicated structure).

V2 -> V1:
- Fix compilation error for patch 08/16:
  "warning: ISO C90 forbids variable length array"

 drivers/hwmon/mr75203.c | 121 ++++++++++++++++++++++++++++++++--------
 1 file changed, 99 insertions(+), 22 deletions(-)

diff --git a/drivers/hwmon/mr75203.c b/drivers/hwmon/mr75203.c
index 19ec9fb91202..56e19c430919 100644
--- a/drivers/hwmon/mr75203.c
+++ b/drivers/hwmon/mr75203.c
@@ -29,6 +29,8 @@
 #define CH_NUM_MSK	GENMASK(31, 24)
 #define CH_NUM_SFT	24
 
+#define VM_NUM_MAX	(VM_NUM_MSK >> VM_NUM_SFT)
+
 /* Macro Common Register */
 #define CLK_SYNTH		0x00
 #define CLK_SYNTH_LO_SFT	0
@@ -106,6 +108,31 @@
 #define PVT_N_CONST		90
 #define PVT_R_CONST		245805
 
+/**
+ * struct voltage_device - VM single input parameters.
+ * @vm_map: Map channel number to VM index.
+ * @ch_map: Map channel number to channel index.
+ *
+ * The structure provides mapping between channel-number (0..N-1) to VM-index
+ * (0..num_vm-1) and channel-index (0..ch_num-1) where N = num_vm * ch_num.
+ */
+struct voltage_device {
+	u32 vm_map;
+	u32 ch_map;
+};
+
+/**
+ * struct voltage_channels - VM channel count.
+ * @total: Total number of channels in all VMs.
+ * @max: Maximum number of channels among all VMs.
+ *
+ * The structure provides channel count information across all VMs.
+ */
+struct voltage_channels {
+	u32 total;
+	u8 max;
+};
+
 struct pvt_device {
 	struct regmap		*c_map;
 	struct regmap		*t_map;
@@ -113,12 +140,12 @@ struct pvt_device {
 	struct regmap		*v_map;
 	struct clk		*clk;
 	struct reset_control	*rst;
+	struct voltage_device	*vd;
+	struct voltage_channels	vm_channels;
 	u32			t_num;
 	u32			p_num;
 	u32			v_num;
-	u32			c_num;
 	u32			ip_freq;
-	u8			*vm_idx;
 };
 
 static umode_t pvt_is_visible(const void *data, enum hwmon_sensor_types type,
@@ -184,11 +211,11 @@ static int pvt_read_in(struct device *dev, u32 attr, int channel, long *val)
 	u32 n, stat;
 	int ret;
 
-	if (channel >= pvt->v_num * pvt->c_num)
+	if (channel >= pvt->vm_channels.total)
 		return -EINVAL;
 
-	vm_idx = pvt->vm_idx[channel / pvt->c_num];
-	ch_idx = channel % pvt->c_num;
+	vm_idx = pvt->vd[channel].vm_map;
+	ch_idx = pvt->vd[channel].ch_map;
 
 	switch (attr) {
 	case hwmon_in_input:
@@ -398,7 +425,7 @@ static int pvt_init(struct pvt_device *pvt)
 		if (ret)
 			return ret;
 
-		val = (BIT(pvt->c_num) - 1) | VM_CH_INIT |
+		val = (BIT(pvt->vm_channels.max) - 1) | VM_CH_INIT |
 		      IP_POLL << SDIF_ADDR_SFT | SDIF_WRN_W | SDIF_PROG;
 		ret = regmap_write(v_map, SDIF_W, val);
 		if (ret < 0)
@@ -523,6 +550,60 @@ static int pvt_reset_control_deassert(struct device *dev, struct pvt_device *pvt
 	return devm_add_action_or_reset(dev, pvt_reset_control_assert, pvt);
 }
 
+static int pvt_get_active_channel(struct device *dev, struct pvt_device *pvt,
+				  u32 vm_num, u32 ch_num, u8 *vm_idx)
+{
+	u8 vm_active_ch[VM_NUM_MAX];
+	int ret, i, j, k;
+
+	ret = device_property_read_u8_array(dev, "moortec,vm-active-channels",
+					    vm_active_ch, vm_num);
+	if (ret) {
+		/*
+		 * Incase "moortec,vm-active-channels" property is not defined,
+		 * we assume each VM sensor has all of its channels active.
+		 */
+		memset(vm_active_ch, ch_num, vm_num);
+		pvt->vm_channels.max = ch_num;
+		pvt->vm_channels.total = ch_num * vm_num;
+	} else {
+		for (i = 0; i < vm_num; i++) {
+			if (vm_active_ch[i] > ch_num) {
+				dev_err(dev, "invalid active channels: %u\n",
+					vm_active_ch[i]);
+				return -EINVAL;
+			}
+
+			pvt->vm_channels.total += vm_active_ch[i];
+
+			if (vm_active_ch[i] > pvt->vm_channels.max)
+				pvt->vm_channels.max = vm_active_ch[i];
+		}
+	}
+
+	/*
+	 * Map between the channel-number to VM-index and channel-index.
+	 * Example - 3 VMs, "moortec,vm_active_ch" = <5 2 4>:
+	 * vm_map = [0 0 0 0 0 1 1 2 2 2 2]
+	 * ch_map = [0 1 2 3 4 0 1 0 1 2 3]
+	 */
+	pvt->vd = devm_kcalloc(dev, pvt->vm_channels.total, sizeof(*pvt->vd),
+			       GFP_KERNEL);
+	if (!pvt->vd)
+		return -ENOMEM;
+
+	k = 0;
+	for (i = 0; i < vm_num; i++) {
+		for (j = 0; j < vm_active_ch[i]; j++) {
+			pvt->vd[k].vm_map = vm_idx[i];
+			pvt->vd[k].ch_map = j;
+			k++;
+		}
+	}
+
+	return 0;
+}
+
 static int mr75203_probe(struct platform_device *pdev)
 {
 	u32 ts_num, vm_num, pd_num, ch_num, val, index, i;
@@ -574,7 +655,6 @@ static int mr75203_probe(struct platform_device *pdev)
 	pvt->t_num = ts_num;
 	pvt->p_num = pd_num;
 	pvt->v_num = vm_num;
-	pvt->c_num = ch_num;
 	val = 0;
 	if (ts_num)
 		val++;
@@ -611,44 +691,41 @@ static int mr75203_probe(struct platform_device *pdev)
 	}
 
 	if (vm_num) {
-		u32 total_ch;
+		u8 vm_idx[VM_NUM_MAX];
 
 		ret = pvt_get_regmap(pdev, "vm", pvt);
 		if (ret)
 			return ret;
 
-		pvt->vm_idx = devm_kcalloc(dev, vm_num, sizeof(*pvt->vm_idx),
-					   GFP_KERNEL);
-		if (!pvt->vm_idx)
-			return -ENOMEM;
-
-		ret = device_property_read_u8_array(dev, "intel,vm-map",
-						    pvt->vm_idx, vm_num);
+		ret = device_property_read_u8_array(dev, "intel,vm-map", vm_idx,
+						    vm_num);
 		if (ret) {
 			/*
 			 * Incase intel,vm-map property is not defined, we
 			 * assume incremental channel numbers.
 			 */
 			for (i = 0; i < vm_num; i++)
-				pvt->vm_idx[i] = i;
+				vm_idx[i] = i;
 		} else {
 			for (i = 0; i < vm_num; i++)
-				if (pvt->vm_idx[i] >= vm_num ||
-				    pvt->vm_idx[i] == 0xff) {
+				if (vm_idx[i] >= vm_num || vm_idx[i] == 0xff) {
 					pvt->v_num = i;
 					vm_num = i;
 					break;
 				}
 		}
 
-		total_ch = ch_num * vm_num;
-		in_config = devm_kcalloc(dev, total_ch + 1,
+		ret = pvt_get_active_channel(dev, pvt, vm_num, ch_num, vm_idx);
+		if (ret)
+			return ret;
+
+		in_config = devm_kcalloc(dev, pvt->vm_channels.total + 1,
 					 sizeof(*in_config), GFP_KERNEL);
 		if (!in_config)
 			return -ENOMEM;
 
-		memset32(in_config, HWMON_I_INPUT, total_ch);
-		in_config[total_ch] = 0;
+		memset32(in_config, HWMON_I_INPUT, pvt->vm_channels.total);
+		in_config[pvt->vm_channels.total] = 0;
 		pvt_in.config = in_config;
 
 		pvt_info[index++] = &pvt_in;
-- 
2.37.1


  parent reply	other threads:[~2022-09-08 15:35 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-08 15:24 [PATCH v5 00/21] Variety of fixes and new features for mr75203 driver Eliav Farber
2022-09-08 15:24 ` [PATCH v5 01/21] dt-bindings: hwmon: (mr75203) fix "intel,vm-map" property to be optional Eliav Farber
2022-09-08 18:59   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 02/21] hwmon: (mr75203) fix VM sensor allocation when "intel,vm-map" not defined Eliav Farber
2022-09-08 15:24 ` [PATCH v5 03/21] hwmon: (mr75203) update pvt->v_num and vm_num to the actual number of used sensors Eliav Farber
2022-09-08 15:24 ` [PATCH v5 04/21] hwmon: (mr75203) fix voltage equation for negative source input Eliav Farber
2022-09-08 15:24 ` [PATCH v5 05/21] hwmon: (mr75203) fix multi-channel voltage reading Eliav Farber
2022-09-08 15:24 ` [PATCH v5 06/21] hwmon: (mr75203) enable polling for all VM channels Eliav Farber
2022-09-08 15:24 ` [PATCH v5 07/21] dt-bindings: hwmon: (mr75203) add description for Moortec's PVT controller Eliav Farber
2022-09-09  2:16   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 08/21] dt-bindings: hwmon: (mr75203) change "resets" property to be optional Eliav Farber
2022-09-09  2:17   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 09/21] hwmon: (mr75203) skip reset-control deassert for SOCs that don't support it Eliav Farber
2022-09-09  2:18   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 10/21] dt-bindings: vendor-prefixes: add vendor prefix for Moortec Eliav Farber
2022-09-13 11:47   ` Rob Herring
2022-09-19 12:59   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 11/21] dt-bindings: hwmon: (mr75203) add "moortec,vm-active-channels" property Eliav Farber
2022-09-13 11:49   ` Rob Herring
2022-09-19 12:59   ` Guenter Roeck
2022-09-08 15:24 ` Eliav Farber [this message]
2022-09-19 13:00   ` [PATCH v5 12/21] hwmon: (mr75203) add VM active channel support Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 13/21] dt-bindings: hwmon: (mr75203) add "moortec,vm-pre-scaler-x2" property Eliav Farber
2022-09-13 11:50   ` Rob Herring
2022-09-19 13:01   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 14/21] hwmon: (mr75203) add VM pre-scaler x2 support Eliav Farber
2022-09-19 13:10   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 15/21] hwmon: (mr75203) modify the temperature equation according to series 5 datasheet Eliav Farber
2022-09-19 13:11   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 16/21] dt-bindings: hwmon: (mr75203) add "moortec,ts-series" property Eliav Farber
2022-09-08 19:02   ` Guenter Roeck
2022-09-08 20:18     ` [PATCH v5 16/21] dt-bindings: hwmon: (mr75203) add "moortec, ts-series" property Farber, Eliav
2022-09-08 20:22       ` Guenter Roeck
2022-09-13 11:57   ` [PATCH v5 16/21] dt-bindings: hwmon: (mr75203) add "moortec,ts-series" property Rob Herring
2022-09-19 13:18   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 17/21] hwmon: (mr75203) add support for series 6 temperature equation Eliav Farber
2022-09-19 13:19   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 18/21] dt-bindings: hwmon: (mr75203) add coefficient properties for the thermal equation Eliav Farber
2022-09-13 11:58   ` Rob Herring
2022-09-19 13:20   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 19/21] hwmon: (mr75203) parse temperature coefficients from device-tree Eliav Farber
2022-09-19 13:21   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 20/21] hwmon: (mr75203) add debugfs to read and write temperature coefficients Eliav Farber
2022-09-08 18:11   ` Andy Shevchenko
2022-09-13 13:06     ` Farber, Eliav
2022-09-13 14:40       ` Farber, Eliav
2022-09-13 17:01         ` Andy Shevchenko
2022-09-14  4:26           ` Farber, Eliav
2022-09-14  9:32             ` Andy Shevchenko
2022-09-14 14:03               ` Andy Shevchenko
2022-09-14 14:08                 ` Andy Shevchenko
2022-09-15  9:17                   ` Farber, Eliav
2022-09-19 13:22   ` Guenter Roeck
2022-09-08 15:24 ` [PATCH v5 21/21] hwmon: (mr75203) fix coding style space errors Eliav Farber
2022-09-19 13:23   ` Guenter Roeck

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=20220908152449.35457-13-farbere@amazon.com \
    --to=farbere@amazon.com \
    --cc=andriy.shevchenko@intel.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=devicetree@vger.kernel.org \
    --cc=hhhawa@amazon.com \
    --cc=jdelvare@suse.com \
    --cc=jonnyc@amazon.com \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=p.zabel@pengutronix.de \
    --cc=robh+dt@kernel.org \
    --cc=rtanwar@maxlinear.com \
    /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.