Commit fd775c08 authored by Russell King's avatar Russell King Committed by Russell King

Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 into devel

parents dc52b5bf 4d1e4e5a
...@@ -62,9 +62,8 @@ static struct clk *clk_find(const char *dev_id, const char *con_id) ...@@ -62,9 +62,8 @@ static struct clk *clk_find(const char *dev_id, const char *con_id)
return clk; 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; struct clk *clk;
mutex_lock(&clocks_mutex); mutex_lock(&clocks_mutex);
...@@ -75,6 +74,14 @@ struct clk *clk_get(struct device *dev, const char *con_id) ...@@ -75,6 +74,14 @@ struct clk *clk_get(struct device *dev, const char *con_id)
return clk ? clk : ERR_PTR(-ENOENT); 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); EXPORT_SYMBOL(clk_get);
void clk_put(struct clk *clk) void clk_put(struct clk *clk)
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include <linux/string.h> #include <linux/string.h>
#include <asm/errno.h> #include <asm/errno.h>
#include <mach/imxfb.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/imx-regs.h> #include <mach/imx-regs.h>
...@@ -245,43 +244,8 @@ void __init imx_set_mmc_info(struct imxmmc_platform_data *info) ...@@ -245,43 +244,8 @@ void __init imx_set_mmc_info(struct imxmmc_platform_data *info)
imx_mmc_device.dev.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 = { static struct platform_device *devices[] __initdata = {
&imx_mmc_device, &imx_mmc_device,
&imxfb_device,
}; };
static struct map_desc imx_io_desc[] __initdata = { static struct map_desc imx_io_desc[] __initdata = {
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# Object file lists. # 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 obj-$(CONFIG_MACH_MX21) += clock_imx21.o
......
...@@ -229,7 +229,6 @@ struct platform_device mxc_nand_device = { ...@@ -229,7 +229,6 @@ struct platform_device mxc_nand_device = {
.resource = mxc_nand_resources, .resource = mxc_nand_resources,
}; };
#ifdef CONFIG_FB_IMX
/* /*
* lcdc: * lcdc:
* - i.MX1: the basic controller * - i.MX1: the basic controller
...@@ -259,7 +258,6 @@ struct platform_device mxc_fb_device = { ...@@ -259,7 +258,6 @@ struct platform_device mxc_fb_device = {
.coherent_dma_mask = 0xFFFFFFFF, .coherent_dma_mask = 0xFFFFFFFF,
}, },
}; };
#endif
#ifdef CONFIG_MACH_MX27 #ifdef CONFIG_MACH_MX27
static struct resource mxc_fec_resources[] = { static struct resource mxc_fec_resources[] = {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# #
# Common support # 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_MX1) += iomux-mx1-mx2.o dma-mx1-mx2.o
obj-$(CONFIG_ARCH_MX2) += iomux-mx1-mx2.o dma-mx1-mx2.o obj-$(CONFIG_ARCH_MX2) += iomux-mx1-mx2.o dma-mx1-mx2.o
......
...@@ -26,9 +26,6 @@ static inline void arch_idle(void) ...@@ -26,9 +26,6 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode, const char *cmd) void arch_reset(char mode, const char *cmd);
{
cpu_reset(0);
}
#endif /* __ASM_ARCH_MXC_SYSTEM_H__ */ #endif /* __ASM_ARCH_MXC_SYSTEM_H__ */
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* Copyright (C) 2000 Deep Blue Solutions Ltd * Copyright (C) 2000 Deep Blue Solutions Ltd
* Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved. * Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
* Copyright 2008 Juergen Beisert, kernel@pengutronix.de * 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 * 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 * it under the terms of the GNU General Public License as published by
...@@ -22,42 +23,45 @@ ...@@ -22,42 +23,45 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/err.h>
#include <linux/delay.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <asm/proc-fns.h> #include <asm/proc-fns.h>
#include <asm/system.h> #include <asm/system.h>
/* #ifdef CONFIG_ARCH_MX1
* Put the CPU into idle mode. It is called by default_idle() #define WDOG_WCR_REG IO_ADDRESS(WDT_BASE_ADDR)
* in process.c file. #define WDOG_WCR_ENABLE (1 << 0)
*/ #else
void arch_idle(void) #define WDOG_WCR_REG IO_ADDRESS(WDOG_BASE_ADDR)
{ #define WDOG_WCR_ENABLE (1 << 2)
/* #endif
* 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)
/* /*
* Reset the system. It is called by machine_restart(). * Reset the system. It is called by machine_restart().
*/ */
void arch_reset(char mode, const char *cmd) void arch_reset(char mode, const char *cmd)
{ {
struct clk *clk; if (!cpu_is_mx1()) {
struct clk *clk;
clk = clk_get(NULL, "wdog_clk"); clk = clk_get_sys("imx-wdt.0", NULL);
if (!clk) { if (!IS_ERR(clk))
printk(KERN_ERR"Cannot activate the watchdog. Giving up\n"); clk_enable(clk);
return;
} }
clk_enable(clk);
/* Assert SRS signal */ /* 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);
} }
...@@ -26,9 +26,11 @@ ...@@ -26,9 +26,11 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/clk.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/math64.h>
#include <mach/imxfb.h> #include <mach/imxfb.h>
...@@ -141,6 +143,7 @@ struct imxfb_rgb { ...@@ -141,6 +143,7 @@ struct imxfb_rgb {
struct imxfb_info { struct imxfb_info {
struct platform_device *pdev; struct platform_device *pdev;
void __iomem *regs; void __iomem *regs;
struct clk *clk;
u_int max_bpp; u_int max_bpp;
u_int max_xres; u_int max_xres;
...@@ -324,7 +327,7 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) ...@@ -324,7 +327,7 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
break; break;
case 16: case 16:
default: default:
if (readl(fbi->regs + LCDC_PCR) & PCR_TFT) if (fbi->pcr & PCR_TFT)
rgb = &def_rgb_16_tft; rgb = &def_rgb_16_tft;
else else
rgb = &def_rgb_16_stn; rgb = &def_rgb_16_stn;
...@@ -403,6 +406,8 @@ static void imxfb_enable_controller(struct imxfb_info *fbi) ...@@ -403,6 +406,8 @@ static void imxfb_enable_controller(struct imxfb_info *fbi)
writel(RMCR_LCDC_EN, fbi->regs + LCDC_RMCR); writel(RMCR_LCDC_EN, fbi->regs + LCDC_RMCR);
clk_enable(fbi->clk);
if (fbi->backlight_power) if (fbi->backlight_power)
fbi->backlight_power(1); fbi->backlight_power(1);
if (fbi->lcd_power) if (fbi->lcd_power)
...@@ -418,6 +423,8 @@ static void imxfb_disable_controller(struct imxfb_info *fbi) ...@@ -418,6 +423,8 @@ static void imxfb_disable_controller(struct imxfb_info *fbi)
if (fbi->lcd_power) if (fbi->lcd_power)
fbi->lcd_power(0); fbi->lcd_power(0);
clk_disable(fbi->clk);
writel(0, fbi->regs + LCDC_RMCR); writel(0, fbi->regs + LCDC_RMCR);
} }
...@@ -461,6 +468,9 @@ static struct fb_ops imxfb_ops = { ...@@ -461,6 +468,9 @@ static struct fb_ops imxfb_ops = {
static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info) static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info)
{ {
struct imxfb_info *fbi = info->par; 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", pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n",
var->xres, var->hsync_len, var->xres, var->hsync_len,
var->left_margin, var->right_margin); var->left_margin, var->right_margin);
...@@ -507,7 +517,23 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf ...@@ -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), writel(SIZE_XMAX(var->xres) | SIZE_YMAX(var->yres),
fbi->regs + LCDC_SIZE); 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->pwmr, fbi->regs + LCDC_PWMR);
writel(fbi->lscr1, fbi->regs + LCDC_LSCR1); writel(fbi->lscr1, fbi->regs + LCDC_LSCR1);
writel(fbi->dmacr, fbi->regs + LCDC_DMACR); writel(fbi->dmacr, fbi->regs + LCDC_DMACR);
...@@ -649,6 +675,13 @@ static int __init imxfb_probe(struct platform_device *pdev) ...@@ -649,6 +675,13 @@ static int __init imxfb_probe(struct platform_device *pdev)
goto failed_req; 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)); fbi->regs = ioremap(res->start, resource_size(res));
if (fbi->regs == NULL) { if (fbi->regs == NULL) {
printk(KERN_ERR"Cannot map frame buffer registers\n"); printk(KERN_ERR"Cannot map frame buffer registers\n");
...@@ -717,6 +750,8 @@ static int __init imxfb_probe(struct platform_device *pdev) ...@@ -717,6 +750,8 @@ static int __init imxfb_probe(struct platform_device *pdev)
dma_free_writecombine(&pdev->dev,fbi->map_size,fbi->map_cpu, dma_free_writecombine(&pdev->dev,fbi->map_size,fbi->map_cpu,
fbi->map_dma); fbi->map_dma);
failed_map: failed_map:
clk_put(fbi->clk);
failed_getclock:
iounmap(fbi->regs); iounmap(fbi->regs);
failed_ioremap: failed_ioremap:
release_mem_region(res->start, res->end - res->start); release_mem_region(res->start, res->end - res->start);
...@@ -751,6 +786,9 @@ static int __devexit imxfb_remove(struct platform_device *pdev) ...@@ -751,6 +786,9 @@ static int __devexit imxfb_remove(struct platform_device *pdev)
iounmap(fbi->regs); iounmap(fbi->regs);
release_mem_region(res->start, res->end - res->start + 1); release_mem_region(res->start, res->end - res->start + 1);
clk_disable(fbi->clk);
clk_put(fbi->clk);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
return 0; return 0;
......
...@@ -125,4 +125,21 @@ int clk_set_parent(struct clk *clk, struct clk *parent); ...@@ -125,4 +125,21 @@ int clk_set_parent(struct clk *clk, struct clk *parent);
*/ */
struct clk *clk_get_parent(struct clk *clk); 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 #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment