mirror of https://gitee.com/openkylin/linux.git
Merge branch 'drm-intel-fixes' into drm-intel-next
This commit is contained in:
commit
8d5203ca62
|
@ -47,6 +47,20 @@ Date: January 2007
|
|||
KernelVersion: 2.6.20
|
||||
Contact: "Corentin Chary" <corentincj@iksaif.net>
|
||||
Description:
|
||||
Control the bluetooth device. 1 means on, 0 means off.
|
||||
Control the wlan device. 1 means on, 0 means off.
|
||||
This may control the led, the device or both.
|
||||
Users: Lapsus
|
||||
|
||||
What: /sys/devices/platform/asus_laptop/wimax
|
||||
Date: October 2010
|
||||
KernelVersion: 2.6.37
|
||||
Contact: "Corentin Chary" <corentincj@iksaif.net>
|
||||
Description:
|
||||
Control the wimax device. 1 means on, 0 means off.
|
||||
|
||||
What: /sys/devices/platform/asus_laptop/wwan
|
||||
Date: October 2010
|
||||
KernelVersion: 2.6.37
|
||||
Contact: "Corentin Chary" <corentincj@iksaif.net>
|
||||
Description:
|
||||
Control the wwan (3G) device. 1 means on, 0 means off.
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
What: /sys/devices/platform/eeepc-wmi/cpufv
|
||||
Date: Oct 2010
|
||||
KernelVersion: 2.6.37
|
||||
Contact: "Corentin Chary" <corentincj@iksaif.net>
|
||||
Description:
|
||||
Change CPU clock configuration (write-only).
|
||||
There are three available clock configuration:
|
||||
* 0 -> Super Performance Mode
|
||||
* 1 -> High Performance Mode
|
||||
* 2 -> Power Saving Mode
|
|
@ -660,11 +660,10 @@ struct address_space_operations {
|
|||
releasepage: releasepage is called on PagePrivate pages to indicate
|
||||
that the page should be freed if possible. ->releasepage
|
||||
should remove any private data from the page and clear the
|
||||
PagePrivate flag. It may also remove the page from the
|
||||
address_space. If this fails for some reason, it may indicate
|
||||
failure with a 0 return value.
|
||||
This is used in two distinct though related cases. The first
|
||||
is when the VM finds a clean page with no active users and
|
||||
PagePrivate flag. If releasepage() fails for some reason, it must
|
||||
indicate failure with a 0 return value.
|
||||
releasepage() is used in two distinct though related cases. The
|
||||
first is when the VM finds a clean page with no active users and
|
||||
wants to make it a free page. If ->releasepage succeeds, the
|
||||
page will be removed from the address_space and become free.
|
||||
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 37
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Flesh-Eating Bats with Fangs
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -9,7 +9,7 @@ config ARM
|
|||
select GENERIC_ATOMIC64 if (!CPU_32v6K || !AEABI)
|
||||
select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
|
||||
select HAVE_ARCH_KGDB
|
||||
select HAVE_KPROBES if (!XIP_KERNEL)
|
||||
select HAVE_KPROBES if (!XIP_KERNEL && !THUMB2_KERNEL)
|
||||
select HAVE_KRETPROBES if (HAVE_KPROBES)
|
||||
select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
|
||||
select HAVE_FTRACE_MCOUNT_RECORD if (!XIP_KERNEL)
|
||||
|
|
|
@ -70,12 +70,7 @@ else
|
|||
$(obj)/uImage: LOADADDR=$(ZRELADDR)
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_THUMB2_KERNEL),y)
|
||||
# Set bit 0 to 1 so that "mov pc, rx" switches to Thumb-2 mode
|
||||
$(obj)/uImage: STARTADDR=$(shell echo $(LOADADDR) | sed -e "s/.$$/1/")
|
||||
else
|
||||
$(obj)/uImage: STARTADDR=$(LOADADDR)
|
||||
endif
|
||||
|
||||
$(obj)/uImage: $(obj)/zImage FORCE
|
||||
$(call if_changed,uimage)
|
||||
|
|
|
@ -73,6 +73,8 @@ move: ldmia r4!, {r7 - r10} @ move 32-bytes at a time
|
|||
|
||||
.size _start, . - _start
|
||||
|
||||
.align
|
||||
|
||||
.type data,#object
|
||||
data: .word initrd_start @ source initrd address
|
||||
.word initrd_phys @ destination initrd address
|
||||
|
|
|
@ -125,9 +125,13 @@ wait: mrc p14, 0, pc, c0, c1, 0
|
|||
* sort out different calling conventions
|
||||
*/
|
||||
.align
|
||||
.arm @ Always enter in ARM state
|
||||
start:
|
||||
.type start,#function
|
||||
.rept 8
|
||||
THUMB( adr r12, BSYM(1f) )
|
||||
THUMB( bx r12 )
|
||||
THUMB( .rept 6 )
|
||||
ARM( .rept 8 )
|
||||
mov r0, r0
|
||||
.endr
|
||||
|
||||
|
@ -135,6 +139,7 @@ start:
|
|||
.word 0x016f2818 @ Magic numbers to help the loader
|
||||
.word start @ absolute load/run zImage address
|
||||
.word _edata @ zImage end address
|
||||
THUMB( .thumb )
|
||||
1: mov r7, r1 @ save architecture ID
|
||||
mov r8, r2 @ save atags pointer
|
||||
|
||||
|
@ -174,7 +179,8 @@ not_angel:
|
|||
ldr sp, [r0, #28]
|
||||
#ifdef CONFIG_AUTO_ZRELADDR
|
||||
@ determine final kernel image address
|
||||
and r4, pc, #0xf8000000
|
||||
mov r4, pc
|
||||
and r4, r4, #0xf8000000
|
||||
add r4, r4, #TEXT_OFFSET
|
||||
#else
|
||||
ldr r4, =zreladdr
|
||||
|
@ -445,7 +451,8 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size
|
|||
*/
|
||||
mov r1, #0x1e
|
||||
orr r1, r1, #3 << 10
|
||||
mov r2, pc, lsr #20
|
||||
mov r2, pc
|
||||
mov r2, r2, lsr #20
|
||||
orr r1, r1, r2, lsl #20
|
||||
add r0, r3, r2, lsl #2
|
||||
str r1, [r0], #4
|
||||
|
|
|
@ -146,9 +146,15 @@ static int gic_set_cpu(unsigned int irq, const struct cpumask *mask_val)
|
|||
unsigned int shift = (irq % 4) * 8;
|
||||
unsigned int cpu = cpumask_first(mask_val);
|
||||
u32 val;
|
||||
struct irq_desc *desc;
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
irq_desc[irq].node = cpu;
|
||||
desc = irq_to_desc(irq);
|
||||
if (desc == NULL) {
|
||||
spin_unlock(&irq_controller_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
desc->node = cpu;
|
||||
val = readl(reg) & ~(0xff << shift);
|
||||
val |= 1 << (cpu + shift);
|
||||
writel(val, reg);
|
||||
|
@ -210,7 +216,7 @@ void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)
|
|||
void __init gic_dist_init(unsigned int gic_nr, void __iomem *base,
|
||||
unsigned int irq_start)
|
||||
{
|
||||
unsigned int max_irq, i;
|
||||
unsigned int gic_irqs, irq_limit, i;
|
||||
u32 cpumask = 1 << smp_processor_id();
|
||||
|
||||
if (gic_nr >= MAX_GIC_NR)
|
||||
|
@ -226,47 +232,49 @@ void __init gic_dist_init(unsigned int gic_nr, void __iomem *base,
|
|||
|
||||
/*
|
||||
* Find out how many interrupts are supported.
|
||||
*/
|
||||
max_irq = readl(base + GIC_DIST_CTR) & 0x1f;
|
||||
max_irq = (max_irq + 1) * 32;
|
||||
|
||||
/*
|
||||
* The GIC only supports up to 1020 interrupt sources.
|
||||
* Limit this to either the architected maximum, or the
|
||||
* platform maximum.
|
||||
*/
|
||||
if (max_irq > max(1020, NR_IRQS))
|
||||
max_irq = max(1020, NR_IRQS);
|
||||
gic_irqs = readl(base + GIC_DIST_CTR) & 0x1f;
|
||||
gic_irqs = (gic_irqs + 1) * 32;
|
||||
if (gic_irqs > 1020)
|
||||
gic_irqs = 1020;
|
||||
|
||||
/*
|
||||
* Set all global interrupts to be level triggered, active low.
|
||||
*/
|
||||
for (i = 32; i < max_irq; i += 16)
|
||||
for (i = 32; i < gic_irqs; i += 16)
|
||||
writel(0, base + GIC_DIST_CONFIG + i * 4 / 16);
|
||||
|
||||
/*
|
||||
* Set all global interrupts to this CPU only.
|
||||
*/
|
||||
for (i = 32; i < max_irq; i += 4)
|
||||
for (i = 32; i < gic_irqs; i += 4)
|
||||
writel(cpumask, base + GIC_DIST_TARGET + i * 4 / 4);
|
||||
|
||||
/*
|
||||
* Set priority on all global interrupts.
|
||||
*/
|
||||
for (i = 32; i < max_irq; i += 4)
|
||||
for (i = 32; i < gic_irqs; i += 4)
|
||||
writel(0xa0a0a0a0, base + GIC_DIST_PRI + i * 4 / 4);
|
||||
|
||||
/*
|
||||
* Disable all interrupts. Leave the PPI and SGIs alone
|
||||
* as these enables are banked registers.
|
||||
*/
|
||||
for (i = 32; i < max_irq; i += 32)
|
||||
for (i = 32; i < gic_irqs; i += 32)
|
||||
writel(0xffffffff, base + GIC_DIST_ENABLE_CLEAR + i * 4 / 32);
|
||||
|
||||
/*
|
||||
* Limit number of interrupts registered to the platform maximum
|
||||
*/
|
||||
irq_limit = gic_data[gic_nr].irq_offset + gic_irqs;
|
||||
if (WARN_ON(irq_limit > NR_IRQS))
|
||||
irq_limit = NR_IRQS;
|
||||
|
||||
/*
|
||||
* Setup the Linux IRQ subsystem.
|
||||
*/
|
||||
for (i = irq_start; i < gic_data[gic_nr].irq_offset + max_irq; i++) {
|
||||
for (i = irq_start; i < irq_limit; i++) {
|
||||
set_irq_chip(i, &gic_chip);
|
||||
set_irq_chip_data(i, &gic_data[gic_nr]);
|
||||
set_irq_handler(i, handle_level_irq);
|
||||
|
|
|
@ -911,7 +911,7 @@ __kuser_cmpxchg: @ 0xffff0fc0
|
|||
* A special ghost syscall is used for that (see traps.c).
|
||||
*/
|
||||
stmfd sp!, {r7, lr}
|
||||
ldr r7, =1f @ it's 20 bits
|
||||
ldr r7, 1f @ it's 20 bits
|
||||
swi __ARM_NR_cmpxchg
|
||||
ldmfd sp!, {r7, pc}
|
||||
1: .word __ARM_NR_cmpxchg
|
||||
|
|
|
@ -85,9 +85,11 @@ ENTRY(stext)
|
|||
mrc p15, 0, r9, c0, c0 @ get processor id
|
||||
bl __lookup_processor_type @ r5=procinfo r9=cpuid
|
||||
movs r10, r5 @ invalid processor (r5=0)?
|
||||
THUMB( it eq ) @ force fixup-able long branch encoding
|
||||
beq __error_p @ yes, error 'p'
|
||||
bl __lookup_machine_type @ r5=machinfo
|
||||
movs r8, r5 @ invalid machine (r5=0)?
|
||||
THUMB( it eq ) @ force fixup-able long branch encoding
|
||||
beq __error_a @ yes, error 'a'
|
||||
bl __vet_atags
|
||||
#ifdef CONFIG_SMP_ON_UP
|
||||
|
@ -262,6 +264,7 @@ __create_page_tables:
|
|||
mov pc, lr
|
||||
ENDPROC(__create_page_tables)
|
||||
.ltorg
|
||||
.align
|
||||
__enable_mmu_loc:
|
||||
.long .
|
||||
.long __enable_mmu
|
||||
|
@ -282,6 +285,7 @@ ENTRY(secondary_startup)
|
|||
bl __lookup_processor_type
|
||||
movs r10, r5 @ invalid processor?
|
||||
moveq r0, #'p' @ yes, error 'p'
|
||||
THUMB( it eq ) @ force fixup-able long branch encoding
|
||||
beq __error_p
|
||||
|
||||
/*
|
||||
|
@ -308,6 +312,8 @@ ENTRY(__secondary_switched)
|
|||
b secondary_start_kernel
|
||||
ENDPROC(__secondary_switched)
|
||||
|
||||
.align
|
||||
|
||||
.type __secondary_data, %object
|
||||
__secondary_data:
|
||||
.long .
|
||||
|
@ -413,6 +419,7 @@ __fixup_smp_on_up:
|
|||
mov pc, lr
|
||||
ENDPROC(__fixup_smp)
|
||||
|
||||
.align
|
||||
1: .word .
|
||||
.word __smpalt_begin
|
||||
.word __smpalt_end
|
||||
|
|
|
@ -59,6 +59,8 @@ relocate_new_kernel:
|
|||
ldr r2,kexec_boot_atags
|
||||
mov pc,lr
|
||||
|
||||
.align
|
||||
|
||||
.globl kexec_start_address
|
||||
kexec_start_address:
|
||||
.long 0x0
|
||||
|
|
|
@ -369,7 +369,7 @@ static int __init cns3xxx_pcie_init(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
hook_fault_code(16 + 6, cns3xxx_pcie_abort_handler, SIGBUS,
|
||||
hook_fault_code(16 + 6, cns3xxx_pcie_abort_handler, SIGBUS, 0,
|
||||
"imprecise external abort");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(cns3xxx_pcie); i++) {
|
||||
|
|
|
@ -35,5 +35,6 @@ pen: ldr r7, [r6]
|
|||
*/
|
||||
b secondary_startup
|
||||
|
||||
.align
|
||||
1: .long .
|
||||
.long pen_release
|
||||
|
|
|
@ -16,7 +16,7 @@ config CPU_S3C2412
|
|||
config CPU_S3C2412_ONLY
|
||||
bool
|
||||
depends on ARCH_S3C2410 && !CPU_S3C2400 && !CPU_S3C2410 && \
|
||||
!CPU_2416 && !CPU_S3C2440 && !CPU_S3C2442 && \
|
||||
!CPU_S3C2416 && !CPU_S3C2440 && !CPU_S3C2442 && \
|
||||
!CPU_S3C2443 && CPU_S3C2412
|
||||
default y if CPU_S3C2412
|
||||
|
||||
|
|
|
@ -35,9 +35,12 @@ menu "S3C2416 Machines"
|
|||
config MACH_SMDK2416
|
||||
bool "SMDK2416"
|
||||
select CPU_S3C2416
|
||||
select MACH_SMDK
|
||||
select S3C_DEV_FB
|
||||
select S3C_DEV_HSMMC
|
||||
select S3C_DEV_HSMMC1
|
||||
select S3C_DEV_NAND
|
||||
select S3C_DEV_USB_HOST
|
||||
select S3C2416_PM if PM
|
||||
help
|
||||
Say Y here if you are using an SMDK2416
|
||||
|
|
|
@ -18,6 +18,7 @@ config CPU_S3C2440
|
|||
config CPU_S3C2442
|
||||
bool
|
||||
select CPU_ARM920T
|
||||
select S3C_GPIO_PULL_DOWN
|
||||
select S3C2410_CLOCK
|
||||
select S3C2410_GPIO
|
||||
select S3C2410_PM if PM
|
||||
|
@ -178,6 +179,9 @@ config MACH_MINI2440
|
|||
bool "MINI2440 development board"
|
||||
select CPU_S3C2440
|
||||
select EEPROM_AT24
|
||||
select NEW_LEDS
|
||||
select LEDS_CLASS
|
||||
select LEDS_TRIGGER
|
||||
select LEDS_TRIGGER_BACKLIGHT
|
||||
select S3C_DEV_NAND
|
||||
select S3C_DEV_USB_HOST
|
||||
|
|
|
@ -46,9 +46,6 @@ int __init s3c2440_init(void)
|
|||
{
|
||||
printk("S3C2440: Initialising architecture\n");
|
||||
|
||||
s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1up;
|
||||
s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1up;
|
||||
|
||||
/* change irq for watchdog */
|
||||
|
||||
s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT;
|
||||
|
@ -58,3 +55,11 @@ int __init s3c2440_init(void)
|
|||
|
||||
return sysdev_register(&s3c2440_sysdev);
|
||||
}
|
||||
|
||||
void __init s3c2440_map_io(void)
|
||||
{
|
||||
s3c244x_map_io();
|
||||
|
||||
s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1up;
|
||||
s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1up;
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
|
@ -43,6 +44,11 @@
|
|||
|
||||
#include <plat/clock.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/s3c244x.h>
|
||||
|
||||
#include <plat/gpio-core.h>
|
||||
#include <plat/gpio-cfg.h>
|
||||
#include <plat/gpio-cfg-helpers.h>
|
||||
|
||||
/* S3C2442 extended clock support */
|
||||
|
||||
|
@ -163,3 +169,11 @@ int __init s3c2442_init(void)
|
|||
|
||||
return sysdev_register(&s3c2442_sysdev);
|
||||
}
|
||||
|
||||
void __init s3c2442_map_io(void)
|
||||
{
|
||||
s3c244x_map_io();
|
||||
|
||||
s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1down;
|
||||
s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1down;
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
config CPU_S3C2443
|
||||
bool
|
||||
depends on ARCH_S3C2410
|
||||
select CPU_ARM920T
|
||||
select S3C2443_DMA if S3C2410_DMA
|
||||
select CPU_LLSERIAL_S3C2440
|
||||
select SAMSUNG_CLKSRC
|
||||
|
|
|
@ -21,8 +21,8 @@
|
|||
#include <mach/io.h>
|
||||
|
||||
.macro addruart, rp, rv
|
||||
ldreq \rp, =IO_APB_PHYS @ physical
|
||||
ldrne \rv, =IO_APB_VIRT @ virtual
|
||||
ldr \rp, =IO_APB_PHYS @ physical
|
||||
ldr \rv, =IO_APB_VIRT @ virtual
|
||||
#if defined(CONFIG_TEGRA_DEBUG_UART_NONE)
|
||||
#error "A debug UART must be selected in the kernel config to use DEBUG_LL"
|
||||
#elif defined(CONFIG_TEGRA_DEBUG_UARTA)
|
||||
|
|
|
@ -35,5 +35,6 @@ pen: ldr r7, [r6]
|
|||
*/
|
||||
b secondary_startup
|
||||
|
||||
.align
|
||||
1: .long .
|
||||
.long pen_release
|
||||
|
|
|
@ -381,7 +381,7 @@ __v7_ca9mp_proc_info:
|
|||
PMD_SECT_XN | \
|
||||
PMD_SECT_AP_WRITE | \
|
||||
PMD_SECT_AP_READ
|
||||
b __v7_ca9mp_setup
|
||||
W(b) __v7_ca9mp_setup
|
||||
.long cpu_arch_name
|
||||
.long cpu_elf_name
|
||||
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS
|
||||
|
@ -413,7 +413,7 @@ __v7_proc_info:
|
|||
PMD_SECT_XN | \
|
||||
PMD_SECT_AP_WRITE | \
|
||||
PMD_SECT_AP_READ
|
||||
b __v7_setup
|
||||
W(b) __v7_setup
|
||||
.long cpu_arch_name
|
||||
.long cpu_elf_name
|
||||
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/time.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/clockchips.h>
|
||||
|
@ -36,7 +37,7 @@
|
|||
/*
|
||||
* IOP clocksource (free-running timer 1).
|
||||
*/
|
||||
static cycle_t iop_clocksource_read(struct clocksource *unused)
|
||||
static cycle_t notrace iop_clocksource_read(struct clocksource *unused)
|
||||
{
|
||||
return 0xffffffffu - read_tcr1();
|
||||
}
|
||||
|
|
|
@ -88,7 +88,7 @@ static struct cpu_table cpu_ids[] __initdata = {
|
|||
{
|
||||
.idcode = 0x32440000,
|
||||
.idmask = 0xffffffff,
|
||||
.map_io = s3c244x_map_io,
|
||||
.map_io = s3c2440_map_io,
|
||||
.init_clocks = s3c244x_init_clocks,
|
||||
.init_uarts = s3c244x_init_uarts,
|
||||
.init = s3c2440_init,
|
||||
|
@ -97,7 +97,7 @@ static struct cpu_table cpu_ids[] __initdata = {
|
|||
{
|
||||
.idcode = 0x32440001,
|
||||
.idmask = 0xffffffff,
|
||||
.map_io = s3c244x_map_io,
|
||||
.map_io = s3c2440_map_io,
|
||||
.init_clocks = s3c244x_init_clocks,
|
||||
.init_uarts = s3c244x_init_uarts,
|
||||
.init = s3c2440_init,
|
||||
|
@ -106,7 +106,7 @@ static struct cpu_table cpu_ids[] __initdata = {
|
|||
{
|
||||
.idcode = 0x32440aaa,
|
||||
.idmask = 0xffffffff,
|
||||
.map_io = s3c244x_map_io,
|
||||
.map_io = s3c2442_map_io,
|
||||
.init_clocks = s3c244x_init_clocks,
|
||||
.init_uarts = s3c244x_init_uarts,
|
||||
.init = s3c2442_init,
|
||||
|
@ -115,7 +115,7 @@ static struct cpu_table cpu_ids[] __initdata = {
|
|||
{
|
||||
.idcode = 0x32440aab,
|
||||
.idmask = 0xffffffff,
|
||||
.map_io = s3c244x_map_io,
|
||||
.map_io = s3c2442_map_io,
|
||||
.init_clocks = s3c244x_init_clocks,
|
||||
.init_uarts = s3c244x_init_uarts,
|
||||
.init = s3c2442_init,
|
||||
|
|
|
@ -82,8 +82,6 @@ static struct s3c_gpio_cfg s3c24xx_gpiocfg_banka = {
|
|||
struct s3c_gpio_cfg s3c24xx_gpiocfg_default = {
|
||||
.set_config = s3c_gpio_setcfg_s3c24xx,
|
||||
.get_config = s3c_gpio_getcfg_s3c24xx,
|
||||
.set_pull = s3c_gpio_setpull_1up,
|
||||
.get_pull = s3c_gpio_getpull_1up,
|
||||
};
|
||||
|
||||
struct s3c_gpio_chip s3c24xx_gpios[] = {
|
||||
|
|
|
@ -21,17 +21,22 @@ extern void s3c244x_init_clocks(int xtal);
|
|||
#else
|
||||
#define s3c244x_init_clocks NULL
|
||||
#define s3c244x_init_uarts NULL
|
||||
#define s3c244x_map_io NULL
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2440
|
||||
extern int s3c2440_init(void);
|
||||
|
||||
extern void s3c2440_map_io(void);
|
||||
#else
|
||||
#define s3c2440_init NULL
|
||||
#define s3c2440_map_io NULL
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2442
|
||||
extern int s3c2442_init(void);
|
||||
|
||||
extern void s3c2442_map_io(void);
|
||||
#else
|
||||
#define s3c2442_init NULL
|
||||
#define s3c2442_map_io NULL
|
||||
#endif
|
||||
|
|
|
@ -280,18 +280,17 @@ s3c_gpio_pull_t s3c_gpio_getpull_updown(struct s3c_gpio_chip *chip,
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_S3C_GPIO_PULL_UP
|
||||
int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
|
||||
unsigned int off, s3c_gpio_pull_t pull)
|
||||
#if defined(CONFIG_S3C_GPIO_PULL_UP) || defined(CONFIG_S3C_GPIO_PULL_DOWN)
|
||||
static int s3c_gpio_setpull_1(struct s3c_gpio_chip *chip,
|
||||
unsigned int off, s3c_gpio_pull_t pull,
|
||||
s3c_gpio_pull_t updown)
|
||||
{
|
||||
void __iomem *reg = chip->base + 0x08;
|
||||
u32 pup = __raw_readl(reg);
|
||||
|
||||
pup = __raw_readl(reg);
|
||||
|
||||
if (pup == S3C_GPIO_PULL_UP)
|
||||
if (pull == updown)
|
||||
pup &= ~(1 << off);
|
||||
else if (pup == S3C_GPIO_PULL_NONE)
|
||||
else if (pull == S3C_GPIO_PULL_NONE)
|
||||
pup |= (1 << off);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
@ -300,17 +299,45 @@ int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
|
|||
return 0;
|
||||
}
|
||||
|
||||
s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
|
||||
unsigned int off)
|
||||
static s3c_gpio_pull_t s3c_gpio_getpull_1(struct s3c_gpio_chip *chip,
|
||||
unsigned int off, s3c_gpio_pull_t updown)
|
||||
{
|
||||
void __iomem *reg = chip->base + 0x08;
|
||||
u32 pup = __raw_readl(reg);
|
||||
|
||||
pup &= (1 << off);
|
||||
return pup ? S3C_GPIO_PULL_NONE : S3C_GPIO_PULL_UP;
|
||||
return pup ? S3C_GPIO_PULL_NONE : updown;
|
||||
}
|
||||
#endif /* CONFIG_S3C_GPIO_PULL_UP || CONFIG_S3C_GPIO_PULL_DOWN */
|
||||
|
||||
#ifdef CONFIG_S3C_GPIO_PULL_UP
|
||||
s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
|
||||
unsigned int off)
|
||||
{
|
||||
return s3c_gpio_getpull_1(chip, off, S3C_GPIO_PULL_UP);
|
||||
}
|
||||
|
||||
int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
|
||||
unsigned int off, s3c_gpio_pull_t pull)
|
||||
{
|
||||
return s3c_gpio_setpull_1(chip, off, pull, S3C_GPIO_PULL_UP);
|
||||
}
|
||||
#endif /* CONFIG_S3C_GPIO_PULL_UP */
|
||||
|
||||
#ifdef CONFIG_S3C_GPIO_PULL_DOWN
|
||||
s3c_gpio_pull_t s3c_gpio_getpull_1down(struct s3c_gpio_chip *chip,
|
||||
unsigned int off)
|
||||
{
|
||||
return s3c_gpio_getpull_1(chip, off, S3C_GPIO_PULL_DOWN);
|
||||
}
|
||||
|
||||
int s3c_gpio_setpull_1down(struct s3c_gpio_chip *chip,
|
||||
unsigned int off, s3c_gpio_pull_t pull)
|
||||
{
|
||||
return s3c_gpio_setpull_1(chip, off, pull, S3C_GPIO_PULL_DOWN);
|
||||
}
|
||||
#endif /* CONFIG_S3C_GPIO_PULL_DOWN */
|
||||
|
||||
#ifdef CONFIG_S5P_GPIO_DRVSTR
|
||||
s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin)
|
||||
{
|
||||
|
|
|
@ -209,6 +209,17 @@ extern s3c_gpio_pull_t s3c_gpio_getpull_updown(struct s3c_gpio_chip *chip,
|
|||
extern s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
|
||||
unsigned int off);
|
||||
|
||||
/**
|
||||
* s3c_gpio_getpull_1down() - Get configuration for choice of down or none
|
||||
* @chip: The gpio chip that the GPIO pin belongs to
|
||||
* @off: The offset to the pin to get the configuration of.
|
||||
*
|
||||
* This helper function reads the state of the pull-down resistor for the
|
||||
* given GPIO in the same case as s3c_gpio_setpull_1down.
|
||||
*/
|
||||
extern s3c_gpio_pull_t s3c_gpio_getpull_1down(struct s3c_gpio_chip *chip,
|
||||
unsigned int off);
|
||||
|
||||
/**
|
||||
* s3c_gpio_setpull_s3c2443() - Pull configuration for s3c2443.
|
||||
* @chip: The gpio chip that is being configured.
|
||||
|
|
|
@ -206,6 +206,7 @@ ENTRY(vfp_save_state)
|
|||
mov pc, lr
|
||||
ENDPROC(vfp_save_state)
|
||||
|
||||
.align
|
||||
last_VFP_context_address:
|
||||
.word last_VFP_context
|
||||
|
||||
|
|
|
@ -0,0 +1,117 @@
|
|||
/* Access to user system call parameters and results
|
||||
*
|
||||
* See asm-generic/syscall.h for function descriptions.
|
||||
*
|
||||
* Copyright (C) 2010 Red Hat, Inc. All Rights Reserved.
|
||||
* Written by David Howells (dhowells@redhat.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_SYSCALL_H
|
||||
#define _ASM_SYSCALL_H
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
extern const unsigned long sys_call_table[];
|
||||
|
||||
static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
|
||||
{
|
||||
return regs->orig_d0;
|
||||
}
|
||||
|
||||
static inline void syscall_rollback(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
regs->d0 = regs->orig_d0;
|
||||
}
|
||||
|
||||
static inline long syscall_get_error(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
unsigned long error = regs->d0;
|
||||
return IS_ERR_VALUE(error) ? error : 0;
|
||||
}
|
||||
|
||||
static inline long syscall_get_return_value(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
return regs->d0;
|
||||
}
|
||||
|
||||
static inline void syscall_set_return_value(struct task_struct *task,
|
||||
struct pt_regs *regs,
|
||||
int error, long val)
|
||||
{
|
||||
regs->d0 = (long) error ?: val;
|
||||
}
|
||||
|
||||
static inline void syscall_get_arguments(struct task_struct *task,
|
||||
struct pt_regs *regs,
|
||||
unsigned int i, unsigned int n,
|
||||
unsigned long *args)
|
||||
{
|
||||
switch (i) {
|
||||
case 0:
|
||||
if (!n--) break;
|
||||
*args++ = regs->a0;
|
||||
case 1:
|
||||
if (!n--) break;
|
||||
*args++ = regs->d1;
|
||||
case 2:
|
||||
if (!n--) break;
|
||||
*args++ = regs->a3;
|
||||
case 3:
|
||||
if (!n--) break;
|
||||
*args++ = regs->a2;
|
||||
case 4:
|
||||
if (!n--) break;
|
||||
*args++ = regs->d3;
|
||||
case 5:
|
||||
if (!n--) break;
|
||||
*args++ = regs->d2;
|
||||
case 6:
|
||||
if (!n--) break;
|
||||
default:
|
||||
BUG();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void syscall_set_arguments(struct task_struct *task,
|
||||
struct pt_regs *regs,
|
||||
unsigned int i, unsigned int n,
|
||||
const unsigned long *args)
|
||||
{
|
||||
switch (i) {
|
||||
case 0:
|
||||
if (!n--) break;
|
||||
regs->a0 = *args++;
|
||||
case 1:
|
||||
if (!n--) break;
|
||||
regs->d1 = *args++;
|
||||
case 2:
|
||||
if (!n--) break;
|
||||
regs->a3 = *args++;
|
||||
case 3:
|
||||
if (!n--) break;
|
||||
regs->a2 = *args++;
|
||||
case 4:
|
||||
if (!n--) break;
|
||||
regs->d3 = *args++;
|
||||
case 5:
|
||||
if (!n--) break;
|
||||
regs->d2 = *args++;
|
||||
case 6:
|
||||
if (!n--) break;
|
||||
default:
|
||||
BUG();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _ASM_SYSCALL_H */
|
|
@ -73,7 +73,8 @@ void gdbstub_io_init(void)
|
|||
GDBPORT_SERIAL_IER = UART_IER_RDI | UART_IER_RLSI;
|
||||
|
||||
/* permit level 0 IRQs to take place */
|
||||
local_change_intr_mask_level(NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
|
||||
arch_local_change_intr_mask_level(
|
||||
NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -87,7 +87,8 @@ void __init gdbstub_io_init(void)
|
|||
tmp = *gdbstub_port->_control;
|
||||
|
||||
/* permit level 0 IRQs only */
|
||||
local_change_intr_mask_level(NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
|
||||
arch_local_change_intr_mask_level(
|
||||
NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1194,7 +1194,8 @@ static int gdbstub(struct pt_regs *regs, enum exception_code excep)
|
|||
|
||||
asm volatile("mov mdr,%0" : "=d"(mdr));
|
||||
local_save_flags(epsw);
|
||||
local_change_intr_mask_level(NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
|
||||
arch_local_change_intr_mask_level(
|
||||
NUM2EPSW_IM(CONFIG_GDBSTUB_IRQ_LEVEL + 1));
|
||||
|
||||
gdbstub_store_fpu();
|
||||
|
||||
|
|
|
@ -75,9 +75,6 @@ static void cpu_unmask_irq(unsigned int irq)
|
|||
smp_send_all_nop();
|
||||
}
|
||||
|
||||
void no_ack_irq(unsigned int irq) { }
|
||||
void no_end_irq(unsigned int irq) { }
|
||||
|
||||
void cpu_ack_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long mask = EIEM_MASK(irq);
|
||||
|
@ -241,7 +238,7 @@ int cpu_claim_irq(unsigned int irq, struct irq_chip *type, void *data)
|
|||
|
||||
/* for iosapic interrupts */
|
||||
if (type) {
|
||||
set_irq_chip_and_handler(irq, type, handle_level_irq);
|
||||
set_irq_chip_and_handler(irq, type, handle_percpu_irq);
|
||||
set_irq_chip_data(irq, data);
|
||||
cpu_unmask_irq(irq);
|
||||
}
|
||||
|
@ -392,7 +389,7 @@ static void claim_cpu_irqs(void)
|
|||
int i;
|
||||
for (i = CPU_IRQ_BASE; i <= CPU_IRQ_MAX; i++) {
|
||||
set_irq_chip_and_handler(i, &cpu_interrupt_type,
|
||||
handle_level_irq);
|
||||
handle_percpu_irq);
|
||||
}
|
||||
|
||||
set_irq_handler(TIMER_IRQ, handle_percpu_irq);
|
||||
|
|
|
@ -98,7 +98,6 @@ void
|
|||
sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
|
||||
{
|
||||
struct rt_sigframe __user *frame;
|
||||
struct siginfo si;
|
||||
sigset_t set;
|
||||
unsigned long usp = (regs->gr[30] & ~(0x01UL));
|
||||
unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE;
|
||||
|
@ -178,13 +177,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
|
|||
|
||||
give_sigsegv:
|
||||
DBG(1,"sys_rt_sigreturn: Sending SIGSEGV\n");
|
||||
si.si_signo = SIGSEGV;
|
||||
si.si_errno = 0;
|
||||
si.si_code = SI_KERNEL;
|
||||
si.si_pid = task_pid_vnr(current);
|
||||
si.si_uid = current_uid();
|
||||
si.si_addr = &frame->uc;
|
||||
force_sig_info(SIGSEGV, &si, current);
|
||||
force_sig(SIGSEGV, current);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/kernel_stat.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/posix-timers.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <asm/s390_ext.h>
|
||||
#include <asm/timer.h>
|
||||
|
@ -566,6 +567,23 @@ void init_cpu_vtimer(void)
|
|||
__ctl_set_bit(0,10);
|
||||
}
|
||||
|
||||
static int __cpuinit s390_nohz_notify(struct notifier_block *self,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
struct s390_idle_data *idle;
|
||||
long cpu = (long) hcpu;
|
||||
|
||||
idle = &per_cpu(s390_idle, cpu);
|
||||
switch (action) {
|
||||
case CPU_DYING:
|
||||
case CPU_DYING_FROZEN:
|
||||
idle->nohz_delay = 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
void __init vtime_init(void)
|
||||
{
|
||||
/* request the cpu timer external interrupt */
|
||||
|
@ -574,5 +592,6 @@ void __init vtime_init(void)
|
|||
|
||||
/* Enable cpu timer interrupts on the boot cpu. */
|
||||
init_cpu_vtimer();
|
||||
cpu_notifier(s390_nohz_notify, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -720,32 +720,6 @@ static struct platform_device camera_devices[] = {
|
|||
};
|
||||
|
||||
/* FSI */
|
||||
/*
|
||||
* FSI-B use external clock which came from da7210.
|
||||
* So, we should change parent of fsi
|
||||
*/
|
||||
#define FCLKBCR 0xa415000c
|
||||
static void fsimck_init(struct clk *clk)
|
||||
{
|
||||
u32 status = __raw_readl(clk->enable_reg);
|
||||
|
||||
/* use external clock */
|
||||
status &= ~0x000000ff;
|
||||
status |= 0x00000080;
|
||||
|
||||
__raw_writel(status, clk->enable_reg);
|
||||
}
|
||||
|
||||
static struct clk_ops fsimck_clk_ops = {
|
||||
.init = fsimck_init,
|
||||
};
|
||||
|
||||
static struct clk fsimckb_clk = {
|
||||
.ops = &fsimck_clk_ops,
|
||||
.enable_reg = (void __iomem *)FCLKBCR,
|
||||
.rate = 0, /* unknown */
|
||||
};
|
||||
|
||||
static struct sh_fsi_platform_info fsi_info = {
|
||||
.portb_flags = SH_FSI_BRS_INV |
|
||||
SH_FSI_OUT_SLAVE_MODE |
|
||||
|
@ -1264,10 +1238,10 @@ static int __init arch_setup(void)
|
|||
/* change parent of FSI B */
|
||||
clk = clk_get(NULL, "fsib_clk");
|
||||
if (!IS_ERR(clk)) {
|
||||
clk_register(&fsimckb_clk);
|
||||
clk_set_parent(clk, &fsimckb_clk);
|
||||
clk_set_rate(clk, 11000);
|
||||
clk_set_rate(&fsimckb_clk, 11000);
|
||||
/* 48kHz dummy clock was used to make sure 1/1 divide */
|
||||
clk_set_rate(&sh7724_fsimckb_clk, 48000);
|
||||
clk_set_parent(clk, &sh7724_fsimckb_clk);
|
||||
clk_set_rate(clk, 48000);
|
||||
clk_put(clk);
|
||||
}
|
||||
|
||||
|
|
|
@ -283,31 +283,6 @@ static struct platform_device ceu1_device = {
|
|||
};
|
||||
|
||||
/* FSI */
|
||||
/*
|
||||
* FSI-A use external clock which came from ak464x.
|
||||
* So, we should change parent of fsi
|
||||
*/
|
||||
#define FCLKACR 0xa4150008
|
||||
static void fsimck_init(struct clk *clk)
|
||||
{
|
||||
u32 status = __raw_readl(clk->enable_reg);
|
||||
|
||||
/* use external clock */
|
||||
status &= ~0x000000ff;
|
||||
status |= 0x00000080;
|
||||
__raw_writel(status, clk->enable_reg);
|
||||
}
|
||||
|
||||
static struct clk_ops fsimck_clk_ops = {
|
||||
.init = fsimck_init,
|
||||
};
|
||||
|
||||
static struct clk fsimcka_clk = {
|
||||
.ops = &fsimck_clk_ops,
|
||||
.enable_reg = (void __iomem *)FCLKACR,
|
||||
.rate = 0, /* unknown */
|
||||
};
|
||||
|
||||
/* change J20, J21, J22 pin to 1-2 connection to use slave mode */
|
||||
static struct sh_fsi_platform_info fsi_info = {
|
||||
.porta_flags = SH_FSI_BRS_INV |
|
||||
|
@ -852,37 +827,29 @@ static int __init devices_setup(void)
|
|||
gpio_request(GPIO_FN_KEYOUT0, NULL);
|
||||
|
||||
/* enable FSI */
|
||||
gpio_request(GPIO_FN_FSIMCKB, NULL);
|
||||
gpio_request(GPIO_FN_FSIMCKA, NULL);
|
||||
gpio_request(GPIO_FN_FSIIASD, NULL);
|
||||
gpio_request(GPIO_FN_FSIOASD, NULL);
|
||||
gpio_request(GPIO_FN_FSIIABCK, NULL);
|
||||
gpio_request(GPIO_FN_FSIIALRCK, NULL);
|
||||
gpio_request(GPIO_FN_FSIOABCK, NULL);
|
||||
gpio_request(GPIO_FN_FSIOALRCK, NULL);
|
||||
gpio_request(GPIO_FN_CLKAUDIOAO, NULL);
|
||||
gpio_request(GPIO_FN_FSIIBSD, NULL);
|
||||
gpio_request(GPIO_FN_FSIOBSD, NULL);
|
||||
gpio_request(GPIO_FN_FSIIBBCK, NULL);
|
||||
gpio_request(GPIO_FN_FSIIBLRCK, NULL);
|
||||
gpio_request(GPIO_FN_FSIOBBCK, NULL);
|
||||
gpio_request(GPIO_FN_FSIOBLRCK, NULL);
|
||||
gpio_request(GPIO_FN_CLKAUDIOBO, NULL);
|
||||
gpio_request(GPIO_FN_FSIIASD, NULL);
|
||||
|
||||
/* set SPU2 clock to 83.4 MHz */
|
||||
clk = clk_get(NULL, "spu_clk");
|
||||
if (clk) {
|
||||
if (!IS_ERR(clk)) {
|
||||
clk_set_rate(clk, clk_round_rate(clk, 83333333));
|
||||
clk_put(clk);
|
||||
}
|
||||
|
||||
/* change parent of FSI A */
|
||||
clk = clk_get(NULL, "fsia_clk");
|
||||
if (clk) {
|
||||
clk_register(&fsimcka_clk);
|
||||
clk_set_parent(clk, &fsimcka_clk);
|
||||
clk_set_rate(clk, 11000);
|
||||
clk_set_rate(&fsimcka_clk, 11000);
|
||||
if (!IS_ERR(clk)) {
|
||||
/* 48kHz dummy clock was used to make sure 1/1 divide */
|
||||
clk_set_rate(&sh7724_fsimcka_clk, 48000);
|
||||
clk_set_parent(clk, &sh7724_fsimcka_clk);
|
||||
clk_set_rate(clk, 48000);
|
||||
clk_put(clk);
|
||||
}
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@ void kmap_coherent_init(void);
|
|||
void *kmap_coherent(struct page *page, unsigned long addr);
|
||||
void kunmap_coherent(void *kvaddr);
|
||||
|
||||
#define PG_dcache_dirty PG_arch_1
|
||||
#define PG_dcache_clean PG_arch_1
|
||||
|
||||
void cpu_cache_init(void);
|
||||
|
||||
|
|
|
@ -303,4 +303,7 @@ enum {
|
|||
SHDMA_SLAVE_SDHI1_RX,
|
||||
};
|
||||
|
||||
extern struct clk sh7724_fsimcka_clk;
|
||||
extern struct clk sh7724_fsimckb_clk;
|
||||
|
||||
#endif /* __ASM_SH7724_H__ */
|
||||
|
|
|
@ -111,12 +111,21 @@ static struct clk div3_clk = {
|
|||
.parent = &pll_clk,
|
||||
};
|
||||
|
||||
/* External input clock (pin name: FSIMCKA/FSIMCKB ) */
|
||||
struct clk sh7724_fsimcka_clk = {
|
||||
};
|
||||
|
||||
struct clk sh7724_fsimckb_clk = {
|
||||
};
|
||||
|
||||
static struct clk *main_clks[] = {
|
||||
&r_clk,
|
||||
&extal_clk,
|
||||
&fll_clk,
|
||||
&pll_clk,
|
||||
&div3_clk,
|
||||
&sh7724_fsimcka_clk,
|
||||
&sh7724_fsimckb_clk,
|
||||
};
|
||||
|
||||
static void div4_kick(struct clk *clk)
|
||||
|
@ -154,16 +163,38 @@ struct clk div4_clks[DIV4_NR] = {
|
|||
[DIV4_M1] = DIV4(FRQCRB, 4, 0x2f7c, CLK_ENABLE_ON_INIT),
|
||||
};
|
||||
|
||||
enum { DIV6_V, DIV6_FA, DIV6_FB, DIV6_I, DIV6_S, DIV6_NR };
|
||||
enum { DIV6_V, DIV6_I, DIV6_S, DIV6_NR };
|
||||
|
||||
static struct clk div6_clks[DIV6_NR] = {
|
||||
[DIV6_V] = SH_CLK_DIV6(&div3_clk, VCLKCR, 0),
|
||||
[DIV6_FA] = SH_CLK_DIV6(&div3_clk, FCLKACR, 0),
|
||||
[DIV6_FB] = SH_CLK_DIV6(&div3_clk, FCLKBCR, 0),
|
||||
[DIV6_I] = SH_CLK_DIV6(&div3_clk, IRDACLKCR, 0),
|
||||
[DIV6_S] = SH_CLK_DIV6(&div3_clk, SPUCLKCR, CLK_ENABLE_ON_INIT),
|
||||
};
|
||||
|
||||
enum { DIV6_FA, DIV6_FB, DIV6_REPARENT_NR };
|
||||
|
||||
/* Indices are important - they are the actual src selecting values */
|
||||
static struct clk *fclkacr_parent[] = {
|
||||
[0] = &div3_clk,
|
||||
[1] = NULL,
|
||||
[2] = &sh7724_fsimcka_clk,
|
||||
[3] = NULL,
|
||||
};
|
||||
|
||||
static struct clk *fclkbcr_parent[] = {
|
||||
[0] = &div3_clk,
|
||||
[1] = NULL,
|
||||
[2] = &sh7724_fsimckb_clk,
|
||||
[3] = NULL,
|
||||
};
|
||||
|
||||
static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
|
||||
[DIV6_FA] = SH_CLK_DIV6_EXT(&div3_clk, FCLKACR, 0,
|
||||
fclkacr_parent, ARRAY_SIZE(fclkacr_parent), 6, 2),
|
||||
[DIV6_FB] = SH_CLK_DIV6_EXT(&div3_clk, FCLKBCR, 0,
|
||||
fclkbcr_parent, ARRAY_SIZE(fclkbcr_parent), 6, 2),
|
||||
};
|
||||
|
||||
static struct clk mstp_clks[HWBLK_NR] = {
|
||||
SH_HWBLK_CLK(HWBLK_TLB, &div4_clks[DIV4_I], CLK_ENABLE_ON_INIT),
|
||||
SH_HWBLK_CLK(HWBLK_IC, &div4_clks[DIV4_I], CLK_ENABLE_ON_INIT),
|
||||
|
@ -240,8 +271,8 @@ static struct clk_lookup lookups[] = {
|
|||
|
||||
/* DIV6 clocks */
|
||||
CLKDEV_CON_ID("video_clk", &div6_clks[DIV6_V]),
|
||||
CLKDEV_CON_ID("fsia_clk", &div6_clks[DIV6_FA]),
|
||||
CLKDEV_CON_ID("fsib_clk", &div6_clks[DIV6_FB]),
|
||||
CLKDEV_CON_ID("fsia_clk", &div6_reparent_clks[DIV6_FA]),
|
||||
CLKDEV_CON_ID("fsib_clk", &div6_reparent_clks[DIV6_FB]),
|
||||
CLKDEV_CON_ID("irda_clk", &div6_clks[DIV6_I]),
|
||||
CLKDEV_CON_ID("spu_clk", &div6_clks[DIV6_S]),
|
||||
|
||||
|
@ -375,6 +406,9 @@ int __init arch_clk_init(void)
|
|||
if (!ret)
|
||||
ret = sh_clk_div6_register(div6_clks, DIV6_NR);
|
||||
|
||||
if (!ret)
|
||||
ret = sh_clk_div6_reparent_register(div6_reparent_clks, DIV6_REPARENT_NR);
|
||||
|
||||
if (!ret)
|
||||
ret = sh_hwblk_clk_register(mstp_clks, HWBLK_NR);
|
||||
|
||||
|
|
|
@ -114,7 +114,7 @@ static void sh4_flush_dcache_page(void *arg)
|
|||
struct address_space *mapping = page_mapping(page);
|
||||
|
||||
if (mapping && !mapping_mapped(mapping))
|
||||
set_bit(PG_dcache_dirty, &page->flags);
|
||||
clear_bit(PG_dcache_clean, &page->flags);
|
||||
else
|
||||
#endif
|
||||
flush_cache_one(CACHE_OC_ADDRESS_ARRAY |
|
||||
|
@ -239,7 +239,7 @@ static void sh4_flush_cache_page(void *args)
|
|||
* another ASID than the current one.
|
||||
*/
|
||||
map_coherent = (current_cpu_data.dcache.n_aliases &&
|
||||
!test_bit(PG_dcache_dirty, &page->flags) &&
|
||||
test_bit(PG_dcache_clean, &page->flags) &&
|
||||
page_mapped(page));
|
||||
if (map_coherent)
|
||||
vaddr = kmap_coherent(page, address);
|
||||
|
|
|
@ -139,7 +139,7 @@ static void sh7705_flush_dcache_page(void *arg)
|
|||
struct address_space *mapping = page_mapping(page);
|
||||
|
||||
if (mapping && !mapping_mapped(mapping))
|
||||
set_bit(PG_dcache_dirty, &page->flags);
|
||||
clear_bit(PG_dcache_clean, &page->flags);
|
||||
else
|
||||
__flush_dcache_page(__pa(page_address(page)));
|
||||
}
|
||||
|
|
|
@ -60,14 +60,14 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
|
|||
unsigned long len)
|
||||
{
|
||||
if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
|
||||
!test_bit(PG_dcache_dirty, &page->flags)) {
|
||||
test_bit(PG_dcache_clean, &page->flags)) {
|
||||
void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
|
||||
memcpy(vto, src, len);
|
||||
kunmap_coherent(vto);
|
||||
} else {
|
||||
memcpy(dst, src, len);
|
||||
if (boot_cpu_data.dcache.n_aliases)
|
||||
set_bit(PG_dcache_dirty, &page->flags);
|
||||
clear_bit(PG_dcache_clean, &page->flags);
|
||||
}
|
||||
|
||||
if (vma->vm_flags & VM_EXEC)
|
||||
|
@ -79,14 +79,14 @@ void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
|
|||
unsigned long len)
|
||||
{
|
||||
if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
|
||||
!test_bit(PG_dcache_dirty, &page->flags)) {
|
||||
test_bit(PG_dcache_clean, &page->flags)) {
|
||||
void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
|
||||
memcpy(dst, vfrom, len);
|
||||
kunmap_coherent(vfrom);
|
||||
} else {
|
||||
memcpy(dst, src, len);
|
||||
if (boot_cpu_data.dcache.n_aliases)
|
||||
set_bit(PG_dcache_dirty, &page->flags);
|
||||
clear_bit(PG_dcache_clean, &page->flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -98,7 +98,7 @@ void copy_user_highpage(struct page *to, struct page *from,
|
|||
vto = kmap_atomic(to, KM_USER1);
|
||||
|
||||
if (boot_cpu_data.dcache.n_aliases && page_mapped(from) &&
|
||||
!test_bit(PG_dcache_dirty, &from->flags)) {
|
||||
test_bit(PG_dcache_clean, &from->flags)) {
|
||||
vfrom = kmap_coherent(from, vaddr);
|
||||
copy_page(vto, vfrom);
|
||||
kunmap_coherent(vfrom);
|
||||
|
@ -141,7 +141,7 @@ void __update_cache(struct vm_area_struct *vma,
|
|||
|
||||
page = pfn_to_page(pfn);
|
||||
if (pfn_valid(pfn)) {
|
||||
int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
|
||||
int dirty = !test_and_set_bit(PG_dcache_clean, &page->flags);
|
||||
if (dirty)
|
||||
__flush_purge_region(page_address(page), PAGE_SIZE);
|
||||
}
|
||||
|
@ -153,7 +153,7 @@ void __flush_anon_page(struct page *page, unsigned long vmaddr)
|
|||
|
||||
if (pages_do_alias(addr, vmaddr)) {
|
||||
if (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&
|
||||
!test_bit(PG_dcache_dirty, &page->flags)) {
|
||||
test_bit(PG_dcache_clean, &page->flags)) {
|
||||
void *kaddr;
|
||||
|
||||
kaddr = kmap_coherent(page, vmaddr);
|
||||
|
|
|
@ -34,7 +34,7 @@ void *kmap_coherent(struct page *page, unsigned long addr)
|
|||
enum fixed_addresses idx;
|
||||
unsigned long vaddr;
|
||||
|
||||
BUG_ON(test_bit(PG_dcache_dirty, &page->flags));
|
||||
BUG_ON(!test_bit(PG_dcache_clean, &page->flags));
|
||||
|
||||
pagefault_disable();
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
|
|||
void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
|
||||
struct pvclock_vcpu_time_info *vcpu,
|
||||
struct timespec *ts);
|
||||
void pvclock_resume(void);
|
||||
|
||||
/*
|
||||
* Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
|
||||
|
|
|
@ -83,6 +83,11 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src)
|
|||
|
||||
static atomic64_t last_value = ATOMIC64_INIT(0);
|
||||
|
||||
void pvclock_resume(void)
|
||||
{
|
||||
atomic64_set(&last_value, 0);
|
||||
}
|
||||
|
||||
cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
|
||||
{
|
||||
struct pvclock_shadow_time shadow;
|
||||
|
|
|
@ -70,6 +70,9 @@ static int acpi_register_gsi_xen_hvm(struct device *dev, u32 gsi,
|
|||
struct xen_pci_frontend_ops *xen_pci_frontend;
|
||||
EXPORT_SYMBOL_GPL(xen_pci_frontend);
|
||||
|
||||
#define XEN_PIRQ_MSI_DATA (MSI_DATA_TRIGGER_EDGE | \
|
||||
MSI_DATA_LEVEL_ASSERT | (3 << 8) | MSI_DATA_VECTOR(0))
|
||||
|
||||
static void xen_msi_compose_msg(struct pci_dev *pdev, unsigned int pirq,
|
||||
struct msi_msg *msg)
|
||||
{
|
||||
|
@ -83,12 +86,7 @@ static void xen_msi_compose_msg(struct pci_dev *pdev, unsigned int pirq,
|
|||
MSI_ADDR_REDIRECTION_CPU |
|
||||
MSI_ADDR_DEST_ID(pirq);
|
||||
|
||||
msg->data =
|
||||
MSI_DATA_TRIGGER_EDGE |
|
||||
MSI_DATA_LEVEL_ASSERT |
|
||||
/* delivery mode reserved */
|
||||
(3 << 8) |
|
||||
MSI_DATA_VECTOR(0);
|
||||
msg->data = XEN_PIRQ_MSI_DATA;
|
||||
}
|
||||
|
||||
static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||
|
@ -98,8 +96,23 @@ static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
|||
struct msi_msg msg;
|
||||
|
||||
list_for_each_entry(msidesc, &dev->msi_list, list) {
|
||||
__read_msi_msg(msidesc, &msg);
|
||||
pirq = MSI_ADDR_EXT_DEST_ID(msg.address_hi) |
|
||||
((msg.address_lo >> MSI_ADDR_DEST_ID_SHIFT) & 0xff);
|
||||
if (xen_irq_from_pirq(pirq) >= 0 && msg.data == XEN_PIRQ_MSI_DATA) {
|
||||
xen_allocate_pirq_msi((type == PCI_CAP_ID_MSIX) ?
|
||||
"msi-x" : "msi", &irq, &pirq);
|
||||
"msi-x" : "msi", &irq, &pirq, XEN_ALLOC_IRQ);
|
||||
if (irq < 0)
|
||||
goto error;
|
||||
ret = set_irq_msi(irq, msidesc);
|
||||
if (ret < 0)
|
||||
goto error_while;
|
||||
printk(KERN_DEBUG "xen: msi already setup: msi --> irq=%d"
|
||||
" pirq=%d\n", irq, pirq);
|
||||
return 0;
|
||||
}
|
||||
xen_allocate_pirq_msi((type == PCI_CAP_ID_MSIX) ?
|
||||
"msi-x" : "msi", &irq, &pirq, (XEN_ALLOC_IRQ | XEN_ALLOC_PIRQ));
|
||||
if (irq < 0 || pirq < 0)
|
||||
goto error;
|
||||
printk(KERN_DEBUG "xen: msi --> irq=%d, pirq=%d\n", irq, pirq);
|
||||
|
|
|
@ -1021,10 +1021,6 @@ static void xen_reboot(int reason)
|
|||
{
|
||||
struct sched_shutdown r = { .reason = reason };
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
stop_other_cpus();
|
||||
#endif
|
||||
|
||||
if (HYPERVISOR_sched_op(SCHEDOP_shutdown, &r))
|
||||
BUG();
|
||||
}
|
||||
|
|
|
@ -2415,8 +2415,6 @@ void __init xen_init_mmu_ops(void)
|
|||
x86_init.paging.pagetable_setup_done = xen_pagetable_setup_done;
|
||||
pv_mmu_ops = xen_mmu_ops;
|
||||
|
||||
vmap_lazy_unmap = false;
|
||||
|
||||
memset(dummy_mapping, 0xff, PAGE_SIZE);
|
||||
}
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ static int __init check_platform_magic(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void __init xen_unplug_emulated_devices(void)
|
||||
void xen_unplug_emulated_devices(void)
|
||||
{
|
||||
int r;
|
||||
|
||||
|
|
|
@ -181,24 +181,21 @@ char * __init xen_memory_setup(void)
|
|||
for (i = 0; i < memmap.nr_entries; i++) {
|
||||
unsigned long long end = map[i].addr + map[i].size;
|
||||
|
||||
if (map[i].type == E820_RAM) {
|
||||
if (map[i].addr < mem_end && end > mem_end) {
|
||||
/* Truncate region to max_mem. */
|
||||
u64 delta = end - mem_end;
|
||||
if (map[i].type == E820_RAM && end > mem_end) {
|
||||
/* RAM off the end - may be partially included */
|
||||
u64 delta = min(map[i].size, end - mem_end);
|
||||
|
||||
map[i].size -= delta;
|
||||
end -= delta;
|
||||
|
||||
extra_pages += PFN_DOWN(delta);
|
||||
|
||||
end = mem_end;
|
||||
}
|
||||
}
|
||||
|
||||
if (end > xen_extra_mem_start)
|
||||
if (map[i].size > 0 && end > xen_extra_mem_start)
|
||||
xen_extra_mem_start = end;
|
||||
|
||||
/* If region is non-RAM or below mem_end, add what remains */
|
||||
if ((map[i].type != E820_RAM || map[i].addr < mem_end) &&
|
||||
map[i].size > 0)
|
||||
/* Add region if any remains */
|
||||
if (map[i].size > 0)
|
||||
e820_add_region(map[i].addr, map[i].size, map[i].type);
|
||||
}
|
||||
|
||||
|
@ -252,20 +249,6 @@ char * __init xen_memory_setup(void)
|
|||
return "Xen";
|
||||
}
|
||||
|
||||
static void xen_idle(void)
|
||||
{
|
||||
local_irq_disable();
|
||||
|
||||
if (need_resched())
|
||||
local_irq_enable();
|
||||
else {
|
||||
current_thread_info()->status &= ~TS_POLLING;
|
||||
smp_mb__after_clear_bit();
|
||||
safe_halt();
|
||||
current_thread_info()->status |= TS_POLLING;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the bit indicating "nosegneg" library variants should be used.
|
||||
* We only need to bother in pure 32-bit mode; compat 32-bit processes
|
||||
|
@ -362,7 +345,11 @@ void __init xen_arch_setup(void)
|
|||
MAX_GUEST_CMDLINE > COMMAND_LINE_SIZE ?
|
||||
COMMAND_LINE_SIZE : MAX_GUEST_CMDLINE);
|
||||
|
||||
pm_idle = xen_idle;
|
||||
/* Set up idle, making sure it calls safe_halt() pvop */
|
||||
#ifdef CONFIG_X86_32
|
||||
boot_cpu_data.hlt_works_ok = 1;
|
||||
#endif
|
||||
pm_idle = default_idle;
|
||||
|
||||
fiddle_vdso();
|
||||
}
|
||||
|
|
|
@ -31,6 +31,7 @@ void xen_hvm_post_suspend(int suspend_cancelled)
|
|||
int cpu;
|
||||
xen_hvm_init_shared_info();
|
||||
xen_callback_vector();
|
||||
xen_unplug_emulated_devices();
|
||||
if (xen_feature(XENFEAT_hvm_safe_pvclock)) {
|
||||
for_each_online_cpu(cpu) {
|
||||
xen_setup_runstate_info(cpu);
|
||||
|
|
|
@ -426,6 +426,8 @@ void xen_timer_resume(void)
|
|||
{
|
||||
int cpu;
|
||||
|
||||
pvclock_resume();
|
||||
|
||||
if (xen_clockevent != &xen_vcpuop_clockevent)
|
||||
return;
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ void xen_vcpu_restore(void);
|
|||
|
||||
void xen_callback_vector(void);
|
||||
void xen_hvm_init_shared_info(void);
|
||||
void __init xen_unplug_emulated_devices(void);
|
||||
void xen_unplug_emulated_devices(void);
|
||||
|
||||
void __init xen_build_dynamic_phys_to_machine(void);
|
||||
|
||||
|
|
|
@ -1213,3 +1213,4 @@ module_exit(sh_dmae_exit);
|
|||
MODULE_AUTHOR("Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>");
|
||||
MODULE_DESCRIPTION("Renesas SH DMA Engine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:sh-dma-engine");
|
||||
|
|
|
@ -56,6 +56,18 @@ static struct cs5535_gpio_chip {
|
|||
* registers, see include/linux/cs5535.h.
|
||||
*/
|
||||
|
||||
static void errata_outl(u32 val, unsigned long addr)
|
||||
{
|
||||
/*
|
||||
* According to the CS5536 errata (#36), after suspend
|
||||
* a write to the high bank GPIO register will clear all
|
||||
* non-selected bits; the recommended workaround is a
|
||||
* read-modify-write operation.
|
||||
*/
|
||||
val |= inl(addr);
|
||||
outl(val, addr);
|
||||
}
|
||||
|
||||
static void __cs5535_gpio_set(struct cs5535_gpio_chip *chip, unsigned offset,
|
||||
unsigned int reg)
|
||||
{
|
||||
|
@ -64,7 +76,7 @@ static void __cs5535_gpio_set(struct cs5535_gpio_chip *chip, unsigned offset,
|
|||
outl(1 << offset, chip->base + reg);
|
||||
else
|
||||
/* high bank register */
|
||||
outl(1 << (offset - 16), chip->base + 0x80 + reg);
|
||||
errata_outl(1 << (offset - 16), chip->base + 0x80 + reg);
|
||||
}
|
||||
|
||||
void cs5535_gpio_set(unsigned offset, unsigned int reg)
|
||||
|
@ -86,7 +98,7 @@ static void __cs5535_gpio_clear(struct cs5535_gpio_chip *chip, unsigned offset,
|
|||
outl(1 << (offset + 16), chip->base + reg);
|
||||
else
|
||||
/* high bank register */
|
||||
outl(1 << offset, chip->base + 0x80 + reg);
|
||||
errata_outl(1 << offset, chip->base + 0x80 + reg);
|
||||
}
|
||||
|
||||
void cs5535_gpio_clear(unsigned offset, unsigned int reg)
|
||||
|
|
|
@ -241,7 +241,7 @@ void drm_helper_disable_unused_functions(struct drm_device *dev)
|
|||
}
|
||||
|
||||
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
||||
if (!drm_helper_encoder_in_use(encoder)) {
|
||||
if (encoder->crtc && !drm_helper_encoder_in_use(encoder)) {
|
||||
drm_encoder_disable(encoder);
|
||||
/* disconnector encoder from any connector */
|
||||
encoder->crtc = NULL;
|
||||
|
|
|
@ -585,10 +585,13 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
|
|||
struct timeval now;
|
||||
unsigned long flags;
|
||||
unsigned int seq;
|
||||
int ret;
|
||||
|
||||
e = kzalloc(sizeof *e, GFP_KERNEL);
|
||||
if (e == NULL)
|
||||
return -ENOMEM;
|
||||
if (e == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto err_put;
|
||||
}
|
||||
|
||||
e->pipe = pipe;
|
||||
e->base.pid = current->pid;
|
||||
|
@ -603,9 +606,8 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
|
|||
spin_lock_irqsave(&dev->event_lock, flags);
|
||||
|
||||
if (file_priv->event_space < sizeof e->event) {
|
||||
spin_unlock_irqrestore(&dev->event_lock, flags);
|
||||
kfree(e);
|
||||
return -ENOMEM;
|
||||
ret = -EBUSY;
|
||||
goto err_unlock;
|
||||
}
|
||||
|
||||
file_priv->event_space -= sizeof e->event;
|
||||
|
@ -638,6 +640,13 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
|
|||
spin_unlock_irqrestore(&dev->event_lock, flags);
|
||||
|
||||
return 0;
|
||||
|
||||
err_unlock:
|
||||
spin_unlock_irqrestore(&dev->event_lock, flags);
|
||||
kfree(e);
|
||||
err_put:
|
||||
drm_vblank_put(dev, e->pipe);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -190,37 +190,6 @@ static void intel_dsm_platform_mux_info(void)
|
|||
kfree(output.pointer);
|
||||
}
|
||||
|
||||
static int intel_dsm_switchto(enum vga_switcheroo_client_id id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_dsm_power_state(enum vga_switcheroo_client_id id,
|
||||
enum vga_switcheroo_state state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_dsm_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_dsm_get_client_id(struct pci_dev *pdev)
|
||||
{
|
||||
if (intel_dsm_priv.dhandle == DEVICE_ACPI_HANDLE(&pdev->dev))
|
||||
return VGA_SWITCHEROO_IGD;
|
||||
else
|
||||
return VGA_SWITCHEROO_DIS;
|
||||
}
|
||||
|
||||
static struct vga_switcheroo_handler intel_dsm_handler = {
|
||||
.switchto = intel_dsm_switchto,
|
||||
.power_state = intel_dsm_power_state,
|
||||
.init = intel_dsm_init,
|
||||
.get_client_id = intel_dsm_get_client_id,
|
||||
};
|
||||
|
||||
static bool intel_dsm_pci_probe(struct pci_dev *pdev)
|
||||
{
|
||||
acpi_handle dhandle, intel_handle;
|
||||
|
@ -276,11 +245,8 @@ void intel_register_dsm_handler(void)
|
|||
{
|
||||
if (!intel_dsm_detect())
|
||||
return;
|
||||
|
||||
vga_switcheroo_register_handler(&intel_dsm_handler);
|
||||
}
|
||||
|
||||
void intel_unregister_dsm_handler(void)
|
||||
{
|
||||
vga_switcheroo_unregister_handler();
|
||||
}
|
||||
|
|
|
@ -479,6 +479,7 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
|
|||
uint16_t address = algo_data->address;
|
||||
uint8_t msg[5];
|
||||
uint8_t reply[2];
|
||||
unsigned retry;
|
||||
int msg_bytes;
|
||||
int reply_bytes;
|
||||
int ret;
|
||||
|
@ -513,7 +514,7 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
|
|||
break;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
for (retry = 0; retry < 5; retry++) {
|
||||
ret = intel_dp_aux_ch(intel_dp,
|
||||
msg, msg_bytes,
|
||||
reply, reply_bytes);
|
||||
|
@ -521,6 +522,25 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
|
|||
DRM_DEBUG_KMS("aux_ch failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
switch (reply[0] & AUX_NATIVE_REPLY_MASK) {
|
||||
case AUX_NATIVE_REPLY_ACK:
|
||||
/* I2C-over-AUX Reply field is only valid
|
||||
* when paired with AUX ACK.
|
||||
*/
|
||||
break;
|
||||
case AUX_NATIVE_REPLY_NACK:
|
||||
DRM_DEBUG_KMS("aux_ch native nack\n");
|
||||
return -EREMOTEIO;
|
||||
case AUX_NATIVE_REPLY_DEFER:
|
||||
udelay(100);
|
||||
continue;
|
||||
default:
|
||||
DRM_ERROR("aux_ch invalid native reply 0x%02x\n",
|
||||
reply[0]);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
|
||||
switch (reply[0] & AUX_I2C_REPLY_MASK) {
|
||||
case AUX_I2C_REPLY_ACK:
|
||||
if (mode == MODE_I2C_READ) {
|
||||
|
@ -528,17 +548,20 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
|
|||
}
|
||||
return reply_bytes - 1;
|
||||
case AUX_I2C_REPLY_NACK:
|
||||
DRM_DEBUG_KMS("aux_ch nack\n");
|
||||
DRM_DEBUG_KMS("aux_i2c nack\n");
|
||||
return -EREMOTEIO;
|
||||
case AUX_I2C_REPLY_DEFER:
|
||||
DRM_DEBUG_KMS("aux_ch defer\n");
|
||||
DRM_DEBUG_KMS("aux_i2c defer\n");
|
||||
udelay(100);
|
||||
break;
|
||||
default:
|
||||
DRM_ERROR("aux_ch invalid reply 0x%02x\n", reply[0]);
|
||||
DRM_ERROR("aux_i2c invalid reply 0x%02x\n", reply[0]);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
}
|
||||
|
||||
DRM_ERROR("too many retries, giving up\n");
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -696,20 +696,17 @@ int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n)
|
|||
unsigned long end;
|
||||
u32 head;
|
||||
|
||||
head = intel_read_status_page(ring, 4);
|
||||
if (head) {
|
||||
ring->head = head & HEAD_ADDR;
|
||||
ring->space = ring->head - (ring->tail + 8);
|
||||
if (ring->space < 0)
|
||||
ring->space += ring->size;
|
||||
if (ring->space >= n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
trace_i915_ring_wait_begin (dev);
|
||||
end = jiffies + 3 * HZ;
|
||||
do {
|
||||
ring->head = I915_READ_HEAD(ring) & HEAD_ADDR;
|
||||
/* If the reported head position has wrapped or hasn't advanced,
|
||||
* fallback to the slow and accurate path.
|
||||
*/
|
||||
head = intel_read_status_page(ring, 4);
|
||||
if (head < ring->actual_head)
|
||||
head = I915_READ_HEAD(ring);
|
||||
ring->actual_head = head;
|
||||
ring->head = head & HEAD_ADDR;
|
||||
ring->space = ring->head - (ring->tail + 8);
|
||||
if (ring->space < 0)
|
||||
ring->space += ring->size;
|
||||
|
|
|
@ -44,8 +44,9 @@ struct intel_ring_buffer {
|
|||
struct drm_device *dev;
|
||||
struct drm_i915_gem_object *obj;
|
||||
|
||||
unsigned int head;
|
||||
unsigned int tail;
|
||||
u32 actual_head;
|
||||
u32 head;
|
||||
u32 tail;
|
||||
int space;
|
||||
int size;
|
||||
struct intel_hw_status_page status_page;
|
||||
|
|
|
@ -1908,9 +1908,12 @@ intel_sdvo_select_i2c_bus(struct drm_i915_private *dev_priv,
|
|||
speed = mapping->i2c_speed;
|
||||
}
|
||||
|
||||
if (pin < GMBUS_NUM_PORTS) {
|
||||
sdvo->i2c = &dev_priv->gmbus[pin].adapter;
|
||||
intel_gmbus_set_speed(sdvo->i2c, speed);
|
||||
intel_gmbus_force_bit(sdvo->i2c, true);
|
||||
} else
|
||||
sdvo->i2c = &dev_priv->gmbus[GMBUS_PORT_DPB].adapter;
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
|
@ -1195,8 +1195,10 @@ void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
|
|||
mc->vram_end, mc->real_vram_size >> 20);
|
||||
} else {
|
||||
u64 base = 0;
|
||||
if (rdev->flags & RADEON_IS_IGP)
|
||||
base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24;
|
||||
if (rdev->flags & RADEON_IS_IGP) {
|
||||
base = RREG32(MC_VM_FB_LOCATION) & 0xFFFF;
|
||||
base <<= 24;
|
||||
}
|
||||
radeon_vram_location(rdev, &rdev->mc, base);
|
||||
rdev->mc.gtt_base_align = 0;
|
||||
radeon_gtt_location(rdev, mc);
|
||||
|
|
|
@ -286,7 +286,7 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64
|
|||
mc->mc_vram_size = mc->aper_size;
|
||||
}
|
||||
mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
|
||||
dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
|
||||
dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",
|
||||
mc->mc_vram_size >> 20, mc->vram_start,
|
||||
mc->vram_end, mc->real_vram_size >> 20);
|
||||
}
|
||||
|
@ -323,7 +323,7 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
|
|||
mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
|
||||
}
|
||||
mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
|
||||
dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n",
|
||||
dev_info(rdev->dev, "GTT: %lluM 0x%016llX - 0x%016llX\n",
|
||||
mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end);
|
||||
}
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
|
|||
u32 c = 0;
|
||||
|
||||
rbo->placement.fpfn = 0;
|
||||
rbo->placement.lpfn = rbo->rdev->mc.active_vram_size >> PAGE_SHIFT;
|
||||
rbo->placement.lpfn = 0;
|
||||
rbo->placement.placement = rbo->placements;
|
||||
rbo->placement.busy_placement = rbo->placements;
|
||||
if (domain & RADEON_GEM_DOMAIN_VRAM)
|
||||
|
@ -91,7 +91,8 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
|
|||
{
|
||||
struct radeon_bo *bo;
|
||||
enum ttm_bo_type type;
|
||||
int page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
|
||||
unsigned long page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
|
||||
unsigned long max_size = 0;
|
||||
int r;
|
||||
|
||||
if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) {
|
||||
|
@ -104,6 +105,14 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
|
|||
}
|
||||
*bo_ptr = NULL;
|
||||
|
||||
/* maximun bo size is the minimun btw visible vram and gtt size */
|
||||
max_size = min(rdev->mc.visible_vram_size, rdev->mc.gtt_size);
|
||||
if ((page_align << PAGE_SHIFT) >= max_size) {
|
||||
printk(KERN_WARNING "%s:%d alloc size %ldM bigger than %ldMb limit\n",
|
||||
__func__, __LINE__, page_align >> (20 - PAGE_SHIFT), max_size >> 20);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
retry:
|
||||
bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
|
||||
if (bo == NULL)
|
||||
|
|
|
@ -1386,6 +1386,7 @@ static const struct hid_device_id hid_blacklist[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
|
||||
|
|
|
@ -221,7 +221,7 @@ static int egalax_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
|||
struct egalax_data *td;
|
||||
struct hid_report *report;
|
||||
|
||||
td = kmalloc(sizeof(struct egalax_data), GFP_KERNEL);
|
||||
td = kzalloc(sizeof(struct egalax_data), GFP_KERNEL);
|
||||
if (!td) {
|
||||
dev_err(&hdev->dev, "cannot allocate eGalax data\n");
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -174,7 +174,7 @@ static int hidinput_setkeycode(struct input_dev *dev,
|
|||
|
||||
clear_bit(*old_keycode, dev->keybit);
|
||||
set_bit(usage->code, dev->keybit);
|
||||
dbg_hid(KERN_DEBUG "Assigned keycode %d to HID usage code %x\n",
|
||||
dbg_hid("Assigned keycode %d to HID usage code %x\n",
|
||||
usage->code, usage->hid);
|
||||
|
||||
/*
|
||||
|
@ -203,8 +203,8 @@ static int hidinput_setkeycode(struct input_dev *dev,
|
|||
*
|
||||
* as seen in the HID specification v1.11 6.2.2.7 Global Items.
|
||||
*
|
||||
* Only exponent 1 length units are processed. Centimeters are converted to
|
||||
* inches. Degrees are converted to radians.
|
||||
* Only exponent 1 length units are processed. Centimeters and inches are
|
||||
* converted to millimeters. Degrees are converted to radians.
|
||||
*/
|
||||
static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)
|
||||
{
|
||||
|
@ -225,13 +225,16 @@ static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)
|
|||
*/
|
||||
if (code == ABS_X || code == ABS_Y || code == ABS_Z) {
|
||||
if (field->unit == 0x11) { /* If centimeters */
|
||||
/* Convert to inches */
|
||||
prev = logical_extents;
|
||||
logical_extents *= 254;
|
||||
if (logical_extents < prev)
|
||||
/* Convert to millimeters */
|
||||
unit_exponent += 1;
|
||||
} else if (field->unit == 0x13) { /* If inches */
|
||||
/* Convert to millimeters */
|
||||
prev = physical_extents;
|
||||
physical_extents *= 254;
|
||||
if (physical_extents < prev)
|
||||
return 0;
|
||||
unit_exponent += 2;
|
||||
} else if (field->unit != 0x13) { /* If not inches */
|
||||
unit_exponent -= 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else if (code == ABS_RX || code == ABS_RY || code == ABS_RZ) {
|
||||
|
|
|
@ -256,6 +256,8 @@ static const struct hid_device_id tm_devices[] = {
|
|||
.driver_data = (unsigned long)ff_joystick },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654), /* FGT Force Feedback Wheel */
|
||||
.driver_data = (unsigned long)ff_joystick },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a), /* F430 Force Feedback Wheel */
|
||||
.driver_data = (unsigned long)ff_joystick },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(hid, tm_devices);
|
||||
|
|
|
@ -75,8 +75,7 @@ config I2C_HELPER_AUTO
|
|||
In doubt, say Y.
|
||||
|
||||
config I2C_SMBUS
|
||||
tristate
|
||||
prompt "SMBus-specific protocols" if !I2C_HELPER_AUTO
|
||||
tristate "SMBus-specific protocols" if !I2C_HELPER_AUTO
|
||||
help
|
||||
Say Y here if you want support for SMBus extensions to the I2C
|
||||
specification. At the moment, the only supported extension is
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
|
||||
menu "I2C Algorithms"
|
||||
depends on !I2C_HELPER_AUTO
|
||||
visible if !I2C_HELPER_AUTO
|
||||
|
||||
config I2C_ALGOBIT
|
||||
tristate "I2C bit-banging interfaces"
|
||||
|
@ -15,15 +15,3 @@ config I2C_ALGOPCA
|
|||
tristate "I2C PCA 9564 interfaces"
|
||||
|
||||
endmenu
|
||||
|
||||
# In automatic configuration mode, we still have to define the
|
||||
# symbols to avoid unmet dependencies.
|
||||
|
||||
if I2C_HELPER_AUTO
|
||||
config I2C_ALGOBIT
|
||||
tristate
|
||||
config I2C_ALGOPCF
|
||||
tristate
|
||||
config I2C_ALGOPCA
|
||||
tristate
|
||||
endif
|
||||
|
|
|
@ -245,6 +245,7 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs)
|
|||
goto err_free_tgfx;
|
||||
}
|
||||
|
||||
parport_put_port(pp);
|
||||
return tgfx;
|
||||
|
||||
err_free_dev:
|
||||
|
|
|
@ -179,6 +179,22 @@ config KEYBOARD_GPIO
|
|||
To compile this driver as a module, choose M here: the
|
||||
module will be called gpio_keys.
|
||||
|
||||
config KEYBOARD_GPIO_POLLED
|
||||
tristate "Polled GPIO buttons"
|
||||
depends on GENERIC_GPIO
|
||||
select INPUT_POLLDEV
|
||||
help
|
||||
This driver implements support for buttons connected
|
||||
to GPIO pins that are not capable of generating interrupts.
|
||||
|
||||
Say Y here if your device has buttons connected
|
||||
directly to such GPIO pins. Your board-specific
|
||||
setup logic must also provide a platform device,
|
||||
with configuration data saying which GPIOs are used.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called gpio_keys_polled.
|
||||
|
||||
config KEYBOARD_TCA6416
|
||||
tristate "TCA6416 Keypad Support"
|
||||
depends on I2C
|
||||
|
|
|
@ -14,6 +14,7 @@ obj-$(CONFIG_KEYBOARD_BFIN) += bf54x-keys.o
|
|||
obj-$(CONFIG_KEYBOARD_DAVINCI) += davinci_keyscan.o
|
||||
obj-$(CONFIG_KEYBOARD_EP93XX) += ep93xx_keypad.o
|
||||
obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o
|
||||
obj-$(CONFIG_KEYBOARD_GPIO_POLLED) += gpio_keys_polled.o
|
||||
obj-$(CONFIG_KEYBOARD_TCA6416) += tca6416-keypad.o
|
||||
obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o
|
||||
obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o
|
||||
|
|
|
@ -0,0 +1,261 @@
|
|||
/*
|
||||
* Driver for buttons on GPIO lines not capable of generating interrupts
|
||||
*
|
||||
* Copyright (C) 2007-2010 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2010 Nuno Goncalves <nunojpg@gmail.com>
|
||||
*
|
||||
* This file was based on: /drivers/input/misc/cobalt_btns.c
|
||||
* Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
|
||||
*
|
||||
* also was based on: /drivers/input/keyboard/gpio_keys.c
|
||||
* Copyright 2005 Phil Blundell
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input-polldev.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
|
||||
#define DRV_NAME "gpio-keys-polled"
|
||||
|
||||
struct gpio_keys_button_data {
|
||||
int last_state;
|
||||
int count;
|
||||
int threshold;
|
||||
int can_sleep;
|
||||
};
|
||||
|
||||
struct gpio_keys_polled_dev {
|
||||
struct input_polled_dev *poll_dev;
|
||||
struct device *dev;
|
||||
struct gpio_keys_platform_data *pdata;
|
||||
struct gpio_keys_button_data data[0];
|
||||
};
|
||||
|
||||
static void gpio_keys_polled_check_state(struct input_dev *input,
|
||||
struct gpio_keys_button *button,
|
||||
struct gpio_keys_button_data *bdata)
|
||||
{
|
||||
int state;
|
||||
|
||||
if (bdata->can_sleep)
|
||||
state = !!gpio_get_value_cansleep(button->gpio);
|
||||
else
|
||||
state = !!gpio_get_value(button->gpio);
|
||||
|
||||
if (state != bdata->last_state) {
|
||||
unsigned int type = button->type ?: EV_KEY;
|
||||
|
||||
input_event(input, type, button->code,
|
||||
!!(state ^ button->active_low));
|
||||
input_sync(input);
|
||||
bdata->count = 0;
|
||||
bdata->last_state = state;
|
||||
}
|
||||
}
|
||||
|
||||
static void gpio_keys_polled_poll(struct input_polled_dev *dev)
|
||||
{
|
||||
struct gpio_keys_polled_dev *bdev = dev->private;
|
||||
struct gpio_keys_platform_data *pdata = bdev->pdata;
|
||||
struct input_dev *input = dev->input;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < bdev->pdata->nbuttons; i++) {
|
||||
struct gpio_keys_button_data *bdata = &bdev->data[i];
|
||||
|
||||
if (bdata->count < bdata->threshold)
|
||||
bdata->count++;
|
||||
else
|
||||
gpio_keys_polled_check_state(input, &pdata->buttons[i],
|
||||
bdata);
|
||||
}
|
||||
}
|
||||
|
||||
static void gpio_keys_polled_open(struct input_polled_dev *dev)
|
||||
{
|
||||
struct gpio_keys_polled_dev *bdev = dev->private;
|
||||
struct gpio_keys_platform_data *pdata = bdev->pdata;
|
||||
|
||||
if (pdata->enable)
|
||||
pdata->enable(bdev->dev);
|
||||
}
|
||||
|
||||
static void gpio_keys_polled_close(struct input_polled_dev *dev)
|
||||
{
|
||||
struct gpio_keys_polled_dev *bdev = dev->private;
|
||||
struct gpio_keys_platform_data *pdata = bdev->pdata;
|
||||
|
||||
if (pdata->disable)
|
||||
pdata->disable(bdev->dev);
|
||||
}
|
||||
|
||||
static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct gpio_keys_polled_dev *bdev;
|
||||
struct input_polled_dev *poll_dev;
|
||||
struct input_dev *input;
|
||||
int error;
|
||||
int i;
|
||||
|
||||
if (!pdata || !pdata->poll_interval)
|
||||
return -EINVAL;
|
||||
|
||||
bdev = kzalloc(sizeof(struct gpio_keys_polled_dev) +
|
||||
pdata->nbuttons * sizeof(struct gpio_keys_button_data),
|
||||
GFP_KERNEL);
|
||||
if (!bdev) {
|
||||
dev_err(dev, "no memory for private data\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
poll_dev = input_allocate_polled_device();
|
||||
if (!poll_dev) {
|
||||
dev_err(dev, "no memory for polled device\n");
|
||||
error = -ENOMEM;
|
||||
goto err_free_bdev;
|
||||
}
|
||||
|
||||
poll_dev->private = bdev;
|
||||
poll_dev->poll = gpio_keys_polled_poll;
|
||||
poll_dev->poll_interval = pdata->poll_interval;
|
||||
poll_dev->open = gpio_keys_polled_open;
|
||||
poll_dev->close = gpio_keys_polled_close;
|
||||
|
||||
input = poll_dev->input;
|
||||
|
||||
input->evbit[0] = BIT(EV_KEY);
|
||||
input->name = pdev->name;
|
||||
input->phys = DRV_NAME"/input0";
|
||||
input->dev.parent = &pdev->dev;
|
||||
|
||||
input->id.bustype = BUS_HOST;
|
||||
input->id.vendor = 0x0001;
|
||||
input->id.product = 0x0001;
|
||||
input->id.version = 0x0100;
|
||||
|
||||
for (i = 0; i < pdata->nbuttons; i++) {
|
||||
struct gpio_keys_button *button = &pdata->buttons[i];
|
||||
struct gpio_keys_button_data *bdata = &bdev->data[i];
|
||||
unsigned int gpio = button->gpio;
|
||||
unsigned int type = button->type ?: EV_KEY;
|
||||
|
||||
if (button->wakeup) {
|
||||
dev_err(dev, DRV_NAME " does not support wakeup\n");
|
||||
error = -EINVAL;
|
||||
goto err_free_gpio;
|
||||
}
|
||||
|
||||
error = gpio_request(gpio,
|
||||
button->desc ? button->desc : DRV_NAME);
|
||||
if (error) {
|
||||
dev_err(dev, "unable to claim gpio %u, err=%d\n",
|
||||
gpio, error);
|
||||
goto err_free_gpio;
|
||||
}
|
||||
|
||||
error = gpio_direction_input(gpio);
|
||||
if (error) {
|
||||
dev_err(dev,
|
||||
"unable to set direction on gpio %u, err=%d\n",
|
||||
gpio, error);
|
||||
goto err_free_gpio;
|
||||
}
|
||||
|
||||
bdata->can_sleep = gpio_cansleep(gpio);
|
||||
bdata->last_state = -1;
|
||||
bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
|
||||
pdata->poll_interval);
|
||||
|
||||
input_set_capability(input, type, button->code);
|
||||
}
|
||||
|
||||
bdev->poll_dev = poll_dev;
|
||||
bdev->dev = dev;
|
||||
bdev->pdata = pdata;
|
||||
platform_set_drvdata(pdev, bdev);
|
||||
|
||||
error = input_register_polled_device(poll_dev);
|
||||
if (error) {
|
||||
dev_err(dev, "unable to register polled device, err=%d\n",
|
||||
error);
|
||||
goto err_free_gpio;
|
||||
}
|
||||
|
||||
/* report initial state of the buttons */
|
||||
for (i = 0; i < pdata->nbuttons; i++)
|
||||
gpio_keys_polled_check_state(input, &pdata->buttons[i],
|
||||
&bdev->data[i]);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_gpio:
|
||||
while (--i >= 0)
|
||||
gpio_free(pdata->buttons[i].gpio);
|
||||
|
||||
input_free_polled_device(poll_dev);
|
||||
|
||||
err_free_bdev:
|
||||
kfree(bdev);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __devexit gpio_keys_polled_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev);
|
||||
struct gpio_keys_platform_data *pdata = bdev->pdata;
|
||||
int i;
|
||||
|
||||
input_unregister_polled_device(bdev->poll_dev);
|
||||
|
||||
for (i = 0; i < pdata->nbuttons; i++)
|
||||
gpio_free(pdata->buttons[i].gpio);
|
||||
|
||||
input_free_polled_device(bdev->poll_dev);
|
||||
|
||||
kfree(bdev);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver gpio_keys_polled_driver = {
|
||||
.probe = gpio_keys_polled_probe,
|
||||
.remove = __devexit_p(gpio_keys_polled_remove),
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init gpio_keys_polled_init(void)
|
||||
{
|
||||
return platform_driver_register(&gpio_keys_polled_driver);
|
||||
}
|
||||
|
||||
static void __exit gpio_keys_polled_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&gpio_keys_polled_driver);
|
||||
}
|
||||
|
||||
module_init(gpio_keys_polled_init);
|
||||
module_exit(gpio_keys_polled_exit);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
|
||||
MODULE_DESCRIPTION("Polled GPIO Buttons driver");
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
|
@ -51,7 +51,8 @@
|
|||
#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20)
|
||||
#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12)
|
||||
#define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16)
|
||||
#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100100)
|
||||
#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */
|
||||
#define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
|
||||
#define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000)
|
||||
|
||||
/* synaptics modes query bits */
|
||||
|
|
|
@ -358,7 +358,7 @@ static int __devinit gscps2_probe(struct parisc_device *dev)
|
|||
gscps2_reset(ps2port);
|
||||
ps2port->id = readb(ps2port->addr + GSC_ID) & 0x0f;
|
||||
|
||||
snprintf(serio->name, sizeof(serio->name), "GSC PS/2 %s",
|
||||
snprintf(serio->name, sizeof(serio->name), "gsc-ps2-%s",
|
||||
(ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse");
|
||||
strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys));
|
||||
serio->id.type = SERIO_8042;
|
||||
|
|
|
@ -1436,6 +1436,12 @@ static struct wacom_features wacom_features_0xD2 =
|
|||
{ "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT };
|
||||
static struct wacom_features wacom_features_0xD3 =
|
||||
{ "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT };
|
||||
static struct wacom_features wacom_features_0xD8 =
|
||||
{ "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT };
|
||||
static struct wacom_features wacom_features_0xDA =
|
||||
{ "Wacom Bamboo 2FG 4x5 SE", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT };
|
||||
static struct wacom_features wacom_features_0xDB =
|
||||
{ "Wacom Bamboo 2FG 6x8 SE", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT };
|
||||
|
||||
#define USB_DEVICE_WACOM(prod) \
|
||||
USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \
|
||||
|
@ -1504,6 +1510,9 @@ const struct usb_device_id wacom_ids[] = {
|
|||
{ USB_DEVICE_WACOM(0xD1) },
|
||||
{ USB_DEVICE_WACOM(0xD2) },
|
||||
{ USB_DEVICE_WACOM(0xD3) },
|
||||
{ USB_DEVICE_WACOM(0xD8) },
|
||||
{ USB_DEVICE_WACOM(0xDA) },
|
||||
{ USB_DEVICE_WACOM(0xDB) },
|
||||
{ USB_DEVICE_WACOM(0xF0) },
|
||||
{ USB_DEVICE_WACOM(0xCC) },
|
||||
{ USB_DEVICE_WACOM(0x90) },
|
||||
|
|
|
@ -178,6 +178,7 @@ static const struct usb_device_id usbtouch_devices[] = {
|
|||
|
||||
#ifdef CONFIG_TOUCHSCREEN_USB_ITM
|
||||
{USB_DEVICE(0x0403, 0xf9e9), .driver_info = DEVTYPE_ITM},
|
||||
{USB_DEVICE(0x16e3, 0xf9e9), .driver_info = DEVTYPE_ITM},
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO
|
||||
|
|
|
@ -7,20 +7,20 @@ menuconfig NEW_LEDS
|
|||
This is not related to standard keyboard LEDs which are controlled
|
||||
via the input system.
|
||||
|
||||
if NEW_LEDS
|
||||
|
||||
config LEDS_CLASS
|
||||
bool "LED Class Support"
|
||||
depends on NEW_LEDS
|
||||
help
|
||||
This option enables the led sysfs class in /sys/class/leds. You'll
|
||||
need this to do anything useful with LEDs. If unsure, say N.
|
||||
|
||||
if LEDS_CLASS
|
||||
if NEW_LEDS
|
||||
|
||||
comment "LED drivers"
|
||||
|
||||
config LEDS_88PM860X
|
||||
tristate "LED Support for Marvell 88PM860x PMIC"
|
||||
depends on LEDS_CLASS
|
||||
depends on MFD_88PM860X
|
||||
help
|
||||
This option enables support for on-chip LED drivers found on Marvell
|
||||
|
@ -28,6 +28,7 @@ config LEDS_88PM860X
|
|||
|
||||
config LEDS_ATMEL_PWM
|
||||
tristate "LED Support using Atmel PWM outputs"
|
||||
depends on LEDS_CLASS
|
||||
depends on ATMEL_PWM
|
||||
help
|
||||
This option enables support for LEDs driven using outputs
|
||||
|
@ -35,6 +36,7 @@ config LEDS_ATMEL_PWM
|
|||
|
||||
config LEDS_LOCOMO
|
||||
tristate "LED Support for Locomo device"
|
||||
depends on LEDS_CLASS
|
||||
depends on SHARP_LOCOMO
|
||||
help
|
||||
This option enables support for the LEDs on Sharp Locomo.
|
||||
|
@ -42,6 +44,7 @@ config LEDS_LOCOMO
|
|||
|
||||
config LEDS_MIKROTIK_RB532
|
||||
tristate "LED Support for Mikrotik Routerboard 532"
|
||||
depends on LEDS_CLASS
|
||||
depends on MIKROTIK_RB532
|
||||
help
|
||||
This option enables support for the so called "User LED" of
|
||||
|
@ -49,6 +52,7 @@ config LEDS_MIKROTIK_RB532
|
|||
|
||||
config LEDS_S3C24XX
|
||||
tristate "LED Support for Samsung S3C24XX GPIO LEDs"
|
||||
depends on LEDS_CLASS
|
||||
depends on ARCH_S3C2410
|
||||
help
|
||||
This option enables support for LEDs connected to GPIO lines
|
||||
|
@ -56,12 +60,14 @@ config LEDS_S3C24XX
|
|||
|
||||
config LEDS_AMS_DELTA
|
||||
tristate "LED Support for the Amstrad Delta (E3)"
|
||||
depends on LEDS_CLASS
|
||||
depends on MACH_AMS_DELTA
|
||||
help
|
||||
This option enables support for the LEDs on Amstrad Delta (E3).
|
||||
|
||||
config LEDS_NET48XX
|
||||
tristate "LED Support for Soekris net48xx series Error LED"
|
||||
depends on LEDS_CLASS
|
||||
depends on SCx200_GPIO
|
||||
help
|
||||
This option enables support for the Soekris net4801 and net4826 error
|
||||
|
@ -79,18 +85,21 @@ config LEDS_NET5501
|
|||
|
||||
config LEDS_FSG
|
||||
tristate "LED Support for the Freecom FSG-3"
|
||||
depends on LEDS_CLASS
|
||||
depends on MACH_FSG
|
||||
help
|
||||
This option enables support for the LEDs on the Freecom FSG-3.
|
||||
|
||||
config LEDS_WRAP
|
||||
tristate "LED Support for the WRAP series LEDs"
|
||||
depends on LEDS_CLASS
|
||||
depends on SCx200_GPIO
|
||||
help
|
||||
This option enables support for the PCEngines WRAP programmable LEDs.
|
||||
|
||||
config LEDS_ALIX2
|
||||
tristate "LED Support for ALIX.2 and ALIX.3 series"
|
||||
depends on LEDS_CLASS
|
||||
depends on X86 && !GPIO_CS5535 && !CS5535_GPIO
|
||||
help
|
||||
This option enables support for the PCEngines ALIX.2 and ALIX.3 LEDs.
|
||||
|
@ -98,12 +107,14 @@ config LEDS_ALIX2
|
|||
|
||||
config LEDS_H1940
|
||||
tristate "LED Support for iPAQ H1940 device"
|
||||
depends on LEDS_CLASS
|
||||
depends on ARCH_H1940
|
||||
help
|
||||
This option enables support for the LEDs on the h1940.
|
||||
|
||||
config LEDS_COBALT_QUBE
|
||||
tristate "LED Support for the Cobalt Qube series front LED"
|
||||
depends on LEDS_CLASS
|
||||
depends on MIPS_COBALT
|
||||
help
|
||||
This option enables support for the front LED on Cobalt Qube series
|
||||
|
@ -117,6 +128,7 @@ config LEDS_COBALT_RAQ
|
|||
|
||||
config LEDS_SUNFIRE
|
||||
tristate "LED support for SunFire servers."
|
||||
depends on LEDS_CLASS
|
||||
depends on SPARC64
|
||||
select LEDS_TRIGGERS
|
||||
help
|
||||
|
@ -125,6 +137,7 @@ config LEDS_SUNFIRE
|
|||
|
||||
config LEDS_HP6XX
|
||||
tristate "LED Support for the HP Jornada 6xx"
|
||||
depends on LEDS_CLASS
|
||||
depends on SH_HP6XX
|
||||
help
|
||||
This option enables LED support for the handheld
|
||||
|
@ -132,6 +145,7 @@ config LEDS_HP6XX
|
|||
|
||||
config LEDS_PCA9532
|
||||
tristate "LED driver for PCA9532 dimmer"
|
||||
depends on LEDS_CLASS
|
||||
depends on I2C && INPUT && EXPERIMENTAL
|
||||
help
|
||||
This option enables support for NXP pca9532
|
||||
|
@ -140,6 +154,7 @@ config LEDS_PCA9532
|
|||
|
||||
config LEDS_GPIO
|
||||
tristate "LED Support for GPIO connected LEDs"
|
||||
depends on LEDS_CLASS
|
||||
depends on GENERIC_GPIO
|
||||
help
|
||||
This option enables support for the LEDs connected to GPIO
|
||||
|
@ -167,6 +182,7 @@ config LEDS_GPIO_OF
|
|||
|
||||
config LEDS_LP3944
|
||||
tristate "LED Support for N.S. LP3944 (Fun Light) I2C chip"
|
||||
depends on LEDS_CLASS
|
||||
depends on I2C
|
||||
help
|
||||
This option enables support for LEDs connected to the National
|
||||
|
@ -196,6 +212,7 @@ config LEDS_LP5523
|
|||
|
||||
config LEDS_CLEVO_MAIL
|
||||
tristate "Mail LED on Clevo notebook"
|
||||
depends on LEDS_CLASS
|
||||
depends on X86 && SERIO_I8042 && DMI
|
||||
help
|
||||
This driver makes the mail LED accessible from userspace
|
||||
|
@ -226,6 +243,7 @@ config LEDS_CLEVO_MAIL
|
|||
|
||||
config LEDS_PCA955X
|
||||
tristate "LED Support for PCA955x I2C chips"
|
||||
depends on LEDS_CLASS
|
||||
depends on I2C
|
||||
help
|
||||
This option enables support for LEDs connected to PCA955x
|
||||
|
@ -234,6 +252,7 @@ config LEDS_PCA955X
|
|||
|
||||
config LEDS_WM831X_STATUS
|
||||
tristate "LED support for status LEDs on WM831x PMICs"
|
||||
depends on LEDS_CLASS
|
||||
depends on MFD_WM831X
|
||||
help
|
||||
This option enables support for the status LEDs of the WM831x
|
||||
|
@ -241,6 +260,7 @@ config LEDS_WM831X_STATUS
|
|||
|
||||
config LEDS_WM8350
|
||||
tristate "LED Support for WM8350 AudioPlus PMIC"
|
||||
depends on LEDS_CLASS
|
||||
depends on MFD_WM8350
|
||||
help
|
||||
This option enables support for LEDs driven by the Wolfson
|
||||
|
@ -248,6 +268,7 @@ config LEDS_WM8350
|
|||
|
||||
config LEDS_DA903X
|
||||
tristate "LED Support for DA9030/DA9034 PMIC"
|
||||
depends on LEDS_CLASS
|
||||
depends on PMIC_DA903X
|
||||
help
|
||||
This option enables support for on-chip LED drivers found
|
||||
|
@ -255,6 +276,7 @@ config LEDS_DA903X
|
|||
|
||||
config LEDS_DAC124S085
|
||||
tristate "LED Support for DAC124S085 SPI DAC"
|
||||
depends on LEDS_CLASS
|
||||
depends on SPI
|
||||
help
|
||||
This option enables support for DAC124S085 SPI DAC from NatSemi,
|
||||
|
@ -262,18 +284,21 @@ config LEDS_DAC124S085
|
|||
|
||||
config LEDS_PWM
|
||||
tristate "PWM driven LED Support"
|
||||
depends on LEDS_CLASS
|
||||
depends on HAVE_PWM
|
||||
help
|
||||
This option enables support for pwm driven LEDs
|
||||
|
||||
config LEDS_REGULATOR
|
||||
tristate "REGULATOR driven LED support"
|
||||
depends on LEDS_CLASS
|
||||
depends on REGULATOR
|
||||
help
|
||||
This option enables support for regulator driven LEDs.
|
||||
|
||||
config LEDS_BD2802
|
||||
tristate "LED driver for BD2802 RGB LED"
|
||||
depends on LEDS_CLASS
|
||||
depends on I2C
|
||||
help
|
||||
This option enables support for BD2802GU RGB LED driver chips
|
||||
|
@ -281,6 +306,7 @@ config LEDS_BD2802
|
|||
|
||||
config LEDS_INTEL_SS4200
|
||||
tristate "LED driver for Intel NAS SS4200 series"
|
||||
depends on LEDS_CLASS
|
||||
depends on PCI && DMI
|
||||
help
|
||||
This option enables support for the Intel SS4200 series of
|
||||
|
@ -290,6 +316,7 @@ config LEDS_INTEL_SS4200
|
|||
|
||||
config LEDS_LT3593
|
||||
tristate "LED driver for LT3593 controllers"
|
||||
depends on LEDS_CLASS
|
||||
depends on GENERIC_GPIO
|
||||
help
|
||||
This option enables support for LEDs driven by a Linear Technology
|
||||
|
@ -298,6 +325,7 @@ config LEDS_LT3593
|
|||
|
||||
config LEDS_ADP5520
|
||||
tristate "LED Support for ADP5520/ADP5501 PMIC"
|
||||
depends on LEDS_CLASS
|
||||
depends on PMIC_ADP5520
|
||||
help
|
||||
This option enables support for on-chip LED drivers found
|
||||
|
@ -308,6 +336,7 @@ config LEDS_ADP5520
|
|||
|
||||
config LEDS_DELL_NETBOOKS
|
||||
tristate "External LED on Dell Business Netbooks"
|
||||
depends on LEDS_CLASS
|
||||
depends on X86 && ACPI_WMI
|
||||
help
|
||||
This adds support for the Latitude 2100 and similar
|
||||
|
@ -315,6 +344,7 @@ config LEDS_DELL_NETBOOKS
|
|||
|
||||
config LEDS_MC13783
|
||||
tristate "LED Support for MC13783 PMIC"
|
||||
depends on LEDS_CLASS
|
||||
depends on MFD_MC13783
|
||||
help
|
||||
This option enable support for on-chip LED drivers found
|
||||
|
@ -322,6 +352,7 @@ config LEDS_MC13783
|
|||
|
||||
config LEDS_NS2
|
||||
tristate "LED support for Network Space v2 GPIO LEDs"
|
||||
depends on LEDS_CLASS
|
||||
depends on MACH_NETSPACE_V2 || MACH_INETSPACE_V2 || MACH_NETSPACE_MAX_V2 || D2NET_V2
|
||||
default y
|
||||
help
|
||||
|
@ -340,17 +371,17 @@ config LEDS_NETXBIG
|
|||
|
||||
config LEDS_TRIGGERS
|
||||
bool "LED Trigger support"
|
||||
depends on LEDS_CLASS
|
||||
help
|
||||
This option enables trigger support for the leds class.
|
||||
These triggers allow kernel events to drive the LEDs and can
|
||||
be configured via sysfs. If unsure, say Y.
|
||||
|
||||
if LEDS_TRIGGERS
|
||||
|
||||
comment "LED Triggers"
|
||||
|
||||
config LEDS_TRIGGER_TIMER
|
||||
tristate "LED Timer Trigger"
|
||||
depends on LEDS_TRIGGERS
|
||||
help
|
||||
This allows LEDs to be controlled by a programmable timer
|
||||
via sysfs. Some LED hardware can be programmed to start
|
||||
|
@ -362,12 +393,14 @@ config LEDS_TRIGGER_TIMER
|
|||
config LEDS_TRIGGER_IDE_DISK
|
||||
bool "LED IDE Disk Trigger"
|
||||
depends on IDE_GD_ATA
|
||||
depends on LEDS_TRIGGERS
|
||||
help
|
||||
This allows LEDs to be controlled by IDE disk activity.
|
||||
If unsure, say Y.
|
||||
|
||||
config LEDS_TRIGGER_HEARTBEAT
|
||||
tristate "LED Heartbeat Trigger"
|
||||
depends on LEDS_TRIGGERS
|
||||
help
|
||||
This allows LEDs to be controlled by a CPU load average.
|
||||
The flash frequency is a hyperbolic function of the 1-minute
|
||||
|
@ -376,6 +409,7 @@ config LEDS_TRIGGER_HEARTBEAT
|
|||
|
||||
config LEDS_TRIGGER_BACKLIGHT
|
||||
tristate "LED backlight Trigger"
|
||||
depends on LEDS_TRIGGERS
|
||||
help
|
||||
This allows LEDs to be controlled as a backlight device: they
|
||||
turn off and on when the display is blanked and unblanked.
|
||||
|
@ -384,6 +418,7 @@ config LEDS_TRIGGER_BACKLIGHT
|
|||
|
||||
config LEDS_TRIGGER_GPIO
|
||||
tristate "LED GPIO Trigger"
|
||||
depends on LEDS_TRIGGERS
|
||||
depends on GPIOLIB
|
||||
help
|
||||
This allows LEDs to be controlled by gpio events. It's good
|
||||
|
@ -396,6 +431,7 @@ config LEDS_TRIGGER_GPIO
|
|||
|
||||
config LEDS_TRIGGER_DEFAULT_ON
|
||||
tristate "LED Default ON Trigger"
|
||||
depends on LEDS_TRIGGERS
|
||||
help
|
||||
This allows LEDs to be initialised in the ON state.
|
||||
If unsure, say Y.
|
||||
|
@ -403,8 +439,4 @@ config LEDS_TRIGGER_DEFAULT_ON
|
|||
comment "iptables trigger is under Netfilter config (LED target)"
|
||||
depends on LEDS_TRIGGERS
|
||||
|
||||
endif # LEDS_TRIGGERS
|
||||
|
||||
endif # LEDS_CLASS
|
||||
|
||||
endif # NEW_LEDS
|
||||
|
|
|
@ -102,6 +102,7 @@ config ADB_PMU_LED
|
|||
config ADB_PMU_LED_IDE
|
||||
bool "Use front LED as IDE LED by default"
|
||||
depends on ADB_PMU_LED
|
||||
depends on LEDS_CLASS
|
||||
select LEDS_TRIGGERS
|
||||
select LEDS_TRIGGER_IDE_DISK
|
||||
help
|
||||
|
|
|
@ -31,7 +31,7 @@ config MEDIA_TUNER
|
|||
select MEDIA_TUNER_TDA9887 if !MEDIA_TUNER_CUSTOMISE
|
||||
select MEDIA_TUNER_MC44S803 if !MEDIA_TUNER_CUSTOMISE
|
||||
|
||||
menuconfig MEDIA_TUNER_CUSTOMISE
|
||||
config MEDIA_TUNER_CUSTOMISE
|
||||
bool "Customize analog and hybrid tuner modules to build"
|
||||
depends on MEDIA_TUNER
|
||||
default y if EMBEDDED
|
||||
|
@ -44,7 +44,8 @@ menuconfig MEDIA_TUNER_CUSTOMISE
|
|||
|
||||
If unsure say N.
|
||||
|
||||
if MEDIA_TUNER_CUSTOMISE
|
||||
menu "Customize TV tuners"
|
||||
visible if MEDIA_TUNER_CUSTOMISE
|
||||
|
||||
config MEDIA_TUNER_SIMPLE
|
||||
tristate "Simple tuner support"
|
||||
|
@ -185,5 +186,4 @@ config MEDIA_TUNER_TDA18218
|
|||
default m if MEDIA_TUNER_CUSTOMISE
|
||||
help
|
||||
NXP TDA18218 silicon tuner driver.
|
||||
|
||||
endif # MEDIA_TUNER_CUSTOMISE
|
||||
endmenu
|
||||
|
|
|
@ -12,9 +12,8 @@ config DVB_FE_CUSTOMISE
|
|||
|
||||
If unsure say N.
|
||||
|
||||
if DVB_FE_CUSTOMISE
|
||||
|
||||
menu "Customise DVB Frontends"
|
||||
visible if DVB_FE_CUSTOMISE
|
||||
|
||||
comment "Multistandard (satellite) frontends"
|
||||
depends on DVB_CORE
|
||||
|
@ -619,5 +618,3 @@ config DVB_DUMMY_FE
|
|||
tristate "Dummy frontend driver"
|
||||
default n
|
||||
endmenu
|
||||
|
||||
endif
|
||||
|
|
|
@ -112,7 +112,7 @@ config VIDEO_IR_I2C
|
|||
#
|
||||
|
||||
menu "Encoders/decoders and other helper chips"
|
||||
depends on !VIDEO_HELPER_CHIPS_AUTO
|
||||
visible if !VIDEO_HELPER_CHIPS_AUTO
|
||||
|
||||
comment "Audio decoders"
|
||||
|
||||
|
|
|
@ -482,10 +482,17 @@ static int nor_erase_prepare(struct ubi_device *ubi, int pnum)
|
|||
uint32_t data = 0;
|
||||
struct ubi_vid_hdr vid_hdr;
|
||||
|
||||
addr = (loff_t)pnum * ubi->peb_size + ubi->vid_hdr_aloffset;
|
||||
/*
|
||||
* It is important to first invalidate the EC header, and then the VID
|
||||
* header. Otherwise a power cut may lead to valid EC header and
|
||||
* invalid VID header, in which case UBI will treat this PEB as
|
||||
* corrupted and will try to preserve it, and print scary warnings (see
|
||||
* the header comment in scan.c for more information).
|
||||
*/
|
||||
addr = (loff_t)pnum * ubi->peb_size;
|
||||
err = ubi->mtd->write(ubi->mtd, addr, 4, &written, (void *)&data);
|
||||
if (!err) {
|
||||
addr -= ubi->vid_hdr_aloffset;
|
||||
addr += ubi->vid_hdr_aloffset;
|
||||
err = ubi->mtd->write(ubi->mtd, addr, 4, &written,
|
||||
(void *)&data);
|
||||
if (!err)
|
||||
|
@ -494,18 +501,24 @@ static int nor_erase_prepare(struct ubi_device *ubi, int pnum)
|
|||
|
||||
/*
|
||||
* We failed to write to the media. This was observed with Spansion
|
||||
* S29GL512N NOR flash. Most probably the eraseblock erasure was
|
||||
* interrupted at a very inappropriate moment, so it became unwritable.
|
||||
* In this case we probably anyway have garbage in this PEB.
|
||||
* S29GL512N NOR flash. Most probably the previously eraseblock erasure
|
||||
* was interrupted at a very inappropriate moment, so it became
|
||||
* unwritable. In this case we probably anyway have garbage in this
|
||||
* PEB.
|
||||
*/
|
||||
err1 = ubi_io_read_vid_hdr(ubi, pnum, &vid_hdr, 0);
|
||||
if (err1 == UBI_IO_BAD_HDR_EBADMSG || err1 == UBI_IO_BAD_HDR) {
|
||||
struct ubi_ec_hdr ec_hdr;
|
||||
|
||||
err1 = ubi_io_read_ec_hdr(ubi, pnum, &ec_hdr, 0);
|
||||
if (err1 == UBI_IO_BAD_HDR_EBADMSG || err1 == UBI_IO_BAD_HDR)
|
||||
/*
|
||||
* The VID header is corrupted, so we can safely erase this
|
||||
* PEB and not afraid that it will be treated as a valid PEB in
|
||||
* case of an unclean reboot.
|
||||
* Both VID and EC headers are corrupted, so we can
|
||||
* safely erase this PEB and not afraid that it will be
|
||||
* treated as a valid PEB in case of an unclean reboot.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The PEB contains a valid VID header, but we cannot invalidate it.
|
||||
|
|
|
@ -953,6 +953,10 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si,
|
|||
* impossible to distinguish it from a PEB which just
|
||||
* contains garbage because of a power cut during erase
|
||||
* operation. So we just schedule this PEB for erasure.
|
||||
*
|
||||
* Besides, in case of NOR flash, we deliberatly
|
||||
* corrupt both headers because NOR flash erasure is
|
||||
* slow and can start from the end.
|
||||
*/
|
||||
err = 0;
|
||||
else
|
||||
|
|
|
@ -349,7 +349,6 @@ static struct irq_chip dino_interrupt_type = {
|
|||
.name = "GSC-PCI",
|
||||
.unmask = dino_unmask_irq,
|
||||
.mask = dino_mask_irq,
|
||||
.ack = no_ack_irq,
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -186,7 +186,6 @@ static struct irq_chip eisa_interrupt_type = {
|
|||
.name = "EISA",
|
||||
.unmask = eisa_unmask_irq,
|
||||
.mask = eisa_mask_irq,
|
||||
.ack = no_ack_irq,
|
||||
};
|
||||
|
||||
static irqreturn_t eisa_irq(int wax_irq, void *intr_dev)
|
||||
|
@ -340,7 +339,7 @@ static int __init eisa_probe(struct parisc_device *dev)
|
|||
setup_irq(2, &irq2_action);
|
||||
for (i = 0; i < 16; i++) {
|
||||
set_irq_chip_and_handler(i, &eisa_interrupt_type,
|
||||
handle_level_irq);
|
||||
handle_simple_irq);
|
||||
}
|
||||
|
||||
EISA_bus = 1;
|
||||
|
|
|
@ -143,7 +143,6 @@ static struct irq_chip gsc_asic_interrupt_type = {
|
|||
.name = "GSC-ASIC",
|
||||
.unmask = gsc_asic_unmask_irq,
|
||||
.mask = gsc_asic_mask_irq,
|
||||
.ack = no_ack_irq,
|
||||
};
|
||||
|
||||
int gsc_assign_irq(struct irq_chip *type, void *data)
|
||||
|
@ -153,7 +152,7 @@ int gsc_assign_irq(struct irq_chip *type, void *data)
|
|||
if (irq > GSC_IRQ_MAX)
|
||||
return NO_IRQ;
|
||||
|
||||
set_irq_chip_and_handler(irq, type, handle_level_irq);
|
||||
set_irq_chip_and_handler(irq, type, handle_simple_irq);
|
||||
set_irq_chip_data(irq, data);
|
||||
|
||||
return irq++;
|
||||
|
|
|
@ -669,6 +669,13 @@ printk("\n");
|
|||
DBG(KERN_DEBUG "enable_irq(%d): eoi(%p, 0x%x)\n", irq,
|
||||
vi->eoi_addr, vi->eoi_data);
|
||||
iosapic_eoi(vi->eoi_addr, vi->eoi_data);
|
||||
}
|
||||
|
||||
static void iosapic_eoi_irq(unsigned int irq)
|
||||
{
|
||||
struct vector_info *vi = get_irq_chip_data(irq);
|
||||
|
||||
iosapic_eoi(vi->eoi_addr, vi->eoi_data);
|
||||
cpu_eoi_irq(irq);
|
||||
}
|
||||
|
||||
|
@ -705,6 +712,7 @@ static struct irq_chip iosapic_interrupt_type = {
|
|||
.unmask = iosapic_unmask_irq,
|
||||
.mask = iosapic_mask_irq,
|
||||
.ack = cpu_ack_irq,
|
||||
.eoi = iosapic_eoi_irq,
|
||||
#ifdef CONFIG_SMP
|
||||
.set_affinity = iosapic_set_affinity_irq,
|
||||
#endif
|
||||
|
|
|
@ -64,6 +64,7 @@ static unsigned int led_diskio __read_mostly = 1;
|
|||
static unsigned int led_lanrxtx __read_mostly = 1;
|
||||
static char lcd_text[32] __read_mostly;
|
||||
static char lcd_text_default[32] __read_mostly;
|
||||
static int lcd_no_led_support __read_mostly = 0; /* KittyHawk doesn't support LED on its LCD */
|
||||
|
||||
|
||||
static struct workqueue_struct *led_wq;
|
||||
|
@ -115,7 +116,7 @@ lcd_info __attribute__((aligned(8))) __read_mostly =
|
|||
.lcd_width = 16,
|
||||
.lcd_cmd_reg_addr = KITTYHAWK_LCD_CMD,
|
||||
.lcd_data_reg_addr = KITTYHAWK_LCD_DATA,
|
||||
.min_cmd_delay = 40,
|
||||
.min_cmd_delay = 80,
|
||||
.reset_cmd1 = 0x80,
|
||||
.reset_cmd2 = 0xc0,
|
||||
};
|
||||
|
@ -135,6 +136,9 @@ static int start_task(void)
|
|||
/* Display the default text now */
|
||||
if (led_type == LED_HASLCD) lcd_print( lcd_text_default );
|
||||
|
||||
/* KittyHawk has no LED support on its LCD */
|
||||
if (lcd_no_led_support) return 0;
|
||||
|
||||
/* Create the work queue and queue the LED task */
|
||||
led_wq = create_singlethread_workqueue("led_wq");
|
||||
queue_delayed_work(led_wq, &led_task, 0);
|
||||
|
@ -248,9 +252,13 @@ static int __init led_create_procfs(void)
|
|||
|
||||
proc_pdc_root = proc_mkdir("pdc", 0);
|
||||
if (!proc_pdc_root) return -1;
|
||||
|
||||
if (!lcd_no_led_support)
|
||||
{
|
||||
ent = proc_create_data("led", S_IRUGO|S_IWUSR, proc_pdc_root,
|
||||
&led_proc_fops, (void *)LED_NOLCD); /* LED */
|
||||
if (!ent) return -1;
|
||||
}
|
||||
|
||||
if (led_type == LED_HASLCD)
|
||||
{
|
||||
|
@ -692,6 +700,7 @@ int __init led_init(void)
|
|||
case 0x58B: /* KittyHawk DC2 100 (K200) */
|
||||
printk(KERN_INFO "%s: KittyHawk-Machine (hversion 0x%x) found, "
|
||||
"LED detection skipped.\n", __FILE__, CPU_HVERSION);
|
||||
lcd_no_led_support = 1;
|
||||
goto found; /* use the preinitialized values of lcd_info */
|
||||
}
|
||||
|
||||
|
|
|
@ -323,7 +323,6 @@ static struct irq_chip superio_interrupt_type = {
|
|||
.name = SUPERIO,
|
||||
.unmask = superio_unmask_irq,
|
||||
.mask = superio_mask_irq,
|
||||
.ack = no_ack_irq,
|
||||
};
|
||||
|
||||
#ifdef DEBUG_SUPERIO_INIT
|
||||
|
@ -354,7 +353,7 @@ int superio_fixup_irq(struct pci_dev *pcidev)
|
|||
#endif
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
set_irq_chip_and_handler(i, &superio_interrupt_type, handle_level_irq);
|
||||
set_irq_chip_and_handler(i, &superio_interrupt_type, handle_simple_irq);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -70,6 +70,7 @@ void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func,
|
|||
va_end(args);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(soc_pcmcia_debug);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -81,6 +81,8 @@ MODULE_PARM_DESC(wapf, "WAPF value");
|
|||
|
||||
static int wlan_status = 1;
|
||||
static int bluetooth_status = 1;
|
||||
static int wimax_status = -1;
|
||||
static int wwan_status = -1;
|
||||
|
||||
module_param(wlan_status, int, 0444);
|
||||
MODULE_PARM_DESC(wlan_status, "Set the wireless status on boot "
|
||||
|
@ -92,6 +94,16 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot "
|
|||
"(0 = disabled, 1 = enabled, -1 = don't do anything). "
|
||||
"default is 1");
|
||||
|
||||
module_param(wimax_status, int, 0444);
|
||||
MODULE_PARM_DESC(wimax_status, "Set the wireless status on boot "
|
||||
"(0 = disabled, 1 = enabled, -1 = don't do anything). "
|
||||
"default is 1");
|
||||
|
||||
module_param(wwan_status, int, 0444);
|
||||
MODULE_PARM_DESC(wwan_status, "Set the wireless status on boot "
|
||||
"(0 = disabled, 1 = enabled, -1 = don't do anything). "
|
||||
"default is 1");
|
||||
|
||||
/*
|
||||
* Some events we use, same for all Asus
|
||||
*/
|
||||
|
@ -114,6 +126,8 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot "
|
|||
*/
|
||||
#define WL_RSTS 0x01 /* internal Wifi */
|
||||
#define BT_RSTS 0x02 /* internal Bluetooth */
|
||||
#define WM_RSTS 0x08 /* internal wimax */
|
||||
#define WW_RSTS 0x20 /* internal wwan */
|
||||
|
||||
/* LED */
|
||||
#define METHOD_MLED "MLED"
|
||||
|
@ -132,6 +146,11 @@ MODULE_PARM_DESC(bluetooth_status, "Set the wireless status on boot "
|
|||
*/
|
||||
#define METHOD_WLAN "WLED"
|
||||
#define METHOD_BLUETOOTH "BLED"
|
||||
|
||||
/* WWAN and WIMAX */
|
||||
#define METHOD_WWAN "GSMC"
|
||||
#define METHOD_WIMAX "WMXC"
|
||||
|
||||
#define METHOD_WL_STATUS "RSTS"
|
||||
|
||||
/* Brightness */
|
||||
|
@ -882,6 +901,64 @@ static ssize_t store_bluetooth(struct device *dev,
|
|||
return sysfs_acpi_set(asus, buf, count, METHOD_BLUETOOTH);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wimax
|
||||
*/
|
||||
static int asus_wimax_set(struct asus_laptop *asus, int status)
|
||||
{
|
||||
if (write_acpi_int(asus->handle, METHOD_WIMAX, !!status)) {
|
||||
pr_warning("Error setting wimax status to %d", status);
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t show_wimax(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", asus_wireless_status(asus, WM_RSTS));
|
||||
}
|
||||
|
||||
static ssize_t store_wimax(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sysfs_acpi_set(asus, buf, count, METHOD_WIMAX);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wwan
|
||||
*/
|
||||
static int asus_wwan_set(struct asus_laptop *asus, int status)
|
||||
{
|
||||
if (write_acpi_int(asus->handle, METHOD_WWAN, !!status)) {
|
||||
pr_warning("Error setting wwan status to %d", status);
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t show_wwan(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", asus_wireless_status(asus, WW_RSTS));
|
||||
}
|
||||
|
||||
static ssize_t store_wwan(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sysfs_acpi_set(asus, buf, count, METHOD_WWAN);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display
|
||||
*/
|
||||
|
@ -1202,6 +1279,8 @@ static DEVICE_ATTR(infos, S_IRUGO, show_infos, NULL);
|
|||
static DEVICE_ATTR(wlan, S_IRUGO | S_IWUSR, show_wlan, store_wlan);
|
||||
static DEVICE_ATTR(bluetooth, S_IRUGO | S_IWUSR,
|
||||
show_bluetooth, store_bluetooth);
|
||||
static DEVICE_ATTR(wimax, S_IRUGO | S_IWUSR, show_wimax, store_wimax);
|
||||
static DEVICE_ATTR(wwan, S_IRUGO | S_IWUSR, show_wwan, store_wwan);
|
||||
static DEVICE_ATTR(display, S_IRUGO | S_IWUSR, show_disp, store_disp);
|
||||
static DEVICE_ATTR(ledd, S_IRUGO | S_IWUSR, show_ledd, store_ledd);
|
||||
static DEVICE_ATTR(ls_level, S_IRUGO | S_IWUSR, show_lslvl, store_lslvl);
|
||||
|
@ -1212,6 +1291,8 @@ static struct attribute *asus_attributes[] = {
|
|||
&dev_attr_infos.attr,
|
||||
&dev_attr_wlan.attr,
|
||||
&dev_attr_bluetooth.attr,
|
||||
&dev_attr_wimax.attr,
|
||||
&dev_attr_wwan.attr,
|
||||
&dev_attr_display.attr,
|
||||
&dev_attr_ledd.attr,
|
||||
&dev_attr_ls_level.attr,
|
||||
|
@ -1239,6 +1320,13 @@ static mode_t asus_sysfs_is_visible(struct kobject *kobj,
|
|||
} else if (attr == &dev_attr_display.attr) {
|
||||
supported = !acpi_check_handle(handle, METHOD_SWITCH_DISPLAY, NULL);
|
||||
|
||||
} else if (attr == &dev_attr_wimax.attr) {
|
||||
supported =
|
||||
!acpi_check_handle(asus->handle, METHOD_WIMAX, NULL);
|
||||
|
||||
} else if (attr == &dev_attr_wwan.attr) {
|
||||
supported = !acpi_check_handle(asus->handle, METHOD_WWAN, NULL);
|
||||
|
||||
} else if (attr == &dev_attr_ledd.attr) {
|
||||
supported = !acpi_check_handle(handle, METHOD_LEDD, NULL);
|
||||
|
||||
|
@ -1397,7 +1485,8 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
|
|||
|
||||
/*
|
||||
* The HWRS method return informations about the hardware.
|
||||
* 0x80 bit is for WLAN, 0x100 for Bluetooth.
|
||||
* 0x80 bit is for WLAN, 0x100 for Bluetooth,
|
||||
* 0x40 for WWAN, 0x10 for WIMAX.
|
||||
* The significance of others is yet to be found.
|
||||
*/
|
||||
status =
|
||||
|
@ -1440,6 +1529,12 @@ static int __devinit asus_acpi_init(struct asus_laptop *asus)
|
|||
if (wlan_status >= 0)
|
||||
asus_wlan_set(asus, !!wlan_status);
|
||||
|
||||
if (wimax_status >= 0)
|
||||
asus_wimax_set(asus, !!wimax_status);
|
||||
|
||||
if (wwan_status >= 0)
|
||||
asus_wwan_set(asus, !!wwan_status);
|
||||
|
||||
/* Keyboard Backlight is on by default */
|
||||
if (!acpi_check_handle(asus->handle, METHOD_KBD_LIGHT_SET, NULL))
|
||||
asus_kled_set(asus, 1);
|
||||
|
|
|
@ -298,7 +298,7 @@ static void eeepc_wmi_notify(u32 value, void *context)
|
|||
kfree(obj);
|
||||
}
|
||||
|
||||
static int store_cpufv(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t store_cpufv(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int value;
|
||||
|
|
|
@ -172,6 +172,8 @@ static int hp_wmi_perform_query(int query, int write, u32 *buffer,
|
|||
bios_return = *((struct bios_return *)obj->buffer.pointer);
|
||||
|
||||
memcpy(buffer, &bios_return.value, sizeof(bios_return.value));
|
||||
|
||||
kfree(obj);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <asm/bios_ebda.h>
|
||||
|
||||
|
@ -220,32 +221,13 @@ static void rtl_teardown_sysfs(void) {
|
|||
sysdev_class_unregister(&class_rtl);
|
||||
}
|
||||
|
||||
static int dmi_check_cb(const struct dmi_system_id *id)
|
||||
{
|
||||
RTL_DEBUG("found IBM server '%s'\n", id->ident);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define ibm_dmi_entry(NAME, TYPE) \
|
||||
{ \
|
||||
.ident = NAME, \
|
||||
.matches = { \
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "IBM"), \
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, TYPE), \
|
||||
}, \
|
||||
.callback = dmi_check_cb \
|
||||
}
|
||||
|
||||
static struct dmi_system_id __initdata ibm_rtl_dmi_table[] = {
|
||||
ibm_dmi_entry("BladeCenter LS21", "7971"),
|
||||
ibm_dmi_entry("BladeCenter LS22", "7901"),
|
||||
ibm_dmi_entry("BladeCenter HS21 XM", "7995"),
|
||||
ibm_dmi_entry("BladeCenter HS22", "7870"),
|
||||
ibm_dmi_entry("BladeCenter HS22V", "7871"),
|
||||
ibm_dmi_entry("System x3550 M2", "7946"),
|
||||
ibm_dmi_entry("System x3650 M2", "7947"),
|
||||
ibm_dmi_entry("System x3550 M3", "7944"),
|
||||
ibm_dmi_entry("System x3650 M3", "7945"),
|
||||
{ \
|
||||
.matches = { \
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "IBM"), \
|
||||
}, \
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
@ -257,7 +239,7 @@ static int __init ibm_rtl_init(void) {
|
|||
if (force)
|
||||
pr_warning("ibm-rtl: module loaded by force\n");
|
||||
/* first ensure that we are running on IBM HW */
|
||||
else if (!dmi_check_system(ibm_rtl_dmi_table))
|
||||
else if (efi_enabled || !dmi_check_system(ibm_rtl_dmi_table))
|
||||
return -ENODEV;
|
||||
|
||||
/* Get the address for the Extended BIOS Data Area */
|
||||
|
@ -302,7 +284,7 @@ static int __init ibm_rtl_init(void) {
|
|||
RTL_DEBUG("rtl_cmd_width = %u, rtl_cmd_type = %u\n",
|
||||
rtl_cmd_width, rtl_cmd_type);
|
||||
addr = ioread32(&rtl_table->cmd_port_address);
|
||||
RTL_DEBUG("addr = %#llx\n", addr);
|
||||
RTL_DEBUG("addr = %#llx\n", (unsigned long long)addr);
|
||||
plen = rtl_cmd_width/sizeof(char);
|
||||
rtl_cmd_addr = rtl_port_map(addr, plen);
|
||||
RTL_DEBUG("rtl_cmd_addr = %#llx\n", (u64)rtl_cmd_addr);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue