@@ -178,7 +178,6 @@ struct tegra_devfreq_soc_data {
178178
179179struct tegra_devfreq {
180180 struct devfreq * devfreq ;
181- struct opp_table * opp_table ;
182181
183182 struct reset_control * reset ;
184183 struct clk * clock ;
@@ -789,6 +788,39 @@ static struct devfreq_governor tegra_devfreq_governor = {
789788 .event_handler = tegra_governor_event_handler ,
790789};
791790
791+ static void devm_tegra_devfreq_deinit_hw (void * data )
792+ {
793+ struct tegra_devfreq * tegra = data ;
794+
795+ reset_control_reset (tegra -> reset );
796+ clk_disable_unprepare (tegra -> clock );
797+ }
798+
799+ static int devm_tegra_devfreq_init_hw (struct device * dev ,
800+ struct tegra_devfreq * tegra )
801+ {
802+ int err ;
803+
804+ err = clk_prepare_enable (tegra -> clock );
805+ if (err ) {
806+ dev_err (dev , "Failed to prepare and enable ACTMON clock\n" );
807+ return err ;
808+ }
809+
810+ err = devm_add_action_or_reset (dev , devm_tegra_devfreq_deinit_hw ,
811+ tegra );
812+ if (err )
813+ return err ;
814+
815+ err = reset_control_reset (tegra -> reset );
816+ if (err ) {
817+ dev_err (dev , "Failed to reset hardware: %d\n" , err );
818+ return err ;
819+ }
820+
821+ return err ;
822+ }
823+
792824static int tegra_devfreq_probe (struct platform_device * pdev )
793825{
794826 u32 hw_version = BIT (tegra_sku_info .soc_speedo_id );
@@ -842,38 +874,26 @@ static int tegra_devfreq_probe(struct platform_device *pdev)
842874 return err ;
843875 }
844876
845- tegra -> opp_table = dev_pm_opp_set_supported_hw (& pdev -> dev ,
846- & hw_version , 1 );
847- err = PTR_ERR_OR_ZERO (tegra -> opp_table );
877+ err = devm_pm_opp_set_supported_hw (& pdev -> dev , & hw_version , 1 );
848878 if (err ) {
849879 dev_err (& pdev -> dev , "Failed to set supported HW: %d\n" , err );
850880 return err ;
851881 }
852882
853- err = dev_pm_opp_of_add_table_noclk (& pdev -> dev , 0 );
883+ err = devm_pm_opp_of_add_table_noclk (& pdev -> dev , 0 );
854884 if (err ) {
855885 dev_err (& pdev -> dev , "Failed to add OPP table: %d\n" , err );
856- goto put_hw ;
857- }
858-
859- err = clk_prepare_enable (tegra -> clock );
860- if (err ) {
861- dev_err (& pdev -> dev ,
862- "Failed to prepare and enable ACTMON clock\n" );
863- goto remove_table ;
886+ return err ;
864887 }
865888
866- err = reset_control_reset (tegra -> reset );
867- if (err ) {
868- dev_err (& pdev -> dev , "Failed to reset hardware: %d\n" , err );
869- goto disable_clk ;
870- }
889+ err = devm_tegra_devfreq_init_hw (& pdev -> dev , tegra );
890+ if (err )
891+ return err ;
871892
872893 rate = clk_round_rate (tegra -> emc_clock , ULONG_MAX );
873- if (rate < 0 ) {
894+ if (rate <= 0 ) {
874895 dev_err (& pdev -> dev , "Failed to round clock rate: %ld\n" , rate );
875- err = rate ;
876- goto disable_clk ;
896+ return rate ?: - EINVAL ;
877897 }
878898
879899 tegra -> max_freq = rate / KHZ ;
@@ -892,52 +912,18 @@ static int tegra_devfreq_probe(struct platform_device *pdev)
892912 INIT_DELAYED_WORK (& tegra -> cpufreq_update_work ,
893913 tegra_actmon_delayed_update );
894914
895- err = devfreq_add_governor ( & tegra_devfreq_governor );
915+ err = devm_devfreq_add_governor ( & pdev -> dev , & tegra_devfreq_governor );
896916 if (err ) {
897917 dev_err (& pdev -> dev , "Failed to add governor: %d\n" , err );
898- goto remove_opps ;
918+ return err ;
899919 }
900920
901921 tegra_devfreq_profile .initial_freq = clk_get_rate (tegra -> emc_clock );
902922
903- devfreq = devfreq_add_device (& pdev -> dev , & tegra_devfreq_profile ,
904- "tegra_actmon" , NULL );
905- if (IS_ERR (devfreq )) {
906- err = PTR_ERR (devfreq );
907- goto remove_governor ;
908- }
909-
910- return 0 ;
911-
912- remove_governor :
913- devfreq_remove_governor (& tegra_devfreq_governor );
914-
915- remove_opps :
916- dev_pm_opp_remove_all_dynamic (& pdev -> dev );
917-
918- reset_control_reset (tegra -> reset );
919- disable_clk :
920- clk_disable_unprepare (tegra -> clock );
921- remove_table :
922- dev_pm_opp_of_remove_table (& pdev -> dev );
923- put_hw :
924- dev_pm_opp_put_supported_hw (tegra -> opp_table );
925-
926- return err ;
927- }
928-
929- static int tegra_devfreq_remove (struct platform_device * pdev )
930- {
931- struct tegra_devfreq * tegra = platform_get_drvdata (pdev );
932-
933- devfreq_remove_device (tegra -> devfreq );
934- devfreq_remove_governor (& tegra_devfreq_governor );
935-
936- reset_control_reset (tegra -> reset );
937- clk_disable_unprepare (tegra -> clock );
938-
939- dev_pm_opp_of_remove_table (& pdev -> dev );
940- dev_pm_opp_put_supported_hw (tegra -> opp_table );
923+ devfreq = devm_devfreq_add_device (& pdev -> dev , & tegra_devfreq_profile ,
924+ "tegra_actmon" , NULL );
925+ if (IS_ERR (devfreq ))
926+ return PTR_ERR (devfreq );
941927
942928 return 0 ;
943929}
@@ -967,7 +953,6 @@ MODULE_DEVICE_TABLE(of, tegra_devfreq_of_match);
967953
968954static struct platform_driver tegra_devfreq_driver = {
969955 .probe = tegra_devfreq_probe ,
970- .remove = tegra_devfreq_remove ,
971956 .driver = {
972957 .name = "tegra-devfreq" ,
973958 .of_match_table = tegra_devfreq_of_match ,
0 commit comments