Merge branch 'pm-fixes' into pm-domains
authorRafael J. Wysocki <rjw@sisk.pl>
Mon, 26 Sep 2011 18:12:45 +0000 (20:12 +0200)
committerRafael J. Wysocki <rjw@sisk.pl>
Mon, 26 Sep 2011 18:12:45 +0000 (20:12 +0200)
Merge commit e8b364b88cc4001b21c28c1ecf1e1e3ffbe162e6
(PM / Clocks: Do not acquire a mutex under a spinlock) fixing
a regression in drivers/base/power/clock_ops.c.

Conflicts:
drivers/base/power/clock_ops.c

1  2 
arch/arm/mach-shmobile/board-ap4evb.c
arch/arm/mach-shmobile/board-mackerel.c
arch/arm/mach-shmobile/include/mach/sh7372.h
arch/arm/mach-shmobile/setup-sh7372.c
drivers/base/power/clock_ops.c

@@@ -42,7 -42,6 +42,7 @@@
  #include <linux/leds.h>
  #include <linux/input/sh_keysc.h>
  #include <linux/usb/r8a66597.h>
 +#include <linux/pm_clock.h>
  
  #include <media/sh_mobile_ceu.h>
  #include <media/sh_mobile_csi2.h>
@@@ -1413,7 -1412,7 +1413,7 @@@ static void __init ap4evb_init(void
        fsi_init_pm_clock();
        sh7372_pm_init();
        pm_clk_add(&fsi_device.dev, "spu2");
-       pm_clk_add(&hdmi_lcdc_device.dev, "hdmi");
+       pm_clk_add(&lcdc1_device.dev, "hdmi");
  }
  
  static void __init ap4evb_timer_init(void)
@@@ -39,7 -39,7 +39,7 @@@
  #include <linux/mtd/mtd.h>
  #include <linux/mtd/partitions.h>
  #include <linux/mtd/physmap.h>
 -#include <linux/pm_runtime.h>
 +#include <linux/pm_clock.h>
  #include <linux/smsc911x.h>
  #include <linux/sh_intc.h>
  #include <linux/tca6416_keypad.h>
@@@ -641,6 -641,8 +641,8 @@@ static struct usbhs_private usbhs0_priv
                },
                .driver_param = {
                        .buswait_bwait  = 4,
+                       .d0_tx_id       = SHDMA_SLAVE_USB0_TX,
+                       .d1_rx_id       = SHDMA_SLAVE_USB0_RX,
                },
        },
  };
@@@ -810,6 -812,8 +812,8 @@@ static struct usbhs_private usbhs1_priv
                        .buswait_bwait  = 4,
                        .pipe_type      = usbhs1_pipe_cfg,
                        .pipe_size      = ARRAY_SIZE(usbhs1_pipe_cfg),
+                       .d0_tx_id       = SHDMA_SLAVE_USB1_TX,
+                       .d1_rx_id       = SHDMA_SLAVE_USB1_RX,
                },
        },
  };
@@@ -459,6 -459,10 +459,10 @@@ enum 
        SHDMA_SLAVE_SDHI2_TX,
        SHDMA_SLAVE_MMCIF_RX,
        SHDMA_SLAVE_MMCIF_TX,
+       SHDMA_SLAVE_USB0_TX,
+       SHDMA_SLAVE_USB0_RX,
+       SHDMA_SLAVE_USB1_TX,
+       SHDMA_SLAVE_USB1_RX,
  };
  
  extern struct clk sh7372_extal1_clk;
@@@ -494,12 -498,9 +498,12 @@@ extern struct sh7372_pm_domain sh7372_a
  extern void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd);
  extern void sh7372_add_device_to_domain(struct sh7372_pm_domain *sh7372_pd,
                                        struct platform_device *pdev);
 +extern void sh7372_pm_add_subdomain(struct sh7372_pm_domain *sh7372_pd,
 +                                  struct sh7372_pm_domain *sh7372_sd);
  #else
  #define sh7372_init_pm_domain(pd) do { } while(0)
  #define sh7372_add_device_to_domain(pd, pdev) do { } while(0)
 +#define sh7372_pm_add_subdomain(pd, sd) do { } while(0)
  #endif /* CONFIG_PM */
  
  #endif /* __ASM_SH7372_H__ */
