Merge tag 'mfd-3.6-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 30 Jul 2012 19:41:17 +0000 (12:41 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 30 Jul 2012 19:41:17 +0000 (12:41 -0700)
Pull MFD bits from Samuel Ortiz:
 "We have support for a few new drivers:
   - Samsung s2mps11
   - Wolfson Microelectronics wm5102 and wm5110
   - Marvell 88PM800 and 88PM805
   - TI twl6041

  We also have our regular driver improvements:
   - Device tree and IRQ domain support for STE AB8500
   - Regmap and devm_* API conversion for TI tps6586x
   - Device tree support for Samsung max77686
   - devm_* API conversion for STE AB3100

  Besides that, quite a lot of fixing and cleanup for mc13xxx, tps65910,
  tps65090, da9052 and twl-core."

Fix up mostly trivial conflicts, with the exception of
drivers/usb/host/ehci-omap.c in particular, which had some
re-organization of the reset sequence (commit 1a49e2ac9651: "EHCI:
centralize controller initialization") that clashed with commit
2761a6394516 ("mfd: USB: Fix the omap-usb EHCI ULPI PHY reset fix
issues").

In particular, commit 2761a6394516 moved the usb_add_hcd() to the
*middle* of the reset sequence, which clashes fairly badly with the
reset sequence re-organization (although it could have been done inside
the new omap_ehci_init() function).

I left that part of commit 2761a6394516 just undone.

* tag 'mfd-3.6-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6: (110 commits)
  mfd: Ensure AB8500 platform data is passed through db8500-prcmu to MFD Core
  mfd: Arizone core should select MFD_CORE
  mfd: Fix arizona-irq.c build by selecting REGMAP_IRQ
  mfd: Add debug trace on entering and leaving arizone runtime suspend
  mfd: Correct tps65090 cell names
  mfd: Remove gpio support from tps6586x core driver
  ARM: tegra: defconfig: Enable tps6586x gpio
  gpio: tps6586x: Add gpio support through platform driver
  mfd: Cache tps6586x register through regmap
  mfd: Use regmap for tps6586x register access.
  mfd: Use devm managed resources for tps6586x
  input: Add onkey support for 88PM80X PMIC
  mfd: Add support for twl6041
  mfd: Fix twl6040 revision information
  mfd: Matches should be NULL when populate anatop child devices
  input: ab8500-ponkey: Create AB8500 domain IRQ mapping
  mfd: Add missing out of memory check for pcf50633
  Documentation: Describe the AB8500 Device Tree bindings
  mfd: Add tps65910 32-kHz-crystal-input init
  mfd: Drop modifying mc13xxx driver's id_table in probe
  ...

19 files changed:
1  2 
Documentation/devicetree/bindings/mfd/tps65910.txt
MAINTAINERS
arch/arm/configs/tegra_defconfig
arch/arm/mach-exynos/mach-nuri.c
arch/arm/mach-exynos/mach-origen.c
arch/arm/mach-ux500/board-mop500.c
arch/arm/mach-ux500/cpu-db8500.c
drivers/extcon/Kconfig
drivers/gpio/Kconfig
drivers/gpio/Makefile
drivers/input/misc/ab8500-ponkey.c
drivers/mfd/Kconfig
drivers/regulator/Kconfig
drivers/regulator/ab8500.c
drivers/regulator/s5m8767.c
drivers/usb/host/ehci-omap.c
include/linux/mfd/abx500/ab8500.h
include/linux/mfd/tps65910.h
sound/soc/codecs/twl6040.c

@@@ -81,25 -55,11 +81,25 @@@ Example
  
                ti,vmbch-threshold = 0;
                ti,vmbch2-threshold = 0;
+               ti,en-ck32k-xtal;
                ti,en-gpio-sleep = <0 0 1 0 0 0 0 0 0>;
  
 +              vcc1-supply = <&reg_parent>;
 +              vcc2-supply = <&some_reg>;
 +              vcc3-supply = <...>;
 +              vcc4-supply = <...>;
 +              vcc5-supply = <...>;
 +              vcc6-supply = <...>;
 +              vcc7-supply = <...>;
 +              vccio-supply = <...>;
 +
                regulators {
 -                      vdd1_reg: vdd1 {
 +                      #address-cells = <1>;
 +                      #size-cells = <0>;
 +
 +                      vdd1_reg: regulator@0 {
 +                              regulator-compatible = "vdd1";
 +                              reg = <0>;
                                regulator-min-microvolt = < 600000>;
                                regulator-max-microvolt = <1500000>;
                                regulator-always-on;
diff --cc MAINTAINERS
Simple merge
@@@ -105,7 -106,7 +105,8 @@@ CONFIG_I2C_MUX_PINCTRL=
  CONFIG_I2C_TEGRA=y
  CONFIG_SPI=y
  CONFIG_SPI_TEGRA=y
 +CONFIG_GPIO_TPS65910=y
+ CONFIG_GPIO_TPS6586X=y
  CONFIG_POWER_SUPPLY=y
  CONFIG_BATTERY_SBS=y
  CONFIG_SENSORS_LM90=y
Simple merge
Simple merge
@@@ -208,27 -195,8 +208,9 @@@ static struct ab8500_platform_data ab85
        .regulator      = ab8500_regulators,
        .num_regulator  = ARRAY_SIZE(ab8500_regulators),
        .gpio           = &ab8500_gpio_pdata,
 +      .codec          = &ab8500_codec_pdata,
  };
  
- static struct resource ab8500_resources[] = {
-       [0] = {
-               .start  = IRQ_DB8500_AB8500,
-               .end    = IRQ_DB8500_AB8500,
-               .flags  = IORESOURCE_IRQ
-       }
- };
- struct platform_device ab8500_device = {
-       .name = "ab8500-core",
-       .id = 0,
-       .dev = {
-               .platform_data = &ab8500_platdata,
-       },
-       .num_resources = 1,
-       .resource = ab8500_resources,
- };
  /*
   * TPS61052
   */
@@@ -605,9 -603,13 +586,8 @@@ static struct platform_device *snowball
        &snowball_led_dev,
        &snowball_key_dev,
        &snowball_sbnet_dev,
-       &ab8500_device,
  };
  
 -static struct platform_device *snowball_of_platform_devs[] __initdata = {
 -      &snowball_led_dev,
 -      &snowball_key_dev,
 -};
 -
  static void __init mop500_init_machine(void)
  {
        struct device *parent = NULL;
Simple merge
@@@ -21,19 -21,9 +21,19 @@@ config EXTCON_GPI
          Say Y here to enable GPIO based extcon support. Note that GPIO
          extcon supports single state per extcon instance.
  
 +config EXTCON_MAX77693
 +      tristate "MAX77693 EXTCON Support"
 +      depends on MFD_MAX77693
 +      select IRQ_DOMAIN
 +      select REGMAP_I2C
 +      help
 +        If you say yes here you get support for the MUIC device of
 +        Maxim MAX77693 PMIC. The MAX77693 MUIC is a USB port accessory
 +        detector and switch.
 +
  config EXTCON_MAX8997
        tristate "MAX8997 EXTCON Support"
-       depends on MFD_MAX8997
+       depends on MFD_MAX8997 && IRQ_DOMAIN
        help
          If you say yes here you get support for the MUIC device of
          Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -262,17 -233,9 +262,17 @@@ config REGULATOR_RC5T58
          through regulator interface. The device supports multiple DCDC/LDO
          outputs which can be controlled by i2c communication.
  
 +config REGULATOR_S2MPS11
 +      tristate "Samsung S2MPS11 voltage regulator"
 +      depends on MFD_SEC_CORE
 +      help
 +       This driver supports a Samsung S2MPS11 voltage output regulator
 +       via I2C bus. S2MPS11 is comprised of high efficient Buck converters
 +       including Dual-Phase Buck converter, Buck-Boost converter, various LDOs.
 +
  config REGULATOR_S5M8767
        tristate "Samsung S5M8767A voltage regulator"
-       depends on MFD_S5M_CORE
+       depends on MFD_SEC_CORE
        help
         This driver supports a Samsung S5M8767A voltage output regulator
         via I2C bus. S5M8767A have 9 Bucks and 28 LDOs output and
Simple merge
@@@ -407,8 -431,14 +407,8 @@@ static int s5m8767_set_voltage_sel(stru
                if (ret)
                        return ret;
  
-               return s5m_reg_update(s5m8767->iodev, reg, selector, mask);
 -              sec_reg_read(s5m8767->iodev, reg, &val);
 -              val = (val & ~mask) | sel;
 -
 -              ret = sec_reg_write(s5m8767->iodev, reg, val);
++              return sec_reg_update(s5m8767->iodev, reg, selector, mask);
        }
 -
 -      *selector = sel;
 -      return ret;
  }
  
  static int s5m8767_set_voltage_time_sel(struct regulator_dev *rdev,
@@@ -617,70 -608,48 +617,70 @@@ static __devinit int s5m8767_pmic_probe
                }
        }
  
 -      if (pdata->buck2_gpiodvs || pdata->buck3_gpiodvs ||
 -              pdata->buck4_gpiodvs) {
 -              if (gpio_is_valid(pdata->buck_gpios[0]) &&
 -                      gpio_is_valid(pdata->buck_gpios[1]) &&
 -                      gpio_is_valid(pdata->buck_gpios[2])) {
 -                      ret = gpio_request(pdata->buck_gpios[0],
 -                                              "S5M8767 SET1");
 -                      if (ret == -EBUSY)
 -                              dev_warn(&pdev->dev, "Duplicated gpio request for SET1\n");
 -
 -                      ret = gpio_request(pdata->buck_gpios[1],
 -                                         "S5M8767 SET2");
 -                      if (ret == -EBUSY)
 -                              dev_warn(&pdev->dev, "Duplicated gpio request for SET2\n");
 -
 -                      ret = gpio_request(pdata->buck_gpios[2],
 -                                         "S5M8767 SET3");
 -                      if (ret == -EBUSY)
 -                              dev_warn(&pdev->dev, "Duplicated gpio request for SET3\n");
 -                      /* SET1 GPIO */
 -                      gpio_direction_output(pdata->buck_gpios[0],
 -                                      (s5m8767->buck_gpioindex >> 2) & 0x1);
 -                      /* SET2 GPIO */
 -                      gpio_direction_output(pdata->buck_gpios[1],
 -                                      (s5m8767->buck_gpioindex >> 1) & 0x1);
 -                      /* SET3 GPIO */
 -                      gpio_direction_output(pdata->buck_gpios[2],
 -                                      (s5m8767->buck_gpioindex >> 0) & 0x1);
 -                      ret = 0;
 -              } else {
 -                      dev_err(&pdev->dev, "GPIO NOT VALID\n");
 -                      ret = -EINVAL;
 +      if (gpio_is_valid(pdata->buck_gpios[0]) &&
 +              gpio_is_valid(pdata->buck_gpios[1]) &&
 +              gpio_is_valid(pdata->buck_gpios[2])) {
 +              ret = devm_gpio_request(&pdev->dev, pdata->buck_gpios[0],
 +                                      "S5M8767 SET1");
 +              if (ret)
                        return ret;
 -              }
 +
 +              ret = devm_gpio_request(&pdev->dev, pdata->buck_gpios[1],
 +                                      "S5M8767 SET2");
 +              if (ret)
 +                      return ret;
 +
 +              ret = devm_gpio_request(&pdev->dev, pdata->buck_gpios[2],
 +                                      "S5M8767 SET3");
 +              if (ret)
 +                      return ret;
 +
 +              /* SET1 GPIO */
 +              gpio_direction_output(pdata->buck_gpios[0],
 +                              (s5m8767->buck_gpioindex >> 2) & 0x1);
 +              /* SET2 GPIO */
 +              gpio_direction_output(pdata->buck_gpios[1],
 +                              (s5m8767->buck_gpioindex >> 1) & 0x1);
 +              /* SET3 GPIO */
 +              gpio_direction_output(pdata->buck_gpios[2],
 +                              (s5m8767->buck_gpioindex >> 0) & 0x1);
 +      } else {
 +              dev_err(&pdev->dev, "GPIO NOT VALID\n");
 +              ret = -EINVAL;
 +              return ret;
        }
  
 -      sec_reg_update(s5m8767->iodev, S5M8767_REG_BUCK2CTRL,
 -                      (pdata->buck2_gpiodvs) ? (1 << 1) : (0 << 1), 1 << 1);
 -      sec_reg_update(s5m8767->iodev, S5M8767_REG_BUCK3CTRL,
 -                      (pdata->buck3_gpiodvs) ? (1 << 1) : (0 << 1), 1 << 1);
 -      sec_reg_update(s5m8767->iodev, S5M8767_REG_BUCK4CTRL,
 -                      (pdata->buck4_gpiodvs) ? (1 << 1) : (0 << 1), 1 << 1);
 +      ret = devm_gpio_request(&pdev->dev, pdata->buck_ds[0], "S5M8767 DS2");
 +      if (ret)
 +              return ret;
 +
 +      ret = devm_gpio_request(&pdev->dev, pdata->buck_ds[1], "S5M8767 DS3");
 +      if (ret)
 +              return ret;
 +
 +      ret = devm_gpio_request(&pdev->dev, pdata->buck_ds[2], "S5M8767 DS4");
 +      if (ret)
 +              return ret;
 +
 +      /* DS2 GPIO */
 +      gpio_direction_output(pdata->buck_ds[0], 0x0);
 +      /* DS3 GPIO */
 +      gpio_direction_output(pdata->buck_ds[1], 0x0);
 +      /* DS4 GPIO */
 +      gpio_direction_output(pdata->buck_ds[2], 0x0);
 +
 +      if (pdata->buck2_gpiodvs || pdata->buck3_gpiodvs ||
 +         pdata->buck4_gpiodvs) {
-               s5m_reg_update(s5m8767->iodev, S5M8767_REG_BUCK2CTRL,
++              sec_reg_update(s5m8767->iodev, S5M8767_REG_BUCK2CTRL,
 +                              (pdata->buck2_gpiodvs) ? (1 << 1) : (0 << 1),
 +                              1 << 1);
-               s5m_reg_update(s5m8767->iodev, S5M8767_REG_BUCK3CTRL,
++              sec_reg_update(s5m8767->iodev, S5M8767_REG_BUCK3CTRL,
 +                              (pdata->buck3_gpiodvs) ? (1 << 1) : (0 << 1),
 +                              1 << 1);
-               s5m_reg_update(s5m8767->iodev, S5M8767_REG_BUCK4CTRL,
++              sec_reg_update(s5m8767->iodev, S5M8767_REG_BUCK4CTRL,
 +                              (pdata->buck4_gpiodvs) ? (1 << 1) : (0 << 1),
 +                              1 << 1);
 +      }
  
        /* Initialize GPIO DVS registers */
        for (i = 0; i < 8; i++) {
                                           s5m8767->buck4_vol[i]);
                }
        }
 -      sec_reg_update(s5m8767->iodev, S5M8767_REG_BUCK2CTRL, 0x78, 0xff);
 -      sec_reg_update(s5m8767->iodev, S5M8767_REG_BUCK3CTRL, 0x58, 0xff);
 -      sec_reg_update(s5m8767->iodev, S5M8767_REG_BUCK4CTRL, 0x78, 0xff);
  
        if (s5m8767->buck2_ramp)
-               s5m_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP, 0x08, 0x08);
+               sec_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP, 0x08, 0x08);
  
        if (s5m8767->buck3_ramp)
-               s5m_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP, 0x04, 0x04);
+               sec_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP, 0x04, 0x04);
  
        if (s5m8767->buck4_ramp)
