diff options
Diffstat (limited to 'drivers/spmi/spmi.c')
| -rw-r--r-- | drivers/spmi/spmi.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/spmi/spmi.c b/drivers/spmi/spmi.c index f5c9d2f9b22..fcac889373a 100644 --- a/drivers/spmi/spmi.c +++ b/drivers/spmi/spmi.c @@ -32,9 +32,9 @@ struct spmii_boardinfo { static DEFINE_MUTEX(board_lock); static LIST_HEAD(board_list); static DEFINE_IDR(ctrl_idr); -static struct device_type spmi_ctrl_type = { 0 }; - -#define to_spmi(dev) platform_get_drvdata(to_platform_device(dev)) +static DEFINE_IDA(spmi_devid_ida); +static struct device_type spmi_dev_type; +static struct device_type spmi_ctrl_type; /* Forward declarations */ struct bus_type spmi_bus_type; @@ -188,22 +188,32 @@ int spmi_add_device(struct spmi_device *spmidev) { int rc; struct device *dev = get_valid_device(spmidev); + int id; if (!dev) { pr_err("%s: invalid SPMI device\n", __func__); return -EINVAL; } + id = ida_simple_get(&spmi_devid_ida, 0, 0, GFP_KERNEL); + if (id < 0) { + pr_err("No id available status = %d\n", id); + return id; + } + /* Set the device name */ - dev_set_name(dev, "%s-%p", spmidev->name, spmidev); + spmidev->id = id; + dev_set_name(dev, "%s-%d", spmidev->name, spmidev->id); /* Device may be bound to an active driver when this returns */ rc = device_add(dev); - if (rc < 0) + if (rc < 0) { + ida_simple_remove(&spmi_devid_ida, spmidev->id); dev_err(dev, "Can't add %s, status %d\n", dev_name(dev), rc); - else + } else { dev_dbg(dev, "device %s registered\n", dev_name(dev)); + } return rc; } @@ -251,6 +261,7 @@ EXPORT_SYMBOL_GPL(spmi_new_device); void spmi_remove_device(struct spmi_device *spmi_dev) { device_unregister(&spmi_dev->dev); + ida_simple_remove(&spmi_devid_ida, spmi_dev->id); } EXPORT_SYMBOL_GPL(spmi_remove_device); |
