mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 01:34:00 +08:00
Merge commit 'nfs-for-3.3-4' into nfs-for-next
Conflicts: fs/nfs/nfs4proc.c Back-merge of the upstream kernel in order to fix a conflict with the slotid type conversion and implementation id patches...
This commit is contained in:
commit
8aa0a410af
@ -102,9 +102,12 @@ X!Iinclude/linux/kobject.h
|
||||
!Iinclude/linux/device.h
|
||||
</sect1>
|
||||
<sect1><title>Device Drivers Base</title>
|
||||
!Idrivers/base/init.c
|
||||
!Edrivers/base/driver.c
|
||||
!Edrivers/base/core.c
|
||||
!Edrivers/base/syscore.c
|
||||
!Edrivers/base/class.c
|
||||
!Idrivers/base/node.c
|
||||
!Edrivers/base/firmware_class.c
|
||||
!Edrivers/base/transport_class.c
|
||||
<!-- Cannot be included, because
|
||||
@ -113,13 +116,18 @@ X!Iinclude/linux/kobject.h
|
||||
exceed allowed 44 characters maximum
|
||||
X!Edrivers/base/attribute_container.c
|
||||
-->
|
||||
!Edrivers/base/sys.c
|
||||
!Edrivers/base/dd.c
|
||||
<!--
|
||||
X!Edrivers/base/interface.c
|
||||
-->
|
||||
!Iinclude/linux/platform_device.h
|
||||
!Edrivers/base/platform.c
|
||||
!Edrivers/base/bus.c
|
||||
</sect1>
|
||||
<sect1><title>Device Drivers DMA Management</title>
|
||||
!Edrivers/base/dma-buf.c
|
||||
!Edrivers/base/dma-coherent.c
|
||||
!Edrivers/base/dma-mapping.c
|
||||
</sect1>
|
||||
<sect1><title>Device Drivers Power Management</title>
|
||||
!Edrivers/base/power/main.c
|
||||
@ -219,7 +227,7 @@ X!Isound/sound_firmware.c
|
||||
<chapter id="uart16x50">
|
||||
<title>16x50 UART Driver</title>
|
||||
!Edrivers/tty/serial/serial_core.c
|
||||
!Edrivers/tty/serial/8250.c
|
||||
!Edrivers/tty/serial/8250/8250.c
|
||||
</chapter>
|
||||
|
||||
<chapter id="fbdev">
|
||||
|
29
MAINTAINERS
29
MAINTAINERS
@ -159,7 +159,7 @@ S: Maintained
|
||||
F: drivers/net/ethernet/realtek/r8169.c
|
||||
|
||||
8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-serial@vger.kernel.org
|
||||
W: http://serial.sourceforge.net
|
||||
S: Maintained
|
||||
@ -1783,9 +1783,9 @@ X: net/wireless/wext*
|
||||
|
||||
CHAR and MISC DRIVERS
|
||||
M: Arnd Bergmann <arnd@arndb.de>
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
|
||||
S: Maintained
|
||||
S: Supported
|
||||
F: drivers/char/*
|
||||
F: drivers/misc/*
|
||||
|
||||
@ -2320,7 +2320,7 @@ F: lib/lru_cache.c
|
||||
F: Documentation/blockdev/drbd/
|
||||
|
||||
DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git
|
||||
S: Supported
|
||||
F: Documentation/kobject.txt
|
||||
@ -6276,15 +6276,15 @@ S: Maintained
|
||||
F: arch/alpha/kernel/srm_env.c
|
||||
|
||||
STABLE BRANCH
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: stable@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Supported
|
||||
|
||||
STAGING SUBSYSTEM
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
|
||||
L: devel@driverdev.osuosl.org
|
||||
S: Maintained
|
||||
S: Supported
|
||||
F: drivers/staging/
|
||||
|
||||
STAGING - AGERE HERMES II and II.5 WIRELESS DRIVERS
|
||||
@ -6669,8 +6669,8 @@ S: Maintained
|
||||
K: ^Subject:.*(?i)trivial
|
||||
|
||||
TTY LAYER
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
S: Maintained
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git
|
||||
F: drivers/tty/
|
||||
F: drivers/tty/serial/serial_core.c
|
||||
@ -6958,7 +6958,7 @@ S: Maintained
|
||||
F: drivers/usb/serial/digi_acceleport.c
|
||||
|
||||
USB SERIAL DRIVER
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/usb/usb-serial.txt
|
||||
@ -6973,9 +6973,8 @@ S: Maintained
|
||||
F: drivers/usb/serial/empeg.c
|
||||
|
||||
USB SERIAL KEYSPAN DRIVER
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
W: http://www.kroah.com/linux/
|
||||
S: Maintained
|
||||
F: drivers/usb/serial/*keyspan*
|
||||
|
||||
@ -7003,7 +7002,7 @@ F: Documentation/video4linux/sn9c102.txt
|
||||
F: drivers/media/video/sn9c102/
|
||||
|
||||
USB SUBSYSTEM
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
W: http://www.linux-usb.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git
|
||||
@ -7090,7 +7089,7 @@ F: fs/hppfs/
|
||||
|
||||
USERSPACE I/O (UIO)
|
||||
M: "Hans J. Koch" <hjk@hansjkoch.de>
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
S: Maintained
|
||||
F: Documentation/DocBook/uio-howto.tmpl
|
||||
F: drivers/uio/
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include <linux/cache.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/entry.h>
|
||||
#include <asm/cpuinfo.h>
|
||||
@ -227,23 +226,5 @@ static int __init setup_bus_notifier(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(setup_bus_notifier);
|
||||
|
||||
static DEFINE_PER_CPU(struct cpu, cpu_devices);
|
||||
|
||||
static int __init topology_init(void)
|
||||
{
|
||||
int i, ret;
|
||||
|
||||
for_each_present_cpu(i) {
|
||||
struct cpu *c = &per_cpu(cpu_devices, i);
|
||||
|
||||
ret = register_cpu(c, i);
|
||||
if (ret)
|
||||
printk(KERN_WARNING "topology_init: register_cpu %d "
|
||||
"failed (%d)\n", i, ret);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(topology_init);
|
||||
|
@ -33,6 +33,7 @@ config SPARC
|
||||
config SPARC32
|
||||
def_bool !64BIT
|
||||
select GENERIC_ATOMIC64
|
||||
select CLZ_TAB
|
||||
|
||||
config SPARC64
|
||||
def_bool 64BIT
|
||||
|
@ -17,23 +17,9 @@ along with GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
.data
|
||||
.align 8
|
||||
.globl __clz_tab
|
||||
__clz_tab:
|
||||
.byte 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
|
||||
.byte 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
|
||||
.byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
|
||||
.byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
|
||||
.byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
|
||||
.byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
|
||||
.byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
|
||||
.byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
|
||||
.size __clz_tab,256
|
||||
.global .udiv
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.global .udiv
|
||||
.globl __divdi3
|
||||
__divdi3:
|
||||
save %sp,-104,%sp
|
||||
|
@ -145,13 +145,13 @@ extern void __add_wrong_size(void)
|
||||
|
||||
#ifdef __HAVE_ARCH_CMPXCHG
|
||||
#define cmpxchg(ptr, old, new) \
|
||||
__cmpxchg((ptr), (old), (new), sizeof(*ptr))
|
||||
__cmpxchg(ptr, old, new, sizeof(*(ptr)))
|
||||
|
||||
#define sync_cmpxchg(ptr, old, new) \
|
||||
__sync_cmpxchg((ptr), (old), (new), sizeof(*ptr))
|
||||
__sync_cmpxchg(ptr, old, new, sizeof(*(ptr)))
|
||||
|
||||
#define cmpxchg_local(ptr, old, new) \
|
||||
__cmpxchg_local((ptr), (old), (new), sizeof(*ptr))
|
||||
__cmpxchg_local(ptr, old, new, sizeof(*(ptr)))
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -252,7 +252,8 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)
|
||||
unsigned short ss;
|
||||
unsigned long sp;
|
||||
#endif
|
||||
printk(KERN_EMERG "%s: %04lx [#%d] ", str, err & 0xffff, ++die_counter);
|
||||
printk(KERN_DEFAULT
|
||||
"%s: %04lx [#%d] ", str, err & 0xffff, ++die_counter);
|
||||
#ifdef CONFIG_PREEMPT
|
||||
printk("PREEMPT ");
|
||||
#endif
|
||||
|
@ -129,7 +129,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
||||
if (!stack) {
|
||||
if (regs)
|
||||
stack = (unsigned long *)regs->sp;
|
||||
else if (task && task != current)
|
||||
else if (task != current)
|
||||
stack = (unsigned long *)task->thread.sp;
|
||||
else
|
||||
stack = &dummy;
|
||||
@ -269,11 +269,11 @@ void show_registers(struct pt_regs *regs)
|
||||
unsigned char c;
|
||||
u8 *ip;
|
||||
|
||||
printk(KERN_EMERG "Stack:\n");
|
||||
printk(KERN_DEFAULT "Stack:\n");
|
||||
show_stack_log_lvl(NULL, regs, (unsigned long *)sp,
|
||||
0, KERN_EMERG);
|
||||
0, KERN_DEFAULT);
|
||||
|
||||
printk(KERN_EMERG "Code: ");
|
||||
printk(KERN_DEFAULT "Code: ");
|
||||
|
||||
ip = (u8 *)regs->ip - code_prologue;
|
||||
if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) {
|
||||
|
@ -39,6 +39,14 @@ static int reboot_mode;
|
||||
enum reboot_type reboot_type = BOOT_ACPI;
|
||||
int reboot_force;
|
||||
|
||||
/* This variable is used privately to keep track of whether or not
|
||||
* reboot_type is still set to its default value (i.e., reboot= hasn't
|
||||
* been set on the command line). This is needed so that we can
|
||||
* suppress DMI scanning for reboot quirks. Without it, it's
|
||||
* impossible to override a faulty reboot quirk without recompiling.
|
||||
*/
|
||||
static int reboot_default = 1;
|
||||
|
||||
#if defined(CONFIG_X86_32) && defined(CONFIG_SMP)
|
||||
static int reboot_cpu = -1;
|
||||
#endif
|
||||
@ -67,6 +75,12 @@ bool port_cf9_safe = false;
|
||||
static int __init reboot_setup(char *str)
|
||||
{
|
||||
for (;;) {
|
||||
/* Having anything passed on the command line via
|
||||
* reboot= will cause us to disable DMI checking
|
||||
* below.
|
||||
*/
|
||||
reboot_default = 0;
|
||||
|
||||
switch (*str) {
|
||||
case 'w':
|
||||
reboot_mode = 0x1234;
|
||||
@ -295,14 +309,6 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "P4S800"),
|
||||
},
|
||||
},
|
||||
{ /* Handle problems with rebooting on VersaLogic Menlow boards */
|
||||
.callback = set_bios_reboot,
|
||||
.ident = "VersaLogic Menlow based board",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "VersaLogic Corporation"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "VersaLogic Menlow board"),
|
||||
},
|
||||
},
|
||||
{ /* Handle reboot issue on Acer Aspire one */
|
||||
.callback = set_kbd_reboot,
|
||||
.ident = "Acer Aspire One A110",
|
||||
@ -316,7 +322,12 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
||||
|
||||
static int __init reboot_init(void)
|
||||
{
|
||||
dmi_check_system(reboot_dmi_table);
|
||||
/* Only do the DMI check if reboot_type hasn't been overridden
|
||||
* on the command line
|
||||
*/
|
||||
if (reboot_default) {
|
||||
dmi_check_system(reboot_dmi_table);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
core_initcall(reboot_init);
|
||||
@ -465,7 +476,12 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
|
||||
|
||||
static int __init pci_reboot_init(void)
|
||||
{
|
||||
dmi_check_system(pci_reboot_dmi_table);
|
||||
/* Only do the DMI check if reboot_type hasn't been overridden
|
||||
* on the command line
|
||||
*/
|
||||
if (reboot_default) {
|
||||
dmi_check_system(pci_reboot_dmi_table);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
core_initcall(pci_reboot_init);
|
||||
|
@ -673,7 +673,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
|
||||
|
||||
stackend = end_of_stack(tsk);
|
||||
if (tsk != &init_task && *stackend != STACK_END_MAGIC)
|
||||
printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
|
||||
printk(KERN_EMERG "Thread overran stack, or stack corrupted\n");
|
||||
|
||||
tsk->thread.cr2 = address;
|
||||
tsk->thread.trap_no = 14;
|
||||
@ -684,7 +684,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
|
||||
sig = 0;
|
||||
|
||||
/* Executive summary in case the body of the oops scrolled away */
|
||||
printk(KERN_EMERG "CR2: %016lx\n", address);
|
||||
printk(KERN_DEFAULT "CR2: %016lx\n", address);
|
||||
|
||||
oops_end(flags, regs, sig);
|
||||
}
|
||||
|
@ -380,6 +380,7 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
|
||||
rbdc = __rbd_client_find(opt);
|
||||
if (rbdc) {
|
||||
ceph_destroy_options(opt);
|
||||
kfree(rbd_opts);
|
||||
|
||||
/* using an existing client */
|
||||
kref_get(&rbdc->kref);
|
||||
@ -406,15 +407,15 @@ done_err:
|
||||
|
||||
/*
|
||||
* Destroy ceph client
|
||||
*
|
||||
* Caller must hold node_lock.
|
||||
*/
|
||||
static void rbd_client_release(struct kref *kref)
|
||||
{
|
||||
struct rbd_client *rbdc = container_of(kref, struct rbd_client, kref);
|
||||
|
||||
dout("rbd_release_client %p\n", rbdc);
|
||||
spin_lock(&node_lock);
|
||||
list_del(&rbdc->node);
|
||||
spin_unlock(&node_lock);
|
||||
|
||||
ceph_destroy_client(rbdc->client);
|
||||
kfree(rbdc->rbd_opts);
|
||||
@ -427,7 +428,9 @@ static void rbd_client_release(struct kref *kref)
|
||||
*/
|
||||
static void rbd_put_client(struct rbd_device *rbd_dev)
|
||||
{
|
||||
spin_lock(&node_lock);
|
||||
kref_put(&rbd_dev->rbd_client->kref, rbd_client_release);
|
||||
spin_unlock(&node_lock);
|
||||
rbd_dev->rbd_client = NULL;
|
||||
rbd_dev->client = NULL;
|
||||
}
|
||||
|
@ -263,6 +263,7 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card)
|
||||
static char ohci_driver_name[] = KBUILD_MODNAME;
|
||||
|
||||
#define PCI_DEVICE_ID_AGERE_FW643 0x5901
|
||||
#define PCI_DEVICE_ID_CREATIVE_SB1394 0x4001
|
||||
#define PCI_DEVICE_ID_JMICRON_JMB38X_FW 0x2380
|
||||
#define PCI_DEVICE_ID_TI_TSB12LV22 0x8009
|
||||
#define PCI_DEVICE_ID_TI_TSB12LV26 0x8020
|
||||
@ -289,6 +290,9 @@ static const struct {
|
||||
{PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6,
|
||||
QUIRK_NO_MSI},
|
||||
|
||||
{PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_SB1394, PCI_ANY_ID,
|
||||
QUIRK_RESET_PACKET},
|
||||
|
||||
{PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB38X_FW, PCI_ANY_ID,
|
||||
QUIRK_NO_MSI},
|
||||
|
||||
@ -299,7 +303,7 @@ static const struct {
|
||||
QUIRK_NO_MSI},
|
||||
|
||||
{PCI_VENDOR_ID_RICOH, PCI_ANY_ID, PCI_ANY_ID,
|
||||
QUIRK_CYCLE_TIMER},
|
||||
QUIRK_CYCLE_TIMER | QUIRK_NO_MSI},
|
||||
|
||||
{PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TSB12LV22, PCI_ANY_ID,
|
||||
QUIRK_CYCLE_TIMER | QUIRK_RESET_PACKET | QUIRK_NO_1394A},
|
||||
|
@ -54,9 +54,10 @@ struct bit_entry {
|
||||
int bit_table(struct drm_device *, u8 id, struct bit_entry *);
|
||||
|
||||
enum dcb_gpio_tag {
|
||||
DCB_GPIO_TVDAC0 = 0xc,
|
||||
DCB_GPIO_PANEL_POWER = 0x01,
|
||||
DCB_GPIO_TVDAC0 = 0x0c,
|
||||
DCB_GPIO_TVDAC1 = 0x2d,
|
||||
DCB_GPIO_PWM_FAN = 0x9,
|
||||
DCB_GPIO_PWM_FAN = 0x09,
|
||||
DCB_GPIO_FAN_SENSE = 0x3d,
|
||||
DCB_GPIO_UNUSED = 0xff
|
||||
};
|
||||
|
@ -219,6 +219,16 @@ nouveau_display_init(struct drm_device *dev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* power on internal panel if it's not already. the init tables of
|
||||
* some vbios default this to off for some reason, causing the
|
||||
* panel to not work after resume
|
||||
*/
|
||||
if (nouveau_gpio_func_get(dev, DCB_GPIO_PANEL_POWER) == 0) {
|
||||
nouveau_gpio_func_set(dev, DCB_GPIO_PANEL_POWER, true);
|
||||
msleep(300);
|
||||
}
|
||||
|
||||
/* enable polling for external displays */
|
||||
drm_kms_helper_poll_enable(dev);
|
||||
|
||||
/* enable hotplug interrupts */
|
||||
|
@ -124,7 +124,7 @@ MODULE_PARM_DESC(ctxfw, "Use external HUB/GPC ucode (fermi)\n");
|
||||
int nouveau_ctxfw;
|
||||
module_param_named(ctxfw, nouveau_ctxfw, int, 0400);
|
||||
|
||||
MODULE_PARM_DESC(ctxfw, "Santise DCB table according to MXM-SIS\n");
|
||||
MODULE_PARM_DESC(mxmdcb, "Santise DCB table according to MXM-SIS\n");
|
||||
int nouveau_mxmdcb = 1;
|
||||
module_param_named(mxmdcb, nouveau_mxmdcb, int, 0400);
|
||||
|
||||
|
@ -379,6 +379,25 @@ retry:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
validate_sync(struct nouveau_channel *chan, struct nouveau_bo *nvbo)
|
||||
{
|
||||
struct nouveau_fence *fence = NULL;
|
||||
int ret = 0;
|
||||
|
||||
spin_lock(&nvbo->bo.bdev->fence_lock);
|
||||
if (nvbo->bo.sync_obj)
|
||||
fence = nouveau_fence_ref(nvbo->bo.sync_obj);
|
||||
spin_unlock(&nvbo->bo.bdev->fence_lock);
|
||||
|
||||
if (fence) {
|
||||
ret = nouveau_fence_sync(fence, chan);
|
||||
nouveau_fence_unref(&fence);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
validate_list(struct nouveau_channel *chan, struct list_head *list,
|
||||
struct drm_nouveau_gem_pushbuf_bo *pbbo, uint64_t user_pbbo_ptr)
|
||||
@ -393,7 +412,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
|
||||
list_for_each_entry(nvbo, list, entry) {
|
||||
struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index];
|
||||
|
||||
ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan);
|
||||
ret = validate_sync(chan, nvbo);
|
||||
if (unlikely(ret)) {
|
||||
NV_ERROR(dev, "fail pre-validate sync\n");
|
||||
return ret;
|
||||
@ -416,7 +435,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan);
|
||||
ret = validate_sync(chan, nvbo);
|
||||
if (unlikely(ret)) {
|
||||
NV_ERROR(dev, "fail post-validate sync\n");
|
||||
return ret;
|
||||
|
@ -656,7 +656,16 @@ nouveau_mxm_init(struct drm_device *dev)
|
||||
|
||||
if (mxm_shadow(dev, mxm[0])) {
|
||||
MXM_MSG(dev, "failed to locate valid SIS\n");
|
||||
#if 0
|
||||
/* we should, perhaps, fall back to some kind of limited
|
||||
* mode here if the x86 vbios hasn't already done the
|
||||
* work for us (so we prevent loading with completely
|
||||
* whacked vbios tables).
|
||||
*/
|
||||
return -EINVAL;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
MXM_MSG(dev, "MXMS Version %d.%d\n",
|
||||
|
@ -495,9 +495,9 @@ nv50_pm_clocks_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl)
|
||||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
struct nv50_pm_state *info;
|
||||
struct pll_lims pll;
|
||||
int ret = -EINVAL;
|
||||
int clk, ret = -EINVAL;
|
||||
int N, M, P1, P2;
|
||||
u32 clk, out;
|
||||
u32 out;
|
||||
|
||||
if (dev_priv->chipset == 0xaa ||
|
||||
dev_priv->chipset == 0xac)
|
||||
|
@ -1184,7 +1184,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
WREG32(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 1);
|
||||
|
||||
WREG32(EVERGREEN_DESKTOP_HEIGHT + radeon_crtc->crtc_offset,
|
||||
crtc->mode.vdisplay);
|
||||
target_fb->height);
|
||||
x &= ~3;
|
||||
y &= ~1;
|
||||
WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset,
|
||||
@ -1353,7 +1353,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
WREG32(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1);
|
||||
|
||||
WREG32(AVIVO_D1MODE_DESKTOP_HEIGHT + radeon_crtc->crtc_offset,
|
||||
crtc->mode.vdisplay);
|
||||
target_fb->height);
|
||||
x &= ~3;
|
||||
y &= ~1;
|
||||
WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset,
|
||||
|
@ -564,9 +564,21 @@ int radeon_dp_get_panel_mode(struct drm_encoder *encoder,
|
||||
ENCODER_OBJECT_ID_NUTMEG)
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
|
||||
else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) ==
|
||||
ENCODER_OBJECT_ID_TRAVIS)
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
|
||||
else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
|
||||
ENCODER_OBJECT_ID_TRAVIS) {
|
||||
u8 id[6];
|
||||
int i;
|
||||
for (i = 0; i < 6; i++)
|
||||
id[i] = radeon_read_dpcd_reg(radeon_connector, 0x503 + i);
|
||||
if (id[0] == 0x73 &&
|
||||
id[1] == 0x69 &&
|
||||
id[2] == 0x76 &&
|
||||
id[3] == 0x61 &&
|
||||
id[4] == 0x72 &&
|
||||
id[5] == 0x54)
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
|
||||
else
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
|
||||
} else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
|
||||
u8 tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP);
|
||||
if (tmp & 1)
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
|
||||
|
@ -468,27 +468,42 @@ set_default_state(struct radeon_device *rdev)
|
||||
radeon_ring_write(ring, sq_stack_resource_mgmt_2);
|
||||
}
|
||||
|
||||
#define I2F_MAX_BITS 15
|
||||
#define I2F_MAX_INPUT ((1 << I2F_MAX_BITS) - 1)
|
||||
#define I2F_SHIFT (24 - I2F_MAX_BITS)
|
||||
|
||||
/*
|
||||
* Converts unsigned integer into 32-bit IEEE floating point representation.
|
||||
* Conversion is not universal and only works for the range from 0
|
||||
* to 2^I2F_MAX_BITS-1. Currently we only use it with inputs between
|
||||
* 0 and 16384 (inclusive), so I2F_MAX_BITS=15 is enough. If necessary,
|
||||
* I2F_MAX_BITS can be increased, but that will add to the loop iterations
|
||||
* and slow us down. Conversion is done by shifting the input and counting
|
||||
* down until the first 1 reaches bit position 23. The resulting counter
|
||||
* and the shifted input are, respectively, the exponent and the fraction.
|
||||
* The sign is always zero.
|
||||
*/
|
||||
static uint32_t i2f(uint32_t input)
|
||||
{
|
||||
u32 result, i, exponent, fraction;
|
||||
|
||||
if ((input & 0x3fff) == 0)
|
||||
result = 0; /* 0 is a special case */
|
||||
WARN_ON_ONCE(input > I2F_MAX_INPUT);
|
||||
|
||||
if ((input & I2F_MAX_INPUT) == 0)
|
||||
result = 0;
|
||||
else {
|
||||
exponent = 140; /* exponent biased by 127; */
|
||||
fraction = (input & 0x3fff) << 10; /* cheat and only
|
||||
handle numbers below 2^^15 */
|
||||
for (i = 0; i < 14; i++) {
|
||||
exponent = 126 + I2F_MAX_BITS;
|
||||
fraction = (input & I2F_MAX_INPUT) << I2F_SHIFT;
|
||||
|
||||
for (i = 0; i < I2F_MAX_BITS; i++) {
|
||||
if (fraction & 0x800000)
|
||||
break;
|
||||
else {
|
||||
fraction = fraction << 1; /* keep
|
||||
shifting left until top bit = 1 */
|
||||
fraction = fraction << 1;
|
||||
exponent = exponent - 1;
|
||||
}
|
||||
}
|
||||
result = exponent << 23 | (fraction & 0x7fffff); /* mask
|
||||
off top bit; assumed 1 */
|
||||
result = exponent << 23 | (fraction & 0x7fffff);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -59,8 +59,9 @@ static int radeon_atrm_call(acpi_handle atrm_handle, uint8_t *bios,
|
||||
|
||||
obj = (union acpi_object *)buffer.pointer;
|
||||
memcpy(bios+offset, obj->buffer.pointer, obj->buffer.length);
|
||||
len = obj->buffer.length;
|
||||
kfree(buffer.pointer);
|
||||
return obj->buffer.length;
|
||||
return len;
|
||||
}
|
||||
|
||||
bool radeon_atrm_supported(struct pci_dev *pdev)
|
||||
|
@ -883,6 +883,8 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
|
||||
if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
|
||||
return 0;
|
||||
|
||||
drm_kms_helper_poll_disable(dev);
|
||||
|
||||
/* turn off display hw */
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
|
||||
@ -972,6 +974,8 @@ int radeon_resume_kms(struct drm_device *dev)
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
|
||||
}
|
||||
|
||||
drm_kms_helper_poll_enable(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -958,6 +958,7 @@ struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev,
|
||||
i2c->rec = *rec;
|
||||
i2c->adapter.owner = THIS_MODULE;
|
||||
i2c->adapter.class = I2C_CLASS_DDC;
|
||||
i2c->adapter.dev.parent = &dev->pdev->dev;
|
||||
i2c->dev = dev;
|
||||
snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
|
||||
"Radeon aux bus %s", name);
|
||||
|
@ -808,9 +808,12 @@ static ssize_t ucma_accept(struct ucma_file *file, const char __user *inbuf,
|
||||
return PTR_ERR(ctx);
|
||||
|
||||
if (cmd.conn_param.valid) {
|
||||
ctx->uid = cmd.uid;
|
||||
ucma_copy_conn_param(&conn_param, &cmd.conn_param);
|
||||
mutex_lock(&file->mut);
|
||||
ret = rdma_accept(ctx->cm_id, &conn_param);
|
||||
if (!ret)
|
||||
ctx->uid = cmd.uid;
|
||||
mutex_unlock(&file->mut);
|
||||
} else
|
||||
ret = rdma_accept(ctx->cm_id, NULL);
|
||||
|
||||
|
@ -1485,6 +1485,7 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
|
||||
qp->event_handler = attr.event_handler;
|
||||
qp->qp_context = attr.qp_context;
|
||||
qp->qp_type = attr.qp_type;
|
||||
atomic_set(&qp->usecnt, 0);
|
||||
atomic_inc(&pd->usecnt);
|
||||
atomic_inc(&attr.send_cq->usecnt);
|
||||
if (attr.recv_cq)
|
||||
|
@ -421,6 +421,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
|
||||
qp->uobject = NULL;
|
||||
qp->qp_type = qp_init_attr->qp_type;
|
||||
|
||||
atomic_set(&qp->usecnt, 0);
|
||||
if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
|
||||
qp->event_handler = __ib_shared_qp_event_handler;
|
||||
qp->qp_context = qp;
|
||||
@ -430,7 +431,6 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
|
||||
qp->xrcd = qp_init_attr->xrcd;
|
||||
atomic_inc(&qp_init_attr->xrcd->usecnt);
|
||||
INIT_LIST_HEAD(&qp->open_list);
|
||||
atomic_set(&qp->usecnt, 0);
|
||||
|
||||
real_qp = qp;
|
||||
qp = __ib_open_qp(real_qp, qp_init_attr->event_handler,
|
||||
|
@ -89,7 +89,7 @@ static int create_file(const char *name, umode_t mode,
|
||||
error = ipathfs_mknod(parent->d_inode, *dentry,
|
||||
mode, fops, data);
|
||||
else
|
||||
error = PTR_ERR(dentry);
|
||||
error = PTR_ERR(*dentry);
|
||||
mutex_unlock(&parent->d_inode->i_mutex);
|
||||
|
||||
return error;
|
||||
|
@ -257,12 +257,9 @@ static int ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
|
||||
return IB_MAD_RESULT_SUCCESS;
|
||||
|
||||
/*
|
||||
* Don't process SMInfo queries or vendor-specific
|
||||
* MADs -- the SMA can't handle them.
|
||||
* Don't process SMInfo queries -- the SMA can't handle them.
|
||||
*/
|
||||
if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO ||
|
||||
((in_mad->mad_hdr.attr_id & IB_SMP_ATTR_VENDOR_MASK) ==
|
||||
IB_SMP_ATTR_VENDOR_MASK))
|
||||
if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO)
|
||||
return IB_MAD_RESULT_SUCCESS;
|
||||
} else if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT ||
|
||||
in_mad->mad_hdr.mgmt_class == MLX4_IB_VENDOR_CLASS1 ||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
@ -233,6 +233,7 @@ static int send_mpa_reject(struct nes_cm_node *cm_node)
|
||||
u8 *start_ptr = &start_addr;
|
||||
u8 **start_buff = &start_ptr;
|
||||
u16 buff_len = 0;
|
||||
struct ietf_mpa_v1 *mpa_frame;
|
||||
|
||||
skb = dev_alloc_skb(MAX_CM_BUFFER);
|
||||
if (!skb) {
|
||||
@ -242,6 +243,8 @@ static int send_mpa_reject(struct nes_cm_node *cm_node)
|
||||
|
||||
/* send an MPA reject frame */
|
||||
cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REPLY);
|
||||
mpa_frame = (struct ietf_mpa_v1 *)*start_buff;
|
||||
mpa_frame->flags |= IETF_MPA_FLAGS_REJECT;
|
||||
form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK | SET_FIN);
|
||||
|
||||
cm_node->state = NES_CM_STATE_FIN_WAIT1;
|
||||
@ -1360,8 +1363,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
|
||||
if (!memcmp(nesadapter->arp_table[arpindex].mac_addr,
|
||||
neigh->ha, ETH_ALEN)) {
|
||||
/* Mac address same as in nes_arp_table */
|
||||
ip_rt_put(rt);
|
||||
return rc;
|
||||
goto out;
|
||||
}
|
||||
|
||||
nes_manage_arp_cache(nesvnic->netdev,
|
||||
@ -1377,6 +1379,8 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
|
||||
neigh_event_send(neigh, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
ip_rt_put(rt);
|
||||
return rc;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel-NE, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel-NE, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Topspin Communications. All rights reserved.
|
||||
* Copyright (c) 2005 Cisco Systems. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
@ -3427,6 +3427,8 @@ static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
|
||||
set_wqe_32bit_value(wqe->wqe_words,
|
||||
NES_IWARP_SQ_FMR_WQE_LENGTH_LOW_IDX,
|
||||
ib_wr->wr.fast_reg.length);
|
||||
set_wqe_32bit_value(wqe->wqe_words,
|
||||
NES_IWARP_SQ_FMR_WQE_LENGTH_HIGH_IDX, 0);
|
||||
set_wqe_32bit_value(wqe->wqe_words,
|
||||
NES_IWARP_SQ_FMR_WQE_MR_STAG_IDX,
|
||||
ib_wr->wr.fast_reg.rkey);
|
||||
@ -3724,7 +3726,7 @@ static int nes_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry)
|
||||
entry->opcode = IB_WC_SEND;
|
||||
break;
|
||||
case NES_IWARP_SQ_OP_LOCINV:
|
||||
entry->opcode = IB_WR_LOCAL_INV;
|
||||
entry->opcode = IB_WC_LOCAL_INV;
|
||||
break;
|
||||
case NES_IWARP_SQ_OP_FAST_REG:
|
||||
entry->opcode = IB_WC_FAST_REG_MR;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
|
@ -2105,7 +2105,7 @@ static void alloc_dummy_hdrq(struct qib_devdata *dd)
|
||||
dd->cspec->dummy_hdrq = dma_alloc_coherent(&dd->pcidev->dev,
|
||||
dd->rcd[0]->rcvhdrq_size,
|
||||
&dd->cspec->dummy_hdrq_phys,
|
||||
GFP_KERNEL | __GFP_COMP);
|
||||
GFP_ATOMIC | __GFP_COMP);
|
||||
if (!dd->cspec->dummy_hdrq) {
|
||||
qib_devinfo(dd->pcidev, "Couldn't allocate dummy hdrq\n");
|
||||
/* fallback to just 0'ing */
|
||||
|
@ -560,7 +560,7 @@ static int qib_tune_pcie_coalesce(struct qib_devdata *dd)
|
||||
* BIOS may not set PCIe bus-utilization parameters for best performance.
|
||||
* Check and optionally adjust them to maximize our throughput.
|
||||
*/
|
||||
static int qib_pcie_caps = 0x51;
|
||||
static int qib_pcie_caps;
|
||||
module_param_named(pcie_caps, qib_pcie_caps, int, S_IRUGO);
|
||||
MODULE_PARM_DESC(pcie_caps, "Max PCIe tuning: Payload (0..3), ReadReq (4..7)");
|
||||
|
||||
|
@ -1279,3 +1279,4 @@ static struct usb_driver go7007_usb_driver = {
|
||||
};
|
||||
|
||||
module_usb_driver(go7007_usb_driver);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -641,10 +641,10 @@ static int __cap_is_valid(struct ceph_cap *cap)
|
||||
unsigned long ttl;
|
||||
u32 gen;
|
||||
|
||||
spin_lock(&cap->session->s_cap_lock);
|
||||
spin_lock(&cap->session->s_gen_ttl_lock);
|
||||
gen = cap->session->s_cap_gen;
|
||||
ttl = cap->session->s_cap_ttl;
|
||||
spin_unlock(&cap->session->s_cap_lock);
|
||||
spin_unlock(&cap->session->s_gen_ttl_lock);
|
||||
|
||||
if (cap->cap_gen < gen || time_after_eq(jiffies, ttl)) {
|
||||
dout("__cap_is_valid %p cap %p issued %s "
|
||||
|
@ -975,10 +975,10 @@ static int dentry_lease_is_valid(struct dentry *dentry)
|
||||
di = ceph_dentry(dentry);
|
||||
if (di->lease_session) {
|
||||
s = di->lease_session;
|
||||
spin_lock(&s->s_cap_lock);
|
||||
spin_lock(&s->s_gen_ttl_lock);
|
||||
gen = s->s_cap_gen;
|
||||
ttl = s->s_cap_ttl;
|
||||
spin_unlock(&s->s_cap_lock);
|
||||
spin_unlock(&s->s_gen_ttl_lock);
|
||||
|
||||
if (di->lease_gen == gen &&
|
||||
time_before(jiffies, dentry->d_time) &&
|
||||
|
@ -262,6 +262,7 @@ static int parse_reply_info(struct ceph_msg *msg,
|
||||
/* trace */
|
||||
ceph_decode_32_safe(&p, end, len, bad);
|
||||
if (len > 0) {
|
||||
ceph_decode_need(&p, end, len, bad);
|
||||
err = parse_reply_info_trace(&p, p+len, info, features);
|
||||
if (err < 0)
|
||||
goto out_bad;
|
||||
@ -270,6 +271,7 @@ static int parse_reply_info(struct ceph_msg *msg,
|
||||
/* extra */
|
||||
ceph_decode_32_safe(&p, end, len, bad);
|
||||
if (len > 0) {
|
||||
ceph_decode_need(&p, end, len, bad);
|
||||
err = parse_reply_info_extra(&p, p+len, info, features);
|
||||
if (err < 0)
|
||||
goto out_bad;
|
||||
@ -398,9 +400,11 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc,
|
||||
s->s_con.peer_name.type = CEPH_ENTITY_TYPE_MDS;
|
||||
s->s_con.peer_name.num = cpu_to_le64(mds);
|
||||
|
||||
spin_lock_init(&s->s_cap_lock);
|
||||
spin_lock_init(&s->s_gen_ttl_lock);
|
||||
s->s_cap_gen = 0;
|
||||
s->s_cap_ttl = 0;
|
||||
|
||||
spin_lock_init(&s->s_cap_lock);
|
||||
s->s_renew_requested = 0;
|
||||
s->s_renew_seq = 0;
|
||||
INIT_LIST_HEAD(&s->s_caps);
|
||||
@ -2326,10 +2330,10 @@ static void handle_session(struct ceph_mds_session *session,
|
||||
case CEPH_SESSION_STALE:
|
||||
pr_info("mds%d caps went stale, renewing\n",
|
||||
session->s_mds);
|
||||
spin_lock(&session->s_cap_lock);
|
||||
spin_lock(&session->s_gen_ttl_lock);
|
||||
session->s_cap_gen++;
|
||||
session->s_cap_ttl = 0;
|
||||
spin_unlock(&session->s_cap_lock);
|
||||
spin_unlock(&session->s_gen_ttl_lock);
|
||||
send_renew_caps(mdsc, session);
|
||||
break;
|
||||
|
||||
|
@ -117,10 +117,13 @@ struct ceph_mds_session {
|
||||
void *s_authorizer_buf, *s_authorizer_reply_buf;
|
||||
size_t s_authorizer_buf_len, s_authorizer_reply_buf_len;
|
||||
|
||||
/* protected by s_cap_lock */
|
||||
spinlock_t s_cap_lock;
|
||||
/* protected by s_gen_ttl_lock */
|
||||
spinlock_t s_gen_ttl_lock;
|
||||
u32 s_cap_gen; /* inc each time we get mds stale msg */
|
||||
unsigned long s_cap_ttl; /* when session caps expire */
|
||||
|
||||
/* protected by s_cap_lock */
|
||||
spinlock_t s_cap_lock;
|
||||
struct list_head s_caps; /* all caps issued by this session */
|
||||
int s_nr_caps, s_trim_caps;
|
||||
int s_num_cap_releases;
|
||||
|
@ -111,8 +111,10 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val,
|
||||
}
|
||||
|
||||
static struct ceph_vxattr_cb ceph_file_vxattrs[] = {
|
||||
{ true, "ceph.file.layout", ceph_vxattrcb_layout},
|
||||
/* The following extended attribute name is deprecated */
|
||||
{ true, "ceph.layout", ceph_vxattrcb_layout},
|
||||
{ NULL, NULL }
|
||||
{ true, NULL, NULL }
|
||||
};
|
||||
|
||||
static struct ceph_vxattr_cb *ceph_inode_vxattrs(struct inode *inode)
|
||||
|
@ -152,9 +152,6 @@ static struct page *logfs_mtd_find_first_sb(struct super_block *sb, u64 *ofs)
|
||||
filler_t *filler = logfs_mtd_readpage;
|
||||
struct mtd_info *mtd = super->s_mtd;
|
||||
|
||||
if (!mtd_can_have_bb(mtd))
|
||||
return NULL;
|
||||
|
||||
*ofs = 0;
|
||||
while (mtd_block_isbad(mtd, *ofs)) {
|
||||
*ofs += mtd->erasesize;
|
||||
@ -172,9 +169,6 @@ static struct page *logfs_mtd_find_last_sb(struct super_block *sb, u64 *ofs)
|
||||
filler_t *filler = logfs_mtd_readpage;
|
||||
struct mtd_info *mtd = super->s_mtd;
|
||||
|
||||
if (!mtd_can_have_bb(mtd))
|
||||
return NULL;
|
||||
|
||||
*ofs = mtd->size - mtd->erasesize;
|
||||
while (mtd_block_isbad(mtd, *ofs)) {
|
||||
*ofs -= mtd->erasesize;
|
||||
|
@ -3621,8 +3621,8 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu
|
||||
}
|
||||
if (npages > 1) {
|
||||
/* for decoding across pages */
|
||||
args.acl_scratch = alloc_page(GFP_KERNEL);
|
||||
if (!args.acl_scratch)
|
||||
res.acl_scratch = alloc_page(GFP_KERNEL);
|
||||
if (!res.acl_scratch)
|
||||
goto out_free;
|
||||
}
|
||||
args.acl_len = npages * PAGE_SIZE;
|
||||
@ -3658,8 +3658,8 @@ out_free:
|
||||
for (i = 0; i < npages; i++)
|
||||
if (pages[i])
|
||||
__free_page(pages[i]);
|
||||
if (args.acl_scratch)
|
||||
__free_page(args.acl_scratch);
|
||||
if (res.acl_scratch)
|
||||
__free_page(res.acl_scratch);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -5104,37 +5104,53 @@ int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo)
|
||||
return status;
|
||||
}
|
||||
|
||||
static struct nfs4_slot *nfs4_alloc_slots(u32 max_slots, gfp_t gfp_flags)
|
||||
{
|
||||
return kcalloc(max_slots, sizeof(struct nfs4_slot), gfp_flags);
|
||||
}
|
||||
|
||||
static void nfs4_add_and_init_slots(struct nfs4_slot_table *tbl,
|
||||
struct nfs4_slot *new,
|
||||
u32 max_slots,
|
||||
u32 ivalue)
|
||||
{
|
||||
struct nfs4_slot *old = NULL;
|
||||
u32 i;
|
||||
|
||||
spin_lock(&tbl->slot_tbl_lock);
|
||||
if (new) {
|
||||
old = tbl->slots;
|
||||
tbl->slots = new;
|
||||
tbl->max_slots = max_slots;
|
||||
}
|
||||
tbl->highest_used_slotid = -1; /* no slot is currently used */
|
||||
for (i = 0; i < tbl->max_slots; i++)
|
||||
tbl->slots[i].seq_nr = ivalue;
|
||||
spin_unlock(&tbl->slot_tbl_lock);
|
||||
kfree(old);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset a slot table
|
||||
* (re)Initialise a slot table
|
||||
*/
|
||||
static int nfs4_reset_slot_table(struct nfs4_slot_table *tbl, u32 max_reqs,
|
||||
int ivalue)
|
||||
static int nfs4_realloc_slot_table(struct nfs4_slot_table *tbl, u32 max_reqs,
|
||||
u32 ivalue)
|
||||
{
|
||||
struct nfs4_slot *new = NULL;
|
||||
int i;
|
||||
int ret = 0;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
dprintk("--> %s: max_reqs=%u, tbl->max_slots %d\n", __func__,
|
||||
max_reqs, tbl->max_slots);
|
||||
|
||||
/* Does the newly negotiated max_reqs match the existing slot table? */
|
||||
if (max_reqs != tbl->max_slots) {
|
||||
ret = -ENOMEM;
|
||||
new = kmalloc(max_reqs * sizeof(struct nfs4_slot),
|
||||
GFP_NOFS);
|
||||
new = nfs4_alloc_slots(max_reqs, GFP_NOFS);
|
||||
if (!new)
|
||||
goto out;
|
||||
ret = 0;
|
||||
kfree(tbl->slots);
|
||||
}
|
||||
spin_lock(&tbl->slot_tbl_lock);
|
||||
if (new) {
|
||||
tbl->slots = new;
|
||||
tbl->max_slots = max_reqs;
|
||||
}
|
||||
for (i = 0; i < tbl->max_slots; ++i)
|
||||
tbl->slots[i].seq_nr = ivalue;
|
||||
spin_unlock(&tbl->slot_tbl_lock);
|
||||
ret = 0;
|
||||
|
||||
nfs4_add_and_init_slots(tbl, new, max_reqs, ivalue);
|
||||
dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__,
|
||||
tbl, tbl->slots, tbl->max_slots);
|
||||
out:
|
||||
@ -5156,36 +5172,6 @@ static void nfs4_destroy_slot_tables(struct nfs4_session *session)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize slot table
|
||||
*/
|
||||
static int nfs4_init_slot_table(struct nfs4_slot_table *tbl,
|
||||
int max_slots, int ivalue)
|
||||
{
|
||||
struct nfs4_slot *slot;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
BUG_ON(max_slots > NFS4_MAX_SLOT_TABLE);
|
||||
|
||||
dprintk("--> %s: max_reqs=%u\n", __func__, max_slots);
|
||||
|
||||
slot = kcalloc(max_slots, sizeof(struct nfs4_slot), GFP_NOFS);
|
||||
if (!slot)
|
||||
goto out;
|
||||
ret = 0;
|
||||
|
||||
spin_lock(&tbl->slot_tbl_lock);
|
||||
tbl->max_slots = max_slots;
|
||||
tbl->slots = slot;
|
||||
tbl->highest_used_slotid = NFS4_NO_SLOT; /* no slot is currently used */
|
||||
spin_unlock(&tbl->slot_tbl_lock);
|
||||
dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__,
|
||||
tbl, tbl->slots, tbl->max_slots);
|
||||
out:
|
||||
dprintk("<-- %s: return %d\n", __func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize or reset the forechannel and backchannel tables
|
||||
*/
|
||||
@ -5197,25 +5183,16 @@ static int nfs4_setup_session_slot_tables(struct nfs4_session *ses)
|
||||
dprintk("--> %s\n", __func__);
|
||||
/* Fore channel */
|
||||
tbl = &ses->fc_slot_table;
|
||||
if (tbl->slots == NULL) {
|
||||
status = nfs4_init_slot_table(tbl, ses->fc_attrs.max_reqs, 1);
|
||||
if (status) /* -ENOMEM */
|
||||
return status;
|
||||
} else {
|
||||
status = nfs4_reset_slot_table(tbl, ses->fc_attrs.max_reqs, 1);
|
||||
if (status)
|
||||
return status;
|
||||
}
|
||||
status = nfs4_realloc_slot_table(tbl, ses->fc_attrs.max_reqs, 1);
|
||||
if (status) /* -ENOMEM */
|
||||
return status;
|
||||
/* Back channel */
|
||||
tbl = &ses->bc_slot_table;
|
||||
if (tbl->slots == NULL) {
|
||||
status = nfs4_init_slot_table(tbl, ses->bc_attrs.max_reqs, 0);
|
||||
if (status)
|
||||
/* Fore and back channel share a connection so get
|
||||
* both slot tables or neither */
|
||||
nfs4_destroy_slot_tables(ses);
|
||||
} else
|
||||
status = nfs4_reset_slot_table(tbl, ses->bc_attrs.max_reqs, 0);
|
||||
status = nfs4_realloc_slot_table(tbl, ses->bc_attrs.max_reqs, 0);
|
||||
if (status && tbl->slots == NULL)
|
||||
/* Fore and back channel share a connection so get
|
||||
* both slot tables or neither */
|
||||
nfs4_destroy_slot_tables(ses);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -1106,6 +1106,8 @@ void nfs4_schedule_stateid_recovery(const struct nfs_server *server, struct nfs4
|
||||
{
|
||||
struct nfs_client *clp = server->nfs_client;
|
||||
|
||||
if (test_and_clear_bit(NFS_DELEGATED_STATE, &state->flags))
|
||||
nfs_async_inode_return_delegation(state->inode, &state->stateid);
|
||||
nfs4_state_mark_reclaim_nograce(clp, state);
|
||||
nfs4_schedule_state_manager(clp);
|
||||
}
|
||||
|
@ -2563,7 +2563,6 @@ static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr,
|
||||
|
||||
xdr_inline_pages(&req->rq_rcv_buf, replen << 2,
|
||||
args->acl_pages, args->acl_pgbase, args->acl_len);
|
||||
xdr_set_scratch_buffer(xdr, page_address(args->acl_scratch), PAGE_SIZE);
|
||||
|
||||
encode_nops(&hdr);
|
||||
}
|
||||
@ -6132,6 +6131,10 @@ nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
||||
struct compound_hdr hdr;
|
||||
int status;
|
||||
|
||||
if (res->acl_scratch != NULL) {
|
||||
void *p = page_address(res->acl_scratch);
|
||||
xdr_set_scratch_buffer(xdr, p, PAGE_SIZE);
|
||||
}
|
||||
status = decode_compound_hdr(xdr, &hdr);
|
||||
if (status)
|
||||
goto out;
|
||||
|
130
fs/proc/base.c
130
fs/proc/base.c
@ -198,26 +198,6 @@ static int proc_root_link(struct dentry *dentry, struct path *path)
|
||||
return result;
|
||||
}
|
||||
|
||||
static struct mm_struct *mm_access(struct task_struct *task, unsigned int mode)
|
||||
{
|
||||
struct mm_struct *mm;
|
||||
int err;
|
||||
|
||||
err = mutex_lock_killable(&task->signal->cred_guard_mutex);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
mm = get_task_mm(task);
|
||||
if (mm && mm != current->mm &&
|
||||
!ptrace_may_access(task, mode)) {
|
||||
mmput(mm);
|
||||
mm = ERR_PTR(-EACCES);
|
||||
}
|
||||
mutex_unlock(&task->signal->cred_guard_mutex);
|
||||
|
||||
return mm;
|
||||
}
|
||||
|
||||
struct mm_struct *mm_for_maps(struct task_struct *task)
|
||||
{
|
||||
return mm_access(task, PTRACE_MODE_READ);
|
||||
@ -711,6 +691,13 @@ static int mem_open(struct inode* inode, struct file* file)
|
||||
if (IS_ERR(mm))
|
||||
return PTR_ERR(mm);
|
||||
|
||||
if (mm) {
|
||||
/* ensure this mm_struct can't be freed */
|
||||
atomic_inc(&mm->mm_count);
|
||||
/* but do not pin its memory */
|
||||
mmput(mm);
|
||||
}
|
||||
|
||||
/* OK to pass negative loff_t, we can catch out-of-range */
|
||||
file->f_mode |= FMODE_UNSIGNED_OFFSET;
|
||||
file->private_data = mm;
|
||||
@ -718,57 +705,13 @@ static int mem_open(struct inode* inode, struct file* file)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t mem_read(struct file * file, char __user * buf,
|
||||
size_t count, loff_t *ppos)
|
||||
static ssize_t mem_rw(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos, int write)
|
||||
{
|
||||
int ret;
|
||||
char *page;
|
||||
unsigned long src = *ppos;
|
||||
struct mm_struct *mm = file->private_data;
|
||||
|
||||
if (!mm)
|
||||
return 0;
|
||||
|
||||
page = (char *)__get_free_page(GFP_TEMPORARY);
|
||||
if (!page)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = 0;
|
||||
|
||||
while (count > 0) {
|
||||
int this_len, retval;
|
||||
|
||||
this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
|
||||
retval = access_remote_vm(mm, src, page, this_len, 0);
|
||||
if (!retval) {
|
||||
if (!ret)
|
||||
ret = -EIO;
|
||||
break;
|
||||
}
|
||||
|
||||
if (copy_to_user(buf, page, retval)) {
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
ret += retval;
|
||||
src += retval;
|
||||
buf += retval;
|
||||
count -= retval;
|
||||
}
|
||||
*ppos = src;
|
||||
|
||||
free_page((unsigned long) page);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t mem_write(struct file * file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
int copied;
|
||||
unsigned long addr = *ppos;
|
||||
ssize_t copied;
|
||||
char *page;
|
||||
unsigned long dst = *ppos;
|
||||
struct mm_struct *mm = file->private_data;
|
||||
|
||||
if (!mm)
|
||||
return 0;
|
||||
@ -778,31 +721,54 @@ static ssize_t mem_write(struct file * file, const char __user *buf,
|
||||
return -ENOMEM;
|
||||
|
||||
copied = 0;
|
||||
while (count > 0) {
|
||||
int this_len, retval;
|
||||
if (!atomic_inc_not_zero(&mm->mm_users))
|
||||
goto free;
|
||||
|
||||
this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
|
||||
if (copy_from_user(page, buf, this_len)) {
|
||||
while (count > 0) {
|
||||
int this_len = min_t(int, count, PAGE_SIZE);
|
||||
|
||||
if (write && copy_from_user(page, buf, this_len)) {
|
||||
copied = -EFAULT;
|
||||
break;
|
||||
}
|
||||
retval = access_remote_vm(mm, dst, page, this_len, 1);
|
||||
if (!retval) {
|
||||
|
||||
this_len = access_remote_vm(mm, addr, page, this_len, write);
|
||||
if (!this_len) {
|
||||
if (!copied)
|
||||
copied = -EIO;
|
||||
break;
|
||||
}
|
||||
copied += retval;
|
||||
buf += retval;
|
||||
dst += retval;
|
||||
count -= retval;
|
||||
}
|
||||
*ppos = dst;
|
||||
|
||||
if (!write && copy_to_user(buf, page, this_len)) {
|
||||
copied = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
buf += this_len;
|
||||
addr += this_len;
|
||||
copied += this_len;
|
||||
count -= this_len;
|
||||
}
|
||||
*ppos = addr;
|
||||
|
||||
mmput(mm);
|
||||
free:
|
||||
free_page((unsigned long) page);
|
||||
return copied;
|
||||
}
|
||||
|
||||
static ssize_t mem_read(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
return mem_rw(file, buf, count, ppos, 0);
|
||||
}
|
||||
|
||||
static ssize_t mem_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
return mem_rw(file, (char __user*)buf, count, ppos, 1);
|
||||
}
|
||||
|
||||
loff_t mem_lseek(struct file *file, loff_t offset, int orig)
|
||||
{
|
||||
switch (orig) {
|
||||
@ -822,8 +788,8 @@ loff_t mem_lseek(struct file *file, loff_t offset, int orig)
|
||||
static int mem_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct mm_struct *mm = file->private_data;
|
||||
|
||||
mmput(mm);
|
||||
if (mm)
|
||||
mmdrop(mm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
0
include/linux/lp8727.h
Executable file → Normal file
0
include/linux/lp8727.h
Executable file → Normal file
@ -57,8 +57,6 @@ struct gcry_mpi {
|
||||
|
||||
typedef struct gcry_mpi *MPI;
|
||||
|
||||
#define MPI_NULL NULL
|
||||
|
||||
#define mpi_get_nlimbs(a) ((a)->nlimbs)
|
||||
#define mpi_is_neg(a) ((a)->sign)
|
||||
|
||||
|
@ -489,7 +489,7 @@ static inline int mtd_has_oob(const struct mtd_info *mtd)
|
||||
|
||||
static inline int mtd_can_have_bb(const struct mtd_info *mtd)
|
||||
{
|
||||
return 0;
|
||||
return !!mtd->block_isbad;
|
||||
}
|
||||
|
||||
/* Kernel-side ioctl definitions */
|
||||
|
@ -614,7 +614,6 @@ struct nfs_getaclargs {
|
||||
size_t acl_len;
|
||||
unsigned int acl_pgbase;
|
||||
struct page ** acl_pages;
|
||||
struct page * acl_scratch;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
@ -624,6 +623,7 @@ struct nfs_getaclres {
|
||||
size_t acl_len;
|
||||
size_t acl_data_offset;
|
||||
int acl_flags;
|
||||
struct page * acl_scratch;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
|
@ -587,6 +587,7 @@ struct hw_perf_event {
|
||||
u64 sample_period;
|
||||
u64 last_period;
|
||||
local64_t period_left;
|
||||
u64 interrupts_seq;
|
||||
u64 interrupts;
|
||||
|
||||
u64 freq_time_stamp;
|
||||
|
@ -2259,6 +2259,12 @@ static inline void mmdrop(struct mm_struct * mm)
|
||||
extern void mmput(struct mm_struct *);
|
||||
/* Grab a reference to a task's mm, if it is not already going away */
|
||||
extern struct mm_struct *get_task_mm(struct task_struct *task);
|
||||
/*
|
||||
* Grab a reference to a task's mm, if it is not already going away
|
||||
* and ptrace_may_access with the mode parameter passed to it
|
||||
* succeeds.
|
||||
*/
|
||||
extern struct mm_struct *mm_access(struct task_struct *task, unsigned int mode);
|
||||
/* Remove the current tasks stale references to the old mm_struct */
|
||||
extern void mm_release(struct task_struct *, struct mm_struct *);
|
||||
/* Allocate a new mm structure and copy contents from tsk->mm */
|
||||
|
@ -417,6 +417,7 @@ static inline int __snd_bug_on(int cond)
|
||||
#define gameport_get_port_data(gp) (gp)->port_data
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
/* PCI quirk list helper */
|
||||
struct snd_pci_quirk {
|
||||
unsigned short subvendor; /* PCI subvendor ID */
|
||||
@ -456,5 +457,6 @@ snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list);
|
||||
const struct snd_pci_quirk *
|
||||
snd_pci_quirk_lookup_id(u16 vendor, u16 device,
|
||||
const struct snd_pci_quirk *list);
|
||||
#endif
|
||||
|
||||
#endif /* __SOUND_CORE_H */
|
||||
|
@ -2300,6 +2300,9 @@ do { \
|
||||
return div64_u64(dividend, divisor);
|
||||
}
|
||||
|
||||
static DEFINE_PER_CPU(int, perf_throttled_count);
|
||||
static DEFINE_PER_CPU(u64, perf_throttled_seq);
|
||||
|
||||
static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count)
|
||||
{
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
@ -2325,16 +2328,29 @@ static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count)
|
||||
}
|
||||
}
|
||||
|
||||
static void perf_ctx_adjust_freq(struct perf_event_context *ctx, u64 period)
|
||||
/*
|
||||
* combine freq adjustment with unthrottling to avoid two passes over the
|
||||
* events. At the same time, make sure, having freq events does not change
|
||||
* the rate of unthrottling as that would introduce bias.
|
||||
*/
|
||||
static void perf_adjust_freq_unthr_context(struct perf_event_context *ctx,
|
||||
int needs_unthr)
|
||||
{
|
||||
struct perf_event *event;
|
||||
struct hw_perf_event *hwc;
|
||||
u64 interrupts, now;
|
||||
u64 now, period = TICK_NSEC;
|
||||
s64 delta;
|
||||
|
||||
if (!ctx->nr_freq)
|
||||
/*
|
||||
* only need to iterate over all events iff:
|
||||
* - context have events in frequency mode (needs freq adjust)
|
||||
* - there are events to unthrottle on this cpu
|
||||
*/
|
||||
if (!(ctx->nr_freq || needs_unthr))
|
||||
return;
|
||||
|
||||
raw_spin_lock(&ctx->lock);
|
||||
|
||||
list_for_each_entry_rcu(event, &ctx->event_list, event_entry) {
|
||||
if (event->state != PERF_EVENT_STATE_ACTIVE)
|
||||
continue;
|
||||
@ -2344,13 +2360,8 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx, u64 period)
|
||||
|
||||
hwc = &event->hw;
|
||||
|
||||
interrupts = hwc->interrupts;
|
||||
hwc->interrupts = 0;
|
||||
|
||||
/*
|
||||
* unthrottle events on the tick
|
||||
*/
|
||||
if (interrupts == MAX_INTERRUPTS) {
|
||||
if (needs_unthr && hwc->interrupts == MAX_INTERRUPTS) {
|
||||
hwc->interrupts = 0;
|
||||
perf_log_throttle(event, 1);
|
||||
event->pmu->start(event, 0);
|
||||
}
|
||||
@ -2358,14 +2369,26 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx, u64 period)
|
||||
if (!event->attr.freq || !event->attr.sample_freq)
|
||||
continue;
|
||||
|
||||
event->pmu->read(event);
|
||||
/*
|
||||
* stop the event and update event->count
|
||||
*/
|
||||
event->pmu->stop(event, PERF_EF_UPDATE);
|
||||
|
||||
now = local64_read(&event->count);
|
||||
delta = now - hwc->freq_count_stamp;
|
||||
hwc->freq_count_stamp = now;
|
||||
|
||||
/*
|
||||
* restart the event
|
||||
* reload only if value has changed
|
||||
*/
|
||||
if (delta > 0)
|
||||
perf_adjust_period(event, period, delta);
|
||||
|
||||
event->pmu->start(event, delta > 0 ? PERF_EF_RELOAD : 0);
|
||||
}
|
||||
|
||||
raw_spin_unlock(&ctx->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2388,16 +2411,13 @@ static void rotate_ctx(struct perf_event_context *ctx)
|
||||
*/
|
||||
static void perf_rotate_context(struct perf_cpu_context *cpuctx)
|
||||
{
|
||||
u64 interval = (u64)cpuctx->jiffies_interval * TICK_NSEC;
|
||||
struct perf_event_context *ctx = NULL;
|
||||
int rotate = 0, remove = 1, freq = 0;
|
||||
int rotate = 0, remove = 1;
|
||||
|
||||
if (cpuctx->ctx.nr_events) {
|
||||
remove = 0;
|
||||
if (cpuctx->ctx.nr_events != cpuctx->ctx.nr_active)
|
||||
rotate = 1;
|
||||
if (cpuctx->ctx.nr_freq)
|
||||
freq = 1;
|
||||
}
|
||||
|
||||
ctx = cpuctx->task_ctx;
|
||||
@ -2405,37 +2425,26 @@ static void perf_rotate_context(struct perf_cpu_context *cpuctx)
|
||||
remove = 0;
|
||||
if (ctx->nr_events != ctx->nr_active)
|
||||
rotate = 1;
|
||||
if (ctx->nr_freq)
|
||||
freq = 1;
|
||||
}
|
||||
|
||||
if (!rotate && !freq)
|
||||
if (!rotate)
|
||||
goto done;
|
||||
|
||||
perf_ctx_lock(cpuctx, cpuctx->task_ctx);
|
||||
perf_pmu_disable(cpuctx->ctx.pmu);
|
||||
|
||||
if (freq) {
|
||||
perf_ctx_adjust_freq(&cpuctx->ctx, interval);
|
||||
if (ctx)
|
||||
perf_ctx_adjust_freq(ctx, interval);
|
||||
}
|
||||
cpu_ctx_sched_out(cpuctx, EVENT_FLEXIBLE);
|
||||
if (ctx)
|
||||
ctx_sched_out(ctx, cpuctx, EVENT_FLEXIBLE);
|
||||
|
||||
if (rotate) {
|
||||
cpu_ctx_sched_out(cpuctx, EVENT_FLEXIBLE);
|
||||
if (ctx)
|
||||
ctx_sched_out(ctx, cpuctx, EVENT_FLEXIBLE);
|
||||
rotate_ctx(&cpuctx->ctx);
|
||||
if (ctx)
|
||||
rotate_ctx(ctx);
|
||||
|
||||
rotate_ctx(&cpuctx->ctx);
|
||||
if (ctx)
|
||||
rotate_ctx(ctx);
|
||||
|
||||
perf_event_sched_in(cpuctx, ctx, current);
|
||||
}
|
||||
perf_event_sched_in(cpuctx, ctx, current);
|
||||
|
||||
perf_pmu_enable(cpuctx->ctx.pmu);
|
||||
perf_ctx_unlock(cpuctx, cpuctx->task_ctx);
|
||||
|
||||
done:
|
||||
if (remove)
|
||||
list_del_init(&cpuctx->rotation_list);
|
||||
@ -2445,10 +2454,22 @@ void perf_event_task_tick(void)
|
||||
{
|
||||
struct list_head *head = &__get_cpu_var(rotation_list);
|
||||
struct perf_cpu_context *cpuctx, *tmp;
|
||||
struct perf_event_context *ctx;
|
||||
int throttled;
|
||||
|
||||
WARN_ON(!irqs_disabled());
|
||||
|
||||
__this_cpu_inc(perf_throttled_seq);
|
||||
throttled = __this_cpu_xchg(perf_throttled_count, 0);
|
||||
|
||||
list_for_each_entry_safe(cpuctx, tmp, head, rotation_list) {
|
||||
ctx = &cpuctx->ctx;
|
||||
perf_adjust_freq_unthr_context(ctx, throttled);
|
||||
|
||||
ctx = cpuctx->task_ctx;
|
||||
if (ctx)
|
||||
perf_adjust_freq_unthr_context(ctx, throttled);
|
||||
|
||||
if (cpuctx->jiffies_interval == 1 ||
|
||||
!(jiffies % cpuctx->jiffies_interval))
|
||||
perf_rotate_context(cpuctx);
|
||||
@ -4509,6 +4530,7 @@ static int __perf_event_overflow(struct perf_event *event,
|
||||
{
|
||||
int events = atomic_read(&event->event_limit);
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
u64 seq;
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
@ -4518,14 +4540,20 @@ static int __perf_event_overflow(struct perf_event *event,
|
||||
if (unlikely(!is_sampling_event(event)))
|
||||
return 0;
|
||||
|
||||
if (unlikely(hwc->interrupts >= max_samples_per_tick)) {
|
||||
if (throttle) {
|
||||
seq = __this_cpu_read(perf_throttled_seq);
|
||||
if (seq != hwc->interrupts_seq) {
|
||||
hwc->interrupts_seq = seq;
|
||||
hwc->interrupts = 1;
|
||||
} else {
|
||||
hwc->interrupts++;
|
||||
if (unlikely(throttle
|
||||
&& hwc->interrupts >= max_samples_per_tick)) {
|
||||
__this_cpu_inc(perf_throttled_count);
|
||||
hwc->interrupts = MAX_INTERRUPTS;
|
||||
perf_log_throttle(event, 0);
|
||||
ret = 1;
|
||||
}
|
||||
} else
|
||||
hwc->interrupts++;
|
||||
}
|
||||
|
||||
if (event->attr.freq) {
|
||||
u64 now = perf_clock();
|
||||
|
@ -1038,6 +1038,22 @@ void do_exit(long code)
|
||||
if (tsk->nr_dirtied)
|
||||
__this_cpu_add(dirty_throttle_leaks, tsk->nr_dirtied);
|
||||
exit_rcu();
|
||||
|
||||
/*
|
||||
* The setting of TASK_RUNNING by try_to_wake_up() may be delayed
|
||||
* when the following two conditions become true.
|
||||
* - There is race condition of mmap_sem (It is acquired by
|
||||
* exit_mm()), and
|
||||
* - SMI occurs before setting TASK_RUNINNG.
|
||||
* (or hypervisor of virtual machine switches to other guest)
|
||||
* As a result, we may become TASK_RUNNING after becoming TASK_DEAD
|
||||
*
|
||||
* To avoid it, we have to wait for releasing tsk->pi_lock which
|
||||
* is held by try_to_wake_up()
|
||||
*/
|
||||
smp_mb();
|
||||
raw_spin_unlock_wait(&tsk->pi_lock);
|
||||
|
||||
/* causes final put_task_struct in finish_task_switch(). */
|
||||
tsk->state = TASK_DEAD;
|
||||
tsk->flags |= PF_NOFREEZE; /* tell freezer to ignore us */
|
||||
|
@ -647,6 +647,26 @@ struct mm_struct *get_task_mm(struct task_struct *task)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_task_mm);
|
||||
|
||||
struct mm_struct *mm_access(struct task_struct *task, unsigned int mode)
|
||||
{
|
||||
struct mm_struct *mm;
|
||||
int err;
|
||||
|
||||
err = mutex_lock_killable(&task->signal->cred_guard_mutex);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
mm = get_task_mm(task);
|
||||
if (mm && mm != current->mm &&
|
||||
!ptrace_may_access(task, mode)) {
|
||||
mmput(mm);
|
||||
mm = ERR_PTR(-EACCES);
|
||||
}
|
||||
mutex_unlock(&task->signal->cred_guard_mutex);
|
||||
|
||||
return mm;
|
||||
}
|
||||
|
||||
/* Please note the differences between mmput and mm_release.
|
||||
* mmput is called whenever we stop holding onto a mm_struct,
|
||||
* error success whatever.
|
||||
|
@ -74,6 +74,7 @@
|
||||
|
||||
#include <asm/tlb.h>
|
||||
#include <asm/irq_regs.h>
|
||||
#include <asm/mutex.h>
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
#include <asm/paravirt.h>
|
||||
#endif
|
||||
@ -723,9 +724,6 @@ static void dequeue_task(struct rq *rq, struct task_struct *p, int flags)
|
||||
p->sched_class->dequeue_task(rq, p, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* activate_task - move a task to the runqueue.
|
||||
*/
|
||||
void activate_task(struct rq *rq, struct task_struct *p, int flags)
|
||||
{
|
||||
if (task_contributes_to_load(p))
|
||||
@ -734,9 +732,6 @@ void activate_task(struct rq *rq, struct task_struct *p, int flags)
|
||||
enqueue_task(rq, p, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* deactivate_task - remove a task from the runqueue.
|
||||
*/
|
||||
void deactivate_task(struct rq *rq, struct task_struct *p, int flags)
|
||||
{
|
||||
if (task_contributes_to_load(p))
|
||||
@ -4134,7 +4129,7 @@ recheck:
|
||||
on_rq = p->on_rq;
|
||||
running = task_current(rq, p);
|
||||
if (on_rq)
|
||||
deactivate_task(rq, p, 0);
|
||||
dequeue_task(rq, p, 0);
|
||||
if (running)
|
||||
p->sched_class->put_prev_task(rq, p);
|
||||
|
||||
@ -4147,7 +4142,7 @@ recheck:
|
||||
if (running)
|
||||
p->sched_class->set_curr_task(rq);
|
||||
if (on_rq)
|
||||
activate_task(rq, p, 0);
|
||||
enqueue_task(rq, p, 0);
|
||||
|
||||
check_class_changed(rq, p, prev_class, oldprio);
|
||||
task_rq_unlock(rq, p, &flags);
|
||||
@ -4998,9 +4993,9 @@ static int __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu)
|
||||
* placed properly.
|
||||
*/
|
||||
if (p->on_rq) {
|
||||
deactivate_task(rq_src, p, 0);
|
||||
dequeue_task(rq_src, p, 0);
|
||||
set_task_cpu(p, dest_cpu);
|
||||
activate_task(rq_dest, p, 0);
|
||||
enqueue_task(rq_dest, p, 0);
|
||||
check_preempt_curr(rq_dest, p, 0);
|
||||
}
|
||||
done:
|
||||
@ -7032,10 +7027,10 @@ static void normalize_task(struct rq *rq, struct task_struct *p)
|
||||
|
||||
on_rq = p->on_rq;
|
||||
if (on_rq)
|
||||
deactivate_task(rq, p, 0);
|
||||
dequeue_task(rq, p, 0);
|
||||
__setscheduler(rq, p, SCHED_NORMAL, 0);
|
||||
if (on_rq) {
|
||||
activate_task(rq, p, 0);
|
||||
enqueue_task(rq, p, 0);
|
||||
resched_task(rq->curr);
|
||||
}
|
||||
|
||||
|
@ -4866,6 +4866,15 @@ static void nohz_balancer_kick(int cpu)
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void clear_nohz_tick_stopped(int cpu)
|
||||
{
|
||||
if (unlikely(test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))) {
|
||||
cpumask_clear_cpu(cpu, nohz.idle_cpus_mask);
|
||||
atomic_dec(&nohz.nr_cpus);
|
||||
clear_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu));
|
||||
}
|
||||
}
|
||||
|
||||
static inline void set_cpu_sd_state_busy(void)
|
||||
{
|
||||
struct sched_domain *sd;
|
||||
@ -4904,6 +4913,12 @@ void select_nohz_load_balancer(int stop_tick)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
/*
|
||||
* If this cpu is going down, then nothing needs to be done.
|
||||
*/
|
||||
if (!cpu_active(cpu))
|
||||
return;
|
||||
|
||||
if (stop_tick) {
|
||||
if (test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))
|
||||
return;
|
||||
@ -4914,6 +4929,18 @@ void select_nohz_load_balancer(int stop_tick)
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static int __cpuinit sched_ilb_notifier(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
switch (action & ~CPU_TASKS_FROZEN) {
|
||||
case CPU_DYING:
|
||||
clear_nohz_tick_stopped(smp_processor_id());
|
||||
return NOTIFY_OK;
|
||||
default:
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static DEFINE_SPINLOCK(balancing);
|
||||
@ -5070,11 +5097,7 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
|
||||
* busy tick after returning from idle, we will update the busy stats.
|
||||
*/
|
||||
set_cpu_sd_state_busy();
|
||||
if (unlikely(test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))) {
|
||||
clear_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu));
|
||||
cpumask_clear_cpu(cpu, nohz.idle_cpus_mask);
|
||||
atomic_dec(&nohz.nr_cpus);
|
||||
}
|
||||
clear_nohz_tick_stopped(cpu);
|
||||
|
||||
/*
|
||||
* None are in tickless mode and hence no need for NOHZ idle load
|
||||
@ -5590,6 +5613,7 @@ __init void init_sched_fair_class(void)
|
||||
|
||||
#ifdef CONFIG_NO_HZ
|
||||
zalloc_cpumask_var(&nohz.idle_cpus_mask, GFP_NOWAIT);
|
||||
cpu_notifier(sched_ilb_notifier, 0);
|
||||
#endif
|
||||
#endif /* SMP */
|
||||
|
||||
|
@ -1587,6 +1587,11 @@ static int push_rt_task(struct rq *rq)
|
||||
if (!next_task)
|
||||
return 0;
|
||||
|
||||
#ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW
|
||||
if (unlikely(task_running(rq, next_task)))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
retry:
|
||||
if (unlikely(next_task == rq->curr)) {
|
||||
WARN_ON(1);
|
||||
|
@ -296,7 +296,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
|
||||
if (__this_cpu_read(soft_watchdog_warn) == true)
|
||||
return HRTIMER_RESTART;
|
||||
|
||||
printk(KERN_ERR "BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n",
|
||||
printk(KERN_EMERG "BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n",
|
||||
smp_processor_id(), duration,
|
||||
current->comm, task_pid_nr(current));
|
||||
print_modules();
|
||||
|
@ -279,6 +279,9 @@ config AVERAGE
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config CLZ_TAB
|
||||
bool
|
||||
|
||||
config CORDIC
|
||||
tristate "CORDIC algorithm"
|
||||
help
|
||||
@ -287,6 +290,7 @@ config CORDIC
|
||||
|
||||
config MPILIB
|
||||
tristate
|
||||
select CLZ_TAB
|
||||
help
|
||||
Multiprecision maths library from GnuPG.
|
||||
It is used to implement RSA digital signature verification,
|
||||
|
@ -121,6 +121,8 @@ obj-$(CONFIG_DQL) += dynamic_queue_limits.o
|
||||
obj-$(CONFIG_MPILIB) += mpi/
|
||||
obj-$(CONFIG_SIGNATURE) += digsig.o
|
||||
|
||||
obj-$(CONFIG_CLZ_TAB) += clz_tab.o
|
||||
|
||||
hostprogs-y := gen_crc32table
|
||||
clean-files := crc32table.h
|
||||
|
||||
|
@ -169,7 +169,7 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
|
||||
return BUG_TRAP_TYPE_WARN;
|
||||
}
|
||||
|
||||
printk(KERN_EMERG "------------[ cut here ]------------\n");
|
||||
printk(KERN_DEFAULT "------------[ cut here ]------------\n");
|
||||
|
||||
if (file)
|
||||
printk(KERN_CRIT "kernel BUG at %s:%u!\n",
|
||||
|
18
lib/clz_tab.c
Normal file
18
lib/clz_tab.c
Normal file
@ -0,0 +1,18 @@
|
||||
const unsigned char __clz_tab[] = {
|
||||
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
};
|
52
lib/digsig.c
52
lib/digsig.c
@ -34,14 +34,9 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg,
|
||||
unsigned long msglen,
|
||||
unsigned long modulus_bitlen,
|
||||
unsigned char *out,
|
||||
unsigned long *outlen,
|
||||
int *is_valid)
|
||||
unsigned long *outlen)
|
||||
{
|
||||
unsigned long modulus_len, ps_len, i;
|
||||
int result;
|
||||
|
||||
/* default to invalid packet */
|
||||
*is_valid = 0;
|
||||
|
||||
modulus_len = (modulus_bitlen >> 3) + (modulus_bitlen & 7 ? 1 : 0);
|
||||
|
||||
@ -50,39 +45,30 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg,
|
||||
return -EINVAL;
|
||||
|
||||
/* separate encoded message */
|
||||
if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1)) {
|
||||
result = -EINVAL;
|
||||
goto bail;
|
||||
}
|
||||
if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 2; i < modulus_len - 1; i++)
|
||||
if (msg[i] != 0xFF)
|
||||
break;
|
||||
|
||||
/* separator check */
|
||||
if (msg[i] != 0) {
|
||||
if (msg[i] != 0)
|
||||
/* There was no octet with hexadecimal value 0x00
|
||||
to separate ps from m. */
|
||||
result = -EINVAL;
|
||||
goto bail;
|
||||
}
|
||||
return -EINVAL;
|
||||
|
||||
ps_len = i - 2;
|
||||
|
||||
if (*outlen < (msglen - (2 + ps_len + 1))) {
|
||||
*outlen = msglen - (2 + ps_len + 1);
|
||||
result = -EOVERFLOW;
|
||||
goto bail;
|
||||
return -EOVERFLOW;
|
||||
}
|
||||
|
||||
*outlen = (msglen - (2 + ps_len + 1));
|
||||
memcpy(out, &msg[2 + ps_len + 1], *outlen);
|
||||
|
||||
/* valid packet */
|
||||
*is_valid = 1;
|
||||
result = 0;
|
||||
bail:
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -96,7 +82,7 @@ static int digsig_verify_rsa(struct key *key,
|
||||
unsigned long len;
|
||||
unsigned long mlen, mblen;
|
||||
unsigned nret, l;
|
||||
int valid, head, i;
|
||||
int head, i;
|
||||
unsigned char *out1 = NULL, *out2 = NULL;
|
||||
MPI in = NULL, res = NULL, pkey[2];
|
||||
uint8_t *p, *datap, *endp;
|
||||
@ -105,6 +91,10 @@ static int digsig_verify_rsa(struct key *key,
|
||||
|
||||
down_read(&key->sem);
|
||||
ukp = key->payload.data;
|
||||
|
||||
if (ukp->datalen < sizeof(*pkh))
|
||||
goto err1;
|
||||
|
||||
pkh = (struct pubkey_hdr *)ukp->data;
|
||||
|
||||
if (pkh->version != 1)
|
||||
@ -117,18 +107,23 @@ static int digsig_verify_rsa(struct key *key,
|
||||
goto err1;
|
||||
|
||||
datap = pkh->mpi;
|
||||
endp = datap + ukp->datalen;
|
||||
endp = ukp->data + ukp->datalen;
|
||||
|
||||
err = -ENOMEM;
|
||||
|
||||
for (i = 0; i < pkh->nmpi; i++) {
|
||||
unsigned int remaining = endp - datap;
|
||||
pkey[i] = mpi_read_from_buffer(datap, &remaining);
|
||||
if (!pkey[i])
|
||||
goto err;
|
||||
datap += remaining;
|
||||
}
|
||||
|
||||
mblen = mpi_get_nbits(pkey[0]);
|
||||
mlen = (mblen + 7)/8;
|
||||
|
||||
err = -ENOMEM;
|
||||
if (mlen == 0)
|
||||
goto err;
|
||||
|
||||
out1 = kzalloc(mlen, GFP_KERNEL);
|
||||
if (!out1)
|
||||
@ -167,10 +162,9 @@ static int digsig_verify_rsa(struct key *key,
|
||||
memset(out1, 0, head);
|
||||
memcpy(out1 + head, p, l);
|
||||
|
||||
err = -EINVAL;
|
||||
pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len, &valid);
|
||||
err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len);
|
||||
|
||||
if (valid && len == hlen)
|
||||
if (!err && len == hlen)
|
||||
err = memcmp(out2, h, hlen);
|
||||
|
||||
err:
|
||||
@ -178,8 +172,8 @@ err:
|
||||
mpi_free(res);
|
||||
kfree(out1);
|
||||
kfree(out2);
|
||||
mpi_free(pkey[0]);
|
||||
mpi_free(pkey[1]);
|
||||
while (--i >= 0)
|
||||
mpi_free(pkey[i]);
|
||||
err1:
|
||||
up_read(&key->sem);
|
||||
|
||||
|
@ -1200,18 +1200,40 @@ do { \
|
||||
"r" ((USItype)(v)) \
|
||||
: "%g1", "%g2" __AND_CLOBBER_CC)
|
||||
#define UMUL_TIME 39 /* 39 instructions */
|
||||
#endif
|
||||
#ifndef udiv_qrnnd
|
||||
#ifndef LONGLONG_STANDALONE
|
||||
/* It's quite necessary to add this much assembler for the sparc.
|
||||
The default udiv_qrnnd (in C) is more than 10 times slower! */
|
||||
#define udiv_qrnnd(q, r, n1, n0, d) \
|
||||
do { USItype __r; \
|
||||
(q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \
|
||||
(r) = __r; \
|
||||
} while (0)
|
||||
extern USItype __udiv_qrnnd();
|
||||
#define UDIV_TIME 140
|
||||
#endif /* LONGLONG_STANDALONE */
|
||||
#endif /* udiv_qrnnd */
|
||||
__asm__ ("! Inlined udiv_qrnnd\n\t" \
|
||||
"mov 32,%%g1\n\t" \
|
||||
"subcc %1,%2,%%g0\n\t" \
|
||||
"1: bcs 5f\n\t" \
|
||||
"addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \
|
||||
"sub %1,%2,%1 ! this kills msb of n\n\t" \
|
||||
"addx %1,%1,%1 ! so this can't give carry\n\t" \
|
||||
"subcc %%g1,1,%%g1\n\t" \
|
||||
"2: bne 1b\n\t" \
|
||||
"subcc %1,%2,%%g0\n\t" \
|
||||
"bcs 3f\n\t" \
|
||||
"addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \
|
||||
"b 3f\n\t" \
|
||||
"sub %1,%2,%1 ! this kills msb of n\n\t" \
|
||||
"4: sub %1,%2,%1\n\t" \
|
||||
"5: addxcc %1,%1,%1\n\t" \
|
||||
"bcc 2b\n\t" \
|
||||
"subcc %%g1,1,%%g1\n\t" \
|
||||
"! Got carry from n. Subtract next step to cancel this carry.\n\t" \
|
||||
"bne 4b\n\t" \
|
||||
"addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n\t" \
|
||||
"sub %1,%2,%1\n\t" \
|
||||
"3: xnor %0,0,%0\n\t" \
|
||||
"! End of inline udiv_qrnnd\n" \
|
||||
: "=&r" ((USItype)(q)), \
|
||||
"=&r" ((USItype)(r)) \
|
||||
: "r" ((USItype)(d)), \
|
||||
"1" ((USItype)(n1)), \
|
||||
"0" ((USItype)(n0)) : "%g1", "cc")
|
||||
#define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */
|
||||
#endif
|
||||
#endif /* __sparc__ */
|
||||
|
||||
/***************************************
|
||||
|
@ -21,25 +21,6 @@
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
const unsigned char __clz_tab[] = {
|
||||
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
};
|
||||
|
||||
#define A_LIMB_1 ((mpi_limb_t) 1)
|
||||
|
||||
/****************
|
||||
|
@ -149,6 +149,9 @@ int mpi_tdiv_qr(MPI quot, MPI rem, MPI num, MPI den)
|
||||
mpi_ptr_t marker[5];
|
||||
int markidx = 0;
|
||||
|
||||
if (!dsize)
|
||||
return -EINVAL;
|
||||
|
||||
memset(marker, 0, sizeof(marker));
|
||||
|
||||
/* Ensure space is enough for quotient and remainder.
|
||||
@ -207,6 +210,8 @@ int mpi_tdiv_qr(MPI quot, MPI rem, MPI num, MPI den)
|
||||
* numerator would be gradually overwritten by the quotient limbs. */
|
||||
if (qp == np) { /* Copy NP object to temporary space. */
|
||||
np = marker[markidx++] = mpi_alloc_limb_space(nsize);
|
||||
if (!np)
|
||||
goto nomem;
|
||||
MPN_COPY(np, qp, nsize);
|
||||
}
|
||||
} else /* Put quotient at top of remainder. */
|
||||
|
@ -59,7 +59,7 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
|
||||
ep = exp->d;
|
||||
|
||||
if (!msize)
|
||||
msize = 1 / msize; /* provoke a signal */
|
||||
return -EINVAL;
|
||||
|
||||
if (!esize) {
|
||||
/* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0
|
||||
|
@ -20,78 +20,15 @@
|
||||
|
||||
#include "mpi-internal.h"
|
||||
|
||||
#define DIM(v) (sizeof(v)/sizeof((v)[0]))
|
||||
#define MAX_EXTERN_MPI_BITS 16384
|
||||
|
||||
static uint8_t asn[15] = /* Object ID is 1.3.14.3.2.26 */
|
||||
{ 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03,
|
||||
0x02, 0x1a, 0x05, 0x00, 0x04, 0x14
|
||||
};
|
||||
|
||||
MPI do_encode_md(const void *sha_buffer, unsigned nbits)
|
||||
{
|
||||
int nframe = (nbits + 7) / 8;
|
||||
uint8_t *frame, *fr_pt;
|
||||
int i = 0, n;
|
||||
size_t asnlen = DIM(asn);
|
||||
MPI a = MPI_NULL;
|
||||
|
||||
if (SHA1_DIGEST_LENGTH + asnlen + 4 > nframe)
|
||||
pr_info("MPI: can't encode a %d bit MD into a %d bits frame\n",
|
||||
(int)(SHA1_DIGEST_LENGTH * 8), (int)nbits);
|
||||
|
||||
/* We encode the MD in this way:
|
||||
*
|
||||
* 0 A PAD(n bytes) 0 ASN(asnlen bytes) MD(len bytes)
|
||||
*
|
||||
* PAD consists of FF bytes.
|
||||
*/
|
||||
frame = kmalloc(nframe, GFP_KERNEL);
|
||||
if (!frame)
|
||||
return MPI_NULL;
|
||||
n = 0;
|
||||
frame[n++] = 0;
|
||||
frame[n++] = 1; /* block type */
|
||||
i = nframe - SHA1_DIGEST_LENGTH - asnlen - 3;
|
||||
|
||||
if (i <= 1) {
|
||||
pr_info("MPI: message digest encoding failed\n");
|
||||
kfree(frame);
|
||||
return a;
|
||||
}
|
||||
|
||||
memset(frame + n, 0xff, i);
|
||||
n += i;
|
||||
frame[n++] = 0;
|
||||
memcpy(frame + n, &asn, asnlen);
|
||||
n += asnlen;
|
||||
memcpy(frame + n, sha_buffer, SHA1_DIGEST_LENGTH);
|
||||
n += SHA1_DIGEST_LENGTH;
|
||||
|
||||
i = nframe;
|
||||
fr_pt = frame;
|
||||
|
||||
if (n != nframe) {
|
||||
printk
|
||||
("MPI: message digest encoding failed, frame length is wrong\n");
|
||||
kfree(frame);
|
||||
return a;
|
||||
}
|
||||
|
||||
a = mpi_alloc((nframe + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB);
|
||||
mpi_set_buffer(a, frame, nframe, 0);
|
||||
kfree(frame);
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)
|
||||
{
|
||||
const uint8_t *buffer = xbuffer;
|
||||
int i, j;
|
||||
unsigned nbits, nbytes, nlimbs, nread = 0;
|
||||
mpi_limb_t a;
|
||||
MPI val = MPI_NULL;
|
||||
MPI val = NULL;
|
||||
|
||||
if (*ret_nread < 2)
|
||||
goto leave;
|
||||
@ -108,7 +45,7 @@ MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)
|
||||
nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB;
|
||||
val = mpi_alloc(nlimbs);
|
||||
if (!val)
|
||||
return MPI_NULL;
|
||||
return NULL;
|
||||
i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
|
||||
i %= BYTES_PER_MPI_LIMB;
|
||||
val->nbits = nbits;
|
||||
@ -211,30 +148,6 @@ int mpi_fromstr(MPI val, const char *str)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mpi_fromstr);
|
||||
|
||||
/****************
|
||||
* Special function to get the low 8 bytes from an mpi.
|
||||
* This can be used as a keyid; KEYID is an 2 element array.
|
||||
* Return the low 4 bytes.
|
||||
*/
|
||||
u32 mpi_get_keyid(const MPI a, u32 *keyid)
|
||||
{
|
||||
#if BYTES_PER_MPI_LIMB == 4
|
||||
if (keyid) {
|
||||
keyid[0] = a->nlimbs >= 2 ? a->d[1] : 0;
|
||||
keyid[1] = a->nlimbs >= 1 ? a->d[0] : 0;
|
||||
}
|
||||
return a->nlimbs >= 1 ? a->d[0] : 0;
|
||||
#elif BYTES_PER_MPI_LIMB == 8
|
||||
if (keyid) {
|
||||
keyid[0] = a->nlimbs ? (u32) (a->d[0] >> 32) : 0;
|
||||
keyid[1] = a->nlimbs ? (u32) (a->d[0] & 0xffffffff) : 0;
|
||||
}
|
||||
return a->nlimbs ? (u32) (a->d[0] & 0xffffffff) : 0;
|
||||
#else
|
||||
#error Make this function work with other LIMB sizes
|
||||
#endif
|
||||
}
|
||||
|
||||
/****************
|
||||
* Return an allocated buffer with the MPI (msb first).
|
||||
* NBYTES receives the length of this buffer. Caller must free the
|
||||
|
@ -217,6 +217,10 @@ mpihelp_divrem(mpi_ptr_t qp, mpi_size_t qextra_limbs,
|
||||
case 0:
|
||||
/* We are asked to divide by zero, so go ahead and do it! (To make
|
||||
the compiler not remove this statement, return the value.) */
|
||||
/*
|
||||
* existing clients of this function have been modified
|
||||
* not to call it with dsize == 0, so this should not happen
|
||||
*/
|
||||
return 1 / dsize;
|
||||
|
||||
case 1:
|
||||
|
@ -58,6 +58,9 @@ mpi_ptr_t mpi_alloc_limb_space(unsigned nlimbs)
|
||||
{
|
||||
size_t len = nlimbs * sizeof(mpi_limb_t);
|
||||
|
||||
if (!len)
|
||||
return NULL;
|
||||
|
||||
return kmalloc(len, GFP_KERNEL);
|
||||
}
|
||||
|
||||
@ -135,7 +138,7 @@ int mpi_copy(MPI *copied, const MPI a)
|
||||
size_t i;
|
||||
MPI b;
|
||||
|
||||
*copied = MPI_NULL;
|
||||
*copied = NULL;
|
||||
|
||||
if (a) {
|
||||
b = mpi_alloc(a->nlimbs);
|
||||
|
@ -1036,7 +1036,7 @@ void __ref kmemleak_scan_area(const void *ptr, size_t size, gfp_t gfp)
|
||||
{
|
||||
pr_debug("%s(0x%p)\n", __func__, ptr);
|
||||
|
||||
if (atomic_read(&kmemleak_enabled) && ptr && !IS_ERR(ptr))
|
||||
if (atomic_read(&kmemleak_enabled) && ptr && size && !IS_ERR(ptr))
|
||||
add_scan_area((unsigned long)ptr, size, gfp);
|
||||
else if (atomic_read(&kmemleak_early_log))
|
||||
log_early(KMEMLEAK_SCAN_AREA, ptr, size, 0);
|
||||
@ -1757,6 +1757,7 @@ void __init kmemleak_init(void)
|
||||
|
||||
#ifdef CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF
|
||||
if (!kmemleak_skip_disable) {
|
||||
atomic_set(&kmemleak_early_log, 0);
|
||||
kmemleak_disable();
|
||||
return;
|
||||
}
|
||||
|
@ -298,22 +298,17 @@ static ssize_t process_vm_rw_core(pid_t pid, const struct iovec *lvec,
|
||||
goto free_proc_pages;
|
||||
}
|
||||
|
||||
task_lock(task);
|
||||
if (__ptrace_may_access(task, PTRACE_MODE_ATTACH)) {
|
||||
task_unlock(task);
|
||||
rc = -EPERM;
|
||||
mm = mm_access(task, PTRACE_MODE_ATTACH);
|
||||
if (!mm || IS_ERR(mm)) {
|
||||
rc = IS_ERR(mm) ? PTR_ERR(mm) : -ESRCH;
|
||||
/*
|
||||
* Explicitly map EACCES to EPERM as EPERM is a more a
|
||||
* appropriate error code for process_vw_readv/writev
|
||||
*/
|
||||
if (rc == -EACCES)
|
||||
rc = -EPERM;
|
||||
goto put_task_struct;
|
||||
}
|
||||
mm = task->mm;
|
||||
|
||||
if (!mm || (task->flags & PF_KTHREAD)) {
|
||||
task_unlock(task);
|
||||
rc = -EINVAL;
|
||||
goto put_task_struct;
|
||||
}
|
||||
|
||||
atomic_inc(&mm->mm_users);
|
||||
task_unlock(task);
|
||||
|
||||
for (i = 0; i < riovcnt && iov_l_curr_idx < liovcnt; i++) {
|
||||
rc = process_vm_rw_single_vec(
|
||||
|
@ -85,8 +85,6 @@ int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid)
|
||||
} else {
|
||||
pr_info("client%lld fsid %pU\n", ceph_client_id(client), fsid);
|
||||
memcpy(&client->fsid, fsid, sizeof(*fsid));
|
||||
ceph_debugfs_client_init(client);
|
||||
client->have_fsid = true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -8,8 +8,8 @@
|
||||
|
||||
#include <linux/ceph/mon_client.h>
|
||||
#include <linux/ceph/libceph.h>
|
||||
#include <linux/ceph/debugfs.h>
|
||||
#include <linux/ceph/decode.h>
|
||||
|
||||
#include <linux/ceph/auth.h>
|
||||
|
||||
/*
|
||||
@ -340,8 +340,19 @@ static void ceph_monc_handle_map(struct ceph_mon_client *monc,
|
||||
client->monc.monmap = monmap;
|
||||
kfree(old);
|
||||
|
||||
if (!client->have_fsid) {
|
||||
client->have_fsid = true;
|
||||
mutex_unlock(&monc->mutex);
|
||||
/*
|
||||
* do debugfs initialization without mutex to avoid
|
||||
* creating a locking dependency
|
||||
*/
|
||||
ceph_debugfs_client_init(client);
|
||||
goto out_unlocked;
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&monc->mutex);
|
||||
out_unlocked:
|
||||
wake_up_all(&client->auth_wq);
|
||||
}
|
||||
|
||||
|
@ -1447,7 +1447,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
|
||||
for (i = 0; i < c->cvt_setups.used; i++) {
|
||||
p = snd_array_elem(&c->cvt_setups, i);
|
||||
if (!p->active && p->stream_tag == stream_tag &&
|
||||
get_wcaps_type(get_wcaps(codec, p->nid)) == type)
|
||||
get_wcaps_type(get_wcaps(c, p->nid)) == type)
|
||||
p->dirty = 1;
|
||||
}
|
||||
}
|
||||
|
@ -282,7 +282,8 @@ int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid,
|
||||
EXPORT_SYMBOL_HDA(snd_hda_jack_add_kctl);
|
||||
|
||||
static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid,
|
||||
const struct auto_pin_cfg *cfg)
|
||||
const struct auto_pin_cfg *cfg,
|
||||
char *lastname, int *lastidx)
|
||||
{
|
||||
unsigned int def_conf, conn;
|
||||
char name[44];
|
||||
@ -298,6 +299,10 @@ static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid,
|
||||
return 0;
|
||||
|
||||
snd_hda_get_pin_label(codec, nid, cfg, name, sizeof(name), &idx);
|
||||
if (!strcmp(name, lastname) && idx == *lastidx)
|
||||
idx++;
|
||||
strncpy(lastname, name, 44);
|
||||
*lastidx = idx;
|
||||
err = snd_hda_jack_add_kctl(codec, nid, name, idx);
|
||||
if (err < 0)
|
||||
return err;
|
||||
@ -311,41 +316,42 @@ int snd_hda_jack_add_kctls(struct hda_codec *codec,
|
||||
const struct auto_pin_cfg *cfg)
|
||||
{
|
||||
const hda_nid_t *p;
|
||||
int i, err;
|
||||
int i, err, lastidx = 0;
|
||||
char lastname[44] = "";
|
||||
|
||||
for (i = 0, p = cfg->line_out_pins; i < cfg->line_outs; i++, p++) {
|
||||
err = add_jack_kctl(codec, *p, cfg);
|
||||
err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
for (i = 0, p = cfg->hp_pins; i < cfg->hp_outs; i++, p++) {
|
||||
if (*p == *cfg->line_out_pins) /* might be duplicated */
|
||||
break;
|
||||
err = add_jack_kctl(codec, *p, cfg);
|
||||
err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
for (i = 0, p = cfg->speaker_pins; i < cfg->speaker_outs; i++, p++) {
|
||||
if (*p == *cfg->line_out_pins) /* might be duplicated */
|
||||
break;
|
||||
err = add_jack_kctl(codec, *p, cfg);
|
||||
err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
for (i = 0; i < cfg->num_inputs; i++) {
|
||||
err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg);
|
||||
err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg, lastname, &lastidx);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
for (i = 0, p = cfg->dig_out_pins; i < cfg->dig_outs; i++, p++) {
|
||||
err = add_jack_kctl(codec, *p, cfg);
|
||||
err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
err = add_jack_kctl(codec, cfg->dig_in_pin, cfg);
|
||||
err = add_jack_kctl(codec, cfg->dig_in_pin, cfg, lastname, &lastidx);
|
||||
if (err < 0)
|
||||
return err;
|
||||
err = add_jack_kctl(codec, cfg->mono_out_pin, cfg);
|
||||
err = add_jack_kctl(codec, cfg->mono_out_pin, cfg, lastname, &lastidx);
|
||||
if (err < 0)
|
||||
return err;
|
||||
return 0;
|
||||
|
@ -988,8 +988,10 @@ static void cs_automic(struct hda_codec *codec)
|
||||
change_cur_input(codec, !spec->automic_idx, 0);
|
||||
} else {
|
||||
if (present) {
|
||||
spec->last_input = spec->cur_input;
|
||||
spec->cur_input = spec->automic_idx;
|
||||
if (spec->cur_input != spec->automic_idx) {
|
||||
spec->last_input = spec->cur_input;
|
||||
spec->cur_input = spec->automic_idx;
|
||||
}
|
||||
} else {
|
||||
spec->cur_input = spec->last_input;
|
||||
}
|
||||
|
@ -177,6 +177,7 @@ struct alc_spec {
|
||||
unsigned int detect_lo:1; /* Line-out detection enabled */
|
||||
unsigned int automute_speaker_possible:1; /* there are speakers and either LO or HP */
|
||||
unsigned int automute_lo_possible:1; /* there are line outs and HP */
|
||||
unsigned int keep_vref_in_automute:1; /* Don't clear VREF in automute */
|
||||
|
||||
/* other flags */
|
||||
unsigned int no_analog :1; /* digital I/O only */
|
||||
@ -495,13 +496,24 @@ static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
|
||||
|
||||
for (i = 0; i < num_pins; i++) {
|
||||
hda_nid_t nid = pins[i];
|
||||
unsigned int val;
|
||||
if (!nid)
|
||||
break;
|
||||
switch (spec->automute_mode) {
|
||||
case ALC_AUTOMUTE_PIN:
|
||||
/* don't reset VREF value in case it's controlling
|
||||
* the amp (see alc861_fixup_asus_amp_vref_0f())
|
||||
*/
|
||||
if (spec->keep_vref_in_automute) {
|
||||
val = snd_hda_codec_read(codec, nid, 0,
|
||||
AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
|
||||
val &= ~PIN_HP;
|
||||
} else
|
||||
val = 0;
|
||||
val |= pin_bits;
|
||||
snd_hda_codec_write(codec, nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
||||
pin_bits);
|
||||
val);
|
||||
break;
|
||||
case ALC_AUTOMUTE_AMP:
|
||||
snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
|
||||
@ -4735,7 +4747,6 @@ enum {
|
||||
ALC262_FIXUP_FSC_H270,
|
||||
ALC262_FIXUP_HP_Z200,
|
||||
ALC262_FIXUP_TYAN,
|
||||
ALC262_FIXUP_TOSHIBA_RX1,
|
||||
ALC262_FIXUP_LENOVO_3000,
|
||||
ALC262_FIXUP_BENQ,
|
||||
ALC262_FIXUP_BENQ_T31,
|
||||
@ -4765,16 +4776,6 @@ static const struct alc_fixup alc262_fixups[] = {
|
||||
{ }
|
||||
}
|
||||
},
|
||||
[ALC262_FIXUP_TOSHIBA_RX1] = {
|
||||
.type = ALC_FIXUP_PINS,
|
||||
.v.pins = (const struct alc_pincfg[]) {
|
||||
{ 0x14, 0x90170110 }, /* speaker */
|
||||
{ 0x15, 0x0421101f }, /* HP */
|
||||
{ 0x1a, 0x40f000f0 }, /* N/A */
|
||||
{ 0x1b, 0x40f000f0 }, /* N/A */
|
||||
{ 0x1e, 0x40f000f0 }, /* N/A */
|
||||
}
|
||||
},
|
||||
[ALC262_FIXUP_LENOVO_3000] = {
|
||||
.type = ALC_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
@ -4807,8 +4808,6 @@ static const struct snd_pci_quirk alc262_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FIXUP_BENQ),
|
||||
SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
|
||||
SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
|
||||
SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
|
||||
ALC262_FIXUP_TOSHIBA_RX1),
|
||||
SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
|
||||
SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
|
||||
SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
|
||||
@ -5377,7 +5376,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
|
||||
ALC269_FIXUP_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269_FIXUP_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
|
||||
@ -5589,6 +5587,25 @@ enum {
|
||||
PINFIX_ASUS_A6RP,
|
||||
};
|
||||
|
||||
/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
|
||||
static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
|
||||
const struct alc_fixup *fix, int action)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
unsigned int val;
|
||||
|
||||
if (action != ALC_FIXUP_ACT_INIT)
|
||||
return;
|
||||
val = snd_hda_codec_read(codec, 0x0f, 0,
|
||||
AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
|
||||
if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
|
||||
val |= AC_PINCTL_IN_EN;
|
||||
val |= AC_PINCTL_VREF_50;
|
||||
snd_hda_codec_write(codec, 0x0f, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, val);
|
||||
spec->keep_vref_in_automute = 1;
|
||||
}
|
||||
|
||||
static const struct alc_fixup alc861_fixups[] = {
|
||||
[PINFIX_FSC_AMILO_PI1505] = {
|
||||
.type = ALC_FIXUP_PINS,
|
||||
@ -5599,17 +5616,13 @@ static const struct alc_fixup alc861_fixups[] = {
|
||||
}
|
||||
},
|
||||
[PINFIX_ASUS_A6RP] = {
|
||||
.type = ALC_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
/* node 0x0f VREF seems controlling the master output */
|
||||
{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
|
||||
{ }
|
||||
},
|
||||
.type = ALC_FIXUP_FUNC,
|
||||
.v.func = alc861_fixup_asus_amp_vref_0f,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc861_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", PINFIX_ASUS_A6RP),
|
||||
SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", PINFIX_ASUS_A6RP),
|
||||
SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", PINFIX_ASUS_A6RP),
|
||||
SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
|
||||
{}
|
||||
|
@ -199,6 +199,9 @@ struct via_spec {
|
||||
unsigned int no_pin_power_ctl;
|
||||
enum VIA_HDA_CODEC codec_type;
|
||||
|
||||
/* analog low-power control */
|
||||
bool alc_mode;
|
||||
|
||||
/* smart51 setup */
|
||||
unsigned int smart51_nums;
|
||||
hda_nid_t smart51_pins[2];
|
||||
@ -687,6 +690,15 @@ static void via_auto_init_analog_input(struct hda_codec *codec)
|
||||
}
|
||||
}
|
||||
|
||||
static void update_power_state(struct hda_codec *codec, hda_nid_t nid,
|
||||
unsigned int parm)
|
||||
{
|
||||
if (snd_hda_codec_read(codec, nid, 0,
|
||||
AC_VERB_GET_POWER_STATE, 0) == parm)
|
||||
return;
|
||||
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
}
|
||||
|
||||
static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid,
|
||||
unsigned int *affected_parm)
|
||||
{
|
||||
@ -709,7 +721,7 @@ static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid,
|
||||
} else
|
||||
parm = AC_PWRST_D3;
|
||||
|
||||
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, nid, parm);
|
||||
}
|
||||
|
||||
static int via_pin_power_ctl_info(struct snd_kcontrol *kcontrol,
|
||||
@ -749,6 +761,7 @@ static int via_pin_power_ctl_put(struct snd_kcontrol *kcontrol,
|
||||
return 0;
|
||||
spec->no_pin_power_ctl = val;
|
||||
set_widgets_power_state(codec);
|
||||
analog_low_current_mode(codec);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1036,13 +1049,19 @@ static bool is_aa_path_mute(struct hda_codec *codec)
|
||||
}
|
||||
|
||||
/* enter/exit analog low-current mode */
|
||||
static void analog_low_current_mode(struct hda_codec *codec)
|
||||
static void __analog_low_current_mode(struct hda_codec *codec, bool force)
|
||||
{
|
||||
struct via_spec *spec = codec->spec;
|
||||
bool enable;
|
||||
unsigned int verb, parm;
|
||||
|
||||
enable = is_aa_path_mute(codec) && (spec->opened_streams != 0);
|
||||
if (spec->no_pin_power_ctl)
|
||||
enable = false;
|
||||
else
|
||||
enable = is_aa_path_mute(codec) && !spec->opened_streams;
|
||||
if (enable == spec->alc_mode && !force)
|
||||
return;
|
||||
spec->alc_mode = enable;
|
||||
|
||||
/* decide low current mode's verb & parameter */
|
||||
switch (spec->codec_type) {
|
||||
@ -1074,6 +1093,11 @@ static void analog_low_current_mode(struct hda_codec *codec)
|
||||
snd_hda_codec_write(codec, codec->afg, 0, verb, parm);
|
||||
}
|
||||
|
||||
static void analog_low_current_mode(struct hda_codec *codec)
|
||||
{
|
||||
return __analog_low_current_mode(codec, false);
|
||||
}
|
||||
|
||||
/*
|
||||
* generic initialization of ADC, input mixers and output mixers
|
||||
*/
|
||||
@ -1446,6 +1470,7 @@ static int via_build_controls(struct hda_codec *codec)
|
||||
struct snd_kcontrol *kctl;
|
||||
int err, i;
|
||||
|
||||
spec->no_pin_power_ctl = 1;
|
||||
if (spec->set_widgets_power_state)
|
||||
if (!via_clone_control(spec, &via_pin_power_ctl_enum))
|
||||
return -ENOMEM;
|
||||
@ -1499,10 +1524,6 @@ static int via_build_controls(struct hda_codec *codec)
|
||||
return err;
|
||||
}
|
||||
|
||||
/* init power states */
|
||||
set_widgets_power_state(codec);
|
||||
analog_low_current_mode(codec);
|
||||
|
||||
via_free_kctls(codec); /* no longer needed */
|
||||
|
||||
err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
|
||||
@ -2295,10 +2316,7 @@ static int via_mux_enum_put(struct snd_kcontrol *kcontrol,
|
||||
|
||||
if (mux) {
|
||||
/* switch to D0 beofre change index */
|
||||
if (snd_hda_codec_read(codec, mux, 0,
|
||||
AC_VERB_GET_POWER_STATE, 0x00) != AC_PWRST_D0)
|
||||
snd_hda_codec_write(codec, mux, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
update_power_state(codec, mux, AC_PWRST_D0);
|
||||
snd_hda_codec_write(codec, mux, 0,
|
||||
AC_VERB_SET_CONNECT_SEL,
|
||||
spec->inputs[cur].mux_idx);
|
||||
@ -2776,6 +2794,10 @@ static int via_init(struct hda_codec *codec)
|
||||
for (i = 0; i < spec->num_iverbs; i++)
|
||||
snd_hda_sequence_write(codec, spec->init_verbs[i]);
|
||||
|
||||
/* init power states */
|
||||
set_widgets_power_state(codec);
|
||||
__analog_low_current_mode(codec, true);
|
||||
|
||||
via_auto_init_multi_out(codec);
|
||||
via_auto_init_hp_out(codec);
|
||||
via_auto_init_speaker_out(codec);
|
||||
@ -2922,9 +2944,9 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec)
|
||||
if (imux_is_smixer)
|
||||
parm = AC_PWRST_D0;
|
||||
/* SW0 (17h), AIW 0/1 (13h/14h) */
|
||||
snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x17, parm);
|
||||
update_power_state(codec, 0x13, parm);
|
||||
update_power_state(codec, 0x14, parm);
|
||||
|
||||
/* outputs */
|
||||
/* PW0 (19h), SW1 (18h), AOW1 (11h) */
|
||||
@ -2932,8 +2954,8 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec)
|
||||
set_pin_power_state(codec, 0x19, &parm);
|
||||
if (spec->smart51_enabled)
|
||||
set_pin_power_state(codec, 0x1b, &parm);
|
||||
snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x18, parm);
|
||||
update_power_state(codec, 0x11, parm);
|
||||
|
||||
/* PW6 (22h), SW2 (26h), AOW2 (24h) */
|
||||
if (is_8ch) {
|
||||
@ -2941,20 +2963,16 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec)
|
||||
set_pin_power_state(codec, 0x22, &parm);
|
||||
if (spec->smart51_enabled)
|
||||
set_pin_power_state(codec, 0x1a, &parm);
|
||||
snd_hda_codec_write(codec, 0x26, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x24, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x26, parm);
|
||||
update_power_state(codec, 0x24, parm);
|
||||
} else if (codec->vendor_id == 0x11064397) {
|
||||
/* PW7(23h), SW2(27h), AOW2(25h) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x23, &parm);
|
||||
if (spec->smart51_enabled)
|
||||
set_pin_power_state(codec, 0x1a, &parm);
|
||||
snd_hda_codec_write(codec, 0x27, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x25, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x27, parm);
|
||||
update_power_state(codec, 0x25, parm);
|
||||
}
|
||||
|
||||
/* PW 3/4/7 (1ch/1dh/23h) */
|
||||
@ -2966,17 +2984,13 @@ static void set_widgets_power_state_vt1708B(struct hda_codec *codec)
|
||||
set_pin_power_state(codec, 0x23, &parm);
|
||||
|
||||
/* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */
|
||||
snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE,
|
||||
imux_is_smixer ? AC_PWRST_D0 : parm);
|
||||
snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x16, imux_is_smixer ? AC_PWRST_D0 : parm);
|
||||
update_power_state(codec, 0x10, parm);
|
||||
if (is_8ch) {
|
||||
snd_hda_codec_write(codec, 0x25, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x27, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x25, parm);
|
||||
update_power_state(codec, 0x27, parm);
|
||||
} else if (codec->vendor_id == 0x11064397 && spec->hp_independent_mode)
|
||||
snd_hda_codec_write(codec, 0x25, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x25, parm);
|
||||
}
|
||||
|
||||
static int patch_vt1708S(struct hda_codec *codec);
|
||||
@ -3149,10 +3163,10 @@ static void set_widgets_power_state_vt1702(struct hda_codec *codec)
|
||||
if (imux_is_smixer)
|
||||
parm = AC_PWRST_D0; /* SW0 (13h) = stereo mixer (idx 3) */
|
||||
/* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */
|
||||
snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x12, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x13, parm);
|
||||
update_power_state(codec, 0x12, parm);
|
||||
update_power_state(codec, 0x1f, parm);
|
||||
update_power_state(codec, 0x20, parm);
|
||||
|
||||
/* outputs */
|
||||
/* PW 3/4 (16h/17h) */
|
||||
@ -3160,10 +3174,9 @@ static void set_widgets_power_state_vt1702(struct hda_codec *codec)
|
||||
set_pin_power_state(codec, 0x17, &parm);
|
||||
set_pin_power_state(codec, 0x16, &parm);
|
||||
/* MW0 (1ah), AOW 0/1 (10h/1dh) */
|
||||
snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE,
|
||||
imux_is_smixer ? AC_PWRST_D0 : parm);
|
||||
snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x1a, imux_is_smixer ? AC_PWRST_D0 : parm);
|
||||
update_power_state(codec, 0x10, parm);
|
||||
update_power_state(codec, 0x1d, parm);
|
||||
}
|
||||
|
||||
static int patch_vt1702(struct hda_codec *codec)
|
||||
@ -3228,52 +3241,48 @@ static void set_widgets_power_state_vt1718S(struct hda_codec *codec)
|
||||
if (imux_is_smixer)
|
||||
parm = AC_PWRST_D0;
|
||||
/* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */
|
||||
snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x1e, parm);
|
||||
update_power_state(codec, 0x1f, parm);
|
||||
update_power_state(codec, 0x10, parm);
|
||||
update_power_state(codec, 0x11, parm);
|
||||
|
||||
/* outputs */
|
||||
/* PW3 (27h), MW2 (1ah), AOW3 (bh) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x27, &parm);
|
||||
snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0xb, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x1a, parm);
|
||||
update_power_state(codec, 0xb, parm);
|
||||
|
||||
/* PW2 (26h), AOW2 (ah) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x26, &parm);
|
||||
if (spec->smart51_enabled)
|
||||
set_pin_power_state(codec, 0x2b, &parm);
|
||||
snd_hda_codec_write(codec, 0xa, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0xa, parm);
|
||||
|
||||
/* PW0 (24h), AOW0 (8h) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x24, &parm);
|
||||
if (!spec->hp_independent_mode) /* check for redirected HP */
|
||||
set_pin_power_state(codec, 0x28, &parm);
|
||||
snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x8, parm);
|
||||
/* MW9 (21h), Mw2 (1ah), AOW0 (8h) */
|
||||
snd_hda_codec_write(codec, 0x21, 0, AC_VERB_SET_POWER_STATE,
|
||||
imux_is_smixer ? AC_PWRST_D0 : parm);
|
||||
update_power_state(codec, 0x21, imux_is_smixer ? AC_PWRST_D0 : parm);
|
||||
|
||||
/* PW1 (25h), AOW1 (9h) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x25, &parm);
|
||||
if (spec->smart51_enabled)
|
||||
set_pin_power_state(codec, 0x2a, &parm);
|
||||
snd_hda_codec_write(codec, 0x9, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x9, parm);
|
||||
|
||||
if (spec->hp_independent_mode) {
|
||||
/* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x28, &parm);
|
||||
snd_hda_codec_write(codec, 0x1b, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x34, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0xc, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x1b, parm);
|
||||
update_power_state(codec, 0x34, parm);
|
||||
update_power_state(codec, 0xc, parm);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3433,8 +3442,8 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec)
|
||||
if (imux_is_smixer)
|
||||
parm = AC_PWRST_D0;
|
||||
/* SW0 (17h), AIW0(13h) */
|
||||
snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x17, parm);
|
||||
update_power_state(codec, 0x13, parm);
|
||||
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x1e, &parm);
|
||||
@ -3442,12 +3451,11 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec)
|
||||
if (spec->dmic_enabled)
|
||||
set_pin_power_state(codec, 0x22, &parm);
|
||||
else
|
||||
snd_hda_codec_write(codec, 0x22, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
|
||||
update_power_state(codec, 0x22, AC_PWRST_D3);
|
||||
|
||||
/* SW2(26h), AIW1(14h) */
|
||||
snd_hda_codec_write(codec, 0x26, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x26, parm);
|
||||
update_power_state(codec, 0x14, parm);
|
||||
|
||||
/* outputs */
|
||||
/* PW0 (19h), SW1 (18h), AOW1 (11h) */
|
||||
@ -3456,8 +3464,8 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec)
|
||||
/* Smart 5.1 PW2(1bh) */
|
||||
if (spec->smart51_enabled)
|
||||
set_pin_power_state(codec, 0x1b, &parm);
|
||||
snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x18, parm);
|
||||
update_power_state(codec, 0x11, parm);
|
||||
|
||||
/* PW7 (23h), SW3 (27h), AOW3 (25h) */
|
||||
parm = AC_PWRST_D3;
|
||||
@ -3465,12 +3473,12 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec)
|
||||
/* Smart 5.1 PW1(1ah) */
|
||||
if (spec->smart51_enabled)
|
||||
set_pin_power_state(codec, 0x1a, &parm);
|
||||
snd_hda_codec_write(codec, 0x27, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x27, parm);
|
||||
|
||||
/* Smart 5.1 PW5(1eh) */
|
||||
if (spec->smart51_enabled)
|
||||
set_pin_power_state(codec, 0x1e, &parm);
|
||||
snd_hda_codec_write(codec, 0x25, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x25, parm);
|
||||
|
||||
/* Mono out */
|
||||
/* SW4(28h)->MW1(29h)-> PW12 (2ah)*/
|
||||
@ -3486,9 +3494,9 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec)
|
||||
mono_out = 1;
|
||||
}
|
||||
parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3;
|
||||
snd_hda_codec_write(codec, 0x28, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x29, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x2a, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x28, parm);
|
||||
update_power_state(codec, 0x29, parm);
|
||||
update_power_state(codec, 0x2a, parm);
|
||||
|
||||
/* PW 3/4 (1ch/1dh) */
|
||||
parm = AC_PWRST_D3;
|
||||
@ -3496,15 +3504,12 @@ static void set_widgets_power_state_vt1716S(struct hda_codec *codec)
|
||||
set_pin_power_state(codec, 0x1d, &parm);
|
||||
/* HP Independent Mode, power on AOW3 */
|
||||
if (spec->hp_independent_mode)
|
||||
snd_hda_codec_write(codec, 0x25, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x25, parm);
|
||||
|
||||
/* force to D0 for internal Speaker */
|
||||
/* MW0 (16h), AOW0 (10h) */
|
||||
snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE,
|
||||
imux_is_smixer ? AC_PWRST_D0 : parm);
|
||||
snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE,
|
||||
mono_out ? AC_PWRST_D0 : parm);
|
||||
update_power_state(codec, 0x16, imux_is_smixer ? AC_PWRST_D0 : parm);
|
||||
update_power_state(codec, 0x10, mono_out ? AC_PWRST_D0 : parm);
|
||||
}
|
||||
|
||||
static int patch_vt1716S(struct hda_codec *codec)
|
||||
@ -3580,54 +3585,45 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec)
|
||||
set_pin_power_state(codec, 0x2b, &parm);
|
||||
parm = AC_PWRST_D0;
|
||||
/* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */
|
||||
snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x1e, parm);
|
||||
update_power_state(codec, 0x1f, parm);
|
||||
update_power_state(codec, 0x10, parm);
|
||||
update_power_state(codec, 0x11, parm);
|
||||
|
||||
/* outputs */
|
||||
/* AOW0 (8h)*/
|
||||
snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x8, parm);
|
||||
|
||||
if (spec->codec_type == VT1802) {
|
||||
/* PW4 (28h), MW4 (18h), MUX4(38h) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x28, &parm);
|
||||
snd_hda_codec_write(codec, 0x18, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x38, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x18, parm);
|
||||
update_power_state(codec, 0x38, parm);
|
||||
} else {
|
||||
/* PW4 (26h), MW4 (1ch), MUX4(37h) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x26, &parm);
|
||||
snd_hda_codec_write(codec, 0x1c, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x37, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x1c, parm);
|
||||
update_power_state(codec, 0x37, parm);
|
||||
}
|
||||
|
||||
if (spec->codec_type == VT1802) {
|
||||
/* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x25, &parm);
|
||||
snd_hda_codec_write(codec, 0x15, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x35, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x15, parm);
|
||||
update_power_state(codec, 0x35, parm);
|
||||
} else {
|
||||
/* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x25, &parm);
|
||||
snd_hda_codec_write(codec, 0x19, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x35, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x19, parm);
|
||||
update_power_state(codec, 0x35, parm);
|
||||
}
|
||||
|
||||
if (spec->hp_independent_mode)
|
||||
snd_hda_codec_write(codec, 0x9, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
update_power_state(codec, 0x9, AC_PWRST_D0);
|
||||
|
||||
/* Class-D */
|
||||
/* PW0 (24h), MW0(18h/14h), MUX0(34h) */
|
||||
@ -3637,12 +3633,10 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec)
|
||||
set_pin_power_state(codec, 0x24, &parm);
|
||||
parm = present ? AC_PWRST_D3 : AC_PWRST_D0;
|
||||
if (spec->codec_type == VT1802)
|
||||
snd_hda_codec_write(codec, 0x14, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x14, parm);
|
||||
else
|
||||
snd_hda_codec_write(codec, 0x18, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x18, parm);
|
||||
update_power_state(codec, 0x34, parm);
|
||||
|
||||
/* Mono Out */
|
||||
present = snd_hda_jack_detect(codec, 0x26);
|
||||
@ -3650,28 +3644,20 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec)
|
||||
parm = present ? AC_PWRST_D3 : AC_PWRST_D0;
|
||||
if (spec->codec_type == VT1802) {
|
||||
/* PW15 (33h), MW8(1ch), MUX8(3ch) */
|
||||
snd_hda_codec_write(codec, 0x33, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x1c, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x3c, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x33, parm);
|
||||
update_power_state(codec, 0x1c, parm);
|
||||
update_power_state(codec, 0x3c, parm);
|
||||
} else {
|
||||
/* PW15 (31h), MW8(17h), MUX8(3bh) */
|
||||
snd_hda_codec_write(codec, 0x31, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x17, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x3b, 0,
|
||||
AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x31, parm);
|
||||
update_power_state(codec, 0x17, parm);
|
||||
update_power_state(codec, 0x3b, parm);
|
||||
}
|
||||
/* MW9 (21h) */
|
||||
if (imux_is_smixer || !is_aa_path_mute(codec))
|
||||
snd_hda_codec_write(codec, 0x21, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
update_power_state(codec, 0x21, AC_PWRST_D0);
|
||||
else
|
||||
snd_hda_codec_write(codec, 0x21, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
|
||||
update_power_state(codec, 0x21, AC_PWRST_D3);
|
||||
}
|
||||
|
||||
/* patch for vt2002P */
|
||||
@ -3731,30 +3717,28 @@ static void set_widgets_power_state_vt1812(struct hda_codec *codec)
|
||||
set_pin_power_state(codec, 0x2b, &parm);
|
||||
parm = AC_PWRST_D0;
|
||||
/* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */
|
||||
snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x1e, parm);
|
||||
update_power_state(codec, 0x1f, parm);
|
||||
update_power_state(codec, 0x10, parm);
|
||||
update_power_state(codec, 0x11, parm);
|
||||
|
||||
/* outputs */
|
||||
/* AOW0 (8h)*/
|
||||
snd_hda_codec_write(codec, 0x8, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
update_power_state(codec, 0x8, AC_PWRST_D0);
|
||||
|
||||
/* PW4 (28h), MW4 (18h), MUX4(38h) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x28, &parm);
|
||||
snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x38, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x18, parm);
|
||||
update_power_state(codec, 0x38, parm);
|
||||
|
||||
/* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x25, &parm);
|
||||
snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x35, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x15, parm);
|
||||
update_power_state(codec, 0x35, parm);
|
||||
if (spec->hp_independent_mode)
|
||||
snd_hda_codec_write(codec, 0x9, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
update_power_state(codec, 0x9, AC_PWRST_D0);
|
||||
|
||||
/* Internal Speaker */
|
||||
/* PW0 (24h), MW0(14h), MUX0(34h) */
|
||||
@ -3763,15 +3747,11 @@ static void set_widgets_power_state_vt1812(struct hda_codec *codec)
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x24, &parm);
|
||||
if (present) {
|
||||
snd_hda_codec_write(codec, 0x14, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
|
||||
snd_hda_codec_write(codec, 0x34, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
|
||||
update_power_state(codec, 0x14, AC_PWRST_D3);
|
||||
update_power_state(codec, 0x34, AC_PWRST_D3);
|
||||
} else {
|
||||
snd_hda_codec_write(codec, 0x14, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
snd_hda_codec_write(codec, 0x34, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
update_power_state(codec, 0x14, AC_PWRST_D0);
|
||||
update_power_state(codec, 0x34, AC_PWRST_D0);
|
||||
}
|
||||
|
||||
|
||||
@ -3782,26 +3762,20 @@ static void set_widgets_power_state_vt1812(struct hda_codec *codec)
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x31, &parm);
|
||||
if (present) {
|
||||
snd_hda_codec_write(codec, 0x1c, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
|
||||
snd_hda_codec_write(codec, 0x3c, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
|
||||
snd_hda_codec_write(codec, 0x3e, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
|
||||
update_power_state(codec, 0x1c, AC_PWRST_D3);
|
||||
update_power_state(codec, 0x3c, AC_PWRST_D3);
|
||||
update_power_state(codec, 0x3e, AC_PWRST_D3);
|
||||
} else {
|
||||
snd_hda_codec_write(codec, 0x1c, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
snd_hda_codec_write(codec, 0x3c, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
snd_hda_codec_write(codec, 0x3e, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
update_power_state(codec, 0x1c, AC_PWRST_D0);
|
||||
update_power_state(codec, 0x3c, AC_PWRST_D0);
|
||||
update_power_state(codec, 0x3e, AC_PWRST_D0);
|
||||
}
|
||||
|
||||
/* PW15 (33h), MW15 (1dh), MUX15(3dh) */
|
||||
parm = AC_PWRST_D3;
|
||||
set_pin_power_state(codec, 0x33, &parm);
|
||||
snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
snd_hda_codec_write(codec, 0x3d, 0, AC_VERB_SET_POWER_STATE, parm);
|
||||
update_power_state(codec, 0x1d, parm);
|
||||
update_power_state(codec, 0x3d, parm);
|
||||
|
||||
}
|
||||
|
||||
|
@ -1405,6 +1405,7 @@ static int wm5100_set_bias_level(struct snd_soc_codec *codec,
|
||||
|
||||
case SND_SOC_BIAS_OFF:
|
||||
regcache_cache_only(wm5100->regmap, true);
|
||||
regcache_mark_dirty(wm5100->regmap);
|
||||
if (wm5100->pdata.ldo_ena)
|
||||
gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0);
|
||||
regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies),
|
||||
@ -2183,6 +2184,7 @@ static void wm5100_micd_irq(struct snd_soc_codec *codec)
|
||||
if (wm5100->jack_detecting) {
|
||||
dev_dbg(codec->dev, "Microphone detected\n");
|
||||
wm5100->jack_mic = true;
|
||||
wm5100->jack_detecting = false;
|
||||
snd_soc_jack_report(wm5100->jack,
|
||||
SND_JACK_HEADSET,
|
||||
SND_JACK_HEADSET | SND_JACK_BTN_0);
|
||||
@ -2221,6 +2223,7 @@ static void wm5100_micd_irq(struct snd_soc_codec *codec)
|
||||
SND_JACK_BTN_0);
|
||||
} else if (wm5100->jack_detecting) {
|
||||
dev_dbg(codec->dev, "Headphone detected\n");
|
||||
wm5100->jack_detecting = false;
|
||||
snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE,
|
||||
SND_JACK_HEADPHONE);
|
||||
|
||||
@ -2610,6 +2613,13 @@ static const struct regmap_config wm5100_regmap = {
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
};
|
||||
|
||||
static const unsigned int wm5100_mic_ctrl_reg[] = {
|
||||
WM5100_IN1L_CONTROL,
|
||||
WM5100_IN2L_CONTROL,
|
||||
WM5100_IN3L_CONTROL,
|
||||
WM5100_IN4L_CONTROL,
|
||||
};
|
||||
|
||||
static __devinit int wm5100_i2c_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
@ -2742,7 +2752,7 @@ static __devinit int wm5100_i2c_probe(struct i2c_client *i2c,
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(wm5100->pdata.in_mode); i++) {
|
||||
regmap_update_bits(wm5100->regmap, WM5100_IN1L_CONTROL,
|
||||
regmap_update_bits(wm5100->regmap, wm5100_mic_ctrl_reg[i],
|
||||
WM5100_IN1_MODE_MASK |
|
||||
WM5100_IN1_DMIC_SUP_MASK,
|
||||
(wm5100->pdata.in_mode[i] <<
|
||||
|
@ -96,7 +96,7 @@ static int wm8962_regulator_event_##n(struct notifier_block *nb, \
|
||||
struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \
|
||||
disable_nb[n]); \
|
||||
if (event & REGULATOR_EVENT_DISABLE) { \
|
||||
regcache_cache_only(wm8962->regmap, true); \
|
||||
regcache_mark_dirty(wm8962->regmap); \
|
||||
} \
|
||||
return 0; \
|
||||
}
|
||||
|
@ -108,7 +108,7 @@ static int wm8996_regulator_event_##n(struct notifier_block *nb, \
|
||||
struct wm8996_priv *wm8996 = container_of(nb, struct wm8996_priv, \
|
||||
disable_nb[n]); \
|
||||
if (event & REGULATOR_EVENT_DISABLE) { \
|
||||
regcache_cache_only(wm8996->regmap, true); \
|
||||
regcache_mark_dirty(wm8996->regmap); \
|
||||
} \
|
||||
return 0; \
|
||||
}
|
||||
|
@ -592,8 +592,8 @@ SOC_DAPM_SINGLE("Output Switch", WM8993_LINE_MIXER2, 0, 1, 0),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new line2n_mix[] = {
|
||||
SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER2, 6, 1, 0),
|
||||
SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER2, 5, 1, 0),
|
||||
SOC_DAPM_SINGLE("Left Output Switch", WM8993_LINE_MIXER2, 5, 1, 0),
|
||||
SOC_DAPM_SINGLE("Right Output Switch", WM8993_LINE_MIXER2, 6, 1, 0),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new line2p_mix[] = {
|
||||
@ -613,6 +613,8 @@ SND_SOC_DAPM_INPUT("IN2RP:VXRP"),
|
||||
SND_SOC_DAPM_SUPPLY("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_SUPPLY("LINEOUT_VMID_BUF", WM8993_ANTIPOP1, 7, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_MIXER("IN1L PGA", WM8993_POWER_MANAGEMENT_2, 6, 0,
|
||||
in1l_pga, ARRAY_SIZE(in1l_pga)),
|
||||
SND_SOC_DAPM_MIXER("IN1R PGA", WM8993_POWER_MANAGEMENT_2, 4, 0,
|
||||
@ -834,9 +836,11 @@ static const struct snd_soc_dapm_route lineout1_diff_routes[] = {
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route lineout1_se_routes[] = {
|
||||
{ "LINEOUT1N Mixer", NULL, "LINEOUT_VMID_BUF" },
|
||||
{ "LINEOUT1N Mixer", "Left Output Switch", "Left Output PGA" },
|
||||
{ "LINEOUT1N Mixer", "Right Output Switch", "Right Output PGA" },
|
||||
|
||||
{ "LINEOUT1P Mixer", NULL, "LINEOUT_VMID_BUF" },
|
||||
{ "LINEOUT1P Mixer", "Left Output Switch", "Left Output PGA" },
|
||||
|
||||
{ "LINEOUT1N Driver", NULL, "LINEOUT1N Mixer" },
|
||||
@ -853,9 +857,11 @@ static const struct snd_soc_dapm_route lineout2_diff_routes[] = {
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route lineout2_se_routes[] = {
|
||||
{ "LINEOUT2N Mixer", NULL, "LINEOUT_VMID_BUF" },
|
||||
{ "LINEOUT2N Mixer", "Left Output Switch", "Left Output PGA" },
|
||||
{ "LINEOUT2N Mixer", "Right Output Switch", "Right Output PGA" },
|
||||
|
||||
{ "LINEOUT2P Mixer", NULL, "LINEOUT_VMID_BUF" },
|
||||
{ "LINEOUT2P Mixer", "Right Output Switch", "Right Output PGA" },
|
||||
|
||||
{ "LINEOUT2N Driver", NULL, "LINEOUT2N Mixer" },
|
||||
|
@ -230,8 +230,6 @@ static const struct snd_kcontrol_new neo1973_wm8753_controls[] = {
|
||||
|
||||
/* GTA02 specific routes and controls */
|
||||
|
||||
#ifdef CONFIG_MACH_NEO1973_GTA02
|
||||
|
||||
static int gta02_speaker_enabled;
|
||||
|
||||
static int lm4853_set_spk(struct snd_kcontrol *kcontrol,
|
||||
@ -311,10 +309,6 @@ static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
static int neo1973_gta02_wm8753_init(struct snd_soc_code *codec) { return 0; }
|
||||
#endif
|
||||
|
||||
static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_codec *codec = rtd->codec;
|
||||
@ -322,10 +316,6 @@ static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd)
|
||||
int ret;
|
||||
|
||||
/* set up NC codec pins */
|
||||
if (machine_is_neo1973_gta01()) {
|
||||
snd_soc_dapm_nc_pin(dapm, "LOUT2");
|
||||
snd_soc_dapm_nc_pin(dapm, "ROUT2");
|
||||
}
|
||||
snd_soc_dapm_nc_pin(dapm, "OUT3");
|
||||
snd_soc_dapm_nc_pin(dapm, "OUT4");
|
||||
snd_soc_dapm_nc_pin(dapm, "LINE1");
|
||||
@ -370,50 +360,6 @@ static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* GTA01 specific controls */
|
||||
|
||||
#ifdef CONFIG_MACH_NEO1973_GTA01
|
||||
|
||||
static const struct snd_soc_dapm_route neo1973_lm4857_routes[] = {
|
||||
{"Amp IN", NULL, "ROUT1"},
|
||||
{"Amp IN", NULL, "LOUT1"},
|
||||
|
||||
{"Handset Spk", NULL, "Amp EP"},
|
||||
{"Stereo Out", NULL, "Amp LS"},
|
||||
{"Headphone", NULL, "Amp HP"},
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget neo1973_lm4857_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SPK("Handset Spk", NULL),
|
||||
SND_SOC_DAPM_SPK("Stereo Out", NULL),
|
||||
SND_SOC_DAPM_HP("Headphone", NULL),
|
||||
};
|
||||
|
||||
static int neo1973_lm4857_init(struct snd_soc_dapm_context *dapm)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = snd_soc_dapm_new_controls(dapm, neo1973_lm4857_dapm_widgets,
|
||||
ARRAY_SIZE(neo1973_lm4857_dapm_widgets));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = snd_soc_dapm_add_routes(dapm, neo1973_lm4857_routes,
|
||||
ARRAY_SIZE(neo1973_lm4857_routes));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
snd_soc_dapm_ignore_suspend(dapm, "Stereo Out");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "Handset Spk");
|
||||
snd_soc_dapm_ignore_suspend(dapm, "Headphone");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
static int neo1973_lm4857_init(struct snd_soc_dapm_context *dapm) { return 0; };
|
||||
#endif
|
||||
|
||||
static struct snd_soc_dai_link neo1973_dai[] = {
|
||||
{ /* Hifi Playback - for similatious use with voice below */
|
||||
.name = "WM8753",
|
||||
@ -440,11 +386,6 @@ static struct snd_soc_aux_dev neo1973_aux_devs[] = {
|
||||
.name = "dfbmcs320",
|
||||
.codec_name = "dfbmcs320.0",
|
||||
},
|
||||
{
|
||||
.name = "lm4857",
|
||||
.codec_name = "lm4857.0-007c",
|
||||
.init = neo1973_lm4857_init,
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_soc_codec_conf neo1973_codec_conf[] = {
|
||||
@ -454,14 +395,10 @@ static struct snd_soc_codec_conf neo1973_codec_conf[] = {
|
||||
},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MACH_NEO1973_GTA02
|
||||
static const struct gpio neo1973_gta02_gpios[] = {
|
||||
{ GTA02_GPIO_HP_IN, GPIOF_OUT_INIT_HIGH, "GTA02_HP_IN" },
|
||||
{ GTA02_GPIO_AMP_SHUT, GPIOF_OUT_INIT_HIGH, "GTA02_AMP_SHUT" },
|
||||
};
|
||||
#else
|
||||
static const struct gpio neo1973_gta02_gpios[] = {};
|
||||
#endif
|
||||
|
||||
static struct snd_soc_card neo1973 = {
|
||||
.name = "neo1973",
|
||||
@ -480,7 +417,7 @@ static int __init neo1973_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!machine_is_neo1973_gta01() && !machine_is_neo1973_gta02())
|
||||
if (!machine_is_neo1973_gta02())
|
||||
return -ENODEV;
|
||||
|
||||
if (machine_is_neo1973_gta02()) {
|
||||
|
@ -104,7 +104,7 @@ endif
|
||||
|
||||
CFLAGS = -fno-omit-frame-pointer -ggdb3 -Wall -Wextra -std=gnu99 $(CFLAGS_WERROR) $(CFLAGS_OPTIMIZE) -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS)
|
||||
EXTLIBS = -lpthread -lrt -lelf -lm
|
||||
ALL_CFLAGS = $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
|
||||
ALL_CFLAGS = $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
|
||||
ALL_LDFLAGS = $(LDFLAGS)
|
||||
STRIP ?= strip
|
||||
|
||||
@ -168,10 +168,7 @@ endif
|
||||
|
||||
### --- END CONFIGURATION SECTION ---
|
||||
|
||||
# Those must not be GNU-specific; they are shared with perl/ which may
|
||||
# be built by a different compiler. (Note that this is an artifact now
|
||||
# but it still might be nice to keep that distinction.)
|
||||
BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include
|
||||
BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
|
||||
BASIC_LDFLAGS =
|
||||
|
||||
# Guard against environment variables
|
||||
|
@ -20,7 +20,6 @@
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
*/
|
||||
#define _GNU_SOURCE
|
||||
#include <sys/utsname.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
@ -31,7 +30,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#undef _GNU_SOURCE
|
||||
#include "perf.h"
|
||||
#include "builtin.h"
|
||||
#include "util/util.h"
|
||||
|
@ -89,8 +89,6 @@ void get_term_dimensions(struct winsize *ws)
|
||||
|
||||
static void perf_top__update_print_entries(struct perf_top *top)
|
||||
{
|
||||
top->print_entries = top->winsize.ws_row;
|
||||
|
||||
if (top->print_entries > 9)
|
||||
top->print_entries -= 9;
|
||||
}
|
||||
@ -100,6 +98,13 @@ static void perf_top__sig_winch(int sig __used, siginfo_t *info __used, void *ar
|
||||
struct perf_top *top = arg;
|
||||
|
||||
get_term_dimensions(&top->winsize);
|
||||
if (!top->print_entries
|
||||
|| (top->print_entries+4) > top->winsize.ws_row) {
|
||||
top->print_entries = top->winsize.ws_row;
|
||||
} else {
|
||||
top->print_entries += 4;
|
||||
top->winsize.ws_row = top->print_entries;
|
||||
}
|
||||
perf_top__update_print_entries(top);
|
||||
}
|
||||
|
||||
@ -453,8 +458,10 @@ static void perf_top__handle_keypress(struct perf_top *top, int c)
|
||||
};
|
||||
perf_top__sig_winch(SIGWINCH, NULL, top);
|
||||
sigaction(SIGWINCH, &act, NULL);
|
||||
} else
|
||||
} else {
|
||||
perf_top__sig_winch(SIGWINCH, NULL, top);
|
||||
signal(SIGWINCH, SIG_DFL);
|
||||
}
|
||||
break;
|
||||
case 'E':
|
||||
if (top->evlist->nr_entries > 1) {
|
||||
|
@ -2105,7 +2105,7 @@ int perf_event__synthesize_event_type(struct perf_tool *tool,
|
||||
strncpy(ev.event_type.event_type.name, name, MAX_EVENT_NAME - 1);
|
||||
|
||||
ev.event_type.header.type = PERF_RECORD_HEADER_EVENT_TYPE;
|
||||
size = strlen(name);
|
||||
size = strlen(ev.event_type.event_type.name);
|
||||
size = ALIGN(size, sizeof(u64));
|
||||
ev.event_type.header.size = sizeof(ev.event_type) -
|
||||
(sizeof(ev.event_type.event_type.name) - size);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user