>From 9370c7fcc55a4dec54fc7ddd67bb42360b0af470 Mon Sep 17 00:00:00 2001
From: Vishwesh M Rudramuni <[email protected]>
Date: Mon, 15 Nov 2010 18:58:29 +0530
Subject: [PATCH] new pmu driver common code


This patch contains:

- x86 specific code for allocating boot memory in < 1MB space, where the
wake code will be copied for S0i3 entry/exit sequuence.
- pci platform pm ops registration for Moorestown MID.


Signed-off-by: Vishwesh M Rudramuni <[email protected]>
Signed-off-by: Rajeev D Muralidhar <[email protected]>

---
 arch/x86/kernel/setup.c   |    3 +-
 arch/x86/kernel/smpboot.c |    6 ++++-
 drivers/pci/Makefile      |    1 +
 drivers/pci/mid_pci.c     |   53 +++++++++++++++++++++++++++++++++++++++++++++
 drivers/pci/mid_pci.h     |   30 +++++++++++++++++++++++++
 include/linux/smp.h       |    6 +++++
 kernel/power/Kconfig      |    2 +-
 7 files changed, 98 insertions(+), 3 deletions(-)
 create mode 100644 drivers/pci/mid_pci.c
 create mode 100644 drivers/pci/mid_pci.h

diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 180103e..15bd297 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -67,6 +67,7 @@
 #include <linux/percpu.h>
 #include <linux/crash_dump.h>
 #include <linux/tboot.h>
+#include <linux/intel_mid.h>
 
 #include <video/edid.h>
 
@@ -997,7 +998,7 @@ void __init setup_arch(char **cmdline_p)
 #ifndef CONFIG_NO_BOOTMEM
        early_res_to_bootmem(0, max_low_pfn<<PAGE_SHIFT);
 #endif
-
+       intel_mid_reserve_bootmem();
        dma32_reserve_bootmem();
 
 #ifdef CONFIG_KVM_CLOCK
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 0bf2ece..81e477b 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1371,7 +1371,11 @@ void native_cpu_die(unsigned int cpu)
                                alternatives_smp_switch(0);
                        return;
                }
-               msleep(100);
+
+               if (!is_intel_pm_enabled())
+                       msleep(100);
+               else
+                       schedule();
        }
        pr_err("CPU %u didn't die...\n", cpu);
 }
diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile
index 0b51857..cb8ae45 100644
--- a/drivers/pci/Makefile
+++ b/drivers/pci/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_MIPS) += setup-bus.o setup-irq.o
 obj-$(CONFIG_X86_VISWS) += setup-irq.o
 obj-$(CONFIG_MN10300) += setup-bus.o
 obj-$(CONFIG_MICROBLAZE) += setup-bus.o
+obj-$(CONFIG_INTEL_MID_POWER) += mid_pci.o
 
 #
 # ACPI Related PCI FW Functions
diff --git a/drivers/pci/mid_pci.c b/drivers/pci/mid_pci.c
new file mode 100644
index 0000000..6bf2126
--- /dev/null
+++ b/drivers/pci/mid_pci.c
@@ -0,0 +1,53 @@
+/*
+ * mid_pci.c
+ * Copyright (c) 2010, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/pci.h>
+#include <linux/bootmem.h>
+#include <linux/intel_mid.h>
+#include "pci.h"
+#include "mid_pci.h"
+
+static struct pci_platform_pm_ops pmu_pci_platform_pm = {
+       .is_manageable = pmu_pci_power_manageable,
+       .set_state = pmu_pci_set_power_state,
+       .choose_state = pmu_pci_choose_state,
+       .can_wakeup = pmu_pci_can_wakeup,
+       .sleep_wake = pmu_pci_sleep_wake,
+};
+
+/**
+ * mid_pci_init - It registers callback function for all the PCI devices
+ * for platform specific device power on/shutdown acticities.
+ */
+static int __init mid_pci_init(void)
+{
+       int ret = 0;
+
+       pr_info("mid_pci_init is called\n");
+
+       /* register pmu driver call back function for platform specific
+        * set power state for pci devices
+        */
+       pci_set_platform_pm(&pmu_pci_platform_pm);
+
+       return ret;
+}
+arch_initcall(mid_pci_init);
diff --git a/drivers/pci/mid_pci.h b/drivers/pci/mid_pci.h
new file mode 100644
index 0000000..7bf5e49
--- /dev/null
+++ b/drivers/pci/mid_pci.h
@@ -0,0 +1,30 @@
+/*
+ * mid_pci.h
+ * Copyright (c) 2010, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+#ifndef MID_PCI_H
+#define MID_PCI_H
+
+extern void ppm_resume(void);
+extern void ppm_resume_end(void);
+extern int pmu_pci_set_power_state(struct pci_dev *pdev, pci_power_t state);
+extern pci_power_t pmu_pci_choose_state(struct pci_dev *pdev);
+extern bool pmu_pci_power_manageable(struct pci_dev *pdev);
+extern bool pmu_pci_can_wakeup(struct pci_dev *pdev);
+extern int pmu_pci_sleep_wake(struct pci_dev *pdev, bool enable);
+
+#endif /* define MID_PCI_H */
diff --git a/include/linux/smp.h b/include/linux/smp.h
index cfa2d20..08b7fbc 100644
--- a/include/linux/smp.h
+++ b/include/linux/smp.h
@@ -151,6 +151,12 @@ smp_call_function_any(const struct cpumask *mask, void 
(*func)(void *info),
 
 #endif /* !SMP */
 
+#ifdef CONFIG_INTEL_MID_POWER
+#define is_intel_pm_enabled() 1
+#else
+#define is_intel_pm_enabled() 0
+#endif
+
 /*
  * smp_processor_id(): get the current CPU ID.
  *
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
index ca6066a..dfc653a 100644
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -91,7 +91,7 @@ config PM_SLEEP_SMP
 
 config PM_SLEEP
        bool
-       depends on SUSPEND || HIBERNATION || XEN_SAVE_RESTORE
+       depends on SUSPEND || HIBERNATION || XEN_SAVE_RESTORE || INTEL_MID_POWER
        default y
 
 config PM_SLEEP_ADVANCED_DEBUG
-- 
1.5.4.5

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to