Merge branch 'integration-2.6.39-for-tony' of git://git.pwsan.com/linux-integration...
authorTony Lindgren <tony@atomide.com>
Fri, 11 Mar 2011 17:20:03 +0000 (09:20 -0800)
committerTony Lindgren <tony@atomide.com>
Fri, 11 Mar 2011 17:20:03 +0000 (09:20 -0800)
Conflicts:
arch/arm/mach-omap2/pm34xx.c

1  2 
MAINTAINERS
arch/arm/mach-omap2/cpuidle34xx.c
arch/arm/mach-omap2/omap_twl.c
arch/arm/mach-omap2/opp3xxx_data.c
arch/arm/mach-omap2/opp4xxx_data.c
arch/arm/mach-omap2/pm.c
arch/arm/mach-omap2/pm24xx.c
arch/arm/mach-omap2/pm34xx.c
arch/arm/mach-omap2/smartreflex.c

diff --combined MAINTAINERS
index 939e852ef74d396f0bb94b709a92058bcd3ae755,04ed9565ad85387f22d32a6fcfa29a14e71d8aab..44fb12177980da0b41105aa73ce2de62f6003784
@@@ -1010,15 -1010,6 +1010,15 @@@ L:    linux-samsung-soc@vger.kernel.org (m
  S:    Maintained
  F:    arch/arm/mach-s5p*/
  
 +ARM/SAMSUNG MOBILE MACHINE SUPPORT
 +M:    Kyungmin Park <kyungmin.park@samsung.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    arch/arm/mach-s5pv210/mach-aquila.c
 +F:    arch/arm/mach-s5pv210/mach-goni.c
 +F:    arch/arm/mach-exynos4/mach-universal_c210.c
 +F:    arch/arm/mach-exynos4/mach-nuri.c
 +
  ARM/SAMSUNG S5P SERIES FIMC SUPPORT
  M:    Kyungmin Park <kyungmin.park@samsung.com>
  M:    Sylwester Nawrocki <s.nawrocki@samsung.com>
@@@ -1476,7 -1467,6 +1476,7 @@@ F:      include/net/bluetooth
  
  BONDING DRIVER
  M:    Jay Vosburgh <fubar@us.ibm.com>
 +M:    Andy Gospodarek <andy@greyhouse.net>
  L:    netdev@vger.kernel.org
  W:    http://sourceforge.net/projects/bonding/
  S:    Supported
@@@ -2043,7 -2033,7 +2043,7 @@@ F:      Documentation/scsi/dc395x.tx
  F:    drivers/scsi/dc395x.*
  
  DCCP PROTOCOL
 -M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 +M:    Gerrit Renker <gerrit@erg.abdn.ac.uk>
  L:    dccp@vger.kernel.org
  W:    http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp
  S:    Maintained
@@@ -3529,7 -3519,7 +3529,7 @@@ F:      drivers/hwmon/jc42.
  F:    Documentation/hwmon/jc42
  
  JFS FILESYSTEM
 -M:    Dave Kleikamp <shaggy@linux.vnet.ibm.com>
 +M:    Dave Kleikamp <shaggy@kernel.org>
  L:    jfs-discussion@lists.sourceforge.net
  W:    http://jfs.sourceforge.net/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git
@@@ -4501,11 -4491,21 +4501,21 @@@ S:   Maintaine
  F:    arch/arm/*omap*/*clock*
  
  OMAP POWER MANAGEMENT SUPPORT
 -M:    Kevin Hilman <khilman@deeprootsystems.com>
 +M:    Kevin Hilman <khilman@ti.com>
  L:    linux-omap@vger.kernel.org
  S:    Maintained
  F:    arch/arm/*omap*/*pm*
  
+ OMAP POWERDOMAIN/CLOCKDOMAIN SOC ADAPTATION LAYER SUPPORT
+ M:    Rajendra Nayak <rnayak@ti.com>
+ M:    Paul Walmsley <paul@pwsan.com>
+ L:    linux-omap@vger.kernel.org
+ S:    Maintained
+ F:    arch/arm/mach-omap2/powerdomain2xxx_3xxx.c
+ F:    arch/arm/mach-omap2/powerdomain44xx.c
+ F:    arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
+ F:    arch/arm/mach-omap2/clockdomain44xx.c
  OMAP AUDIO SUPPORT
  M:    Jarkko Nikula <jhnikula@gmail.com>
  L:    alsa-devel@alsa-project.org (subscribers-only)
@@@ -5181,7 -5181,6 +5191,7 @@@ F:      drivers/char/random.
  
  RAPIDIO SUBSYSTEM
  M:    Matt Porter <mporter@kernel.crashing.org>
 +M:    Alexandre Bounine <alexandre.bounine@idt.com>
  S:    Maintained
  F:    drivers/rapidio/
  
index cba437dd002bb64ad779cc616dd89ebd8d176c60,7cc80715ef12106b3af1e237533c0582a955d472..a44c52303405c26113373fce426e765185fb2f44
@@@ -58,7 -58,6 +58,7 @@@ struct omap3_processor_cx 
        u32 core_state;
        u32 threshold;
        u32 flags;
 +      const char *desc;
  };
  
  struct omap3_processor_cx omap3_power_states[OMAP3_MAX_STATES];
