Lines Matching +full:gs101 +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
19 #include <linux/reboot.h>
22 #include <linux/soc/samsung/exynos-regs-pmu.h>
23 #include <linux/soc/samsung/exynos-pmu.h>
25 #include "exynos-pmu.h"
63 if (!pmu_context || !pmu_context->pmu_data) in exynos_sys_powerdown_conf()
66 pmu_data = pmu_context->pmu_data; in exynos_sys_powerdown_conf()
68 if (pmu_data->powerdown_conf) in exynos_sys_powerdown_conf()
69 pmu_data->powerdown_conf(mode); in exynos_sys_powerdown_conf()
71 if (pmu_data->pmu_config) { in exynos_sys_powerdown_conf()
72 for (i = 0; (pmu_data->pmu_config[i].offset != PMU_TABLE_END); i++) in exynos_sys_powerdown_conf()
73 pmu_raw_writel(pmu_data->pmu_config[i].val[mode], in exynos_sys_powerdown_conf()
74 pmu_data->pmu_config[i].offset); in exynos_sys_powerdown_conf()
77 if (pmu_data->powerdown_conf_extra) in exynos_sys_powerdown_conf()
78 pmu_data->powerdown_conf_extra(mode); in exynos_sys_powerdown_conf()
80 if (pmu_data->pmu_config_extra) { in exynos_sys_powerdown_conf()
81 for (i = 0; pmu_data->pmu_config_extra[i].offset != PMU_TABLE_END; i++) in exynos_sys_powerdown_conf()
82 pmu_raw_writel(pmu_data->pmu_config_extra[i].val[mode], in exynos_sys_powerdown_conf()
83 pmu_data->pmu_config_extra[i].offset); in exynos_sys_powerdown_conf()
124 .compatible = "google,gs101-pmu",
127 .compatible = "samsung,exynos3250-pmu",
130 .compatible = "samsung,exynos4210-pmu",
133 .compatible = "samsung,exynos4212-pmu",
136 .compatible = "samsung,exynos4412-pmu",
139 .compatible = "samsung,exynos5250-pmu",
142 .compatible = "samsung,exynos5410-pmu",
144 .compatible = "samsung,exynos5420-pmu",
147 .compatible = "samsung,exynos5433-pmu",
149 .compatible = "samsung,exynos7-pmu",
151 .compatible = "samsung,exynos850-pmu",
157 { .name = "exynos-clkout", },
161 * exynos_get_pmu_regmap() - Obtain pmureg regmap
174 return ERR_PTR(-ENODEV); in exynos_get_pmu_regmap()
179 * exynos_get_pmu_regmap_by_phandle() - Obtain pmureg regmap via phandle
200 return ERR_PTR(-ENODEV); in exynos_get_pmu_regmap_by_phandle()
203 * Determine if exynos-pmu device has probed and therefore regmap in exynos_get_pmu_regmap_by_phandle()
205 * return -EPROBE_DEFER. in exynos_get_pmu_regmap_by_phandle()
214 return ERR_PTR(-EPROBE_DEFER); in exynos_get_pmu_regmap_by_phandle()
236 __must_hold(&pmu_context->cpupm_lock) in __gs101_cpu_pmu_online()
242 regmap_write(pmu_context->pmureg, GS101_CPU_INFORM(cpuhint), in __gs101_cpu_pmu_online()
247 regmap_update_bits(pmu_context->pmuintrgen, GS101_GRP2_INTR_BID_ENABLE, in __gs101_cpu_pmu_online()
250 regmap_read(pmu_context->pmuintrgen, GS101_GRP2_INTR_BID_UPEND, &reg); in __gs101_cpu_pmu_online()
252 regmap_write(pmu_context->pmuintrgen, GS101_GRP2_INTR_BID_CLEAR, in __gs101_cpu_pmu_online()
263 raw_spin_lock(&pmu_context->cpupm_lock); in gs101_cpu_pmu_online()
265 if (pmu_context->sys_inreboot) { in gs101_cpu_pmu_online()
266 raw_spin_unlock(&pmu_context->cpupm_lock); in gs101_cpu_pmu_online()
272 raw_spin_unlock(&pmu_context->cpupm_lock); in gs101_cpu_pmu_online()
282 raw_spin_lock_irqsave(&pmu_context->cpupm_lock, flags); in gs101_cpuhp_pmu_online()
289 clear_bit(cpu, pmu_context->in_cpuhp); in gs101_cpuhp_pmu_online()
290 raw_spin_unlock_irqrestore(&pmu_context->cpupm_lock, flags); in gs101_cpuhp_pmu_online()
297 __must_hold(&pmu_context->cpupm_lock) in __gs101_cpu_pmu_offline()
303 regmap_write(pmu_context->pmureg, GS101_CPU_INFORM(cpuhint), in __gs101_cpu_pmu_offline()
307 regmap_update_bits(pmu_context->pmuintrgen, GS101_GRP2_INTR_BID_ENABLE, in __gs101_cpu_pmu_offline()
310 regmap_read(pmu_context->pmuintrgen, GS101_GRP1_INTR_BID_UPEND, &reg); in __gs101_cpu_pmu_offline()
311 regmap_write(pmu_context->pmuintrgen, GS101_GRP1_INTR_BID_CLEAR, in __gs101_cpu_pmu_offline()
315 regmap_read(pmu_context->pmuintrgen, GS101_GRP1_INTR_BID_UPEND, &reg); in __gs101_cpu_pmu_offline()
316 regmap_write(pmu_context->pmuintrgen, GS101_GRP1_INTR_BID_CLEAR, in __gs101_cpu_pmu_offline()
327 raw_spin_lock(&pmu_context->cpupm_lock); in gs101_cpu_pmu_offline()
330 if (test_bit(cpu, pmu_context->in_cpuhp)) { in gs101_cpu_pmu_offline()
331 raw_spin_unlock(&pmu_context->cpupm_lock); in gs101_cpu_pmu_offline()
335 /* Ignore CPU_PM_ENTER event in reboot or suspend sequence. */ in gs101_cpu_pmu_offline()
336 if (pmu_context->sys_insuspend || pmu_context->sys_inreboot) { in gs101_cpu_pmu_offline()
337 raw_spin_unlock(&pmu_context->cpupm_lock); in gs101_cpu_pmu_offline()
342 raw_spin_unlock(&pmu_context->cpupm_lock); in gs101_cpu_pmu_offline()
352 raw_spin_lock_irqsave(&pmu_context->cpupm_lock, flags); in gs101_cpuhp_pmu_offline()
357 set_bit(cpu, pmu_context->in_cpuhp); in gs101_cpuhp_pmu_offline()
360 raw_spin_unlock_irqrestore(&pmu_context->cpupm_lock, flags); in gs101_cpuhp_pmu_offline()
396 raw_spin_lock_irqsave(&pmu_context->cpupm_lock, flags); in exynos_cpupm_reboot_notifier()
397 pmu_context->sys_inreboot = true; in exynos_cpupm_reboot_notifier()
398 raw_spin_unlock_irqrestore(&pmu_context->cpupm_lock, flags); in exynos_cpupm_reboot_notifier()
417 intr_gen_node = of_parse_phandle(dev->of_node, in setup_cpuhp_and_cpuidle()
418 "google,pmu-intr-gen-syscon", 0); in setup_cpuhp_and_cpuidle()
424 dev_warn(dev, "pmu-intr-gen syscon unavailable\n"); in setup_cpuhp_and_cpuidle()
430 * a mmio regmap for pmu-intr-gen that uses raw spinlocks instead of in setup_cpuhp_and_cpuidle()
439 return -ENOMEM; in setup_cpuhp_and_cpuidle()
441 pmu_context->pmuintrgen = devm_regmap_init_mmio(dev, virt_addr, in setup_cpuhp_and_cpuidle()
443 if (IS_ERR(pmu_context->pmuintrgen)) { in setup_cpuhp_and_cpuidle()
444 dev_err(dev, "failed to initialize pmu-intr-gen regmap\n"); in setup_cpuhp_and_cpuidle()
445 return PTR_ERR(pmu_context->pmuintrgen); in setup_cpuhp_and_cpuidle()
450 pmu_context->pmuintrgen); in setup_cpuhp_and_cpuidle()
454 pmu_context->in_cpuhp = devm_bitmap_zalloc(dev, num_possible_cpus(), in setup_cpuhp_and_cpuidle()
456 if (!pmu_context->in_cpuhp) in setup_cpuhp_and_cpuidle()
457 return -ENOMEM; in setup_cpuhp_and_cpuidle()
464 cpuhp_setup_state(CPUHP_BP_PREPARE_DYN, "soc/exynos-pmu:prepare", in setup_cpuhp_and_cpuidle()
467 cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "soc/exynos-pmu:online", in setup_cpuhp_and_cpuidle()
478 struct device *dev = &pdev->dev; in exynos_pmu_probe()
488 pmu_context = devm_kzalloc(&pdev->dev, in exynos_pmu_probe()
492 return -ENOMEM; in exynos_pmu_probe()
496 return -ENODEV; in exynos_pmu_probe()
498 pmu_context->pmu_data = of_device_get_match_data(dev); in exynos_pmu_probe()
501 if (pmu_context->pmu_data && pmu_context->pmu_data->pmu_secure) { in exynos_pmu_probe()
503 pmu_regmcfg.max_register = resource_size(res) - in exynos_pmu_probe()
505 pmu_regmcfg.wr_table = pmu_context->pmu_data->wr_table; in exynos_pmu_probe()
506 pmu_regmcfg.rd_table = pmu_context->pmu_data->rd_table; in exynos_pmu_probe()
510 (void *)(uintptr_t)res->start, in exynos_pmu_probe()
514 return dev_err_probe(&pdev->dev, PTR_ERR(regmap), in exynos_pmu_probe()
517 ret = of_syscon_register_regmap(dev->of_node, regmap); in exynos_pmu_probe()
522 regmap = syscon_node_to_regmap(dev->of_node); in exynos_pmu_probe()
524 return dev_err_probe(&pdev->dev, PTR_ERR(regmap), in exynos_pmu_probe()
528 pmu_context->pmureg = regmap; in exynos_pmu_probe()
529 pmu_context->dev = dev; in exynos_pmu_probe()
530 raw_spin_lock_init(&pmu_context->cpupm_lock); in exynos_pmu_probe()
531 pmu_context->sys_inreboot = false; in exynos_pmu_probe()
532 pmu_context->sys_insuspend = false; in exynos_pmu_probe()
534 if (pmu_context->pmu_data && pmu_context->pmu_data->pmu_cpuhp) { in exynos_pmu_probe()
540 if (pmu_context->pmu_data && pmu_context->pmu_data->pmu_init) in exynos_pmu_probe()
541 pmu_context->pmu_data->pmu_init(); in exynos_pmu_probe()
551 dev_err(dev, "Error populating children, reboot and poweroff might not work properly\n"); in exynos_pmu_probe()
559 raw_spin_lock(&pmu_context->cpupm_lock); in exynos_cpupm_suspend_noirq()
560 pmu_context->sys_insuspend = true; in exynos_cpupm_suspend_noirq()
561 raw_spin_unlock(&pmu_context->cpupm_lock); in exynos_cpupm_suspend_noirq()
567 raw_spin_lock(&pmu_context->cpupm_lock); in exynos_cpupm_resume_noirq()
568 pmu_context->sys_insuspend = false; in exynos_cpupm_resume_noirq()
569 raw_spin_unlock(&pmu_context->cpupm_lock); in exynos_cpupm_resume_noirq()
580 .name = "exynos-pmu",