Merge tag 'drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 2 Oct 2012 01:46:13 +0000 (18:46 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 2 Oct 2012 01:46:13 +0000 (18:46 -0700)
Pull ARM soc driver specific changes from Olof Johansson:
 - A long-coming conversion of various platforms to a common LED
   infrastructure
 - AT91 is moved over to use the newer MCI driver for MMC
 - Pincontrol conversions for samsung platforms
 - DT bindings for gscaler on samsung
 - i2c driver fixes for tegra, acked by i2c maintainer

Fix up conflicts as per Olof.

* tag 'drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (48 commits)
  drivers: bus: omap_l3: use resources instead of hardcoded irqs
  pinctrl: exynos: Fix wakeup IRQ domain registration check
  pinctrl: samsung: Uninline samsung_pinctrl_get_soc_data
  pinctrl: exynos: Correct the detection of wakeup-eint node
  pinctrl: exynos: Mark exynos_irq_demux_eint as inline
  pinctrl: exynos: Handle only unmasked wakeup interrupts
  pinctrl: exynos: Fix typos in gpio/wkup _irq_mask
  pinctrl: exynos: Set pin function to EINT in irq_set_type of GPIO EINTa
  drivers: bus: Move the OMAP interconnect driver to drivers/bus/
  i2c: tegra: dynamically control fast clk
  i2c: tegra: I2_M_NOSTART functionality not supported in Tegra20
  ARM: tegra: clock: remove unused clock entry for i2c
  ARM: tegra: clock: add connection name in i2c clock entry
  i2c: tegra: pass proper name for getting clock
  ARM: tegra: clock: add i2c fast clock entry in clock table
  ARM: EXYNOS: Adds G-Scaler device from Device Tree
  ARM: EXYNOS: Add clock support for G-Scaler
  ARM: EXYNOS: Enable pinctrl driver support for EXYNOS4 device tree enabled platform
  ARM: dts: Add pinctrl node entries for SAMSUNG EXYNOS4210 SoC
  ARM: EXYNOS: skip wakeup interrupt setup if pinctrl driver is used
  ...

34 files changed:
1  2 
arch/arm/Kconfig
arch/arm/boot/dts/omap4.dtsi
arch/arm/kernel/Makefile
arch/arm/mach-at91/at91sam9260_devices.c
arch/arm/mach-at91/at91sam9261_devices.c
arch/arm/mach-at91/at91sam9263_devices.c
arch/arm/mach-at91/at91sam9rl_devices.c
arch/arm/mach-clps711x/Makefile
arch/arm/mach-exynos/Kconfig
arch/arm/mach-exynos/clock-exynos5.c
arch/arm/mach-exynos/include/mach/map.h
arch/arm/mach-integrator/core.c
arch/arm/mach-omap1/board-h2.c
arch/arm/mach-omap1/board-h3.c
arch/arm/mach-omap1/board-osk.c
arch/arm/mach-omap2/Kconfig
arch/arm/mach-omap2/Makefile
arch/arm/mach-pxa/Makefile
arch/arm/mach-realview/core.c
arch/arm/mach-realview/realview_eb.c
arch/arm/mach-realview/realview_pb1176.c
arch/arm/mach-realview/realview_pb11mp.c
arch/arm/mach-realview/realview_pba8.c
arch/arm/mach-realview/realview_pbx.c
arch/arm/mach-shark/core.c
arch/arm/mach-tegra/tegra20_clocks_data.c
arch/arm/mach-tegra/tegra30_clocks_data.c
arch/arm/mach-versatile/core.c
arch/arm/plat-omap/Kconfig
arch/arm/plat-omap/debug-leds.c
drivers/Kconfig
drivers/Makefile
drivers/bus/omap_l3_noc.c
drivers/gpio/gpio-samsung.c

