hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/drivers/cpufreq/s5pv210-cpufreq.c
....@@ -1,12 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
34 * http://www.samsung.com
45 *
56 * CPU frequency scaling for S5PC110/S5PV210
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License version 2 as
9
- * published by the Free Software Foundation.
107 */
118
129 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
....@@ -481,7 +478,7 @@
481478 arm_volt, arm_volt_max);
482479 }
483480
484
- printk(KERN_DEBUG "Perf changed[L%d]\n", index);
481
+ pr_debug("Perf changed[L%d]\n", index);
485482
486483 exit:
487484 mutex_unlock(&set_freq_lock);
....@@ -544,7 +541,8 @@
544541 s5pv210_dram_conf[1].freq = clk_get_rate(dmc1_clk);
545542
546543 policy->suspend_freq = SLEEP_FREQ;
547
- return cpufreq_generic_init(policy, s5pv210_freq_table, 40000);
544
+ cpufreq_generic_init(policy, s5pv210_freq_table, 40000);
545
+ return 0;
548546
549547 out_dmc1:
550548 clk_put(dmc0_clk);
....@@ -557,8 +555,17 @@
557555 unsigned long event, void *ptr)
558556 {
559557 int ret;
558
+ struct cpufreq_policy *policy;
560559
561
- ret = cpufreq_driver_target(cpufreq_cpu_get(0), SLEEP_FREQ, 0);
560
+ policy = cpufreq_cpu_get(0);
561
+ if (!policy) {
562
+ pr_debug("cpufreq: get no policy for cpu0\n");
563
+ return NOTIFY_BAD;
564
+ }
565
+
566
+ ret = cpufreq_driver_target(policy, SLEEP_FREQ, 0);
567
+ cpufreq_cpu_put(policy);
568
+
562569 if (ret < 0)
563570 return NOTIFY_BAD;
564571
....@@ -583,8 +590,9 @@
583590
584591 static int s5pv210_cpufreq_probe(struct platform_device *pdev)
585592 {
593
+ struct device *dev = &pdev->dev;
586594 struct device_node *np;
587
- int id;
595
+ int id, result = 0;
588596
589597 /*
590598 * HACK: This is a temporary workaround to get access to clock
....@@ -594,61 +602,80 @@
594602 * this whole driver as soon as S5PV210 gets migrated to use
595603 * cpufreq-dt driver.
596604 */
605
+ arm_regulator = regulator_get(NULL, "vddarm");
606
+ if (IS_ERR(arm_regulator))
607
+ return dev_err_probe(dev, PTR_ERR(arm_regulator),
608
+ "failed to get regulator vddarm\n");
609
+
610
+ int_regulator = regulator_get(NULL, "vddint");
611
+ if (IS_ERR(int_regulator)) {
612
+ result = dev_err_probe(dev, PTR_ERR(int_regulator),
613
+ "failed to get regulator vddint\n");
614
+ goto err_int_regulator;
615
+ }
616
+
597617 np = of_find_compatible_node(NULL, NULL, "samsung,s5pv210-clock");
598618 if (!np) {
599
- pr_err("%s: failed to find clock controller DT node\n",
600
- __func__);
601
- return -ENODEV;
619
+ dev_err(dev, "failed to find clock controller DT node\n");
620
+ result = -ENODEV;
621
+ goto err_clock;
602622 }
603623
604624 clk_base = of_iomap(np, 0);
605625 of_node_put(np);
606626 if (!clk_base) {
607
- pr_err("%s: failed to map clock registers\n", __func__);
608
- return -EFAULT;
627
+ dev_err(dev, "failed to map clock registers\n");
628
+ result = -EFAULT;
629
+ goto err_clock;
609630 }
610631
611632 for_each_compatible_node(np, NULL, "samsung,s5pv210-dmc") {
612633 id = of_alias_get_id(np, "dmc");
613634 if (id < 0 || id >= ARRAY_SIZE(dmc_base)) {
614
- pr_err("%s: failed to get alias of dmc node '%s'\n",
615
- __func__, np->name);
635
+ dev_err(dev, "failed to get alias of dmc node '%pOFn'\n", np);
616636 of_node_put(np);
617
- return id;
637
+ result = id;
638
+ goto err_clk_base;
618639 }
619640
620641 dmc_base[id] = of_iomap(np, 0);
621642 if (!dmc_base[id]) {
622
- pr_err("%s: failed to map dmc%d registers\n",
623
- __func__, id);
643
+ dev_err(dev, "failed to map dmc%d registers\n", id);
624644 of_node_put(np);
625
- return -EFAULT;
645
+ result = -EFAULT;
646
+ goto err_dmc;
626647 }
627648 }
628649
629650 for (id = 0; id < ARRAY_SIZE(dmc_base); ++id) {
630651 if (!dmc_base[id]) {
631
- pr_err("%s: failed to find dmc%d node\n", __func__, id);
632
- return -ENODEV;
652
+ dev_err(dev, "failed to find dmc%d node\n", id);
653
+ result = -ENODEV;
654
+ goto err_dmc;
633655 }
634
- }
635
-
636
- arm_regulator = regulator_get(NULL, "vddarm");
637
- if (IS_ERR(arm_regulator)) {
638
- pr_err("failed to get regulator vddarm\n");
639
- return PTR_ERR(arm_regulator);
640
- }
641
-
642
- int_regulator = regulator_get(NULL, "vddint");
643
- if (IS_ERR(int_regulator)) {
644
- pr_err("failed to get regulator vddint\n");
645
- regulator_put(arm_regulator);
646
- return PTR_ERR(int_regulator);
647656 }
648657
649658 register_reboot_notifier(&s5pv210_cpufreq_reboot_notifier);
650659
651660 return cpufreq_register_driver(&s5pv210_driver);
661
+
662
+err_dmc:
663
+ for (id = 0; id < ARRAY_SIZE(dmc_base); ++id)
664
+ if (dmc_base[id]) {
665
+ iounmap(dmc_base[id]);
666
+ dmc_base[id] = NULL;
667
+ }
668
+
669
+err_clk_base:
670
+ iounmap(clk_base);
671
+
672
+err_clock:
673
+ regulator_put(int_regulator);
674
+
675
+err_int_regulator:
676
+ regulator_put(arm_regulator);
677
+
678
+ return result;
652679 }
653680
654681 static struct platform_driver s5pv210_cpufreq_platdrv = {