[RFC] S3C24xx: Enable only the clocks of used units
Juergen Beisert
jbe at pengutronix.de
Mon Oct 18 12:59:51 EDT 2010
From: Juergen Beisert <juergen at kreuzholzen.de>
Subject: [RFC] S3C24xx: Enable only the clocks of used units
This patch disables most of the processor's clocks and enable them on demand
only.
Signed-off-by: Juergen Beisert <juergen at kreuzholzen.de>
---
arch/arm/mach-s3c24xx/generic.c | 22 +++++++++
arch/arm/mach-s3c24xx/include/mach/s3c24x0-clocks.h | 46 ++++++++++++++++++++
arch/arm/mach-s3c24xx/lowlevel-init.S | 12 ++++-
drivers/mtd/nand/nand_s3c2410.c | 3 +
drivers/serial/serial_s3c24x0.c | 3 +
5 files changed, 84 insertions(+), 2 deletions(-)
Index: barebox-2010.10.0/arch/arm/mach-s3c24xx/generic.c
===================================================================
--- barebox-2010.10.0.orig/arch/arm/mach-s3c24xx/generic.c
+++ barebox-2010.10.0/arch/arm/mach-s3c24xx/generic.c
@@ -28,6 +28,7 @@
#include <clock.h>
#include <asm/io.h>
#include <mach/s3c24x0-iomap.h>
+#include <mach/s3c24x0-clocks.h>
#define LOCKTIME (S3C24X0_CLOCK_POWER_BASE)
#define MPLLCON (S3C24X0_CLOCK_POWER_BASE + 0x4)
@@ -202,6 +203,25 @@ unsigned s3c24x0_get_memory_size(void)
}
/**
+ * Enable or disable unit's clock
+ * @param unit Unit to manipulate (refer CLK_* macros)
+ * @param state 1 for enable, 0 for disable
+ */
+void s3c244x_mod_clock(unsigned unit, int state)
+{
+ uint32_t clkcon;
+
+ clkcon = readl(CLKCON);
+
+ if (state != 0)
+ clkcon |= unit;
+ else
+ clkcon &= ~unit;
+
+ writel(clkcon, CLKCON);
+}
+
+/**
* Show the user the current clock settings
*/
int s3c24xx_dump_clocks(void)
@@ -236,6 +256,8 @@ static int clocksource_init (void)
{
unsigned p_clk = s3c24xx_get_pclk();
+ s3c244x_mod_clock(CLK_PWMTIMER, 1);
+
writel(0x00000000, TCON); /* stop all timers */
writel(0x00ffffff, TCFG0); /* PCLK / (255 + 1) for timer 4 */
writel(0x00030000, TCFG1); /* /16 */
Index: barebox-2010.10.0/arch/arm/mach-s3c24xx/include/mach/s3c24x0-clocks.h
===================================================================
--- /dev/null
+++ barebox-2010.10.0/arch/arm/mach-s3c24xx/include/mach/s3c24x0-clocks.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2010 Juergen Beisert
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef _MACH_CLOCKS_H_
+# define _MACH_CLOCKS_H_
+
+/* Bits in register CLKCON to control unit's clock */
+#define CLK_AC97 (1 << 20)
+#define CLK_CAMERA (1 << 19)
+#define CLK_SPI (1 << 18)
+#define CLK_IIS (1 << 17)
+#define CLK_IIC (1 << 16)
+#define CLK_ADC (1 << 15)
+#define CLK_RTC (1 << 14)
+#define CLK_GPIO (1 << 13)
+#define CLK_UART2 (1 << 12)
+#define CLK_UART1 (1 << 11)
+#define CLK_UART0 (1 << 10)
+#define CLK_SDI (1 << 9)
+#define CLK_PWMTIMER (1 << 8)
+#define CLK_USBDEV (1 << 7)
+#define CLK_USBHOST (1 << 6)
+#define CLK_LCDC (1 << 5)
+#define CLK_NAND (1 << 4)
+
+#ifndef __ASSEMBLY__
+void s3c244x_mod_clock(unsigned, int);
+#endif
+
+#endif /* _MACH_CLOCKS_H_ */
Index: barebox-2010.10.0/arch/arm/mach-s3c24xx/lowlevel-init.S
===================================================================
--- barebox-2010.10.0.orig/arch/arm/mach-s3c24xx/lowlevel-init.S
+++ barebox-2010.10.0/arch/arm/mach-s3c24xx/lowlevel-init.S
@@ -20,6 +20,7 @@
#include <config.h>
#include <mach/s3c24x0-iomap.h>
+#include <mach/s3c24x0-clocks.h>
.section ".text_bare_init.s3c24x0_disable_wd","ax"
@@ -83,8 +84,15 @@ s3c24x0_pll_init:
mov r1, #BOARD_SPECIFIC_CLKDIVN
str r1, [r0, #20]
- /* enable all devices on this chip */
- mov r1, #0xFFFFFFF0
+ /*
+ * Disable the clocks for most devices on this chip.
+ * They will be enabled again on demand
+ */
+#ifdef CONFIG_S3C24XX_NAND_BOOT
+ ldr r1, =0x6010 /* (CLK_RTC | CLK_GPIO | CLK_NAND) */
+#else
+ mov r1, #0x6000 /* (CLK_RTC | CLK_GPIO) */
+#endif
str r1, [r0, #12]
/* ??????? */
Index: barebox-2010.10.0/drivers/mtd/nand/nand_s3c2410.c
===================================================================
--- barebox-2010.10.0.orig/drivers/mtd/nand/nand_s3c2410.c
+++ barebox-2010.10.0/drivers/mtd/nand/nand_s3c2410.c
@@ -32,6 +32,7 @@
#include <linux/mtd/nand.h>
#include <mach/s3c24xx-generic.h>
#include <mach/s3c24x0-iomap.h>
+#include <mach/s3c24x0-clocks.h>
#include <mach/s3c24x0-nand.h>
#include <asm/io.h>
#include <asm-generic/errno.h>
@@ -358,6 +359,8 @@ static int s3c24x0_nand_probe(struct dev
if (!host)
return -ENOMEM;
+ s3c244x_mod_clock(CLK_NAND, 1);
+
host->dev = dev;
host->base = dev->map_base;
Index: barebox-2010.10.0/drivers/serial/serial_s3c24x0.c
===================================================================
--- barebox-2010.10.0.orig/drivers/serial/serial_s3c24x0.c
+++ barebox-2010.10.0/drivers/serial/serial_s3c24x0.c
@@ -27,6 +27,7 @@
#include <asm/io.h>
#include <mach/s3c24xx-generic.h>
#include <mach/s3c24x0-iomap.h>
+#include <mach/s3c24x0-clocks.h>
/* Note: Offsets are for little endian access */
#define ULCON 0x00 /* line control */
@@ -123,6 +124,8 @@ static int s3c24x0_serial_probe(struct d
cdev = malloc(sizeof(struct console_device));
+ s3c244x_mod_clock(CLK_UART0 | CLK_UART1 | CLK_UART2, 1);
+
dev->type_data = cdev;
cdev->dev = dev;
cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
More information about the barebox
mailing list