Files
Nathan Chancellor 95a91a0f31 Merge 4.4.228 into android-msm-wahoo-4.4
Changes in 4.4.228: (102 commits)
        ipv6: fix IPV6_ADDRFORM operation logic
        vxlan: Avoid infinite loop when suppressing NS messages with invalid options
        scsi: return correct blkprep status code in case scsi_init_io() fails.
        net: phy: marvell: Limit 88m1101 autoneg errata to 88E1145 as well.
        pwm: fsl-ftm: Use flat regmap cache
        igb: improve handling of disconnected adapters
        ARM: 8977/1: ptrace: Fix mask for thumb breakpoint hook
        sched/fair: Don't NUMA balance for kthreads
        ath9k_htc: Silence undersized packet warnings
        x86_64: Fix jiffies ODR violation
        x86/speculation: Prevent rogue cross-process SSBD shutdown
        x86/reboot/quirks: Add MacBook6,1 reboot quirk
        efi/efivars: Add missing kobject_put() in sysfs entry creation error path
        ALSA: es1688: Add the missed snd_card_free()
        ALSA: usb-audio: Fix inconsistent card PM state after resume
        ACPI: sysfs: Fix reference count leak in acpi_sysfs_add_hotplug_profile()
        ACPI: PM: Avoid using power resources if there are none for D0
        cgroup, blkcg: Prepare some symbols for module and !CONFIG_CGROUP usages
        nilfs2: fix null pointer dereference at nilfs_segctor_do_construct()
        spi: bcm2835aux: Fix controller unregister order
        ALSA: pcm: disallow linking stream to itself
        x86/speculation: Change misspelled STIPB to STIBP
        x86/speculation: Add support for STIBP always-on preferred mode
        x86/speculation: Avoid force-disabling IBPB based on STIBP and enhanced IBRS.
        x86/speculation: PR_SPEC_FORCE_DISABLE enforcement for indirect branches.
        spi: dw: fix possible race condition
        spi: dw: Fix controller unregister order
        spi: No need to assign dummy value in spi_unregister_controller()
        spi: Fix controller unregister order
        spi: pxa2xx: Fix controller unregister order
        spi: bcm2835: Fix controller unregister order
        ovl: initialize error in ovl_copy_xattr
        proc: Use new_inode not new_inode_pseudo
        video: fbdev: w100fb: Fix a potential double free.
        KVM: nSVM: leave ASID aside in copy_vmcb_control_area
        KVM: nVMX: Consult only the "basic" exit reason when routing nested exit
        KVM: arm64: Make vcpu_cp1x() work on Big Endian hosts
        ath9k: Fix use-after-free Read in ath9k_wmi_ctrl_rx
        ath9k: Fix use-after-free Write in ath9k_htc_rx_msg
        ath9x: Fix stack-out-of-bounds Write in ath9k_hif_usb_rx_cb
        ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb
        Smack: slab-out-of-bounds in vsscanf
        mm/slub: fix a memory leak in sysfs_slab_add()
        fat: don't allow to mount if the FAT length == 0
        can: kvaser_usb: kvaser_usb_leaf: Fix some info-leaks to USB devices
        spi: dw: Zero DMA Tx and Rx configurations on stack
        Bluetooth: Add SCO fallback for invalid LMP parameters error
        kgdb: Prevent infinite recursive entries to the debugger
        spi: dw: Enable interrupts in accordance with DMA xfer mode
        clocksource: dw_apb_timer_of: Fix missing clockevent timers
        btrfs: do not ignore error from btrfs_next_leaf() when inserting checksums
        ARM: 8978/1: mm: make act_mm() respect THREAD_SIZE
        net: vmxnet3: fix possible buffer overflow caused by bad DMA value in vmxnet3_get_rss()
        staging: android: ion: use vmap instead of vm_map_ram
        e1000: Distribute switch variables for initialization
        media: dvb: return -EREMOTEIO on i2c transfer failure.
        MIPS: Make sparse_init() using top-down allocation
        netfilter: nft_nat: return EOPNOTSUPP if type or flags are not supported
        lib/mpi: Fix 64-bit MIPS build with Clang
        net: lpc-enet: fix error return code in lpc_mii_init()
        net: allwinner: Fix use correct return type for ndo_start_xmit()
        powerpc/spufs: fix copy_to_user while atomic
        mips: cm: Fix an invalid error code of INTVN_*_ERR
        kgdb: Fix spurious true from in_dbg_master()
        md: don't flush workqueue unconditionally in md_open
        mwifiex: Fix memory corruption in dump_station
        mips: Add udelay lpj numbers adjustment
        x86/mm: Stop printing BRK addresses
        m68k: mac: Don't call via_flush_cache() on Mac IIfx
        macvlan: Skip loopback packets in RX handler
        PCI: Don't disable decoding when mmio_always_on is set
        MIPS: Fix IRQ tracing when call handle_fpe() and handle_msa_fpe()
        ixgbe: fix signed-integer-overflow warning
        spi: dw: Return any value retrieved from the dma_transfer callback
        cpuidle: Fix three reference count leaks
        ima: Fix ima digest hash table key calculation
        ext4: fix EXT_MAX_EXTENT/INDEX to check for zeroed eh_max
        Btrfs: fix unreplayable log after snapshot delete + parent dir fsync
        btrfs: send: emit file capabilities after chown
        btrfs: fix error handling when submitting direct I/O bio
        ima: Directly assign the ima_default_policy pointer to ima_rules
        PCI: Program MPS for RCiEP devices
        e1000e: Relax condition to trigger reset for ME workaround
        carl9170: remove P2P_GO support
        media: go7007: fix a miss of snd_card_free
        b43legacy: Fix case where channel status is corrupted
        b43: Fix connection problem with WPA3
        b43_legacy: Fix connection problem with WPA3
        igb: Report speed and duplex as unknown when device is runtime suspended
        power: vexpress: add suppress_bind_attrs to true
        pinctrl: samsung: Save/restore eint_mask over suspend for EINT_TYPE GPIOs
        sparc32: fix register window handling in genregs32_[gs]et()
        kernel/cpu_pm: Fix uninitted local in cpu_pm
        ARM: tegra: Correct PL310 Auxiliary Control Register initialization
        drivers/macintosh: Fix memleak in windfarm_pm112 driver
        kbuild: force to build vmlinux if CONFIG_MODVERSION=y
        sunrpc: svcauth_gss_register_pseudoflavor must reject duplicate registrations.
        sunrpc: clean up properly in gss_mech_unregister()
        w1: omap-hdq: cleanup to add missing newline for some dev_dbg
        perf probe: Do not show the skipped events
        perf symbols: Fix debuginfo search for Ubuntu
        Linux 4.4.228

Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>

