Lines Matching +full:smc +full:- +full:reboot
1 // SPDX-License-Identifier: GPL-2.0
3 // Copyright (c) 2011-2014 Samsung Electronics Co., Ltd.
6 // Exynos - CPU PMU(Power Management Unit) support
9 #include <linux/arm-smccc.h>
20 #include <linux/soc/samsung/exynos-regs-pmu.h>
21 #include <linux/soc/samsung/exynos-pmu.h>
23 #include "exynos-pmu.h"
51 * Note: This SMC interface is known to be implemented on gs101 and derivative
65 /* returns -EINVAL if access isn't allowed or 0 */ in tensor_sec_reg_write()
67 pr_warn("%s(): SMC failed: %d\n", __func__, (int)res.a0); in tensor_sec_reg_write()
82 /* returns -EINVAL if access isn't allowed or 0 */ in tensor_sec_reg_rmw()
84 pr_warn("%s(): SMC failed: %d\n", __func__, (int)res.a0); in tensor_sec_reg_rmw()
91 * Note: The SMC read register is not used, as only registers that can be
92 * written are readable via SMC.
179 if (!pmu_context || !pmu_context->pmu_data) in exynos_sys_powerdown_conf()
182 pmu_data = pmu_context->pmu_data; in exynos_sys_powerdown_conf()
184 if (pmu_data->powerdown_conf) in exynos_sys_powerdown_conf()
185 pmu_data->powerdown_conf(mode); in exynos_sys_powerdown_conf()
187 if (pmu_data->pmu_config) { in exynos_sys_powerdown_conf()
188 for (i = 0; (pmu_data->pmu_config[i].offset != PMU_TABLE_END); i++) in exynos_sys_powerdown_conf()
189 pmu_raw_writel(pmu_data->pmu_config[i].val[mode], in exynos_sys_powerdown_conf()
190 pmu_data->pmu_config[i].offset); in exynos_sys_powerdown_conf()
193 if (pmu_data->powerdown_conf_extra) in exynos_sys_powerdown_conf()
194 pmu_data->powerdown_conf_extra(mode); in exynos_sys_powerdown_conf()
196 if (pmu_data->pmu_config_extra) { in exynos_sys_powerdown_conf()
197 for (i = 0; pmu_data->pmu_config_extra[i].offset != PMU_TABLE_END; i++) in exynos_sys_powerdown_conf()
198 pmu_raw_writel(pmu_data->pmu_config_extra[i].val[mode], in exynos_sys_powerdown_conf()
199 pmu_data->pmu_config_extra[i].offset); in exynos_sys_powerdown_conf()
236 .compatible = "google,gs101-pmu",
239 .compatible = "samsung,exynos3250-pmu",
242 .compatible = "samsung,exynos4210-pmu",
245 .compatible = "samsung,exynos4212-pmu",
248 .compatible = "samsung,exynos4412-pmu",
251 .compatible = "samsung,exynos5250-pmu",
254 .compatible = "samsung,exynos5410-pmu",
256 .compatible = "samsung,exynos5420-pmu",
259 .compatible = "samsung,exynos5433-pmu",
261 .compatible = "samsung,exynos7-pmu",
263 .compatible = "samsung,exynos850-pmu",
269 { .name = "exynos-clkout", },
273 * exynos_get_pmu_regmap() - Obtain pmureg regmap
286 return ERR_PTR(-ENODEV); in exynos_get_pmu_regmap()
291 * exynos_get_pmu_regmap_by_phandle() - Obtain pmureg regmap via phandle
312 return ERR_PTR(-ENODEV); in exynos_get_pmu_regmap_by_phandle()
315 * Determine if exynos-pmu device has probed and therefore regmap in exynos_get_pmu_regmap_by_phandle()
317 * return -EPROBE_DEFER. in exynos_get_pmu_regmap_by_phandle()
326 return ERR_PTR(-EPROBE_DEFER); in exynos_get_pmu_regmap_by_phandle()
345 regmap_write(pmu_context->pmureg, GS101_CPU_INFORM(cpuhint), in gs101_cpuhp_pmu_online()
350 regmap_update_bits(pmu_context->pmuintrgen, GS101_GRP2_INTR_BID_ENABLE, in gs101_cpuhp_pmu_online()
353 regmap_read(pmu_context->pmuintrgen, GS101_GRP2_INTR_BID_UPEND, ®); in gs101_cpuhp_pmu_online()
355 regmap_write(pmu_context->pmuintrgen, GS101_GRP2_INTR_BID_CLEAR, in gs101_cpuhp_pmu_online()
367 regmap_write(pmu_context->pmureg, GS101_CPU_INFORM(cpuhint), in gs101_cpuhp_pmu_offline()
371 regmap_update_bits(pmu_context->pmuintrgen, GS101_GRP2_INTR_BID_ENABLE, in gs101_cpuhp_pmu_offline()
374 regmap_read(pmu_context->pmuintrgen, GS101_GRP1_INTR_BID_UPEND, ®); in gs101_cpuhp_pmu_offline()
375 regmap_write(pmu_context->pmuintrgen, GS101_GRP1_INTR_BID_CLEAR, in gs101_cpuhp_pmu_offline()
379 regmap_read(pmu_context->pmuintrgen, GS101_GRP1_INTR_BID_UPEND, ®); in gs101_cpuhp_pmu_offline()
380 regmap_write(pmu_context->pmuintrgen, GS101_GRP1_INTR_BID_CLEAR, in gs101_cpuhp_pmu_offline()
387 struct device *dev = &pdev->dev; in exynos_pmu_probe()
397 pmu_context = devm_kzalloc(&pdev->dev, in exynos_pmu_probe()
401 return -ENOMEM; in exynos_pmu_probe()
405 return -ENODEV; in exynos_pmu_probe()
407 pmu_context->pmu_data = of_device_get_match_data(dev); in exynos_pmu_probe()
410 if (pmu_context->pmu_data && pmu_context->pmu_data->pmu_secure) { in exynos_pmu_probe()
412 pmu_regmcfg.max_register = resource_size(res) - in exynos_pmu_probe()
414 /* Need physical address for SMC call */ in exynos_pmu_probe()
416 (void *)(uintptr_t)res->start, in exynos_pmu_probe()
420 return dev_err_probe(&pdev->dev, PTR_ERR(regmap), in exynos_pmu_probe()
423 ret = of_syscon_register_regmap(dev->of_node, regmap); in exynos_pmu_probe()
428 regmap = syscon_node_to_regmap(dev->of_node); in exynos_pmu_probe()
430 return dev_err_probe(&pdev->dev, PTR_ERR(regmap), in exynos_pmu_probe()
434 pmu_context->pmureg = regmap; in exynos_pmu_probe()
435 pmu_context->dev = dev; in exynos_pmu_probe()
437 if (pmu_context->pmu_data && pmu_context->pmu_data->pmu_cpuhp) { in exynos_pmu_probe()
438 pmu_context->pmuintrgen = syscon_regmap_lookup_by_phandle(dev->of_node, in exynos_pmu_probe()
439 "google,pmu-intr-gen-syscon"); in exynos_pmu_probe()
440 if (IS_ERR(pmu_context->pmuintrgen)) { in exynos_pmu_probe()
445 dev_warn(&pdev->dev, "pmu-intr-gen syscon unavailable\n"); in exynos_pmu_probe()
448 "soc/exynos-pmu:prepare", in exynos_pmu_probe()
452 "soc/exynos-pmu:online", in exynos_pmu_probe()
457 if (pmu_context->pmu_data && pmu_context->pmu_data->pmu_init) in exynos_pmu_probe()
458 pmu_context->pmu_data->pmu_init(); in exynos_pmu_probe()
468 dev_err(dev, "Error populating children, reboot and poweroff might not work properly\n"); in exynos_pmu_probe()
476 .name = "exynos-pmu",