0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #define pr_fmt(fmt) "%s: " fmt, __func__
0013
0014 #include <linux/kernel.h>
0015 #include <linux/module.h>
0016 #include <linux/rpmsg.h>
0017 #include <linux/of_device.h>
0018 #include <linux/pm_domain.h>
0019 #include <linux/slab.h>
0020
0021 #include "rpmsg_internal.h"
0022
0023 struct class *rpmsg_class;
0024 EXPORT_SYMBOL(rpmsg_class);
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 struct rpmsg_device *rpmsg_create_channel(struct rpmsg_device *rpdev,
0035 struct rpmsg_channel_info *chinfo)
0036 {
0037 if (WARN_ON(!rpdev))
0038 return NULL;
0039 if (!rpdev->ops || !rpdev->ops->create_channel) {
0040 dev_err(&rpdev->dev, "no create_channel ops found\n");
0041 return NULL;
0042 }
0043
0044 return rpdev->ops->create_channel(rpdev, chinfo);
0045 }
0046 EXPORT_SYMBOL(rpmsg_create_channel);
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056 int rpmsg_release_channel(struct rpmsg_device *rpdev,
0057 struct rpmsg_channel_info *chinfo)
0058 {
0059 if (WARN_ON(!rpdev))
0060 return -EINVAL;
0061 if (!rpdev->ops || !rpdev->ops->release_channel) {
0062 dev_err(&rpdev->dev, "no release_channel ops found\n");
0063 return -ENXIO;
0064 }
0065
0066 return rpdev->ops->release_channel(rpdev, chinfo);
0067 }
0068 EXPORT_SYMBOL(rpmsg_release_channel);
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110 struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *rpdev,
0111 rpmsg_rx_cb_t cb, void *priv,
0112 struct rpmsg_channel_info chinfo)
0113 {
0114 if (WARN_ON(!rpdev))
0115 return NULL;
0116
0117 return rpdev->ops->create_ept(rpdev, cb, priv, chinfo);
0118 }
0119 EXPORT_SYMBOL(rpmsg_create_ept);
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129 void rpmsg_destroy_ept(struct rpmsg_endpoint *ept)
0130 {
0131 if (ept && ept->ops)
0132 ept->ops->destroy_ept(ept);
0133 }
0134 EXPORT_SYMBOL(rpmsg_destroy_ept);
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154 int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len)
0155 {
0156 if (WARN_ON(!ept))
0157 return -EINVAL;
0158 if (!ept->ops->send)
0159 return -ENXIO;
0160
0161 return ept->ops->send(ept, data, len);
0162 }
0163 EXPORT_SYMBOL(rpmsg_send);
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183 int rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst)
0184 {
0185 if (WARN_ON(!ept))
0186 return -EINVAL;
0187 if (!ept->ops->sendto)
0188 return -ENXIO;
0189
0190 return ept->ops->sendto(ept, data, len, dst);
0191 }
0192 EXPORT_SYMBOL(rpmsg_sendto);
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst,
0215 void *data, int len)
0216 {
0217 if (WARN_ON(!ept))
0218 return -EINVAL;
0219 if (!ept->ops->send_offchannel)
0220 return -ENXIO;
0221
0222 return ept->ops->send_offchannel(ept, src, dst, data, len);
0223 }
0224 EXPORT_SYMBOL(rpmsg_send_offchannel);
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243 int rpmsg_trysend(struct rpmsg_endpoint *ept, void *data, int len)
0244 {
0245 if (WARN_ON(!ept))
0246 return -EINVAL;
0247 if (!ept->ops->trysend)
0248 return -ENXIO;
0249
0250 return ept->ops->trysend(ept, data, len);
0251 }
0252 EXPORT_SYMBOL(rpmsg_trysend);
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271 int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst)
0272 {
0273 if (WARN_ON(!ept))
0274 return -EINVAL;
0275 if (!ept->ops->trysendto)
0276 return -ENXIO;
0277
0278 return ept->ops->trysendto(ept, data, len, dst);
0279 }
0280 EXPORT_SYMBOL(rpmsg_trysendto);
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290 __poll_t rpmsg_poll(struct rpmsg_endpoint *ept, struct file *filp,
0291 poll_table *wait)
0292 {
0293 if (WARN_ON(!ept))
0294 return 0;
0295 if (!ept->ops->poll)
0296 return 0;
0297
0298 return ept->ops->poll(ept, filp, wait);
0299 }
0300 EXPORT_SYMBOL(rpmsg_poll);
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321 int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst,
0322 void *data, int len)
0323 {
0324 if (WARN_ON(!ept))
0325 return -EINVAL;
0326 if (!ept->ops->trysend_offchannel)
0327 return -ENXIO;
0328
0329 return ept->ops->trysend_offchannel(ept, src, dst, data, len);
0330 }
0331 EXPORT_SYMBOL(rpmsg_trysend_offchannel);
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343 ssize_t rpmsg_get_mtu(struct rpmsg_endpoint *ept)
0344 {
0345 if (WARN_ON(!ept))
0346 return -EINVAL;
0347 if (!ept->ops->get_mtu)
0348 return -ENOTSUPP;
0349
0350 return ept->ops->get_mtu(ept);
0351 }
0352 EXPORT_SYMBOL(rpmsg_get_mtu);
0353
0354
0355
0356
0357
0358
0359 static int rpmsg_device_match(struct device *dev, void *data)
0360 {
0361 struct rpmsg_channel_info *chinfo = data;
0362 struct rpmsg_device *rpdev = to_rpmsg_device(dev);
0363
0364 if (chinfo->src != RPMSG_ADDR_ANY && chinfo->src != rpdev->src)
0365 return 0;
0366
0367 if (chinfo->dst != RPMSG_ADDR_ANY && chinfo->dst != rpdev->dst)
0368 return 0;
0369
0370 if (strncmp(chinfo->name, rpdev->id.name, RPMSG_NAME_SIZE))
0371 return 0;
0372
0373
0374 return 1;
0375 }
0376
0377 struct device *rpmsg_find_device(struct device *parent,
0378 struct rpmsg_channel_info *chinfo)
0379 {
0380 return device_find_child(parent, chinfo, rpmsg_device_match);
0381
0382 }
0383 EXPORT_SYMBOL(rpmsg_find_device);
0384
0385
0386 #define rpmsg_show_attr(field, path, format_string) \
0387 static ssize_t \
0388 field##_show(struct device *dev, \
0389 struct device_attribute *attr, char *buf) \
0390 { \
0391 struct rpmsg_device *rpdev = to_rpmsg_device(dev); \
0392 \
0393 return sprintf(buf, format_string, rpdev->path); \
0394 } \
0395 static DEVICE_ATTR_RO(field);
0396
0397 #define rpmsg_string_attr(field, member) \
0398 static ssize_t \
0399 field##_store(struct device *dev, struct device_attribute *attr, \
0400 const char *buf, size_t sz) \
0401 { \
0402 struct rpmsg_device *rpdev = to_rpmsg_device(dev); \
0403 const char *old; \
0404 char *new; \
0405 \
0406 new = kstrndup(buf, sz, GFP_KERNEL); \
0407 if (!new) \
0408 return -ENOMEM; \
0409 new[strcspn(new, "\n")] = '\0'; \
0410 \
0411 device_lock(dev); \
0412 old = rpdev->member; \
0413 if (strlen(new)) { \
0414 rpdev->member = new; \
0415 } else { \
0416 kfree(new); \
0417 rpdev->member = NULL; \
0418 } \
0419 device_unlock(dev); \
0420 \
0421 kfree(old); \
0422 \
0423 return sz; \
0424 } \
0425 static ssize_t \
0426 field##_show(struct device *dev, \
0427 struct device_attribute *attr, char *buf) \
0428 { \
0429 struct rpmsg_device *rpdev = to_rpmsg_device(dev); \
0430 \
0431 return sprintf(buf, "%s\n", rpdev->member); \
0432 } \
0433 static DEVICE_ATTR_RW(field)
0434
0435
0436 rpmsg_show_attr(name, id.name, "%s\n");
0437 rpmsg_show_attr(src, src, "0x%x\n");
0438 rpmsg_show_attr(dst, dst, "0x%x\n");
0439 rpmsg_show_attr(announce, announce ? "true" : "false", "%s\n");
0440 rpmsg_string_attr(driver_override, driver_override);
0441
0442 static ssize_t modalias_show(struct device *dev,
0443 struct device_attribute *attr, char *buf)
0444 {
0445 struct rpmsg_device *rpdev = to_rpmsg_device(dev);
0446 ssize_t len;
0447
0448 len = of_device_modalias(dev, buf, PAGE_SIZE);
0449 if (len != -ENODEV)
0450 return len;
0451
0452 return sprintf(buf, RPMSG_DEVICE_MODALIAS_FMT "\n", rpdev->id.name);
0453 }
0454 static DEVICE_ATTR_RO(modalias);
0455
0456 static struct attribute *rpmsg_dev_attrs[] = {
0457 &dev_attr_name.attr,
0458 &dev_attr_modalias.attr,
0459 &dev_attr_dst.attr,
0460 &dev_attr_src.attr,
0461 &dev_attr_announce.attr,
0462 &dev_attr_driver_override.attr,
0463 NULL,
0464 };
0465 ATTRIBUTE_GROUPS(rpmsg_dev);
0466
0467
0468 static inline int rpmsg_id_match(const struct rpmsg_device *rpdev,
0469 const struct rpmsg_device_id *id)
0470 {
0471 return strncmp(id->name, rpdev->id.name, RPMSG_NAME_SIZE) == 0;
0472 }
0473
0474
0475 static int rpmsg_dev_match(struct device *dev, struct device_driver *drv)
0476 {
0477 struct rpmsg_device *rpdev = to_rpmsg_device(dev);
0478 struct rpmsg_driver *rpdrv = to_rpmsg_driver(drv);
0479 const struct rpmsg_device_id *ids = rpdrv->id_table;
0480 unsigned int i;
0481
0482 if (rpdev->driver_override)
0483 return !strcmp(rpdev->driver_override, drv->name);
0484
0485 if (ids)
0486 for (i = 0; ids[i].name[0]; i++)
0487 if (rpmsg_id_match(rpdev, &ids[i])) {
0488 rpdev->id.driver_data = ids[i].driver_data;
0489 return 1;
0490 }
0491
0492 return of_driver_match_device(dev, drv);
0493 }
0494
0495 static int rpmsg_uevent(struct device *dev, struct kobj_uevent_env *env)
0496 {
0497 struct rpmsg_device *rpdev = to_rpmsg_device(dev);
0498 int ret;
0499
0500 ret = of_device_uevent_modalias(dev, env);
0501 if (ret != -ENODEV)
0502 return ret;
0503
0504 return add_uevent_var(env, "MODALIAS=" RPMSG_DEVICE_MODALIAS_FMT,
0505 rpdev->id.name);
0506 }
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516 static int rpmsg_dev_probe(struct device *dev)
0517 {
0518 struct rpmsg_device *rpdev = to_rpmsg_device(dev);
0519 struct rpmsg_driver *rpdrv = to_rpmsg_driver(rpdev->dev.driver);
0520 struct rpmsg_channel_info chinfo = {};
0521 struct rpmsg_endpoint *ept = NULL;
0522 int err;
0523
0524 err = dev_pm_domain_attach(dev, true);
0525 if (err)
0526 goto out;
0527
0528 if (rpdrv->callback) {
0529 strncpy(chinfo.name, rpdev->id.name, RPMSG_NAME_SIZE);
0530 chinfo.src = rpdev->src;
0531 chinfo.dst = RPMSG_ADDR_ANY;
0532
0533 ept = rpmsg_create_ept(rpdev, rpdrv->callback, NULL, chinfo);
0534 if (!ept) {
0535 dev_err(dev, "failed to create endpoint\n");
0536 err = -ENOMEM;
0537 goto out;
0538 }
0539
0540 rpdev->ept = ept;
0541 rpdev->src = ept->addr;
0542 }
0543
0544 err = rpdrv->probe(rpdev);
0545 if (err) {
0546 dev_err(dev, "%s: failed: %d\n", __func__, err);
0547 goto destroy_ept;
0548 }
0549
0550 if (ept && rpdev->ops->announce_create) {
0551 err = rpdev->ops->announce_create(rpdev);
0552 if (err) {
0553 dev_err(dev, "failed to announce creation\n");
0554 goto remove_rpdev;
0555 }
0556 }
0557
0558 return 0;
0559
0560 remove_rpdev:
0561 if (rpdrv->remove)
0562 rpdrv->remove(rpdev);
0563 destroy_ept:
0564 if (ept)
0565 rpmsg_destroy_ept(ept);
0566 out:
0567 return err;
0568 }
0569
0570 static void rpmsg_dev_remove(struct device *dev)
0571 {
0572 struct rpmsg_device *rpdev = to_rpmsg_device(dev);
0573 struct rpmsg_driver *rpdrv = to_rpmsg_driver(rpdev->dev.driver);
0574
0575 if (rpdev->ops->announce_destroy)
0576 rpdev->ops->announce_destroy(rpdev);
0577
0578 if (rpdrv->remove)
0579 rpdrv->remove(rpdev);
0580
0581 dev_pm_domain_detach(dev, true);
0582
0583 if (rpdev->ept)
0584 rpmsg_destroy_ept(rpdev->ept);
0585 }
0586
0587 static struct bus_type rpmsg_bus = {
0588 .name = "rpmsg",
0589 .match = rpmsg_dev_match,
0590 .dev_groups = rpmsg_dev_groups,
0591 .uevent = rpmsg_uevent,
0592 .probe = rpmsg_dev_probe,
0593 .remove = rpmsg_dev_remove,
0594 };
0595
0596
0597
0598
0599
0600 int rpmsg_register_device_override(struct rpmsg_device *rpdev,
0601 const char *driver_override)
0602 {
0603 struct device *dev = &rpdev->dev;
0604 int ret;
0605
0606 if (driver_override)
0607 strscpy_pad(rpdev->id.name, driver_override, RPMSG_NAME_SIZE);
0608
0609 dev_set_name(dev, "%s.%s.%d.%d", dev_name(dev->parent),
0610 rpdev->id.name, rpdev->src, rpdev->dst);
0611
0612 dev->bus = &rpmsg_bus;
0613
0614 device_initialize(dev);
0615 if (driver_override) {
0616 ret = driver_set_override(dev, &rpdev->driver_override,
0617 driver_override,
0618 strlen(driver_override));
0619 if (ret) {
0620 dev_err(dev, "device_set_override failed: %d\n", ret);
0621 put_device(dev);
0622 return ret;
0623 }
0624 }
0625
0626 ret = device_add(dev);
0627 if (ret) {
0628 dev_err(dev, "device_add failed: %d\n", ret);
0629 kfree(rpdev->driver_override);
0630 rpdev->driver_override = NULL;
0631 put_device(dev);
0632 }
0633
0634 return ret;
0635 }
0636 EXPORT_SYMBOL(rpmsg_register_device_override);
0637
0638 int rpmsg_register_device(struct rpmsg_device *rpdev)
0639 {
0640 return rpmsg_register_device_override(rpdev, NULL);
0641 }
0642 EXPORT_SYMBOL(rpmsg_register_device);
0643
0644
0645
0646
0647
0648 int rpmsg_unregister_device(struct device *parent,
0649 struct rpmsg_channel_info *chinfo)
0650 {
0651 struct device *dev;
0652
0653 dev = rpmsg_find_device(parent, chinfo);
0654 if (!dev)
0655 return -EINVAL;
0656
0657 device_unregister(dev);
0658
0659 put_device(dev);
0660
0661 return 0;
0662 }
0663 EXPORT_SYMBOL(rpmsg_unregister_device);
0664
0665
0666
0667
0668
0669
0670
0671
0672 int __register_rpmsg_driver(struct rpmsg_driver *rpdrv, struct module *owner)
0673 {
0674 rpdrv->drv.bus = &rpmsg_bus;
0675 rpdrv->drv.owner = owner;
0676 return driver_register(&rpdrv->drv);
0677 }
0678 EXPORT_SYMBOL(__register_rpmsg_driver);
0679
0680
0681
0682
0683
0684
0685
0686 void unregister_rpmsg_driver(struct rpmsg_driver *rpdrv)
0687 {
0688 driver_unregister(&rpdrv->drv);
0689 }
0690 EXPORT_SYMBOL(unregister_rpmsg_driver);
0691
0692
0693 static int __init rpmsg_init(void)
0694 {
0695 int ret;
0696
0697 rpmsg_class = class_create(THIS_MODULE, "rpmsg");
0698 if (IS_ERR(rpmsg_class)) {
0699 pr_err("failed to create rpmsg class\n");
0700 return PTR_ERR(rpmsg_class);
0701 }
0702
0703 ret = bus_register(&rpmsg_bus);
0704 if (ret) {
0705 pr_err("failed to register rpmsg bus: %d\n", ret);
0706 class_destroy(rpmsg_class);
0707 }
0708 return ret;
0709 }
0710 postcore_initcall(rpmsg_init);
0711
0712 static void __exit rpmsg_fini(void)
0713 {
0714 bus_unregister(&rpmsg_bus);
0715 class_destroy(rpmsg_class);
0716 }
0717 module_exit(rpmsg_fini);
0718
0719 MODULE_DESCRIPTION("remote processor messaging bus");
0720 MODULE_LICENSE("GPL v2");