@@@ -100,14 -99,14 +100,14 @@@ static int omap3_idle_bm_check(void
  static int _cpuidle_allow_idle(struct powerdomain *pwrdm,
                                struct clockdomain *clkdm)
  {
-       omap2_clkdm_allow_idle(clkdm);
+       clkdm_allow_idle(clkdm);
        return 0;
  }
  
  static int _cpuidle_deny_idle(struct powerdomain *pwrdm,
                                struct clockdomain *clkdm)
  {
-       omap2_clkdm_deny_idle(clkdm);
+       clkdm_deny_idle(clkdm);
        return 0;
  }
  
@@@ -366,7 -365,6 +366,7 @@@ void omap_init_power_states(void
        omap3_power_states[OMAP3_STATE_C1].mpu_state = PWRDM_POWER_ON;
        omap3_power_states[OMAP3_STATE_C1].core_state = PWRDM_POWER_ON;
        omap3_power_states[OMAP3_STATE_C1].flags = CPUIDLE_FLAG_TIME_VALID;
 +      omap3_power_states[OMAP3_STATE_C1].desc = "MPU ON + CORE ON";
  
        /* C2 . MPU WFI + Core inactive */
        omap3_power_states[OMAP3_STATE_C2].valid =
        omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON;
        omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID |
                                CPUIDLE_FLAG_CHECK_BM;
 +      omap3_power_states[OMAP3_STATE_C2].desc = "MPU ON + CORE ON";
  
        /* C3 . MPU CSWR + Core inactive */
        omap3_power_states[OMAP3_STATE_C3].valid =
        omap3_power_states[OMAP3_STATE_C3].core_state = PWRDM_POWER_ON;
        omap3_power_states[OMAP3_STATE_C3].flags = CPUIDLE_FLAG_TIME_VALID |
                                CPUIDLE_FLAG_CHECK_BM;
 +      omap3_power_states[OMAP3_STATE_C3].desc = "MPU RET + CORE ON";
  
        /* C4 . MPU OFF + Core inactive */
        omap3_power_states[OMAP3_STATE_C4].valid =
        omap3_power_states[OMAP3_STATE_C4].core_state = PWRDM_POWER_ON;
        omap3_power_states[OMAP3_STATE_C4].flags = CPUIDLE_FLAG_TIME_VALID |
                                CPUIDLE_FLAG_CHECK_BM;
 +      omap3_power_states[OMAP3_STATE_C4].desc = "MPU OFF + CORE ON";
  
        /* C5 . MPU CSWR + Core CSWR*/
        omap3_power_states[OMAP3_STATE_C5].valid =
        omap3_power_states[OMAP3_STATE_C5].core_state = PWRDM_POWER_RET;
        omap3_power_states[OMAP3_STATE_C5].flags = CPUIDLE_FLAG_TIME_VALID |
                                CPUIDLE_FLAG_CHECK_BM;
 +      omap3_power_states[OMAP3_STATE_C5].desc = "MPU RET + CORE RET";
  
        /* C6 . MPU OFF + Core CSWR */
        omap3_power_states[OMAP3_STATE_C6].valid =
        omap3_power_states[OMAP3_STATE_C6].core_state = PWRDM_POWER_RET;
        omap3_power_states[OMAP3_STATE_C6].flags = CPUIDLE_FLAG_TIME_VALID |
                                CPUIDLE_FLAG_CHECK_BM;
 +      omap3_power_states[OMAP3_STATE_C6].desc = "MPU OFF + CORE RET";
  
        /* C7 . MPU OFF + Core OFF */
        omap3_power_states[OMAP3_STATE_C7].valid =
        omap3_power_states[OMAP3_STATE_C7].core_state = PWRDM_POWER_OFF;
        omap3_power_states[OMAP3_STATE_C7].flags = CPUIDLE_FLAG_TIME_VALID |
                                CPUIDLE_FLAG_CHECK_BM;
 +      omap3_power_states[OMAP3_STATE_C7].desc = "MPU OFF + CORE OFF";
  
        /*
         * Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot
        if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) {
                omap3_power_states[OMAP3_STATE_C7].valid = 0;
                cpuidle_params_table[OMAP3_STATE_C7].valid = 0;
 -              WARN_ONCE(1, "%s: core off state C7 disabled due to i583\n",
 +              pr_warn("%s: core off state C7 disabled due to i583\n",
                                __func__);
        }
  }
@@@ -520,7 -512,6 +520,7 @@@ int __init omap3_idle_init(void
                if (cx->type == OMAP3_STATE_C1)
                        dev->safe_state = state;
                sprintf(state->name, "C%d", count+1);
 +              strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN);
                count++;
        }
  
index b341c36a93f3cf242926157041fd054173a76196,ad8c18a45ce15e94ad983fb7eaf982fe037b8659..0a8e74e3e811a99a59b0876ce2cae26e42df5ac3
@@@ -18,7 -18,7 +18,7 @@@
  #include <linux/kernel.h>
  #include <linux/i2c/twl.h>
  
- #include <plat/voltage.h>
+ #include "voltage.h"
  
  #include "pm.h"
  
  
  static bool is_offset_valid;
  static u8 smps_offset;
 +/*
 + * Flag to ensure Smartreflex bit in TWL
 + * being cleared in board file is not overwritten.
 + */
 +static bool __initdata twl_sr_enable_autoinit;
  
 +#define TWL4030_DCDC_GLOBAL_CFG        0x06
  #define REG_SMPS_OFFSET         0xE0
 +#define SMARTREFLEX_ENABLE     BIT(3)
  
  static unsigned long twl4030_vsel_to_uv(const u8 vsel)
  {
@@@ -276,18 -269,6 +276,18 @@@ int __init omap3_twl_init(void
                omap3_core_volt_info.vp_vddmax = OMAP3630_VP2_VLIMITTO_VDDMAX;
        }
  
 +      /*
 +       * The smartreflex bit on twl4030 specifies if the setting of voltage
 +       * is done over the I2C_SR path. Since this setting is independent of
 +       * the actual usage of smartreflex AVS module, we enable TWL SR bit
 +       * by default irrespective of whether smartreflex AVS module is enabled
 +       * on the OMAP side or not. This is because without this bit enabled,
 +       * the voltage scaling through vp forceupdate/bypass mechanism of
 +       * voltage scaling will not function on TWL over I2C_SR.
 +       */
 +      if (!twl_sr_enable_autoinit)
 +              omap3_twl_set_sr_bit(true);
 +
        voltdm = omap_voltage_domain_lookup("mpu");
        omap_voltage_register_pmic(voltdm, &omap3_mpu_volt_info);
  
  
        return 0;
  }
 +
 +/**
 + * omap3_twl_set_sr_bit() - Set/Clear SR bit on TWL
 + * @enable: enable SR mode in twl or not
 + *
 + * If 'enable' is true, enables Smartreflex bit on TWL 4030 to make sure
 + * voltage scaling through OMAP SR works. Else, the smartreflex bit
 + * on twl4030 is cleared as there are platforms which use OMAP3 and T2 but
 + * use Synchronized Scaling Hardware Strategy (ENABLE_VMODE=1) and Direct
 + * Strategy Software Scaling Mode (ENABLE_VMODE=0), for setting the voltages,
 + * in those scenarios this bit is to be cleared (enable = false).
 + *
 + * Returns 0 on sucess, error is returned if I2C read/write fails.
 + */
 +int __init omap3_twl_set_sr_bit(bool enable)
 +{
 +      u8 temp;
 +      int ret;
 +      if (twl_sr_enable_autoinit)
 +              pr_warning("%s: unexpected multiple calls\n", __func__);
 +
 +      ret = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &temp,
 +                                      TWL4030_DCDC_GLOBAL_CFG);
 +      if (ret)
 +              goto err;
 +
 +      if (enable)
 +              temp |= SMARTREFLEX_ENABLE;
 +      else
 +              temp &= ~SMARTREFLEX_ENABLE;
 +
 +      ret = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, temp,
 +                              TWL4030_DCDC_GLOBAL_CFG);
 +      if (!ret) {
 +              twl_sr_enable_autoinit = true;
 +              return 0;
 +      }
 +err:
 +      pr_err("%s: Error access to TWL4030 (%d)\n", __func__, ret);
 +      return ret;
 +}
