]> git.sur5r.net Git - u-boot/commitdiff
arm/ls102xa:add hwconfig setting to support disable unused devices
authorZhuoyu Zhang <Zhuoyu.Zhang@freescale.com>
Mon, 17 Aug 2015 10:55:12 +0000 (18:55 +0800)
committerYork Sun <yorksun@freescale.com>
Wed, 2 Sep 2015 02:49:20 +0000 (21:49 -0500)
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>
arch/arm/include/asm/arch-ls102xa/ls102xa_devdis.h [new file with mode: 0644]
board/freescale/ls1021aqds/ls1021aqds.c
board/freescale/ls1021atwr/ls1021atwr.c
drivers/misc/Makefile
drivers/misc/fsl_devdis.c [new file with mode: 0644]
include/configs/ls1021aqds.h
include/configs/ls1021atwr.h
include/fsl_devdis.h [new file with mode: 0644]

diff --git a/arch/arm/include/asm/arch-ls102xa/ls102xa_devdis.h b/arch/arm/include/asm/arch-ls102xa/ls102xa_devdis.h
new file mode 100644 (file)
index 0000000..3e9e9ea
--- /dev/null
@@ -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
index e5853804877678e5efb86a1a877e4f3d04fe934e..655fc644fe90e036578cd37b3e177df6050392af 100644 (file)
 #include <asm/arch/clock.h>
 #include <asm/arch/fsl_serdes.h>
 #include <asm/arch/ls102xa_stream_id.h>
+#include <asm/arch/ls102xa_devdis.h>
 #include <hwconfig.h>
 #include <mmc.h>
 #include <fsl_esdhc.h>
 #include <fsl_ifc.h>
 #include <fsl_sec.h>
 #include <spl.h>
+#include <fsl_devdis.h>
 
 #include "../common/sleep.h"
 #include "../common/qixis.h"
@@ -531,6 +533,9 @@ int misc_init_r(void)
        else if (hwconfig("sdhc"))
                config_board_mux(MUX_TYPE_SDHC);
 
+#ifdef CONFIG_FSL_DEVICE_DISABLE
+       device_disable(devdis_tbl, ARRAY_SIZE(devdis_tbl));
+#endif
 #ifdef CONFIG_FSL_CAAM
        return sec_init();
 #endif
index 006700f420f7691e0223441e8c0d489b15b94344..228dbf81bb25eba2c2758f39836ee61778d38467 100644 (file)
@@ -12,6 +12,7 @@
 #include <asm/arch/clock.h>
 #include <asm/arch/fsl_serdes.h>
 #include <asm/arch/ls102xa_stream_id.h>
+#include <asm/arch/ls102xa_devdis.h>
 #include <hwconfig.h>
 #include <mmc.h>
 #include <fsl_esdhc.h>
@@ -21,6 +22,7 @@
 #include <fsl_mdio.h>
 #include <tsec.h>
 #include <fsl_sec.h>
+#include <fsl_devdis.h>
 #include <spl.h>
 #include "../common/sleep.h"
 #ifdef CONFIG_U_QE
@@ -652,6 +654,9 @@ int board_init(void)
 #if defined(CONFIG_MISC_INIT_R)
 int misc_init_r(void)
 {
+#ifdef CONFIG_FSL_DEVICE_DISABLE
+       device_disable(devdis_tbl, ARRAY_SIZE(devdis_tbl));
+#endif
 #ifndef CONFIG_QSPI_BOOT
        config_board_mux();
 #endif
index 5218b91c0baf8a957b11aaca86f5403fb25f4e82..8d0fc3c5cbcb7331e89ad435b921b7bf253d07a9 100644 (file)
@@ -35,3 +35,4 @@ obj-$(CONFIG_FSL_IFC) += fsl_ifc.o
 obj-$(CONFIG_FSL_SEC_MON) += fsl_sec_mon.o
 obj-$(CONFIG_PCA9551_LED) += pca9551_led.o
 obj-$(CONFIG_RESET) += reset-uclass.o
+obj-$(CONFIG_FSL_DEVICE_DISABLE) += fsl_devdis.o
diff --git a/drivers/misc/fsl_devdis.c b/drivers/misc/fsl_devdis.c
new file mode 100644 (file)
index 0000000..996f45c
--- /dev/null
@@ -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);
+       }
+}
+
index dfaffa13d3c040bb9d76221446e8ef827b620f87..b44f3264e318e2154ee25f12db63118136d07721 100644 (file)
@@ -566,7 +566,9 @@ unsigned long get_board_ddr_clk(void);
 #define CONFIG_TIMER_CLK_FREQ          12500000
 
 #define CONFIG_HWCONFIG
-#define HWCONFIG_BUFFER_SIZE           128
+#define HWCONFIG_BUFFER_SIZE           256
+
+#define CONFIG_FSL_DEVICE_DISABLE
 
 #define CONFIG_BOOTDELAY               3
 
index 3299a9f593ee692ca7765906a4859552a2e446ec..7dcb719b0133af50814dabfa8bf4316cf868b4fe 100644 (file)
 #define CONFIG_TIMER_CLK_FREQ          12500000
 
 #define CONFIG_HWCONFIG
-#define HWCONFIG_BUFFER_SIZE           128
+#define HWCONFIG_BUFFER_SIZE           256
+
+#define CONFIG_FSL_DEVICE_DISABLE
 
 #define CONFIG_BOOTDELAY               3
 
diff --git a/include/fsl_devdis.h b/include/fsl_devdis.h
new file mode 100644 (file)
index 0000000..02415fe
--- /dev/null
@@ -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