summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Merge git://git.marvell.com/orion into develRussell King2009-03-2512-11/+321
|\
| * [ARM] Kirkwood: fail the probe if internal RTC does not workNicolas Pitre2009-03-241-0/+11
| | | | | | | | | | | | | | | | | | Having a RTC that doesn't maintain proper time across a reboot is one thing. But a RTC that doesn't work at all and only causes timeouts is another. Tested-by: Martin Michlmayr <tbm@cyrius.com> Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * [ARM] orion5x: update of FPGA ID's for the TS-78xxAlexander Clouter2009-03-232-4/+13
| | | | | | | | | | | | | | | | | | | | Received official word finally from Technological Systems on which FPGA ID's they have released unto the world. Also an additional of a dummy entry matching the FPGA ID of the Verilog template on our wiki. Signed-off-by: Alexander Clouter <alex@digriz.org.uk> Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * [ARM] Kirkwood: Add support for QNAP TS-119/TS-219 Turbo NASMartin Michlmayr2009-03-235-4/+244
| | | | | | | | | | | | | | Add support for the QNAP TS-119 and TS-219 Turbo NAS devices. Signed-off-by: Martin Michlmayr <tbm@cyrius.com> Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * [ARM] update mach-typesNicolas Pitre2009-03-231-1/+9
| | | | | | | | Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * [ARM] Kirkwood: More consistency regarding MPP namingMartin Michlmayr2009-03-231-2/+2
| | | | | | | | | | | | | | With the exception of UART0, all MPP names are uppercase. Signed-off-by: Martin Michlmayr <tbm@cyrius.com> Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * [ARM] Kirkwood: Hook up I2CMartin Michlmayr2009-03-233-0/+42
| | | | | | | | | | | | | | | | Hook up I2C on Marvell Kirkwood. Tested on a QNAP TS-219 which has RTC connected through I2C. Signed-off-by: Martin Michlmayr <tbm@cyrius.com> Signed-off-by: Nicolas Pitre <nico@marvell.com>
* | Merge branch 'highmem' into develRussell King2009-03-2422-79/+557
|\ \
| * | [ARM] add CONFIG_HIGHMEM optionNicolas Pitre2009-03-161-0/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Here it is... HIGHMEM for the ARM architecture. :-) If you don't have enough ram for highmem pages to be allocated and still want to test this, then the cmdline option "vmalloc=" can be used with a value large enough to force the highmem threshold down. Successfully tested on a Marvell DB-78x00-BP Development Board with 2 GB of RAM. Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * | [ARM] ignore high memory with VIPT aliasing cachesNicolas Pitre2009-03-161-0/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | VIPT aliasing caches have issues of their own which are not yet handled. Usage of discard_old_kernel_data() in copypage-v6.c is not highmem ready, kmap/fixmap stuff doesn't take account of cache colouring, etc. If/when those issues are handled then this could be reverted. Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * | [ARM] xsc3: add highmem support to L2 cache handling codeNicolas Pitre2009-03-161-27/+80
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | On xsc3, L2 cache ops are possible only on virtual addresses. The code is rearranged so to have a linear progression requiring the least amount of pte setups in the highmem case. To protect the virtual mapping so created, interrupts must be disabled currently up to a page worth of address range. The interrupt disabling is done in a way to minimize the overhead within the inner loop. The alternative would consist in separate code for the highmem and non highmem compilation which is less preferable. Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * | [ARM] Feroceon: add highmem support to L2 cache handling codeNicolas Pitre2009-03-162-17/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The choice is between looping over the physical range and performing single cache line operations, or to map highmem pages somewhere, as cache range ops are possible only on virtual addresses. Because L2 range ops are much faster, we go with the later by factoring the physical-to-virtual address conversion and use a fixmap entry for it in the HIGHMEM case. Possible future optimizations to avoid the pte setup cost: - do the pte setup for highmem pages only - determine a threshold for doing a line-by-line processing on physical addresses when the range is small Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * | [ARM] make page_to_dma() highmem awareNicolas Pitre2009-03-166-5/+32
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If a machine class has a custom __virt_to_bus() implementation then it must provide a __arch_page_to_dma() implementation as well which is _not_ based on page_address() to support highmem. This patch fixes existing __arch_page_to_dma() and provide a default implementation otherwise. The default implementation for highmem is based on __pfn_to_bus() which is defined only when no custom __virt_to_bus() is provided by the machine class. That leaves only ebsa110 and footbridge which cannot support highmem until they provide their own __arch_page_to_dma() implementation. But highmem support on those legacy platforms with limited memory is certainly not a priority. Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * | [ARM] introduce dma_cache_maint_page()Nicolas Pitre2009-03-163-2/+77
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a helper to be used by the DMA mapping API to handle cache maintenance for memory identified by a page structure instead of a virtual address. Those pages may or may not be highmem pages, and when they're highmem pages, they may or may not be virtually mapped. When they're not mapped then there is no L1 cache to worry about. But even in that case the L2 cache must be processed since unmapped highmem pages can still be L2 cached. Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * | highmem: atomic highmem kmap page pinningNicolas Pitre2009-03-161-8/+57
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Most ARM machines have a non IO coherent cache, meaning that the dma_map_*() set of functions must clean and/or invalidate the affected memory manually before DMA occurs. And because the majority of those machines have a VIVT cache, the cache maintenance operations must be performed using virtual addresses. When a highmem page is kunmap'd, its mapping (and cache) remains in place in case it is kmap'd again. However if dma_map_page() is then called with such a page, some cache maintenance on the remaining mapping must be performed. In that case, page_address(page) is non null and we can use that to synchronize the cache. It is unlikely but still possible for kmap() to race and recycle the virtual address obtained above, and use it for another page before some on-going cache invalidation loop in dma_map_page() is done. In that case, the new mapping could end up with dirty cache lines for another page, and the unsuspecting cache invalidation loop in dma_map_page() might simply discard those dirty cache lines resulting in data loss. For example, let's consider this sequence of events: - dma_map_page(..., DMA_FROM_DEVICE) is called on a highmem page. --> - vaddr = page_address(page) is non null. In this case it is likely that the page has valid cache lines associated with vaddr. Remember that the cache is VIVT. --> for (i = vaddr; i < vaddr + PAGE_SIZE; i += 32) invalidate_cache_line(i); *** preemption occurs in the middle of the loop above *** - kmap_high() is called for a different page. --> - last_pkmap_nr wraps to zero and flush_all_zero_pkmaps() is called. The pkmap_count value for the page passed to dma_map_page() above happens to be 1, so the page is unmapped. But prior to that, flush_cache_kmaps() cleared the cache for it. So far so good. - A fresh pkmap entry is assigned for this kmap request. The Murphy law says this pkmap entry will eventually happen to use the same vaddr as the one which used to belong to the other page being processed by dma_map_page() in the preempted thread above. - The kmap_high() caller start dirtying the cache using the just assigned virtual mapping for its page. *** the first thread is rescheduled *** - The for(...) loop is resumed, but now cached data belonging to a different physical page is being discarded ! And this is not only a preemption issue as ARM can be SMP as well, making the above scenario just as likely. Hence the need for some kind of pkmap page pinning which can be used in any context, primarily for the benefit of dma_map_page() on ARM. This provides the necessary interface to cope with the above issue if ARCH_NEEDS_KMAP_HIGH_GET is defined, otherwise the resulting code is unchanged. Signed-off-by: Nicolas Pitre <nico@marvell.com> Reviewed-by: MinChan Kim <minchan.kim@gmail.com> Acked-by: Andrew Morton <akpm@linux-foundation.org>
| * | [ARM] mem_init(): make highmem pages available for useNicolas Pitre2009-03-161-3/+18
| | | | | | | | | | | | Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * | [ARM] kmap supportNicolas Pitre2009-03-166-4/+169
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The kmap virtual area borrows a 2MB range at the top of the 16MB area below PAGE_OFFSET currently reserved for kernel modules and/or the XIP kernel. This 2MB corresponds to the range covered by 2 consecutive second-level page tables, or a single pmd entry as seen by the Linux page table abstraction. Because XIP kernels are unlikely to be seen on systems needing highmem support, there shouldn't be any shortage of VM space for modules (14 MB for modules is still way more than twice the typical usage). Because the virtual mapping of highmem pages can go away at any moment after kunmap() is called on them, we need to bypass the delayed cache flushing provided by flush_dcache_page() in that case. The atomic kmap versions are based on fixmaps, and __cpuc_flush_dcache_page() is used directly in that case. Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * | [ARM] fixmap supportNicolas Pitre2009-03-163-3/+50
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is the minimum fixmap interface expected to be implemented by architectures supporting highmem. We have a second level page table already allocated and covering 0xfff00000-0xffffffff because the exception vector page is located at 0xffff0000, and various cache tricks already use some entries above 0xffff0000. Therefore the PTEs covering 0xfff00000-0xfffeffff are free to be used. However the XScale cache flushing code already uses virtual addresses between 0xfffe0000 and 0xfffeffff. So this reserves the 0xfff00000-0xfffdffff range for fixmap stuff. The Documentation/arm/memory.txt information is updated accordingly, including the information about the actual top of DMA memory mapping region which didn't match the code. Signed-off-by: Nicolas Pitre <nico@marvell.com>
| * | [ARM] Fix virtual to physical translation macro corner casesRussell King2009-03-133-10/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The current use of these macros works well when the conversion is entirely linear. In this case, we can be assured that the following holds true: __va(p + s) - s = __va(p) However, this is not always the case, especially when there is a non-linear conversion (eg, when there is a 3.5GB hole in memory.) In this case, if 's' is the size of the region (eg, PAGE_SIZE) and 'p' is the final page, the above is most definitely not true. So, we must ensure that __va() and __pa() are only used with valid kernel direct mapped RAM addresses. This patch tweaks the code to achieve this. Tested-by: Charles Moschel <fred99@carolina.rr.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
* | | Merge branch 'devel' of ↵root2009-03-2491-677/+7585
|\ \ \ | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 into devel
| * | | MAINTAINERS: update pxa910 maintainersEric Miao2009-03-231-0/+7
| | | | | | | | | | | | | | | | Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | MAINTAINERS: update pxa168 maintainersEric Miao2009-03-231-0/+9
| | | | | | | | | | | | | | | | | | | | Signed-off-by: Eric Miao <eric.miao@marvell.com> Acked-by: Jason Chagas <jason.chagas@marvell.com>
| * | | [ARM] pxa: add defconfig for pxa910-based platformsEric Miao2009-03-231-0/+891
| | | | | | | | | | | | | | | | Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add defconfig for pxa168-based platformsEric Miao2009-03-231-0/+891
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of having various pieces of defconfig files for different platforms, let's group them into a single one. Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add base support for pxa910-based TTC_DKBEric Miao2009-03-233-0/+55
| | | | | | | | | | | | | | | | | | | | Signed-off-by: Bin Yang <bin.yang@marvell.com> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add base support for pxa910-based TavorEVBEric Miao2009-03-233-0/+117
| | | | | | | | | | | | | | | | | | | | Signed-off-by: Bin Yang <bin.yang@marvell.com> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add base support for Marvell PXA910Eric Miao2009-03-2312-3/+485
| | | | | | | | | | | | | | | | | | | | Signed-off-by: Bin Yang <bin.yang@marvell.com> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa/aspenite: add support for debug ethernetEric Miao2009-03-232-0/+64
| | | | | | | | | | | | | | | | | | | | Signed-off-by: Zhangfei Gao <zhangfei.gao@marvell.com> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa/aspenite: add support for console uartEric Miao2009-03-231-0/+12
| | | | | | | | | | | | | | | | Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: allow reuse of serial driver for pxa168Eric Miao2009-03-231-1/+1
| | | | | | | | | | | | | | | | Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add MFP support for pxa168Eric Miao2009-03-233-0/+310
| | | | | | | | | | | | | | | | Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add GPIO support for pxa168Eric Miao2009-03-233-0/+57
| | | | | | | | | | | | | | | | Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add iWMMXt support for pxa168Eric Miao2009-03-232-2/+3
| | | | | | | | | | | | | | | | Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add base support for Marvell's PXA168 processor lineEric Miao2009-03-2340-2/+1669
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | """The Marvell® PXA168 processor is the first in a family of application processors targeted at mass market opportunities in computing and consumer devices. It balances high computing and multimedia performance with low power consumption to support extended battery life, and includes a wealth of integrated peripherals to reduce overall BOM cost .... """ See http://www.marvell.com/featured/pxa168.jsp for more information. 1. Marvell Mohawk core is a hybrid of xscale3 and its own ARM core, there are many enhancements like instructions for flushing the whole D-cache, and so on 2. Clock reuses Russell's common clkdev, and added the basic support for UART1/2. 3. Devices are a bit different from the 'mach-pxa' way, the platform devices are now dynamically allocated only when necessary (i.e. when pxa_register_device() is called). Description for each device are stored in an array of 'struct pxa_device_desc'. Now that: a. this array of device description is marked with __initdata and can be freed up system is fully up b. which means board code has to add all needed devices early in his initializing function c. platform specific data can now be marked as __initdata since they are allocated and copied by platform_device_add_data() 4. only the basic UART1/2/3 are added, more devices will come later. Signed-off-by: Jason Chagas <chagas@marvell.com> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: move common MFP handling code into plat-pxaEric Miao2009-03-2314-317/+680
| | | | | | | | | | | | | | | | Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: move common GPIO handling code into plat-pxaEric Miao2009-03-235-61/+66
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1. add common GPIO handling code into [arch/arm/plat-pxa] 2. common code in <mach/gpio.h> moved into <plat/gpio.h>, new processors should implement its own <mach/gpio.h>, provide the following required definitions and '#include <plat/gpio.h>' in the end: - GPIO_REGS_VIRT for mapped virtual address of the GPIO registers' physical I/O memory - macros of GPLR(), GPSR(), GPDR() for constant optimization for functions gpio_{set,get}_value() (so that bit-bang code can still have tolerable performance) - NR_BUILTIN_GPIO for the number of onchip GPIO - definitions of __gpio_is_inverted() and __gpio_is_occupied(), they can be either macros or inlined functions Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: introduce plat-pxa for PXA common code and add DMA supportEric Miao2009-03-238-86/+105
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1. introduce folder of 'arch/arm/plat-pxa' for common code across different PXA processor families 2. initially moved DMA code into plat-pxa 3. common code in <mach/dma.h> moved into <plat/dma.h>, new processors should implement its own <mach/dma.h>, provide the following required definitions and '#include <plat/dma.h>' in the end: - DMAC_REGS_VIRT for mapped virtual address of the DMA registers' physical I/O memory Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: AC97 pin functions for Colibri PXA310/320Daniel Mack2009-03-232-0/+44
| | | | | | | | | | | | | | | | | | | | | | | | Signed-off-by: Daniel Mack <daniel@caiaq.de> Cc: Matthias Meier <matthias.j.meier@gmx.net> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: Add Colibri LCD functionsDaniel Mack2009-03-234-0/+131
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This adds LCD functions for Colibri PXA300 and Colibri PXA320 and configures a LQ043T3DX02 panel. Original-code-by: Matthias Meier <matthias.j.meier@gmx.net> Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: Colibri PXA320 module basicsDaniel Mack2009-03-233-0/+134
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This adds basic support for Colibri PXA320 modules. The file colibri-320.c only contains settings specific to this module, such as the Ethernet interface. Cc: Matthias Meier <matthias.j.meier@gmx.net> Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: Refactor Colibri board support codeDaniel Mack2009-03-235-94/+119
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Move common function for all Colibri PXA3xx boards to the newly added colibri-pxa3xx.c - Drop some unnecessary defines from colibri.h - Make Kconfig reflect the fact that code for colibri 300 module does also work for the 310 model - Give up on the huge pin config table which was messed up with lots of #ifdefs and switch over to locally defined tables for configured functions Cc: Matthias Meier <matthias.j.meier@gmx.net> Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: Fix Colibri AX88796 configurationDaniel Mack2009-03-231-10/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Broaden the AX88796 register mask to allow access to the reset register. Remove unnecessary value definitions and the second resource block. Diagnosed-by: Matthias Meier <matthias.j.meier@gmx.net> Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add colibri PXA300 defconfigDaniel Mack2009-03-231-0/+1156
| | | | | | | | | | | | | | | | | | | | Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: rename and update Colibri PXA270 defconfigDaniel Mack2009-03-231-169/+425
| | | | | | | | | | | | | | | | | | | | Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add USB support for Colibri PXA300Daniel Mack2009-03-231-0/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This adds support for USB OHCI for Toradex' Colibri PXA300 modules as connected on the evaluation board. Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add MMC support for Colibri PXA300Daniel Mack2009-03-231-0/+58
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Added MMC support for Toradex' Colibri PXA300 module. Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: add basic support for Colibri PXA300 moduleDaniel Mack2009-03-234-0/+122
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch add basic support for Toradex' Colibri PXA300 module. Ethernet is enabled conditionally, depdending on CONFIG_AX88796. Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | [ARM] pxa: rename colibri.c to colibri-pxa270.cDaniel Mack2009-03-234-34/+37
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Namespace cleanup: rename colibri.c to colibri-pxa270.c and change some names in colibri.h. Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>
| * | | Merge branch 'fix' of ↵Eric Miao2009-03-239-7/+23
| |\ \ \ | | | | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git into devel
| | * | | [ARM] pxa: add pxa320 missing pin function for CS2 on GPIO3Daniel Mack2009-03-231-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | Signed-off-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Eric Miao <eric.miao@marvell.com>