Merge tag 'gcc-plugins-v4.9-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / drivers / mfd / intel-lpss.c
index 1bbbe87..41b1138 100644 (file)
@@ -34,6 +34,7 @@
 #define LPSS_DEV_SIZE          0x200
 #define LPSS_PRIV_OFFSET       0x200
 #define LPSS_PRIV_SIZE         0x100
+#define LPSS_PRIV_REG_COUNT    (LPSS_PRIV_SIZE / 4)
 #define LPSS_IDMA64_OFFSET     0x800
 #define LPSS_IDMA64_SIZE       0x800
 
@@ -76,6 +77,7 @@ struct intel_lpss {
        struct mfd_cell *cell;
        struct device *dev;
        void __iomem *priv;
+       u32 priv_ctx[LPSS_PRIV_REG_COUNT];
        int devid;
        u32 caps;
        u32 active_ltr;
@@ -336,8 +338,8 @@ static int intel_lpss_register_clock(struct intel_lpss *lpss)
                return 0;
 
        /* Root clock */
-       clk = clk_register_fixed_rate(NULL, dev_name(lpss->dev), NULL,
-                                     CLK_IS_ROOT, lpss->info->clk_rate);
+       clk = clk_register_fixed_rate(NULL, dev_name(lpss->dev), NULL, 0,
+                                     lpss->info->clk_rate);
        if (IS_ERR(clk))
                return PTR_ERR(clk);
 
@@ -407,7 +409,7 @@ int intel_lpss_probe(struct device *dev,
        if (ret)
                return ret;
 
-       lpss->cell->pset = info->pset;
+       lpss->cell->properties = info->properties;
 
        intel_lpss_init_dev(lpss);
 
@@ -493,6 +495,16 @@ EXPORT_SYMBOL_GPL(intel_lpss_prepare);
 
 int intel_lpss_suspend(struct device *dev)
 {
+       struct intel_lpss *lpss = dev_get_drvdata(dev);
+       unsigned int i;
+
+       /* Save device context */
+       for (i = 0; i < LPSS_PRIV_REG_COUNT; i++)
+               lpss->priv_ctx[i] = readl(lpss->priv + i * 4);
+
+       /* Put the device into reset state */
+       writel(0, lpss->priv + LPSS_PRIV_RESETS);
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(intel_lpss_suspend);
@@ -500,8 +512,13 @@ EXPORT_SYMBOL_GPL(intel_lpss_suspend);
 int intel_lpss_resume(struct device *dev)
 {
        struct intel_lpss *lpss = dev_get_drvdata(dev);
+       unsigned int i;
 
-       intel_lpss_init_dev(lpss);
+       intel_lpss_deassert_reset(lpss);
+
+       /* Restore device context */
+       for (i = 0; i < LPSS_PRIV_REG_COUNT; i++)
+               writel(lpss->priv_ctx[i], lpss->priv + i * 4);
 
        return 0;
 }