static int exynos_cpufreq_probe(struct platform_device *pdev) { int ret = -EINVAL; exynos_info = kzalloc(sizeof(*exynos_info), GFP_KERNEL); if (!exynos_info) return -ENOMEM; exynos_info->dev = &pdev->dev; if (of_machine_is_compatible("samsung,exynos4210")) { exynos_info->type = EXYNOS_SOC_4210; ret = exynos4210_cpufreq_init(exynos_info); } else if (of_machine_is_compatible("samsung,exynos4212")) { exynos_info->type = EXYNOS_SOC_4212; ret = exynos4x12_cpufreq_init(exynos_info); } else if (of_machine_is_compatible("samsung,exynos4412")) { exynos_info->type = EXYNOS_SOC_4412; ret = exynos4x12_cpufreq_init(exynos_info); } else if (of_machine_is_compatible("samsung,exynos5250")) { exynos_info->type = EXYNOS_SOC_5250; ret = exynos5250_cpufreq_init(exynos_info); } else { pr_err("%s: Unknown SoC type\n", __func__); return -ENODEV; } if (ret) goto err_vdd_arm; if (exynos_info->set_freq == NULL) { dev_err(&pdev->dev, "No set_freq function (ERR)\n"); goto err_vdd_arm; } arm_regulator = regulator_get(NULL, "vdd_arm"); if (IS_ERR(arm_regulator)) { dev_err(&pdev->dev, "failed to get resource vdd_arm\n"); goto err_vdd_arm; } /* Done here as we want to capture boot frequency */ locking_frequency = clk_get_rate(exynos_info->cpu_clk) / 1000; if (!cpufreq_register_driver(&exynos_driver)) return 0; dev_err(&pdev->dev, "failed to register cpufreq driver\n"); regulator_put(arm_regulator); err_vdd_arm: kfree(exynos_info); return -EINVAL; }
static int exynos_cpufreq_probe(struct platform_device *pdev) { int ret = -EINVAL; exynos_info = kzalloc(sizeof(*exynos_info), GFP_KERNEL); if (!exynos_info) return -ENOMEM; exynos_info->dev = &pdev->dev; if (soc_is_exynos4210()) ret = exynos4210_cpufreq_init(exynos_info); else if (soc_is_exynos4212() || soc_is_exynos4412()) ret = exynos4x12_cpufreq_init(exynos_info); else if (soc_is_exynos5250()) ret = exynos5250_cpufreq_init(exynos_info); else return 0; if (ret) goto err_vdd_arm; if (exynos_info->set_freq == NULL) { dev_err(&pdev->dev, "No set_freq function (ERR)\n"); goto err_vdd_arm; } arm_regulator = regulator_get(NULL, "vdd_arm"); if (IS_ERR(arm_regulator)) { dev_err(&pdev->dev, "failed to get resource vdd_arm\n"); goto err_vdd_arm; } /* Done here as we want to capture boot frequency */ locking_frequency = clk_get_rate(exynos_info->cpu_clk) / 1000; if (!cpufreq_register_driver(&exynos_driver)) return 0; dev_err(&pdev->dev, "failed to register cpufreq driver\n"); regulator_put(arm_regulator); err_vdd_arm: kfree(exynos_info); return -EINVAL; }
static int exynos_cpufreq_probe(struct platform_device *pdev) { struct device_node *cpu0; int ret = -EINVAL; exynos_info = kzalloc(sizeof(*exynos_info), GFP_KERNEL); if (!exynos_info) return -ENOMEM; exynos_info->dev = &pdev->dev; if (of_machine_is_compatible("samsung,exynos4212")) { exynos_info->type = EXYNOS_SOC_4212; ret = exynos4x12_cpufreq_init(exynos_info); } else if (of_machine_is_compatible("samsung,exynos4412")) { exynos_info->type = EXYNOS_SOC_4412; ret = exynos4x12_cpufreq_init(exynos_info); } else if (of_machine_is_compatible("samsung,exynos5250")) { exynos_info->type = EXYNOS_SOC_5250; ret = exynos5250_cpufreq_init(exynos_info); } else { pr_err("%s: Unknown SoC type\n", __func__); return -ENODEV; } if (ret) goto err_vdd_arm; if (exynos_info->set_freq == NULL) { dev_err(&pdev->dev, "No set_freq function (ERR)\n"); goto err_vdd_arm; } arm_regulator = regulator_get(NULL, "vdd_arm"); if (IS_ERR(arm_regulator)) { dev_err(&pdev->dev, "failed to get resource vdd_arm\n"); goto err_vdd_arm; } /* Done here as we want to capture boot frequency */ locking_frequency = clk_get_rate(exynos_info->cpu_clk) / 1000; ret = cpufreq_register_driver(&exynos_driver); if (ret) goto err_cpufreq_reg; cpu0 = of_get_cpu_node(0, NULL); if (!cpu0) { pr_err("failed to find cpu0 node\n"); return 0; } if (of_find_property(cpu0, "#cooling-cells", NULL)) { cdev = of_cpufreq_cooling_register(cpu0, cpu_present_mask); if (IS_ERR(cdev)) pr_err("running cpufreq without cooling device: %ld\n", PTR_ERR(cdev)); } return 0; err_cpufreq_reg: dev_err(&pdev->dev, "failed to register cpufreq driver\n"); regulator_put(arm_regulator); err_vdd_arm: kfree(exynos_info); return -EINVAL; }
int board_init(void) { struct fdt_memory mem_config; /* Record the time we spent before SPL */ bootstage_add_record(BOOTSTAGE_ID_START_SPL, "spl_start", 0, CONFIG_SPL_TIME_US); bootstage_mark_name(BOOTSTAGE_ID_BOARD_INIT, "board_init"); if (fdtdec_decode_memory(gd->fdt_blob, &mem_config)) { debug("%s: Failed to decode memory\n", __func__); return -1; } gd->bd->bi_boot_params = mem_config.start + 0x100UL; #ifdef CONFIG_OF_CONTROL gd->bd->bi_arch_number = fdtdec_get_config_int(gd->fdt_blob, "machine-arch-id", -1); if (gd->bd->bi_arch_number == -1U) debug("Warning: No /config/machine-arch-id defined in fdt\n"); #endif #ifdef CONFIG_EXYNOS_SPI spi_init(); #endif if (board_i2c_arb_init(gd->fdt_blob)) return -1; board_i2c_init(gd->fdt_blob); #ifdef CONFIG_TPS65090_POWER tps65090_init(); /* * If we just reset, disable the backlight and lcd fets before * [re-]initializing the lcd. This ensures we are always in the same * state during lcd init. We've seen some oddities with these fets, so * this removes a bit of uncertainty. */ if (board_is_processor_reset()) { tps65090_fet_disable(1); tps65090_fet_disable(6); } #endif exynos_lcd_check_next_stage(gd->fdt_blob, 0); if (max77686_enable_32khz_cp()) { debug("%s: Failed to enable max77686 32khz coprocessor clock\n", __func__); return -1; } #if defined CONFIG_EXYNOS_CPUFREQ if (exynos5250_cpufreq_init(gd->fdt_blob)) { debug("%s: Failed to init CPU frequency scaling\n", __func__); return -1; } #endif #if defined CONFIG_EXYNOS_TMU if (tmu_init(gd->fdt_blob)) { debug("%s: Failed to init TMU\n", __func__); return -1; } #endif /* Clock Gating all the unused IP's to save power */ clock_gate(); /* Disable USB3.0 PLL to save 250mW of power */ disable_usb30_pll(); if (board_init_mkbp_devices(gd->fdt_blob)) return -1; board_configure_analogix(); board_enable_audio_codec(); exynos_lcd_check_next_stage(gd->fdt_blob, 0); bootstage_mark_name(BOOTSTAGE_ID_BOARD_INIT_DONE, "board_init_done"); return 0; }