drivers/soc/samsung/exynos-pmu.c
Source file repositories/reference/linux-study-clean/drivers/soc/samsung/exynos-pmu.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/soc/samsung/exynos-pmu.c- Extension
.c- Size
- 15440 bytes
- Lines
- 593
- Domain
- Driver Families
- Bucket
- drivers/soc
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/array_size.hlinux/bitmap.hlinux/cpuhotplug.hlinux/cpu_pm.hlinux/of.hlinux/of_address.hlinux/mfd/core.hlinux/mfd/syscon.hlinux/of_platform.hlinux/platform_device.hlinux/delay.hlinux/reboot.hlinux/regmap.hlinux/soc/samsung/exynos-regs-pmu.hlinux/soc/samsung/exynos-pmu.hexynos-pmu.h
Detected Declarations
struct exynos_pmu_contextfunction pmu_raw_writelfunction pmu_raw_readlfunction exynos_sys_powerdown_conffunction exynos_get_pmu_regmapfunction exynos_get_pmu_regmap_by_phandlefunction __gs101_cpu_pmu_onlinefunction gs101_cpu_pmu_onlinefunction gs101_cpuhp_pmu_onlinefunction __gs101_cpu_pmu_offlinefunction gs101_cpu_pmu_offlinefunction gs101_cpuhp_pmu_offlinefunction gs101_cpu_pm_notify_callbackfunction exynos_cpupm_reboot_notifierfunction setup_cpuhp_and_cpuidlefunction exynos_pmu_probefunction exynos_cpupm_suspend_noirqfunction exynos_cpupm_resume_noirqfunction exynos_pmu_initexport exynos_get_pmu_regmapexport exynos_get_pmu_regmap_by_phandle
Annotated Snippet
struct exynos_pmu_context {
struct device *dev;
const struct exynos_pmu_data *pmu_data;
struct regmap *pmureg;
struct regmap *pmuintrgen;
/*
* Serialization lock for CPU hot plug and cpuidle ACPM hint
* programming. Also protects in_cpuhp, sys_insuspend & sys_inreboot
* flags.
*/
raw_spinlock_t cpupm_lock;
unsigned long *in_cpuhp;
bool sys_insuspend;
bool sys_inreboot;
};
void __iomem *pmu_base_addr;
static struct exynos_pmu_context *pmu_context;
/* forward declaration */
static struct platform_driver exynos_pmu_driver;
void pmu_raw_writel(u32 val, u32 offset)
{
writel_relaxed(val, pmu_base_addr + offset);
}
u32 pmu_raw_readl(u32 offset)
{
return readl_relaxed(pmu_base_addr + offset);
}
void exynos_sys_powerdown_conf(enum sys_powerdown mode)
{
unsigned int i;
const struct exynos_pmu_data *pmu_data;
if (!pmu_context || !pmu_context->pmu_data)
return;
pmu_data = pmu_context->pmu_data;
if (pmu_data->powerdown_conf)
pmu_data->powerdown_conf(mode);
if (pmu_data->pmu_config) {
for (i = 0; (pmu_data->pmu_config[i].offset != PMU_TABLE_END); i++)
pmu_raw_writel(pmu_data->pmu_config[i].val[mode],
pmu_data->pmu_config[i].offset);
}
if (pmu_data->powerdown_conf_extra)
pmu_data->powerdown_conf_extra(mode);
if (pmu_data->pmu_config_extra) {
for (i = 0; pmu_data->pmu_config_extra[i].offset != PMU_TABLE_END; i++)
pmu_raw_writel(pmu_data->pmu_config_extra[i].val[mode],
pmu_data->pmu_config_extra[i].offset);
}
}
/*
* Split the data between ARM architectures because it is relatively big
* and useless on other arch.
*/
#ifdef CONFIG_EXYNOS_PMU_ARM_DRIVERS
#define exynos_pmu_data_arm_ptr(data) (&data)
#else
#define exynos_pmu_data_arm_ptr(data) NULL
#endif
static const struct regmap_config regmap_smccfg = {
.name = "pmu_regs",
.reg_bits = 32,
.reg_stride = 4,
.val_bits = 32,
.fast_io = true,
.use_single_read = true,
.use_single_write = true,
.reg_read = tensor_sec_reg_read,
.reg_write = tensor_sec_reg_write,
.reg_update_bits = tensor_sec_update_bits,
.use_raw_spinlock = true,
};
static const struct regmap_config regmap_pmu_intr = {
.name = "pmu_intr_gen",
.reg_bits = 32,
.reg_stride = 4,
.val_bits = 32,
.use_raw_spinlock = true,
Annotation
- Immediate include surface: `linux/array_size.h`, `linux/bitmap.h`, `linux/cpuhotplug.h`, `linux/cpu_pm.h`, `linux/of.h`, `linux/of_address.h`, `linux/mfd/core.h`, `linux/mfd/syscon.h`.
- Detected declarations: `struct exynos_pmu_context`, `function pmu_raw_writel`, `function pmu_raw_readl`, `function exynos_sys_powerdown_conf`, `function exynos_get_pmu_regmap`, `function exynos_get_pmu_regmap_by_phandle`, `function __gs101_cpu_pmu_online`, `function gs101_cpu_pmu_online`, `function gs101_cpuhp_pmu_online`, `function __gs101_cpu_pmu_offline`.
- Atlas domain: Driver Families / drivers/soc.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.