forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
....@@ -553,7 +553,7 @@
553553 break;
554554 case GLINK_VERSION_1:
555555 glink->features &= features;
556
- /* FALLTHROUGH */
556
+ fallthrough;
557557 default:
558558 qcom_glink_send_version_ack(glink);
559559 break;
....@@ -584,7 +584,7 @@
584584 break;
585585
586586 glink->features &= features;
587
- /* FALLTHROUGH */
587
+ fallthrough;
588588 default:
589589 qcom_glink_send_version(glink);
590590 break;
....@@ -914,7 +914,7 @@
914914 struct intent_pair intents[];
915915 } __packed * msg;
916916
917
- const size_t msglen = sizeof(*msg) + sizeof(struct intent_pair) * count;
917
+ const size_t msglen = struct_size(msg, intents, count);
918918 int ret;
919919 int i;
920920 unsigned long flags;
....@@ -1472,7 +1472,7 @@
14721472 cancel_work_sync(&channel->intent_work);
14731473
14741474 if (channel->rpdev) {
1475
- strncpy(chinfo.name, channel->name, sizeof(chinfo.name));
1475
+ strscpy_pad(chinfo.name, channel->name, sizeof(chinfo.name));
14761476 chinfo.src = RPMSG_ADDR_ANY;
14771477 chinfo.dst = RPMSG_ADDR_ANY;
14781478
....@@ -1575,6 +1575,60 @@
15751575 kfree(dcmd);
15761576 }
15771577
1578
+static ssize_t rpmsg_name_show(struct device *dev,
1579
+ struct device_attribute *attr, char *buf)
1580
+{
1581
+ int ret = 0;
1582
+ const char *name;
1583
+
1584
+ ret = of_property_read_string(dev->of_node, "label", &name);
1585
+ if (ret < 0)
1586
+ name = dev->of_node->name;
1587
+
1588
+ return snprintf(buf, RPMSG_NAME_SIZE, "%s\n", name);
1589
+}
1590
+static DEVICE_ATTR_RO(rpmsg_name);
1591
+
1592
+static struct attribute *qcom_glink_attrs[] = {
1593
+ &dev_attr_rpmsg_name.attr,
1594
+ NULL
1595
+};
1596
+ATTRIBUTE_GROUPS(qcom_glink);
1597
+
1598
+static void qcom_glink_device_release(struct device *dev)
1599
+{
1600
+ struct rpmsg_device *rpdev = to_rpmsg_device(dev);
1601
+ struct glink_channel *channel = to_glink_channel(rpdev->ept);
1602
+
1603
+ /* Release qcom_glink_alloc_channel() reference */
1604
+ kref_put(&channel->refcount, qcom_glink_channel_release);
1605
+ kfree(rpdev);
1606
+}
1607
+
1608
+static int qcom_glink_create_chrdev(struct qcom_glink *glink)
1609
+{
1610
+ struct rpmsg_device *rpdev;
1611
+ struct glink_channel *channel;
1612
+
1613
+ rpdev = kzalloc(sizeof(*rpdev), GFP_KERNEL);
1614
+ if (!rpdev)
1615
+ return -ENOMEM;
1616
+
1617
+ channel = qcom_glink_alloc_channel(glink, "rpmsg_chrdev");
1618
+ if (IS_ERR(channel)) {
1619
+ kfree(rpdev);
1620
+ return PTR_ERR(channel);
1621
+ }
1622
+ channel->rpdev = rpdev;
1623
+
1624
+ rpdev->ept = &channel->ept;
1625
+ rpdev->ops = &glink_device_ops;
1626
+ rpdev->dev.parent = glink->dev;
1627
+ rpdev->dev.release = qcom_glink_device_release;
1628
+
1629
+ return rpmsg_chrdev_register_device(rpdev);
1630
+}
1631
+
15781632 struct qcom_glink *qcom_glink_native_probe(struct device *dev,
15791633 unsigned long features,
15801634 struct qcom_glink_pipe *rx,
....@@ -1605,6 +1659,12 @@
16051659 idr_init(&glink->lcids);
16061660 idr_init(&glink->rcids);
16071661
1662
+ glink->dev->groups = qcom_glink_groups;
1663
+
1664
+ ret = device_add_groups(dev, qcom_glink_groups);
1665
+ if (ret)
1666
+ dev_err(dev, "failed to add groups\n");
1667
+
16081668 ret = of_property_read_string(dev->of_node, "label", &glink->name);
16091669 if (ret < 0)
16101670 glink->name = dev->of_node->name;
....@@ -1634,6 +1694,10 @@
16341694 if (ret)
16351695 return ERR_PTR(ret);
16361696
1697
+ ret = qcom_glink_create_chrdev(glink);
1698
+ if (ret)
1699
+ dev_err(glink->dev, "failed to register chrdev\n");
1700
+
16371701 return glink;
16381702 }
16391703 EXPORT_SYMBOL_GPL(qcom_glink_native_probe);