index fd3a1af8d51e1af432b6fc76251257c11ac916e3,3bba9204a174d067b91ecebd3cb5af160e490cc8..d2bd1bd83bf0cea4331f9b5029a18d36d4a81107
@@@ -4,8 -4,9 +4,9 @@@
   * Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/
   *    Nishanth Menon
   *    Kevin Hilman
-  * Copyright (C) 2010 Nokia Corporation.
+  * Copyright (C) 2010-2011 Nokia Corporation.
   *      Eduardo Valentin
+  *      Paul Walmsley
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
  
  #include <plat/cpu.h>
  
+ #include "control.h"
  #include "omap_opp_data.h"
 +#include "pm.h"
  
+ /* 34xx */
+ /* VDD1 */
+ #define OMAP3430_VDD_MPU_OPP1_UV              975000
+ #define OMAP3430_VDD_MPU_OPP2_UV              1075000
+ #define OMAP3430_VDD_MPU_OPP3_UV              1200000
+ #define OMAP3430_VDD_MPU_OPP4_UV              1270000
+ #define OMAP3430_VDD_MPU_OPP5_UV              1350000
+ struct omap_volt_data omap34xx_vddmpu_volt_data[] = {
+       VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD1, 0xf4, 0x0c),
+       VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD1, 0xf4, 0x0c),
+       VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD1, 0xf9, 0x18),
+       VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP4_UV, OMAP343X_CONTROL_FUSE_OPP4_VDD1, 0xf9, 0x18),
+       VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP5_UV, OMAP343X_CONTROL_FUSE_OPP5_VDD1, 0xf9, 0x18),
+       VOLT_DATA_DEFINE(0, 0, 0, 0),
+ };
+ /* VDD2 */
+ #define OMAP3430_VDD_CORE_OPP1_UV             975000
+ #define OMAP3430_VDD_CORE_OPP2_UV             1050000
+ #define OMAP3430_VDD_CORE_OPP3_UV             1150000
+ struct omap_volt_data omap34xx_vddcore_volt_data[] = {
+       VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD2, 0xf4, 0x0c),
+       VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD2, 0xf4, 0x0c),
+       VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD2, 0xf9, 0x18),
+       VOLT_DATA_DEFINE(0, 0, 0, 0),
+ };
+ /* 36xx */
+ /* VDD1 */
+ #define OMAP3630_VDD_MPU_OPP50_UV             1012500
+ #define OMAP3630_VDD_MPU_OPP100_UV            1200000
+ #define OMAP3630_VDD_MPU_OPP120_UV            1325000
+ #define OMAP3630_VDD_MPU_OPP1G_UV             1375000
+ struct omap_volt_data omap36xx_vddmpu_volt_data[] = {
+       VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD1, 0xf4, 0x0c),
+       VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD1, 0xf9, 0x16),
+       VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP120_UV, OMAP3630_CONTROL_FUSE_OPP120_VDD1, 0xfa, 0x23),
+       VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP1G_UV, OMAP3630_CONTROL_FUSE_OPP1G_VDD1, 0xfa, 0x27),
+       VOLT_DATA_DEFINE(0, 0, 0, 0),
+ };
+ /* VDD2 */
+ #define OMAP3630_VDD_CORE_OPP50_UV            1000000
+ #define OMAP3630_VDD_CORE_OPP100_UV           1200000
+ struct omap_volt_data omap36xx_vddcore_volt_data[] = {
+       VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD2, 0xf4, 0x0c),
+       VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD2, 0xf9, 0x16),
+       VOLT_DATA_DEFINE(0, 0, 0, 0),
+ };
+ /* OPP data */
  static struct omap_opp_def __initdata omap34xx_opp_def_list[] = {
        /* MPU OPP1 */
        OPP_INITIALIZER("mpu", true, 125000000, 975000),
@@@ -89,7 -152,7 +153,7 @@@ static struct omap_opp_def __initdata o
  /**
   * omap3_opp_init() - initialize omap3 opp table
   */
 -static int __init omap3_opp_init(void)
 +int __init omap3_opp_init(void)
  {
        int r = -ENODEV;
  
index f0e9939a72175fc0d3cc5ffd5f809e551d254ea5,fdee8d4186ab3e12b2b844500c1c82c7587ffe56..5030794d73ff1a00ed94e07a40bd7f5b7093cbf7
@@@ -5,8 -5,9 +5,9 @@@
   *    Nishanth Menon
   *    Kevin Hilman
   *    Thara Gopinath
-  * Copyright (C) 2010 Nokia Corporation.
+  * Copyright (C) 2010-2011 Nokia Corporation.
   *      Eduardo Valentin
+  *      Paul Walmsley
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
  
  #include <plat/cpu.h>
  
+ #include "control.h"
  #include "omap_opp_data.h"
 +#include "pm.h"
  
+ /*
+  * Structures containing OMAP4430 voltage supported and various
+  * voltage dependent data for each VDD.
+  */
+ #define OMAP4430_VDD_MPU_OPP50_UV             930000
+ #define OMAP4430_VDD_MPU_OPP100_UV            1100000
+ #define OMAP4430_VDD_MPU_OPPTURBO_UV          1260000
+ #define OMAP4430_VDD_MPU_OPPNITRO_UV          1350000
+ struct omap_volt_data omap44xx_vdd_mpu_volt_data[] = {
+       VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP50_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c),
+       VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP100_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP100, 0xf9, 0x16),
+       VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO, 0xfa, 0x23),
+       VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPNITRO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO, 0xfa, 0x27),
+       VOLT_DATA_DEFINE(0, 0, 0, 0),
+ };
+ #define OMAP4430_VDD_IVA_OPP50_UV             930000
+ #define OMAP4430_VDD_IVA_OPP100_UV            1100000
+ #define OMAP4430_VDD_IVA_OPPTURBO_UV          1260000
+ struct omap_volt_data omap44xx_vdd_iva_volt_data[] = {
+       VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP50_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c),
+       VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP100_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP100, 0xf9, 0x16),
+       VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO, 0xfa, 0x23),
+       VOLT_DATA_DEFINE(0, 0, 0, 0),
+ };
+ #define OMAP4430_VDD_CORE_OPP50_UV            930000
+ #define OMAP4430_VDD_CORE_OPP100_UV           1100000
+ struct omap_volt_data omap44xx_vdd_core_volt_data[] = {
+       VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP50_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP50, 0xf4, 0x0c),
+       VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP100_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP100, 0xf9, 0x16),
+       VOLT_DATA_DEFINE(0, 0, 0, 0),
+ };
  static struct omap_opp_def __initdata omap44xx_opp_def_list[] = {
        /* MPU OPP1 - OPP50 */
        OPP_INITIALIZER("mpu", true, 300000000, 1100000),
@@@ -43,7 -83,7 +84,7 @@@
  /**
   * omap4_opp_init() - initialize omap4 opp table
   */
 -static int __init omap4_opp_init(void)
 +int __init omap4_opp_init(void)
  {
        int r = -ENODEV;
  
diff --combined arch/arm/mach-omap2/pm.c
index 6e4eb7ff95a8e5e3ae6ec348d071a37955fb1cba,2c3a2531e67888e48cdb77340c1e2ca8d774a55e..30af3351c2d68d4f42df644696dbe478cb2dc8f1
@@@ -18,8 -18,8 +18,8 @@@
  #include <plat/omap-pm.h>
  #include <plat/omap_device.h>
  #include <plat/common.h>
- #include <plat/voltage.h>
  
+ #include "voltage.h"
  #include "powerdomain.h"
  #include "clockdomain.h"
  #include "pm.h"
@@@ -83,9 -83,7 +83,9 @@@ static int _init_omap_device(char *name
  static void omap2_init_processor_devices(void)
  {
        _init_omap_device("mpu", &mpu_dev);
 -      _init_omap_device("iva", &iva_dev);
 +      if (omap3_has_iva())
 +              _init_omap_device("iva", &iva_dev);
 +
        if (cpu_is_omap44xx()) {
                _init_omap_device("l3_main_1", &l3_dev);
                _init_omap_device("dsp", &dsp_dev);
@@@ -126,7 -124,7 +126,7 @@@ int omap_set_pwrdm_state(struct powerdo
                        (pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) {
                        sleep_switch = LOWPOWERSTATE_SWITCH;
                } else {
-                       omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
+                       clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
                        pwrdm_wait_transition(pwrdm);
                        sleep_switch = FORCEWAKEUP_SWITCH;
                }
        switch (sleep_switch) {
        case FORCEWAKEUP_SWITCH:
                if (pwrdm->pwrdm_clkdms[0]->flags & CLKDM_CAN_ENABLE_AUTO)
-                       omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
+                       clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
                else
-                       omap2_clkdm_sleep(pwrdm->pwrdm_clkdms[0]);
+                       clkdm_sleep(pwrdm->pwrdm_clkdms[0]);
                break;
        case LOWPOWERSTATE_SWITCH:
                pwrdm_set_lowpwrstchange(pwrdm);
index 10f8747ba572cd0b269bd6eb10caf425b7c9eecb,96907da1910aada1914cf89fdcf29f0fea5d0415..df3ded6fe194cf4afee80382064e62a04a01dd38
@@@ -363,11 -363,14 +363,11 @@@ static const struct platform_suspend_op
  /* XXX This function should be shareable between OMAP2xxx and OMAP3 */
  static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
  {
 -      clkdm_clear_all_wkdeps(clkdm);
 -      clkdm_clear_all_sleepdeps(clkdm);
 -
        if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
-               omap2_clkdm_allow_idle(clkdm);
+               clkdm_allow_idle(clkdm);
        else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
                 atomic_read(&clkdm->usecount) == 0)
-               omap2_clkdm_sleep(clkdm);
+               clkdm_sleep(clkdm);
        return 0;
  }
  
@@@ -376,7 -379,10 +376,10 @@@ static void __init prcm_setup_regs(void
        int i, num_mem_banks;
        struct powerdomain *pwrdm;
  
-       /* Enable autoidle */
+       /*
+        * Enable autoidle
+        * XXX This should be handled by hwmod code or PRCM init code
+        */
        omap2_prm_write_mod_reg(OMAP24XX_AUTOIDLE_MASK, OCP_MOD,
                          OMAP2_PRCM_SYSCONFIG_OFFSET);
  
  
        pwrdm = clkdm_get_pwrdm(dsp_clkdm);
        pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF);
-       omap2_clkdm_sleep(dsp_clkdm);
+       clkdm_sleep(dsp_clkdm);
  
        pwrdm = clkdm_get_pwrdm(gfx_clkdm);
        pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF);
-       omap2_clkdm_sleep(gfx_clkdm);
+       clkdm_sleep(gfx_clkdm);
  
 -      /*
 -       * Clear clockdomain wakeup dependencies and enable
 -       * hardware-supervised idle for all clkdms
 -       */
 +      /* Enable hardware-supervised idle for all clkdms */
        clkdm_for_each(clkdms_setup, NULL);
        clkdm_add_wkdep(mpu_clkdm, wkup_clkdm);
  
-       /* Enable clock autoidle for all domains */
-       omap2_cm_write_mod_reg(OMAP24XX_AUTO_CAM_MASK |
-                              OMAP24XX_AUTO_MAILBOXES_MASK |
-                              OMAP24XX_AUTO_WDT4_MASK |
-                              OMAP2420_AUTO_WDT3_MASK |
-                              OMAP24XX_AUTO_MSPRO_MASK |
-                              OMAP2420_AUTO_MMC_MASK |
-                              OMAP24XX_AUTO_FAC_MASK |
-                              OMAP2420_AUTO_EAC_MASK |
-                              OMAP24XX_AUTO_HDQ_MASK |
-                              OMAP24XX_AUTO_UART2_MASK |
-                              OMAP24XX_AUTO_UART1_MASK |
-                              OMAP24XX_AUTO_I2C2_MASK |
-                              OMAP24XX_AUTO_I2C1_MASK |
-                              OMAP24XX_AUTO_MCSPI2_MASK |
-                              OMAP24XX_AUTO_MCSPI1_MASK |
-                              OMAP24XX_AUTO_MCBSP2_MASK |
-                              OMAP24XX_AUTO_MCBSP1_MASK |
-                              OMAP24XX_AUTO_GPT12_MASK |
-                              OMAP24XX_AUTO_GPT11_MASK |
-                              OMAP24XX_AUTO_GPT10_MASK |
-                              OMAP24XX_AUTO_GPT9_MASK |
-                              OMAP24XX_AUTO_GPT8_MASK |
-                              OMAP24XX_AUTO_GPT7_MASK |
-                              OMAP24XX_AUTO_GPT6_MASK |
-                              OMAP24XX_AUTO_GPT5_MASK |
-                              OMAP24XX_AUTO_GPT4_MASK |
-                              OMAP24XX_AUTO_GPT3_MASK |
-                              OMAP24XX_AUTO_GPT2_MASK |
-                              OMAP2420_AUTO_VLYNQ_MASK |
-                              OMAP24XX_AUTO_DSS_MASK,
-                              CORE_MOD, CM_AUTOIDLE1);
-       omap2_cm_write_mod_reg(OMAP24XX_AUTO_UART3_MASK |
-                              OMAP24XX_AUTO_SSI_MASK |
-                              OMAP24XX_AUTO_USB_MASK,
-                              CORE_MOD, CM_AUTOIDLE2);
-       omap2_cm_write_mod_reg(OMAP24XX_AUTO_SDRC_MASK |
-                              OMAP24XX_AUTO_GPMC_MASK |
-                              OMAP24XX_AUTO_SDMA_MASK,
-                              CORE_MOD, CM_AUTOIDLE3);
-       omap2_cm_write_mod_reg(OMAP24XX_AUTO_PKA_MASK |
-                              OMAP24XX_AUTO_AES_MASK |
-                              OMAP24XX_AUTO_RNG_MASK |
-                              OMAP24XX_AUTO_SHA_MASK |
-                              OMAP24XX_AUTO_DES_MASK,
-                              CORE_MOD, OMAP24XX_CM_AUTOIDLE4);
-       omap2_cm_write_mod_reg(OMAP2420_AUTO_DSP_IPI_MASK, OMAP24XX_DSP_MOD,
-                              CM_AUTOIDLE);
-       /* Put DPLL and both APLLs into autoidle mode */
-       omap2_cm_write_mod_reg((0x03 << OMAP24XX_AUTO_DPLL_SHIFT) |
-                              (0x03 << OMAP24XX_AUTO_96M_SHIFT) |
-                              (0x03 << OMAP24XX_AUTO_54M_SHIFT),
-                              PLL_MOD, CM_AUTOIDLE);
-       omap2_cm_write_mod_reg(OMAP24XX_AUTO_OMAPCTRL_MASK |
-                              OMAP24XX_AUTO_WDT1_MASK |
-                              OMAP24XX_AUTO_MPU_WDT_MASK |
-                              OMAP24XX_AUTO_GPIOS_MASK |
-                              OMAP24XX_AUTO_32KSYNC_MASK |
-                              OMAP24XX_AUTO_GPT1_MASK,
-                              WKUP_MOD, CM_AUTOIDLE);
        /* REVISIT: Configure number of 32 kHz clock cycles for sys_clk
         * stabilisation */
        omap2_prm_write_mod_reg(15 << OMAP_SETUP_TIME_SHIFT, OMAP24XX_GR_MOD,
index 1883a464aace467f34c08cc08c61724416916ebc,3d6a00e07a5bca36e8dedc8c4c868b83bdc61cc8..b5361a1260fcb67ed4cdfd594786c6a5c18c0fd1
@@@ -311,6 -311,11 +311,6 @@@ static irqreturn_t prcm_interrupt_handl
        return IRQ_HANDLED;
  }
  
 -static void restore_control_register(u32 val)
 -{
 -      __asm__ __volatile__ ("mcr p15, 0, %0, c1, c0, 0" : : "r" (val));
 -}
 -
  /* Function to restore the table entry that was modified for enabling MMU */
  static void restore_table_entry(void)
  {
        control_reg_value = __raw_readl(scratchpad_address
                                        + OMAP343X_CONTROL_REG_VALUE_OFFSET);
        /* This will enable caches and prediction */
 -      restore_control_register(control_reg_value);
 +      set_cr(control_reg_value);
  }
  
  void omap_sram_idle(void)
@@@ -491,7 -496,7 +491,7 @@@ console_still_active
  
        pwrdm_post_transition();
  
-       omap2_clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]);
+       clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]);
  }
  
  int omap3_can_sleep(void)
