Merge tag 'dt2' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Linus Torvalds [Thu, 2 Aug 2012 18:50:24 +0000 (11:50 -0700)]
Pull arm-soc Marvell Orion device-tree updates from Olof Johansson:
 "This contains a set of device-tree conversions for Marvell Orion
  platforms that were staged early but took a few tries to get the
  branch into a format where it was suitable for us to pick up.

  Given that most people working on these platforms are hobbyists with
  limited time, we were a bit more flexible with merging it even though
  it came in late."

* tag 'dt2' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (21 commits)
  ARM: Kirkwood: Replace mrvl with marvell
  ARM: Kirkwood: Describe GoFlex Net LEDs and SATA in DT.
  ARM: Kirkwood: Describe Dreamplug LEDs in DT.
  ARM: Kirkwood: Describe iConnects LEDs in DT.
  ARM: Kirkwood: Describe iConnects temperature sensor in DT.
  ARM: Kirkwood: Describe IB62x0 LEDs in DT.
  ARM: Kirkwood: Describe IB62x0 gpio-keys in DT.
  ARM: Kirkwood: Describe DNS32? gpio-keys in DT.
  ARM: Kirkwood: Move common portions into a kirkwood-dnskw.dtsi
  ARM: Kirkwood: Replace DNS-320/DNS-325 leds with dt bindings
  ARM: Kirkwood: Describe DNS325 temperature sensor in DT.
  ARM: Kirkwood: Use DT to configure SATA device.
  ARM: kirkwood: use devicetree for SPI on dreamplug
  ARM: kirkwood: Add LS-XHL and LS-CHLv2 support
  ARM: Kirkwood: Initial DTS support for Kirkwood GoFlex Net
  ARM: Kirkwood: Add basic device tree support for QNAP TS219.
  ATA: sata_mv: Add device tree support
  ARM: Orion: DTify the watchdog timer.
  ARM: Orion: Add arch support needed for I2C via DT.
  ARM: kirkwood: use devicetree for orion-spi
  ...

Conflicts:
drivers/watchdog/orion_wdt.c

1  2 
arch/arm/Kconfig
drivers/watchdog/orion_wdt.c

diff --combined arch/arm/Kconfig
@@@ -11,7 -11,6 +11,7 @@@ config AR
        select RTC_LIB
        select SYS_SUPPORTS_APM_EMULATION
        select GENERIC_ATOMIC64 if (CPU_V6 || !CPU_32v6K || !AEABI)
 +      select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
        select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
        select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL
        select HAVE_ARCH_KGDB
@@@ -39,7 -38,6 +39,7 @@@
        select GENERIC_IRQ_PROBE
        select GENERIC_IRQ_SHOW
        select GENERIC_IRQ_PROBE
 +      select ARCH_WANT_IPC_PARSE_VERSION
        select HARDIRQS_SW_RESEND
        select CPU_PM if (SUSPEND || CPU_IDLE)
        select GENERIC_PCI_IOMAP
@@@ -47,9 -45,6 +47,9 @@@
        select GENERIC_SMP_IDLE_THREAD
        select KTIME_SCALAR
        select GENERIC_CLOCKEVENTS_BROADCAST if SMP
 +      select GENERIC_STRNCPY_FROM_USER
 +      select GENERIC_STRNLEN_USER
 +      select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN
        help
          The ARM series is a line of low-power-consumption RISC chip designs
          licensed by ARM Ltd and targeted at embedded applications and
@@@ -255,31 -250,12 +255,31 @@@ choic
        prompt "ARM system type"
        default ARCH_VERSATILE
  
 +config ARCH_SOCFPGA
 +      bool "Altera SOCFPGA family"
 +      select ARCH_WANT_OPTIONAL_GPIOLIB
 +      select ARM_AMBA
 +      select ARM_GIC
 +      select CACHE_L2X0
 +      select CLKDEV_LOOKUP
 +      select COMMON_CLK
 +      select CPU_V7
 +      select DW_APB_TIMER
 +      select DW_APB_TIMER_OF
 +      select GENERIC_CLOCKEVENTS
 +      select GPIO_PL061 if GPIOLIB
 +      select HAVE_ARM_SCU
 +      select SPARSE_IRQ
 +      select USE_OF
 +      help
 +        This enables support for Altera SOCFPGA Cyclone V platform
 +
  config ARCH_INTEGRATOR
        bool "ARM Ltd. Integrator family"
        select ARM_AMBA
        select ARCH_HAS_CPUFREQ
 -      select CLKDEV_LOOKUP
 -      select HAVE_MACH_CLKDEV
 +      select COMMON_CLK
 +      select CLK_VERSATILE
        select HAVE_TCM
        select ICST
        select GENERIC_CLOCKEVENTS
@@@ -301,7 -277,6 +301,7 @@@ config ARCH_REALVIE
        select GENERIC_CLOCKEVENTS
        select ARCH_WANT_OPTIONAL_GPIOLIB
        select PLAT_VERSATILE
 +      select PLAT_VERSATILE_CLOCK
        select PLAT_VERSATILE_CLCD
        select ARM_TIMER_SP804
        select GPIO_PL061 if GPIOLIB
@@@ -320,7 -295,6 +320,7 @@@ config ARCH_VERSATIL
        select ARCH_WANT_OPTIONAL_GPIOLIB
        select NEED_MACH_IO_H if PCI
        select PLAT_VERSATILE
 +      select PLAT_VERSATILE_CLOCK
        select PLAT_VERSATILE_CLCD
        select PLAT_VERSATILE_FPGA_IRQ
        select ARM_TIMER_SP804
@@@ -333,7 -307,7 +333,7 @@@ config ARCH_VEXPRES
        select ARM_AMBA
        select ARM_TIMER_SP804
        select CLKDEV_LOOKUP
 -      select HAVE_MACH_CLKDEV
 +      select COMMON_CLK
        select GENERIC_CLOCKEVENTS
        select HAVE_CLK
        select HAVE_PATA_PLATFORM
        select NO_IOPORT
        select PLAT_VERSATILE
        select PLAT_VERSATILE_CLCD
 +      select REGULATOR_FIXED_VOLTAGE if REGULATOR
        help
          This enables support for the ARM Ltd Versatile Express boards.
  
@@@ -376,7 -349,6 +376,7 @@@ config ARCH_HIGHBAN
        select ARM_TIMER_SP804
        select CACHE_L2X0
        select CLKDEV_LOOKUP
 +      select COMMON_CLK
        select CPU_V7
        select GENERIC_CLOCKEVENTS
        select HAVE_ARM_SCU
@@@ -417,7 -389,6 +417,7 @@@ config ARCH_PRIMA
        bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform"
        select CPU_V7
        select NO_IOPORT
 +      select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
        select CLKDEV_LOOKUP
        select GENERIC_IRQ_CHIP
@@@ -476,8 -447,6 +476,8 @@@ config ARCH_MX
        select CLKSRC_MMIO
        select GENERIC_IRQ_CHIP
        select MULTI_IRQ_HANDLER
 +      select SPARSE_IRQ
 +      select USE_OF
        help
          Support for Freescale MXC/iMX-based family of processors
  
@@@ -564,18 -533,6 +564,18 @@@ config ARCH_IXP4X
        help
          Support for Intel's IXP4XX (XScale) family of processors.
  
 +config ARCH_MVEBU
 +      bool "Marvell SOCs with Device Tree support"
 +      select GENERIC_CLOCKEVENTS
 +      select MULTI_IRQ_HANDLER
 +      select SPARSE_IRQ
 +      select CLKSRC_MMIO
 +      select GENERIC_IRQ_CHIP
 +      select IRQ_DOMAIN
 +      select COMMON_CLK
 +      help
 +        Support for the Marvell SoC Family with device tree support
 +
  config ARCH_DOVE
        bool "Marvell Dove"
        select CPU_V7
