]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'next/devel-samsung' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorOlof Johansson <olof@lixom.net>
Sat, 10 Mar 2012 17:51:26 +0000 (09:51 -0800)
committerOlof Johansson <olof@lixom.net>
Sat, 10 Mar 2012 17:51:26 +0000 (09:51 -0800)
* 'next/devel-samsung' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung:
  ARM: EXYNOS: fix cycle count for periodic mode of clock event timers
  ARM: EXYNOS: add support JPEG
  ARM: EXYNOS: Add DMC1, allow PPMU access for DMC
  ARM: SAMSUNG: Correct MIPI-CSIS io memory resource definition
  ARM: SAMSUNG: fix __init attribute on regarding s3c_set_platdata()
  ARM: SAMSUNG: Add __init attribute to samsung_bl_set()
  ARM: S5PV210: Add usb otg phy control
  ARM: S3C64XX: Add usb otg phy control
  ARM: EXYNOS: Enable l2 configuration through device tree
  ARM: EXYNOS: remove useless code to save/restore L2
  ARM: EXYNOS: save L2 settings during bootup
  ARM: S5P: add L2 early resume code
  ARM: EXYNOS: Add support AFTR mode on EXYNOS4210
  ARM: SAMSUNG: use spin_lock_irqsave() in clk_{enable,disable}
  ARM: S3C64XX: Define some additional always off clocks
  ARM: S3C64XX: Reduce residency requirement for cpuidle WFI mode
  ARM: SAMSUNG: Add a callback 'notify_after' for PWM backlight control
  ARM: SAMSUNG: add G2D to plat-s5p and mach-exynos
  ARM: S3C64XX: Gate some more clocks by default
  ARM: S3C64XX: Add basic cpuidle driver

1  2 
arch/arm/mach-exynos/clock.c
arch/arm/mach-exynos/common.c
arch/arm/mach-exynos/pm.c
arch/arm/mach-s3c64xx/clock.c
arch/arm/plat-samsung/devs.c

index 187287aa57ab9154fbe7808bbd26ec895348ddd8,e532bc2960a41005b78666117afb88c615f3b0c8..ac249e46a21cf7c7f9dd57306d7fed804004464a
@@@ -30,7 -30,6 +30,7 @@@
  
  #include "common.h"
  
 +#ifdef CONFIG_PM_SLEEP
  static struct sleep_save exynos4_clock_save[] = {
        SAVE_ITEM(S5P_CLKDIV_LEFTBUS),
        SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS),
