From 2ef01ca783fcfc2d00b51e48ce82a4708b177b52 Mon Sep 17 00:00:00 2001 From: Saeed Bishara Date: Thu, 22 Apr 2010 17:32:29 +0300 Subject: dove pm: restore cp15 Marvell Auxiliary Function and PMC register BugLink: http://bugs.launchpad.net/bugs/591249 This patch will save & restore the PMC (user enable register) on power management events. The Marvell Auxiliary Function register is written with expected value as it can't be read. --- .../mv_hal_drivers/mv_hal/pmu/mvPmu_asm.S | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) diff --git a/arch/arm/plat-orion/mv_hal_drivers/mv_hal/pmu/mvPmu_asm.S b/arch/arm/plat-orion/mv_hal_drivers/mv_hal/pmu/mvPmu_asm.S index 1b4ceed..663328b 100755 --- a/arch/arm/plat-orion/mv_hal_drivers/mv_hal/pmu/mvPmu_asm.S +++ b/arch/arm/plat-orion/mv_hal_drivers/mv_hal/pmu/mvPmu_asm.S @@ -225,9 +225,10 @@ ENTRY(mvPmuSramSaveCP15) mrc p15, 0, r8, c1, c0, 1 @ save CP15 - Aux CR mov r9, r13 @ save resume SP stmfd sp!, {r2-r9} + mrc p15, 0, r6, c9, c14, 0 @ save CP15 - PMC mrc p15, 0, r7, c10, c2, 0 @ save CP15 - PRRR mrc p15, 0, r8, c10, c2, 1 @ save CP15 - NMRR - stmfd sp!, {r7-r8} + stmfd sp!, {r6-r8} mov pc, lr /*************************************************************** @@ -242,11 +243,21 @@ ENTRY(mvPmuSramSaveCP15) **************************************************************/ ENTRY(mvPmuSramResumeCP15) ldr r0, saved_sp @ stack phys addr - ldmfd r0!, {r7-r8} + ldmfd r0!, {r6-r8} mcr p15, 0, r8, c10, c2, 1 @ restore CP15 - NMRR mcr p15, 0, r7, c10, c2, 0 @ restore CP15 - PRRR + mcr p15, 0, r6, c9, c14, 0 @ restore CP15 - PMC ldmfd r0, {r2-r9} mcr p15, 0, r8, c1, c0, 1 @ restore CP15 - Aux CR +#ifdef CONFIG_CPU_ENABLE_WRITECO + mrc p15, 0, r10, c0, c0, 0 @ Main ID Y0 or not + and r10, #0xF + cmp r10, #1 + + movne r0, #0x1 + orrne r0, r0, #CONFIG_CPU_WRITECO_CYCLE << 4 @ X0 + mcrne p15, 1, r0, c15, c2, 0 @ Write Marvell Auxiliary Function Reg +#endif mcr p15, 1, r7, c15, c1, 0 @ restore CP15 - extra features mcr p15, 0, r6, c13, c0, 1 @ restore CP15 - context ID mcr p15, 0, r5, c2, c0, 0 @ restore CP15 - TTBR -- 1.7.0.4 From 1c40e16912c5a4baa6105e0acae472c05e811a16 Mon Sep 17 00:00:00 2001 From: Saeed Bishara Date: Tue, 27 Apr 2010 15:23:16 +0300 Subject: dove: fix build issues when MV_HAL_DRIVERS_SUPPORT disabled BugLink: http://bugs.launchpad.net/bugs/591249 --- arch/arm/mach-dove/dove-db-setup.c | 4 ++-- arch/arm/mach-dove/mv_hal_support/Makefile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-dove/dove-db-setup.c b/arch/arm/mach-dove/dove-db-setup.c index 9fe4426..5965c68 100755 --- a/arch/arm/mach-dove/dove-db-setup.c +++ b/arch/arm/mach-dove/dove-db-setup.c @@ -830,7 +830,7 @@ static void __init dove_db_init(void) pxa_init_dma_wins(&dove_mbus_dram_info); pxa_init_dma(16); - +#ifdef CONFIG_MV_HAL_DRIVERS_SUPPORT if(useHalDrivers || useNandHal) { if (mvPdmaHalInit(MV_PDMA_MAX_CHANNELS_NUM) != MV_OK) { printk(KERN_ERR "mvPdmaHalInit() failed.\n"); @@ -840,7 +840,7 @@ static void __init dove_db_init(void) pxa_reserve_dma_channel(MV_PDMA_NAND_DATA); pxa_reserve_dma_channel(MV_PDMA_NAND_COMMAND); } - +#endif dove_xor0_init(); dove_xor1_init(); #ifdef CONFIG_MV_ETHERNET diff --git a/arch/arm/mach-dove/mv_hal_support/Makefile b/arch/arm/mach-dove/mv_hal_support/Makefile index bf8e65b..96214b1 100755 --- a/arch/arm/mach-dove/mv_hal_support/Makefile +++ b/arch/arm/mach-dove/mv_hal_support/Makefile @@ -17,7 +17,7 @@ include $(srctree)/$(subst ",,$(CONFIG_MV_HAL_RULES_PATH)) # Objects list -obj-y += mvKW_HAL_glue.o export.o +obj-$(CONFIG_MV_HAL_DRIVERS_SUPPORT) += mvKW_HAL_glue.o export.o obj-$(CONFIG_MV_DBG_TRACE) += dbg-trace.o obj-y += mv_hal_sys/ -- 1.7.0.4 From 935f747c85d630fb53e42924fe20927d9666d858 Mon Sep 17 00:00:00 2001 From: Saeed Bishara Date: Tue, 27 Apr 2010 15:32:21 +0300 Subject: dove: register the usb as host mode when HAL drivers disabled BugLink: http://bugs.launchpad.net/bugs/591249 --- arch/arm/mach-dove/common.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index 2cfa2bf..8c2049b 100755 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c @@ -474,8 +474,8 @@ void __init dove_ehci0_init(void) dove_ehci0.name = usb_dev_name; mvSysUsbInit(0, 0); } - platform_device_register(&dove_ehci0); #endif + platform_device_register(&dove_ehci0); } /***************************************************************************** @@ -521,9 +521,8 @@ void __init dove_ehci1_init(void) dove_ehci1.name = usb_dev_name; mvSysUsbInit(1, 0); } - - platform_device_register(&dove_ehci1); #endif + platform_device_register(&dove_ehci1); } #ifdef CONFIG_MV_ETHERNET /***************************************************************************** -- 1.7.0.4 From 996ff5f463d64ad90054931d148f62b4740cd4e3 Mon Sep 17 00:00:00 2001 From: Chao Deng Date: Fri, 23 Apr 2010 11:55:54 +0800 Subject: Fix wrong stride issue for RGB565 on overlay BugLink: http://bugs.launchpad.net/bugs/591249 Signed-off-by: Chao Deng Signed-off-by: Green Wan --- drivers/video/marvell/dovefb_ovly.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/video/marvell/dovefb_ovly.c b/drivers/video/marvell/dovefb_ovly.c index 1ae7fec..2aa3f22 100755 --- a/drivers/video/marvell/dovefb_ovly.c +++ b/drivers/video/marvell/dovefb_ovly.c @@ -1005,7 +1005,7 @@ static int dovefb_ovly_set_par(struct fb_info *fi) if ((dfli->pix_fmt >= 0) && (dfli->pix_fmt < 10)) { writel((var->xres_virtual * var->bits_per_pixel) >> 3, dfli->reg_base + LCD_SPU_DMA_PITCH_YC); - writel((var->yres << 16) | xbefzoom, + writel((var->yres << 16) | (xbefzoom * 2), dfli->reg_base + LCD_SPU_DMA_HPXL_VLN); writel((var->yres << 16) | var->xres, dfli->reg_base + LCD_SPU_DZM_HPXL_VLN); -- 1.7.0.4 From 6cceed23adf875be25f1149ce7337aa336cbba25 Mon Sep 17 00:00:00 2001 From: Green Wan Date: Fri, 23 Apr 2010 14:20:55 +0800 Subject: Refine alogrithm of filling yuv pitch length and do correction when input pitch value <= 0. BugLink: http://bugs.launchpad.net/bugs/591249 Signed-off-by: Green Wan --- drivers/video/marvell/dovefb_ovly.c | 105 +++++++++++++++++++++++------------ 1 files changed, 70 insertions(+), 35 deletions(-) diff --git a/drivers/video/marvell/dovefb_ovly.c b/drivers/video/marvell/dovefb_ovly.c index 2aa3f22..8e7fb98 100755 --- a/drivers/video/marvell/dovefb_ovly.c +++ b/drivers/video/marvell/dovefb_ovly.c @@ -958,6 +958,53 @@ static int dovefb_ovly_pan_display(struct fb_var_screeninfo *var, return 0; } +static int set_pitch(struct dovefb_layer_info *dfli, + struct fb_var_screeninfo *var) +{ + int ycp, uvp; + + ycp = dfli->surface.viewPortInfo.ycPitch; + uvp = dfli->surface.viewPortInfo.uvPitch; + if (ycp <= 0) { + printk(KERN_WARNING "YC pitch is 0." + "User program needs refine\n"); + if ((dfli->pix_fmt >= 0) && (dfli->pix_fmt < 10)) { + writel((var->xres_virtual * var->bits_per_pixel) >> 3, + dfli->reg_base + LCD_SPU_DMA_PITCH_YC); + } else { + if (((dfli->pix_fmt & ~0x1000) >> 1) == 5) { + writel((var->xres*2), + dfli->reg_base + LCD_SPU_DMA_PITCH_YC); + } else { + writel((var->xres), + dfli->reg_base + LCD_SPU_DMA_PITCH_YC); + } + } + } else { + writel(ycp, dfli->reg_base + LCD_SPU_DMA_PITCH_YC); + } + + if (uvp <= 0) { + if ((dfli->pix_fmt >= 0) && (dfli->pix_fmt < 10)) { + ; + } else { + if (((dfli->pix_fmt & ~0x1000) >> 1) == 5) { + writel(((var->xres) << 16) | (var->xres) , + dfli->reg_base + LCD_SPU_DMA_PITCH_UV); + } else { + writel((var->xres >> 1) << 16 | + (var->xres >> 1) , + dfli->reg_base + LCD_SPU_DMA_PITCH_UV); + } + } + } else { + writel((uvp << 16) | uvp, + dfli->reg_base + LCD_SPU_DMA_PITCH_UV); + } + + return 0; +} + static int dovefb_ovly_set_par(struct fb_info *fi) { struct dovefb_layer_info *dfli = fi->par; @@ -966,7 +1013,6 @@ static int dovefb_ovly_set_par(struct fb_info *fi) struct fb_var_screeninfo *var = &fi->var; int pix_fmt; int xzoom, yzoom; - int xbefzoom; /* * Determine which pixel format we're going to use. @@ -999,44 +1045,33 @@ static int dovefb_ovly_set_par(struct fb_info *fi) /* * Configure graphics DMA parameters. */ - xbefzoom = var->xres/2; set_graphics_start(fi, fi->var.xoffset, fi->var.yoffset); - if ((dfli->pix_fmt >= 0) && (dfli->pix_fmt < 10)) { - writel((var->xres_virtual * var->bits_per_pixel) >> 3, - dfli->reg_base + LCD_SPU_DMA_PITCH_YC); - writel((var->yres << 16) | (xbefzoom * 2), - dfli->reg_base + LCD_SPU_DMA_HPXL_VLN); - writel((var->yres << 16) | var->xres, - dfli->reg_base + LCD_SPU_DZM_HPXL_VLN); - } else { - if (((dfli->pix_fmt & ~0x1000) >> 1) == 5) { - writel((var->xres*2), - dfli->reg_base + LCD_SPU_DMA_PITCH_YC); - writel(((var->xres) << 16) | (var->xres) , - dfli->reg_base + LCD_SPU_DMA_PITCH_UV); - } else { - writel((var->xres), - dfli->reg_base + LCD_SPU_DMA_PITCH_YC); - writel((var->xres >> 1) << 16 | - (var->xres >> 1) , - dfli->reg_base + LCD_SPU_DMA_PITCH_UV); - } + /* + * Configure yuv pitch. + */ + set_pitch(dfli, var); - writel((var->yres << 16) | (xbefzoom*2), - dfli->reg_base + LCD_SPU_DMA_HPXL_VLN); - if (info->fixed_output == 0) { - yzoom = dfli->surface.viewPortInfo.zoomYSize; - xzoom = dfli->surface.viewPortInfo.zoomXSize; - } else { - yzoom = dfli->surface.viewPortInfo.zoomYSize * - info->out_vmode.yres / gfxli->fb_info->var.yres; - xzoom = dfli->surface.viewPortInfo.zoomXSize * - info->out_vmode.xres / gfxli->fb_info->var.xres; - } - writel((yzoom << 16) | xzoom, - dfli->reg_base + LCD_SPU_DZM_HPXL_VLN); + /* + * program original size. + */ + writel((var->yres << 16) | (var->xres), + dfli->reg_base + LCD_SPU_DMA_HPXL_VLN); + + /* + * program size after scaling. + */ + if (info->fixed_output == 0) { + yzoom = dfli->surface.viewPortInfo.zoomYSize; + xzoom = dfli->surface.viewPortInfo.zoomXSize; + } else { + yzoom = dfli->surface.viewPortInfo.zoomYSize * + info->out_vmode.yres / gfxli->fb_info->var.yres; + xzoom = dfli->surface.viewPortInfo.zoomXSize * + info->out_vmode.xres / gfxli->fb_info->var.xres; } + writel((yzoom << 16) | xzoom, + dfli->reg_base + LCD_SPU_DZM_HPXL_VLN); /* update video position offset */ writel(CFG_DMA_OVSA_VLN(dfli->surface.viewPortOffset.yOffset)| -- 1.7.0.4 From 6b0edf708dc06e4c96cdaa3bac37def3b7a3fa73 Mon Sep 17 00:00:00 2001 From: Tawfik Bayouk Date: Mon, 26 Apr 2010 13:14:37 +0300 Subject: Nand: fix PIO support for 8bit devices. BugLink: http://bugs.launchpad.net/bugs/591249 Signed-off-by: Tawfik Bayouk --- drivers/mtd/nand/dove_nand_hal.c | 50 +++++++++++++++++++++++++------------- 1 files changed, 33 insertions(+), 17 deletions(-) diff --git a/drivers/mtd/nand/dove_nand_hal.c b/drivers/mtd/nand/dove_nand_hal.c index f45866c..a17a6df 100755 --- a/drivers/mtd/nand/dove_nand_hal.c +++ b/drivers/mtd/nand/dove_nand_hal.c @@ -152,7 +152,7 @@ static int handle_data_pio(struct pxa3xx_nand_info *info) switch (info->state) { case STATE_PIO_WRITING: mvNfcReadWrite(&info->nfcCtrl, info->cmd, (MV_U32*)info->data_buff, info->data_buff_phys); - mvNfcIntrEnable(&info->nfcCtrl, MV_NFC_STATUS_BBD | MV_NFC_STATUS_CMDD, MV_TRUE); + mvNfcIntrEnable(&info->nfcCtrl, MV_NFC_STATUS_RDY, MV_TRUE); ret = wait_for_completion_timeout(&info->cmd_complete, timeout); if (!ret) { @@ -631,8 +631,9 @@ static int pxa3xx_nand_do_cmd(struct pxa3xx_nand_info *info, uint32_t event) goto fail_stop; } - if(info->state != STATE_READY) - printk(KERN_INFO "%s - %d - Bad state.\n", __FUNCTION__, __LINE__); + /*if(info->state != STATE_READY) + printk(KERN_INFO "%s - %d - Bad state.\n", __FUNCTION__, __LINE__);*/ + if (info->use_dma == 0 && info->data_size > 0) if (handle_data_pio(info)) goto fail_stop; @@ -690,10 +691,12 @@ static void pxa3xx_nand_cmdfunc(struct mtd_info *mtd, unsigned command, info->page_addr = page_addr; if (prepare_read_prog_cmd(info, column, page_addr)) break; - pxa3xx_nand_do_cmd_multiple(info, - MV_NFC_STATUS_RDY | NFC_SR_UNCERR_MASK); - /*pxa3xx_nand_do_cmd(info, - NFC_SR_RDDREQ_MASK | NFC_SR_UNCERR_MASK);*/ + + if (info->use_dma) + pxa3xx_nand_do_cmd_multiple(info, MV_NFC_STATUS_RDY | NFC_SR_UNCERR_MASK); + else + pxa3xx_nand_do_cmd(info, NFC_SR_RDDREQ_MASK | NFC_SR_UNCERR_MASK); + /* We only are OOB, so if the data has error, does not matter */ if (info->retcode == ERR_DBERR) info->retcode = ERR_NONE; @@ -709,10 +712,12 @@ static void pxa3xx_nand_cmdfunc(struct mtd_info *mtd, unsigned command, info->page_addr = page_addr; if (prepare_read_prog_cmd(info, column, page_addr)) break; - pxa3xx_nand_do_cmd_multiple(info, - MV_NFC_STATUS_RDY | NFC_SR_UNCERR_MASK); - /*pxa3xx_nand_do_cmd(info, - NFC_SR_RDDREQ_MASK | NFC_SR_UNCERR_MASK);*/ + + if (info->use_dma) + pxa3xx_nand_do_cmd_multiple(info, MV_NFC_STATUS_RDY | NFC_SR_UNCERR_MASK); + else + pxa3xx_nand_do_cmd(info, NFC_SR_RDDREQ_MASK | NFC_SR_UNCERR_MASK); + if (info->retcode == ERR_DBERR) { /* for blank page (all 0xff), HW will calculate its ECC as * 0, which is different from the ECC information within @@ -743,16 +748,23 @@ static void pxa3xx_nand_cmdfunc(struct mtd_info *mtd, unsigned command, printk(KERN_ERR "prepare_read_prog_cmd() failed.\n"); break; } - pxa3xx_nand_do_cmd_multiple(info, MV_NFC_STATUS_RDY); - /*pxa3xx_nand_do_cmd(info, NFC_SR_WRDREQ_MASK);*/ + + if (info->use_dma) + pxa3xx_nand_do_cmd_multiple(info, MV_NFC_STATUS_RDY); + else + pxa3xx_nand_do_cmd(info, NFC_SR_WRDREQ_MASK); + break; case NAND_CMD_ERASE1: info->column = 0; info->page_addr = page_addr; info->cmd = MV_NFC_CMD_ERASE; - pxa3xx_nand_do_cmd_multiple(info, MV_NFC_STATUS_BBD | MV_NFC_STATUS_RDY); - /*pxa3xx_nand_do_cmd(info, MV_NFC_STATUS_BBD | MV_NFC_STATUS_RDY);*/ + if (info->use_dma) + pxa3xx_nand_do_cmd_multiple(info, MV_NFC_STATUS_BBD | MV_NFC_STATUS_RDY); + else + pxa3xx_nand_do_cmd(info, MV_NFC_STATUS_BBD | MV_NFC_STATUS_RDY); + break; case NAND_CMD_ERASE2: break; @@ -772,8 +784,12 @@ static void pxa3xx_nand_cmdfunc(struct mtd_info *mtd, unsigned command, info->column = 0; info->page_addr = 0; info->cmd = MV_NFC_CMD_RESET; - ret = pxa3xx_nand_do_cmd_multiple(info, MV_NFC_STATUS_CMDD); - /*ret = pxa3xx_nand_do_cmd(info, MV_NFC_STATUS_CMDD);*/ + + if (info->use_dma) + ret = pxa3xx_nand_do_cmd_multiple(info, MV_NFC_STATUS_CMDD); + else + ret = pxa3xx_nand_do_cmd(info, MV_NFC_STATUS_CMDD); + if (ret == 0) { int timeout = 2; uint32_t ndcr; -- 1.7.0.4 From 6475c943a53b26fb4ed75ba5efa727b572fff084 Mon Sep 17 00:00:00 2001 From: Joseph Lo Date: Wed, 21 Apr 2010 14:12:00 +0800 Subject: MRVL BMM module update BugLink: http://bugs.launchpad.net/bugs/591249 --- drivers/misc/mrvl-bmm/bmm_drv.c | 82 +++++++++++++++++++++++++++++--------- drivers/misc/mrvl-bmm/bmm_drv.h | 48 ++++++++++++----------- 2 files changed, 87 insertions(+), 43 deletions(-) diff --git a/drivers/misc/mrvl-bmm/bmm_drv.c b/drivers/misc/mrvl-bmm/bmm_drv.c index b312528..ba975bf 100644 --- a/drivers/misc/mrvl-bmm/bmm_drv.c +++ b/drivers/misc/mrvl-bmm/bmm_drv.c @@ -89,12 +89,6 @@ static spinlock_t bmm_lock; /* spin lock for block list */ #define UNUSED_PARAM(x) (void)(x) -typedef struct { - unsigned long input; /* the starting address of the block of memory */ - unsigned long output; /* the starting address of the block of memory */ - unsigned long length; /* the length of the block of memory */ -} ioctl_arg_t; - static unsigned long uva_to_pa(struct mm_struct *mm, unsigned long addr) { unsigned long ret = 0UL; @@ -132,6 +126,30 @@ static unsigned long uva_to_pa(struct mm_struct *mm, unsigned long addr) return ret; } +unsigned long va_to_pa(unsigned long user_addr, unsigned int size) +{ + unsigned long paddr, paddr_tmp; + unsigned long size_tmp = 0; + int page_num = PAGE_ALIGN(size) / PAGE_SIZE; + unsigned int vaddr = PAGE_ALIGN(user_addr); + int i = 0; + struct mm_struct *mm = current->mm; + + if(vaddr == NULL) + return 0; + + paddr = uva_to_pa(mm, vaddr); + + for (i = 0; i < page_num; i++) { + paddr_tmp = uva_to_pa(mm, vaddr); + if ((paddr_tmp - paddr) != size_tmp) + return 0; + vaddr += PAGE_SIZE; + size_tmp += PAGE_SIZE; + } + return paddr; +} + static void bmm_dump(bmm_block_t *pbmm) { pr_info("\tpbmm = 0x%08lx\n", (unsigned long)pbmm); @@ -387,10 +405,10 @@ static int bmm_mmap(struct file *file, struct vm_area_struct *vma) vma->vm_flags |= VM_DONTEXPAND; /* Don't remap */ vma->vm_flags |= VM_DONTCOPY; /* Don't fork */ - if(!(pbmm->attr & BMM_ATTR_NONBUFFERABLE)) - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - if(pbmm->attr & BMM_ATTR_NONCACHEABLE) + if(pbmm->attr & BMM_ATTR_NONCACHED) vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + if((pbmm->attr & BMM_ATTR_WRITECOMBINE)) + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); if(remap_pfn_range(vma, vma->vm_start, paddr >> PAGE_SHIFT, vm_len, vma->vm_page_prot)) { pr_debug("bmm_mmap: EAGAIN\n"); @@ -466,7 +484,19 @@ static unsigned long __attribute__ ((unused)) bmm_get_paddr(unsigned long vaddr) #endif } -static unsigned long bmm_get_paddr_ex(unsigned long vaddr) +static unsigned long bmm_get_paddr_ex(unsigned long vaddr, unsigned long size) +{ + unsigned long paddr; + struct mm_struct *mm = current->mm; + + spin_lock(&mm->page_table_lock); + paddr = va_to_pa(vaddr, size); + spin_unlock(&mm->page_table_lock); + + return paddr; +} + +static unsigned long bmm_get_paddr_inside_ex(unsigned long vaddr) { #ifndef BMM_USE_UVA_TO_PA unsigned long paddr; @@ -520,23 +550,32 @@ static unsigned long bmm_get_mem_size(unsigned long vaddr) void bmm_consistent_sync(unsigned long start, size_t size, int direction) { + /* support addr both from kernel space and bmm space */ unsigned long end = start + size; + unsigned long paddr; + + /* bmm space */ + paddr = bmm_get_paddr_inside_ex(start); + + /* kernel space */ + if (paddr == NULL) + paddr = bmm_get_paddr_ex(start, size); + + if (paddr == NULL) + BUG(); switch (direction) { case BMM_DMA_FROM_DEVICE: /* invalidate only */ dmac_inv_range((void *)start, (void *)end); - outer_inv_range(bmm_get_paddr_ex(start), - bmm_get_paddr_ex(start) + size); + outer_inv_range(paddr, paddr + size); break; case BMM_DMA_TO_DEVICE: /* writeback only */ dmac_clean_range((void *)start, (void *)end); - outer_clean_range(bmm_get_paddr_ex(start), - bmm_get_paddr_ex(start) + size); + outer_clean_range(paddr, paddr + size); break; case BMM_DMA_BIDIRECTIONAL: /* writeback and invalidate */ dmac_flush_range((void *)start, (void *)end); - outer_flush_range(bmm_get_paddr_ex(start), - bmm_get_paddr_ex(start) + size); + outer_flush_range(paddr, paddr + size); break; default: BUG(); @@ -729,8 +768,7 @@ void bmm_dma_sync() static int bmm_ioctl(struct inode *inode, struct file * filp, unsigned int cmd, unsigned long arg) { - unsigned int bmm_cmd = BMM_IOCTL_CMD(cmd); - unsigned int bmm_arg = BMM_IOCTL_ARG(cmd); + unsigned int bmm_arg; unsigned long input; unsigned long output = 0; unsigned long length; @@ -747,11 +785,12 @@ static int bmm_ioctl(struct inode *inode, struct file * filp, input = io.input; output = io.output; length = io.length; + bmm_arg = io.arg; pr_debug("bmm_ioctl(cmd=0x%08x, arg=0x%08lx, io=0x%08lx/0x%08lx)\n", cmd, arg, io.input, io.output); - switch(bmm_cmd) { + switch(cmd) { case BMM_MALLOC: output = bmm_malloc(input, bmm_arg); break; @@ -762,7 +801,10 @@ static int bmm_ioctl(struct inode *inode, struct file * filp, output = bmm_get_vaddr_ex(input); break; case BMM_GET_PHYS_ADDR: - output = bmm_get_paddr_ex(input); + output = bmm_get_paddr_inside_ex(input); + break; + case BMM_GET_KERN_PHYS_ADDR: + output = bmm_get_paddr_ex(input, length); break; case BMM_GET_MEM_ATTR: output = bmm_get_mem_attr(input); diff --git a/drivers/misc/mrvl-bmm/bmm_drv.h b/drivers/misc/mrvl-bmm/bmm_drv.h index c5f2d54..58c78ef 100644 --- a/drivers/misc/mrvl-bmm/bmm_drv.h +++ b/drivers/misc/mrvl-bmm/bmm_drv.h @@ -22,34 +22,36 @@ #define BMM_MINOR 94 -/* assemble an ioctl command */ -#define BMM_IOCTL(cmd, arg) (((cmd) << 16) | (arg)) - -/* disassemble an ioctl command */ -#define BMM_IOCTL_CMD(cmd) ((cmd) >> 16) -#define BMM_IOCTL_ARG(cmd) ((cmd) & 0xffff) +typedef struct { + unsigned long input; /* the starting address of the block of memory */ + unsigned long output; /* the starting address of the block of memory */ + unsigned long length; /* the length of the block of memory */ + unsigned long arg; /* the arg of cmd */ +} ioctl_arg_t; +#define BMEM_IOCTL_MAGIC 'G' /* ioctl commands */ -#define BMM_MALLOC (0) -#define BMM_FREE (1) -#define BMM_GET_VIRT_ADDR (2) -#define BMM_GET_PHYS_ADDR (3) -#define BMM_GET_MEM_ATTR (4) -#define BMM_SET_MEM_ATTR (5) -#define BMM_GET_MEM_SIZE (6) -#define BMM_GET_TOTAL_SPACE (7) -#define BMM_GET_FREE_SPACE (8) -#define BMM_FLUSH_CACHE (9) -#define BMM_DMA_MEMCPY (10) -#define BMM_DMA_SYNC (11) -#define BMM_CONSISTENT_SYNC (12) -#define BMM_DUMP (13) -#define BMM_GET_ALLOCATED_SPACE (14) +#define BMM_MALLOC _IOWR(BMEM_IOCTL_MAGIC, 0, ioctl_arg_t) +#define BMM_FREE _IOWR(BMEM_IOCTL_MAGIC, 1, ioctl_arg_t) +#define BMM_GET_VIRT_ADDR _IOWR(BMEM_IOCTL_MAGIC, 2, ioctl_arg_t) +#define BMM_GET_PHYS_ADDR _IOWR(BMEM_IOCTL_MAGIC, 3, ioctl_arg_t) +#define BMM_GET_MEM_ATTR _IOWR(BMEM_IOCTL_MAGIC, 4, ioctl_arg_t) +#define BMM_SET_MEM_ATTR _IOWR(BMEM_IOCTL_MAGIC, 5, ioctl_arg_t) +#define BMM_GET_MEM_SIZE _IOWR(BMEM_IOCTL_MAGIC, 6, ioctl_arg_t) +#define BMM_GET_TOTAL_SPACE _IOWR(BMEM_IOCTL_MAGIC, 7, ioctl_arg_t) +#define BMM_GET_FREE_SPACE _IOWR(BMEM_IOCTL_MAGIC, 8, ioctl_arg_t) +#define BMM_FLUSH_CACHE _IOWR(BMEM_IOCTL_MAGIC, 9, ioctl_arg_t) +#define BMM_DMA_MEMCPY _IOWR(BMEM_IOCTL_MAGIC, 10, ioctl_arg_t) +#define BMM_DMA_SYNC _IOWR(BMEM_IOCTL_MAGIC, 11, ioctl_arg_t) +#define BMM_CONSISTENT_SYNC _IOWR(BMEM_IOCTL_MAGIC, 12, ioctl_arg_t) +#define BMM_DUMP _IOWR(BMEM_IOCTL_MAGIC, 13, ioctl_arg_t) +#define BMM_GET_ALLOCATED_SPACE _IOWR(BMEM_IOCTL_MAGIC, 14, ioctl_arg_t) +#define BMM_GET_KERN_PHYS_ADDR _IOWR(BMEM_IOCTL_MAGIC, 15, ioctl_arg_t) /* ioctl arguments: memory attributes */ #define BMM_ATTR_DEFAULT (0) /* cacheable bufferable */ -#define BMM_ATTR_NONBUFFERABLE (1 << 0) /* non-bufferable */ -#define BMM_ATTR_NONCACHEABLE (1 << 1) /* non-cacheable */ +#define BMM_ATTR_WRITECOMBINE (1 << 0) /* non-cacheable & bufferable */ +#define BMM_ATTR_NONCACHED (1 << 1) /* non-cacheable & non-bufferable */ /* Note: extra attributes below are not supported yet! */ #define BMM_ATTR_HUGE_PAGE (1 << 2) /* 64KB page size */ #define BMM_ATTR_WRITETHROUGH (1 << 3) /* implies L1 Cacheable */ -- 1.7.0.4 From 9772cfbb9c3f9b2334f5bac264f146ba31c0cdc0 Mon Sep 17 00:00:00 2001 From: Joseph Lo Date: Tue, 27 Apr 2010 10:42:35 +0800 Subject: BMM module: remove ioremap_xxx for kernel space VA mapping BugLink: http://bugs.launchpad.net/bugs/591249 --- drivers/misc/mrvl-bmm/bmm_drv.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/misc/mrvl-bmm/bmm_drv.c b/drivers/misc/mrvl-bmm/bmm_drv.c index ba975bf..1467f9d 100644 --- a/drivers/misc/mrvl-bmm/bmm_drv.c +++ b/drivers/misc/mrvl-bmm/bmm_drv.c @@ -921,7 +921,8 @@ static int __bmm_init(void) bmm_size = vmeta_size + gpu_size; bmm_size_mb = bmm_size / 1024 / 1024; bmm_paddr = (vmeta_memory_start > gpu_memory_start) ? gpu_memory_start : vmeta_memory_start; - bmm_vaddr = ioremap_nocache(bmm_paddr, bmm_size); + // mark here: because we don't use the bmm memory space in kernel + //bmm_vaddr = ioremap_nocache(bmm_paddr, bmm_size); #endif return 0; @@ -944,7 +945,8 @@ static void __bmm_exit(void) __free_pages(virt_to_page(bmm_vaddr), get_order(bmm_size)); #else - iounmap(bmm_vaddr); + // mark here: because we don't use the bmm memory space in kernel + //iounmap(bmm_vaddr); #endif } -- 1.7.0.4 From 886c92d66c087088a9320e74ccc0b3d776528d68 Mon Sep 17 00:00:00 2001 From: Ethan Ku Date: Thu, 15 Apr 2010 15:34:03 +0800 Subject: fix spi flash type to mx2513205d for AVD1 rev2 BugLink: http://bugs.launchpad.net/bugs/591249 --- arch/arm/mach-dove/dove-rd-avng-setup.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-dove/dove-rd-avng-setup.c b/arch/arm/mach-dove/dove-rd-avng-setup.c index a248ce3..0c02099 100755 --- a/arch/arm/mach-dove/dove-rd-avng-setup.c +++ b/arch/arm/mach-dove/dove-rd-avng-setup.c @@ -1,5 +1,4 @@ -/* - * arch/arm/mach-dove/dove-rd-avng-setup.c +/* * arch/arm/mach-dove/dove-rd-avng-setup.c * * Marvell Dove MV88F6781-RD Avengers Mobile Internet Device Board Setup * @@ -336,7 +335,7 @@ static struct mv_sata_platform_data dove_rd_avng_sata_data = { * SPI0: 4M Flash MX25L3205D ****************************************************************************/ static const struct flash_platform_data dove_rd_avng_spi_flash_data = { - .type = "mx25l3205", + .type = "mx25l3205d", }; static struct spi_board_info __initdata dove_rd_avng_spi_flash_info[] = { -- 1.7.0.4 From 98cebdda174c381424d522502a0d43152bb7ce76 Mon Sep 17 00:00:00 2001 From: stephenkou Date: Fri, 14 May 2010 11:20:13 +0800 Subject: Fix colorkey issue with PM BugLink: http://bugs.launchpad.net/bugs/591249 Signed-off-by: stephenkou Signed-off-by: Green Wan --- drivers/video/marvell/dovefb_base.c | 34 ++++++++++++++++++++++++++++------ 1 files changed, 28 insertions(+), 6 deletions(-) diff --git a/drivers/video/marvell/dovefb_base.c b/drivers/video/marvell/dovefb_base.c index 64215ee..4af35d9 100644 --- a/drivers/video/marvell/dovefb_base.c +++ b/drivers/video/marvell/dovefb_base.c @@ -1113,9 +1113,17 @@ failed: #ifdef CONFIG_PM -static unsigned int LCD_SPU_HWC_HPXL_VLN_saved_value = 0; -static unsigned int LCD_SPU_ALPHA_COLOR1_saved_value = 0; -static unsigned int LCD_SPU_ALPHA_COLOR2_saved_value = 0; +/* Hardware cursor related registers */ +static unsigned int LCD_SPU_HWC_HPXL_VLN_saved_value = 0; +static unsigned int LCD_SPU_ALPHA_COLOR1_saved_value = 0; +static unsigned int LCD_SPU_ALPHA_COLOR2_saved_value = 0; + +/* Colorkey related registers */ +static unsigned int LCD_SPU_COLORKEY_Y_saved_value = 0; +static unsigned int LCD_SPU_COLORKEY_U_saved_value = 0; +static unsigned int LCD_SPU_COLORKEY_V_saved_value = 0; +static unsigned int LCD_SPU_DMA_CTRL1_saved_value = 0; +static unsigned int LCD_SPU_ADV_REG_saved_value = 0; static int dovefb_suspend(struct platform_device *pdev, pm_message_t mesg) { @@ -1127,9 +1135,16 @@ static int dovefb_suspend(struct platform_device *pdev, pm_message_t mesg) writel( 0x0, dfi->reg_base+SPU_IRQ_ENA); /* Save cursor related registers */ - LCD_SPU_HWC_HPXL_VLN_saved_value = readl(dfi->reg_base + LCD_SPU_HWC_HPXL_VLN); - LCD_SPU_ALPHA_COLOR1_saved_value = readl(dfi->reg_base + LCD_SPU_ALPHA_COLOR1); - LCD_SPU_ALPHA_COLOR2_saved_value = readl(dfi->reg_base + LCD_SPU_ALPHA_COLOR2); + LCD_SPU_HWC_HPXL_VLN_saved_value = readl(dfi->reg_base + LCD_SPU_HWC_HPXL_VLN); + LCD_SPU_ALPHA_COLOR1_saved_value = readl(dfi->reg_base + LCD_SPU_ALPHA_COLOR1); + LCD_SPU_ALPHA_COLOR2_saved_value = readl(dfi->reg_base + LCD_SPU_ALPHA_COLOR2); + + /* Save colorkey related regiters */ + LCD_SPU_COLORKEY_Y_saved_value = readl(dfi->reg_base + LCD_SPU_COLORKEY_Y); + LCD_SPU_COLORKEY_U_saved_value = readl(dfi->reg_base + LCD_SPU_COLORKEY_U); + LCD_SPU_COLORKEY_V_saved_value = readl(dfi->reg_base + LCD_SPU_COLORKEY_V); + LCD_SPU_DMA_CTRL1_saved_value = readl(dfi->reg_base + LCD_SPU_DMA_CTRL1); + LCD_SPU_ADV_REG_saved_value = readl(dfi->reg_base + LCD_SPU_ADV_REG); acquire_console_sem(); @@ -1190,6 +1205,13 @@ static int dovefb_resume(struct platform_device *pdev) writel(LCD_SPU_ALPHA_COLOR1_saved_value, dfi->reg_base + LCD_SPU_ALPHA_COLOR1); writel(LCD_SPU_ALPHA_COLOR2_saved_value, dfi->reg_base + LCD_SPU_ALPHA_COLOR2); + /* Restore colorkey related regiters */ + writel(LCD_SPU_COLORKEY_Y_saved_value, dfi->reg_base + LCD_SPU_COLORKEY_Y); + writel(LCD_SPU_COLORKEY_U_saved_value, dfi->reg_base + LCD_SPU_COLORKEY_U); + writel(LCD_SPU_COLORKEY_V_saved_value, dfi->reg_base + LCD_SPU_COLORKEY_V); + writel(LCD_SPU_DMA_CTRL1_saved_value, dfi->reg_base + LCD_SPU_DMA_CTRL1); + writel(LCD_SPU_ADV_REG_saved_value, dfi->reg_base + LCD_SPU_ADV_REG); + /* Disable all interrupts */ writel( 0x0, dfi->reg_base + SPU_IRQ_ENA); -- 1.7.0.4