15823d089SAndy Shevchenko /* 25823d089SAndy Shevchenko * Intel MID platform PM support 35823d089SAndy Shevchenko * 45823d089SAndy Shevchenko * Copyright (C) 2016, Intel Corporation 55823d089SAndy Shevchenko * 65823d089SAndy Shevchenko * Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com> 75823d089SAndy Shevchenko * 85823d089SAndy Shevchenko * This program is free software; you can redistribute it and/or modify it 95823d089SAndy Shevchenko * under the terms and conditions of the GNU General Public License, 105823d089SAndy Shevchenko * version 2, as published by the Free Software Foundation. 115823d089SAndy Shevchenko */ 125823d089SAndy Shevchenko 135823d089SAndy Shevchenko #include <linux/init.h> 145823d089SAndy Shevchenko #include <linux/pci.h> 155823d089SAndy Shevchenko 165823d089SAndy Shevchenko #include <asm/cpu_device_id.h> 175823d089SAndy Shevchenko #include <asm/intel-family.h> 185823d089SAndy Shevchenko #include <asm/intel-mid.h> 195823d089SAndy Shevchenko 205823d089SAndy Shevchenko #include "pci.h" 215823d089SAndy Shevchenko 225823d089SAndy Shevchenko static bool mid_pci_power_manageable(struct pci_dev *dev) 235823d089SAndy Shevchenko { 245823d089SAndy Shevchenko return true; 255823d089SAndy Shevchenko } 265823d089SAndy Shevchenko 275823d089SAndy Shevchenko static int mid_pci_set_power_state(struct pci_dev *pdev, pci_power_t state) 285823d089SAndy Shevchenko { 295823d089SAndy Shevchenko return intel_mid_pci_set_power_state(pdev, state); 305823d089SAndy Shevchenko } 315823d089SAndy Shevchenko 32e8a6123eSLukas Wunner static pci_power_t mid_pci_get_power_state(struct pci_dev *pdev) 33e8a6123eSLukas Wunner { 34e8a6123eSLukas Wunner return intel_mid_pci_get_power_state(pdev); 35e8a6123eSLukas Wunner } 36e8a6123eSLukas Wunner 375823d089SAndy Shevchenko static pci_power_t mid_pci_choose_state(struct pci_dev *pdev) 385823d089SAndy Shevchenko { 395823d089SAndy Shevchenko return PCI_D3hot; 405823d089SAndy Shevchenko } 415823d089SAndy Shevchenko 425823d089SAndy Shevchenko static int mid_pci_sleep_wake(struct pci_dev *dev, bool enable) 435823d089SAndy Shevchenko { 445823d089SAndy Shevchenko return 0; 455823d089SAndy Shevchenko } 465823d089SAndy Shevchenko 475823d089SAndy Shevchenko static int mid_pci_run_wake(struct pci_dev *dev, bool enable) 485823d089SAndy Shevchenko { 495823d089SAndy Shevchenko return 0; 505823d089SAndy Shevchenko } 515823d089SAndy Shevchenko 525823d089SAndy Shevchenko static bool mid_pci_need_resume(struct pci_dev *dev) 535823d089SAndy Shevchenko { 545823d089SAndy Shevchenko return false; 555823d089SAndy Shevchenko } 565823d089SAndy Shevchenko 575823d089SAndy Shevchenko static struct pci_platform_pm_ops mid_pci_platform_pm = { 585823d089SAndy Shevchenko .is_manageable = mid_pci_power_manageable, 595823d089SAndy Shevchenko .set_state = mid_pci_set_power_state, 60e8a6123eSLukas Wunner .get_state = mid_pci_get_power_state, 615823d089SAndy Shevchenko .choose_state = mid_pci_choose_state, 625823d089SAndy Shevchenko .sleep_wake = mid_pci_sleep_wake, 635823d089SAndy Shevchenko .run_wake = mid_pci_run_wake, 645823d089SAndy Shevchenko .need_resume = mid_pci_need_resume, 655823d089SAndy Shevchenko }; 665823d089SAndy Shevchenko 675823d089SAndy Shevchenko #define ICPU(model) { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, } 685823d089SAndy Shevchenko 698e522e1dSAndy Shevchenko /* 708e522e1dSAndy Shevchenko * This table should be in sync with the one in 718e522e1dSAndy Shevchenko * arch/x86/platform/intel-mid/pwr.c. 728e522e1dSAndy Shevchenko */ 735823d089SAndy Shevchenko static const struct x86_cpu_id lpss_cpu_ids[] = { 748e522e1dSAndy Shevchenko ICPU(INTEL_FAM6_ATOM_PENWELL), 75f5fbf848SAndy Shevchenko ICPU(INTEL_FAM6_ATOM_MERRIFIELD), 765823d089SAndy Shevchenko {} 775823d089SAndy Shevchenko }; 785823d089SAndy Shevchenko 795823d089SAndy Shevchenko static int __init mid_pci_init(void) 805823d089SAndy Shevchenko { 815823d089SAndy Shevchenko const struct x86_cpu_id *id; 825823d089SAndy Shevchenko 835823d089SAndy Shevchenko id = x86_match_cpu(lpss_cpu_ids); 845823d089SAndy Shevchenko if (id) 855823d089SAndy Shevchenko pci_set_platform_pm(&mid_pci_platform_pm); 865823d089SAndy Shevchenko return 0; 875823d089SAndy Shevchenko } 885823d089SAndy Shevchenko arch_initcall(mid_pci_init); 89