@@@ -94,7 -93,6 +94,7 @@@
        SAVE_ITEM(S5P_CLKGATE_SCLKCPU),
        SAVE_ITEM(S5P_CLKGATE_IP_CPU),
  };
 +#endif
  
  struct clk clk_sclk_hdmi27m = {
        .name           = "sclk_hdmi27m",
@@@ -471,6 -469,11 +471,11 @@@ static struct clk init_clocks_off[] = 
                .devname        = "s5p-mipi-csis.1",
                .enable         = exynos4_clk_ip_cam_ctrl,
                .ctrlbit        = (1 << 5),
+       }, {
+               .name           = "jpeg",
+               .id             = 0,
+               .enable         = exynos4_clk_ip_cam_ctrl,
+               .ctrlbit        = (1 << 6),
        }, {
                .name           = "fimc",
                .devname        = "exynos4-fimc.0",
index 031c1e5b3dfe7281bc501bda41956c9093b593ea,02696ac143bd0ccfe5350b3ebffe7294291e2396..7f1f2687147d255edd849dbade97a06f9da03159
  #include <asm/hardware/gic.h>
  #include <asm/mach/map.h>
  #include <asm/mach/irq.h>
+ #include <asm/cacheflush.h>
  
  #include <mach/regs-irq.h>
  #include <mach/regs-pmu.h>
  #include <mach/regs-gpio.h>
+ #include <mach/pmu.h>
  
  #include <plat/cpu.h>
  #include <plat/clock.h>
@@@ -45,6 -47,8 +47,8 @@@
  #include <plat/regs-serial.h>
  
  #include "common.h"
+ #define L2_AUX_VAL 0x7C470001
+ #define L2_AUX_MASK 0xC200ffff
  
  static const char name_exynos4210[] = "EXYNOS4210";
  static const char name_exynos4212[] = "EXYNOS4212";
@@@ -173,7 -177,12 +177,12 @@@ static struct map_desc exynos4_iodesc[
        }, {
                .virtual        = (unsigned long)S5P_VA_DMC0,
                .pfn            = __phys_to_pfn(EXYNOS4_PA_DMC0),
-               .length         = SZ_4K,
+               .length         = SZ_64K,
+               .type           = MT_DEVICE,
+       }, {
+               .virtual        = (unsigned long)S5P_VA_DMC1,
+               .pfn            = __phys_to_pfn(EXYNOS4_PA_DMC1),
+               .length         = SZ_64K,
                .type           = MT_DEVICE,
        }, {
                .virtual        = (unsigned long)S3C_VA_USB_HSPHY,
@@@ -201,6 -210,14 +210,6 @@@ static struct map_desc exynos4_iodesc1[
        },
  };
  
 -static void exynos_idle(void)
 -{
 -      if (!need_resched())
 -              cpu_do_idle();
 -
 -      local_irq_enable();
 -}
 -
  void exynos4_restart(char mode, const char *cmd)
  {
        __raw_writel(0x1, S5P_SWRESET);
@@@ -433,23 -450,48 +442,48 @@@ core_initcall(exynos4_core_init)
  #ifdef CONFIG_CACHE_L2X0
  static int __init exynos4_l2x0_cache_init(void)
  {
-       /* TAG, Data Latency Control: 2cycle */
-       __raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL);
+       int ret;
+       ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK);
+       if (!ret) {
+               l2x0_regs_phys = virt_to_phys(&l2x0_saved_regs);
+               clean_dcache_area(&l2x0_regs_phys, sizeof(unsigned long));
+               return 0;
+       }
  
-       if (soc_is_exynos4210())
-               __raw_writel(0x110, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL);
-       else if (soc_is_exynos4212() || soc_is_exynos4412())
-               __raw_writel(0x120, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL);
+       if (!(__raw_readl(S5P_VA_L2CC + L2X0_CTRL) & 0x1)) {
+               l2x0_saved_regs.phy_base = EXYNOS4_PA_L2CC;
+               /* TAG, Data Latency Control: 2 cycles */
+               l2x0_saved_regs.tag_latency = 0x110;
+               if (soc_is_exynos4212() || soc_is_exynos4412())
+                       l2x0_saved_regs.data_latency = 0x120;
+               else
+                       l2x0_saved_regs.data_latency = 0x110;
+               l2x0_saved_regs.prefetch_ctrl = 0x30000007;
+               l2x0_saved_regs.pwr_ctrl =
+                       (L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN);
  
-       /* L2X0 Prefetch Control */
-       __raw_writel(0x30000007, S5P_VA_L2CC + L2X0_PREFETCH_CTRL);
+               l2x0_regs_phys = virt_to_phys(&l2x0_saved_regs);
  
-       /* L2X0 Power Control */
-       __raw_writel(L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN,
-                    S5P_VA_L2CC + L2X0_POWER_CTRL);
+               __raw_writel(l2x0_saved_regs.tag_latency,
+                               S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL);
+               __raw_writel(l2x0_saved_regs.data_latency,
+                               S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL);
  
-       l2x0_init(S5P_VA_L2CC, 0x7C470001, 0xC200ffff);
+               /* L2X0 Prefetch Control */
+               __raw_writel(l2x0_saved_regs.prefetch_ctrl,
+                               S5P_VA_L2CC + L2X0_PREFETCH_CTRL);
+               /* L2X0 Power Control */
+               __raw_writel(l2x0_saved_regs.pwr_ctrl,
+                               S5P_VA_L2CC + L2X0_POWER_CTRL);
+               clean_dcache_area(&l2x0_regs_phys, sizeof(unsigned long));
+               clean_dcache_area(&l2x0_saved_regs, sizeof(struct l2x0_regs));
+       }
  
+       l2x0_init(S5P_VA_L2CC, L2_AUX_VAL, L2_AUX_MASK);
        return 0;
  }
  
