Skip to content

Commit 68b79f2

Browse files
digetxvireshk
authored andcommitted
PM / devfreq: tegra30: Use resource-managed helpers
Use resource-managed API helpers to simplify driver's probe() function, making code cleaner. Signed-off-by: Dmitry Osipenko <[email protected]> Acked-by: Chanwoo Choi <[email protected]> Signed-off-by: Viresh Kumar <[email protected]>
1 parent 1cc5520 commit 68b79f2

File tree

1 file changed

+46
-61
lines changed

1 file changed

+46
-61
lines changed

drivers/devfreq/tegra30-devfreq.c

Lines changed: 46 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,6 @@ struct tegra_devfreq_soc_data {
178178

179179
struct 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+
792824
static 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);
873894
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;
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

968954
static 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

Comments
 (0)