public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
From: bingbu.cao@intel.com
To: linux-media@vger.kernel.org, sakari.ailus@linux.intel.com,
	andriy.shevchenko@linux.intel.com, djrscally@gmail.com
Cc: bingbu.cao@linux.intel.com, bingbu.cao@intel.com
Subject: [PATCH] media: ipu3-cio2: support multiple sensors and VCMs with HID name
Date: Fri,  3 Mar 2023 22:44:32 +0800	[thread overview]
Message-ID: <20230303144432.2108677-1-bingbu.cao@intel.com> (raw)

From: Bingbu Cao <bingbu.cao@intel.com>

In current cio2-bridge, it is using the hid as node name to register
software node and swnode will create kobject and sysfs entry with
the node name, if there are multiple sensors and VCMs which are sharing
same HID name, it will cause the software nodes registration failure:

[ 7.142311] sysfs: cannot create duplicate filename '/kernel/software_nodes/dw9714'
...
[ 7.142328] Call Trace:
[ 7.142330]  <TASK>
[ 7.142336]  dump_stack_lvl+0x49/0x63
[ 7.142341]  dump_stack+0x10/0x16
[ 7.142343]  sysfs_warn_dup.cold+0x17/0x2b
[ 7.142346]  sysfs_create_dir_ns+0xbc/0xd0
[ 7.142351]  kobject_add_internal+0xb1/0x2b0
[ 7.142356]  kobject_init_and_add+0x71/0xa0
[ 7.142360]  swnode_register+0x136/0x210
[ 7.142363]  software_node_register+0xd2/0x120
[ 7.142364]  software_node_register_nodes+0x83/0xf0
[ 7.142366]  ? acpi_get_physical_device_location+0x65/0xc0
[ 7.142371]  cio2_bridge_init+0x82a/0xb5e
...
[ 7.142448] kobject_add_internal failed for dw9714 with -EEXIST,
don't try to register things with the same name in the same directory.

One solution is appending the sensor link(Mipi Port) in SSDB as suffix
of the node name to fix this problem.

Signed-off-by: Bingbu Cao <bingbu.cao@intel.com>
---
 drivers/media/pci/intel/ipu3/cio2-bridge.c | 14 ++++++++++----
 drivers/media/pci/intel/ipu3/cio2-bridge.h |  2 +-
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/media/pci/intel/ipu3/cio2-bridge.c b/drivers/media/pci/intel/ipu3/cio2-bridge.c
index dfefe0d8aa95..1ce1acb18f3f 100644
--- a/drivers/media/pci/intel/ipu3/cio2-bridge.c
+++ b/drivers/media/pci/intel/ipu3/cio2-bridge.c
@@ -212,6 +212,7 @@ static void cio2_bridge_create_connection_swnodes(struct cio2_bridge *bridge,
 						  struct cio2_sensor *sensor)
 {
 	struct software_node *nodes = sensor->swnodes;
+	char vcm_name[ACPI_ID_LEN + 4];
 
 	cio2_bridge_init_swnode_names(sensor);
 
@@ -229,9 +230,12 @@ static void cio2_bridge_create_connection_swnodes(struct cio2_bridge *bridge,
 						sensor->node_names.endpoint,
 						&nodes[SWNODE_CIO2_PORT],
 						sensor->cio2_properties);
-	if (sensor->ssdb.vcmtype)
-		nodes[SWNODE_VCM] =
-			NODE_VCM(cio2_vcm_types[sensor->ssdb.vcmtype - 1]);
+	if (sensor->ssdb.vcmtype) {
+		scnprintf(vcm_name, sizeof(vcm_name), "%s-%u",
+			  cio2_vcm_types[sensor->ssdb.vcmtype - 1],
+			  sensor->ssdb.link);
+		nodes[SWNODE_VCM] = NODE_VCM(vcm_name);
+	}
 
 	cio2_bridge_init_swnode_group(sensor);
 }
@@ -295,7 +299,6 @@ static int cio2_bridge_connect_sensor(const struct cio2_sensor_config *cfg,
 		}
 
 		sensor = &bridge->sensors[bridge->n_sensors];
-		strscpy(sensor->name, cfg->hid, sizeof(sensor->name));
 
 		ret = cio2_bridge_read_acpi_buffer(adev, "SSDB",
 						   &sensor->ssdb,
@@ -303,6 +306,9 @@ static int cio2_bridge_connect_sensor(const struct cio2_sensor_config *cfg,
 		if (ret)
 			goto err_put_adev;
 
+		scnprintf(sensor->name, sizeof(sensor->name), "%s-%u",
+			  cfg->hid, sensor->ssdb.link);
+
 		if (sensor->ssdb.vcmtype > ARRAY_SIZE(cio2_vcm_types)) {
 			dev_warn(&adev->dev, "Unknown VCM type %d\n",
 				 sensor->ssdb.vcmtype);
diff --git a/drivers/media/pci/intel/ipu3/cio2-bridge.h b/drivers/media/pci/intel/ipu3/cio2-bridge.h
index b93b749c65bd..820ff518ef2b 100644
--- a/drivers/media/pci/intel/ipu3/cio2-bridge.h
+++ b/drivers/media/pci/intel/ipu3/cio2-bridge.h
@@ -113,7 +113,7 @@ struct cio2_sensor_config {
 };
 
 struct cio2_sensor {
-	char name[ACPI_ID_LEN];
+	char name[ACPI_ID_LEN + 4];
 	struct acpi_device *adev;
 	struct i2c_client *vcm_i2c_client;
 
-- 
2.39.1


             reply	other threads:[~2023-03-03 14:36 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-03 14:44 bingbu.cao [this message]
2023-03-06 11:26 ` [PATCH] media: ipu3-cio2: support multiple sensors and VCMs with HID name Andy Shevchenko
2023-03-06 13:33   ` Cao, Bingbu
2023-03-06 16:35     ` Andy Shevchenko
2023-03-07  2:43       ` Bingbu Cao

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=20230303144432.2108677-1-bingbu.cao@intel.com \
    --to=bingbu.cao@intel.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=bingbu.cao@linux.intel.com \
    --cc=djrscally@gmail.com \
    --cc=linux-media@vger.kernel.org \
    --cc=sakari.ailus@linux.intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox