]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 into devel-stable
authorRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 5 Jan 2011 10:23:38 +0000 (10:23 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 5 Jan 2011 10:23:38 +0000 (10:23 +0000)
1  2 
arch/arm/Kconfig
drivers/dma/imx-sdma.c

diff --combined arch/arm/Kconfig
index 4d1c3093a133f1e4f1c90eccaefc33c8495211ad,0f3417065d136edf95755cbe74f5b84903b1a7fa..fac58916adecf15dcd7d868d010dcc9bb999b9be
@@@ -14,7 -14,6 +14,7 @@@ config AR
        select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
        select HAVE_FTRACE_MCOUNT_RECORD if (!XIP_KERNEL)
        select HAVE_DYNAMIC_FTRACE if (!XIP_KERNEL)
 +      select HAVE_FUNCTION_GRAPH_TRACER if (!THUMB2_KERNEL)
        select HAVE_GENERIC_DMA_COHERENT
        select HAVE_KERNEL_GZIP
        select HAVE_KERNEL_LZO
@@@ -352,6 -351,14 +352,14 @@@ config ARCH_MX
        help
          Support for Freescale MXC/iMX-based family of processors
  
+ config ARCH_MXS
+       bool "Freescale MXS-based"
+       select GENERIC_CLOCKEVENTS
+       select ARCH_REQUIRE_GPIOLIB
+       select COMMON_CLKDEV
+       help
+         Support for Freescale MXS-based family of processors
  config ARCH_STMP3XXX
        bool "Freescale STMP3xxx"
        select CPU_ARM926T
@@@ -798,7 -805,6 +806,7 @@@ config ARCH_U850
        select GENERIC_CLOCKEVENTS
        select COMMON_CLKDEV
        select ARCH_REQUIRE_GPIOLIB
 +      select ARCH_HAS_CPUFREQ
        help
          Support for ST-Ericsson's Ux500 architecture
  
@@@ -904,6 -910,8 +912,8 @@@ source "arch/arm/mach-mv78xx0/Kconfig
  
  source "arch/arm/plat-mxc/Kconfig"
  
+ source "arch/arm/mach-mxs/Kconfig"
  source "arch/arm/mach-netx/Kconfig"
  
  source "arch/arm/mach-nomadik/Kconfig"
@@@ -1001,8 -1009,8 +1011,8 @@@ source arch/arm/mm/Kconfi
  
  config IWMMXT
        bool "Enable iWMMXt support"
 -      depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK
 -      default y if PXA27x || PXA3xx || ARCH_MMP
 +      depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
 +      default y if PXA27x || PXA3xx || PXA95x || ARCH_MMP
        help
          Enable support for iWMMXt context switching at run time if
          running on a CPU that supports it.
@@@ -1207,11 -1215,10 +1217,11 @@@ config SM
        depends on EXPERIMENTAL
        depends on GENERIC_CLOCKEVENTS
        depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \
 -               MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 ||\
 -               ARCH_S5PV310 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4
 +               MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \
 +               ARCH_S5PV310 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \
 +               ARCH_MSM_SCORPIONMP
        select USE_GENERIC_SMP_HELPERS
 -      select HAVE_ARM_SCU
 +      select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP
        help
          This enables support for systems with more than one CPU. If you have
          a system with only one CPU, like most personal computers, say N. If
@@@ -1286,7 -1293,6 +1296,7 @@@ config NR_CPU
  config HOTPLUG_CPU
        bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
        depends on SMP && HOTPLUG && EXPERIMENTAL
 +      depends on !ARCH_MSM
        help
          Say Y here to experiment with turning CPUs off and on.  CPUs
          can be controlled through /sys/devices/system/cpu.
@@@ -1295,7 -1301,7 +1305,7 @@@ config LOCAL_TIMER
        bool "Use local timer interrupts"
        depends on SMP
        default y
 -      select HAVE_ARM_TWD
 +      select HAVE_ARM_TWD if !ARCH_MSM_SCORPIONMP
        help
          Enable support for local timers on SMP platforms, rather then the
          legacy IPI broadcast method.  Local timers allows the system
@@@ -1315,7 -1321,7 +1325,7 @@@ config H
  
  config THUMB2_KERNEL
        bool "Compile the kernel in Thumb-2 mode"
 -      depends on CPU_V7 && EXPERIMENTAL
 +      depends on CPU_V7 && !CPU_V6 && EXPERIMENTAL
        select AEABI
        select ARM_ASM_UNIFIED
        help
@@@ -1763,7 -1769,7 +1773,7 @@@ comment "At least one emulation must b
  
  config FPE_NWFPE
        bool "NWFPE math emulation"
 -      depends on !AEABI || OABI_COMPAT
 +      depends on (!AEABI || OABI_COMPAT) && !THUMB2_KERNEL
        ---help---
          Say Y to include the NWFPE floating point emulator in the kernel.
          This is necessary to run most binaries. Linux does not currently
diff --combined drivers/dma/imx-sdma.c
index d0602dd5d1b238eedf2500cd240ef0dc092800a8,01166a9c32417bd3736b520571ac5017d1f2d2f7..d5a5d4d9c19bb9efc3dd084e2961fd99d1d098f6
@@@ -273,50 -273,6 +273,6 @@@ struct sdma_channel 
  #define MXC_SDMA_MIN_PRIORITY 1
  #define MXC_SDMA_MAX_PRIORITY 7
  
- /**
-  * struct sdma_script_start_addrs - SDMA script start pointers
-  *
-  * start addresses of the different functions in the physical
-  * address space of the SDMA engine.
-  */
- struct sdma_script_start_addrs {
-       u32 ap_2_ap_addr;
-       u32 ap_2_bp_addr;
-       u32 ap_2_ap_fixed_addr;
-       u32 bp_2_ap_addr;
-       u32 loopback_on_dsp_side_addr;
-       u32 mcu_interrupt_only_addr;
-       u32 firi_2_per_addr;
-       u32 firi_2_mcu_addr;
-       u32 per_2_firi_addr;
-       u32 mcu_2_firi_addr;
-       u32 uart_2_per_addr;
-       u32 uart_2_mcu_addr;
-       u32 per_2_app_addr;
-       u32 mcu_2_app_addr;
-       u32 per_2_per_addr;
-       u32 uartsh_2_per_addr;
-       u32 uartsh_2_mcu_addr;
-       u32 per_2_shp_addr;
-       u32 mcu_2_shp_addr;
-       u32 ata_2_mcu_addr;
-       u32 mcu_2_ata_addr;
-       u32 app_2_per_addr;
-       u32 app_2_mcu_addr;
-       u32 shp_2_per_addr;
-       u32 shp_2_mcu_addr;
-       u32 mshc_2_mcu_addr;
-       u32 mcu_2_mshc_addr;
-       u32 spdif_2_mcu_addr;
-       u32 mcu_2_spdif_addr;
-       u32 asrc_2_mcu_addr;
-       u32 ext_mem_2_ipu_addr;
-       u32 descrambler_addr;
-       u32 dptc_dvfs_addr;
-       u32 utra_addr;
-       u32 ram_code_start_addr;
- };
  #define SDMA_FIRMWARE_MAGIC 0x414d4453
  
  /**
@@@ -951,7 -907,7 +907,7 @@@ static struct dma_async_tx_descriptor *
                struct sdma_buffer_descriptor *bd = &sdmac->bd[i];
                int param;
  
 -              bd->buffer_addr = sgl->dma_address;
 +              bd->buffer_addr = sg->dma_address;
  
                count = sg->length;
  
@@@ -1127,8 -1083,74 +1083,74 @@@ static void sdma_issue_pending(struct d
         */
  }
  
