diff options
author | Bjorn Andersson <bjorn.andersson@linaro.org> | 2016-12-02 17:06:02 -0500 |
---|---|---|
committer | Bjorn Andersson <bjorn.andersson@linaro.org> | 2017-01-18 13:43:15 -0500 |
commit | 5e53c42c33bbde53a2650c6aa7201ec63bbfdc49 (patch) | |
tree | 16ad2ddbacd6d840977ee9cf18d6b38180bee088 | |
parent | 49def1853334396f948dcb4cedb9347abb318df5 (diff) |
rpmsg: qcom_smd: Add support for "label" property
Add support for the "label" property, used to give the edge a name other
than the one of the DT node. This allows the implementor to provide
consistently named edges when using the rpmsg character device.
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
-rw-r--r-- | drivers/rpmsg/qcom_smd.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c index 0fae48116a0d..3dd73edaa525 100644 --- a/drivers/rpmsg/qcom_smd.c +++ b/drivers/rpmsg/qcom_smd.c | |||
@@ -117,6 +117,8 @@ static const struct { | |||
117 | struct qcom_smd_edge { | 117 | struct qcom_smd_edge { |
118 | struct device dev; | 118 | struct device dev; |
119 | 119 | ||
120 | const char *name; | ||
121 | |||
120 | struct device_node *of_node; | 122 | struct device_node *of_node; |
121 | unsigned edge_id; | 123 | unsigned edge_id; |
122 | unsigned remote_pid; | 124 | unsigned remote_pid; |
@@ -1248,6 +1250,10 @@ static int qcom_smd_parse_edge(struct device *dev, | |||
1248 | return -EINVAL; | 1250 | return -EINVAL; |
1249 | } | 1251 | } |
1250 | 1252 | ||
1253 | ret = of_property_read_string(node, "label", &edge->name); | ||
1254 | if (ret < 0) | ||
1255 | edge->name = node->name; | ||
1256 | |||
1251 | irq = irq_of_parse_and_map(node, 0); | 1257 | irq = irq_of_parse_and_map(node, 0); |
1252 | if (irq < 0) { | 1258 | if (irq < 0) { |
1253 | dev_err(dev, "required smd interrupt missing\n"); | 1259 | dev_err(dev, "required smd interrupt missing\n"); |
@@ -1285,6 +1291,21 @@ static void qcom_smd_edge_release(struct device *dev) | |||
1285 | kfree(edge); | 1291 | kfree(edge); |
1286 | } | 1292 | } |
1287 | 1293 | ||
1294 | static ssize_t rpmsg_name_show(struct device *dev, | ||
1295 | struct device_attribute *attr, char *buf) | ||
1296 | { | ||
1297 | struct qcom_smd_edge *edge = to_smd_edge(dev); | ||
1298 | |||
1299 | return sprintf(buf, "%s\n", edge->name); | ||
1300 | } | ||
1301 | static DEVICE_ATTR_RO(rpmsg_name); | ||
1302 | |||
1303 | static struct attribute *qcom_smd_edge_attrs[] = { | ||
1304 | &dev_attr_rpmsg_name.attr, | ||
1305 | NULL | ||
1306 | }; | ||
1307 | ATTRIBUTE_GROUPS(qcom_smd_edge); | ||
1308 | |||
1288 | /** | 1309 | /** |
1289 | * qcom_smd_register_edge() - register an edge based on an device_node | 1310 | * qcom_smd_register_edge() - register an edge based on an device_node |
1290 | * @parent: parent device for the edge | 1311 | * @parent: parent device for the edge |
@@ -1306,6 +1327,7 @@ struct qcom_smd_edge *qcom_smd_register_edge(struct device *parent, | |||
1306 | 1327 | ||
1307 | edge->dev.parent = parent; | 1328 | edge->dev.parent = parent; |
1308 | edge->dev.release = qcom_smd_edge_release; | 1329 | edge->dev.release = qcom_smd_edge_release; |
1330 | edge->dev.groups = qcom_smd_edge_groups; | ||
1309 | dev_set_name(&edge->dev, "%s:%s", dev_name(parent), node->name); | 1331 | dev_set_name(&edge->dev, "%s:%s", dev_name(parent), node->name); |
1310 | ret = device_register(&edge->dev); | 1332 | ret = device_register(&edge->dev); |
1311 | if (ret) { | 1333 | if (ret) { |