DEVDISRn registers provides a mechanism for gating clocks of IP blocks that are not used. Here we implement hwconfig option to allow users to disable unused peripherals on the board. For ex. If eSDHC/qDMA/eDMA are unused and with disabled status in dts, User can enable CONFIG_FSL_DEVICE_DISABLE and set "devdis:esdhc,qdma,edma" in hwconfig, thus ESDHC controller & eDMA/qDMA will be clock gated to save more power. Signed-off-by: Zhuoyu Zhang <Zhuoyu.Zhang@freescale.com> Reviewed-by: York Sun <yorksun@freescale.com>master
parent
ec93af0dec
commit
03c22449c5
@ -0,0 +1,52 @@ |
||||
/*
|
||||
* Copyright 2015 Freescale Semiconductor, Inc. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#ifndef __FSL_LS102XA_DEVDIS_H_ |
||||
#define __FSL_LS102XA_DEVDIS_H_ |
||||
|
||||
#include <fsl_devdis.h> |
||||
|
||||
const struct devdis_table devdis_tbl[] = { |
||||
{ "pbl", 0x0, 0x80000000 }, /* PBL */ |
||||
{ "esdhc", 0x0, 0x20000000 }, /* eSDHC */ |
||||
{ "qdma", 0x0, 0x800000 }, /* qDMA */ |
||||
{ "edma", 0x0, 0x400000 }, /* eDMA */ |
||||
{ "usb3", 0x0, 0x84000 }, /* USB3.0 controller and PHY*/ |
||||
{ "usb2", 0x0, 0x40000 }, /* USB2.0 controller */ |
||||
{ "sata", 0x0, 0x8000 }, /* SATA */ |
||||
{ "sec", 0x0, 0x200 }, /* SEC */ |
||||
{ "dcu", 0x0, 0x2 }, /* Display controller Unit */ |
||||
{ "qe", 0x0, 0x1 }, /* QUICC Engine */ |
||||
{ "etsec1", 0x1, 0x80000000 }, /* eTSEC1 controller */ |
||||
{ "etesc2", 0x1, 0x40000000 }, /* eTSEC2 controller */ |
||||
{ "etsec3", 0x1, 0x20000000 }, /* eTSEC3 controller */ |
||||
{ "pex1", 0x2, 0x80000000 }, /* PCIE controller 1 */ |
||||
{ "pex2", 0x2, 0x40000000 }, /* PCIE controller 2 */ |
||||
{ "duart1", 0x3, 0x20000000 }, /* DUART1 */ |
||||
{ "duart2", 0x3, 0x10000000 }, /* DUART2 */ |
||||
{ "qspi", 0x3, 0x8000000 }, /* QSPI */ |
||||
{ "ddr", 0x4, 0x80000000 }, /* DDR */ |
||||
{ "ocram1", 0x4, 0x8000000 }, /* OCRAM1 */ |
||||
{ "ifc", 0x4, 0x800000 }, /* IFC */ |
||||
{ "gpio", 0x4, 0x400000 }, /* GPIO */ |
||||
{ "dbg", 0x4, 0x200000 }, /* DBG */ |
||||
{ "can1", 0x4, 0x80000 }, /* FlexCAN1 */ |
||||
{ "can2_4", 0x4, 0x40000 }, /* FlexCAN2_3_4 */ |
||||
{ "ftm2_8", 0x4, 0x20000 }, /* FlexTimer2_3_4_5_6_7_8 */ |
||||
{ "secmon", 0x4, 0x4000 }, /* Security Monitor */ |
||||
{ "wdog1_2", 0x4, 0x400 }, /* WatchDog1_2 */ |
||||
{ "i2c2_3", 0x4, 0x200 }, /* I2C2_3 */ |
||||
{ "sai1_4", 0x4, 0x100 }, /* SAI1_2_3_4 */ |
||||
{ "lpuart2_6", 0x4, 0x80 }, /* LPUART2_3_4_5_6 */ |
||||
{ "dspi1_2", 0x4, 0x40 }, /* DSPI1_2 */ |
||||
{ "asrc", 0x4, 0x20 }, /* ASRC */ |
||||
{ "spdif", 0x4, 0x10 }, /* SPDIF */ |
||||
{ "i2c1", 0x4, 0x4 }, /* I2C1 */ |
||||
{ "lpuart1", 0x4, 0x2 }, /* LPUART1 */ |
||||
{ "ftm1", 0x4, 0x1 }, /* FlexTimer1 */ |
||||
}; |
||||
|
||||
#endif |
@ -0,0 +1,29 @@ |
||||
/*
|
||||
* Copyright 2015 Freescale Semiconductor, Inc. |
||||
* Author: Zhuoyu Zhang <Zhuoyu.Zhang@freescale.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch-ls102xa/immap_ls102xa.h> |
||||
#include <asm/arch-ls102xa/config.h> |
||||
#include <linux/compiler.h> |
||||
#include <hwconfig.h> |
||||
#include <fsl_devdis.h> |
||||
|
||||
void device_disable(const struct devdis_table *tbl, uint32_t num) |
||||
{ |
||||
int i; |
||||
struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR; |
||||
|
||||
/*
|
||||
* Extract hwconfig from environment and disable unused device. |
||||
*/ |
||||
for (i = 0; i < num; i++) { |
||||
if (hwconfig_sub("devdis", tbl[i].name)) |
||||
setbits_be32(&gur->devdisr + tbl[i].offset, |
||||
tbl[i].mask); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,18 @@ |
||||
/*
|
||||
* Copyright 2015 Freescale Semiconductor, Inc. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#ifndef __FSL_DEVDIS_H_ |
||||
#define __FSL_DEVDIS_H_ |
||||
|
||||
struct devdis_table { |
||||
char name[32]; |
||||
u32 offset; |
||||
u32 mask; |
||||
}; |
||||
|
||||
void device_disable(const struct devdis_table *tbl, uint32_t num); |
||||
|
||||
#endif |
Loading…
Reference in new issue