@@ -178,7 +178,6 @@ struct tegra_devfreq_soc_data {
178
178
179
179
struct tegra_devfreq {
180
180
struct devfreq * devfreq ;
181
- struct opp_table * opp_table ;
182
181
183
182
struct reset_control * reset ;
184
183
struct clk * clock ;
@@ -789,6 +788,39 @@ static struct devfreq_governor tegra_devfreq_governor = {
789
788
.event_handler = tegra_governor_event_handler ,
790
789
};
791
790
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
+
792
824
static int tegra_devfreq_probe (struct platform_device * pdev )
793
825
{
794
826
u32 hw_version = BIT (tegra_sku_info .soc_speedo_id );
@@ -842,38 +874,26 @@ static int tegra_devfreq_probe(struct platform_device *pdev)
842
874
return err ;
843
875
}
844
876
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 );
848
878
if (err ) {
849
879
dev_err (& pdev -> dev , "Failed to set supported HW: %d\n" , err );
850
880
return err ;
851
881
}
852
882
853
- err = dev_pm_opp_of_add_table_noclk (& pdev -> dev , 0 );
883
+ err = devm_pm_opp_of_add_table_noclk (& pdev -> dev , 0 );
854
884
if (err ) {
855
885
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 ;
864
887
}
865
888
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 ;
871
892
872
893
rate = clk_round_rate (tegra -> emc_clock , ULONG_MAX );
873
894
if (rate < 0 ) {
874
895
dev_err (& pdev -> dev , "Failed to round clock rate: %ld\n" , rate );
875
- err = rate ;
876
- goto disable_clk ;
896
+ return rate ;
877
897
}
878
898
879
899
tegra -> max_freq = rate / KHZ ;
@@ -892,52 +912,18 @@ static int tegra_devfreq_probe(struct platform_device *pdev)
892
912
INIT_DELAYED_WORK (& tegra -> cpufreq_update_work ,
893
913
tegra_actmon_delayed_update );
894
914
895
- err = devfreq_add_governor ( & tegra_devfreq_governor );
915
+ err = devm_devfreq_add_governor ( & pdev -> dev , & tegra_devfreq_governor );
896
916
if (err ) {
897
917
dev_err (& pdev -> dev , "Failed to add governor: %d\n" , err );
898
- goto remove_opps ;
918
+ return err ;
899
919
}
900
920
901
921
tegra_devfreq_profile .initial_freq = clk_get_rate (tegra -> emc_clock );
902
922
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 );
941
927
942
928
return 0 ;
943
929
}
@@ -967,7 +953,6 @@ MODULE_DEVICE_TABLE(of, tegra_devfreq_of_match);
967
953
968
954
static struct platform_driver tegra_devfreq_driver = {
969
955
.probe = tegra_devfreq_probe ,
970
- .remove = tegra_devfreq_remove ,
971
956
.driver = {
972
957
.name = "tegra-devfreq" ,
973
958
.of_match_table = tegra_devfreq_of_match ,
0 commit comments