@@@ -610,7 -567,6 +610,7 @@@ config ARCH_LPC32X
        select CLKDEV_LOOKUP
        select GENERIC_CLOCKEVENTS
        select USE_OF
 +      select HAVE_PWM
        help
          Support for the NXP LPC32XX family of processors
  
@@@ -691,7 -647,6 +691,7 @@@ config ARCH_TEGR
        select MIGHT_HAVE_CACHE_L2X0
        select NEED_MACH_IO_H if PCI
        select ARCH_HAS_CPUFREQ
 +      select USE_OF
        help
          This enables support for NVIDIA Tegra based systems (Tegra APX,
          Tegra 6xx and Tegra 2 series).
@@@ -703,7 -658,6 +703,7 @@@ config ARCH_PICOXCEL
        select ARM_VIC
        select CPU_V6K
        select DW_APB_TIMER
 +      select DW_APB_TIMER_OF
        select GENERIC_CLOCKEVENTS
        select GENERIC_GPIO
        select HAVE_TCM
@@@ -934,7 -888,7 +934,7 @@@ config ARCH_U30
        select ARM_VIC
        select GENERIC_CLOCKEVENTS
        select CLKDEV_LOOKUP
 -      select HAVE_MACH_CLKDEV
 +      select COMMON_CLK
        select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
        help
@@@ -959,7 -913,7 +959,7 @@@ config ARCH_NOMADI
        select ARM_AMBA
        select ARM_VIC
        select CPU_ARM926T
 -      select CLKDEV_LOOKUP
 +      select COMMON_CLK
        select GENERIC_CLOCKEVENTS
        select PINCTRL
        select MIGHT_HAVE_CACHE_L2X0
@@@ -982,7 -936,6 +982,7 @@@ config ARCH_DAVINC
  
  config ARCH_OMAP
        bool "TI OMAP"
 +      depends on MMU
        select HAVE_CLK
        select ARCH_REQUIRE_GPIOLIB
        select ARCH_HAS_CPUFREQ
@@@ -1011,6 -964,7 +1011,6 @@@ config ARCH_VT850
        select ARCH_HAS_CPUFREQ
        select GENERIC_CLOCKEVENTS
        select ARCH_REQUIRE_GPIOLIB
 -      select HAVE_PWM
        help
          Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip.
  
@@@ -1033,8 -987,6 +1033,8 @@@ endchoic
  # Kconfigs may be included either alphabetically (according to the
  # plat- suffix) or along side the corresponding mach-* source.
  #
 +source "arch/arm/mach-mvebu/Kconfig"
 +
  source "arch/arm/mach-at91/Kconfig"
  
  source "arch/arm/mach-bcmring/Kconfig"
@@@ -1069,6 -1021,8 +1069,6 @@@ source "arch/arm/mach-kirkwood/Kconfig
  
  source "arch/arm/mach-ks8695/Kconfig"
  
 -source "arch/arm/mach-lpc32xx/Kconfig"
 -
  source "arch/arm/mach-msm/Kconfig"
  
  source "arch/arm/mach-mv78xx0/Kconfig"
@@@ -1151,6 -1105,7 +1151,7 @@@ config PLAT_ORIO
        bool
        select CLKSRC_MMIO
        select GENERIC_IRQ_CHIP
+       select IRQ_DOMAIN
        select COMMON_CLK
  
  config PLAT_PXA
@@@ -1627,7 -1582,6 +1628,7 @@@ config ARCH_NR_GPI
        default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
        default 355 if ARCH_U8500
        default 264 if MACH_H4700
 +      default 512 if SOC_OMAP5
        default 0
        help
          Maximum number of GPIOs in the system.
