[PATCH] fsi: Add aliased device numbering

Eddie James eajames at linux.ibm.com
Fri Jan 27 09:38:50 AEDT 2023


The I2C and SPI subsystems can use an aliased name to number the device.
Add similar support to the FSI subsystem for any device type.

Signed-off-by: Eddie James <eajames at linux.ibm.com>
---
 drivers/fsi/fsi-core.c    | 31 +++++++++++++++++++++++++++++++
 drivers/fsi/fsi-sbefifo.c |  5 ++---
 drivers/fsi/fsi-scom.c    |  3 ++-
 include/linux/fsi.h       |  1 +
 4 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index 694e80c06665..c3c139c31341 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -971,9 +971,40 @@ static int __fsi_get_new_minor(struct fsi_slave *slave, enum fsi_dev_type type,
 	return 0;
 }
 
+static const char *const fsi_dev_type_names[] = {
+	"cfam",
+	"sbefifo",
+	"scom",
+	"occ",
+};
+
+const char *fsi_get_dev_type_name(enum fsi_dev_type type)
+{
+	return fsi_dev_type_names[type];
+}
+EXPORT_SYMBOL_GPL(fsi_get_dev_type_name);
+
 int fsi_get_new_minor(struct fsi_device *fdev, enum fsi_dev_type type,
 		      dev_t *out_dev, int *out_index)
 {
+	if (fdev->dev.of_node) {
+		int aid = of_alias_get_id(fdev->dev.of_node, fsi_dev_type_names[type]);
+
+		if (aid >= 0) {
+			int id = (aid << 4) | type;
+
+			id = ida_simple_get(&fsi_minor_ida, id, id + 1, GFP_KERNEL);
+			if (id >= 0) {
+				*out_index = aid;
+				*out_dev = fsi_base_dev + id;
+				return 0;
+			}
+
+			if (id != -ENOSPC)
+				return id;
+		}
+	}
+
 	return __fsi_get_new_minor(fdev->slave, type, out_dev, out_index);
 }
 EXPORT_SYMBOL_GPL(fsi_get_new_minor);
diff --git a/drivers/fsi/fsi-sbefifo.c b/drivers/fsi/fsi-sbefifo.c
index 9912b7a6a4b9..c79396ba982e 100644
--- a/drivers/fsi/fsi-sbefifo.c
+++ b/drivers/fsi/fsi-sbefifo.c
@@ -39,7 +39,6 @@
  * the self boot engine on POWER processors.
  */
 
-#define DEVICE_NAME		"sbefifo"
 #define FSI_ENGID_SBE		0x22
 
 /*
@@ -1046,7 +1045,7 @@ static int sbefifo_probe(struct device *dev)
 	if (rc)
 		goto err;
 
-	dev_set_name(&sbefifo->dev, "sbefifo%d", didx);
+	dev_set_name(&sbefifo->dev, "%s%d", fsi_get_dev_type_name(fsi_dev_sbefifo), didx);
 	cdev_init(&sbefifo->cdev, &sbefifo_fops);
 	rc = cdev_device_add(&sbefifo->cdev, &sbefifo->dev);
 	if (rc) {
@@ -1117,7 +1116,7 @@ static const struct fsi_device_id sbefifo_ids[] = {
 static struct fsi_driver sbefifo_drv = {
 	.id_table = sbefifo_ids,
 	.drv = {
-		.name = DEVICE_NAME,
+		.name = "sbefifo",
 		.bus = &fsi_bus_type,
 		.probe = sbefifo_probe,
 		.remove = sbefifo_remove,
diff --git a/drivers/fsi/fsi-scom.c b/drivers/fsi/fsi-scom.c
index bcb756dc9866..ee2c70906d06 100644
--- a/drivers/fsi/fsi-scom.c
+++ b/drivers/fsi/fsi-scom.c
@@ -556,7 +556,8 @@ static int scom_probe(struct device *dev)
 	if (rc)
 		goto err;
 
-	dev_set_name(&scom->dev, "scom%d", didx);
+	dev_set_name(&scom->dev, "%s%d", fsi_get_dev_type_name(fsi_dev_scom),
+		     didx);
 	cdev_init(&scom->cdev, &scom_fops);
 	rc = cdev_device_add(&scom->cdev, &scom->dev);
 	if (rc) {
diff --git a/include/linux/fsi.h b/include/linux/fsi.h
index 3df8c54868df..a6c6c57e146f 100644
--- a/include/linux/fsi.h
+++ b/include/linux/fsi.h
@@ -78,6 +78,7 @@ enum fsi_dev_type {
 	fsi_dev_occ
 };
 
+const char *fsi_get_dev_type_name(enum fsi_dev_type type);
 extern int fsi_get_new_minor(struct fsi_device *fdev, enum fsi_dev_type type,
 			     dev_t *out_dev, int *out_index);
 extern void fsi_free_minor(dev_t dev);
-- 
2.31.1



More information about the linux-fsi mailing list