- static int __init sdma_init(struct sdma_engine *sdma,
-               void *ram_code, int ram_code_size)
+ #define SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1       34
+ static void sdma_add_scripts(struct sdma_engine *sdma,
+               const struct sdma_script_start_addrs *addr)
+ {
+       s32 *addr_arr = (u32 *)addr;
+       s32 *saddr_arr = (u32 *)sdma->script_addrs;
+       int i;
+       for (i = 0; i < SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; i++)
+               if (addr_arr[i] > 0)
+                       saddr_arr[i] = addr_arr[i];
+ }
+ static int __init sdma_get_firmware(struct sdma_engine *sdma,
+               const char *cpu_name, int to_version)
+ {
+       const struct firmware *fw;
+       char *fwname;
+       const struct sdma_firmware_header *header;
+       int ret;
+       const struct sdma_script_start_addrs *addr;
+       unsigned short *ram_code;
+       fwname = kasprintf(GFP_KERNEL, "sdma-%s-to%d.bin", cpu_name, to_version);
+       if (!fwname)
+               return -ENOMEM;
+       ret = request_firmware(&fw, fwname, sdma->dev);
+       if (ret) {
+               kfree(fwname);
+               return ret;
+       }
+       kfree(fwname);
+       if (fw->size < sizeof(*header))
+               goto err_firmware;
+       header = (struct sdma_firmware_header *)fw->data;
+       if (header->magic != SDMA_FIRMWARE_MAGIC)
+               goto err_firmware;
+       if (header->ram_code_start + header->ram_code_size > fw->size)
+               goto err_firmware;
+       addr = (void *)header + header->script_addrs_start;
+       ram_code = (void *)header + header->ram_code_start;
+       clk_enable(sdma->clk);
+       /* download the RAM image for SDMA */
+       sdma_load_script(sdma, ram_code,
+                       header->ram_code_size,
+                       sdma->script_addrs->ram_code_start_addr);
+       clk_disable(sdma->clk);
+       sdma_add_scripts(sdma, addr);
+       dev_info(sdma->dev, "loaded firmware %d.%d\n",
+                       header->version_major,
+                       header->version_minor);
+ err_firmware:
+       release_firmware(fw);
+       return ret;
+ }
+ static int __init sdma_init(struct sdma_engine *sdma)
  {
        int i, ret;
        dma_addr_t ccb_phys;
  
        __raw_writel(ccb_phys, sdma->regs + SDMA_H_C0PTR);
  
-       /* download the RAM image for SDMA */
-       sdma_load_script(sdma, ram_code,
-                       ram_code_size,
-                       sdma->script_addrs->ram_code_start_addr);
        /* Set bits of CONFIG register with given context switching mode */
        __raw_writel(SDMA_H_CONFIG_CSM, sdma->regs + SDMA_H_CONFIG);
  
@@@ -1216,14 -1233,9 +1233,9 @@@ err_dma_alloc
  static int __init sdma_probe(struct platform_device *pdev)
  {
        int ret;
-       const struct firmware *fw;
-       const struct sdma_firmware_header *header;
-       const struct sdma_script_start_addrs *addr;
        int irq;
-       unsigned short *ram_code;
        struct resource *iores;
        struct sdma_platform_data *pdata = pdev->dev.platform_data;
-       char *fwname;
        int i;
        dma_cap_mask_t mask;
        struct sdma_engine *sdma;
        if (ret)
                goto err_request_irq;
  
-       fwname = kasprintf(GFP_KERNEL, "sdma-%s-to%d.bin",
-                       pdata->cpu_name, pdata->to_version);
-       if (!fwname) {
-               ret = -ENOMEM;
-               goto err_cputype;
-       }
-       ret = request_firmware(&fw, fwname, &pdev->dev);
-       if (ret) {
-               dev_err(&pdev->dev, "request firmware \"%s\" failed with %d\n",
-                               fwname, ret);
-               kfree(fwname);
-               goto err_cputype;
-       }
-       kfree(fwname);
-       if (fw->size < sizeof(*header))
-               goto err_firmware;
-       header = (struct sdma_firmware_header *)fw->data;
-       if (header->magic != SDMA_FIRMWARE_MAGIC)
-               goto err_firmware;
-       if (header->ram_code_start + header->ram_code_size > fw->size)
-               goto err_firmware;
-       addr = (void *)header + header->script_addrs_start;
-       ram_code = (void *)header + header->ram_code_start;
-       sdma->script_addrs = kmalloc(sizeof(*addr), GFP_KERNEL);
+       sdma->script_addrs = kzalloc(sizeof(*sdma->script_addrs), GFP_KERNEL);
        if (!sdma->script_addrs)
-               goto err_firmware;
-       memcpy(sdma->script_addrs, addr, sizeof(*addr));
+               goto err_alloc;
  
        sdma->version = pdata->sdma_version;
  
                list_add_tail(&sdmac->chan.device_node, &sdma->dma_device.channels);
        }
  
-       ret = sdma_init(sdma, ram_code, header->ram_code_size);
+       ret = sdma_init(sdma);
        if (ret)
                goto err_init;
  
+       if (pdata->script_addrs)
+               sdma_add_scripts(sdma, pdata->script_addrs);
+       sdma_get_firmware(sdma, pdata->cpu_name, pdata->to_version);
        sdma->dma_device.dev = &pdev->dev;
  
        sdma->dma_device.device_alloc_chan_resources = sdma_alloc_chan_resources;
                goto err_init;
        }
  
-       dev_info(&pdev->dev, "initialized (firmware %d.%d)\n",
-                       header->version_major,
-                       header->version_minor);
        /* request channel 0. This is an internal control channel
         * to the SDMA engine and not available to clients.
         */
        dma_cap_set(DMA_SLAVE, mask);
        dma_request_channel(mask, NULL, NULL);
  
-       release_firmware(fw);
+       dev_info(sdma->dev, "initialized\n");
  
        return 0;
  
  err_init:
        kfree(sdma->script_addrs);
- err_firmware:
-       release_firmware(fw);
- err_cputype:
+ err_alloc:
        free_irq(irq, sdma);
  err_request_irq:
        iounmap(sdma->regs);
@@@ -1385,7 -1367,7 +1367,7 @@@ static int __init sdma_module_init(void
  {
        return platform_driver_probe(&sdma_driver, sdma_probe);
  }
 -subsys_initcall(sdma_module_init);
 +module_init(sdma_module_init);
  
  MODULE_AUTHOR("Sascha Hauer, Pengutronix <s.hauer@pengutronix.de>");
  MODULE_DESCRIPTION("i.MX SDMA driver");