@@@ -459,6 -501,10 +493,6 @@@ early_initcall(exynos4_l2x0_cache_init)
  int __init exynos_init(void)
  {
        printk(KERN_INFO "EXYNOS: Initializing architecture\n");
 -
 -      /* set idle function */
 -      pm_idle = exynos_idle;
 -
        return device_register(&exynos4_dev);
  }
  
index e190130517727ea9bcdfb9541496922093a9d672,2dd55a191abd04978e8f513a7c5183753e9dcb3b..481682745e7dd998f30d31126107f90edbda860e
@@@ -155,13 -155,6 +155,6 @@@ static struct sleep_save exynos4_core_s
        SAVE_ITEM(S5P_SROM_BC3),
  };
  
- static struct sleep_save exynos4_l2cc_save[] = {
-       SAVE_ITEM(S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL),
-       SAVE_ITEM(S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL),
-       SAVE_ITEM(S5P_VA_L2CC + L2X0_PREFETCH_CTRL),
-       SAVE_ITEM(S5P_VA_L2CC + L2X0_POWER_CTRL),
-       SAVE_ITEM(S5P_VA_L2CC + L2X0_AUX_CTRL),
- };
  
  /* For Cortex-A9 Diagnostic and Power control register */
  static unsigned int save_arm_register[2];
@@@ -182,7 -175,6 +175,6 @@@ static void exynos4_pm_prepare(void
        u32 tmp;
  
        s3c_pm_do_save(exynos4_core_save, ARRAY_SIZE(exynos4_core_save));
-       s3c_pm_do_save(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save));
        s3c_pm_do_save(exynos4_epll_save, ARRAY_SIZE(exynos4_epll_save));
        s3c_pm_do_save(exynos4_vpll_save, ARRAY_SIZE(exynos4_vpll_save));
  
  
  }
  
 -static int exynos4_pm_add(struct device *dev)
 +static int exynos4_pm_add(struct device *dev, struct subsys_interface *sif)
  {
        pm_cpu_prep = exynos4_pm_prepare;
        pm_cpu_sleep = exynos4_cpu_suspend;
@@@ -384,17 -376,8 +376,10 @@@ static void exynos4_pm_resume(void
  
        exynos4_restore_pll();
  
 +#ifdef CONFIG_SMP
        scu_enable(S5P_VA_SCU);
 +#endif
  
- #ifdef CONFIG_CACHE_L2X0
-       s3c_pm_do_restore_core(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save));
-       outer_inv_all();
-       /* enable L2X0*/
-       writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
- #endif
  early_wakeup:
        return;
  }
