@@ -3125,21 +3125,21 @@ static int tegra_sor_init(struct host1x_client *client)
31253125 if (err < 0 ) {
31263126 dev_err (sor -> dev , "failed to acquire SOR reset: %d\n" ,
31273127 err );
3128- return err ;
3128+ goto rpm_put ;
31293129 }
31303130
31313131 err = reset_control_assert (sor -> rst );
31323132 if (err < 0 ) {
31333133 dev_err (sor -> dev , "failed to assert SOR reset: %d\n" ,
31343134 err );
3135- return err ;
3135+ goto rpm_put ;
31363136 }
31373137 }
31383138
31393139 err = clk_prepare_enable (sor -> clk );
31403140 if (err < 0 ) {
31413141 dev_err (sor -> dev , "failed to enable clock: %d\n" , err );
3142- return err ;
3142+ goto rpm_put ;
31433143 }
31443144
31453145 usleep_range (1000 , 3000 );
@@ -3150,7 +3150,7 @@ static int tegra_sor_init(struct host1x_client *client)
31503150 dev_err (sor -> dev , "failed to deassert SOR reset: %d\n" ,
31513151 err );
31523152 clk_disable_unprepare (sor -> clk );
3153- return err ;
3153+ goto rpm_put ;
31543154 }
31553155
31563156 reset_control_release (sor -> rst );
@@ -3171,6 +3171,12 @@ static int tegra_sor_init(struct host1x_client *client)
31713171 }
31723172
31733173 return 0 ;
3174+
3175+ rpm_put :
3176+ if (sor -> rst )
3177+ pm_runtime_put (sor -> dev );
3178+
3179+ return err ;
31743180}
31753181
31763182static int tegra_sor_exit (struct host1x_client * client )
@@ -3739,12 +3745,8 @@ static int tegra_sor_probe(struct platform_device *pdev)
37393745 if (!sor -> aux )
37403746 return - EPROBE_DEFER ;
37413747
3742- if (get_device (& sor -> aux -> ddc .dev )) {
3743- if (try_module_get (sor -> aux -> ddc .owner ))
3744- sor -> output .ddc = & sor -> aux -> ddc ;
3745- else
3746- put_device (& sor -> aux -> ddc .dev );
3747- }
3748+ if (get_device (sor -> aux -> dev ))
3749+ sor -> output .ddc = & sor -> aux -> ddc ;
37483750 }
37493751
37503752 if (!sor -> aux ) {
@@ -3772,12 +3774,13 @@ static int tegra_sor_probe(struct platform_device *pdev)
37723774
37733775 err = tegra_sor_parse_dt (sor );
37743776 if (err < 0 )
3775- return err ;
3777+ goto put_aux ;
37763778
37773779 err = tegra_output_probe (& sor -> output );
3778- if (err < 0 )
3779- return dev_err_probe (& pdev -> dev , err ,
3780- "failed to probe output\n" );
3780+ if (err < 0 ) {
3781+ dev_err_probe (& pdev -> dev , err , "failed to probe output\n" );
3782+ goto put_aux ;
3783+ }
37813784
37823785 if (sor -> ops && sor -> ops -> probe ) {
37833786 err = sor -> ops -> probe (sor );
@@ -3916,17 +3919,10 @@ static int tegra_sor_probe(struct platform_device *pdev)
39163919 platform_set_drvdata (pdev , sor );
39173920 pm_runtime_enable (& pdev -> dev );
39183921
3919- INIT_LIST_HEAD (& sor -> client . list );
3922+ host1x_client_init (& sor -> client );
39203923 sor -> client .ops = & sor_client_ops ;
39213924 sor -> client .dev = & pdev -> dev ;
39223925
3923- err = host1x_client_register (& sor -> client );
3924- if (err < 0 ) {
3925- dev_err (& pdev -> dev , "failed to register host1x client: %d\n" ,
3926- err );
3927- goto rpm_disable ;
3928- }
3929-
39303926 /*
39313927 * On Tegra210 and earlier, provide our own implementation for the
39323928 * pad output clock.
@@ -3938,13 +3934,13 @@ static int tegra_sor_probe(struct platform_device *pdev)
39383934 sor -> index );
39393935 if (!name ) {
39403936 err = - ENOMEM ;
3941- goto unregister ;
3937+ goto uninit ;
39423938 }
39433939
39443940 err = host1x_client_resume (& sor -> client );
39453941 if (err < 0 ) {
39463942 dev_err (sor -> dev , "failed to resume: %d\n" , err );
3947- goto unregister ;
3943+ goto uninit ;
39483944 }
39493945
39503946 sor -> clk_pad = tegra_clk_sor_pad_register (sor , name );
@@ -3955,17 +3951,30 @@ static int tegra_sor_probe(struct platform_device *pdev)
39553951 err = PTR_ERR (sor -> clk_pad );
39563952 dev_err (sor -> dev , "failed to register SOR pad clock: %d\n" ,
39573953 err );
3958- goto unregister ;
3954+ goto uninit ;
3955+ }
3956+
3957+ err = __host1x_client_register (& sor -> client );
3958+ if (err < 0 ) {
3959+ dev_err (& pdev -> dev , "failed to register host1x client: %d\n" ,
3960+ err );
3961+ goto uninit ;
39593962 }
39603963
39613964 return 0 ;
39623965
3963- unregister :
3964- host1x_client_unregister (& sor -> client );
3965- rpm_disable :
3966+ uninit :
3967+ host1x_client_exit (& sor -> client );
39663968 pm_runtime_disable (& pdev -> dev );
39673969remove :
3970+ if (sor -> aux )
3971+ sor -> output .ddc = NULL ;
3972+
39683973 tegra_output_remove (& sor -> output );
3974+ put_aux :
3975+ if (sor -> aux )
3976+ put_device (sor -> aux -> dev );
3977+
39693978 return err ;
39703979}
39713980
@@ -3983,6 +3992,11 @@ static int tegra_sor_remove(struct platform_device *pdev)
39833992
39843993 pm_runtime_disable (& pdev -> dev );
39853994
3995+ if (sor -> aux ) {
3996+ put_device (sor -> aux -> dev );
3997+ sor -> output .ddc = NULL ;
3998+ }
3999+
39864000 tegra_output_remove (& sor -> output );
39874001
39884002 return 0 ;
0 commit comments