Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d17799f9 authored by chenhui zhao's avatar chenhui zhao Committed by Scott Wood
Browse files

powerpc/rcpm: add RCPM driver



There is a RCPM (Run Control/Power Management) in Freescale QorIQ
series processors. The device performs tasks associated with device
run control and power management.

The driver implements some features: mask/unmask irq, enter/exit low
power states, freeze time base, etc.

Signed-off-by: default avatarChenhui Zhao <chenhui.zhao@freescale.com>
Signed-off-by: default avatarTang Yuantian <Yuantian.Tang@freescale.com>
[scottwood: remove __KERNEL__ ifdef]
Signed-off-by: default avatarScott Wood <oss@buserror.net>
parent e7affb1d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ static inline u32 get_tensr(void)
	return 1;
}

void book3e_stop_thread(int thread);

#endif /* _ASM_POWERPC_CPUTHREADS_H */
+51 −0
Original line number Diff line number Diff line
/*
 * Support Power Management
 *
 * Copyright 2014-2015 Freescale Semiconductor Inc.
 *
 * This program is free software; you can redistribute  it and/or modify it
 * under  the terms of  the GNU General  Public License as published by the
 * Free Software Foundation;  either version 2 of the  License, or (at your
 * option) any later version.
 */
#ifndef __PPC_FSL_PM_H
#define __PPC_FSL_PM_H

#define E500_PM_PH10	1
#define E500_PM_PH15	2
#define E500_PM_PH20	3
#define E500_PM_PH30	4
#define E500_PM_DOZE	E500_PM_PH10
#define E500_PM_NAP	E500_PM_PH15

#define PLAT_PM_SLEEP	20
#define PLAT_PM_LPM20	30

#define FSL_PM_SLEEP		(1 << 0)
#define FSL_PM_DEEP_SLEEP	(1 << 1)

struct fsl_pm_ops {
	/* mask pending interrupts to the RCPM from MPIC */
	void (*irq_mask)(int cpu);

	/* unmask pending interrupts to the RCPM from MPIC */
	void (*irq_unmask)(int cpu);
	void (*cpu_enter_state)(int cpu, int state);
	void (*cpu_exit_state)(int cpu, int state);
	void (*cpu_up_prepare)(int cpu);
	void (*cpu_die)(int cpu);
	int (*plat_enter_sleep)(void);
	void (*freeze_time_base)(bool freeze);

	/* keep the power of IP blocks during sleep/deep sleep */
	void (*set_ip_power)(bool enable, u32 mask);

	/* get platform supported power management modes */
	unsigned int (*get_pm_modes)(void);
};

extern const struct fsl_pm_ops *qoriq_pm_ops;

int __init fsl_rcpm_init(void);

#endif /* __PPC_FSL_PM_H */
+19 −0
Original line number Diff line number Diff line
@@ -181,6 +181,25 @@ exception_marker:
#endif

#ifdef CONFIG_PPC_BOOK3E
/*
 * stop a thread in the same core
 * input parameter:
 * r3 = the thread physical id
 */
_GLOBAL(book3e_stop_thread)
	cmpi	0, r3, 0
	beq	10f
	cmpi	0, r3, 1
	beq	10f
	/* If the thread id is invalid, just exit. */
	b	13f
10:
	li	r4, 1
	sld	r4, r4, r3
	mtspr	SPRN_TENC, r4
13:
	blr

_GLOBAL(fsl_secondary_thread_init)
	mfspr	r4,SPRN_BUCSR

+1 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ menuconfig FSL_SOC_BOOKE
	select FSL_PCI if PCI
	select SERIAL_8250_EXTENDED if SERIAL_8250
	select SERIAL_8250_SHARE_IRQ if SERIAL_8250
	select FSL_CORENET_RCPM if PPC_E500MC
	default y

if FSL_SOC_BOOKE
+3 −0
Original line number Diff line number Diff line
@@ -9,11 +9,14 @@
#include <linux/of_irq.h>
#include <linux/of_platform.h>

#include <asm/fsl_pm.h>
#include <soc/fsl/qe/qe.h>
#include <sysdev/cpm2_pic.h>

#include "mpc85xx.h"

const struct fsl_pm_ops *qoriq_pm_ops;

static const struct of_device_id mpc85xx_common_ids[] __initconst = {
	{ .type = "soc", },
	{ .compatible = "soc", },
Loading