Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux...
[linux-drm-fsl-dcu.git] / arch / arm / common / mcpm_entry.c
index 990250965f2cfb4e4e3a984678fcf62eedbcdb8d..26020a03f659f2d78fe37f2dca7f3e0a0eb573ca 100644 (file)
@@ -27,6 +27,18 @@ void mcpm_set_entry_vector(unsigned cpu, unsigned cluster, void *ptr)
        sync_cache_w(&mcpm_entry_vectors[cluster][cpu]);
 }
 
+extern unsigned long mcpm_entry_early_pokes[MAX_NR_CLUSTERS][MAX_CPUS_PER_CLUSTER][2];
+
+void mcpm_set_early_poke(unsigned cpu, unsigned cluster,
+                        unsigned long poke_phys_addr, unsigned long poke_val)
+{
+       unsigned long *poke = &mcpm_entry_early_pokes[cluster][cpu][0];
+       poke[0] = poke_phys_addr;
+       poke[1] = poke_val;
+       __cpuc_flush_dcache_area((void *)poke, 8);
+       outer_clean_range(__pa(poke), __pa(poke + 2));
+}
+
 static const struct mcpm_platform_ops *platform_ops;
 
 int __init mcpm_platform_register(const struct mcpm_platform_ops *ops)
@@ -90,6 +102,21 @@ void mcpm_cpu_power_down(void)
        BUG();
 }
 
+int mcpm_cpu_power_down_finish(unsigned int cpu, unsigned int cluster)
+{
+       int ret;
+
+       if (WARN_ON_ONCE(!platform_ops || !platform_ops->power_down_finish))
+               return -EUNATCH;
+
+       ret = platform_ops->power_down_finish(cpu, cluster);
+       if (ret)
+               pr_warn("%s: cpu %u, cluster %u failed to power down (%d)\n",
+                       __func__, cpu, cluster, ret);
+
+       return ret;
+}
+
 void mcpm_cpu_suspend(u64 expected_residency)
 {
        phys_reset_t phys_reset;