[PATCH] fsi: Add aliased device numbering

From: Eddie James
Date: Thu Jan 26 2023 - 17:39:16 EST


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@xxxxxxxxxxxxx>
---
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