@@@ -2008,25 -1962,6 +2009,25 @@@ config ARM_ATAG_DTB_COMPA
          bootloaders, this option allows zImage to extract the information
          from the ATAG list and store it at run time into the appended DTB.
  
 +choice
 +      prompt "Kernel command line type" if ARM_ATAG_DTB_COMPAT
 +      default ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER
 +
 +config ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER
 +      bool "Use bootloader kernel arguments if available"
 +      help
 +        Uses the command-line options passed by the boot loader instead of
 +        the device tree bootargs property. If the boot loader doesn't provide
 +        any, the device tree bootargs property will be used.
 +
 +config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND
 +      bool "Extend with bootloader kernel arguments"
 +      help
 +        The command-line arguments provided by the boot loader will be
 +        appended to the the device tree bootargs property.
 +
 +endchoice
 +
  config CMDLINE
        string "Default kernel command string"
        default ""
  #include <linux/moduleparam.h>
  #include <linux/types.h>
  #include <linux/kernel.h>
 -#include <linux/fs.h>
  #include <linux/miscdevice.h>
  #include <linux/platform_device.h>
  #include <linux/watchdog.h>
  #include <linux/init.h>
  #include <linux/io.h>
  #include <linux/spinlock.h>
  #include <linux/clk.h>
 +#include <linux/err.h>
+ #include <linux/of.h>
  #include <mach/bridge-regs.h>
  
  /*
   * Watchdog timer block registers.
   */
  #define TIMER_CTRL            0x0000
 -#define  WDT_EN                       0x0010
 +#define WDT_EN                        0x0010
  #define WDT_VAL                       0x0024
  
  #define WDT_MAX_CYCLE_COUNT   0xffffffff
