[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <1321630233.21392.43.camel@zalecze.wat.corp.google.com>
Date: Fri, 18 Nov 2011 10:30:33 -0500
From: Wojciech Baranowski <baranowski@...omium.org>
To: Grant Likely <grant.likely@...retlab.ca>,
Rob Herring <rob.herring@...xeda.com>,
devicetree-discuss@...ts.ozlabs.org
Cc: linux-kernel@...r.kernel.org
Subject: [PATCH] of/device: Obtain platform dev name and id from bus_id
When adding new platform device, parse platform_device.dev.bus_id (used as
device name) to get platform_device.name and platform_device.id before
calling device_add. If bus_id cannot be split into name and id, fallback to
the old way.
Currently the name is being set to bus_id and id is being set to -1, even
when bus_id is in the form "some_name.some_number". This might lead to
problems with device-driver matching and index out of bounds error. It is
also not consistent with how the bus_id is generated from name and id.
Signed-off-by: Wojciech Baranowski <baranowski@...omium.org>
---
drivers/of/device.c | 43 +++++++++++++++++++++++++++++++++++++++----
1 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/drivers/of/device.c b/drivers/of/device.c
index 62b4b32..8758c3f 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -47,14 +47,49 @@ void of_dev_put(struct platform_device *dev)
}
EXPORT_SYMBOL(of_dev_put);
+static int of_dev_parse_devname(struct platform_device *ofdev)
+{
+ const char *name;
+ const char *dot_pos;
+ char *short_name;
+
+ name = dev_name(&ofdev->dev);
+ if (!name)
+ goto std_out;
+
+ dot_pos = strrchr(name, '.');
+ if (!dot_pos)
+ goto std_out;
+
+ short_name = kmalloc(dot_pos - name + 1, GFP_KERNEL);
+ if (!short_name)
+ return -ENOMEM;
+
+ strlcpy(short_name, name, dot_pos - name + 1);
+ ofdev->name = short_name;
+
+ if (kstrtoint(dot_pos + 1, 10, &ofdev->id))
+ goto kfree_out;
+
+ return 0;
+
+kfree_out:
+ kfree(short_name);
+std_out:
+ ofdev->name = name;
+ ofdev->id = -1;
+ return 0;
+}
+
int of_device_add(struct platform_device *ofdev)
{
+ int ret;
+
BUG_ON(ofdev->dev.of_node == NULL);
- /* name and id have to be set so that the platform bus doesn't get
- * confused on matching */
- ofdev->name = dev_name(&ofdev->dev);
- ofdev->id = -1;
+ ret = of_dev_parse_devname(ofdev);
+ if (ret)
+ return ret;
/* device_add will assume that this device is on the same node as
* the parent. If there is no parent defined, set the node
--
1.7.3.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists