@@ -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);
@@ -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,
@@ -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) {
@@ -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);
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@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(-)