@@@ -43,27 -45,27 +44,27 @@@ static unsigned int wdt_max_duration;      /
  static struct clk *clk;
  static unsigned int wdt_tclk;
  static void __iomem *wdt_reg;
 -static unsigned long wdt_status;
  static DEFINE_SPINLOCK(wdt_lock);
  
 -static void orion_wdt_ping(void)
 +static int orion_wdt_ping(struct watchdog_device *wdt_dev)
  {
        spin_lock(&wdt_lock);
  
        /* Reload watchdog duration */
 -      writel(wdt_tclk * heartbeat, wdt_reg + WDT_VAL);
 +      writel(wdt_tclk * wdt_dev->timeout, wdt_reg + WDT_VAL);
  
        spin_unlock(&wdt_lock);
 +      return 0;
  }
  
 -static void orion_wdt_enable(void)
 +static int orion_wdt_start(struct watchdog_device *wdt_dev)
  {
        u32 reg;
  
        spin_lock(&wdt_lock);
  
        /* Set watchdog duration */
 -      writel(wdt_tclk * heartbeat, wdt_reg + WDT_VAL);
 +      writel(wdt_tclk * wdt_dev->timeout, wdt_reg + WDT_VAL);
  
        /* Clear watchdog timer interrupt */
        reg = readl(BRIDGE_CAUSE);
        writel(reg, RSTOUTn_MASK);
  
        spin_unlock(&wdt_lock);
 +      return 0;
  }
  
 -static void orion_wdt_disable(void)
 +static int orion_wdt_stop(struct watchdog_device *wdt_dev)
  {
        u32 reg;
  
        writel(reg, wdt_reg + TIMER_CTRL);
  
        spin_unlock(&wdt_lock);
 +      return 0;
  }
  
 -static int orion_wdt_get_timeleft(int *time_left)
 +static unsigned int orion_wdt_get_timeleft(struct watchdog_device *wdt_dev)
  {
 +      unsigned int time_left;
 +
        spin_lock(&wdt_lock);
 -      *time_left = readl(wdt_reg + WDT_VAL) / wdt_tclk;
 +      time_left = readl(wdt_reg + WDT_VAL) / wdt_tclk;
        spin_unlock(&wdt_lock);
 -      return 0;
 -}
  
 -static int orion_wdt_open(struct inode *inode, struct file *file)
 -{
 -      if (test_and_set_bit(WDT_IN_USE, &wdt_status))
 -              return -EBUSY;
 -      clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
 -      orion_wdt_enable();
 -      return nonseekable_open(inode, file);
 +      return time_left;
  }
  
 -static ssize_t orion_wdt_write(struct file *file, const char *data,
 -                                      size_t len, loff_t *ppos)
 +static int orion_wdt_set_timeout(struct watchdog_device *wdt_dev,
 +                               unsigned int timeout)
  {
 -      if (len) {
 -              if (!nowayout) {
 -                      size_t i;
 -
 -                      clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
 -                      for (i = 0; i != len; i++) {
 -                              char c;
 -
 -                              if (get_user(c, data + i))
 -                                      return -EFAULT;
 -                              if (c == 'V')
 -                                      set_bit(WDT_OK_TO_CLOSE, &wdt_status);
 -                      }
 -              }
 -              orion_wdt_ping();
 -      }
 -      return len;
 -}
 -
 -static int orion_wdt_settimeout(int new_time)
 -{
 -      if ((new_time <= 0) || (new_time > wdt_max_duration))
 -              return -EINVAL;
 -
 -      /* Set new watchdog time to be used when
 -       * orion_wdt_enable() or orion_wdt_ping() is called. */
 -      heartbeat = new_time;
 +      wdt_dev->timeout = timeout;
        return 0;
  }
  
 -static const struct watchdog_info ident = {
 -      .options        = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT |
 -                        WDIOF_KEEPALIVEPING,
 -      .identity       = "Orion Watchdog",
 +static const struct watchdog_info orion_wdt_info = {
 +      .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
 +      .identity = "Orion Watchdog",
  };
  
 -static long orion_wdt_ioctl(struct file *file, unsigned int cmd,
 -                              unsigned long arg)
 -{
 -      int ret = -ENOTTY;
 -      int time;
 -
 -      switch (cmd) {
 -      case WDIOC_GETSUPPORT:
 -              ret = copy_to_user((struct watchdog_info *)arg, &ident,
 -                                 sizeof(ident)) ? -EFAULT : 0;
 -              break;
 -
 -      case WDIOC_GETSTATUS:
 -      case WDIOC_GETBOOTSTATUS:
 -              ret = put_user(0, (int *)arg);
 -              break;
 -
 -      case WDIOC_KEEPALIVE:
 -              orion_wdt_ping();
 -              ret = 0;
 -              break;
 -
 -      case WDIOC_SETTIMEOUT:
 -              ret = get_user(time, (int *)arg);
 -              if (ret)
 -                      break;
 -
 -              if (orion_wdt_settimeout(time)) {
 -                      ret = -EINVAL;
 -                      break;
 -              }
 -              orion_wdt_ping();
 -              /* Fall through */
 -
 -      case WDIOC_GETTIMEOUT:
 -              ret = put_user(heartbeat, (int *)arg);
 -              break;
 -
 -      case WDIOC_GETTIMELEFT:
 -              if (orion_wdt_get_timeleft(&time)) {
 -                      ret = -EINVAL;
 -                      break;
 -              }
 -              ret = put_user(time, (int *)arg);
 -              break;
 -      }
 -      return ret;
 -}
 -
 -static int orion_wdt_release(struct inode *inode, struct file *file)
 -{
 -      if (test_bit(WDT_OK_TO_CLOSE, &wdt_status))
 -              orion_wdt_disable();
 -      else
 -              pr_crit("Device closed unexpectedly - timer will not stop\n");
 -      clear_bit(WDT_IN_USE, &wdt_status);
 -      clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
 -
 -      return 0;
 -}
 -
 -
 -static const struct file_operations orion_wdt_fops = {
 -      .owner          = THIS_MODULE,
 -      .llseek         = no_llseek,
 -      .write          = orion_wdt_write,
 -      .unlocked_ioctl = orion_wdt_ioctl,
 -      .open           = orion_wdt_open,
 -      .release        = orion_wdt_release,
 +static const struct watchdog_ops orion_wdt_ops = {
 +      .owner = THIS_MODULE,
 +      .start = orion_wdt_start,
 +      .stop = orion_wdt_stop,
 +      .ping = orion_wdt_ping,
 +      .set_timeout = orion_wdt_set_timeout,
 +      .get_timeleft = orion_wdt_get_timeleft,
  };
  
 -static struct miscdevice orion_wdt_miscdev = {
 -      .minor          = WATCHDOG_MINOR,
 -      .name           = "watchdog",
 -      .fops           = &orion_wdt_fops,
 +static struct watchdog_device orion_wdt = {
 +      .info = &orion_wdt_info,
 +      .ops = &orion_wdt_ops,
  };
  
  static int __devinit orion_wdt_probe(struct platform_device *pdev)
        struct resource *res;
        int ret;
  
 -      clk = clk_get(&pdev->dev, NULL);
 +      clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(clk)) {
 -              printk(KERN_ERR "Orion Watchdog missing clock\n");
 +              dev_err(&pdev->dev, "Orion Watchdog missing clock\n");
                return -ENODEV;
        }
        clk_prepare_enable(clk);
        wdt_tclk = clk_get_rate(clk);
  
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 -
 -      wdt_reg = ioremap(res->start, resource_size(res));
 -
 -      if (orion_wdt_miscdev.parent)
 -              return -EBUSY;
 -      orion_wdt_miscdev.parent = &pdev->dev;
 +      wdt_reg = devm_ioremap(&pdev->dev, res->start, resource_size(res));
 +      if (!wdt_reg)
 +              return -ENOMEM;
  
        wdt_max_duration = WDT_MAX_CYCLE_COUNT / wdt_tclk;
 -      if (orion_wdt_settimeout(heartbeat))
 +
 +      if ((heartbeat < 1) || (heartbeat > wdt_max_duration))
                heartbeat = wdt_max_duration;
  
 -      ret = misc_register(&orion_wdt_miscdev);
 -      if (ret)
 +      orion_wdt.timeout = heartbeat;
 +      orion_wdt.min_timeout = 1;
 +      orion_wdt.max_timeout = wdt_max_duration;
 +
 +      watchdog_set_nowayout(&orion_wdt, nowayout);
 +      ret = watchdog_register_device(&orion_wdt);
 +      if (ret) {
 +              clk_disable_unprepare(clk);
                return ret;
 +      }
  
        pr_info("Initial timeout %d sec%s\n",
                heartbeat, nowayout ? ", nowayout" : "");
  
  static int __devexit orion_wdt_remove(struct platform_device *pdev)
  {
 -      int ret;
 -
 -      if (test_bit(WDT_IN_USE, &wdt_status)) {
 -              orion_wdt_disable();
 -              clear_bit(WDT_IN_USE, &wdt_status);
 -      }
 -
 -      ret = misc_deregister(&orion_wdt_miscdev);
 -      if (!ret)
 -              orion_wdt_miscdev.parent = NULL;
 -
 +      watchdog_unregister_device(&orion_wdt);
        clk_disable_unprepare(clk);
 -      clk_put(clk);
 -
 -      return ret;
 +      return 0;
  }
  
  static void orion_wdt_shutdown(struct platform_device *pdev)
  {
 -      if (test_bit(WDT_IN_USE, &wdt_status))
 -              orion_wdt_disable();
 +      orion_wdt_stop(&orion_wdt);
  }
  
+ static const struct of_device_id orion_wdt_of_match_table[] __devinitdata = {
+       { .compatible = "marvell,orion-wdt", },
+       {},
+ };
+ MODULE_DEVICE_TABLE(of, orion_wdt_of_match_table);
  static struct platform_driver orion_wdt_driver = {
        .probe          = orion_wdt_probe,
        .remove         = __devexit_p(orion_wdt_remove),
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "orion_wdt",
+               .of_match_table = of_match_ptr(orion_wdt_of_match_table),
        },
  };