Simple merge
index 5d1c48459e6e302ba63a36531762cc5a6e95aeb8,8a780b2a5083e7b3db509c1d5917cbfbbe7c5039..3883f94fdbd0ed29430ec35815689ae4ff692cc5
                        ti,hwmods = "dmic";
                };
  
 +              mcbsp1: mcbsp@40122000 {
 +                      compatible = "ti,omap4-mcbsp";
 +                      reg = <0x40122000 0xff>, /* MPU private access */
 +                            <0x49022000 0xff>; /* L3 Interconnect */
 +                      reg-names = "mpu", "dma";
 +                      interrupts = <0 17 0x4>;
 +                      interrupt-names = "common";
 +                      interrupt-parent = <&gic>;
 +                      ti,buffer-size = <128>;
 +                      ti,hwmods = "mcbsp1";
 +              };
 +
 +              mcbsp2: mcbsp@40124000 {
 +                      compatible = "ti,omap4-mcbsp";
 +                      reg = <0x40124000 0xff>, /* MPU private access */
 +                            <0x49024000 0xff>; /* L3 Interconnect */
 +                      reg-names = "mpu", "dma";
 +                      interrupts = <0 22 0x4>;
 +                      interrupt-names = "common";
 +                      interrupt-parent = <&gic>;
 +                      ti,buffer-size = <128>;
 +                      ti,hwmods = "mcbsp2";
 +              };
 +
 +              mcbsp3: mcbsp@40126000 {
 +                      compatible = "ti,omap4-mcbsp";
 +                      reg = <0x40126000 0xff>, /* MPU private access */
 +                            <0x49026000 0xff>; /* L3 Interconnect */
 +                      reg-names = "mpu", "dma";
 +                      interrupts = <0 23 0x4>;
 +                      interrupt-names = "common";
 +                      interrupt-parent = <&gic>;
 +                      ti,buffer-size = <128>;
 +                      ti,hwmods = "mcbsp3";
 +              };
 +
 +              mcbsp4: mcbsp@48096000 {
 +                      compatible = "ti,omap4-mcbsp";
 +                      reg = <0x48096000 0xff>; /* L4 Interconnect */
 +                      reg-names = "mpu";
 +                      interrupts = <0 16 0x4>;
 +                      interrupt-names = "common";
 +                      interrupt-parent = <&gic>;
 +                      ti,buffer-size = <128>;
 +                      ti,hwmods = "mcbsp4";
 +              };
 +
 +              keypad: keypad@4a31c000 {
 +                      compatible = "ti,omap4-keypad";
 +                      reg = <0x4a31c000 0x80>;
 +                      interrupts = <0 120 0x4>;
 +                      reg-names = "mpu";
 +                      ti,hwmods = "kbd";
 +              };
 +
 +              emif1: emif@4c000000 {
 +                      compatible = "ti,emif-4d";
 +                      reg = <0x4c000000 0x100>;
 +                      interrupts = <0 110 0x4>;
 +                      ti,hwmods = "emif1";
 +                      phy-type = <1>;
 +                      hw-caps-read-idle-ctrl;
 +                      hw-caps-ll-interface;
 +                      hw-caps-temp-alert;
 +              };
 +
 +              emif2: emif@4d000000 {
 +                      compatible = "ti,emif-4d";
 +                      reg = <0x4d000000 0x100>;
 +                      interrupts = <0 111 0x4>;
 +                      ti,hwmods = "emif2";
 +                      phy-type = <1>;
 +                      hw-caps-read-idle-ctrl;
 +                      hw-caps-ll-interface;
 +                      hw-caps-temp-alert;
 +              };
++
+               ocp2scp {
+                       compatible = "ti,omap-ocp2scp";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+                       ti,hwmods = "ocp2scp_usb_phy";
+               };
        };
  };
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index af283a2bc7c78ed1b4b1212f07f825ae282ddebc,cd8836f43f01ebb57e927ebb0db58f65a8db050d..376f7f29ef77391fc8de34c9cb8bb6264abdef09
@@@ -31,7 -31,7 +31,8 @@@
  #include <linux/i2c/tps65010.h>
  #include <linux/smc91x.h>
  #include <linux/omapfb.h>
 +#include <linux/platform_data/gpio-omap.h>
+ #include <linux/leds.h>
  
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
index 06d11b1ee9c6889482cc355203810c3dd80d0093,1fa9c45c1ae591343e3d4ee4588fa01a34fcd21f..ededdb7ef28c021aa2f43ed4dcacbb8fe1c6e723
@@@ -31,7 -31,7 +31,8 @@@
  #include <linux/i2c/tps65010.h>
  #include <linux/smc91x.h>
  #include <linux/omapfb.h>
 +#include <linux/platform_data/gpio-omap.h>