@@@ -30,7 -30,6 +30,7 @@@
  #include <linux/sh_dma.h>
  #include <linux/sh_intc.h>
  #include <linux/sh_timer.h>
 +#include <linux/pm_domain.h>
  #include <mach/hardware.h>
  #include <mach/sh7372.h>
  #include <asm/mach-types.h>
@@@ -170,35 -169,35 +170,35 @@@ static struct platform_device scif6_dev
  };
  
  /* CMT */
- static struct sh_timer_config cmt10_platform_data = {
-       .name = "CMT10",
-       .channel_offset = 0x10,
-       .timer_bit = 0,
+ static struct sh_timer_config cmt2_platform_data = {
+       .name = "CMT2",
+       .channel_offset = 0x40,
+       .timer_bit = 5,
        .clockevent_rating = 125,
        .clocksource_rating = 125,
  };
  
- static struct resource cmt10_resources[] = {
+ static struct resource cmt2_resources[] = {
        [0] = {
-               .name   = "CMT10",
-               .start  = 0xe6138010,
-               .end    = 0xe613801b,
+               .name   = "CMT2",
+               .start  = 0xe6130040,
+               .end    = 0xe613004b,
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = evt2irq(0x0b00), /* CMT1_CMT10 */
+               .start  = evt2irq(0x0b80), /* CMT2 */
                .flags  = IORESOURCE_IRQ,
        },
  };
  
- static struct platform_device cmt10_device = {
+ static struct platform_device cmt2_device = {
        .name           = "sh_cmt",
-       .id             = 10,
+       .id             = 2,
        .dev = {
-               .platform_data  = &cmt10_platform_data,
+               .platform_data  = &cmt2_platform_data,
        },
-       .resource       = cmt10_resources,
-       .num_resources  = ARRAY_SIZE(cmt10_resources),
+       .resource       = cmt2_resources,
+       .num_resources  = ARRAY_SIZE(cmt2_resources),
  };
  
  /* TMU */
@@@ -603,6 -602,150 +603,150 @@@ static struct platform_device dma2_devi
        },
  };
  
+ /*
+  * USB-DMAC
+  */
+ unsigned int usbts_shift[] = {3, 4, 5};
+ enum {
+       XMIT_SZ_8BYTE           = 0,
+       XMIT_SZ_16BYTE          = 1,
+       XMIT_SZ_32BYTE          = 2,
+ };
+ #define USBTS_INDEX2VAL(i) (((i) & 3) << 6)
+ static const struct sh_dmae_channel sh7372_usb_dmae_channels[] = {
+       {
+               .offset = 0,
+       }, {
+               .offset = 0x20,
+       },
+ };
+ /* USB DMAC0 */
+ static const struct sh_dmae_slave_config sh7372_usb_dmae0_slaves[] = {
+       {
+               .slave_id       = SHDMA_SLAVE_USB0_TX,
+               .chcr           = USBTS_INDEX2VAL(XMIT_SZ_8BYTE),
+       }, {
+               .slave_id       = SHDMA_SLAVE_USB0_RX,
+               .chcr           = USBTS_INDEX2VAL(XMIT_SZ_8BYTE),
+       },
+ };
+ static struct sh_dmae_pdata usb_dma0_platform_data = {
+       .slave          = sh7372_usb_dmae0_slaves,
+       .slave_num      = ARRAY_SIZE(sh7372_usb_dmae0_slaves),
+       .channel        = sh7372_usb_dmae_channels,
+       .channel_num    = ARRAY_SIZE(sh7372_usb_dmae_channels),
+       .ts_low_shift   = 6,
+       .ts_low_mask    = 0xc0,
+       .ts_high_shift  = 0,
+       .ts_high_mask   = 0,
+       .ts_shift       = usbts_shift,
+       .ts_shift_num   = ARRAY_SIZE(usbts_shift),
+       .dmaor_init     = DMAOR_DME,
+       .chcr_offset    = 0x14,
+       .chcr_ie_bit    = 1 << 5,
+       .dmaor_is_32bit = 1,
+       .needs_tend_set = 1,
+       .no_dmars       = 1,
+ };
+ static struct resource sh7372_usb_dmae0_resources[] = {
+       {
+               /* Channel registers and DMAOR */
+               .start  = 0xe68a0020,
+               .end    = 0xe68a0064 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* VCR/SWR/DMICR */
+               .start  = 0xe68a0000,
+               .end    = 0xe68a0014 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* IRQ for channels */
+               .start  = evt2irq(0x0a00),
+               .end    = evt2irq(0x0a00),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device usb_dma0_device = {
+       .name           = "sh-dma-engine",
+       .id             = 3,
+       .resource       = sh7372_usb_dmae0_resources,
+       .num_resources  = ARRAY_SIZE(sh7372_usb_dmae0_resources),
+       .dev            = {
+               .platform_data  = &usb_dma0_platform_data,
+       },
+ };
+ /* USB DMAC1 */
+ static const struct sh_dmae_slave_config sh7372_usb_dmae1_slaves[] = {
+       {
+               .slave_id       = SHDMA_SLAVE_USB1_TX,
+               .chcr           = USBTS_INDEX2VAL(XMIT_SZ_8BYTE),
+       }, {
+               .slave_id       = SHDMA_SLAVE_USB1_RX,
+               .chcr           = USBTS_INDEX2VAL(XMIT_SZ_8BYTE),
+       },
+ };
+ static struct sh_dmae_pdata usb_dma1_platform_data = {
+       .slave          = sh7372_usb_dmae1_slaves,
+       .slave_num      = ARRAY_SIZE(sh7372_usb_dmae1_slaves),
+       .channel        = sh7372_usb_dmae_channels,
+       .channel_num    = ARRAY_SIZE(sh7372_usb_dmae_channels),
+       .ts_low_shift   = 6,
+       .ts_low_mask    = 0xc0,
+       .ts_high_shift  = 0,
+       .ts_high_mask   = 0,
+       .ts_shift       = usbts_shift,
+       .ts_shift_num   = ARRAY_SIZE(usbts_shift),
+       .dmaor_init     = DMAOR_DME,
+       .chcr_offset    = 0x14,
+       .chcr_ie_bit    = 1 << 5,
+       .dmaor_is_32bit = 1,
+       .needs_tend_set = 1,
+       .no_dmars       = 1,
+ };
+ static struct resource sh7372_usb_dmae1_resources[] = {
+       {
+               /* Channel registers and DMAOR */
+               .start  = 0xe68c0020,
+               .end    = 0xe68c0064 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* VCR/SWR/DMICR */
+               .start  = 0xe68c0000,
+               .end    = 0xe68c0014 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* IRQ for channels */
+               .start  = evt2irq(0x1d00),
+               .end    = evt2irq(0x1d00),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device usb_dma1_device = {
+       .name           = "sh-dma-engine",
+       .id             = 4,
+       .resource       = sh7372_usb_dmae1_resources,
+       .num_resources  = ARRAY_SIZE(sh7372_usb_dmae1_resources),
+       .dev            = {
+               .platform_data  = &usb_dma1_platform_data,
+       },
+ };
  /* VPU */
  static struct uio_info vpu_platform_data = {
        .name = "VPU5HG",
@@@ -819,7 -962,7 +963,7 @@@ static struct platform_device *sh7372_e
        &scif4_device,
        &scif5_device,
        &scif6_device,
-       &cmt10_device,
+       &cmt2_device,
        &tmu00_device,
        &tmu01_device,
  };
@@@ -830,6 -973,8 +974,8 @@@ static struct platform_device *sh7372_l
        &dma0_device,
        &dma1_device,
        &dma2_device,
+       &usb_dma0_device,
+       &usb_dma1_device,
        &vpu_device,
        &veu0_device,
        &veu1_device,
@@@ -849,8 -994,6 +995,8 @@@ void __init sh7372_add_standard_devices
        sh7372_init_pm_domain(&sh7372_a3ri);
        sh7372_init_pm_domain(&sh7372_a3sg);
  
 +      sh7372_pm_add_subdomain(&sh7372_a4lc, &sh7372_a3rv);
 +
        platform_add_devices(sh7372_early_devices,
                            ARRAY_SIZE(sh7372_early_devices));
  
  #include <linux/kernel.h>
  #include <linux/io.h>
  #include <linux/pm.h>
 -#include <linux/pm_runtime.h>
 +#include <linux/pm_clock.h>
  #include <linux/clk.h>
  #include <linux/slab.h>
  #include <linux/err.h>
  
  #ifdef CONFIG_PM
  
 -struct pm_clk_data {
 -      struct list_head clock_list;
 -      spinlock_t lock;
 -};
 -
  enum pce_status {
        PCE_STATUS_NONE = 0,
        PCE_STATUS_ACQUIRED,
@@@ -31,6 -36,27 +31,22 @@@ struct pm_clock_entry 
        enum pce_status status;
  };
  
 -static struct pm_clk_data *__to_pcd(struct device *dev)
 -{
 -      return dev ? dev->power.subsys_data : NULL;
 -}
 -
+ /**
+  * pm_clk_acquire - Acquire a device clock.
+  * @dev: Device whose clock is to be acquired.
+  * @ce: PM clock entry corresponding to the clock.
+  */
+ static void pm_clk_acquire(struct device *dev, struct pm_clock_entry *ce)
+ {
+       ce->clk = clk_get(dev, ce->con_id);
+       if (IS_ERR(ce->clk)) {
+               ce->status = PCE_STATUS_ERROR;
+       } else {
+               ce->status = PCE_STATUS_ACQUIRED;
+               dev_dbg(dev, "Clock %s managed by runtime PM.\n", ce->con_id);
+       }
+ }
  /**
   * pm_clk_add - Start using a device clock for power management.
   * @dev: Device whose clock is going to be used for power management.
   */
  int pm_clk_add(struct device *dev, const char *con_id)
  {
 -      struct pm_clk_data *pcd = __to_pcd(dev);
 +      struct pm_subsys_data *psd = dev_to_psd(dev);
        struct pm_clock_entry *ce;
  
 -      if (!pcd)
 +      if (!psd)
                return -EINVAL;
  
        ce = kzalloc(sizeof(*ce), GFP_KERNEL);
                }
        }
  
 -      spin_lock_irq(&pcd->lock);
 -      list_add_tail(&ce->node, &pcd->clock_list);
 -      spin_unlock_irq(&pcd->lock);
+       pm_clk_acquire(dev, ce);
 +      spin_lock_irq(&psd->lock);
 +      list_add_tail(&ce->node, &psd->clock_list);
 +      spin_unlock_irq(&psd->lock);
        return 0;
  }
  
  /**
   * __pm_clk_remove - Destroy PM clock entry.
   * @ce: PM clock entry to destroy.
-  *
-  * This routine must be called under the spinlock protecting the PM list of
-  * clocks corresponding the the @ce's device.
   */
  static void __pm_clk_remove(struct pm_clock_entry *ce)
  {
        if (!ce)
                return;
  
-       list_del(&ce->node);
        if (ce->status < PCE_STATUS_ERROR) {
                if (ce->status == PCE_STATUS_ENABLED)
                        clk_disable(ce->clk);
   */
  void pm_clk_remove(struct device *dev, const char *con_id)
  {
 -      struct pm_clk_data *pcd = __to_pcd(dev);
 +      struct pm_subsys_data *psd = dev_to_psd(dev);
        struct pm_clock_entry *ce;
  
 -      if (!pcd)
 +      if (!psd)
                return;
  
 -      spin_lock_irq(&pcd->lock);
 +      spin_lock_irq(&psd->lock);
  
 -      list_for_each_entry(ce, &pcd->clock_list, node) {
 +      list_for_each_entry(ce, &psd->clock_list, node) {
-               if (!con_id && !ce->con_id) {
-                       __pm_clk_remove(ce);
-                       break;
-               } else if (!con_id || !ce->con_id) {
+               if (!con_id && !ce->con_id)
+                       goto remove;
+               else if (!con_id || !ce->con_id)
                        continue;
-               } else if (!strcmp(con_id, ce->con_id)) {
-                       __pm_clk_remove(ce);
-                       break;
-               }
+               else if (!strcmp(con_id, ce->con_id))
+                       goto remove;
        }
  
 -      spin_unlock_irq(&pcd->lock);
 +      spin_unlock_irq(&psd->lock);
+       return;
+  remove:
+       list_del(&ce->node);
 -      spin_unlock_irq(&pcd->lock);
++      spin_unlock_irq(&psd->lock);
+       __pm_clk_remove(ce);
  }
  
  /**
   * pm_clk_init - Initialize a device's list of power management clocks.
   * @dev: Device to initialize the list of PM clocks for.
   *
 - * Allocate a struct pm_clk_data object, initialize its lock member and
 - * make the @dev's power.subsys_data field point to it.
 + * Initialize the lock and clock_list members of the device's pm_subsys_data
 + * object.
   */
 -int pm_clk_init(struct device *dev)
 +void pm_clk_init(struct device *dev)
  {
 -      struct pm_clk_data *pcd;
 -
 -      pcd = kzalloc(sizeof(*pcd), GFP_KERNEL);
 -      if (!pcd) {
 -              dev_err(dev, "Not enough memory for PM clock data.\n");
 -              return -ENOMEM;
 -      }
 +      struct pm_subsys_data *psd = dev_to_psd(dev);
 +      if (psd)
 +              INIT_LIST_HEAD(&psd->clock_list);
 +}
  
 -      INIT_LIST_HEAD(&pcd->clock_list);
 -      spin_lock_init(&pcd->lock);
 -      dev->power.subsys_data = pcd;
 -      return 0;
 +/**
 + * pm_clk_create - Create and initialize a device's list of PM clocks.
 + * @dev: Device to create and initialize the list of PM clocks for.
 + *
 + * Allocate a struct pm_subsys_data object, initialize its lock and clock_list
 + * members and make the @dev's power.subsys_data field point to it.
 + */
 +int pm_clk_create(struct device *dev)
 +{
 +      int ret = dev_pm_get_subsys_data(dev);
 +      return ret < 0 ? ret : 0;
  }
  
  /**
   * @dev: Device to destroy the list of PM clocks for.
   *
   * Clear the @dev's power.subsys_data field, remove the list of clock entries
 - * from the struct pm_clk_data object pointed to by it before and free
 + * from the struct pm_subsys_data object pointed to by it before and free
   * that object.
   */
  void pm_clk_destroy(struct device *dev)
  {
 -      struct pm_clk_data *pcd = __to_pcd(dev);
 +      struct pm_subsys_data *psd = dev_to_psd(dev);
        struct pm_clock_entry *ce, *c;
+       struct list_head list;
  
 -      if (!pcd)
 +      if (!psd)
                return;
  
 -      dev->power.subsys_data = NULL;
+       INIT_LIST_HEAD(&list);
 -      spin_lock_irq(&pcd->lock);
 +      spin_lock_irq(&psd->lock);
  
 -      list_for_each_entry_safe_reverse(ce, c, &pcd->clock_list, node)
 +      list_for_each_entry_safe_reverse(ce, c, &psd->clock_list, node)
-               __pm_clk_remove(ce);
+               list_move(&ce->node, &list);
  
 -      spin_unlock_irq(&pcd->lock);
 +      spin_unlock_irq(&psd->lock);
  
 -      kfree(pcd);
 +      dev_pm_put_subsys_data(dev);
+       list_for_each_entry_safe_reverse(ce, c, &list, node) {
+               list_del(&ce->node);
+               __pm_clk_remove(ce);
+       }
  }
  
  #endif /* CONFIG_PM */
  
  #ifdef CONFIG_PM_RUNTIME
  
- /**
-  * pm_clk_acquire - Acquire a device clock.
-  * @dev: Device whose clock is to be acquired.
-  * @con_id: Connection ID of the clock.
-  */
- static void pm_clk_acquire(struct device *dev,
-                                   struct pm_clock_entry *ce)
- {
-       ce->clk = clk_get(dev, ce->con_id);
-       if (IS_ERR(ce->clk)) {
-               ce->status = PCE_STATUS_ERROR;
-       } else {
-               ce->status = PCE_STATUS_ACQUIRED;
-               dev_dbg(dev, "Clock %s managed by runtime PM.\n", ce->con_id);
-       }
- }
  /**
   * pm_clk_suspend - Disable clocks in a device's PM clock list.
   * @dev: Device to disable the clocks for.
   */
  int pm_clk_suspend(struct device *dev)
  {
 -      struct pm_clk_data *pcd = __to_pcd(dev);
 +      struct pm_subsys_data *psd = dev_to_psd(dev);
        struct pm_clock_entry *ce;
        unsigned long flags;
  
        dev_dbg(dev, "%s()\n", __func__);
  
 -      if (!pcd)
 +      if (!psd)
                return 0;
  
 -      spin_lock_irqsave(&pcd->lock, flags);
 +      spin_lock_irqsave(&psd->lock, flags);
  
 -      list_for_each_entry_reverse(ce, &pcd->clock_list, node) {
 +      list_for_each_entry_reverse(ce, &psd->clock_list, node) {
-               if (ce->status == PCE_STATUS_NONE)
-                       pm_clk_acquire(dev, ce);
                if (ce->status < PCE_STATUS_ERROR) {
                        clk_disable(ce->clk);
                        ce->status = PCE_STATUS_ACQUIRED;
                }
        }
  
 -      spin_unlock_irqrestore(&pcd->lock, flags);
 +      spin_unlock_irqrestore(&psd->lock, flags);
  
        return 0;
  }
   */
  int pm_clk_resume(struct device *dev)
  {
 -      struct pm_clk_data *pcd = __to_pcd(dev);
 +      struct pm_subsys_data *psd = dev_to_psd(dev);
        struct pm_clock_entry *ce;
        unsigned long flags;
  
        dev_dbg(dev, "%s()\n", __func__);
  
 -      if (!pcd)
 +      if (!psd)
                return 0;
  
 -      spin_lock_irqsave(&pcd->lock, flags);
 +      spin_lock_irqsave(&psd->lock, flags);
  
 -      list_for_each_entry(ce, &pcd->clock_list, node) {
 +      list_for_each_entry(ce, &psd->clock_list, node) {
-               if (ce->status == PCE_STATUS_NONE)
-                       pm_clk_acquire(dev, ce);
                if (ce->status < PCE_STATUS_ERROR) {
                        clk_enable(ce->clk);
                        ce->status = PCE_STATUS_ENABLED;
                }
        }
  
 -      spin_unlock_irqrestore(&pcd->lock, flags);
 +      spin_unlock_irqrestore(&psd->lock, flags);
  
        return 0;
  }
@@@ -301,7 -310,7 +303,7 @@@ static int pm_clk_notify(struct notifie
                if (dev->pm_domain)
                        break;
  
 -              error = pm_clk_init(dev);
 +              error = pm_clk_create(dev);
                if (error)
                        break;
  
   */
  int pm_clk_suspend(struct device *dev)
  {
 -      struct pm_clk_data *pcd = __to_pcd(dev);
 +      struct pm_subsys_data *psd = dev_to_psd(dev);
        struct pm_clock_entry *ce;
        unsigned long flags;
  
        dev_dbg(dev, "%s()\n", __func__);
  
        /* If there is no driver, the clocks are already disabled. */
 -      if (!pcd || !dev->driver)
 +      if (!psd || !dev->driver)
                return 0;
  
 -      spin_lock_irqsave(&pcd->lock, flags);
 +      spin_lock_irqsave(&psd->lock, flags);
  
 -      list_for_each_entry_reverse(ce, &pcd->clock_list, node)
 +      list_for_each_entry_reverse(ce, &psd->clock_list, node)
                clk_disable(ce->clk);
  
 -      spin_unlock_irqrestore(&pcd->lock, flags);
 +      spin_unlock_irqrestore(&psd->lock, flags);
  
        return 0;
  }
   */
  int pm_clk_resume(struct device *dev)
  {
 -      struct pm_clk_data *pcd = __to_pcd(dev);
 +      struct pm_subsys_data *psd = dev_to_psd(dev);
        struct pm_clock_entry *ce;
        unsigned long flags;
  
        dev_dbg(dev, "%s()\n", __func__);
  
        /* If there is no driver, the clocks should remain disabled. */
 -      if (!pcd || !dev->driver)
 +      if (!psd || !dev->driver)
                return 0;
  
 -      spin_lock_irqsave(&pcd->lock, flags);
 +      spin_lock_irqsave(&psd->lock, flags);
  
 -      list_for_each_entry(ce, &pcd->clock_list, node)
 +      list_for_each_entry(ce, &psd->clock_list, node)
                clk_enable(ce->clk);
  
 -      spin_unlock_irqrestore(&pcd->lock, flags);
 +      spin_unlock_irqrestore(&psd->lock, flags);
  
        return 0;
  }