@@@ -683,133 -688,28 +683,14 @@@ static void __init omap3_d2d_idle(void
  
  static void __init prcm_setup_regs(void)
  {
-       u32 omap3630_auto_uart4_mask = cpu_is_omap3630() ?
-                                       OMAP3630_AUTO_UART4_MASK : 0;
        u32 omap3630_en_uart4_mask = cpu_is_omap3630() ?
                                        OMAP3630_EN_UART4_MASK : 0;
        u32 omap3630_grpsel_uart4_mask = cpu_is_omap3630() ?
                                        OMAP3630_GRPSEL_UART4_MASK : 0;
  
-       /*
-        * Enable interface clock autoidle for all modules.
-        * Note that in the long run this should be done by clockfw
-        */
-       omap2_cm_write_mod_reg(
-               OMAP3430_AUTO_MODEM_MASK |
-               OMAP3430ES2_AUTO_MMC3_MASK |
-               OMAP3430ES2_AUTO_ICR_MASK |
-               OMAP3430_AUTO_AES2_MASK |
-               OMAP3430_AUTO_SHA12_MASK |
-               OMAP3430_AUTO_DES2_MASK |
-               OMAP3430_AUTO_MMC2_MASK |
-               OMAP3430_AUTO_MMC1_MASK |
-               OMAP3430_AUTO_MSPRO_MASK |
-               OMAP3430_AUTO_HDQ_MASK |
-               OMAP3430_AUTO_MCSPI4_MASK |
-               OMAP3430_AUTO_MCSPI3_MASK |
-               OMAP3430_AUTO_MCSPI2_MASK |
-               OMAP3430_AUTO_MCSPI1_MASK |
-               OMAP3430_AUTO_I2C3_MASK |
-               OMAP3430_AUTO_I2C2_MASK |
-               OMAP3430_AUTO_I2C1_MASK |
-               OMAP3430_AUTO_UART2_MASK |
-               OMAP3430_AUTO_UART1_MASK |
-               OMAP3430_AUTO_GPT11_MASK |
-               OMAP3430_AUTO_GPT10_MASK |
-               OMAP3430_AUTO_MCBSP5_MASK |
-               OMAP3430_AUTO_MCBSP1_MASK |
-               OMAP3430ES1_AUTO_FAC_MASK | /* This is es1 only */
-               OMAP3430_AUTO_MAILBOXES_MASK |
-               OMAP3430_AUTO_OMAPCTRL_MASK |
-               OMAP3430ES1_AUTO_FSHOSTUSB_MASK |
-               OMAP3430_AUTO_HSOTGUSB_MASK |
-               OMAP3430_AUTO_SAD2D_MASK |
-               OMAP3430_AUTO_SSI_MASK,
-               CORE_MOD, CM_AUTOIDLE1);
-       omap2_cm_write_mod_reg(
-               OMAP3430_AUTO_PKA_MASK |
-               OMAP3430_AUTO_AES1_MASK |
-               OMAP3430_AUTO_RNG_MASK |
-               OMAP3430_AUTO_SHA11_MASK |
-               OMAP3430_AUTO_DES1_MASK,
-               CORE_MOD, CM_AUTOIDLE2);
-       if (omap_rev() > OMAP3430_REV_ES1_0) {
-               omap2_cm_write_mod_reg(
-                       OMAP3430_AUTO_MAD2D_MASK |
-                       OMAP3430ES2_AUTO_USBTLL_MASK,
-                       CORE_MOD, CM_AUTOIDLE3);
-       }
-       omap2_cm_write_mod_reg(
-               OMAP3430_AUTO_WDT2_MASK |
-               OMAP3430_AUTO_WDT1_MASK |
-               OMAP3430_AUTO_GPIO1_MASK |
-               OMAP3430_AUTO_32KSYNC_MASK |
-               OMAP3430_AUTO_GPT12_MASK |
-               OMAP3430_AUTO_GPT1_MASK,
-               WKUP_MOD, CM_AUTOIDLE);
-       omap2_cm_write_mod_reg(
-               OMAP3430_AUTO_DSS_MASK,
-               OMAP3430_DSS_MOD,
-               CM_AUTOIDLE);
-       omap2_cm_write_mod_reg(
-               OMAP3430_AUTO_CAM_MASK,
-               OMAP3430_CAM_MOD,
-               CM_AUTOIDLE);
-       omap2_cm_write_mod_reg(
-               omap3630_auto_uart4_mask |
-               OMAP3430_AUTO_GPIO6_MASK |
-               OMAP3430_AUTO_GPIO5_MASK |
-               OMAP3430_AUTO_GPIO4_MASK |
-               OMAP3430_AUTO_GPIO3_MASK |
-               OMAP3430_AUTO_GPIO2_MASK |
-               OMAP3430_AUTO_WDT3_MASK |
-               OMAP3430_AUTO_UART3_MASK |
-               OMAP3430_AUTO_GPT9_MASK |
-               OMAP3430_AUTO_GPT8_MASK |
-               OMAP3430_AUTO_GPT7_MASK |
-               OMAP3430_AUTO_GPT6_MASK |
-               OMAP3430_AUTO_GPT5_MASK |
-               OMAP3430_AUTO_GPT4_MASK |
-               OMAP3430_AUTO_GPT3_MASK |
-               OMAP3430_AUTO_GPT2_MASK |
-               OMAP3430_AUTO_MCBSP4_MASK |
-               OMAP3430_AUTO_MCBSP3_MASK |
-               OMAP3430_AUTO_MCBSP2_MASK,
-               OMAP3430_PER_MOD,
-               CM_AUTOIDLE);
 -      /* XXX Reset all wkdeps. This should be done when initializing
 -       * powerdomains */
 -      omap2_prm_write_mod_reg(0, OMAP3430_IVA2_MOD, PM_WKDEP);
 -      omap2_prm_write_mod_reg(0, MPU_MOD, PM_WKDEP);
 -      omap2_prm_write_mod_reg(0, OMAP3430_DSS_MOD, PM_WKDEP);
 -      omap2_prm_write_mod_reg(0, OMAP3430_NEON_MOD, PM_WKDEP);
 -      omap2_prm_write_mod_reg(0, OMAP3430_CAM_MOD, PM_WKDEP);
 -      omap2_prm_write_mod_reg(0, OMAP3430_PER_MOD, PM_WKDEP);
--      if (omap_rev() > OMAP3430_REV_ES1_0) {
-               omap2_cm_write_mod_reg(
-                       OMAP3430ES2_AUTO_USBHOST_MASK,
-                       OMAP3430ES2_USBHOST_MOD,
-                       CM_AUTOIDLE);
-       }
 -              omap2_prm_write_mod_reg(0, OMAP3430ES2_SGX_MOD, PM_WKDEP);
 -              omap2_prm_write_mod_reg(0, OMAP3430ES2_USBHOST_MOD, PM_WKDEP);
 -      } else
 -              omap2_prm_write_mod_reg(0, GFX_MOD, PM_WKDEP);
--
+       /* XXX This should be handled by hwmod code or SCM init code */
        omap_ctrl_writel(OMAP3430_AUTOIDLE_MASK, OMAP2_CONTROL_SYSCONFIG);
  
-       /*
-        * Set all plls to autoidle. This is needed until autoidle is
-        * enabled by clockfw
-        */
-       omap2_cm_write_mod_reg(1 << OMAP3430_AUTO_IVA2_DPLL_SHIFT,
-                        OMAP3430_IVA2_MOD, CM_AUTOIDLE2);
-       omap2_cm_write_mod_reg(1 << OMAP3430_AUTO_MPU_DPLL_SHIFT,
-                        MPU_MOD,
-                        CM_AUTOIDLE2);
-       omap2_cm_write_mod_reg((1 << OMAP3430_AUTO_PERIPH_DPLL_SHIFT) |
-                        (1 << OMAP3430_AUTO_CORE_DPLL_SHIFT),
-                        PLL_MOD,
-                        CM_AUTOIDLE);
-       omap2_cm_write_mod_reg(1 << OMAP3430ES2_AUTO_PERIPH2_DPLL_SHIFT,
-                        PLL_MOD,
-                        CM_AUTOIDLE2);
        /*
         * Enable control of expternal oscillator through
         * sys_clkreq. In the long run clock framework should
@@@ -908,7 -808,8 +789,7 @@@ void omap3_pm_off_mode_enable(int enabl
                                pwrst->pwrdm == core_pwrdm &&
                                state == PWRDM_POWER_OFF) {
                        pwrst->next_state = PWRDM_POWER_RET;
 -                      WARN_ONCE(1,
 -                              "%s: Core OFF disabled due to errata i583\n",
 +                      pr_warn("%s: Core OFF disabled due to errata i583\n",
                                __func__);
                } else {
                        pwrst->next_state = state;
@@@ -969,10 -870,10 +850,10 @@@ static int __init pwrdms_setup(struct p
  static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
  {
        if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
-               omap2_clkdm_allow_idle(clkdm);
+               clkdm_allow_idle(clkdm);
        else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
                 atomic_read(&clkdm->usecount) == 0)
-               omap2_clkdm_sleep(clkdm);
+               clkdm_sleep(clkdm);
        return 0;
  }
  
index 0ab4dd5081eeadd07786d79efd5dae62f77d0440,cf0bf5db47dd606bc171facab80cdbb9707d9ccd..8f674c9442bfc6ea07501197a4c73546c922e4fb
@@@ -26,9 -26,9 +26,9 @@@
  #include <linux/pm_runtime.h>
  
  #include <plat/common.h>
- #include <plat/smartreflex.h>
  
  #include "pm.h"
+ #include "smartreflex.h"
  
  #define SMARTREFLEX_NAME_LEN  16
  #define NVALUE_NAME_LEN               40
@@@ -54,7 -54,6 +54,7 @@@ struct omap_sr 
        struct list_head                node;
        struct omap_sr_nvalue_table     *nvalue_table;
        struct voltagedomain            *voltdm;
 +      struct dentry                   *dbg_dir;
  };
  
  /* sr_list contains all the instances of smartreflex module */
@@@ -261,11 -260,9 +261,11 @@@ static int sr_late_init(struct omap_sr 
        if (sr_class->class_type == SR_CLASS2 &&
                sr_class->notify_flags && sr_info->irq) {
  
 -              name = kzalloc(SMARTREFLEX_NAME_LEN + 1, GFP_KERNEL);
 -              strcpy(name, "sr_");
 -              strcat(name, sr_info->voltdm->name);
 +              name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name);
 +              if (name == NULL) {
 +                      ret = -ENOMEM;
 +                      goto error;
 +              }
                ret = request_irq(sr_info->irq, sr_interrupt,
                                0, name, (void *)sr_info);
                if (ret)
@@@ -285,7 -282,6 +285,7 @@@ error
                dev_err(&sr_info->pdev->dev, "%s: ERROR in registering"
                        "interrupt handler. Smartreflex will"
                        "not function as desired\n", __func__);
 +              kfree(name);
                kfree(sr_info);
                return ret;
  }
@@@ -824,7 -820,7 +824,7 @@@ static int __init omap_sr_probe(struct 
        struct omap_sr *sr_info = kzalloc(sizeof(struct omap_sr), GFP_KERNEL);
        struct omap_sr_data *pdata = pdev->dev.platform_data;
        struct resource *mem, *irq;
 -      struct dentry *vdd_dbg_dir, *dbg_dir, *nvalue_dir;
 +      struct dentry *vdd_dbg_dir, *nvalue_dir;
        struct omap_volt_data *volt_data;
        int i, ret = 0;
  
                ret = sr_late_init(sr_info);
                if (ret) {
                        pr_warning("%s: Error in SR late init\n", __func__);
 -                      return ret;
 +                      goto err_release_region;
                }
        }
  
         * not try to create rest of the debugfs entries.
         */
        vdd_dbg_dir = omap_voltage_get_dbgdir(sr_info->voltdm);
 -      if (!vdd_dbg_dir)
 -              return -EINVAL;
 +      if (!vdd_dbg_dir) {
 +              ret = -EINVAL;
 +              goto err_release_region;
 +      }
  
 -      dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir);
 -      if (IS_ERR(dbg_dir)) {
 +      sr_info->dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir);
 +      if (IS_ERR(sr_info->dbg_dir)) {
                dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n",
                        __func__);
 -              return PTR_ERR(dbg_dir);
 +              ret = PTR_ERR(sr_info->dbg_dir);
 +              goto err_release_region;
        }
  
 -      (void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, dbg_dir,
 -                              (void *)sr_info, &pm_sr_fops);
 -      (void) debugfs_create_x32("errweight", S_IRUGO, dbg_dir,
 +      (void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR,
 +                      sr_info->dbg_dir, (void *)sr_info, &pm_sr_fops);
 +      (void) debugfs_create_x32("errweight", S_IRUGO, sr_info->dbg_dir,
                        &sr_info->err_weight);
 -      (void) debugfs_create_x32("errmaxlimit", S_IRUGO, dbg_dir,
 +      (void) debugfs_create_x32("errmaxlimit", S_IRUGO, sr_info->dbg_dir,
                        &sr_info->err_maxlimit);
 -      (void) debugfs_create_x32("errminlimit", S_IRUGO, dbg_dir,
 +      (void) debugfs_create_x32("errminlimit", S_IRUGO, sr_info->dbg_dir,
                        &sr_info->err_minlimit);
  
 -      nvalue_dir = debugfs_create_dir("nvalue", dbg_dir);
 +      nvalue_dir = debugfs_create_dir("nvalue", sr_info->dbg_dir);
        if (IS_ERR(nvalue_dir)) {
                dev_err(&pdev->dev, "%s: Unable to create debugfs directory"
                        "for n-values\n", __func__);
 -              return PTR_ERR(nvalue_dir);
 +              ret = PTR_ERR(nvalue_dir);
 +              goto err_release_region;
        }
  
        omap_voltage_get_volttable(sr_info->voltdm, &volt_data);
                        " corresponding vdd vdd_%s. Cannot create debugfs"
                        "entries for n-values\n",
                        __func__, sr_info->voltdm->name);
 -              return -ENODATA;
 +              ret = -ENODATA;
 +              goto err_release_region;
        }
  
        for (i = 0; i < sr_info->nvalue_count; i++) {
 -              char *name;
 -              char volt_name[32];
 -
 -              name = kzalloc(NVALUE_NAME_LEN + 1, GFP_KERNEL);
 -              if (!name) {
 -                      dev_err(&pdev->dev, "%s: Unable to allocate memory"
 -                              " for n-value directory name\n",  __func__);
 -                      return -ENOMEM;
 -              }
 +              char name[NVALUE_NAME_LEN + 1];
  
 -              strcpy(name, "volt_");
 -              sprintf(volt_name, "%d", volt_data[i].volt_nominal);
 -              strcat(name, volt_name);
 +              snprintf(name, sizeof(name), "volt_%d",
 +                       volt_data[i].volt_nominal);
                (void) debugfs_create_x32(name, S_IRUGO | S_IWUSR, nvalue_dir,
                                &(sr_info->nvalue_table[i].nvalue));
        }
@@@ -973,8 -973,6 +973,8 @@@ static int __devexit omap_sr_remove(str
  
        if (sr_info->autocomp_active)
                sr_stop_vddautocomp(sr_info);
 +      if (sr_info->dbg_dir)
 +              debugfs_remove_recursive(sr_info->dbg_dir);
  
        list_del(&sr_info->node);
        iounmap(sr_info->base);