Skip to content

Commit

Permalink
Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 …
Browse files Browse the repository at this point in the history
…into devel
  • Loading branch information
Russell King authored and Russell King committed Mar 28, 2009
2 parents dc52b5b + 4d1e4e5 commit fd775c0
Show file tree
Hide file tree
Showing 9 changed files with 96 additions and 71 deletions.
11 changes: 9 additions & 2 deletions arch/arm/common/clkdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,8 @@ static struct clk *clk_find(const char *dev_id, const char *con_id)
return clk;
}

struct clk *clk_get(struct device *dev, const char *con_id)
struct clk *clk_get_sys(const char *dev_id, const char *con_id)
{
const char *dev_id = dev ? dev_name(dev) : NULL;
struct clk *clk;

mutex_lock(&clocks_mutex);
Expand All @@ -75,6 +74,14 @@ struct clk *clk_get(struct device *dev, const char *con_id)

return clk ? clk : ERR_PTR(-ENOENT);
}
EXPORT_SYMBOL(clk_get_sys);

struct clk *clk_get(struct device *dev, const char *con_id)
{
const char *dev_id = dev ? dev_name(dev) : NULL;

return clk_get_sys(dev_id, con_id);
}
EXPORT_SYMBOL(clk_get);

void clk_put(struct clk *clk)
Expand Down
36 changes: 0 additions & 36 deletions arch/arm/mach-imx/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
#include <linux/string.h>

#include <asm/errno.h>
#include <mach/imxfb.h>
#include <mach/hardware.h>
#include <mach/imx-regs.h>

Expand Down Expand Up @@ -245,43 +244,8 @@ void __init imx_set_mmc_info(struct imxmmc_platform_data *info)
imx_mmc_device.dev.platform_data = info;
}

static struct imx_fb_platform_data imx_fb_info;

void __init set_imx_fb_info(struct imx_fb_platform_data *hard_imx_fb_info)
{
memcpy(&imx_fb_info,hard_imx_fb_info,sizeof(struct imx_fb_platform_data));
}

static struct resource imxfb_resources[] = {
[0] = {
.start = 0x00205000,
.end = 0x002050FF,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = LCDC_INT,
.end = LCDC_INT,
.flags = IORESOURCE_IRQ,
},
};

static u64 fb_dma_mask = ~(u64)0;

static struct platform_device imxfb_device = {
.name = "imx-fb",
.id = 0,
.dev = {
.platform_data = &imx_fb_info,
.dma_mask = &fb_dma_mask,
.coherent_dma_mask = 0xffffffff,
},
.num_resources = ARRAY_SIZE(imxfb_resources),
.resource = imxfb_resources,
};

static struct platform_device *devices[] __initdata = {
&imx_mmc_device,
&imxfb_device,
};

