Commit 312286aa authored by Kevin Hilman's avatar Kevin Hilman

Merge branch 'davinci-upstream-submitted' into davinci-reset

parents c95dc93d 62597811
...@@ -412,7 +412,11 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size ...@@ -412,7 +412,11 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size
orr r1, r1, #3 << 10 orr r1, r1, #3 << 10
add r2, r3, #16384 add r2, r3, #16384
1: cmp r1, r9 @ if virt > start of RAM 1: cmp r1, r9 @ if virt > start of RAM
#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
orrhs r1, r1, #0x08 @ set cacheable
#else
orrhs r1, r1, #0x0c @ set cacheable, bufferable orrhs r1, r1, #0x0c @ set cacheable, bufferable
#endif
cmp r1, r10 @ if virt > end of RAM cmp r1, r10 @ if virt > end of RAM
bichs r1, r1, #0x0c @ clear cacheable, bufferable bichs r1, r1, #0x0c @ clear cacheable, bufferable
str r1, [r0], #4 @ 1:1 mapping str r1, [r0], #4 @ 1:1 mapping
...@@ -436,6 +440,11 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size ...@@ -436,6 +440,11 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size
mov pc, lr mov pc, lr
ENDPROC(__setup_mmu) ENDPROC(__setup_mmu)
__arm926ejs_mmu_cache_on:
#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
mov r0, #4 @ put dcache in WT mode
mcr p15, 7, r0, c15, c0, 0
#endif
__armv4_mmu_cache_on: __armv4_mmu_cache_on:
mov r12, lr mov r12, lr
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
...@@ -655,6 +664,12 @@ proc_types: ...@@ -655,6 +664,12 @@ proc_types:
W(b) __armv4_mpu_cache_off W(b) __armv4_mpu_cache_off
W(b) __armv4_mpu_cache_flush W(b) __armv4_mpu_cache_flush
.word 0x41069260 @ ARM926EJ-S (v5TEJ)
.word 0xff0ffff0
b __arm926ejs_mmu_cache_on
b __armv4_mmu_cache_off
b __armv5tej_mmu_cache_flush
.word 0x00007000 @ ARM7 IDs .word 0x00007000 @ ARM7 IDs
.word 0x0000f000 .word 0x0000f000
mov pc, lr mov pc, lr
......
...@@ -79,6 +79,10 @@ struct davinci_nand_pdata { /* platform_data */ ...@@ -79,6 +79,10 @@ struct davinci_nand_pdata { /* platform_data */
/* e.g. NAND_BUSWIDTH_16 or NAND_USE_FLASH_BBT */ /* e.g. NAND_BUSWIDTH_16 or NAND_USE_FLASH_BBT */
unsigned options; unsigned options;
/* Main and mirror bbt descriptor overrides */
struct nand_bbt_descr *bbt_td;
struct nand_bbt_descr *bbt_md;
}; };
#endif /* __ARCH_ARM_DAVINCI_NAND_H */ #endif /* __ARCH_ARM_DAVINCI_NAND_H */
...@@ -251,6 +251,14 @@ config MMC_MVSDIO ...@@ -251,6 +251,14 @@ config MMC_MVSDIO
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called mvsdio. module will be called mvsdio.
config MMC_DAVINCI
tristate "TI DAVINCI Multimedia Card Interface support"
depends on ARCH_DAVINCI
help
This selects the TI DAVINCI Multimedia card Interface.
If you have an DAVINCI board with a Multimedia Card slot,
say Y or M here. If unsure, say N.
config MMC_SPI config MMC_SPI
tristate "MMC/SD/SDIO over SPI" tristate "MMC/SD/SDIO over SPI"
depends on SPI_MASTER && !HIGHMEM && HAS_DMA depends on SPI_MASTER && !HIGHMEM && HAS_DMA
......
...@@ -25,6 +25,7 @@ obj-$(CONFIG_MMC_ATMELMCI) += atmel-mci.o ...@@ -25,6 +25,7 @@ obj-$(CONFIG_MMC_ATMELMCI) += atmel-mci.o
obj-$(CONFIG_MMC_TIFM_SD) += tifm_sd.o obj-$(CONFIG_MMC_TIFM_SD) += tifm_sd.o
obj-$(CONFIG_MMC_MSM7X00A) += msm_sdcc.o obj-$(CONFIG_MMC_MSM7X00A) += msm_sdcc.o
obj-$(CONFIG_MMC_MVSDIO) += mvsdio.o obj-$(CONFIG_MMC_MVSDIO) += mvsdio.o
obj-$(CONFIG_MMC_DAVINCI) += davinci_mmc.o
obj-$(CONFIG_MMC_SPI) += mmc_spi.o obj-$(CONFIG_MMC_SPI) += mmc_spi.o
ifeq ($(CONFIG_OF),y) ifeq ($(CONFIG_OF),y)
obj-$(CONFIG_MMC_SPI) += of_mmc_spi.o obj-$(CONFIG_MMC_SPI) += of_mmc_spi.o
......
This diff is collapsed.
...@@ -310,6 +310,7 @@ static int nand_davinci_correct_4bit(struct mtd_info *mtd, ...@@ -310,6 +310,7 @@ static int nand_davinci_correct_4bit(struct mtd_info *mtd,
unsigned short ecc10[8]; unsigned short ecc10[8];
unsigned short *ecc16; unsigned short *ecc16;
u32 syndrome[4]; u32 syndrome[4];
u32 ecc_state;
unsigned num_errors, corrected; unsigned num_errors, corrected;
/* All bytes 0xff? It's an erased page; ignore its ECC. */ /* All bytes 0xff? It's an erased page; ignore its ECC. */
...@@ -360,6 +361,21 @@ compare: ...@@ -360,6 +361,21 @@ compare:
*/ */
davinci_nand_writel(info, NANDFCR_OFFSET, davinci_nand_writel(info, NANDFCR_OFFSET,
davinci_nand_readl(info, NANDFCR_OFFSET) | BIT(13)); davinci_nand_readl(info, NANDFCR_OFFSET) | BIT(13));
/*
* ECC_STATE field reads 0x3 (Error correction complete) immediately
* after setting the 4BITECC_ADD_CALC_START bit. So if you immediately
* begin trying to poll for the state, you may fall right out of your
* loop without any of the correction calculations having taken place.
* The recommendation from the hardware team is to wait till ECC_STATE
* reads less than 4, which means ECC HW has entered correction state.
*/
do {
ecc_state = (davinci_nand_readl(info,
NANDFSR_OFFSET) >> 8) & 0x0f;
cpu_relax();
} while (ecc_state < 4);
for (;;) { for (;;) {
u32 fsr = davinci_nand_readl(info, NANDFSR_OFFSET); u32 fsr = davinci_nand_readl(info, NANDFSR_OFFSET);
...@@ -591,6 +607,8 @@ static int __init nand_davinci_probe(struct platform_device *pdev) ...@@ -591,6 +607,8 @@ static int __init nand_davinci_probe(struct platform_device *pdev)
/* options such as NAND_USE_FLASH_BBT or 16-bit widths */ /* options such as NAND_USE_FLASH_BBT or 16-bit widths */
info->chip.options = pdata->options; info->chip.options = pdata->options;
info->chip.bbt_td = pdata->bbt_td;
info->chip.bbt_md = pdata->bbt_md;
info->ioaddr = (uint32_t __force) vaddr; info->ioaddr = (uint32_t __force) vaddr;
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/cpufreq.h>
#include <video/da8xx-fb.h> #include <video/da8xx-fb.h>
#define DRIVER_NAME "da8xx_lcdc" #define DRIVER_NAME "da8xx_lcdc"
...@@ -113,6 +114,10 @@ struct da8xx_fb_par { ...@@ -113,6 +114,10 @@ struct da8xx_fb_par {
unsigned short pseudo_palette[16]; unsigned short pseudo_palette[16];
unsigned int databuf_sz; unsigned int databuf_sz;
unsigned int palette_sz; unsigned int palette_sz;
unsigned int pxl_clk;
#ifdef CONFIG_CPU_FREQ
struct notifier_block freq_transition;
#endif
}; };
/* Variable Screen Information */ /* Variable Screen Information */
...@@ -155,7 +160,7 @@ struct da8xx_panel { ...@@ -155,7 +160,7 @@ struct da8xx_panel {
int vfp; /* Vertical front porch */ int vfp; /* Vertical front porch */
int vbp; /* Vertical back porch */ int vbp; /* Vertical back porch */
int vsw; /* Vertical Sync Pulse Width */ int vsw; /* Vertical Sync Pulse Width */
int pxl_clk; /* Pixel clock */ unsigned int pxl_clk; /* Pixel clock */
unsigned char invert_pxl_clk; /* Invert Pixel clock */ unsigned char invert_pxl_clk; /* Invert Pixel clock */
}; };
...@@ -171,7 +176,7 @@ static struct da8xx_panel known_lcd_panels[] = { ...@@ -171,7 +176,7 @@ static struct da8xx_panel known_lcd_panels[] = {
.vfp = 2, .vfp = 2,
.vbp = 2, .vbp = 2,
.vsw = 0, .vsw = 0,
.pxl_clk = 0x10, .pxl_clk = 4608000,
.invert_pxl_clk = 1, .invert_pxl_clk = 1,
}, },
/* Sharp LK043T1DG01 */ /* Sharp LK043T1DG01 */
...@@ -185,7 +190,7 @@ static struct da8xx_panel known_lcd_panels[] = { ...@@ -185,7 +190,7 @@ static struct da8xx_panel known_lcd_panels[] = {
.vfp = 2, .vfp = 2,
.vbp = 2, .vbp = 2,
.vsw = 10, .vsw = 10,
.pxl_clk = 0x12, .pxl_clk = 7833600,
.invert_pxl_clk = 0, .invert_pxl_clk = 0,
}, },
}; };
...@@ -451,6 +456,18 @@ static void lcd_reset(struct da8xx_fb_par *par) ...@@ -451,6 +456,18 @@ static void lcd_reset(struct da8xx_fb_par *par)
lcdc_write(0, LCD_RASTER_CTRL_REG); lcdc_write(0, LCD_RASTER_CTRL_REG);
} }
static void lcd_calc_clk_divider(struct da8xx_fb_par *par)
{
unsigned int lcd_clk, div;
lcd_clk = clk_get_rate(par->lcdc_clk);
div = lcd_clk / par->pxl_clk;
/* Configure the LCD clock divisor. */
lcdc_write(LCD_CLK_DIVISOR(div) |
(LCD_RASTER_MODE & 0x1), LCD_CTRL_REG);
}
static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg, static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,
struct da8xx_panel *panel) struct da8xx_panel *panel)
{ {
...@@ -459,9 +476,8 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg, ...@@ -459,9 +476,8 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,
lcd_reset(par); lcd_reset(par);
/* Configure the LCD clock divisor. */ /* Calculate the divider */
lcdc_write(LCD_CLK_DIVISOR(panel->pxl_clk) | lcd_calc_clk_divider(par);
(LCD_RASTER_MODE & 0x1), LCD_CTRL_REG);
if (panel->invert_pxl_clk) if (panel->invert_pxl_clk)
lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) | lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) |
...@@ -574,6 +590,41 @@ static int fb_check_var(struct fb_var_screeninfo *var, ...@@ -574,6 +590,41 @@ static int fb_check_var(struct fb_var_screeninfo *var,
return err; return err;
} }
#ifdef CONFIG_CPU_FREQ
static int lcd_da8xx_cpufreq_transition(struct notifier_block *nb,
unsigned long val, void *data)
{
struct da8xx_fb_par *par;
unsigned int reg;
par = container_of(nb, struct da8xx_fb_par, freq_transition);
if (val == CPUFREQ_PRECHANGE) {
reg = lcdc_read(LCD_RASTER_CTRL_REG);
lcdc_write(reg & ~LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
} else if (val == CPUFREQ_POSTCHANGE) {
lcd_calc_clk_divider(par);
reg = lcdc_read(LCD_RASTER_CTRL_REG);
lcdc_write(reg | LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
}
return 0;
}
static inline int lcd_da8xx_cpufreq_register(struct da8xx_fb_par *par)
{
par->freq_transition.notifier_call = lcd_da8xx_cpufreq_transition;
return cpufreq_register_notifier(&par->freq_transition,
CPUFREQ_TRANSITION_NOTIFIER);
}
static inline void lcd_da8xx_cpufreq_deregister(struct da8xx_fb_par *par)
{
cpufreq_unregister_notifier(&par->freq_transition,
CPUFREQ_TRANSITION_NOTIFIER);
}
#endif
static int __devexit fb_remove(struct platform_device *dev) static int __devexit fb_remove(struct platform_device *dev)
{ {
struct fb_info *info = dev_get_drvdata(&dev->dev); struct fb_info *info = dev_get_drvdata(&dev->dev);
...@@ -581,6 +632,9 @@ static int __devexit fb_remove(struct platform_device *dev) ...@@ -581,6 +632,9 @@ static int __devexit fb_remove(struct platform_device *dev)
if (info) { if (info) {
struct da8xx_fb_par *par = info->par; struct da8xx_fb_par *par = info->par;
#ifdef CONFIG_CPU_FREQ
lcd_da8xx_cpufreq_deregister(par);
#endif
if (lcdc_read(LCD_RASTER_CTRL_REG) & LCD_RASTER_ENABLE) if (lcdc_read(LCD_RASTER_CTRL_REG) & LCD_RASTER_ENABLE)
lcd_disable_raster(par); lcd_disable_raster(par);
lcdc_write(0, LCD_RASTER_CTRL_REG); lcdc_write(0, LCD_RASTER_CTRL_REG);
...@@ -721,6 +775,8 @@ static int __init fb_probe(struct platform_device *device) ...@@ -721,6 +775,8 @@ static int __init fb_probe(struct platform_device *device)
} }
par = da8xx_fb_info->par; par = da8xx_fb_info->par;
par->lcdc_clk = fb_clk;
par->pxl_clk = lcdc_info->pxl_clk;
if (lcd_init(par, lcd_cfg, lcdc_info) < 0) { if (lcd_init(par, lcd_cfg, lcdc_info) < 0) {
dev_err(&device->dev, "lcd_init failed\n"); dev_err(&device->dev, "lcd_init failed\n");
...@@ -753,8 +809,6 @@ static int __init fb_probe(struct platform_device *device) ...@@ -753,8 +809,6 @@ static int __init fb_probe(struct platform_device *device)
da8xx_fb_fix.smem_len = par->databuf_sz - par->palette_sz; da8xx_fb_fix.smem_len = par->databuf_sz - par->palette_sz;
da8xx_fb_fix.line_length = (lcdc_info->width * lcd_cfg->bpp) / 8; da8xx_fb_fix.line_length = (lcdc_info->width * lcd_cfg->bpp) / 8;
par->lcdc_clk = fb_clk;
par->irq = platform_get_irq(device, 0); par->irq = platform_get_irq(device, 0);
if (par->irq < 0) { if (par->irq < 0) {
ret = -ENOENT; ret = -ENOENT;
...@@ -811,12 +865,25 @@ static int __init fb_probe(struct platform_device *device) ...@@ -811,12 +865,25 @@ static int __init fb_probe(struct platform_device *device)
goto err_dealloc_cmap; goto err_dealloc_cmap;
} }
#ifdef CONFIG_CPU_FREQ
ret = lcd_da8xx_cpufreq_register(par);
if (ret) {
dev_err(&device->dev, "failed to register cpufreq\n");
goto err_cpu_freq;
}
#endif
/* enable raster engine */ /* enable raster engine */
lcdc_write(lcdc_read(LCD_RASTER_CTRL_REG) | lcdc_write(lcdc_read(LCD_RASTER_CTRL_REG) |
LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG); LCD_RASTER_ENABLE, LCD_RASTER_CTRL_REG);
return 0; return 0;
#ifdef CONFIG_CPU_FREQ
err_cpu_freq:
unregister_framebuffer(da8xx_fb_info);
#endif
err_dealloc_cmap: err_dealloc_cmap:
fb_dealloc_cmap(&da8xx_fb_info->cmap); fb_dealloc_cmap(&da8xx_fb_info->cmap);
......
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