-               s5m_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP, 0x02, 0x02);
+               sec_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP, 0x02, 0x02);
  
        if (s5m8767->buck2_ramp || s5m8767->buck3_ramp
                || s5m8767->buck4_ramp) {
                switch (s5m8767->ramp_delay) {
 -              case 15:
 +              case 5:
-                       s5m_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP,
+                       sec_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP,
 -                                      0xc0, 0xf0);
 +                                      0x40, 0xf0);
 +                      break;
 +              case 10:
-                       s5m_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP,
++                      sec_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP,
 +                                      0x90, 0xf0);
                        break;
                case 25:
-                       s5m_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP,
+                       sec_reg_update(s5m8767->iodev, S5M8767_REG_DVSRAMP,
                                        0xd0, 0xf0);
                        break;
                case 50:
@@@ -145,56 -145,6 +145,56 @@@ static void omap_ehci_soft_phy_reset(st
        }
  }
  
-                       gpio_request_one(pdata->reset_gpio_port[0],
-                                        GPIOF_OUT_INIT_LOW, "USB1 PHY reset");
 +static int omap_ehci_init(struct usb_hcd *hcd)
 +{
 +      struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
 +      int                     rc;
 +      struct ehci_hcd_omap_platform_data      *pdata;
 +
 +      pdata = hcd->self.controller->platform_data;
++
++      /* Hold PHYs in reset while initializing EHCI controller */
 +      if (pdata->phy_reset) {
 +              if (gpio_is_valid(pdata->reset_gpio_port[0]))
-                       gpio_request_one(pdata->reset_gpio_port[1],
-                                        GPIOF_OUT_INIT_LOW, "USB2 PHY reset");
++                      gpio_set_value_cansleep(pdata->reset_gpio_port[0], 0);
 +
 +              if (gpio_is_valid(pdata->reset_gpio_port[1]))
++                      gpio_set_value_cansleep(pdata->reset_gpio_port[1], 0);
 +
 +              /* Hold the PHY in RESET for enough time till DIR is high */
 +              udelay(10);
 +      }
 +
 +      /* Soft reset the PHY using PHY reset command over ULPI */
 +      if (pdata->port_mode[0] == OMAP_EHCI_PORT_MODE_PHY)
 +              omap_ehci_soft_phy_reset(hcd, 0);
 +      if (pdata->port_mode[1] == OMAP_EHCI_PORT_MODE_PHY)
 +              omap_ehci_soft_phy_reset(hcd, 1);
 +
 +      /* we know this is the memory we want, no need to ioremap again */
 +      ehci->caps = hcd->regs;
 +
 +      rc = ehci_setup(hcd);
 +
 +      if (pdata->phy_reset) {
 +              /* Hold the PHY in RESET for enough time till
 +               * PHY is settled and ready
 +               */
 +              udelay(10);
 +
 +              if (gpio_is_valid(pdata->reset_gpio_port[0]))
 +                      gpio_set_value_cansleep(pdata->reset_gpio_port[0], 1);
 +
 +              if (gpio_is_valid(pdata->reset_gpio_port[1]))
 +                      gpio_set_value_cansleep(pdata->reset_gpio_port[1], 1);
 +      }
 +
 +      /* root ports should always stay powered */
 +      ehci_port_power(ehci, 1);
 +
 +      return rc;
 +}
 +
  static int omap_ehci_hub_control(
        struct usb_hcd  *hcd,
        u16             typeReq,
Simple merge
Simple merge
Simple merge