Path: blob/master/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c
26481 views
// SPDX-License-Identifier: GPL-2.0-or-later1/*2* MPC85xx PM operators3*4* Copyright 2015 Freescale Semiconductor Inc.5*/67#define pr_fmt(fmt) "%s: " fmt, __func__89#include <linux/kernel.h>10#include <linux/of.h>11#include <linux/of_address.h>12#include <linux/fsl/guts.h>1314#include <asm/io.h>15#include <asm/fsl_pm.h>1617#include "smp.h"1819static struct ccsr_guts __iomem *guts;2021#ifdef CONFIG_FSL_PMC22static void mpc85xx_irq_mask(int cpu)23{2425}2627static void mpc85xx_irq_unmask(int cpu)28{2930}3132static void mpc85xx_cpu_die(int cpu)33{34u32 tmp;3536tmp = (mfspr(SPRN_HID0) & ~(HID0_DOZE|HID0_SLEEP)) | HID0_NAP;37mtspr(SPRN_HID0, tmp);3839/* Enter NAP mode. */40tmp = mfmsr();41tmp |= MSR_WE;42asm volatile(43"msync\n"44"mtmsr %0\n"45"isync\n"46:47: "r" (tmp));48}4950static void mpc85xx_cpu_up_prepare(int cpu)51{5253}54#endif5556static void mpc85xx_freeze_time_base(bool freeze)57{58uint32_t mask;5960mask = CCSR_GUTS_DEVDISR_TB0 | CCSR_GUTS_DEVDISR_TB1;61if (freeze)62setbits32(&guts->devdisr, mask);63else64clrbits32(&guts->devdisr, mask);6566in_be32(&guts->devdisr);67}6869static const struct of_device_id mpc85xx_smp_guts_ids[] = {70{ .compatible = "fsl,mpc8572-guts", },71{ .compatible = "fsl,p1020-guts", },72{ .compatible = "fsl,p1021-guts", },73{ .compatible = "fsl,p1022-guts", },74{ .compatible = "fsl,p1023-guts", },75{ .compatible = "fsl,p2020-guts", },76{ .compatible = "fsl,bsc9132-guts", },77{},78};7980static const struct fsl_pm_ops mpc85xx_pm_ops = {81.freeze_time_base = mpc85xx_freeze_time_base,82#ifdef CONFIG_FSL_PMC83.irq_mask = mpc85xx_irq_mask,84.irq_unmask = mpc85xx_irq_unmask,85.cpu_die = mpc85xx_cpu_die,86.cpu_up_prepare = mpc85xx_cpu_up_prepare,87#endif88};8990int __init mpc85xx_setup_pmc(void)91{92struct device_node *np;9394np = of_find_matching_node(NULL, mpc85xx_smp_guts_ids);95if (np) {96guts = of_iomap(np, 0);97of_node_put(np);98if (!guts) {99pr_err("Could not map guts node address\n");100return -ENOMEM;101}102qoriq_pm_ops = &mpc85xx_pm_ops;103}104105return 0;106}107108109