static struct map_desc imx_io_desc[] __initdata = {
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-mx2/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# Object file lists.

obj-y := system.o generic.o devices.o serial.o
obj-y := generic.o devices.o serial.o

obj-$(CONFIG_MACH_MX21) += clock_imx21.o

Expand Down
2 changes: 0 additions & 2 deletions arch/arm/mach-mx2/devices.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,6 @@ struct platform_device mxc_nand_device = {
.resource = mxc_nand_resources,
};

#ifdef CONFIG_FB_IMX
/*
* lcdc:
* - i.MX1: the basic controller
Expand Down Expand Up @@ -259,7 +258,6 @@ struct platform_device mxc_fb_device = {
.coherent_dma_mask = 0xFFFFFFFF,
},
};
#endif

#ifdef CONFIG_MACH_MX27
static struct resource mxc_fec_resources[] = {
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/plat-mxc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#

# Common support
obj-y := irq.o clock.o gpio.o time.o devices.o cpu.o
obj-y := irq.o clock.o gpio.o time.o devices.o cpu.o system.o

obj-$(CONFIG_ARCH_MX1) += iomux-mx1-mx2.o dma-mx1-mx2.o
obj-$(CONFIG_ARCH_MX2) += iomux-mx1-mx2.o dma-mx1-mx2.o
Expand Down
5 changes: 1 addition & 4 deletions arch/arm/plat-mxc/include/mach/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,6 @@ static inline void arch_idle(void)
cpu_do_idle();
}

static inline void arch_reset(char mode, const char *cmd)
{
cpu_reset(0);
}
void arch_reset(char mode, const char *cmd);

#endif /* __ASM_ARCH_MXC_SYSTEM_H__ */
50 changes: 27 additions & 23 deletions arch/arm/mach-mx2/system.c → arch/arm/plat-mxc/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (C) 2000 Deep Blue Solutions Ltd
* Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
* Copyright 2008 Juergen Beisert, kernel@pengutronix.de
* Copyright 2009 Ilya Yanok, Emcraft Systems Ltd, yanok@emcraft.com
*
* 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
Expand All @@ -22,42 +23,45 @@
#include <linux/kernel.h>
#include <linux/clk.h>
#include <linux/io.h>
#include <linux/err.h>
#include <linux/delay.h>

#include <mach/hardware.h>
#include <asm/proc-fns.h>
#include <asm/system.h>

/*
* Put the CPU into idle mode. It is called by default_idle()
* in process.c file.
*/
void arch_idle(void)
{
/*
* This should do all the clock switching
* and wait for interrupt tricks.
*/
cpu_do_idle();
}

#define WDOG_WCR_REG IO_ADDRESS(WDOG_BASE_ADDR)
#define WDOG_WCR_SRS (1 << 4)
#ifdef CONFIG_ARCH_MX1
#define WDOG_WCR_REG IO_ADDRESS(WDT_BASE_ADDR)
#define WDOG_WCR_ENABLE (1 << 0)
#else
#define WDOG_WCR_REG IO_ADDRESS(WDOG_BASE_ADDR)
#define WDOG_WCR_ENABLE (1 << 2)
#endif

/*
* Reset the system. It is called by machine_restart().
*/
void arch_reset(char mode, const char *cmd)
{
struct clk *clk;
if (!cpu_is_mx1()) {
struct clk *clk;

clk = clk_get(NULL, "wdog_clk");
if (!clk) {
printk(KERN_ERR"Cannot activate the watchdog. Giving up\n");
return;
clk = clk_get_sys("imx-wdt.0", NULL);
if (!IS_ERR(clk))
clk_enable(clk);
}

clk_enable(clk);

/* Assert SRS signal */
__raw_writew(__raw_readw(WDOG_WCR_REG) & ~WDOG_WCR_SRS, WDOG_WCR_REG);
__raw_writew(WDOG_WCR_ENABLE, WDOG_WCR_REG);

/* wait for reset to assert... */
mdelay(500);

printk(KERN_ERR "Watchdog reset failed to assert reset\n");

/* delay to allow the serial port to show the message */
mdelay(50);

/* we'll take a jump through zero as a poor second */
cpu_reset(0);
}
42 changes: 40 additions & 2 deletions drivers/video/imxfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@
#include <linux/init.h>
#include <linux/ioport.h>
#include <linux/cpufreq.h>
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <linux/io.h>
#include <linux/math64.h>

#include <mach/imxfb.h>

Expand Down Expand Up @@ -141,6 +143,7 @@ struct imxfb_rgb {
struct imxfb_info {
struct platform_device *pdev;
void __iomem *regs;
struct clk *clk;

u_int max_bpp;
u_int max_xres;
Expand Down Expand Up @@ -324,7 +327,7 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
break;
case 16:
default:
if (readl(fbi->regs + LCDC_PCR) & PCR_TFT)
if (fbi->pcr & PCR_TFT)
rgb = &def_rgb_16_tft;
else
rgb = &def_rgb_16_stn;
Expand Down Expand Up @@ -403,6 +406,8 @@ static void imxfb_enable_controller(struct imxfb_info *fbi)

writel(RMCR_LCDC_EN, fbi->regs + LCDC_RMCR);

clk_enable(fbi->clk);

if (fbi->backlight_power)
fbi->backlight_power(1);
if (fbi->lcd_power)
Expand All @@ -418,6 +423,8 @@ static void imxfb_disable_controller(struct imxfb_info *fbi)
if (fbi->lcd_power)
fbi->lcd_power(0);

clk_disable(fbi->clk);

writel(0, fbi->regs + LCDC_RMCR);
}

Expand Down Expand Up @@ -461,6 +468,9 @@ static struct fb_ops imxfb_ops = {
static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
struct imxfb_info *fbi = info->par;
unsigned int pcr, lcd_clk;
unsigned long long tmp;

pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n",
var->xres, var->hsync_len,
var->left_margin, var->right_margin);
Expand Down Expand Up @@ -507,7 +517,23 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf

writel(SIZE_XMAX(var->xres) | SIZE_YMAX(var->yres),
fbi->regs + LCDC_SIZE);
writel(fbi->pcr, fbi->regs + LCDC_PCR);

lcd_clk = clk_get_rate(fbi->clk);
tmp = var->pixclock * (unsigned long long)lcd_clk;
do_div(tmp, 1000000);
if (do_div(tmp, 1000000) > 500000)
tmp++;
pcr = (unsigned int)tmp;
if (--pcr > 0x3F) {
pcr = 0x3F;
printk(KERN_WARNING "Must limit pixel clock to %uHz\n",
lcd_clk / pcr);
}

/* add sync polarities */
pcr |= fbi->pcr & ~0x3F;

writel(pcr, fbi->regs + LCDC_PCR);
writel(fbi->pwmr, fbi->regs + LCDC_PWMR);
writel(fbi->lscr1, fbi->regs + LCDC_LSCR1);
writel(fbi->dmacr, fbi->regs + LCDC_DMACR);
Expand Down Expand Up @@ -649,6 +675,13 @@ static int __init imxfb_probe(struct platform_device *pdev)
goto failed_req;
}

fbi->clk = clk_get(&pdev->dev, NULL);
if (IS_ERR(fbi->clk)) {
ret = PTR_ERR(fbi->clk);;
dev_err(&pdev->dev, "unable to get clock: %d\n", ret);
goto failed_getclock;
}

fbi->regs = ioremap(res->start, resource_size(res));
if (fbi->regs == NULL) {
printk(KERN_ERR"Cannot map frame buffer registers\n");
Expand Down Expand Up @@ -717,6 +750,8 @@ static int __init imxfb_probe(struct platform_device *pdev)
dma_free_writecombine(&pdev->dev,fbi->map_size,fbi->map_cpu,
fbi->map_dma);
failed_map:
clk_put(fbi->clk);
failed_getclock:
iounmap(fbi->regs);
failed_ioremap:
release_mem_region(res->start, res->end - res->start);
Expand Down Expand Up @@ -751,6 +786,9 @@ static int __devexit imxfb_remove(struct platform_device *pdev)

iounmap(fbi->regs);
release_mem_region(res->start, res->end - res->start + 1);
clk_disable(fbi->clk);
clk_put(fbi->clk);

platform_set_drvdata(pdev, NULL);

return 0;
Expand Down
17 changes: 17 additions & 0 deletions include/linux/clk.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,4 +125,21 @@ int clk_set_parent(struct clk *clk, struct clk *parent);
*/
struct clk *clk_get_parent(struct clk *clk);

/**
* clk_get_sys - get a clock based upon the device name
* @dev_id: device name
* @con_id: connection ID
*
* Returns a struct clk corresponding to the clock producer, or
* valid IS_ERR() condition containing errno. The implementation
* uses @dev_id and @con_id to determine the clock consumer, and
* thereby the clock producer. In contrast to clk_get() this function
* takes the device name instead of the device itself for identification.
*
* Drivers must assume that the clock source is not enabled.
*
* clk_get_sys should not be called from within interrupt context.
*/
struct clk *clk_get_sys(const char *dev_id, const char *con_id);

#endif

0 comments on commit fd775c0

Please sign in to comment.