index aebbcc291b4e2ae35c5d8dee6035002fa038bd49,63f2c8aa119da745a107421f14091988bdd63af9..52f079a691cb4627b66eb6fa4bb7ad2d14327e9a
@@@ -138,11 -138,6 +138,11 @@@ static struct clk init_clocks_off[] = 
                .ctrlbit        = S3C_CLKCON_PCLK_TSADC,
        }, {
                .name           = "i2c",
 +#ifdef CONFIG_S3C_DEV_I2C1
 +              .devname        = "s3c2440-i2c.0",
 +#else
 +              .devname        = "s3c2440-i2c",
 +#endif
                .parent         = &clk_p,
                .enable         = s3c64xx_pclk_ctrl,
                .ctrlbit        = S3C_CLKCON_PCLK_IIC,
                .parent         = &clk_48m,
                .enable         = s3c64xx_sclk_ctrl,
                .ctrlbit        = S3C_CLKCON_SCLK_MMC2_48,
+       }, {
+               .name           = "ac97",
+               .parent         = &clk_p,
+               .ctrlbit        = S3C_CLKCON_PCLK_AC97,
+       }, {
+               .name           = "cfcon",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_IHOST,
        }, {
                .name           = "dma0",
                .parent         = &clk_h,
                .parent         = &clk_h,
                .enable         = s3c64xx_hclk_ctrl,
                .ctrlbit        = S3C_CLKCON_HCLK_DMA1,
+       }, {
+               .name           = "3dse",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_3DSE,
+       }, {
+               .name           = "hclk_secur",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_SECUR,
+       }, {
+               .name           = "sdma1",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_SDMA1,
+       }, {
+               .name           = "sdma0",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_SDMA0,
+       }, {
+               .name           = "hclk_jpeg",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_JPEG,
+       }, {
+               .name           = "camif",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_CAMIF,
+       }, {
+               .name           = "hclk_scaler",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_SCALER,
+       }, {
+               .name           = "2d",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_2D,
+       }, {
+               .name           = "tv",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_TV,
+       }, {
+               .name           = "post0",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_POST0,
+       }, {
+               .name           = "rot",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_ROT,
+       }, {
+               .name           = "hclk_mfc",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_MFC,
+       }, {
+               .name           = "pclk_mfc",
+               .parent         = &clk_p,
+               .enable         = s3c64xx_pclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_PCLK_MFC,
+       }, {
+               .name           = "dac27",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_DAC27,
+       }, {
+               .name           = "tv27",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_TV27,
+       }, {
+               .name           = "scaler27",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_SCALER27,
+       }, {
+               .name           = "sclk_scaler",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_SCALER,
+       }, {
+               .name           = "post0_27",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_POST0_27,
+       }, {
+               .name           = "secur",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_SECUR,
+       }, {
+               .name           = "sclk_mfc",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_MFC,
+       }, {
+               .name           = "cam",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_CAM,
+       }, {
+               .name           = "sclk_jpeg",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_JPEG,
        },
  };
  
@@@ -289,16 -394,7 +399,7 @@@ static struct clk init_clocks[] = 
                .name           = "watchdog",
                .parent         = &clk_p,
                .ctrlbit        = S3C_CLKCON_PCLK_WDT,
-       }, {
-               .name           = "ac97",
-               .parent         = &clk_p,
-               .ctrlbit        = S3C_CLKCON_PCLK_AC97,
-       }, {
-               .name           = "cfcon",
-               .parent         = &clk_h,
-               .enable         = s3c64xx_hclk_ctrl,
-               .ctrlbit        = S3C_CLKCON_HCLK_IHOST,
-       }
+       },
  };
  
  static struct clk clk_hsmmc0 = {
index f10768e988d480d8e49758d900ba890a3649099a,cd0b9da9bbc4de640a86d45fefd0955afe6f1f27..eb3ba1385b06ede28c16c6d52479a5c4e692b566
@@@ -57,6 -57,7 +57,7 @@@
  #include <plat/sdhci.h>
  #include <plat/ts.h>
  #include <plat/udc.h>
+ #include <plat/udc-hs.h>
  #include <plat/usb-control.h>
  #include <plat/usb-phy.h>
  #include <plat/regs-iic.h>
@@@ -267,6 -268,52 +268,52 @@@ struct platform_device s5p_device_fimc
  };
  #endif /* CONFIG_S5P_DEV_FIMC3 */
  