+ #include <linux/leds.h>
  
  #include <asm/setup.h>
  #include <asm/page.h>
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index ce7747692c8be646f85c556bff6bb7e189c5dcd6,21661ade885ffd7f29c4d7d223332777cf275ce6..d3b3cd216d64b05d55b8c55330f62a1c9492fc33
@@@ -31,8 -30,8 +31,7 @@@
  
  #include <mach/hardware.h>
  #include <asm/irq.h>
- #include <asm/leds.h>
  #include <asm/mach-types.h>
 -#include <asm/pmu.h>
  #include <asm/pgtable.h>
  #include <asm/hardware/gic.h>
  #include <asm/hardware/cache-l2x0.h>
index e21711d72ee212d9ef603aa793393861bbe58cb5,c0ff882c5cb865bb31ef3e07c5c498f0c9de11f7..07d6672ddae70e77776d12d042db72f20e03569c
@@@ -33,8 -32,8 +33,7 @@@
  
  #include <mach/hardware.h>
  #include <asm/irq.h>
- #include <asm/leds.h>
  #include <asm/mach-types.h>
 -#include <asm/pmu.h>
  #include <asm/pgtable.h>
  #include <asm/hardware/gic.h>
  #include <asm/hardware/cache-l2x0.h>
index b442fb276d57fdde4f414d0df03deaeb04d047d3,30779ae40c046a85cdb7456918f02812cc2bc451..ec4fcd9a7e9c793bfd371adae85f5779093fe9d1
@@@ -31,8 -30,8 +31,7 @@@
  
  #include <mach/hardware.h>
  #include <asm/irq.h>
- #include <asm/leds.h>
  #include <asm/mach-types.h>
 -#include <asm/pmu.h>
  #include <asm/pgtable.h>
  #include <asm/hardware/gic.h>
  #include <asm/hardware/cache-l2x0.h>
index 1435cd86396596c811a469bbb5b57efdd09dac96,081cd72c090e01ad41a106f86267958bbb3a7505..9992431b8a15121e6a5b56c5727d234f4ab6be5d
  #include <linux/amba/mmci.h>
  #include <linux/amba/pl022.h>
  #include <linux/io.h>
 +#include <linux/platform_data/clk-realview.h>
  
  #include <asm/irq.h>
- #include <asm/leds.h>
  #include <asm/mach-types.h>
 -#include <asm/pmu.h>
  #include <asm/pgtable.h>
  #include <asm/hardware/gic.h>
  
index 5d2c8bebb0692206b2e7651217fdca3cb29010fa,1ce62b9f846c2a1b306124b422c4fd9bd73b209a..17954a327e1bb31340ec678844d89ffd4cef5370
  #include <linux/amba/mmci.h>
  #include <linux/amba/pl022.h>
  #include <linux/io.h>
 +#include <linux/platform_data/clk-realview.h>
  
  #include <asm/irq.h>
- #include <asm/leds.h>
  #include <asm/mach-types.h>
 -#include <asm/pmu.h>
  #include <asm/smp_twd.h>
  #include <asm/pgtable.h>
  #include <asm/hardware/gic.h>
Simple merge
Simple merge
Simple merge
index 195aaae658726bf6903f9df739cb90878ede1462,24e23f3dd6a889b5df44a9310d308558d8caa283..ea29bbe8e5cfd5168a864e9fa53783376dcfefab
  #include <linux/platform_device.h>
  #include <linux/leds.h>
  #include <linux/io.h>
 +#include <linux/platform_data/gpio-omap.h>
+ #include <linux/slab.h>
  
  #include <mach/hardware.h>
- #include <asm/leds.h>
  #include <asm/mach-types.h>
  
  #include <plat/fpga.h>
diff --cc drivers/Kconfig
Simple merge
index 8c30e73cd94cd74b031cdfc3e1a99f1f4cd3ce6d,f8cdeeb5c484d033644965da3e2914359f6283ee..acb48fa4531cd9e707643717b88bd37104d60a81
@@@ -5,7 -5,7 +5,8 @@@
  # Rewritten to use lists instead of if-statements.
  #
  
 +obj-y                         += irqchip/
+ obj-y                         += bus/
  
  # GPIO must come after pinctrl as gpios may need to mux pins etc
  obj-y                         += pinctrl/