Conflicts:
	arch/x86/kernel/vmlinux.lds.S
2020-06-22 11:21:01 -07:00

241 lines
6.7 KiB
C

/*
* Copyright (C) 2011 Google, Inc.
*
* Author:
* Colin Cross <ccross@android.com>
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that 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.
*
*/
#include <linux/kernel.h>
#include <linux/cpu_pm.h>
#include <linux/module.h>
#include <linux/notifier.h>
#include <linux/spinlock.h>
#include <linux/syscore_ops.h>
bool from_suspend = false;
static DEFINE_RWLOCK(cpu_pm_notifier_lock);
static RAW_NOTIFIER_HEAD(cpu_pm_notifier_chain);
static int cpu_pm_notify(enum cpu_pm_event event, int nr_to_call, int *nr_calls,
void *data)
{
int ret;
ret = __raw_notifier_call_chain(&cpu_pm_notifier_chain, event, data,
nr_to_call, nr_calls);
return notifier_to_errno(ret);
}
/**
* cpu_pm_register_notifier - register a driver with cpu_pm
* @nb: notifier block to register
*
* Add a driver to a list of drivers that are notified about
* CPU and CPU cluster low power entry and exit.
*
* This function may sleep, and has the same return conditions as
* raw_notifier_chain_register.
*/
int cpu_pm_register_notifier(struct notifier_block *nb)
{
unsigned long flags;
int ret;
write_lock_irqsave(&cpu_pm_notifier_lock, flags);
ret = raw_notifier_chain_register(&cpu_pm_notifier_chain, nb);
write_unlock_irqrestore(&cpu_pm_notifier_lock, flags);
return ret;
}
EXPORT_SYMBOL_GPL(cpu_pm_register_notifier);
/**
* cpu_pm_unregister_notifier - unregister a driver with cpu_pm
* @nb: notifier block to be unregistered
*
* Remove a driver from the CPU PM notifier list.
*
* This function may sleep, and has the same return conditions as
* raw_notifier_chain_unregister.
*/
int cpu_pm_unregister_notifier(struct notifier_block *nb)
{
unsigned long flags;
int ret;
write_lock_irqsave(&cpu_pm_notifier_lock, flags);
ret = raw_notifier_chain_unregister(&cpu_pm_notifier_chain, nb);
write_unlock_irqrestore(&cpu_pm_notifier_lock, flags);
return ret;
}
EXPORT_SYMBOL_GPL(cpu_pm_unregister_notifier);
/**
* cpu_pm_enter - CPU low power entry notifier
*
* Notifies listeners that a single CPU is entering a low power state that may
* cause some blocks in the same power domain as the cpu to reset.
*
* Must be called on the affected CPU with interrupts disabled. Platform is
* responsible for ensuring that cpu_pm_enter is not called twice on the same
* CPU before cpu_pm_exit is called. Notified drivers can include VFP
* co-processor, interrupt controller and its PM extensions, local CPU
* timers context save/restore which shouldn't be interrupted. Hence it
* must be called with interrupts disabled.
*
* Return conditions are same as __raw_notifier_call_chain.
*/
int cpu_pm_enter(void)
{
int nr_calls = 0;
int ret = 0;
read_lock(&cpu_pm_notifier_lock);
ret = cpu_pm_notify(CPU_PM_ENTER, -1, &nr_calls, NULL);
if (ret)
/*
* Inform listeners (nr_calls - 1) about failure of CPU PM
* PM entry who are notified earlier to prepare for it.
*/
cpu_pm_notify(CPU_PM_ENTER_FAILED, nr_calls - 1, NULL, NULL);
read_unlock(&cpu_pm_notifier_lock);
return ret;
}
EXPORT_SYMBOL_GPL(cpu_pm_enter);
/**
* cpu_pm_exit - CPU low power exit notifier
*
* Notifies listeners that a single CPU is exiting a low power state that may
* have caused some blocks in the same power domain as the cpu to reset.
*
* Notified drivers can include VFP co-processor, interrupt controller
* and its PM extensions, local CPU timers context save/restore which
* shouldn't be interrupted. Hence it must be called with interrupts disabled.
*
* Return conditions are same as __raw_notifier_call_chain.
*/
int cpu_pm_exit(void)
{
int ret;
read_lock(&cpu_pm_notifier_lock);
ret = cpu_pm_notify(CPU_PM_EXIT, -1, NULL, NULL);
read_unlock(&cpu_pm_notifier_lock);
return ret;
}
EXPORT_SYMBOL_GPL(cpu_pm_exit);
/**
* cpu_cluster_pm_enter - CPU cluster low power entry notifier
*
* Notifies listeners that all cpus in a power domain are entering a low power
* state that may cause some blocks in the same power domain to reset.
*
* Must be called after cpu_pm_enter has been called on all cpus in the power
* domain, and before cpu_pm_exit has been called on any cpu in the power
* domain. Notified drivers can include VFP co-processor, interrupt controller
* and its PM extensions, local CPU timers context save/restore which
* shouldn't be interrupted. Hence it must be called with interrupts disabled.
*
* Must be called with interrupts disabled.
*
* Return conditions are same as __raw_notifier_call_chain.
*/
int cpu_cluster_pm_enter(unsigned long aff_level)
{
int nr_calls = 0;
int ret = 0;
read_lock(&cpu_pm_notifier_lock);
ret = cpu_pm_notify(CPU_CLUSTER_PM_ENTER, -1, &nr_calls,
(void *) aff_level);
if (ret)
/*
* Inform listeners (nr_calls - 1) about failure of CPU cluster
* PM entry who are notified earlier to prepare for it.
*/
cpu_pm_notify(CPU_CLUSTER_PM_ENTER_FAILED, nr_calls - 1, NULL,
(void *) aff_level);
read_unlock(&cpu_pm_notifier_lock);
return ret;
}
EXPORT_SYMBOL_GPL(cpu_cluster_pm_enter);
/**
* cpu_cluster_pm_exit - CPU cluster low power exit notifier
*
* Notifies listeners that all cpus in a power domain are exiting form a
* low power state that may have caused some blocks in the same power domain
* to reset.
*
* Must be called after cpu_cluster_pm_enter has been called for the power
* domain, and before cpu_pm_exit has been called on any cpu in the power
* domain. Notified drivers can include VFP co-processor, interrupt controller
* and its PM extensions, local CPU timers context save/restore which
* shouldn't be interrupted. Hence it must be called with interrupts disabled.
*
* Return conditions are same as __raw_notifier_call_chain.
*/
int cpu_cluster_pm_exit(unsigned long aff_level)
{
int ret;
read_lock(&cpu_pm_notifier_lock);
ret = cpu_pm_notify(CPU_CLUSTER_PM_EXIT, -1, NULL, (void *) aff_level);
read_unlock(&cpu_pm_notifier_lock);
return ret;
}
EXPORT_SYMBOL_GPL(cpu_cluster_pm_exit);
#ifdef CONFIG_PM
static int cpu_pm_suspend(void)
{
int ret;
from_suspend = true;
ret = cpu_pm_enter();
if (ret)
return ret;
ret = cpu_cluster_pm_enter(0);
return ret;
}
static void cpu_pm_resume(void)
{
from_suspend = false;
cpu_cluster_pm_exit(0);
cpu_pm_exit();
}
static struct syscore_ops cpu_pm_syscore_ops = {
.suspend = cpu_pm_suspend,
.resume = cpu_pm_resume,
};
static int cpu_pm_init(void)
{
register_syscore_ops(&cpu_pm_syscore_ops);
return 0;
}
core_initcall(cpu_pm_init);
#endif