Skip to content

Commit

Permalink
powerpc/rcpm: add RCPM driver
Browse files Browse the repository at this point in the history
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: Chenhui Zhao <chenhui.zhao@freescale.com>
Signed-off-by: Tang Yuantian <Yuantian.Tang@freescale.com>
[scottwood: remove __KERNEL__ ifdef]
Signed-off-by: Scott Wood <oss@buserror.net>
  • Loading branch information
chenhui zhao authored and Scott Wood committed Mar 5, 2016
1 parent e7affb1 commit d17799f
Show file tree
Hide file tree
Showing 9 changed files with 571 additions and 0 deletions.
1 change: 1 addition & 0 deletions arch/powerpc/include/asm/cputhreads.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ static inline u32 get_tensr(void)
return 1;
}

void book3e_stop_thread(int thread);

#endif /* _ASM_POWERPC_CPUTHREADS_H */

51 changes: 51 additions & 0 deletions arch/powerpc/include/asm/fsl_pm.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* 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 changes: 19 additions & 0 deletions arch/powerpc/kernel/head_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions arch/powerpc/platforms/85xx/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions arch/powerpc/platforms/85xx/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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", },
Expand Down
5 changes: 5 additions & 0 deletions arch/powerpc/sysdev/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,8 @@ config SCOM_DEBUGFS
config GE_FPGA
bool
default n

config FSL_CORENET_RCPM
bool
help
This option enables support for RCPM (Run Control/Power Management).
1 change: 1 addition & 0 deletions arch/powerpc/sysdev/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o
obj-$(CONFIG_FSL_SOC) += fsl_soc.o fsl_mpic_err.o
obj-$(CONFIG_FSL_PCI) += fsl_pci.o $(fsl-msi-obj-y)
obj-$(CONFIG_FSL_PMC) += fsl_pmc.o
obj-$(CONFIG_FSL_CORENET_RCPM) += fsl_rcpm.o
obj-$(CONFIG_FSL_LBC) += fsl_lbc.o
obj-$(CONFIG_FSL_GTM) += fsl_gtm.o
obj-$(CONFIG_FSL_85XX_CACHE_SRAM) += fsl_85xx_l2ctlr.o fsl_85xx_cache_sram.o
Expand Down
Loading

0 comments on commit d17799f

Please sign in to comment.