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

Commit 06dbbd69 authored by Ben Dooks's avatar Ben Dooks Committed by Russell King
Browse files

[ARM] 4795/1: S3C244X: Add armclk and setparent call



Add armclk to the supported clocks on the S3C2440 and S3C2442 to
better represent the DVS state which controls whether FCLK or HCLK
is fed to the ARM core.

Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 3a38e4be
Loading
Loading
Loading
Loading
+37 −0
Original line number Original line Diff line number Diff line
@@ -44,15 +44,52 @@
#include <asm/plat-s3c24xx/clock.h>
#include <asm/plat-s3c24xx/clock.h>
#include <asm/plat-s3c24xx/cpu.h>
#include <asm/plat-s3c24xx/cpu.h>


static int s3c2440_setparent_armclk(struct clk *clk, struct clk *parent)
{
	unsigned long camdivn;
	unsigned long dvs;

	if (parent == &clk_f)
		dvs = 0;
	else if (parent == &clk_h)
		dvs = S3C2440_CAMDIVN_DVSEN;
	else
		return -EINVAL;

	clk->parent = parent;

	camdivn  = __raw_readl(S3C2440_CAMDIVN);
	camdivn &= ~S3C2440_CAMDIVN_DVSEN;
	camdivn |= dvs;
	__raw_writel(camdivn, S3C2440_CAMDIVN);

	return 0;
}

static struct clk clk_arm = {
	.name		= "armclk",
	.id		= -1,
	.set_parent	= s3c2440_setparent_armclk,
};

static int s3c244x_clk_add(struct sys_device *sysdev)
static int s3c244x_clk_add(struct sys_device *sysdev)
{
{
	unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN);
	unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN);
	unsigned long clkdivn;
	unsigned long clkdivn;
	struct clk *clock_upll;
	struct clk *clock_upll;
	int ret;


	printk("S3C244X: Clock Support, DVS %s\n",
	printk("S3C244X: Clock Support, DVS %s\n",
	       (camdivn & S3C2440_CAMDIVN_DVSEN) ? "on" : "off");
	       (camdivn & S3C2440_CAMDIVN_DVSEN) ? "on" : "off");


	clk_arm.parent = (camdivn & S3C2440_CAMDIVN_DVSEN) ? &clk_h : &clk_f;

	ret = s3c24xx_register_clock(&clk_arm);
	if (ret < 0) {
		printk(KERN_ERR "S3C24XX: Failed to add armclk (%d)\n", ret);
		return ret;
	}

	clock_upll = clk_get(NULL, "upll");
	clock_upll = clk_get(NULL, "upll");
	if (IS_ERR(clock_upll)) {
	if (IS_ERR(clock_upll)) {
		printk(KERN_ERR "S3C244X: Failed to get upll clock\n");
		printk(KERN_ERR "S3C244X: Failed to get upll clock\n");