3636#include <linux/sysfs.h>
3737#include <linux/types.h>
3838
39- #include "dev-sync-probe.h"
40-
4139#define GPIO_SIM_NGPIO_MAX 1024
4240#define GPIO_SIM_PROP_MAX 5 /* Max 4 properties + sentinel. */
4341#define GPIO_SIM_HOG_PROP_MAX 5
@@ -546,7 +544,7 @@ static struct platform_driver gpio_sim_driver = {
546544};
547545
548546struct gpio_sim_device {
549- struct dev_sync_probe_data probe_data ;
547+ struct platform_device * pdev ;
550548 struct config_group group ;
551549
552550 int id ;
@@ -673,7 +671,7 @@ static bool gpio_sim_device_is_live(struct gpio_sim_device *dev)
673671{
674672 lockdep_assert_held (& dev -> lock );
675673
676- return !!dev -> probe_data . pdev ;
674+ return !!dev -> pdev ;
677675}
678676
679677static char * gpio_sim_strdup_trimmed (const char * str , size_t count )
@@ -695,7 +693,7 @@ static ssize_t gpio_sim_device_config_dev_name_show(struct config_item *item,
695693
696694 guard (mutex )(& dev -> lock );
697695
698- pdev = dev -> probe_data . pdev ;
696+ pdev = dev -> pdev ;
699697 if (pdev )
700698 return sprintf (page , "%s\n" , dev_name (& pdev -> dev ));
701699
@@ -900,6 +898,7 @@ static bool gpio_sim_bank_labels_non_unique(struct gpio_sim_device *dev)
900898static int gpio_sim_device_activate (struct gpio_sim_device * dev )
901899{
902900 struct platform_device_info pdevinfo ;
901+ struct platform_device * pdev ;
903902 struct fwnode_handle * swnode ;
904903 struct gpio_sim_bank * bank ;
905904 int ret ;
@@ -927,28 +926,39 @@ static int gpio_sim_device_activate(struct gpio_sim_device *dev)
927926 bank -> swnode = gpio_sim_make_bank_swnode (bank , swnode );
928927 if (IS_ERR (bank -> swnode )) {
929928 ret = PTR_ERR (bank -> swnode );
930- gpio_sim_remove_swnode_recursive (swnode );
931- return ret ;
929+ goto err_remove_swnode ;
932930 }
933931
934932 ret = gpio_sim_bank_add_hogs (bank );
935- if (ret ) {
936- gpio_sim_remove_swnode_recursive (swnode );
937- return ret ;
938- }
933+ if (ret )
934+ goto err_remove_swnode ;
939935 }
940936
941937 pdevinfo .name = "gpio-sim" ;
942938 pdevinfo .fwnode = swnode ;
943939 pdevinfo .id = dev -> id ;
944940
945- ret = dev_sync_probe_register (& dev -> probe_data , & pdevinfo );
946- if (ret ) {
947- gpio_sim_remove_swnode_recursive (swnode );
948- return ret ;
941+ pdev = platform_device_register_full (& pdevinfo );
942+ if (IS_ERR (pdev )) {
943+ ret = PTR_ERR (pdev );
944+ goto err_remove_swnode ;
945+ }
946+
947+ wait_for_device_probe ();
948+ if (!device_is_bound (& pdev -> dev )) {
949+ ret = - ENXIO ;
950+ goto err_unregister_pdev ;
949951 }
950952
953+ dev -> pdev = pdev ;
951954 return 0 ;
955+
956+ err_unregister_pdev :
957+ platform_device_unregister (pdev );
958+ err_remove_swnode :
959+ gpio_sim_remove_swnode_recursive (swnode );
960+
961+ return ret ;
952962}
953963
954964static void gpio_sim_device_deactivate (struct gpio_sim_device * dev )
@@ -957,8 +967,9 @@ static void gpio_sim_device_deactivate(struct gpio_sim_device *dev)
957967
958968 lockdep_assert_held (& dev -> lock );
959969
960- swnode = dev_fwnode (& dev -> probe_data .pdev -> dev );
961- dev_sync_probe_unregister (& dev -> probe_data );
970+ swnode = dev_fwnode (& dev -> pdev -> dev );
971+ platform_device_unregister (dev -> pdev );
972+ dev -> pdev = NULL ;
962973 gpio_sim_remove_swnode_recursive (swnode );
963974}
964975
@@ -1060,7 +1071,7 @@ static ssize_t gpio_sim_bank_config_chip_name_show(struct config_item *item,
10601071 guard (mutex )(& dev -> lock );
10611072
10621073 if (gpio_sim_device_is_live (dev ))
1063- return device_for_each_child (& dev -> probe_data . pdev -> dev , & ctx ,
1074+ return device_for_each_child (& dev -> pdev -> dev , & ctx ,
10641075 gpio_sim_emit_chip_name );
10651076
10661077 return sprintf (page , "none\n" );
@@ -1571,8 +1582,6 @@ gpio_sim_config_make_device_group(struct config_group *group, const char *name)
15711582 mutex_init (& dev -> lock );
15721583 INIT_LIST_HEAD (& dev -> bank_list );
15731584
1574- dev_sync_probe_init (& dev -> probe_data );
1575-
15761585 return & no_free_ptr (dev )-> group ;
15771586}
15781587
0 commit comments