@@ -400,7 +400,8 @@ field##_store(struct device *dev, struct device_attribute *attr, \
400400 const char *buf, size_t sz) \
401401{ \
402402 struct rpmsg_device *rpdev = to_rpmsg_device(dev); \
403- char *new, *old; \
403+ const char *old; \
404+ char *new; \
404405 \
405406 new = kstrndup(buf, sz, GFP_KERNEL); \
406407 if (!new) \
@@ -525,7 +526,7 @@ static int rpmsg_dev_probe(struct device *dev)
525526 goto out ;
526527
527528 if (rpdrv -> callback ) {
528- strncpy (chinfo .name , rpdev -> id .name , RPMSG_NAME_SIZE );
529+ strscpy (chinfo .name , rpdev -> id .name , sizeof ( chinfo . name ) );
529530 chinfo .src = rpdev -> src ;
530531 chinfo .dst = RPMSG_ADDR_ANY ;
531532
@@ -592,24 +593,52 @@ static struct bus_type rpmsg_bus = {
592593 .remove = rpmsg_dev_remove ,
593594};
594595
595- int rpmsg_register_device (struct rpmsg_device * rpdev )
596+ /*
597+ * A helper for registering rpmsg device with driver override and name.
598+ * Drivers should not be using it, but instead rpmsg_register_device().
599+ */
600+ int rpmsg_register_device_override (struct rpmsg_device * rpdev ,
601+ const char * driver_override )
596602{
597603 struct device * dev = & rpdev -> dev ;
598604 int ret ;
599605
600- dev_set_name (& rpdev -> dev , "%s.%s.%d.%d" , dev_name (dev -> parent ),
606+ if (driver_override )
607+ strscpy_pad (rpdev -> id .name , driver_override , RPMSG_NAME_SIZE );
608+
609+ dev_set_name (dev , "%s.%s.%d.%d" , dev_name (dev -> parent ),
601610 rpdev -> id .name , rpdev -> src , rpdev -> dst );
602611
603- rpdev -> dev .bus = & rpmsg_bus ;
612+ dev -> bus = & rpmsg_bus ;
613+
614+ device_initialize (dev );
615+ if (driver_override ) {
616+ ret = driver_set_override (dev , & rpdev -> driver_override ,
617+ driver_override ,
618+ strlen (driver_override ));
619+ if (ret ) {
620+ dev_err (dev , "device_set_override failed: %d\n" , ret );
621+ put_device (dev );
622+ return ret ;
623+ }
624+ }
604625
605- ret = device_register ( & rpdev -> dev );
626+ ret = device_add ( dev );
606627 if (ret ) {
607- dev_err (dev , "device_register failed: %d\n" , ret );
608- put_device (& rpdev -> dev );
628+ dev_err (dev , "device_add failed: %d\n" , ret );
629+ kfree (rpdev -> driver_override );
630+ rpdev -> driver_override = NULL ;
631+ put_device (dev );
609632 }
610633
611634 return ret ;
612635}
636+ EXPORT_SYMBOL (rpmsg_register_device_override );
637+
638+ int rpmsg_register_device (struct rpmsg_device * rpdev )
639+ {
640+ return rpmsg_register_device_override (rpdev , NULL );
641+ }
613642EXPORT_SYMBOL (rpmsg_register_device );
614643
615644/*
0 commit comments