Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 into devel
This commit is contained in:
@@ -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)
|
|||||||
|
|
||||||
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 @@
|
|||||||
#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)
|
|||||||
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 @@
|
|||||||
|
|
||||||
# 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 = {
|
|||||||
.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 = {
|
|||||||
.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 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
# 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)
|
|||||||
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 @@
|
|||||||
* 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 @@
|
|||||||
#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)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* 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_REG IO_ADDRESS(WDOG_BASE_ADDR)
|
||||||
#define WDOG_WCR_SRS (1 << 4)
|
#define WDOG_WCR_ENABLE (1 << 2)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
|
if (!cpu_is_mx1()) {
|
||||||
struct clk *clk;
|
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");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
clk_enable(clk);
|
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 @@
|
|||||||
#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 {
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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 = {
|
|||||||
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
|
|||||||
|
|
||||||
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)
|
|||||||
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 @@ failed_platform_init:
|
|||||||
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)
|
|||||||
|
|
||||||
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);
|
|||||||
*/
|
*/
|
||||||
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
|
||||||
|
Reference in New Issue
Block a user