fsi: Add aliased device numbering
Commit Message
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(-)
Comments
Hi Eddie,
> 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.
Sounds good!
However, the majority of this patch seems to be the change to a (const)
enum value, which you then convert to a string to generate the
non-number component of the device name.
Does:
dev_set_name(&scom->dev, "%s%d", fsi_get_dev_type_name(fsi_dev_scom), didx);
have much of a benefit over:
dev_set_name(&scom->dev, "scom%d", didx);
?
Cheers,
Jeremy
On 1/26/23 19:03, Jeremy Kerr wrote:
> Hi Eddie,
>
>> 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.
> Sounds good!
>
> However, the majority of this patch seems to be the change to a (const)
> enum value, which you then convert to a string to generate the
> non-number component of the device name.
>
> Does:
>
> dev_set_name(&scom->dev, "%s%d", fsi_get_dev_type_name(fsi_dev_scom), didx);
>
> have much of a benefit over:
>
> dev_set_name(&scom->dev, "scom%d", didx);
>
> ?
Hi Jeremy,
I agree, it's not a benefit but my objective here is to make sure the
device name is definitely the same as what the alias lookup is looking
for. Perhaps it doesn't matter so much, and I can drop that part of the
patch...
Thanks for looking!
Eddie
>
> Cheers,
>
>
> Jeremy
@@ -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);