index 0000000000000000000000000000000000000000,ab911a33f8a894a9ea06d04428e4db3b50d7c342..44b2b3e57882e5e5290233126f265934d348fa85
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,266 +1,267 @@@
+ /*
+  * OMAP4XXX L3 Interconnect error handling driver
+  *
+  * Copyright (C) 2011 Texas Corporation
+  *    Santosh Shilimkar <santosh.shilimkar@ti.com>
+  *    Sricharan <r.sricharan@ti.com>
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+  * the Free Software Foundation; either version 2 of the License, or
+  * (at your option) any later version.
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU General Public License for more details.
+  *
+  * You should have received a copy of the GNU General Public License
+  * along with this program; if not, write to the Free Software
+  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  * USA
+  */
+ #include <linux/module.h>
+ #include <linux/init.h>
+ #include <linux/io.h>
+ #include <linux/platform_device.h>
+ #include <linux/interrupt.h>
+ #include <linux/kernel.h>
+ #include <linux/slab.h>
++#include "soc.h"
+ #include "omap_l3_noc.h"
+ /*
+  * Interrupt Handler for L3 error detection.
+  *    1) Identify the L3 clockdomain partition to which the error belongs to.
+  *    2) Identify the slave where the error information is logged
+  *    3) Print the logged information.
+  *    4) Add dump stack to provide kernel trace.
+  *
+  * Two Types of errors :
+  *    1) Custom errors in L3 :
+  *            Target like DMM/FW/EMIF generates SRESP=ERR error
+  *    2) Standard L3 error:
+  *            - Unsupported CMD.
+  *                    L3 tries to access target while it is idle
+  *            - OCP disconnect.
+  *            - Address hole error:
+  *                    If DSS/ISS/FDIF/USBHOSTFS access a target where they
+  *                    do not have connectivity, the error is logged in
+  *                    their default target which is DMM2.
+  *
+  *    On High Secure devices, firewall errors are possible and those
+  *    can be trapped as well. But the trapping is implemented as part
+  *    secure software and hence need not be implemented here.
+  */
+ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
+ {
+       struct omap4_l3 *l3 = _l3;
+       int inttype, i, k;
+       int err_src = 0;
+       u32 std_err_main, err_reg, clear, masterid;
+       void __iomem *base, *l3_targ_base;
+       char *target_name, *master_name = "UN IDENTIFIED";
+       /* Get the Type of interrupt */
+       inttype = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR;
+       for (i = 0; i < L3_MODULES; i++) {
+               /*
+                * Read the regerr register of the clock domain
+                * to determine the source
+                */
+               base = l3->l3_base[i];
+               err_reg = __raw_readl(base + l3_flagmux[i] +
+                                       + L3_FLAGMUX_REGERR0 + (inttype << 3));
+               /* Get the corresponding error and analyse */
+               if (err_reg) {
+                       /* Identify the source from control status register */
+                       err_src = __ffs(err_reg);
+                       /* Read the stderrlog_main_source from clk domain */
+                       l3_targ_base = base + *(l3_targ[i] + err_src);
+                       std_err_main =  __raw_readl(l3_targ_base +
+                                       L3_TARG_STDERRLOG_MAIN);
+                       masterid = __raw_readl(l3_targ_base +
+                                       L3_TARG_STDERRLOG_MSTADDR);
+                       switch (std_err_main & CUSTOM_ERROR) {
+                       case STANDARD_ERROR:
+                               target_name =
+                                       l3_targ_inst_name[i][err_src];
+                               WARN(true, "L3 standard error: TARGET:%s at address 0x%x\n",
+                                       target_name,
+                                       __raw_readl(l3_targ_base +
+                                               L3_TARG_STDERRLOG_SLVOFSLSB));
+                               /* clear the std error log*/
+                               clear = std_err_main | CLEAR_STDERR_LOG;
+                               writel(clear, l3_targ_base +
+                                       L3_TARG_STDERRLOG_MAIN);
+                               break;
+                       case CUSTOM_ERROR:
+                               target_name =
+                                       l3_targ_inst_name[i][err_src];
+                               for (k = 0; k < NUM_OF_L3_MASTERS; k++) {
+                                       if (masterid == l3_masters[k].id)
+                                               master_name =
+                                                       l3_masters[k].name;
+                               }
+                               WARN(true, "L3 custom error: MASTER:%s TARGET:%s\n",
+                                       master_name, target_name);
+                               /* clear the std error log*/
+                               clear = std_err_main | CLEAR_STDERR_LOG;
+                               writel(clear, l3_targ_base +
+                                       L3_TARG_STDERRLOG_MAIN);
+                               break;
+                       default:
+                               /* Nothing to be handled here as of now */
+                               break;
+                       }
+               /* Error found so break the for loop */
+               break;
+               }
+       }
+       return IRQ_HANDLED;
+ }
+ static int __devinit omap4_l3_probe(struct platform_device *pdev)
+ {
+       static struct omap4_l3 *l3;
+       struct resource *res;
+       int ret;
+       l3 = kzalloc(sizeof(*l3), GFP_KERNEL);
+       if (!l3)
+               return -ENOMEM;
+       platform_set_drvdata(pdev, l3);
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "couldn't find resource 0\n");
+               ret = -ENODEV;
+               goto err0;
+       }
+       l3->l3_base[0] = ioremap(res->start, resource_size(res));
+       if (!l3->l3_base[0]) {
+               dev_err(&pdev->dev, "ioremap failed\n");
+               ret = -ENOMEM;
+               goto err0;
+       }
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       if (!res) {
+               dev_err(&pdev->dev, "couldn't find resource 1\n");
+               ret = -ENODEV;
+               goto err1;
+       }
+       l3->l3_base[1] = ioremap(res->start, resource_size(res));
+       if (!l3->l3_base[1]) {
+               dev_err(&pdev->dev, "ioremap failed\n");
+               ret = -ENOMEM;
+               goto err1;
+       }
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
+       if (!res) {
+               dev_err(&pdev->dev, "couldn't find resource 2\n");
+               ret = -ENODEV;
+               goto err2;
+       }
+       l3->l3_base[2] = ioremap(res->start, resource_size(res));
+       if (!l3->l3_base[2]) {
+               dev_err(&pdev->dev, "ioremap failed\n");
+               ret = -ENOMEM;
+               goto err2;
+       }
+       /*
+        * Setup interrupt Handlers
+        */
+       l3->debug_irq = platform_get_irq(pdev, 0);
+       ret = request_irq(l3->debug_irq,
+                       l3_interrupt_handler,
+                       IRQF_DISABLED, "l3-dbg-irq", l3);
+       if (ret) {
+               pr_crit("L3: request_irq failed to register for 0x%x\n",
+                                               l3->debug_irq);
+               goto err3;
+       }
+       l3->app_irq = platform_get_irq(pdev, 1);
+       ret = request_irq(l3->app_irq,
+                       l3_interrupt_handler,
+                       IRQF_DISABLED, "l3-app-irq", l3);
+       if (ret) {
+               pr_crit("L3: request_irq failed to register for 0x%x\n",
+                                               l3->app_irq);
+               goto err4;
+       }
+       return 0;
+ err4:
+       free_irq(l3->debug_irq, l3);
+ err3:
+       iounmap(l3->l3_base[2]);
+ err2:
+       iounmap(l3->l3_base[1]);
+ err1:
+       iounmap(l3->l3_base[0]);
+ err0:
+       kfree(l3);
+       return ret;
+ }
+ static int __devexit omap4_l3_remove(struct platform_device *pdev)
+ {
+       struct omap4_l3 *l3 = platform_get_drvdata(pdev);
+       free_irq(l3->app_irq, l3);
+       free_irq(l3->debug_irq, l3);
+       iounmap(l3->l3_base[0]);
+       iounmap(l3->l3_base[1]);
+       iounmap(l3->l3_base[2]);
+       kfree(l3);
+       return 0;
+ }
+ #if defined(CONFIG_OF)
+ static const struct of_device_id l3_noc_match[] = {
+       {.compatible = "ti,omap4-l3-noc", },
+       {},
+ };
+ MODULE_DEVICE_TABLE(of, l3_noc_match);
+ #else
+ #define l3_noc_match NULL
+ #endif
+ static struct platform_driver omap4_l3_driver = {
+       .probe          = omap4_l3_probe,
+       .remove         = __devexit_p(omap4_l3_remove),
+       .driver         = {
+               .name           = "omap_l3_noc",
+               .owner          = THIS_MODULE,
+               .of_match_table = l3_noc_match,
+       },
+ };
+ static int __init omap4_l3_init(void)
+ {
+       return platform_driver_register(&omap4_l3_driver);
+ }
+ postcore_initcall_sync(omap4_l3_init);
+ static void __exit omap4_l3_exit(void)
+ {
+       platform_driver_unregister(&omap4_l3_driver);
+ }
+ module_exit(omap4_l3_exit);
Simple merge