+ /* G2D */
+ #ifdef CONFIG_S5P_DEV_G2D
+ static struct resource s5p_g2d_resource[] = {
+       [0] = {
+               .start  = S5P_PA_G2D,
+               .end    = S5P_PA_G2D + SZ_4K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = IRQ_2D,
+               .end    = IRQ_2D,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ struct platform_device s5p_device_g2d = {
+       .name           = "s5p-g2d",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(s5p_g2d_resource),
+       .resource       = s5p_g2d_resource,
+       .dev            = {
+               .dma_mask               = &samsung_device_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+ };
+ #endif /* CONFIG_S5P_DEV_G2D */
+ #ifdef CONFIG_S5P_DEV_JPEG
+ static struct resource s5p_jpeg_resource[] = {
+       [0] = DEFINE_RES_MEM(S5P_PA_JPEG, SZ_4K),
+       [1] = DEFINE_RES_IRQ(IRQ_JPEG),
+ };
+ struct platform_device s5p_device_jpeg = {
+       .name           = "s5p-jpeg",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(s5p_jpeg_resource),
+       .resource       = s5p_jpeg_resource,
+       .dev            = {
+               .dma_mask               = &samsung_device_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+ };
+ #endif /*  CONFIG_S5P_DEV_JPEG */
  /* FIMD0 */
  
  #ifdef CONFIG_S5P_DEV_FIMD0
@@@ -468,10 -515,8 +515,10 @@@ void __init s3c_i2c0_set_platdata(struc
  {
        struct s3c2410_platform_i2c *npd;
  
 -      if (!pd)
 +      if (!pd) {
                pd = &default_i2c_data;
 +              pd->bus_num = 0;
 +      }
  
        npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
                               &s3c_device_i2c0);
@@@ -769,7 -814,7 +816,7 @@@ struct platform_device s3c_device_cfco
        .resource       = s3c_cfcon_resource,
  };
  
- void s3c_ide_set_platdata(struct s3c_ide_platdata *pdata)
+ void __init s3c_ide_set_platdata(struct s3c_ide_platdata *pdata)
  {
        s3c_set_platdata(pdata, sizeof(struct s3c_ide_platdata),
                         &s3c_device_cfcon);
@@@ -887,7 -932,7 +934,7 @@@ struct platform_device s5p_device_mfc_
  
  #ifdef CONFIG_S5P_DEV_CSIS0
  static struct resource s5p_mipi_csis0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS0, SZ_4K),
+       [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS0, SZ_16K),
        [1] = DEFINE_RES_IRQ(IRQ_MIPI_CSIS0),
  };
  
@@@ -901,7 -946,7 +948,7 @@@ struct platform_device s5p_device_mipi_
  
  #ifdef CONFIG_S5P_DEV_CSIS1
  static struct resource s5p_mipi_csis1_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS1, SZ_4K),
+       [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS1, SZ_16K),
        [1] = DEFINE_RES_IRQ(IRQ_MIPI_CSIS1),
  };
  
@@@ -1049,7 -1094,7 +1096,7 @@@ struct platform_device s3c64xx_device_o
        .resource       = s3c64xx_onenand1_resources,
  };
  
- void s3c64xx_onenand1_set_platdata(struct onenand_platform_data *pdata)
+ void __init s3c64xx_onenand1_set_platdata(struct onenand_platform_data *pdata)
  {
        s3c_set_platdata(pdata, sizeof(struct onenand_platform_data),
                         &s3c64xx_device_onenand1);
@@@ -1423,6 -1468,19 +1470,19 @@@ struct platform_device s3c_device_usb_h
                .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
  };
+ void __init s3c_hsotg_set_platdata(struct s3c_hsotg_plat *pd)
+ {
+       struct s3c_hsotg_plat *npd;
+       npd = s3c_set_platdata(pd, sizeof(struct s3c_hsotg_plat),
+                       &s3c_device_usb_hsotg);
+       if (!npd->phy_init)
+               npd->phy_init = s5p_usb_phy_init;
+       if (!npd->phy_exit)
+               npd->phy_exit = s5p_usb_phy_exit;
+ }
  #endif /* CONFIG_S3C_DEV_USB_HSOTG */
  
  /* USB High Spped 2.0 Device (Gadget) */