Merge branch 'perf/urgent' into perf/core
Merge reason: Resolve patch dependency Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
cce9131781
@ -107,10 +107,6 @@ void (*dev_config) (struct ata_port *, struct ata_device *);
|
||||
issue of SET FEATURES - XFER MODE, and prior to operation.
|
||||
</para>
|
||||
<para>
|
||||
Called by ata_device_add() after ata_dev_identify() determines
|
||||
a device is present.
|
||||
</para>
|
||||
<para>
|
||||
This entry may be specified as NULL in ata_port_operations.
|
||||
</para>
|
||||
|
||||
@ -154,8 +150,8 @@ unsigned int (*mode_filter) (struct ata_port *, struct ata_device *, unsigned in
|
||||
|
||||
<sect2><title>Taskfile read/write</title>
|
||||
<programlisting>
|
||||
void (*tf_load) (struct ata_port *ap, struct ata_taskfile *tf);
|
||||
void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf);
|
||||
void (*sff_tf_load) (struct ata_port *ap, struct ata_taskfile *tf);
|
||||
void (*sff_tf_read) (struct ata_port *ap, struct ata_taskfile *tf);
|
||||
</programlisting>
|
||||
|
||||
<para>
|
||||
@ -164,36 +160,35 @@ void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf);
|
||||
hardware registers / DMA buffers, to obtain the current set of
|
||||
taskfile register values.
|
||||
Most drivers for taskfile-based hardware (PIO or MMIO) use
|
||||
ata_tf_load() and ata_tf_read() for these hooks.
|
||||
ata_sff_tf_load() and ata_sff_tf_read() for these hooks.
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
|
||||
<sect2><title>PIO data read/write</title>
|
||||
<programlisting>
|
||||
void (*data_xfer) (struct ata_device *, unsigned char *, unsigned int, int);
|
||||
void (*sff_data_xfer) (struct ata_device *, unsigned char *, unsigned int, int);
|
||||
</programlisting>
|
||||
|
||||
<para>
|
||||
All bmdma-style drivers must implement this hook. This is the low-level
|
||||
operation that actually copies the data bytes during a PIO data
|
||||
transfer.
|
||||
Typically the driver
|
||||
will choose one of ata_pio_data_xfer_noirq(), ata_pio_data_xfer(), or
|
||||
ata_mmio_data_xfer().
|
||||
Typically the driver will choose one of ata_sff_data_xfer_noirq(),
|
||||
ata_sff_data_xfer(), or ata_sff_data_xfer32().
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
|
||||
<sect2><title>ATA command execute</title>
|
||||
<programlisting>
|
||||
void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf);
|
||||
void (*sff_exec_command)(struct ata_port *ap, struct ata_taskfile *tf);
|
||||
</programlisting>
|
||||
|
||||
<para>
|
||||
causes an ATA command, previously loaded with
|
||||
->tf_load(), to be initiated in hardware.
|
||||
Most drivers for taskfile-based hardware use ata_exec_command()
|
||||
Most drivers for taskfile-based hardware use ata_sff_exec_command()
|
||||
for this hook.
|
||||
</para>
|
||||
|
||||
@ -218,8 +213,8 @@ command.
|
||||
|
||||
<sect2><title>Read specific ATA shadow registers</title>
|
||||
<programlisting>
|
||||
u8 (*check_status)(struct ata_port *ap);
|
||||
u8 (*check_altstatus)(struct ata_port *ap);
|
||||
u8 (*sff_check_status)(struct ata_port *ap);
|
||||
u8 (*sff_check_altstatus)(struct ata_port *ap);
|
||||
</programlisting>
|
||||
|
||||
<para>
|
||||
@ -227,20 +222,14 @@ u8 (*check_altstatus)(struct ata_port *ap);
|
||||
hardware. On some hardware, reading the Status register has
|
||||
the side effect of clearing the interrupt condition.
|
||||
Most drivers for taskfile-based hardware use
|
||||
ata_check_status() for this hook.
|
||||
</para>
|
||||
<para>
|
||||
Note that because this is called from ata_device_add(), at
|
||||
least a dummy function that clears device interrupts must be
|
||||
provided for all drivers, even if the controller doesn't
|
||||
actually have a taskfile status register.
|
||||
ata_sff_check_status() for this hook.
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
|
||||
<sect2><title>Select ATA device on bus</title>
|
||||
<programlisting>
|
||||
void (*dev_select)(struct ata_port *ap, unsigned int device);
|
||||
void (*sff_dev_select)(struct ata_port *ap, unsigned int device);
|
||||
</programlisting>
|
||||
|
||||
<para>
|
||||
@ -251,9 +240,7 @@ void (*dev_select)(struct ata_port *ap, unsigned int device);
|
||||
</para>
|
||||
<para>
|
||||
Most drivers for taskfile-based hardware use
|
||||
ata_std_dev_select() for this hook. Controllers which do not
|
||||
support second drives on a port (such as SATA contollers) will
|
||||
use ata_noop_dev_select().
|
||||
ata_sff_dev_select() for this hook.
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
@ -441,13 +428,13 @@ void (*irq_clear) (struct ata_port *);
|
||||
to struct ata_host_set.
|
||||
</para>
|
||||
<para>
|
||||
Most legacy IDE drivers use ata_interrupt() for the
|
||||
Most legacy IDE drivers use ata_sff_interrupt() for the
|
||||
irq_handler hook, which scans all ports in the host_set,
|
||||
determines which queued command was active (if any), and calls
|
||||
ata_host_intr(ap,qc).
|
||||
ata_sff_host_intr(ap,qc).
|
||||
</para>
|
||||
<para>
|
||||
Most legacy IDE drivers use ata_bmdma_irq_clear() for the
|
||||
Most legacy IDE drivers use ata_sff_irq_clear() for the
|
||||
irq_clear() hook, which simply clears the interrupt and error
|
||||
flags in the DMA status register.
|
||||
</para>
|
||||
@ -496,10 +483,6 @@ void (*host_stop) (struct ata_host_set *host_set);
|
||||
data from port at this time.
|
||||
</para>
|
||||
<para>
|
||||
Many drivers use ata_port_stop() as this hook, which frees the
|
||||
PRD table.
|
||||
</para>
|
||||
<para>
|
||||
->host_stop() is called after all ->port_stop() calls
|
||||
have completed. The hook must finalize hardware shutdown, release DMA
|
||||
and other resources, etc.
|
||||
|
@ -74,6 +74,11 @@ structure at all. You should use this to keep device-specific data.
|
||||
/* retrieve the value */
|
||||
void *i2c_get_clientdata(const struct i2c_client *client);
|
||||
|
||||
Note that starting with kernel 2.6.34, you don't have to set the `data' field
|
||||
to NULL in remove() or if probe() failed anymore. The i2c-core does this
|
||||
automatically on these occasions. Those are also the only times the core will
|
||||
touch this field.
|
||||
|
||||
|
||||
Accessing the client
|
||||
====================
|
||||
|
@ -333,14 +333,14 @@ byte 0:
|
||||
byte 1:
|
||||
|
||||
bit 7 6 5 4 3 2 1 0
|
||||
x15 x14 x13 x12 x11 x10 x9 x8
|
||||
. . . . . x10 x9 x8
|
||||
|
||||
byte 2:
|
||||
|
||||
bit 7 6 5 4 3 2 1 0
|
||||
x7 x6 x5 x4 x4 x2 x1 x0
|
||||
|
||||
x15..x0 = absolute x value (horizontal)
|
||||
x10..x0 = absolute x value (horizontal)
|
||||
|
||||
byte 3:
|
||||
|
||||
@ -350,14 +350,14 @@ byte 3:
|
||||
byte 4:
|
||||
|
||||
bit 7 6 5 4 3 2 1 0
|
||||
y15 y14 y13 y12 y11 y10 y8 y8
|
||||
. . . . . . y9 y8
|
||||
|
||||
byte 5:
|
||||
|
||||
bit 7 6 5 4 3 2 1 0
|
||||
y7 y6 y5 y4 y3 y2 y1 y0
|
||||
|
||||
y15..y0 = absolute y value (vertical)
|
||||
y9..y0 = absolute y value (vertical)
|
||||
|
||||
|
||||
4.2.2 Two finger touch
|
||||
|
@ -58,7 +58,7 @@ static void transfer(int fd)
|
||||
};
|
||||
|
||||
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
|
||||
if (ret == 1)
|
||||
if (ret < 1)
|
||||
pabort("can't send spi message");
|
||||
|
||||
for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
|
||||
|
@ -46,7 +46,7 @@ struct ehci_hcd_omap_platform_data {
|
||||
struct omap_musb_board_data {
|
||||
u8 interface_type;
|
||||
u8 mode;
|
||||
u8 power;
|
||||
u16 power;
|
||||
};
|
||||
|
||||
enum musb_interface {MUSB_INTERFACE_ULPI, MUSB_INTERFACE_UTMI};
|
||||
|
@ -49,7 +49,7 @@ config AR7
|
||||
family: TNETD7100, 7200 and 7300.
|
||||
|
||||
config BCM47XX
|
||||
bool "BCM47XX based boards"
|
||||
bool "Broadcom BCM47XX based boards"
|
||||
select CEVT_R4K
|
||||
select CSRC_R4K
|
||||
select DMA_NONCOHERENT
|
||||
@ -509,6 +509,7 @@ config SIBYTE_SWARM
|
||||
bool "Sibyte BCM91250A-SWARM"
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
select HAVE_PATA_PLATFORM
|
||||
select NR_CPUS_DEFAULT_2
|
||||
select SIBYTE_SB1250
|
||||
select SWAP_IO_SPACE
|
||||
@ -523,6 +524,7 @@ config SIBYTE_LITTLESUR
|
||||
depends on EXPERIMENTAL
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
select HAVE_PATA_PLATFORM
|
||||
select NR_CPUS_DEFAULT_2
|
||||
select SIBYTE_SB1250
|
||||
select SWAP_IO_SPACE
|
||||
@ -1305,6 +1307,33 @@ config CPU_CAVIUM_OCTEON
|
||||
|
||||
endchoice
|
||||
|
||||
if CPU_LOONGSON2F
|
||||
config CPU_NOP_WORKAROUNDS
|
||||
bool
|
||||
|
||||
config CPU_JUMP_WORKAROUNDS
|
||||
bool
|
||||
|
||||
config CPU_LOONGSON2F_WORKAROUNDS
|
||||
bool "Loongson 2F Workarounds"
|
||||
default y
|
||||
select CPU_NOP_WORKAROUNDS
|
||||
select CPU_JUMP_WORKAROUNDS
|
||||
help
|
||||
Loongson 2F01 / 2F02 processors have the NOP & JUMP issues which
|
||||
require workarounds. Without workarounds the system may hang
|
||||
unexpectedly. For more information please refer to the gas
|
||||
-mfix-loongson2f-nop and -mfix-loongson2f-jump options.
|
||||
|
||||
Loongson 2F03 and later have fixed these issues and no workarounds
|
||||
are needed. The workarounds have no significant side effect on them
|
||||
but may decrease the performance of the system so this option should
|
||||
be disabled unless the kernel is intended to be run on 2F01 or 2F02
|
||||
systems.
|
||||
|
||||
If unsure, please say Y.
|
||||
endif # CPU_LOONGSON2F
|
||||
|
||||
config SYS_SUPPORTS_ZBOOT
|
||||
bool
|
||||
select HAVE_KERNEL_GZIP
|
||||
|
@ -136,6 +136,19 @@ cflags-$(CONFIG_CPU_LOONGSON2E) += \
|
||||
$(call cc-option,-march=loongson2e,-march=r4600)
|
||||
cflags-$(CONFIG_CPU_LOONGSON2F) += \
|
||||
$(call cc-option,-march=loongson2f,-march=r4600)
|
||||
# enable the workarounds for loongson2f
|
||||
ifdef CONFIG_CPU_LOONGSON2F_WORKAROUNDS
|
||||
ifeq ($(call as-option,-Wa$(comma)-mfix-loongson2f-nop,),)
|
||||
$(error only binutils >= 2.20.2 have needed option -mfix-loongson2f-nop)
|
||||
else
|
||||
cflags-$(CONFIG_CPU_NOP_WORKAROUNDS) += -Wa$(comma)-mfix-loongson2f-nop
|
||||
endif
|
||||
ifeq ($(call as-option,-Wa$(comma)-mfix-loongson2f-jump,),)
|
||||
$(error only binutils >= 2.20.2 have needed option -mfix-loongson2f-jump)
|
||||
else
|
||||
cflags-$(CONFIG_CPU_JUMP_WORKAROUNDS) += -Wa$(comma)-mfix-loongson2f-jump
|
||||
endif
|
||||
endif
|
||||
|
||||
cflags-$(CONFIG_CPU_MIPS32_R1) += $(call cc-option,-march=mips32,-mips32 -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS32) \
|
||||
-Wa,-mips32 -Wa,--trap
|
||||
|
@ -66,12 +66,16 @@ static int __init db1200_arch_init(void)
|
||||
set_irq_type(AU1200_GPIO7_INT, IRQF_TRIGGER_LOW);
|
||||
bcsr_init_irq(DB1200_INT_BEGIN, DB1200_INT_END, AU1200_GPIO7_INT);
|
||||
|
||||
/* do not autoenable these: CPLD has broken edge int handling,
|
||||
* and the CD handler setup requires manual enabling to work
|
||||
* around that.
|
||||
/* insert/eject pairs: one of both is always screaming. To avoid
|
||||
* issues they must not be automatically enabled when initially
|
||||
* requested.
|
||||
*/
|
||||
irq_to_desc(DB1200_SD0_INSERT_INT)->status |= IRQ_NOAUTOEN;
|
||||
irq_to_desc(DB1200_SD0_EJECT_INT)->status |= IRQ_NOAUTOEN;
|
||||
irq_to_desc(DB1200_PC0_INSERT_INT)->status |= IRQ_NOAUTOEN;
|
||||
irq_to_desc(DB1200_PC0_EJECT_INT)->status |= IRQ_NOAUTOEN;
|
||||
irq_to_desc(DB1200_PC1_INSERT_INT)->status |= IRQ_NOAUTOEN;
|
||||
irq_to_desc(DB1200_PC1_EJECT_INT)->status |= IRQ_NOAUTOEN;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.30-rc6
|
||||
# Sun May 31 20:17:18 2009
|
||||
# Linux kernel version: 2.6.34-rc2
|
||||
# Tue Mar 23 10:36:32 2010
|
||||
#
|
||||
CONFIG_MIPS=y
|
||||
|
||||
@ -9,13 +9,14 @@ CONFIG_MIPS=y
|
||||
# Machine selection
|
||||
#
|
||||
# CONFIG_MACH_ALCHEMY is not set
|
||||
# CONFIG_AR7 is not set
|
||||
# CONFIG_BCM47XX is not set
|
||||
CONFIG_BCM63XX=y
|
||||
# CONFIG_MIPS_COBALT is not set
|
||||
# CONFIG_MACH_DECSTATION is not set
|
||||
# CONFIG_MACH_JAZZ is not set
|
||||
# CONFIG_LASAT is not set
|
||||
# CONFIG_LEMOTE_FULONG is not set
|
||||
# CONFIG_MACH_LOONGSON is not set
|
||||
# CONFIG_MIPS_MALTA is not set
|
||||
# CONFIG_MIPS_SIM is not set
|
||||
# CONFIG_NEC_MARKEINS is not set
|
||||
@ -26,6 +27,7 @@ CONFIG_BCM63XX=y
|
||||
# CONFIG_PNX8550_STB810 is not set
|
||||
# CONFIG_PMC_MSP is not set
|
||||
# CONFIG_PMC_YOSEMITE is not set
|
||||
# CONFIG_POWERTV is not set
|
||||
# CONFIG_SGI_IP22 is not set
|
||||
# CONFIG_SGI_IP27 is not set
|
||||
# CONFIG_SGI_IP28 is not set
|
||||
@ -45,13 +47,17 @@ CONFIG_BCM63XX=y
|
||||
# CONFIG_WR_PPMC is not set
|
||||
# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
|
||||
# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
|
||||
# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
|
||||
|
||||
#
|
||||
# CPU support
|
||||
#
|
||||
CONFIG_BCM63XX_CPU_6338=y
|
||||
CONFIG_BCM63XX_CPU_6345=y
|
||||
CONFIG_BCM63XX_CPU_6348=y
|
||||
CONFIG_BCM63XX_CPU_6358=y
|
||||
CONFIG_BOARD_BCM963XX=y
|
||||
CONFIG_LOONGSON_UART_BASE=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
@ -69,10 +75,8 @@ CONFIG_CEVT_R4K=y
|
||||
CONFIG_CSRC_R4K_LIB=y
|
||||
CONFIG_CSRC_R4K=y
|
||||
CONFIG_DMA_NONCOHERENT=y
|
||||
CONFIG_DMA_NEED_PCI_MAP_STATE=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_SYS_HAS_EARLY_PRINTK=y
|
||||
# CONFIG_HOTPLUG_CPU is not set
|
||||
# CONFIG_NO_IOPORT is not set
|
||||
CONFIG_GENERIC_GPIO=y
|
||||
CONFIG_CPU_BIG_ENDIAN=y
|
||||
@ -85,7 +89,8 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5
|
||||
#
|
||||
# CPU selection
|
||||
#
|
||||
# CONFIG_CPU_LOONGSON2 is not set
|
||||
# CONFIG_CPU_LOONGSON2E is not set
|
||||
# CONFIG_CPU_LOONGSON2F is not set
|
||||
CONFIG_CPU_MIPS32_R1=y
|
||||
# CONFIG_CPU_MIPS32_R2 is not set
|
||||
# CONFIG_CPU_MIPS64_R1 is not set
|
||||
@ -128,7 +133,7 @@ CONFIG_CPU_HAS_PREFETCH=y
|
||||
CONFIG_MIPS_MT_DISABLED=y
|
||||
# CONFIG_MIPS_MT_SMP is not set
|
||||
# CONFIG_MIPS_MT_SMTC is not set
|
||||
CONFIG_CPU_HAS_LLSC=y
|
||||
# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_CPU_HAS_SYNC=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
@ -146,9 +151,8 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
CONFIG_UNEVICTABLE_LRU=y
|
||||
CONFIG_HAVE_MLOCK=y
|
||||
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
|
||||
# CONFIG_KSM is not set
|
||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
||||
CONFIG_TICK_ONESHOT=y
|
||||
CONFIG_NO_HZ=y
|
||||
# CONFIG_HIGH_RES_TIMERS is not set
|
||||
@ -170,6 +174,7 @@ CONFIG_PREEMPT_NONE=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
CONFIG_CONSTRUCTORS=y
|
||||
|
||||
#
|
||||
# General setup
|
||||
@ -189,15 +194,12 @@ CONFIG_LOCALVERSION=""
|
||||
#
|
||||
# RCU Subsystem
|
||||
#
|
||||
CONFIG_CLASSIC_RCU=y
|
||||
# CONFIG_TREE_RCU is not set
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
# CONFIG_TREE_PREEMPT_RCU is not set
|
||||
CONFIG_TINY_RCU=y
|
||||
# CONFIG_TREE_RCU_TRACE is not set
|
||||
# CONFIG_PREEMPT_RCU_TRACE is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
# CONFIG_GROUP_SCHED is not set
|
||||
# CONFIG_CGROUPS is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
CONFIG_SYSFS_DEPRECATED_V2=y
|
||||
# CONFIG_RELAY is not set
|
||||
@ -205,11 +207,11 @@ CONFIG_SYSFS_DEPRECATED_V2=y
|
||||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_ANON_INODES=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
@ -223,6 +225,10 @@ CONFIG_BASE_FULL=y
|
||||
# CONFIG_EVENTFD is not set
|
||||
# CONFIG_SHMEM is not set
|
||||
# CONFIG_AIO is not set
|
||||
|
||||
#
|
||||
# Kernel Performance Events And Counters
|
||||
#
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
CONFIG_PCI_QUIRKS=y
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
@ -231,14 +237,17 @@ CONFIG_COMPAT_BRK=y
|
||||
CONFIG_SLUB=y
|
||||
# CONFIG_SLOB is not set
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_MARKERS is not set
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
|
||||
#
|
||||
# GCOV-based kernel profiling
|
||||
#
|
||||
# CONFIG_SLOW_WORK is not set
|
||||
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_MODULES is not set
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
CONFIG_LBDAF=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
|
||||
@ -246,14 +255,41 @@ CONFIG_BLOCK=y
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
# CONFIG_IOSCHED_AS is not set
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
# CONFIG_DEFAULT_AS is not set
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
CONFIG_DEFAULT_NOOP=y
|
||||
CONFIG_DEFAULT_IOSCHED="noop"
|
||||
# CONFIG_INLINE_SPIN_TRYLOCK is not set
|
||||
# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_BH is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
|
||||
CONFIG_INLINE_SPIN_UNLOCK=y
|
||||
# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
|
||||
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
|
||||
# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_INLINE_READ_TRYLOCK is not set
|
||||
# CONFIG_INLINE_READ_LOCK is not set
|
||||
# CONFIG_INLINE_READ_LOCK_BH is not set
|
||||
# CONFIG_INLINE_READ_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
|
||||
CONFIG_INLINE_READ_UNLOCK=y
|
||||
# CONFIG_INLINE_READ_UNLOCK_BH is not set
|
||||
CONFIG_INLINE_READ_UNLOCK_IRQ=y
|
||||
# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_INLINE_WRITE_TRYLOCK is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_BH is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
|
||||
CONFIG_INLINE_WRITE_UNLOCK=y
|
||||
# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
|
||||
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
|
||||
# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_MUTEX_SPIN_ON_OWNER is not set
|
||||
# CONFIG_FREEZER is not set
|
||||
|
||||
#
|
||||
@ -263,15 +299,12 @@ CONFIG_HW_HAS_PCI=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
# CONFIG_PCI_LEGACY is not set
|
||||
# CONFIG_PCI_STUB is not set
|
||||
# CONFIG_PCI_IOV is not set
|
||||
CONFIG_MMU=y
|
||||
CONFIG_PCCARD=y
|
||||
# CONFIG_PCMCIA_DEBUG is not set
|
||||
CONFIG_PCMCIA=y
|
||||
CONFIG_PCMCIA_LOAD_CIS=y
|
||||
CONFIG_PCMCIA_IOCTL=y
|
||||
CONFIG_CARDBUS=y
|
||||
|
||||
#
|
||||
@ -295,6 +328,7 @@ CONFIG_TRAD_SIGNALS=y
|
||||
#
|
||||
# Power management options
|
||||
#
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
# CONFIG_PM is not set
|
||||
CONFIG_NET=y
|
||||
@ -333,6 +367,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_NETFILTER is not set
|
||||
# CONFIG_IP_DCCP is not set
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_RDS is not set
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
@ -347,6 +382,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_PHONET is not set
|
||||
# CONFIG_IEEE802154 is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_DCB is not set
|
||||
|
||||
@ -359,7 +395,27 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_AF_RXRPC is not set
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_WIRELESS=y
|
||||
CONFIG_WEXT_CORE=y
|
||||
CONFIG_WEXT_PROC=y
|
||||
CONFIG_CFG80211=y
|
||||
CONFIG_NL80211_TESTMODE=y
|
||||
# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
|
||||
# CONFIG_CFG80211_REG_DEBUG is not set
|
||||
CONFIG_CFG80211_DEFAULT_PS=y
|
||||
# CONFIG_CFG80211_INTERNAL_REGDB is not set
|
||||
CONFIG_CFG80211_WEXT=y
|
||||
CONFIG_WIRELESS_EXT_SYSFS=y
|
||||
# CONFIG_LIB80211 is not set
|
||||
CONFIG_MAC80211=y
|
||||
# CONFIG_MAC80211_RC_PID is not set
|
||||
CONFIG_MAC80211_RC_MINSTREL=y
|
||||
# CONFIG_MAC80211_RC_DEFAULT_PID is not set
|
||||
CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
|
||||
CONFIG_MAC80211_RC_DEFAULT="minstrel"
|
||||
# CONFIG_MAC80211_MESH is not set
|
||||
CONFIG_MAC80211_LEDS=y
|
||||
# CONFIG_MAC80211_DEBUG_MENU is not set
|
||||
# CONFIG_WIMAX is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
@ -471,6 +527,7 @@ CONFIG_HAVE_IDE=y
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
CONFIG_SCSI_MOD=y
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
@ -484,13 +541,16 @@ CONFIG_HAVE_IDE=y
|
||||
#
|
||||
|
||||
#
|
||||
# Enable only one of the two stacks, unless you know what you are doing
|
||||
# You can enable one or both FireWire driver stacks.
|
||||
#
|
||||
|
||||
#
|
||||
# The newer stack is recommended.
|
||||
#
|
||||
# CONFIG_FIREWIRE is not set
|
||||
# CONFIG_IEEE1394 is not set
|
||||
# CONFIG_I2O is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_COMPAT_NET_DEV_OPS=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_MACVLAN is not set
|
||||
@ -529,6 +589,7 @@ CONFIG_MII=y
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
# CONFIG_ETHOC is not set
|
||||
# CONFIG_SMSC911X is not set
|
||||
# CONFIG_DNET is not set
|
||||
# CONFIG_NET_TULIP is not set
|
||||
# CONFIG_HP100 is not set
|
||||
@ -541,17 +602,48 @@ CONFIG_MII=y
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
|
||||
# CONFIG_NET_PCI is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_KS8842 is not set
|
||||
# CONFIG_KS8851_MLL is not set
|
||||
# CONFIG_ATL2 is not set
|
||||
CONFIG_BCM63XX_ENET=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
# CONFIG_TR is not set
|
||||
|
||||
#
|
||||
# Wireless LAN
|
||||
#
|
||||
# CONFIG_WLAN_PRE80211 is not set
|
||||
# CONFIG_WLAN_80211 is not set
|
||||
CONFIG_WLAN=y
|
||||
# CONFIG_PCMCIA_RAYCS is not set
|
||||
# CONFIG_LIBERTAS_THINFIRM is not set
|
||||
# CONFIG_ATMEL is not set
|
||||
# CONFIG_AT76C50X_USB is not set
|
||||
# CONFIG_AIRO_CS is not set
|
||||
# CONFIG_PCMCIA_WL3501 is not set
|
||||
# CONFIG_PRISM54 is not set
|
||||
# CONFIG_USB_ZD1201 is not set
|
||||
# CONFIG_USB_NET_RNDIS_WLAN is not set
|
||||
# CONFIG_RTL8180 is not set
|
||||
# CONFIG_RTL8187 is not set
|
||||
# CONFIG_ADM8211 is not set
|
||||
# CONFIG_MAC80211_HWSIM is not set
|
||||
# CONFIG_MWL8K is not set
|
||||
# CONFIG_ATH_COMMON is not set
|
||||
CONFIG_B43=y
|
||||
CONFIG_B43_PCI_AUTOSELECT=y
|
||||
CONFIG_B43_PCICORE_AUTOSELECT=y
|
||||
# CONFIG_B43_PCMCIA is not set
|
||||
CONFIG_B43_PIO=y
|
||||
# CONFIG_B43_PHY_LP is not set
|
||||
CONFIG_B43_LEDS=y
|
||||
# CONFIG_B43_DEBUG is not set
|
||||
# CONFIG_B43LEGACY is not set
|
||||
# CONFIG_HOSTAP is not set
|
||||
# CONFIG_IPW2100 is not set
|
||||
# CONFIG_IPW2200 is not set
|
||||
# CONFIG_IWLWIFI is not set
|
||||
# CONFIG_LIBERTAS is not set
|
||||
# CONFIG_HERMES is not set
|
||||
# CONFIG_P54_COMMON is not set
|
||||
# CONFIG_RT2X00 is not set
|
||||
# CONFIG_WL12XX is not set
|
||||
# CONFIG_ZD1211RW is not set
|
||||
|
||||
#
|
||||
# Enable WiMAX (Networking options) to see the WiMAX drivers
|
||||
@ -574,6 +666,7 @@ CONFIG_BCM63XX_ENET=y
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_VMXNET3 is not set
|
||||
# CONFIG_ISDN is not set
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
@ -607,6 +700,7 @@ CONFIG_BCM63XX_ENET=y
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
# CONFIG_SERIAL_TIMBERDALE is not set
|
||||
CONFIG_SERIAL_BCM63XX=y
|
||||
CONFIG_SERIAL_BCM63XX_CONSOLE=y
|
||||
# CONFIG_UNIX98_PTYS is not set
|
||||
@ -629,6 +723,11 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
CONFIG_DEVPORT=y
|
||||
# CONFIG_I2C is not set
|
||||
# CONFIG_SPI is not set
|
||||
|
||||
#
|
||||
# PPS support
|
||||
#
|
||||
# CONFIG_PPS is not set
|
||||
CONFIG_ARCH_REQUIRE_GPIOLIB=y
|
||||
CONFIG_GPIOLIB=y
|
||||
# CONFIG_GPIO_SYSFS is not set
|
||||
@ -636,6 +735,8 @@ CONFIG_GPIOLIB=y
|
||||
#
|
||||
# Memory mapped GPIO expanders:
|
||||
#
|
||||
# CONFIG_GPIO_IT8761E is not set
|
||||
# CONFIG_GPIO_SCH is not set
|
||||
|
||||
#
|
||||
# I2C GPIO expanders:
|
||||
@ -644,16 +745,21 @@ CONFIG_GPIOLIB=y
|
||||
#
|
||||
# PCI GPIO expanders:
|
||||
#
|
||||
# CONFIG_GPIO_CS5535 is not set
|
||||
# CONFIG_GPIO_BT8XX is not set
|
||||
# CONFIG_GPIO_LANGWELL is not set
|
||||
|
||||
#
|
||||
# SPI GPIO expanders:
|
||||
#
|
||||
|
||||
#
|
||||
# AC97 GPIO expanders:
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
|
||||
@ -662,15 +768,16 @@ CONFIG_SSB_POSSIBLE=y
|
||||
#
|
||||
CONFIG_SSB=y
|
||||
CONFIG_SSB_SPROM=y
|
||||
CONFIG_SSB_BLOCKIO=y
|
||||
CONFIG_SSB_PCIHOST_POSSIBLE=y
|
||||
CONFIG_SSB_PCIHOST=y
|
||||
# CONFIG_SSB_B43_PCI_BRIDGE is not set
|
||||
CONFIG_SSB_B43_PCI_BRIDGE=y
|
||||
CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
|
||||
# CONFIG_SSB_PCMCIAHOST is not set
|
||||
# CONFIG_SSB_SILENT is not set
|
||||
# CONFIG_SSB_DEBUG is not set
|
||||
CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
|
||||
# CONFIG_SSB_DRIVER_PCICORE is not set
|
||||
CONFIG_SSB_DRIVER_PCICORE=y
|
||||
# CONFIG_SSB_DRIVER_MIPS is not set
|
||||
|
||||
#
|
||||
@ -680,27 +787,15 @@ CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
# CONFIG_HTC_PASIC3 is not set
|
||||
# CONFIG_MFD_TMIO is not set
|
||||
# CONFIG_MFD_TIMBERDALE is not set
|
||||
# CONFIG_LPC_SCH is not set
|
||||
# CONFIG_REGULATOR is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia core support
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
# CONFIG_DVB_CORE is not set
|
||||
# CONFIG_VIDEO_MEDIA is not set
|
||||
|
||||
#
|
||||
# Multimedia drivers
|
||||
#
|
||||
# CONFIG_DAB is not set
|
||||
# CONFIG_MEDIA_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_VGA_ARB is not set
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_VGASTATE is not set
|
||||
# CONFIG_VIDEO_OUTPUT_CONTROL is not set
|
||||
@ -710,11 +805,7 @@ CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
|
||||
#
|
||||
# Display device support
|
||||
#
|
||||
CONFIG_DISPLAY_SUPPORT=y
|
||||
|
||||
#
|
||||
# Display hardware drivers
|
||||
#
|
||||
# CONFIG_DISPLAY_SUPPORT is not set
|
||||
# CONFIG_SOUND is not set
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
@ -741,13 +832,14 @@ CONFIG_USB=y
|
||||
# USB Host Controller Drivers
|
||||
#
|
||||
# CONFIG_USB_C67X00_HCD is not set
|
||||
# CONFIG_USB_XHCI_HCD is not set
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
|
||||
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
|
||||
CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
|
||||
# CONFIG_USB_OXU210HP_HCD is not set
|
||||
# CONFIG_USB_ISP116X_HCD is not set
|
||||
# CONFIG_USB_ISP1760_HCD is not set
|
||||
# CONFIG_USB_ISP1362_HCD is not set
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
# CONFIG_USB_OHCI_HCD_SSB is not set
|
||||
CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
|
||||
@ -796,7 +888,6 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
# CONFIG_USB_RIO500 is not set
|
||||
# CONFIG_USB_LEGOTOWER is not set
|
||||
# CONFIG_USB_LCD is not set
|
||||
# CONFIG_USB_BERRY_CHARGE is not set
|
||||
# CONFIG_USB_LED is not set
|
||||
# CONFIG_USB_CYPRESS_CY7C63 is not set
|
||||
# CONFIG_USB_CYTHERM is not set
|
||||
@ -807,8 +898,8 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
# CONFIG_USB_LD is not set
|
||||
# CONFIG_USB_TRANCEVIBRATOR is not set
|
||||
# CONFIG_USB_IOWARRIOR is not set
|
||||
# CONFIG_USB_TEST is not set
|
||||
# CONFIG_USB_ISIGHTFW is not set
|
||||
# CONFIG_USB_VST is not set
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
@ -819,7 +910,29 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
# CONFIG_UWB is not set
|
||||
# CONFIG_MMC is not set
|
||||
# CONFIG_MEMSTICK is not set
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_GPIO_PLATFORM=y
|
||||
# CONFIG_LEDS_LT3593 is not set
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
|
||||
# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
|
||||
CONFIG_LEDS_TRIGGER_GPIO=y
|
||||
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
|
||||
|
||||
#
|
||||
# iptables trigger is under Netfilter config (LED target)
|
||||
#
|
||||
# CONFIG_ACCESSIBILITY is not set
|
||||
# CONFIG_INFINIBAND is not set
|
||||
CONFIG_RTC_LIB=y
|
||||
@ -827,6 +940,10 @@ CONFIG_RTC_LIB=y
|
||||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
# CONFIG_UIO is not set
|
||||
|
||||
#
|
||||
# TI VLYNQ
|
||||
#
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
#
|
||||
@ -838,12 +955,16 @@ CONFIG_RTC_LIB=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_FILE_LOCKING is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_BTRFS_FS is not set
|
||||
# CONFIG_NILFS2_FS is not set
|
||||
# CONFIG_FILE_LOCKING is not set
|
||||
CONFIG_FSNOTIFY=y
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_INOTIFY is not set
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
@ -875,8 +996,6 @@ CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_PROC_PAGE_MONITOR=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
CONFIG_MISC_FILESYSTEMS=y
|
||||
@ -888,6 +1007,7 @@ CONFIG_MISC_FILESYSTEMS=y
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_JFFS2_FS is not set
|
||||
# CONFIG_LOGFS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_SQUASHFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
@ -898,7 +1018,6 @@ CONFIG_MISC_FILESYSTEMS=y
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
# CONFIG_NILFS2_FS is not set
|
||||
# CONFIG_NETWORK_FILESYSTEMS is not set
|
||||
|
||||
#
|
||||
@ -906,7 +1025,46 @@ CONFIG_MISC_FILESYSTEMS=y
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
# CONFIG_NLS is not set
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
# CONFIG_NLS_CODEPAGE_437 is not set
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
||||
# CONFIG_NLS_ISO8859_8 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
# CONFIG_NLS_ASCII is not set
|
||||
# CONFIG_NLS_ISO8859_1 is not set
|
||||
# CONFIG_NLS_ISO8859_2 is not set
|
||||
# CONFIG_NLS_ISO8859_3 is not set
|
||||
# CONFIG_NLS_ISO8859_4 is not set
|
||||
# CONFIG_NLS_ISO8859_5 is not set
|
||||
# CONFIG_NLS_ISO8859_6 is not set
|
||||
# CONFIG_NLS_ISO8859_7 is not set
|
||||
# CONFIG_NLS_ISO8859_9 is not set
|
||||
# CONFIG_NLS_ISO8859_13 is not set
|
||||
# CONFIG_NLS_ISO8859_14 is not set
|
||||
# CONFIG_NLS_ISO8859_15 is not set
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
# CONFIG_DLM is not set
|
||||
|
||||
#
|
||||
@ -918,29 +1076,23 @@ CONFIG_ENABLE_WARN_DEPRECATED=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_FRAME_WARN=1024
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
# CONFIG_DEBUG_MEMORY_INIT is not set
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_TRACING_SUPPORT=y
|
||||
|
||||
#
|
||||
# Tracers
|
||||
#
|
||||
# CONFIG_IRQSOFF_TRACER is not set
|
||||
# CONFIG_SCHED_TRACER is not set
|
||||
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
||||
# CONFIG_EVENT_TRACER is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
# CONFIG_TRACE_BRANCH_PROFILING is not set
|
||||
# CONFIG_KMEMTRACE is not set
|
||||
# CONFIG_WORKQUEUE_TRACER is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyS0,115200"
|
||||
# CONFIG_CMDLINE_OVERRIDE is not set
|
||||
@ -951,8 +1103,108 @@ CONFIG_CMDLINE="console=ttyS0,115200"
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
# CONFIG_SECURITYFS is not set
|
||||
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
|
||||
# CONFIG_CRYPTO is not set
|
||||
# CONFIG_DEFAULT_SECURITY_SELINUX is not set
|
||||
# CONFIG_DEFAULT_SECURITY_SMACK is not set
|
||||
# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
|
||||
CONFIG_DEFAULT_SECURITY_DAC=y
|
||||
CONFIG_DEFAULT_SECURITY=""
|
||||
CONFIG_CRYPTO=y
|
||||
|
||||
#
|
||||
# Crypto core or helper
|
||||
#
|
||||
# CONFIG_CRYPTO_FIPS is not set
|
||||
CONFIG_CRYPTO_ALGAPI=y
|
||||
CONFIG_CRYPTO_ALGAPI2=y
|
||||
CONFIG_CRYPTO_AEAD2=y
|
||||
CONFIG_CRYPTO_BLKCIPHER=y
|
||||
CONFIG_CRYPTO_BLKCIPHER2=y
|
||||
CONFIG_CRYPTO_HASH2=y
|
||||
CONFIG_CRYPTO_RNG=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_PCOMP=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_MANAGER2=y
|
||||
# CONFIG_CRYPTO_GF128MUL is not set
|
||||
# CONFIG_CRYPTO_NULL is not set
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
# CONFIG_CRYPTO_CRYPTD is not set
|
||||
# CONFIG_CRYPTO_AUTHENC is not set
|
||||
|
||||
#
|
||||
# Authenticated Encryption with Associated Data
|
||||
#
|
||||
# CONFIG_CRYPTO_CCM is not set
|
||||
# CONFIG_CRYPTO_GCM is not set
|
||||
# CONFIG_CRYPTO_SEQIV is not set
|
||||
|
||||
#
|
||||
# Block modes
|
||||
#
|
||||
# CONFIG_CRYPTO_CBC is not set
|
||||
# CONFIG_CRYPTO_CTR is not set
|
||||
# CONFIG_CRYPTO_CTS is not set
|
||||
CONFIG_CRYPTO_ECB=y
|
||||
# CONFIG_CRYPTO_LRW is not set
|
||||
# CONFIG_CRYPTO_PCBC is not set
|
||||
# CONFIG_CRYPTO_XTS is not set
|
||||
|
||||
#
|
||||
# Hash modes
|
||||
#
|
||||
# CONFIG_CRYPTO_HMAC is not set
|
||||
# CONFIG_CRYPTO_XCBC is not set
|
||||
# CONFIG_CRYPTO_VMAC is not set
|
||||
|
||||
#
|
||||
# Digest
|
||||
#
|
||||
# CONFIG_CRYPTO_CRC32C is not set
|
||||
# CONFIG_CRYPTO_GHASH is not set
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
# CONFIG_CRYPTO_MD5 is not set
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
# CONFIG_CRYPTO_RMD128 is not set
|
||||
# CONFIG_CRYPTO_RMD160 is not set
|
||||
# CONFIG_CRYPTO_RMD256 is not set
|
||||
# CONFIG_CRYPTO_RMD320 is not set
|
||||
# CONFIG_CRYPTO_SHA1 is not set
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
# CONFIG_CRYPTO_TGR192 is not set
|
||||
# CONFIG_CRYPTO_WP512 is not set
|
||||
|
||||
#
|
||||
# Ciphers
|
||||
#
|
||||
CONFIG_CRYPTO_AES=y
|
||||
# CONFIG_CRYPTO_ANUBIS is not set
|
||||
CONFIG_CRYPTO_ARC4=y
|
||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||
# CONFIG_CRYPTO_CAMELLIA is not set
|
||||
# CONFIG_CRYPTO_CAST5 is not set
|
||||
# CONFIG_CRYPTO_CAST6 is not set
|
||||
# CONFIG_CRYPTO_DES is not set
|
||||
# CONFIG_CRYPTO_FCRYPT is not set
|
||||
# CONFIG_CRYPTO_KHAZAD is not set
|
||||
# CONFIG_CRYPTO_SALSA20 is not set
|
||||
# CONFIG_CRYPTO_SEED is not set
|
||||
# CONFIG_CRYPTO_SERPENT is not set
|
||||
# CONFIG_CRYPTO_TEA is not set
|
||||
# CONFIG_CRYPTO_TWOFISH is not set
|
||||
|
||||
#
|
||||
# Compression
|
||||
#
|
||||
# CONFIG_CRYPTO_DEFLATE is not set
|
||||
# CONFIG_CRYPTO_ZLIB is not set
|
||||
# CONFIG_CRYPTO_LZO is not set
|
||||
|
||||
#
|
||||
# Random Number Generation
|
||||
#
|
||||
CONFIG_CRYPTO_ANSI_CPRNG=y
|
||||
# CONFIG_CRYPTO_HW is not set
|
||||
# CONFIG_BINARY_PRINTF is not set
|
||||
|
||||
#
|
||||
|
@ -16,7 +16,7 @@
|
||||
({ \
|
||||
__typeof(*(m)) __ret; \
|
||||
\
|
||||
if (kernel_uses_llsc && R10000_LLSC_WAR) { \
|
||||
if (kernel_uses_llsc && R10000_LLSC_WAR) { \
|
||||
__asm__ __volatile__( \
|
||||
" .set push \n" \
|
||||
" .set noat \n" \
|
||||
|
@ -307,7 +307,7 @@ extern unsigned long _loongson_addrwincfg_base;
|
||||
*/
|
||||
#define LOONGSON_ADDRWIN_CFG(s, d, w, src, dst, size) do {\
|
||||
s##_WIN##w##_BASE = (src); \
|
||||
s##_WIN##w##_MMAP = (src) | ADDRWIN_MAP_DST_##d; \
|
||||
s##_WIN##w##_MMAP = (dst) | ADDRWIN_MAP_DST_##d; \
|
||||
s##_WIN##w##_MASK = ~(size-1); \
|
||||
} while (0)
|
||||
|
||||
|
@ -120,9 +120,14 @@
|
||||
#endif
|
||||
#define FIRST_USER_ADDRESS 0UL
|
||||
|
||||
#define VMALLOC_START MAP_BASE
|
||||
/*
|
||||
* TLB refill handlers also map the vmalloc area into xuseg. Avoid
|
||||
* the first couple of pages so NULL pointer dereferences will still
|
||||
* reliably trap.
|
||||
*/
|
||||
#define VMALLOC_START (MAP_BASE + (2 * PAGE_SIZE))
|
||||
#define VMALLOC_END \
|
||||
(VMALLOC_START + \
|
||||
(MAP_BASE + \
|
||||
min(PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE, \
|
||||
(1UL << cpu_vmbits)) - (1UL << 32))
|
||||
|
||||
|
@ -142,9 +142,9 @@ extern int ptrace_set_watch_regs(struct task_struct *child,
|
||||
|
||||
extern asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit);
|
||||
|
||||
extern NORET_TYPE void die(const char *, const struct pt_regs *) ATTRIB_NORET;
|
||||
extern NORET_TYPE void die(const char *, struct pt_regs *) ATTRIB_NORET;
|
||||
|
||||
static inline void die_if_kernel(const char *str, const struct pt_regs *regs)
|
||||
static inline void die_if_kernel(const char *str, struct pt_regs *regs)
|
||||
{
|
||||
if (unlikely(!user_mode(regs)))
|
||||
die(str, regs);
|
||||
|
@ -121,7 +121,7 @@
|
||||
.endm
|
||||
#else
|
||||
.macro get_saved_sp /* Uniprocessor variation */
|
||||
#ifdef CONFIG_CPU_LOONGSON2F
|
||||
#ifdef CONFIG_CPU_JUMP_WORKAROUNDS
|
||||
/*
|
||||
* Clear BTB (branch target buffer), forbid RAS (return address
|
||||
* stack) to workaround the Out-of-order Issue in Loongson2F
|
||||
|
@ -167,6 +167,24 @@ static inline void __cpuinit uasm_l##lb(struct uasm_label **lab, u32 *addr) \
|
||||
#define uasm_i_ssnop(buf) uasm_i_sll(buf, 0, 0, 1)
|
||||
#define uasm_i_ehb(buf) uasm_i_sll(buf, 0, 0, 3)
|
||||
|
||||
static inline void uasm_i_dsrl_safe(u32 **p, unsigned int a1,
|
||||
unsigned int a2, unsigned int a3)
|
||||
{
|
||||
if (a3 < 32)
|
||||
uasm_i_dsrl(p, a1, a2, a3);
|
||||
else
|
||||
uasm_i_dsrl32(p, a1, a2, a3 - 32);
|
||||
}
|
||||
|
||||
static inline void uasm_i_dsll_safe(u32 **p, unsigned int a1,
|
||||
unsigned int a2, unsigned int a3)
|
||||
{
|
||||
if (a3 < 32)
|
||||
uasm_i_dsll(p, a1, a2, a3);
|
||||
else
|
||||
uasm_i_dsll32(p, a1, a2, a3 - 32);
|
||||
}
|
||||
|
||||
/* Handle relocations. */
|
||||
struct uasm_reloc {
|
||||
u32 *addr;
|
||||
|
@ -76,15 +76,9 @@ void __init plat_mem_setup(void)
|
||||
|
||||
#ifdef CONFIG_VT
|
||||
screen_info = (struct screen_info) {
|
||||
0, 0, /* orig-x, orig-y */
|
||||
0, /* unused */
|
||||
0, /* orig_video_page */
|
||||
0, /* orig_video_mode */
|
||||
160, /* orig_video_cols */
|
||||
0, 0, 0, /* unused, ega_bx, unused */
|
||||
64, /* orig_video_lines */
|
||||
0, /* orig_video_isVGA */
|
||||
16 /* orig_video_points */
|
||||
.orig_video_cols = 160,
|
||||
.orig_video_lines = 64,
|
||||
.orig_video_points = 16,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@ -352,9 +352,10 @@ void show_registers(const struct pt_regs *regs)
|
||||
|
||||
static DEFINE_SPINLOCK(die_lock);
|
||||
|
||||
void __noreturn die(const char * str, const struct pt_regs * regs)
|
||||
void __noreturn die(const char * str, struct pt_regs * regs)
|
||||
{
|
||||
static int die_counter;
|
||||
int sig = SIGSEGV;
|
||||
#ifdef CONFIG_MIPS_MT_SMTC
|
||||
unsigned long dvpret = dvpe();
|
||||
#endif /* CONFIG_MIPS_MT_SMTC */
|
||||
@ -365,6 +366,10 @@ void __noreturn die(const char * str, const struct pt_regs * regs)
|
||||
#ifdef CONFIG_MIPS_MT_SMTC
|
||||
mips_mt_regdump(dvpret);
|
||||
#endif /* CONFIG_MIPS_MT_SMTC */
|
||||
|
||||
if (notify_die(DIE_OOPS, str, regs, 0, current->thread.trap_no, SIGSEGV) == NOTIFY_STOP)
|
||||
sig = 0;
|
||||
|
||||
printk("%s[#%d]:\n", str, ++die_counter);
|
||||
show_registers(regs);
|
||||
add_taint(TAINT_DIE);
|
||||
@ -379,7 +384,7 @@ void __noreturn die(const char * str, const struct pt_regs * regs)
|
||||
panic("Fatal exception");
|
||||
}
|
||||
|
||||
do_exit(SIGSEGV);
|
||||
do_exit(sig);
|
||||
}
|
||||
|
||||
extern struct exception_table_entry __start___dbe_table[];
|
||||
@ -1557,12 +1562,7 @@ static char panic_null_cerr[] __cpuinitdata =
|
||||
void __cpuinit set_uncached_handler(unsigned long offset, void *addr,
|
||||
unsigned long size)
|
||||
{
|
||||
#ifdef CONFIG_32BIT
|
||||
unsigned long uncached_ebase = KSEG1ADDR(ebase);
|
||||
#endif
|
||||
#ifdef CONFIG_64BIT
|
||||
unsigned long uncached_ebase = TO_UNCAC(ebase);
|
||||
#endif
|
||||
unsigned long uncached_ebase = CKSEG1ADDR(ebase);
|
||||
|
||||
if (!addr)
|
||||
panic(panic_null_cerr);
|
||||
|
@ -24,7 +24,7 @@ static const char *system_types[] = {
|
||||
[MACH_LEMOTE_FL2F] "lemote-fuloong-2f-box",
|
||||
[MACH_LEMOTE_ML2F7] "lemote-mengloong-2f-7inches",
|
||||
[MACH_LEMOTE_YL2F89] "lemote-yeeloong-2f-8.9inches",
|
||||
[MACH_DEXXON_GDIUM2F10] "dexxon-gidum-2f-10inches",
|
||||
[MACH_DEXXON_GDIUM2F10] "dexxon-gdium-2f",
|
||||
[MACH_LEMOTE_NAS] "lemote-nas-2f",
|
||||
[MACH_LEMOTE_LL2F] "lemote-lynloong-2f",
|
||||
[MACH_LOONGSON_END] NULL,
|
||||
|
@ -75,7 +75,7 @@ pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
|
||||
unsigned long end = offset + size;
|
||||
|
||||
if (__uncached_access(file, offset)) {
|
||||
if (((uca_start && offset) >= uca_start) &&
|
||||
if (uca_start && (offset >= uca_start) &&
|
||||
(end <= uca_end))
|
||||
return __pgprot((pgprot_val(vma_prot) &
|
||||
~_CACHE_MASK) |
|
||||
@ -96,7 +96,7 @@ static int __init find_vga_mem_init(void)
|
||||
return 0;
|
||||
|
||||
for_each_pci_dev(dev) {
|
||||
if ((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA) {
|
||||
if ((dev->class >> 16) == PCI_BASE_CLASS_DISPLAY) {
|
||||
for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
|
||||
r = &dev->resource[idx];
|
||||
if (!r->start && r->end)
|
||||
|
@ -16,13 +16,31 @@
|
||||
|
||||
#include <loongson.h>
|
||||
|
||||
static inline void loongson_reboot(void)
|
||||
{
|
||||
#ifndef CONFIG_CPU_JUMP_WORKAROUNDS
|
||||
((void (*)(void))ioremap_nocache(LOONGSON_BOOT_BASE, 4)) ();
|
||||
#else
|
||||
void (*func)(void);
|
||||
|
||||
func = (void *)ioremap_nocache(LOONGSON_BOOT_BASE, 4);
|
||||
|
||||
__asm__ __volatile__(
|
||||
" .set noat \n"
|
||||
" jr %[func] \n"
|
||||
" .set at \n"
|
||||
: /* No outputs */
|
||||
: [func] "r" (func));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void loongson_restart(char *command)
|
||||
{
|
||||
/* do preparation for reboot */
|
||||
mach_prepare_reboot();
|
||||
|
||||
/* reboot via jumping to boot base address */
|
||||
((void (*)(void))ioremap_nocache(LOONGSON_BOOT_BASE, 4)) ();
|
||||
loongson_reboot();
|
||||
}
|
||||
|
||||
static void loongson_poweroff(void)
|
||||
|
@ -41,15 +41,12 @@ void __init plat_mem_setup(void)
|
||||
conswitchp = &vga_con;
|
||||
|
||||
screen_info = (struct screen_info) {
|
||||
0, 25, /* orig-x, orig-y */
|
||||
0, /* unused */
|
||||
0, /* orig-video-page */
|
||||
0, /* orig-video-mode */
|
||||
80, /* orig-video-cols */
|
||||
0, 0, 0, /* ega_ax, ega_bx, ega_cx */
|
||||
25, /* orig-video-lines */
|
||||
VIDEO_TYPE_VGAC, /* orig-video-isVGA */
|
||||
16 /* orig-video-points */
|
||||
.orig_x = 0,
|
||||
.orig_y = 25,
|
||||
.orig_video_cols = 80,
|
||||
.orig_video_lines = 25,
|
||||
.orig_video_isVGA = VIDEO_TYPE_VGAC,
|
||||
.orig_video_points = 16,
|
||||
};
|
||||
#elif defined(CONFIG_DUMMY_CONSOLE)
|
||||
conswitchp = &dummy_con;
|
||||
|
@ -79,7 +79,7 @@ void mach_irq_dispatch(unsigned int pending)
|
||||
if (pending & CAUSEF_IP7)
|
||||
do_IRQ(LOONGSON_TIMER_IRQ);
|
||||
else if (pending & CAUSEF_IP6) { /* North Bridge, Perf counter */
|
||||
#ifdef CONFIG_OPROFILE
|
||||
#if defined(CONFIG_OPROFILE) || defined(CONFIG_OPROFILE_MODULE)
|
||||
do_IRQ(LOONGSON2_PERFCNT_IRQ);
|
||||
#endif
|
||||
bonito_irqdispatch();
|
||||
|
@ -31,6 +31,16 @@
|
||||
#include <asm/war.h>
|
||||
#include <asm/uasm.h>
|
||||
|
||||
/*
|
||||
* TLB load/store/modify handlers.
|
||||
*
|
||||
* Only the fastpath gets synthesized at runtime, the slowpath for
|
||||
* do_page_fault remains normal asm.
|
||||
*/
|
||||
extern void tlb_do_page_fault_0(void);
|
||||
extern void tlb_do_page_fault_1(void);
|
||||
|
||||
|
||||
static inline int r45k_bvahwbug(void)
|
||||
{
|
||||
/* XXX: We should probe for the presence of this bug, but we don't. */
|
||||
@ -83,6 +93,7 @@ enum label_id {
|
||||
label_nopage_tlbm,
|
||||
label_smp_pgtable_change,
|
||||
label_r3000_write_probe_fail,
|
||||
label_large_segbits_fault,
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
label_tlb_huge_update,
|
||||
#endif
|
||||
@ -101,6 +112,7 @@ UASM_L_LA(_nopage_tlbs)
|
||||
UASM_L_LA(_nopage_tlbm)
|
||||
UASM_L_LA(_smp_pgtable_change)
|
||||
UASM_L_LA(_r3000_write_probe_fail)
|
||||
UASM_L_LA(_large_segbits_fault)
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
UASM_L_LA(_tlb_huge_update)
|
||||
#endif
|
||||
@ -157,6 +169,10 @@ static u32 tlb_handler[128] __cpuinitdata;
|
||||
static struct uasm_label labels[128] __cpuinitdata;
|
||||
static struct uasm_reloc relocs[128] __cpuinitdata;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
static int check_for_high_segbits __cpuinitdata;
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_MIPS_PGD_C0_CONTEXT
|
||||
/*
|
||||
* CONFIG_MIPS_PGD_C0_CONTEXT implies 64 bit and lack of pgd_current,
|
||||
@ -408,7 +424,7 @@ static __cpuinit __maybe_unused void build_convert_pte_to_entrylo(u32 **p,
|
||||
UASM_i_ROTR(p, reg, reg, ilog2(_PAGE_GLOBAL) - ilog2(_PAGE_NO_EXEC));
|
||||
} else {
|
||||
#ifdef CONFIG_64BIT_PHYS_ADDR
|
||||
uasm_i_dsrl(p, reg, reg, ilog2(_PAGE_GLOBAL));
|
||||
uasm_i_dsrl_safe(p, reg, reg, ilog2(_PAGE_GLOBAL));
|
||||
#else
|
||||
UASM_i_SRL(p, reg, reg, ilog2(_PAGE_GLOBAL));
|
||||
#endif
|
||||
@ -532,7 +548,24 @@ build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r,
|
||||
* The vmalloc handling is not in the hotpath.
|
||||
*/
|
||||
uasm_i_dmfc0(p, tmp, C0_BADVADDR);
|
||||
uasm_il_bltz(p, r, tmp, label_vmalloc);
|
||||
|
||||
if (check_for_high_segbits) {
|
||||
/*
|
||||
* The kernel currently implicitely assumes that the
|
||||
* MIPS SEGBITS parameter for the processor is
|
||||
* (PGDIR_SHIFT+PGDIR_BITS) or less, and will never
|
||||
* allocate virtual addresses outside the maximum
|
||||
* range for SEGBITS = (PGDIR_SHIFT+PGDIR_BITS). But
|
||||
* that doesn't prevent user code from accessing the
|
||||
* higher xuseg addresses. Here, we make sure that
|
||||
* everything but the lower xuseg addresses goes down
|
||||
* the module_alloc/vmalloc path.
|
||||
*/
|
||||
uasm_i_dsrl_safe(p, ptr, tmp, PGDIR_SHIFT + PGD_ORDER + PAGE_SHIFT - 3);
|
||||
uasm_il_bnez(p, r, ptr, label_vmalloc);
|
||||
} else {
|
||||
uasm_il_bltz(p, r, tmp, label_vmalloc);
|
||||
}
|
||||
/* No uasm_i_nop needed here, since the next insn doesn't touch TMP. */
|
||||
|
||||
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
|
||||
@ -549,14 +582,14 @@ build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r,
|
||||
* SMTC uses TCBind value as "CPU" index
|
||||
*/
|
||||
uasm_i_mfc0(p, ptr, C0_TCBIND);
|
||||
uasm_i_dsrl(p, ptr, ptr, 19);
|
||||
uasm_i_dsrl_safe(p, ptr, ptr, 19);
|
||||
# else
|
||||
/*
|
||||
* 64 bit SMP running in XKPHYS has smp_processor_id() << 3
|
||||
* stored in CONTEXT.
|
||||
*/
|
||||
uasm_i_dmfc0(p, ptr, C0_CONTEXT);
|
||||
uasm_i_dsrl(p, ptr, ptr, 23);
|
||||
uasm_i_dsrl_safe(p, ptr, ptr, 23);
|
||||
# endif
|
||||
UASM_i_LA_mostly(p, tmp, pgdc);
|
||||
uasm_i_daddu(p, ptr, ptr, tmp);
|
||||
@ -569,44 +602,78 @@ build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r,
|
||||
|
||||
uasm_l_vmalloc_done(l, *p);
|
||||
|
||||
if (PGDIR_SHIFT - 3 < 32) /* get pgd offset in bytes */
|
||||
uasm_i_dsrl(p, tmp, tmp, PGDIR_SHIFT-3);
|
||||
else
|
||||
uasm_i_dsrl32(p, tmp, tmp, PGDIR_SHIFT - 3 - 32);
|
||||
/* get pgd offset in bytes */
|
||||
uasm_i_dsrl_safe(p, tmp, tmp, PGDIR_SHIFT - 3);
|
||||
|
||||
uasm_i_andi(p, tmp, tmp, (PTRS_PER_PGD - 1)<<3);
|
||||
uasm_i_daddu(p, ptr, ptr, tmp); /* add in pgd offset */
|
||||
#ifndef __PAGETABLE_PMD_FOLDED
|
||||
uasm_i_dmfc0(p, tmp, C0_BADVADDR); /* get faulting address */
|
||||
uasm_i_ld(p, ptr, 0, ptr); /* get pmd pointer */
|
||||
uasm_i_dsrl(p, tmp, tmp, PMD_SHIFT-3); /* get pmd offset in bytes */
|
||||
uasm_i_dsrl_safe(p, tmp, tmp, PMD_SHIFT-3); /* get pmd offset in bytes */
|
||||
uasm_i_andi(p, tmp, tmp, (PTRS_PER_PMD - 1)<<3);
|
||||
uasm_i_daddu(p, ptr, ptr, tmp); /* add in pmd offset */
|
||||
#endif
|
||||
}
|
||||
|
||||
enum vmalloc64_mode {not_refill, refill};
|
||||
/*
|
||||
* BVADDR is the faulting address, PTR is scratch.
|
||||
* PTR will hold the pgd for vmalloc.
|
||||
*/
|
||||
static void __cpuinit
|
||||
build_get_pgd_vmalloc64(u32 **p, struct uasm_label **l, struct uasm_reloc **r,
|
||||
unsigned int bvaddr, unsigned int ptr)
|
||||
unsigned int bvaddr, unsigned int ptr,
|
||||
enum vmalloc64_mode mode)
|
||||
{
|
||||
long swpd = (long)swapper_pg_dir;
|
||||
int single_insn_swpd;
|
||||
int did_vmalloc_branch = 0;
|
||||
|
||||
single_insn_swpd = uasm_in_compat_space_p(swpd) && !uasm_rel_lo(swpd);
|
||||
|
||||
uasm_l_vmalloc(l, *p);
|
||||
|
||||
if (uasm_in_compat_space_p(swpd) && !uasm_rel_lo(swpd)) {
|
||||
uasm_il_b(p, r, label_vmalloc_done);
|
||||
uasm_i_lui(p, ptr, uasm_rel_hi(swpd));
|
||||
} else {
|
||||
UASM_i_LA_mostly(p, ptr, swpd);
|
||||
uasm_il_b(p, r, label_vmalloc_done);
|
||||
if (uasm_in_compat_space_p(swpd))
|
||||
uasm_i_addiu(p, ptr, ptr, uasm_rel_lo(swpd));
|
||||
else
|
||||
uasm_i_daddiu(p, ptr, ptr, uasm_rel_lo(swpd));
|
||||
if (mode == refill && check_for_high_segbits) {
|
||||
if (single_insn_swpd) {
|
||||
uasm_il_bltz(p, r, bvaddr, label_vmalloc_done);
|
||||
uasm_i_lui(p, ptr, uasm_rel_hi(swpd));
|
||||
did_vmalloc_branch = 1;
|
||||
/* fall through */
|
||||
} else {
|
||||
uasm_il_bgez(p, r, bvaddr, label_large_segbits_fault);
|
||||
}
|
||||
}
|
||||
if (!did_vmalloc_branch) {
|
||||
if (uasm_in_compat_space_p(swpd) && !uasm_rel_lo(swpd)) {
|
||||
uasm_il_b(p, r, label_vmalloc_done);
|
||||
uasm_i_lui(p, ptr, uasm_rel_hi(swpd));
|
||||
} else {
|
||||
UASM_i_LA_mostly(p, ptr, swpd);
|
||||
uasm_il_b(p, r, label_vmalloc_done);
|
||||
if (uasm_in_compat_space_p(swpd))
|
||||
uasm_i_addiu(p, ptr, ptr, uasm_rel_lo(swpd));
|
||||
else
|
||||
uasm_i_daddiu(p, ptr, ptr, uasm_rel_lo(swpd));
|
||||
}
|
||||
}
|
||||
if (mode == refill && check_for_high_segbits) {
|
||||
uasm_l_large_segbits_fault(l, *p);
|
||||
/*
|
||||
* We get here if we are an xsseg address, or if we are
|
||||
* an xuseg address above (PGDIR_SHIFT+PGDIR_BITS) boundary.
|
||||
*
|
||||
* Ignoring xsseg (assume disabled so would generate
|
||||
* (address errors?), the only remaining possibility
|
||||
* is the upper xuseg addresses. On processors with
|
||||
* TLB_SEGBITS <= PGDIR_SHIFT+PGDIR_BITS, these
|
||||
* addresses would have taken an address error. We try
|
||||
* to mimic that here by taking a load/istream page
|
||||
* fault.
|
||||
*/
|
||||
UASM_i_LA(p, ptr, (unsigned long)tlb_do_page_fault_0);
|
||||
uasm_i_jr(p, ptr);
|
||||
uasm_i_nop(p);
|
||||
}
|
||||
}
|
||||
|
||||
@ -720,9 +787,9 @@ static void __cpuinit build_update_entries(u32 **p, unsigned int tmp,
|
||||
UASM_i_MTC0(p, tmp, C0_ENTRYLO0); /* load it */
|
||||
UASM_i_ROTR(p, ptep, ptep, ilog2(_PAGE_GLOBAL) - ilog2(_PAGE_NO_EXEC));
|
||||
} else {
|
||||
uasm_i_dsrl(p, tmp, tmp, ilog2(_PAGE_GLOBAL)); /* convert to entrylo0 */
|
||||
uasm_i_dsrl_safe(p, tmp, tmp, ilog2(_PAGE_GLOBAL)); /* convert to entrylo0 */
|
||||
UASM_i_MTC0(p, tmp, C0_ENTRYLO0); /* load it */
|
||||
uasm_i_dsrl(p, ptep, ptep, ilog2(_PAGE_GLOBAL)); /* convert to entrylo1 */
|
||||
uasm_i_dsrl_safe(p, ptep, ptep, ilog2(_PAGE_GLOBAL)); /* convert to entrylo1 */
|
||||
}
|
||||
UASM_i_MTC0(p, ptep, C0_ENTRYLO1); /* load it */
|
||||
} else {
|
||||
@ -793,9 +860,9 @@ static void __cpuinit build_r4000_tlb_refill_handler(void)
|
||||
uasm_i_dmfc0(&p, K0, C0_BADVADDR);
|
||||
uasm_i_dmfc0(&p, K1, C0_ENTRYHI);
|
||||
uasm_i_xor(&p, K0, K0, K1);
|
||||
uasm_i_dsrl32(&p, K1, K0, 62 - 32);
|
||||
uasm_i_dsrl(&p, K0, K0, 12 + 1);
|
||||
uasm_i_dsll32(&p, K0, K0, 64 + 12 + 1 - segbits - 32);
|
||||
uasm_i_dsrl_safe(&p, K1, K0, 62);
|
||||
uasm_i_dsrl_safe(&p, K0, K0, 12 + 1);
|
||||
uasm_i_dsll_safe(&p, K0, K0, 64 + 12 + 1 - segbits);
|
||||
uasm_i_or(&p, K0, K0, K1);
|
||||
uasm_il_bnez(&p, &r, K0, label_leave);
|
||||
/* No need for uasm_i_nop */
|
||||
@ -825,7 +892,7 @@ static void __cpuinit build_r4000_tlb_refill_handler(void)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
build_get_pgd_vmalloc64(&p, &l, &r, K0, K1);
|
||||
build_get_pgd_vmalloc64(&p, &l, &r, K0, K1, refill);
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -934,15 +1001,6 @@ static void __cpuinit build_r4000_tlb_refill_handler(void)
|
||||
dump_handler((u32 *)ebase, 64);
|
||||
}
|
||||
|
||||
/*
|
||||
* TLB load/store/modify handlers.
|
||||
*
|
||||
* Only the fastpath gets synthesized at runtime, the slowpath for
|
||||
* do_page_fault remains normal asm.
|
||||
*/
|
||||
extern void tlb_do_page_fault_0(void);
|
||||
extern void tlb_do_page_fault_1(void);
|
||||
|
||||
/*
|
||||
* 128 instructions for the fastpath handler is generous and should
|
||||
* never be exceeded.
|
||||
@ -1302,7 +1360,7 @@ build_r4000_tlbchange_handler_tail(u32 **p, struct uasm_label **l,
|
||||
uasm_i_eret(p); /* return from trap */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
build_get_pgd_vmalloc64(p, l, r, tmp, ptr);
|
||||
build_get_pgd_vmalloc64(p, l, r, tmp, ptr, not_refill);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1322,9 +1380,9 @@ static void __cpuinit build_r4000_tlb_load_handler(void)
|
||||
uasm_i_dmfc0(&p, K0, C0_BADVADDR);
|
||||
uasm_i_dmfc0(&p, K1, C0_ENTRYHI);
|
||||
uasm_i_xor(&p, K0, K0, K1);
|
||||
uasm_i_dsrl32(&p, K1, K0, 62 - 32);
|
||||
uasm_i_dsrl(&p, K0, K0, 12 + 1);
|
||||
uasm_i_dsll32(&p, K0, K0, 64 + 12 + 1 - segbits - 32);
|
||||
uasm_i_dsrl_safe(&p, K1, K0, 62);
|
||||
uasm_i_dsrl_safe(&p, K0, K0, 12 + 1);
|
||||
uasm_i_dsll_safe(&p, K0, K0, 64 + 12 + 1 - segbits);
|
||||
uasm_i_or(&p, K0, K0, K1);
|
||||
uasm_il_bnez(&p, &r, K0, label_leave);
|
||||
/* No need for uasm_i_nop */
|
||||
@ -1526,6 +1584,10 @@ void __cpuinit build_tlb_refill_handler(void)
|
||||
*/
|
||||
static int run_once = 0;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
check_for_high_segbits = current_cpu_data.vmbits > (PGDIR_SHIFT + PGD_ORDER + PAGE_SHIFT - 3);
|
||||
#endif
|
||||
|
||||
switch (current_cpu_type()) {
|
||||
case CPU_R2000:
|
||||
case CPU_R3000:
|
||||
|
@ -20,6 +20,8 @@
|
||||
* Reset the PNX8550 board.
|
||||
*
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/reboot.h>
|
||||
#include <glb.h>
|
||||
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/vt.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
@ -254,7 +255,7 @@ static int __init sb1250_pcibios_init(void)
|
||||
* XXX ehs: Should this happen in PCI Device mode?
|
||||
*/
|
||||
io_map_base = ioremap(A_PHYS_LDTPCI_IO_MATCH_BYTES, 1024 * 1024);
|
||||
sb1250_controller.io_map_base = io_map_base;
|
||||
sb1250_controller.io_map_base = (unsigned long)io_map_base;
|
||||
set_io_port_base((unsigned long)io_map_base);
|
||||
|
||||
#ifdef CONFIG_SIBYTE_HAS_LDT
|
||||
|
@ -89,7 +89,7 @@ static void print_buserr(void)
|
||||
void ip22_be_interrupt(int irq)
|
||||
{
|
||||
const int field = 2 * sizeof(unsigned long);
|
||||
const struct pt_regs *regs = get_irq_regs();
|
||||
struct pt_regs *regs = get_irq_regs();
|
||||
|
||||
save_and_clear_buserr();
|
||||
print_buserr();
|
||||
|
@ -453,7 +453,7 @@ static int ip28_be_interrupt(const struct pt_regs *regs)
|
||||
|
||||
void ip22_be_interrupt(int irq)
|
||||
{
|
||||
const struct pt_regs *regs = get_irq_regs();
|
||||
struct pt_regs *regs = get_irq_regs();
|
||||
|
||||
count_be_interrupt++;
|
||||
|
||||
|
@ -145,15 +145,14 @@ void __init plat_mem_setup(void)
|
||||
|
||||
#ifdef CONFIG_VT
|
||||
screen_info = (struct screen_info) {
|
||||
0, 0, /* orig-x, orig-y */
|
||||
0, /* unused */
|
||||
52, /* orig_video_page */
|
||||
3, /* orig_video_mode */
|
||||
80, /* orig_video_cols */
|
||||
4626, 3, 9, /* unused, ega_bx, unused */
|
||||
25, /* orig_video_lines */
|
||||
0x22, /* orig_video_isVGA */
|
||||
16 /* orig_video_points */
|
||||
.orig_video_page = 52,
|
||||
.orig_video_mode = 3,
|
||||
.orig_video_cols = 80,
|
||||
.flags = 12,
|
||||
.orig_video_ega_bx = 3,
|
||||
.orig_video_lines = 25,
|
||||
.orig_video_isVGA = 0x22,
|
||||
.orig_video_points = 16,
|
||||
};
|
||||
/* XXXKW for CFE, get lines/cols from environment */
|
||||
#endif
|
||||
|
@ -347,6 +347,7 @@ extern void __iomem *early_ioremap(resource_size_t phys_addr,
|
||||
extern void __iomem *early_memremap(resource_size_t phys_addr,
|
||||
unsigned long size);
|
||||
extern void early_iounmap(void __iomem *addr, unsigned long size);
|
||||
extern void fixup_early_ioremap(void);
|
||||
|
||||
#define IO_SPACE_LIMIT 0xffff
|
||||
|
||||
|
@ -2545,6 +2545,9 @@ void irq_force_complete_move(int irq)
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
struct irq_cfg *cfg = desc->chip_data;
|
||||
|
||||
if (!cfg)
|
||||
return;
|
||||
|
||||
__irq_complete_move(&desc, cfg->vector);
|
||||
}
|
||||
#else
|
||||
|
@ -929,7 +929,8 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data,
|
||||
powernow_table[i].index = index;
|
||||
|
||||
/* Frequency may be rounded for these */
|
||||
if (boot_cpu_data.x86 == 0x10 || boot_cpu_data.x86 == 0x11) {
|
||||
if ((boot_cpu_data.x86 == 0x10 && boot_cpu_data.x86_model < 10)
|
||||
|| boot_cpu_data.x86 == 0x11) {
|
||||
powernow_table[i].frequency =
|
||||
freq_from_fid_did(lo & 0x3f, (lo >> 6) & 7);
|
||||
} else
|
||||
|
@ -60,7 +60,7 @@ ENTRY(call_rwsem_down_write_failed)
|
||||
ENDPROC(call_rwsem_down_write_failed)
|
||||
|
||||
ENTRY(call_rwsem_wake)
|
||||
decw %dx /* do nothing if still outstanding active readers */
|
||||
decl %edx /* do nothing if still outstanding active readers */
|
||||
jnz 1f
|
||||
save_common_regs
|
||||
movq %rax,%rdi
|
||||
|
@ -448,6 +448,20 @@ static inline void __init early_clear_fixmap(enum fixed_addresses idx)
|
||||
static void __iomem *prev_map[FIX_BTMAPS_SLOTS] __initdata;
|
||||
static unsigned long prev_size[FIX_BTMAPS_SLOTS] __initdata;
|
||||
|
||||
void __init fixup_early_ioremap(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < FIX_BTMAPS_SLOTS; i++) {
|
||||
if (prev_map[i]) {
|
||||
WARN_ON(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
early_ioremap_init();
|
||||
}
|
||||
|
||||
static int __init check_early_ioremap_leak(void)
|
||||
{
|
||||
int count = 0;
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <asm/e820.h>
|
||||
#include <asm/tlb.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
unsigned int __VMALLOC_RESERVE = 128 << 20;
|
||||
|
||||
@ -128,6 +129,7 @@ static int __init parse_reservetop(char *arg)
|
||||
|
||||
address = memparse(arg, &arg);
|
||||
reserve_top_address(address);
|
||||
fixup_early_ioremap();
|
||||
return 0;
|
||||
}
|
||||
early_param("reservetop", parse_reservetop);
|
||||
|
@ -324,6 +324,7 @@ struct dma_async_tx_descriptor *
|
||||
async_raid6_2data_recov(int disks, size_t bytes, int faila, int failb,
|
||||
struct page **blocks, struct async_submit_ctl *submit)
|
||||
{
|
||||
void *scribble = submit->scribble;
|
||||
int non_zero_srcs, i;
|
||||
|
||||
BUG_ON(faila == failb);
|
||||
@ -332,11 +333,13 @@ async_raid6_2data_recov(int disks, size_t bytes, int faila, int failb,
|
||||
|
||||
pr_debug("%s: disks: %d len: %zu\n", __func__, disks, bytes);
|
||||
|
||||
/* we need to preserve the contents of 'blocks' for the async
|
||||
* case, so punt to synchronous if a scribble buffer is not available
|
||||
/* if a dma resource is not available or a scribble buffer is not
|
||||
* available punt to the synchronous path. In the 'dma not
|
||||
* available' case be sure to use the scribble buffer to
|
||||
* preserve the content of 'blocks' as the caller intended.
|
||||
*/
|
||||
if (!submit->scribble) {
|
||||
void **ptrs = (void **) blocks;
|
||||
if (!async_dma_find_channel(DMA_PQ) || !scribble) {
|
||||
void **ptrs = scribble ? scribble : (void **) blocks;
|
||||
|
||||
async_tx_quiesce(&submit->depend_tx);
|
||||
for (i = 0; i < disks; i++)
|
||||
@ -406,11 +409,13 @@ async_raid6_datap_recov(int disks, size_t bytes, int faila,
|
||||
|
||||
pr_debug("%s: disks: %d len: %zu\n", __func__, disks, bytes);
|
||||
|
||||
/* we need to preserve the contents of 'blocks' for the async
|
||||
* case, so punt to synchronous if a scribble buffer is not available
|
||||
/* if a dma resource is not available or a scribble buffer is not
|
||||
* available punt to the synchronous path. In the 'dma not
|
||||
* available' case be sure to use the scribble buffer to
|
||||
* preserve the content of 'blocks' as the caller intended.
|
||||
*/
|
||||
if (!scribble) {
|
||||
void **ptrs = (void **) blocks;
|
||||
if (!async_dma_find_channel(DMA_PQ) || !scribble) {
|
||||
void **ptrs = scribble ? scribble : (void **) blocks;
|
||||
|
||||
async_tx_quiesce(&submit->depend_tx);
|
||||
for (i = 0; i < disks; i++)
|
||||
|
@ -424,7 +424,7 @@ static struct pcmcia_device_id pcmcia_devices[] = {
|
||||
PCMCIA_DEVICE_PROD_ID12("Hyperstone", "Model1", 0x3d5b9ef5, 0xca6ab420),
|
||||
PCMCIA_DEVICE_PROD_ID12("IBM", "microdrive", 0xb569a6e5, 0xa6d76178),
|
||||
PCMCIA_DEVICE_PROD_ID12("IBM", "IBM17JSSFP20", 0xb569a6e5, 0xf2508753),
|
||||
PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF CARD 1GB", 0x2e6d1829, 0x3e520e17),
|
||||
PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF CARD 1GB", 0x2e6d1829, 0x55d5bffb),
|
||||
PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF CARD 4GB", 0x2e6d1829, 0x531e7d10),
|
||||
PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF8GB", 0x2e6d1829, 0xacbe682e),
|
||||
PCMCIA_DEVICE_PROD_ID12("IO DATA", "CBIDE2 ", 0x547e66dc, 0x8671043b),
|
||||
@ -446,7 +446,7 @@ static struct pcmcia_device_id pcmcia_devices[] = {
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS1GCF80", 0x709b1bf1, 0x2a54d4b1),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS2GCF120", 0x709b1bf1, 0x969aa4f2),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF120", 0x709b1bf1, 0xf54a91c8),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF133", 0x709b1bf1, 0x9351e59d),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF133", 0x709b1bf1, 0x7558f133),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS8GCF133", 0x709b1bf1, 0xb2f89b47),
|
||||
PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
|
||||
PCMCIA_DEVICE_PROD_ID12("WEIDA", "TWTTI", 0xcc7cf69c, 0x212bb918),
|
||||
|
@ -879,8 +879,8 @@ static int isicom_open(struct tty_struct *tty, struct file *filp)
|
||||
if (tport == NULL)
|
||||
return -ENODEV;
|
||||
port = container_of(tport, struct isi_port, port);
|
||||
card = &isi_card[BOARD(tty->index)];
|
||||
|
||||
tty->driver_data = port;
|
||||
return tty_port_open(tport, tty, filp);
|
||||
}
|
||||
|
||||
@ -936,7 +936,12 @@ static void isicom_shutdown(struct tty_port *port)
|
||||
static void isicom_close(struct tty_struct *tty, struct file *filp)
|
||||
{
|
||||
struct isi_port *ip = tty->driver_data;
|
||||
struct tty_port *port = &ip->port;
|
||||
struct tty_port *port;
|
||||
|
||||
if (ip == NULL)
|
||||
return;
|
||||
|
||||
port = &ip->port;
|
||||
if (isicom_paranoia_check(ip, tty->name, "isicom_close"))
|
||||
return;
|
||||
tty_port_close(port, tty, filp);
|
||||
|
@ -827,6 +827,8 @@ static int stli_open(struct tty_struct *tty, struct file *filp)
|
||||
return -ENODEV;
|
||||
if (portp->devnr < 1)
|
||||
return -ENODEV;
|
||||
|
||||
tty->driver_data = portp;
|
||||
return tty_port_open(&portp->port, tty, filp);
|
||||
}
|
||||
|
||||
|
@ -1011,6 +1011,7 @@ static int mxser_open(struct tty_struct *tty, struct file *filp)
|
||||
if (!info->ioaddr)
|
||||
return -ENODEV;
|
||||
|
||||
tty->driver_data = info;
|
||||
return tty_port_open(&info->port, tty, filp);
|
||||
}
|
||||
|
||||
@ -1074,7 +1075,7 @@ static void mxser_close(struct tty_struct *tty, struct file *filp)
|
||||
struct mxser_port *info = tty->driver_data;
|
||||
struct tty_port *port = &info->port;
|
||||
|
||||
if (tty->index == MXSER_PORTS)
|
||||
if (tty->index == MXSER_PORTS || info == NULL)
|
||||
return;
|
||||
if (tty_port_close_start(port, tty, filp) == 0)
|
||||
return;
|
||||
|
@ -909,6 +909,7 @@ static int rc_open(struct tty_struct *tty, struct file *filp)
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
tty->driver_data = port;
|
||||
return tty_port_open(&port->port, tty, filp);
|
||||
}
|
||||
|
||||
|
@ -724,7 +724,6 @@ static int stl_open(struct tty_struct *tty, struct file *filp)
|
||||
{
|
||||
struct stlport *portp;
|
||||
struct stlbrd *brdp;
|
||||
struct tty_port *port;
|
||||
unsigned int minordev, brdnr, panelnr;
|
||||
int portnr;
|
||||
|
||||
@ -754,7 +753,8 @@ static int stl_open(struct tty_struct *tty, struct file *filp)
|
||||
portp = brdp->panels[panelnr]->ports[portnr];
|
||||
if (portp == NULL)
|
||||
return -ENODEV;
|
||||
port = &portp->port;
|
||||
|
||||
tty->driver_data = portp;
|
||||
return tty_port_open(&portp->port, tty, filp);
|
||||
|
||||
}
|
||||
@ -841,7 +841,8 @@ static void stl_close(struct tty_struct *tty, struct file *filp)
|
||||
pr_debug("stl_close(tty=%p,filp=%p)\n", tty, filp);
|
||||
|
||||
portp = tty->driver_data;
|
||||
BUG_ON(portp == NULL);
|
||||
if(portp == NULL)
|
||||
return;
|
||||
tty_port_close(&portp->port, tty, filp);
|
||||
}
|
||||
|
||||
|
@ -1359,3 +1359,5 @@ module_exit(txx9dmac_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("TXx9 DMA Controller driver");
|
||||
MODULE_AUTHOR("Atsushi Nemoto <anemo@mba.ocn.ne.jp>");
|
||||
MODULE_ALIAS("platform:txx9dmac");
|
||||
MODULE_ALIAS("platform:txx9dmac-chan");
|
||||
|
@ -294,7 +294,6 @@ static void amd_decode_ls_mce(u64 mc3_status)
|
||||
void amd_decode_nb_mce(int node_id, struct err_regs *regs, int handle_errors)
|
||||
{
|
||||
u32 ec = ERROR_CODE(regs->nbsl);
|
||||
u32 xec = EXT_ERROR_CODE(regs->nbsl);
|
||||
|
||||
if (!handle_errors)
|
||||
return;
|
||||
@ -324,7 +323,7 @@ void amd_decode_nb_mce(int node_id, struct err_regs *regs, int handle_errors)
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
||||
pr_emerg("%s.\n", EXT_ERR_MSG(xec));
|
||||
pr_emerg("%s.\n", EXT_ERR_MSG(regs->nbsl));
|
||||
|
||||
if (BUS_ERROR(ec) && nb_bus_decoder)
|
||||
nb_bus_decoder(node_id, regs);
|
||||
@ -374,7 +373,7 @@ static int amd_decode_mce(struct notifier_block *nb, unsigned long val,
|
||||
((m->status & MCI_STATUS_PCC) ? "yes" : "no"));
|
||||
|
||||
/* do the two bits[14:13] together */
|
||||
ecc = m->status & (3ULL << 45);
|
||||
ecc = (m->status >> 45) & 0x3;
|
||||
if (ecc)
|
||||
pr_cont(", %sECC Error", ((ecc == 2) ? "C" : "U"));
|
||||
|
||||
|
@ -416,7 +416,8 @@ static int gpio_setup_irq(struct gpio_desc *desc, struct device *dev,
|
||||
return 0;
|
||||
|
||||
free_sd:
|
||||
sysfs_put(pdesc->value_sd);
|
||||
if (pdesc)
|
||||
sysfs_put(pdesc->value_sd);
|
||||
free_id:
|
||||
idr_remove(&pdesc_idr, id);
|
||||
desc->flags &= GPIO_FLAGS_MASK;
|
||||
|
@ -77,7 +77,7 @@ static void *agp_remap(unsigned long offset, unsigned long size,
|
||||
&& (agpmem->bound + (agpmem->pages << PAGE_SHIFT)) >=
|
||||
(offset + size))
|
||||
break;
|
||||
if (!agpmem)
|
||||
if (&agpmem->head == &dev->agp->memory)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
|
@ -354,7 +354,10 @@ static struct bin_attribute edid_attr = {
|
||||
int drm_sysfs_connector_add(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
int ret = 0, i, j;
|
||||
int attr_cnt = 0;
|
||||
int opt_cnt = 0;
|
||||
int i;
|
||||
int ret = 0;
|
||||
|
||||
/* We shouldn't get called more than once for the same connector */
|
||||
BUG_ON(device_is_registered(&connector->kdev));
|
||||
@ -377,8 +380,8 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
|
||||
|
||||
/* Standard attributes */
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(connector_attrs); i++) {
|
||||
ret = device_create_file(&connector->kdev, &connector_attrs[i]);
|
||||
for (attr_cnt = 0; attr_cnt < ARRAY_SIZE(connector_attrs); attr_cnt++) {
|
||||
ret = device_create_file(&connector->kdev, &connector_attrs[attr_cnt]);
|
||||
if (ret)
|
||||
goto err_out_files;
|
||||
}
|
||||
@ -394,8 +397,8 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
|
||||
case DRM_MODE_CONNECTOR_SVIDEO:
|
||||
case DRM_MODE_CONNECTOR_Component:
|
||||
case DRM_MODE_CONNECTOR_TV:
|
||||
for (i = 0; i < ARRAY_SIZE(connector_attrs_opt1); i++) {
|
||||
ret = device_create_file(&connector->kdev, &connector_attrs_opt1[i]);
|
||||
for (opt_cnt = 0; opt_cnt < ARRAY_SIZE(connector_attrs_opt1); opt_cnt++) {
|
||||
ret = device_create_file(&connector->kdev, &connector_attrs_opt1[opt_cnt]);
|
||||
if (ret)
|
||||
goto err_out_files;
|
||||
}
|
||||
@ -414,10 +417,10 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
|
||||
return 0;
|
||||
|
||||
err_out_files:
|
||||
if (i > 0)
|
||||
for (j = 0; j < i; j++)
|
||||
device_remove_file(&connector->kdev,
|
||||
&connector_attrs[i]);
|
||||
for (i = 0; i < opt_cnt; i++)
|
||||
device_remove_file(&connector->kdev, &connector_attrs_opt1[i]);
|
||||
for (i = 0; i < attr_cnt; i++)
|
||||
device_remove_file(&connector->kdev, &connector_attrs[i]);
|
||||
device_unregister(&connector->kdev);
|
||||
|
||||
out:
|
||||
|
@ -2912,7 +2912,7 @@ typedef struct _ATOM_ANALOG_TV_INFO_V1_2
|
||||
UCHAR ucTV_BootUpDefaultStandard;
|
||||
UCHAR ucExt_TV_ASIC_ID;
|
||||
UCHAR ucExt_TV_ASIC_SlaveAddr;
|
||||
ATOM_DTD_FORMAT aModeTimings[MAX_SUPPORTED_TV_TIMING];
|
||||
ATOM_DTD_FORMAT aModeTimings[MAX_SUPPORTED_TV_TIMING_V1_2];
|
||||
}ATOM_ANALOG_TV_INFO_V1_2;
|
||||
|
||||
typedef struct _ATOM_DPCD_INFO
|
||||
|
@ -2975,7 +2975,7 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
|
||||
|
||||
for (i = 0; i < track->num_cb; i++) {
|
||||
if (track->cb[i].robj == NULL) {
|
||||
if (!(track->fastfill || track->color_channel_mask ||
|
||||
if (!(track->zb_cb_clear || track->color_channel_mask ||
|
||||
track->blend_read_enable)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -75,7 +75,7 @@ struct r100_cs_track {
|
||||
struct r100_cs_track_texture textures[R300_TRACK_MAX_TEXTURE];
|
||||
bool z_enabled;
|
||||
bool separate_cube;
|
||||
bool fastfill;
|
||||
bool zb_cb_clear;
|
||||
bool blend_read_enable;
|
||||
};
|
||||
|
||||
|
@ -1044,7 +1044,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
break;
|
||||
case 0x4d1c:
|
||||
/* ZB_BW_CNTL */
|
||||
track->fastfill = !!(idx_value & (1 << 2));
|
||||
track->zb_cb_clear = !!(idx_value & (1 << 5));
|
||||
break;
|
||||
case 0x4e04:
|
||||
/* RB3D_BLENDCNTL */
|
||||
|
@ -134,12 +134,10 @@ int radeon_agp_init(struct radeon_device *rdev)
|
||||
int ret;
|
||||
|
||||
/* Acquire AGP. */
|
||||
if (!rdev->ddev->agp->acquired) {
|
||||
ret = drm_agp_acquire(rdev->ddev);
|
||||
if (ret) {
|
||||
DRM_ERROR("Unable to acquire AGP: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
ret = drm_agp_acquire(rdev->ddev);
|
||||
if (ret) {
|
||||
DRM_ERROR("Unable to acquire AGP: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = drm_agp_info(rdev->ddev, &info);
|
||||
|
@ -1264,7 +1264,7 @@ bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
|
||||
switch (crev) {
|
||||
case 1:
|
||||
tv_info = (ATOM_ANALOG_TV_INFO *)(mode_info->atom_context->bios + data_offset);
|
||||
if (index > MAX_SUPPORTED_TV_TIMING)
|
||||
if (index >= MAX_SUPPORTED_TV_TIMING)
|
||||
return false;
|
||||
|
||||
mode->crtc_htotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total);
|
||||
@ -1302,7 +1302,7 @@ bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
|
||||
break;
|
||||
case 2:
|
||||
tv_info_v1_2 = (ATOM_ANALOG_TV_INFO_V1_2 *)(mode_info->atom_context->bios + data_offset);
|
||||
if (index > MAX_SUPPORTED_TV_TIMING_V1_2)
|
||||
if (index >= MAX_SUPPORTED_TV_TIMING_V1_2)
|
||||
return false;
|
||||
|
||||
dtd_timings = &tv_info_v1_2->aModeTimings[index];
|
||||
|
@ -1316,6 +1316,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
|
||||
radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");
|
||||
if (!radeon_connector->ddc_bus)
|
||||
goto failed;
|
||||
}
|
||||
if (connector_type == DRM_MODE_CONNECTOR_DVII) {
|
||||
radeon_connector->dac_load_detect = true;
|
||||
drm_connector_attach_property(&radeon_connector->base,
|
||||
rdev->mode_info.load_detect_property,
|
||||
|
@ -254,6 +254,53 @@ radeon_get_atom_connector_priv_from_encoder(struct drm_encoder *encoder)
|
||||
return dig_connector;
|
||||
}
|
||||
|
||||
void radeon_panel_mode_fixup(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
{
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
|
||||
unsigned hblank = native_mode->htotal - native_mode->hdisplay;
|
||||
unsigned vblank = native_mode->vtotal - native_mode->vdisplay;
|
||||
unsigned hover = native_mode->hsync_start - native_mode->hdisplay;
|
||||
unsigned vover = native_mode->vsync_start - native_mode->vdisplay;
|
||||
unsigned hsync_width = native_mode->hsync_end - native_mode->hsync_start;
|
||||
unsigned vsync_width = native_mode->vsync_end - native_mode->vsync_start;
|
||||
|
||||
adjusted_mode->clock = native_mode->clock;
|
||||
adjusted_mode->flags = native_mode->flags;
|
||||
|
||||
if (ASIC_IS_AVIVO(rdev)) {
|
||||
adjusted_mode->hdisplay = native_mode->hdisplay;
|
||||
adjusted_mode->vdisplay = native_mode->vdisplay;
|
||||
}
|
||||
|
||||
adjusted_mode->htotal = native_mode->hdisplay + hblank;
|
||||
adjusted_mode->hsync_start = native_mode->hdisplay + hover;
|
||||
adjusted_mode->hsync_end = adjusted_mode->hsync_start + hsync_width;
|
||||
|
||||
adjusted_mode->vtotal = native_mode->vdisplay + vblank;
|
||||
adjusted_mode->vsync_start = native_mode->vdisplay + vover;
|
||||
adjusted_mode->vsync_end = adjusted_mode->vsync_start + vsync_width;
|
||||
|
||||
drm_mode_set_crtcinfo(adjusted_mode, CRTC_INTERLACE_HALVE_V);
|
||||
|
||||
if (ASIC_IS_AVIVO(rdev)) {
|
||||
adjusted_mode->crtc_hdisplay = native_mode->hdisplay;
|
||||
adjusted_mode->crtc_vdisplay = native_mode->vdisplay;
|
||||
}
|
||||
|
||||
adjusted_mode->crtc_htotal = adjusted_mode->crtc_hdisplay + hblank;
|
||||
adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hdisplay + hover;
|
||||
adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + hsync_width;
|
||||
|
||||
adjusted_mode->crtc_vtotal = adjusted_mode->crtc_vdisplay + vblank;
|
||||
adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + vover;
|
||||
adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + vsync_width;
|
||||
|
||||
}
|
||||
|
||||
static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
@ -275,18 +322,8 @@ static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
|
||||
adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
|
||||
|
||||
/* get the native mode for LVDS */
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) {
|
||||
struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
|
||||
int mode_id = adjusted_mode->base.id;
|
||||
*adjusted_mode = *native_mode;
|
||||
if (!ASIC_IS_AVIVO(rdev)) {
|
||||
adjusted_mode->hdisplay = mode->hdisplay;
|
||||
adjusted_mode->vdisplay = mode->vdisplay;
|
||||
adjusted_mode->crtc_hdisplay = mode->hdisplay;
|
||||
adjusted_mode->crtc_vdisplay = mode->vdisplay;
|
||||
}
|
||||
adjusted_mode->base.id = mode_id;
|
||||
}
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
|
||||
radeon_panel_mode_fixup(encoder, adjusted_mode);
|
||||
|
||||
/* get the native mode for TV */
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) {
|
||||
|
@ -228,16 +228,8 @@ static bool radeon_legacy_mode_fixup(struct drm_encoder *encoder,
|
||||
drm_mode_set_crtcinfo(adjusted_mode, 0);
|
||||
|
||||
/* get the native mode for LVDS */
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) {
|
||||
struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
|
||||
int mode_id = adjusted_mode->base.id;
|
||||
*adjusted_mode = *native_mode;
|
||||
adjusted_mode->hdisplay = mode->hdisplay;
|
||||
adjusted_mode->vdisplay = mode->vdisplay;
|
||||
adjusted_mode->crtc_hdisplay = mode->hdisplay;
|
||||
adjusted_mode->crtc_vdisplay = mode->vdisplay;
|
||||
adjusted_mode->base.id = mode_id;
|
||||
}
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
|
||||
radeon_panel_mode_fixup(encoder, adjusted_mode);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -558,6 +558,8 @@ extern int radeon_static_clocks_init(struct drm_device *dev);
|
||||
bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
|
||||
struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode);
|
||||
void radeon_panel_mode_fixup(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *adjusted_mode);
|
||||
void atom_rv515_force_tv_scaler(struct radeon_device *rdev, struct radeon_crtc *radeon_crtc);
|
||||
|
||||
/* legacy tv */
|
||||
|
@ -75,7 +75,7 @@ int via_decoder_futex(struct drm_device *dev, void *data, struct drm_file *file_
|
||||
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
if (fx->lock > VIA_NR_XVMC_LOCKS)
|
||||
if (fx->lock >= VIA_NR_XVMC_LOCKS)
|
||||
return -EFAULT;
|
||||
|
||||
lock = (volatile int *)XVMCLOCKPTR(sAPriv, fx->lock);
|
||||
|
@ -276,8 +276,10 @@ vga_switcheroo_debugfs_write(struct file *filp, const char __user *ubuf,
|
||||
|
||||
mutex_lock(&vgasr_mutex);
|
||||
|
||||
if (!vgasr_priv.active)
|
||||
return -EINVAL;
|
||||
if (!vgasr_priv.active) {
|
||||
cnt = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* pwr off the device not in use */
|
||||
if (strncmp(usercmd, "OFF", 3) == 0) {
|
||||
|
@ -447,7 +447,7 @@ static struct i2c_adapter octeon_i2c_ops = {
|
||||
/**
|
||||
* octeon_i2c_setclock - Calculate and set clock divisors.
|
||||
*/
|
||||
static int __init octeon_i2c_setclock(struct octeon_i2c *i2c)
|
||||
static int __devinit octeon_i2c_setclock(struct octeon_i2c *i2c)
|
||||
{
|
||||
int tclk, thp_base, inc, thp_idx, mdiv_idx, ndiv_idx, foscl, diff;
|
||||
int thp = 0x18, mdiv = 2, ndiv = 0, delta_hz = 1000000;
|
||||
@ -490,7 +490,7 @@ static int __init octeon_i2c_setclock(struct octeon_i2c *i2c)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init octeon_i2c_initlowlevel(struct octeon_i2c *i2c)
|
||||
static int __devinit octeon_i2c_initlowlevel(struct octeon_i2c *i2c)
|
||||
{
|
||||
u8 status;
|
||||
int tries;
|
||||
|
@ -40,12 +40,11 @@
|
||||
#include "i2c-core.h"
|
||||
|
||||
|
||||
/* core_lock protects i2c_adapter_idr, userspace_devices, and guarantees
|
||||
/* core_lock protects i2c_adapter_idr, and guarantees
|
||||
that device detection, deletion of detected devices, and attach_adapter
|
||||
and detach_adapter calls are serialized */
|
||||
static DEFINE_MUTEX(core_lock);
|
||||
static DEFINE_IDR(i2c_adapter_idr);
|
||||
static LIST_HEAD(userspace_devices);
|
||||
|
||||
static struct device_type i2c_client_type;
|
||||
static int i2c_check_addr(struct i2c_adapter *adapter, int addr);
|
||||
@ -117,8 +116,10 @@ static int i2c_device_probe(struct device *dev)
|
||||
dev_dbg(dev, "probe\n");
|
||||
|
||||
status = driver->probe(client, i2c_match_id(driver->id_table, client));
|
||||
if (status)
|
||||
if (status) {
|
||||
client->driver = NULL;
|
||||
i2c_set_clientdata(client, NULL);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -139,8 +140,10 @@ static int i2c_device_remove(struct device *dev)
|
||||
dev->driver = NULL;
|
||||
status = 0;
|
||||
}
|
||||
if (status == 0)
|
||||
if (status == 0) {
|
||||
client->driver = NULL;
|
||||
i2c_set_clientdata(client, NULL);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -538,9 +541,9 @@ i2c_sysfs_new_device(struct device *dev, struct device_attribute *attr,
|
||||
return -EEXIST;
|
||||
|
||||
/* Keep track of the added device */
|
||||
mutex_lock(&core_lock);
|
||||
list_add_tail(&client->detected, &userspace_devices);
|
||||
mutex_unlock(&core_lock);
|
||||
i2c_lock_adapter(adap);
|
||||
list_add_tail(&client->detected, &adap->userspace_clients);
|
||||
i2c_unlock_adapter(adap);
|
||||
dev_info(dev, "%s: Instantiated device %s at 0x%02hx\n", "new_device",
|
||||
info.type, info.addr);
|
||||
|
||||
@ -579,9 +582,10 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr,
|
||||
|
||||
/* Make sure the device was added through sysfs */
|
||||
res = -ENOENT;
|
||||
mutex_lock(&core_lock);
|
||||
list_for_each_entry_safe(client, next, &userspace_devices, detected) {
|
||||
if (client->addr == addr && client->adapter == adap) {
|
||||
i2c_lock_adapter(adap);
|
||||
list_for_each_entry_safe(client, next, &adap->userspace_clients,
|
||||
detected) {
|
||||
if (client->addr == addr) {
|
||||
dev_info(dev, "%s: Deleting device %s at 0x%02hx\n",
|
||||
"delete_device", client->name, client->addr);
|
||||
|
||||
@ -591,7 +595,7 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr,
|
||||
break;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&core_lock);
|
||||
i2c_unlock_adapter(adap);
|
||||
|
||||
if (res < 0)
|
||||
dev_err(dev, "%s: Can't find device in list\n",
|
||||
@ -673,6 +677,7 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
|
||||
}
|
||||
|
||||
rt_mutex_init(&adap->bus_lock);
|
||||
INIT_LIST_HEAD(&adap->userspace_clients);
|
||||
|
||||
/* Set default timeout to 1 second if not already set */
|
||||
if (adap->timeout == 0)
|
||||
@ -875,14 +880,15 @@ int i2c_del_adapter(struct i2c_adapter *adap)
|
||||
return res;
|
||||
|
||||
/* Remove devices instantiated from sysfs */
|
||||
list_for_each_entry_safe(client, next, &userspace_devices, detected) {
|
||||
if (client->adapter == adap) {
|
||||
dev_dbg(&adap->dev, "Removing %s at 0x%x\n",
|
||||
client->name, client->addr);
|
||||
list_del(&client->detected);
|
||||
i2c_unregister_device(client);
|
||||
}
|
||||
i2c_lock_adapter(adap);
|
||||
list_for_each_entry_safe(client, next, &adap->userspace_clients,
|
||||
detected) {
|
||||
dev_dbg(&adap->dev, "Removing %s at 0x%x\n", client->name,
|
||||
client->addr);
|
||||
list_del(&client->detected);
|
||||
i2c_unregister_device(client);
|
||||
}
|
||||
i2c_unlock_adapter(adap);
|
||||
|
||||
/* Detach any active clients. This can't fail, thus we do not
|
||||
checking the returned value. */
|
||||
@ -1260,12 +1266,23 @@ static int i2c_detect_address(struct i2c_client *temp_client,
|
||||
return 0;
|
||||
|
||||
/* Make sure there is something at this address */
|
||||
if (i2c_smbus_xfer(adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL) < 0)
|
||||
return 0;
|
||||
if (addr == 0x73 && (adapter->class & I2C_CLASS_HWMON)) {
|
||||
/* Special probe for FSC hwmon chips */
|
||||
union i2c_smbus_data dummy;
|
||||
|
||||
/* Prevent 24RF08 corruption */
|
||||
if ((addr & ~0x0f) == 0x50)
|
||||
i2c_smbus_xfer(adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL);
|
||||
if (i2c_smbus_xfer(adapter, addr, 0, I2C_SMBUS_READ, 0,
|
||||
I2C_SMBUS_BYTE_DATA, &dummy) < 0)
|
||||
return 0;
|
||||
} else {
|
||||
if (i2c_smbus_xfer(adapter, addr, 0, I2C_SMBUS_WRITE, 0,
|
||||
I2C_SMBUS_QUICK, NULL) < 0)
|
||||
return 0;
|
||||
|
||||
/* Prevent 24RF08 corruption */
|
||||
if ((addr & ~0x0f) == 0x50)
|
||||
i2c_smbus_xfer(adapter, addr, 0, I2C_SMBUS_WRITE, 0,
|
||||
I2C_SMBUS_QUICK, NULL);
|
||||
}
|
||||
|
||||
/* Finally call the custom detection function */
|
||||
memset(&info, 0, sizeof(struct i2c_board_info));
|
||||
|
@ -409,7 +409,7 @@ static struct pcmcia_device_id ide_ids[] = {
|
||||
PCMCIA_DEVICE_PROD_ID12("Hyperstone", "Model1", 0x3d5b9ef5, 0xca6ab420),
|
||||
PCMCIA_DEVICE_PROD_ID12("IBM", "microdrive", 0xb569a6e5, 0xa6d76178),
|
||||
PCMCIA_DEVICE_PROD_ID12("IBM", "IBM17JSSFP20", 0xb569a6e5, 0xf2508753),
|
||||
PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF CARD 1GB", 0x2e6d1829, 0x3e520e17),
|
||||
PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF CARD 1GB", 0x2e6d1829, 0x55d5bffb),
|
||||
PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF CARD 4GB", 0x2e6d1829, 0x531e7d10),
|
||||
PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF8GB", 0x2e6d1829, 0xacbe682e),
|
||||
PCMCIA_DEVICE_PROD_ID12("IO DATA", "CBIDE2 ", 0x547e66dc, 0x8671043b),
|
||||
@ -431,7 +431,7 @@ static struct pcmcia_device_id ide_ids[] = {
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS1GCF80", 0x709b1bf1, 0x2a54d4b1),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS2GCF120", 0x709b1bf1, 0x969aa4f2),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF120", 0x709b1bf1, 0xf54a91c8),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF133", 0x709b1bf1, 0x9351e59d),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF133", 0x709b1bf1, 0x7558f133),
|
||||
PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS8GCF133", 0x709b1bf1, 0xb2f89b47),
|
||||
PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
|
||||
PCMCIA_DEVICE_PROD_ID12("WEIDA", "TWTTI", 0xcc7cf69c, 0x212bb918),
|
||||
|
@ -929,6 +929,24 @@ static const struct input_device_id joydev_ids[] = {
|
||||
.evbit = { BIT_MASK(EV_ABS) },
|
||||
.absbit = { BIT_MASK(ABS_THROTTLE) },
|
||||
},
|
||||
{
|
||||
.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
|
||||
INPUT_DEVICE_ID_MATCH_KEYBIT,
|
||||
.evbit = { BIT_MASK(EV_KEY) },
|
||||
.keybit = {[BIT_WORD(BTN_JOYSTICK)] = BIT_MASK(BTN_JOYSTICK) },
|
||||
},
|
||||
{
|
||||
.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
|
||||
INPUT_DEVICE_ID_MATCH_KEYBIT,
|
||||
.evbit = { BIT_MASK(EV_KEY) },
|
||||
.keybit = { [BIT_WORD(BTN_GAMEPAD)] = BIT_MASK(BTN_GAMEPAD) },
|
||||
},
|
||||
{
|
||||
.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
|
||||
INPUT_DEVICE_ID_MATCH_KEYBIT,
|
||||
.evbit = { BIT_MASK(EV_KEY) },
|
||||
.keybit = { [BIT_WORD(BTN_TRIGGER_HAPPY)] = BIT_MASK(BTN_TRIGGER_HAPPY) },
|
||||
},
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
@ -98,10 +98,12 @@
|
||||
* Module and Version Information, Module Parameters
|
||||
*/
|
||||
|
||||
#define ATI_REMOTE_VENDOR_ID 0x0bc7
|
||||
#define ATI_REMOTE_PRODUCT_ID 0x004
|
||||
#define LOLA_REMOTE_PRODUCT_ID 0x002
|
||||
#define MEDION_REMOTE_PRODUCT_ID 0x006
|
||||
#define ATI_REMOTE_VENDOR_ID 0x0bc7
|
||||
#define LOLA_REMOTE_PRODUCT_ID 0x0002
|
||||
#define LOLA2_REMOTE_PRODUCT_ID 0x0003
|
||||
#define ATI_REMOTE_PRODUCT_ID 0x0004
|
||||
#define NVIDIA_REMOTE_PRODUCT_ID 0x0005
|
||||
#define MEDION_REMOTE_PRODUCT_ID 0x0006
|
||||
|
||||
#define DRIVER_VERSION "2.2.1"
|
||||
#define DRIVER_AUTHOR "Torrey Hoffman <thoffman@arnor.net>"
|
||||
@ -142,8 +144,10 @@ MODULE_PARM_DESC(repeat_delay, "Delay before sending repeats, default = 500 msec
|
||||
#define err(format, arg...) printk(KERN_ERR format , ## arg)
|
||||
|
||||
static struct usb_device_id ati_remote_table[] = {
|
||||
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, ATI_REMOTE_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA_REMOTE_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA2_REMOTE_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, ATI_REMOTE_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, NVIDIA_REMOTE_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ATI_REMOTE_VENDOR_ID, MEDION_REMOTE_PRODUCT_ID) },
|
||||
{} /* Terminating entry */
|
||||
};
|
||||
|
@ -64,7 +64,6 @@ static const struct alps_model_info alps_model_data[] = {
|
||||
{ { 0x62, 0x02, 0x14 }, 0xcf, 0xcf,
|
||||
ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED },
|
||||
{ { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FOUR_BUTTONS }, /* Dell Vostro 1400 */
|
||||
{ { 0x73, 0x02, 0x64 }, 0xf8, 0xf8, 0 }, /* HP Pavilion dm3 */
|
||||
{ { 0x52, 0x01, 0x14 }, 0xff, 0xff,
|
||||
ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, /* Toshiba Tecra A11-11L */
|
||||
};
|
||||
|
@ -25,6 +25,10 @@
|
||||
printk(KERN_DEBUG format, ##arg); \
|
||||
} while (0)
|
||||
|
||||
static bool force_elantech;
|
||||
module_param_named(force_elantech, force_elantech, bool, 0644);
|
||||
MODULE_PARM_DESC(force_elantech, "Force the Elantech PS/2 protocol extension to be used, 1 = enabled, 0 = disabled (default).");
|
||||
|
||||
/*
|
||||
* Send a Synaptics style sliced query command
|
||||
*/
|
||||
@ -182,13 +186,17 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse)
|
||||
static int old_fingers;
|
||||
|
||||
if (etd->fw_version_maj == 0x01) {
|
||||
/* byte 0: D U p1 p2 1 p3 R L
|
||||
byte 1: f 0 th tw x9 x8 y9 y8 */
|
||||
/*
|
||||
* byte 0: D U p1 p2 1 p3 R L
|
||||
* byte 1: f 0 th tw x9 x8 y9 y8
|
||||
*/
|
||||
fingers = ((packet[1] & 0x80) >> 7) +
|
||||
((packet[1] & 0x30) >> 4);
|
||||
} else {
|
||||
/* byte 0: n1 n0 p2 p1 1 p3 R L
|
||||
byte 1: 0 0 0 0 x9 x8 y9 y8 */
|
||||
/*
|
||||
* byte 0: n1 n0 p2 p1 1 p3 R L
|
||||
* byte 1: 0 0 0 0 x9 x8 y9 y8
|
||||
*/
|
||||
fingers = (packet[0] & 0xc0) >> 6;
|
||||
}
|
||||
|
||||
@ -202,13 +210,15 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse)
|
||||
|
||||
input_report_key(dev, BTN_TOUCH, fingers != 0);
|
||||
|
||||
/* byte 2: x7 x6 x5 x4 x3 x2 x1 x0
|
||||
byte 3: y7 y6 y5 y4 y3 y2 y1 y0 */
|
||||
/*
|
||||
* byte 2: x7 x6 x5 x4 x3 x2 x1 x0
|
||||
* byte 3: y7 y6 y5 y4 y3 y2 y1 y0
|
||||
*/
|
||||
if (fingers) {
|
||||
input_report_abs(dev, ABS_X,
|
||||
((packet[1] & 0x0c) << 6) | packet[2]);
|
||||
input_report_abs(dev, ABS_Y, ETP_YMAX_V1 -
|
||||
(((packet[1] & 0x03) << 8) | packet[3]));
|
||||
input_report_abs(dev, ABS_Y,
|
||||
ETP_YMAX_V1 - (((packet[1] & 0x03) << 8) | packet[3]));
|
||||
}
|
||||
|
||||
input_report_key(dev, BTN_TOOL_FINGER, fingers == 1);
|
||||
@ -247,34 +257,47 @@ static void elantech_report_absolute_v2(struct psmouse *psmouse)
|
||||
|
||||
switch (fingers) {
|
||||
case 1:
|
||||
/* byte 1: x15 x14 x13 x12 x11 x10 x9 x8
|
||||
byte 2: x7 x6 x5 x4 x4 x2 x1 x0 */
|
||||
input_report_abs(dev, ABS_X, (packet[1] << 8) | packet[2]);
|
||||
/* byte 4: y15 y14 y13 y12 y11 y10 y8 y8
|
||||
byte 5: y7 y6 y5 y4 y3 y2 y1 y0 */
|
||||
input_report_abs(dev, ABS_Y, ETP_YMAX_V2 -
|
||||
((packet[4] << 8) | packet[5]));
|
||||
/*
|
||||
* byte 1: . . . . . x10 x9 x8
|
||||
* byte 2: x7 x6 x5 x4 x4 x2 x1 x0
|
||||
*/
|
||||
input_report_abs(dev, ABS_X,
|
||||
((packet[1] & 0x07) << 8) | packet[2]);
|
||||
/*
|
||||
* byte 4: . . . . . . y9 y8
|
||||
* byte 5: y7 y6 y5 y4 y3 y2 y1 y0
|
||||
*/
|
||||
input_report_abs(dev, ABS_Y,
|
||||
ETP_YMAX_V2 - (((packet[4] & 0x03) << 8) | packet[5]));
|
||||
break;
|
||||
|
||||
case 2:
|
||||
/* The coordinate of each finger is reported separately with
|
||||
a lower resolution for two finger touches */
|
||||
/* byte 0: . . ay8 ax8 . . . .
|
||||
byte 1: ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0 */
|
||||
/*
|
||||
* The coordinate of each finger is reported separately
|
||||
* with a lower resolution for two finger touches:
|
||||
* byte 0: . . ay8 ax8 . . . .
|
||||
* byte 1: ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0
|
||||
*/
|
||||
x1 = ((packet[0] & 0x10) << 4) | packet[1];
|
||||
/* byte 2: ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0 */
|
||||
y1 = ETP_2FT_YMAX - (((packet[0] & 0x20) << 3) | packet[2]);
|
||||
/* byte 3: . . by8 bx8 . . . .
|
||||
byte 4: bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0 */
|
||||
/*
|
||||
* byte 3: . . by8 bx8 . . . .
|
||||
* byte 4: bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0
|
||||
*/
|
||||
x2 = ((packet[3] & 0x10) << 4) | packet[4];
|
||||
/* byte 5: by7 by8 by5 by4 by3 by2 by1 by0 */
|
||||
y2 = ETP_2FT_YMAX - (((packet[3] & 0x20) << 3) | packet[5]);
|
||||
/* For compatibility with the X Synaptics driver scale up one
|
||||
coordinate and report as ordinary mouse movent */
|
||||
/*
|
||||
* For compatibility with the X Synaptics driver scale up
|
||||
* one coordinate and report as ordinary mouse movent
|
||||
*/
|
||||
input_report_abs(dev, ABS_X, x1 << 2);
|
||||
input_report_abs(dev, ABS_Y, y1 << 2);
|
||||
/* For compatibility with the proprietary X Elantech driver
|
||||
report both coordinates as hat coordinates */
|
||||
/*
|
||||
* For compatibility with the proprietary X Elantech driver
|
||||
* report both coordinates as hat coordinates
|
||||
*/
|
||||
input_report_abs(dev, ABS_HAT0X, x1);
|
||||
input_report_abs(dev, ABS_HAT0Y, y1);
|
||||
input_report_abs(dev, ABS_HAT1X, x2);
|
||||
@ -596,8 +619,12 @@ int elantech_detect(struct psmouse *psmouse, bool set_properties)
|
||||
param[0], param[1], param[2]);
|
||||
|
||||
if (param[0] == 0 || param[1] != 0) {
|
||||
pr_debug("elantech.c: Probably not a real Elantech touchpad. Aborting.\n");
|
||||
return -1;
|
||||
if (!force_elantech) {
|
||||
pr_debug("elantech.c: Probably not a real Elantech touchpad. Aborting.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pr_debug("elantech.c: Probably not a real Elantech touchpad. Enabling anyway due to force_elantech.\n");
|
||||
}
|
||||
|
||||
if (set_properties) {
|
||||
@ -666,7 +693,8 @@ int elantech_init(struct psmouse *psmouse)
|
||||
* Assume every version greater than this is new EeePC style
|
||||
* hardware with 6 byte packets
|
||||
*/
|
||||
if (etd->fw_version_maj >= 0x02 && etd->fw_version_min >= 0x30) {
|
||||
if ((etd->fw_version_maj == 0x02 && etd->fw_version_min >= 0x30) ||
|
||||
etd->fw_version_maj > 0x02) {
|
||||
etd->hw_version = 2;
|
||||
/* For now show extra debug information */
|
||||
etd->debug = 1;
|
||||
|
@ -110,6 +110,7 @@ static struct workqueue_struct *kpsmoused_wq;
|
||||
struct psmouse_protocol {
|
||||
enum psmouse_type type;
|
||||
bool maxproto;
|
||||
bool ignore_parity; /* Protocol should ignore parity errors from KBC */
|
||||
const char *name;
|
||||
const char *alias;
|
||||
int (*detect)(struct psmouse *, bool);
|
||||
@ -288,7 +289,9 @@ static irqreturn_t psmouse_interrupt(struct serio *serio,
|
||||
if (psmouse->state == PSMOUSE_IGNORE)
|
||||
goto out;
|
||||
|
||||
if (flags & (SERIO_PARITY|SERIO_TIMEOUT)) {
|
||||
if (unlikely((flags & SERIO_TIMEOUT) ||
|
||||
((flags & SERIO_PARITY) && !psmouse->ignore_parity))) {
|
||||
|
||||
if (psmouse->state == PSMOUSE_ACTIVATED)
|
||||
printk(KERN_WARNING "psmouse.c: bad data from KBC -%s%s\n",
|
||||
flags & SERIO_TIMEOUT ? " timeout" : "",
|
||||
@ -759,6 +762,7 @@ static const struct psmouse_protocol psmouse_protocols[] = {
|
||||
.name = "PS/2",
|
||||
.alias = "bare",
|
||||
.maxproto = true,
|
||||
.ignore_parity = true,
|
||||
.detect = ps2bare_detect,
|
||||
},
|
||||
#ifdef CONFIG_MOUSE_PS2_LOGIPS2PP
|
||||
@ -786,6 +790,7 @@ static const struct psmouse_protocol psmouse_protocols[] = {
|
||||
.name = "ImPS/2",
|
||||
.alias = "imps",
|
||||
.maxproto = true,
|
||||
.ignore_parity = true,
|
||||
.detect = intellimouse_detect,
|
||||
},
|
||||
{
|
||||
@ -793,6 +798,7 @@ static const struct psmouse_protocol psmouse_protocols[] = {
|
||||
.name = "ImExPS/2",
|
||||
.alias = "exps",
|
||||
.maxproto = true,
|
||||
.ignore_parity = true,
|
||||
.detect = im_explorer_detect,
|
||||
},
|
||||
#ifdef CONFIG_MOUSE_PS2_SYNAPTICS
|
||||
@ -1222,6 +1228,7 @@ static void psmouse_disconnect(struct serio *serio)
|
||||
static int psmouse_switch_protocol(struct psmouse *psmouse,
|
||||
const struct psmouse_protocol *proto)
|
||||
{
|
||||
const struct psmouse_protocol *selected_proto;
|
||||
struct input_dev *input_dev = psmouse->dev;
|
||||
|
||||
input_dev->dev.parent = &psmouse->ps2dev.serio->dev;
|
||||
@ -1245,9 +1252,14 @@ static int psmouse_switch_protocol(struct psmouse *psmouse,
|
||||
return -1;
|
||||
|
||||
psmouse->type = proto->type;
|
||||
} else
|
||||
selected_proto = proto;
|
||||
} else {
|
||||
psmouse->type = psmouse_extensions(psmouse,
|
||||
psmouse_max_proto, true);
|
||||
selected_proto = psmouse_protocol_by_type(psmouse->type);
|
||||
}
|
||||
|
||||
psmouse->ignore_parity = selected_proto->ignore_parity;
|
||||
|
||||
/*
|
||||
* If mouse's packet size is 3 there is no point in polling the
|
||||
@ -1267,7 +1279,7 @@ static int psmouse_switch_protocol(struct psmouse *psmouse,
|
||||
psmouse->resync_time = 0;
|
||||
|
||||
snprintf(psmouse->devname, sizeof(psmouse->devname), "%s %s %s",
|
||||
psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name);
|
||||
selected_proto->name, psmouse->vendor, psmouse->name);
|
||||
|
||||
input_dev->name = psmouse->devname;
|
||||
input_dev->phys = psmouse->phys;
|
||||
|
@ -47,6 +47,7 @@ struct psmouse {
|
||||
unsigned char pktcnt;
|
||||
unsigned char pktsize;
|
||||
unsigned char type;
|
||||
bool ignore_parity;
|
||||
bool acks_disable_command;
|
||||
unsigned int model;
|
||||
unsigned long last;
|
||||
|
@ -137,7 +137,8 @@ static int synaptics_capability(struct psmouse *psmouse)
|
||||
if (synaptics_send_cmd(psmouse, SYN_QUE_CAPABILITIES, cap))
|
||||
return -1;
|
||||
priv->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
||||
priv->ext_cap = 0;
|
||||
priv->ext_cap = priv->ext_cap_0c = 0;
|
||||
|
||||
if (!SYN_CAP_VALID(priv->capabilities))
|
||||
return -1;
|
||||
|
||||
@ -150,7 +151,7 @@ static int synaptics_capability(struct psmouse *psmouse)
|
||||
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 1) {
|
||||
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB, cap)) {
|
||||
printk(KERN_ERR "Synaptics claims to have extended capabilities,"
|
||||
" but I'm not able to read them.");
|
||||
" but I'm not able to read them.\n");
|
||||
} else {
|
||||
priv->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
||||
|
||||
@ -162,6 +163,16 @@ static int synaptics_capability(struct psmouse *psmouse)
|
||||
priv->ext_cap &= 0xff0fff;
|
||||
}
|
||||
}
|
||||
|
||||
if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 4) {
|
||||
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB_0C, cap)) {
|
||||
printk(KERN_ERR "Synaptics claims to have extended capability 0x0c,"
|
||||
" but I'm not able to read it.\n");
|
||||
} else {
|
||||
priv->ext_cap_0c = (cap[0] << 16) | (cap[1] << 8) | cap[2];
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -348,7 +359,15 @@ static void synaptics_parse_hw_state(unsigned char buf[], struct synaptics_data
|
||||
hw->left = (buf[0] & 0x01) ? 1 : 0;
|
||||
hw->right = (buf[0] & 0x02) ? 1 : 0;
|
||||
|
||||
if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities)) {
|
||||
if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
|
||||
/*
|
||||
* Clickpad's button is transmitted as middle button,
|
||||
* however, since it is primary button, we will report
|
||||
* it as BTN_LEFT.
|
||||
*/
|
||||
hw->left = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
|
||||
|
||||
} else if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities)) {
|
||||
hw->middle = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0;
|
||||
if (hw->w == 2)
|
||||
hw->scroll = (signed char)(buf[1]);
|
||||
@ -593,6 +612,12 @@ static void set_input_params(struct input_dev *dev, struct synaptics_data *priv)
|
||||
|
||||
dev->absres[ABS_X] = priv->x_res;
|
||||
dev->absres[ABS_Y] = priv->y_res;
|
||||
|
||||
if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
|
||||
/* Clickpads report only left button */
|
||||
__clear_bit(BTN_RIGHT, dev->keybit);
|
||||
__clear_bit(BTN_MIDDLE, dev->keybit);
|
||||
}
|
||||
}
|
||||
|
||||
static void synaptics_disconnect(struct psmouse *psmouse)
|
||||
@ -697,10 +722,10 @@ int synaptics_init(struct psmouse *psmouse)
|
||||
|
||||
priv->pkt_type = SYN_MODEL_NEWABS(priv->model_id) ? SYN_NEWABS : SYN_OLDABS;
|
||||
|
||||
printk(KERN_INFO "Synaptics Touchpad, model: %ld, fw: %ld.%ld, id: %#lx, caps: %#lx/%#lx\n",
|
||||
printk(KERN_INFO "Synaptics Touchpad, model: %ld, fw: %ld.%ld, id: %#lx, caps: %#lx/%#lx/%#lx\n",
|
||||
SYN_ID_MODEL(priv->identity),
|
||||
SYN_ID_MAJOR(priv->identity), SYN_ID_MINOR(priv->identity),
|
||||
priv->model_id, priv->capabilities, priv->ext_cap);
|
||||
priv->model_id, priv->capabilities, priv->ext_cap, priv->ext_cap_0c);
|
||||
|
||||
set_input_params(psmouse->dev, priv);
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
#define SYN_QUE_SERIAL_NUMBER_SUFFIX 0x07
|
||||
#define SYN_QUE_RESOLUTION 0x08
|
||||
#define SYN_QUE_EXT_CAPAB 0x09
|
||||
#define SYN_QUE_EXT_CAPAB_0C 0x0c
|
||||
|
||||
/* synatics modes */
|
||||
#define SYN_BIT_ABSOLUTE_MODE (1 << 7)
|
||||
@ -48,6 +49,8 @@
|
||||
#define SYN_CAP_VALID(c) ((((c) & 0x00ff00) >> 8) == 0x47)
|
||||
#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)
|
||||
|
||||
/* synaptics modes query bits */
|
||||
#define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7))
|
||||
@ -96,6 +99,7 @@ struct synaptics_data {
|
||||
unsigned long int model_id; /* Model-ID */
|
||||
unsigned long int capabilities; /* Capabilities */
|
||||
unsigned long int ext_cap; /* Extended Capabilities */
|
||||
unsigned long int ext_cap_0c; /* Ext Caps from 0x0c query */
|
||||
unsigned long int identity; /* Identification */
|
||||
int x_res; /* X resolution in units/mm */
|
||||
int y_res; /* Y resolution in units/mm */
|
||||
|
@ -124,14 +124,25 @@ static irqreturn_t eeti_ts_isr(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int eeti_ts_open(struct input_dev *dev)
|
||||
static void eeti_ts_start(struct eeti_ts_priv *priv)
|
||||
{
|
||||
struct eeti_ts_priv *priv = input_get_drvdata(dev);
|
||||
|
||||
enable_irq(priv->irq);
|
||||
|
||||
/* Read the events once to arm the IRQ */
|
||||
eeti_ts_read(&priv->work);
|
||||
}
|
||||
|
||||
static void eeti_ts_stop(struct eeti_ts_priv *priv)
|
||||
{
|
||||
disable_irq(priv->irq);
|
||||
cancel_work_sync(&priv->work);
|
||||
}
|
||||
|
||||
static int eeti_ts_open(struct input_dev *dev)
|
||||
{
|
||||
struct eeti_ts_priv *priv = input_get_drvdata(dev);
|
||||
|
||||
eeti_ts_start(priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -140,8 +151,7 @@ static void eeti_ts_close(struct input_dev *dev)
|
||||
{
|
||||
struct eeti_ts_priv *priv = input_get_drvdata(dev);
|
||||
|
||||
disable_irq(priv->irq);
|
||||
cancel_work_sync(&priv->work);
|
||||
eeti_ts_stop(priv);
|
||||
}
|
||||
|
||||
static int __devinit eeti_ts_probe(struct i2c_client *client,
|
||||
@ -153,10 +163,12 @@ static int __devinit eeti_ts_probe(struct i2c_client *client,
|
||||
unsigned int irq_flags;
|
||||
int err = -ENOMEM;
|
||||
|
||||
/* In contrast to what's described in the datasheet, there seems
|
||||
/*
|
||||
* In contrast to what's described in the datasheet, there seems
|
||||
* to be no way of probing the presence of that device using I2C
|
||||
* commands. So we need to blindly believe it is there, and wait
|
||||
* for interrupts to occur. */
|
||||
* for interrupts to occur.
|
||||
*/
|
||||
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv) {
|
||||
@ -212,9 +224,11 @@ static int __devinit eeti_ts_probe(struct i2c_client *client,
|
||||
goto err2;
|
||||
}
|
||||
|
||||
/* Disable the irq for now. It will be enabled once the input device
|
||||
* is opened. */
|
||||
disable_irq(priv->irq);
|
||||
/*
|
||||
* Disable the device for now. It will be enabled once the
|
||||
* input device is opened.
|
||||
*/
|
||||
eeti_ts_stop(priv);
|
||||
|
||||
device_init_wakeup(&client->dev, 0);
|
||||
return 0;
|
||||
@ -235,6 +249,12 @@ static int __devexit eeti_ts_remove(struct i2c_client *client)
|
||||
struct eeti_ts_priv *priv = i2c_get_clientdata(client);
|
||||
|
||||
free_irq(priv->irq, priv);
|
||||
/*
|
||||
* eeti_ts_stop() leaves IRQ disabled. We need to re-enable it
|
||||
* so that device still works if we reload the driver.
|
||||
*/
|
||||
enable_irq(priv->irq);
|
||||
|
||||
input_unregister_device(priv->input);
|
||||
i2c_set_clientdata(client, NULL);
|
||||
kfree(priv);
|
||||
@ -246,6 +266,14 @@ static int __devexit eeti_ts_remove(struct i2c_client *client)
|
||||
static int eeti_ts_suspend(struct i2c_client *client, pm_message_t mesg)
|
||||
{
|
||||
struct eeti_ts_priv *priv = i2c_get_clientdata(client);
|
||||
struct input_dev *input_dev = priv->input;
|
||||
|
||||
mutex_lock(&input_dev->mutex);
|
||||
|
||||
if (input_dev->users)
|
||||
eeti_ts_stop(priv);
|
||||
|
||||
mutex_unlock(&input_dev->mutex);
|
||||
|
||||
if (device_may_wakeup(&client->dev))
|
||||
enable_irq_wake(priv->irq);
|
||||
@ -256,10 +284,18 @@ static int eeti_ts_suspend(struct i2c_client *client, pm_message_t mesg)
|
||||
static int eeti_ts_resume(struct i2c_client *client)
|
||||
{
|
||||
struct eeti_ts_priv *priv = i2c_get_clientdata(client);
|
||||
struct input_dev *input_dev = priv->input;
|
||||
|
||||
if (device_may_wakeup(&client->dev))
|
||||
disable_irq_wake(priv->irq);
|
||||
|
||||
mutex_lock(&input_dev->mutex);
|
||||
|
||||
if (input_dev->users)
|
||||
eeti_ts_start(priv);
|
||||
|
||||
mutex_unlock(&input_dev->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
@ -311,11 +311,6 @@ static int ep93xx_rx(struct net_device *dev, int processed, int budget)
|
||||
processed++;
|
||||
}
|
||||
|
||||
if (processed) {
|
||||
wrw(ep, REG_RXDENQ, processed);
|
||||
wrw(ep, REG_RXSTSENQ, processed);
|
||||
}
|
||||
|
||||
return processed;
|
||||
}
|
||||
|
||||
@ -350,6 +345,11 @@ static int ep93xx_poll(struct napi_struct *napi, int budget)
|
||||
goto poll_some_more;
|
||||
}
|
||||
|
||||
if (rx) {
|
||||
wrw(ep, REG_RXDENQ, rx);
|
||||
wrw(ep, REG_RXSTSENQ, rx);
|
||||
}
|
||||
|
||||
return rx;
|
||||
}
|
||||
|
||||
|
@ -4633,6 +4633,9 @@ static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
|
||||
reg16 &= ~state;
|
||||
pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
|
||||
|
||||
if (!pdev->bus->self)
|
||||
return;
|
||||
|
||||
pos = pci_pcie_cap(pdev->bus->self);
|
||||
pci_read_config_word(pdev->bus->self, pos + PCI_EXP_LNKCTL, ®16);
|
||||
reg16 &= ~state;
|
||||
|
@ -1653,7 +1653,7 @@ fec_set_mac_address(struct net_device *dev, void *p)
|
||||
(dev->dev_addr[1] << 16) | (dev->dev_addr[0] << 24),
|
||||
fep->hwp + FEC_ADDR_LOW);
|
||||
writel((dev->dev_addr[5] << 16) | (dev->dev_addr[4] << 24),
|
||||
fep + FEC_ADDR_HIGH);
|
||||
fep->hwp + FEC_ADDR_HIGH);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -88,6 +88,11 @@ config LSI_ET1011C_PHY
|
||||
---help---
|
||||
Supports the LSI ET1011C PHY.
|
||||
|
||||
config MICREL_PHY
|
||||
tristate "Driver for Micrel PHYs"
|
||||
---help---
|
||||
Supports the KSZ9021, VSC8201, KS8001 PHYs.
|
||||
|
||||
config FIXED_PHY
|
||||
bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
|
||||
depends on PHYLIB=y
|
||||
|
@ -20,4 +20,5 @@ obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
|
||||
obj-$(CONFIG_MDIO_GPIO) += mdio-gpio.o
|
||||
obj-$(CONFIG_NATIONAL_PHY) += national.o
|
||||
obj-$(CONFIG_STE10XP) += ste10Xp.o
|
||||
obj-$(CONFIG_MICREL_PHY) += micrel.o
|
||||
obj-$(CONFIG_MDIO_OCTEON) += mdio-octeon.o
|
||||
|
@ -88,6 +88,7 @@ static int octeon_mdiobus_write(struct mii_bus *bus, int phy_id,
|
||||
static int __init octeon_mdiobus_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct octeon_mdiobus *bus;
|
||||
union cvmx_smix_en smi_en;
|
||||
int i;
|
||||
int err = -ENOENT;
|
||||
|
||||
@ -103,6 +104,10 @@ static int __init octeon_mdiobus_probe(struct platform_device *pdev)
|
||||
if (!bus->mii_bus)
|
||||
goto err;
|
||||
|
||||
smi_en.u64 = 0;
|
||||
smi_en.s.en = 1;
|
||||
cvmx_write_csr(CVMX_SMIX_EN(bus->unit), smi_en.u64);
|
||||
|
||||
/*
|
||||
* Standard Octeon evaluation boards don't support phy
|
||||
* interrupts, we need to poll.
|
||||
@ -133,17 +138,22 @@ static int __init octeon_mdiobus_probe(struct platform_device *pdev)
|
||||
|
||||
err:
|
||||
devm_kfree(&pdev->dev, bus);
|
||||
smi_en.u64 = 0;
|
||||
cvmx_write_csr(CVMX_SMIX_EN(bus->unit), smi_en.u64);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __exit octeon_mdiobus_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct octeon_mdiobus *bus;
|
||||
union cvmx_smix_en smi_en;
|
||||
|
||||
bus = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
mdiobus_unregister(bus->mii_bus);
|
||||
mdiobus_free(bus->mii_bus);
|
||||
smi_en.u64 = 0;
|
||||
cvmx_write_csr(CVMX_SMIX_EN(bus->unit), smi_en.u64);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
104
drivers/net/phy/micrel.c
Normal file
104
drivers/net/phy/micrel.c
Normal file
@ -0,0 +1,104 @@
|
||||
/*
|
||||
* drivers/net/phy/micrel.c
|
||||
*
|
||||
* Driver for Micrel PHYs
|
||||
*
|
||||
* Author: David J. Choi
|
||||
*
|
||||
* Copyright (c) 2010 Micrel, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* Support : ksz9021 , vsc8201, ks8001
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#define PHY_ID_KSZ9021 0x00221611
|
||||
#define PHY_ID_VSC8201 0x000FC413
|
||||
#define PHY_ID_KS8001 0x0022161A
|
||||
|
||||
|
||||
static int kszphy_config_init(struct phy_device *phydev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static struct phy_driver ks8001_driver = {
|
||||
.phy_id = PHY_ID_KS8001,
|
||||
.phy_id_mask = 0x00fffff0,
|
||||
.features = PHY_BASIC_FEATURES,
|
||||
.flags = PHY_POLL,
|
||||
.config_init = kszphy_config_init,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
.read_status = genphy_read_status,
|
||||
.driver = { .owner = THIS_MODULE,},
|
||||
};
|
||||
|
||||
static struct phy_driver vsc8201_driver = {
|
||||
.phy_id = PHY_ID_VSC8201,
|
||||
.name = "Micrel VSC8201",
|
||||
.phy_id_mask = 0x00fffff0,
|
||||
.features = PHY_BASIC_FEATURES,
|
||||
.flags = PHY_POLL,
|
||||
.config_init = kszphy_config_init,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
.read_status = genphy_read_status,
|
||||
.driver = { .owner = THIS_MODULE,},
|
||||
};
|
||||
|
||||
static struct phy_driver ksz9021_driver = {
|
||||
.phy_id = PHY_ID_KSZ9021,
|
||||
.phy_id_mask = 0x000fff10,
|
||||
.name = "Micrel KSZ9021 Gigabit PHY",
|
||||
.features = PHY_GBIT_FEATURES | SUPPORTED_Pause,
|
||||
.flags = PHY_POLL,
|
||||
.config_init = kszphy_config_init,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
.read_status = genphy_read_status,
|
||||
.driver = { .owner = THIS_MODULE, },
|
||||
};
|
||||
|
||||
static int __init ksphy_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = phy_driver_register(&ks8001_driver);
|
||||
if (ret)
|
||||
goto err1;
|
||||
ret = phy_driver_register(&vsc8201_driver);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
ret = phy_driver_register(&ksz9021_driver);
|
||||
if (ret)
|
||||
goto err3;
|
||||
return 0;
|
||||
|
||||
err3:
|
||||
phy_driver_unregister(&vsc8201_driver);
|
||||
err2:
|
||||
phy_driver_unregister(&ks8001_driver);
|
||||
err1:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit ksphy_exit(void)
|
||||
{
|
||||
phy_driver_unregister(&ks8001_driver);
|
||||
phy_driver_unregister(&vsc8201_driver);
|
||||
phy_driver_unregister(&ksz9021_driver);
|
||||
}
|
||||
|
||||
module_init(ksphy_init);
|
||||
module_exit(ksphy_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Micrel PHY driver");
|
||||
MODULE_AUTHOR("David J. Choi");
|
||||
MODULE_LICENSE("GPL");
|
@ -405,6 +405,7 @@ static ssize_t ppp_read(struct file *file, char __user *buf,
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
ssize_t ret;
|
||||
struct sk_buff *skb = NULL;
|
||||
struct iovec iov;
|
||||
|
||||
ret = count;
|
||||
|
||||
@ -448,7 +449,9 @@ static ssize_t ppp_read(struct file *file, char __user *buf,
|
||||
if (skb->len > count)
|
||||
goto outf;
|
||||
ret = -EFAULT;
|
||||
if (copy_to_user(buf, skb->data, skb->len))
|
||||
iov.iov_base = buf;
|
||||
iov.iov_len = count;
|
||||
if (skb_copy_datagram_iovec(skb, 0, &iov, skb->len))
|
||||
goto outf;
|
||||
ret = skb->len;
|
||||
|
||||
@ -1567,13 +1570,22 @@ ppp_input(struct ppp_channel *chan, struct sk_buff *skb)
|
||||
struct channel *pch = chan->ppp;
|
||||
int proto;
|
||||
|
||||
if (!pch || skb->len == 0) {
|
||||
if (!pch) {
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
||||
proto = PPP_PROTO(skb);
|
||||
read_lock_bh(&pch->upl);
|
||||
if (!pskb_may_pull(skb, 2)) {
|
||||
kfree_skb(skb);
|
||||
if (pch->ppp) {
|
||||
++pch->ppp->dev->stats.rx_length_errors;
|
||||
ppp_receive_error(pch->ppp);
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
proto = PPP_PROTO(skb);
|
||||
if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) {
|
||||
/* put it on the channel queue */
|
||||
skb_queue_tail(&pch->file.rq, skb);
|
||||
@ -1585,6 +1597,8 @@ ppp_input(struct ppp_channel *chan, struct sk_buff *skb)
|
||||
} else {
|
||||
ppp_do_recv(pch->ppp, skb, pch);
|
||||
}
|
||||
|
||||
done:
|
||||
read_unlock_bh(&pch->upl);
|
||||
}
|
||||
|
||||
@ -1617,7 +1631,8 @@ ppp_input_error(struct ppp_channel *chan, int code)
|
||||
static void
|
||||
ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
|
||||
{
|
||||
if (pskb_may_pull(skb, 2)) {
|
||||
/* note: a 0-length skb is used as an error indication */
|
||||
if (skb->len > 0) {
|
||||
#ifdef CONFIG_PPP_MULTILINK
|
||||
/* XXX do channel-level decompression here */
|
||||
if (PPP_PROTO(skb) == PPP_MP)
|
||||
@ -1625,15 +1640,10 @@ ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
|
||||
else
|
||||
#endif /* CONFIG_PPP_MULTILINK */
|
||||
ppp_receive_nonmp_frame(ppp, skb);
|
||||
return;
|
||||
} else {
|
||||
kfree_skb(skb);
|
||||
ppp_receive_error(ppp);
|
||||
}
|
||||
|
||||
if (skb->len > 0)
|
||||
/* note: a 0-length skb is used as an error indication */
|
||||
++ppp->dev->stats.rx_length_errors;
|
||||
|
||||
kfree_skb(skb);
|
||||
ppp_receive_error(ppp);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1042,14 +1042,14 @@ static void rtl8169_vlan_rx_register(struct net_device *dev,
|
||||
}
|
||||
|
||||
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
|
||||
struct sk_buff *skb)
|
||||
struct sk_buff *skb, int polling)
|
||||
{
|
||||
u32 opts2 = le32_to_cpu(desc->opts2);
|
||||
struct vlan_group *vlgrp = tp->vlgrp;
|
||||
int ret;
|
||||
|
||||
if (vlgrp && (opts2 & RxVlanTag)) {
|
||||
vlan_hwaccel_receive_skb(skb, vlgrp, swab16(opts2 & 0xffff));
|
||||
__vlan_hwaccel_rx(skb, vlgrp, swab16(opts2 & 0xffff), polling);
|
||||
ret = 0;
|
||||
} else
|
||||
ret = -1;
|
||||
@ -1066,7 +1066,7 @@ static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
|
||||
}
|
||||
|
||||
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
|
||||
struct sk_buff *skb)
|
||||
struct sk_buff *skb, int polling)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
@ -4445,12 +4445,20 @@ static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
|
||||
return done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Warning : rtl8169_rx_interrupt() might be called :
|
||||
* 1) from NAPI (softirq) context
|
||||
* (polling = 1 : we should call netif_receive_skb())
|
||||
* 2) from process context (rtl8169_reset_task())
|
||||
* (polling = 0 : we must call netif_rx() instead)
|
||||
*/
|
||||
static int rtl8169_rx_interrupt(struct net_device *dev,
|
||||
struct rtl8169_private *tp,
|
||||
void __iomem *ioaddr, u32 budget)
|
||||
{
|
||||
unsigned int cur_rx, rx_left;
|
||||
unsigned int delta, count;
|
||||
int polling = (budget != ~(u32)0) ? 1 : 0;
|
||||
|
||||
cur_rx = tp->cur_rx;
|
||||
rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
|
||||
@ -4512,8 +4520,12 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
|
||||
skb_put(skb, pkt_size);
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
|
||||
if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0)
|
||||
netif_receive_skb(skb);
|
||||
if (rtl8169_rx_vlan_skb(tp, desc, skb, polling) < 0) {
|
||||
if (likely(polling))
|
||||
netif_receive_skb(skb);
|
||||
else
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
dev->stats.rx_bytes += pkt_size;
|
||||
dev->stats.rx_packets++;
|
||||
|
@ -2353,17 +2353,36 @@ static int sbmac_init(struct platform_device *pldev, long long base)
|
||||
|
||||
sc->mii_bus = mdiobus_alloc();
|
||||
if (sc->mii_bus == NULL) {
|
||||
sbmac_uninitctx(sc);
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto uninit_ctx;
|
||||
}
|
||||
|
||||
sc->mii_bus->name = sbmac_mdio_string;
|
||||
snprintf(sc->mii_bus->id, MII_BUS_ID_SIZE, "%x", idx);
|
||||
sc->mii_bus->priv = sc;
|
||||
sc->mii_bus->read = sbmac_mii_read;
|
||||
sc->mii_bus->write = sbmac_mii_write;
|
||||
sc->mii_bus->irq = sc->phy_irq;
|
||||
for (i = 0; i < PHY_MAX_ADDR; ++i)
|
||||
sc->mii_bus->irq[i] = SBMAC_PHY_INT;
|
||||
|
||||
sc->mii_bus->parent = &pldev->dev;
|
||||
/*
|
||||
* Probe PHY address
|
||||
*/
|
||||
err = mdiobus_register(sc->mii_bus);
|
||||
if (err) {
|
||||
printk(KERN_ERR "%s: unable to register MDIO bus\n",
|
||||
dev->name);
|
||||
goto free_mdio;
|
||||
}
|
||||
dev_set_drvdata(&pldev->dev, sc->mii_bus);
|
||||
|
||||
err = register_netdev(dev);
|
||||
if (err) {
|
||||
printk(KERN_ERR "%s.%d: unable to register netdev\n",
|
||||
sbmac_string, idx);
|
||||
mdiobus_free(sc->mii_bus);
|
||||
sbmac_uninitctx(sc);
|
||||
return err;
|
||||
goto unreg_mdio;
|
||||
}
|
||||
|
||||
pr_info("%s.%d: registered as %s\n", sbmac_string, idx, dev->name);
|
||||
@ -2379,19 +2398,15 @@ static int sbmac_init(struct platform_device *pldev, long long base)
|
||||
pr_info("%s: SiByte Ethernet at 0x%08Lx, address: %pM\n",
|
||||
dev->name, base, eaddr);
|
||||
|
||||
sc->mii_bus->name = sbmac_mdio_string;
|
||||
snprintf(sc->mii_bus->id, MII_BUS_ID_SIZE, "%x", idx);
|
||||
sc->mii_bus->priv = sc;
|
||||
sc->mii_bus->read = sbmac_mii_read;
|
||||
sc->mii_bus->write = sbmac_mii_write;
|
||||
sc->mii_bus->irq = sc->phy_irq;
|
||||
for (i = 0; i < PHY_MAX_ADDR; ++i)
|
||||
sc->mii_bus->irq[i] = SBMAC_PHY_INT;
|
||||
|
||||
sc->mii_bus->parent = &pldev->dev;
|
||||
dev_set_drvdata(&pldev->dev, sc->mii_bus);
|
||||
|
||||
return 0;
|
||||
unreg_mdio:
|
||||
mdiobus_unregister(sc->mii_bus);
|
||||
dev_set_drvdata(&pldev->dev, NULL);
|
||||
free_mdio:
|
||||
mdiobus_free(sc->mii_bus);
|
||||
uninit_ctx:
|
||||
sbmac_uninitctx(sc);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@ -2417,16 +2432,6 @@ static int sbmac_open(struct net_device *dev)
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Probe PHY address
|
||||
*/
|
||||
err = mdiobus_register(sc->mii_bus);
|
||||
if (err) {
|
||||
printk(KERN_ERR "%s: unable to register MDIO bus\n",
|
||||
dev->name);
|
||||
goto out_unirq;
|
||||
}
|
||||
|
||||
sc->sbm_speed = sbmac_speed_none;
|
||||
sc->sbm_duplex = sbmac_duplex_none;
|
||||
sc->sbm_fc = sbmac_fc_none;
|
||||
@ -2457,11 +2462,7 @@ static int sbmac_open(struct net_device *dev)
|
||||
return 0;
|
||||
|
||||
out_unregister:
|
||||
mdiobus_unregister(sc->mii_bus);
|
||||
|
||||
out_unirq:
|
||||
free_irq(dev->irq, dev);
|
||||
|
||||
out_err:
|
||||
return err;
|
||||
}
|
||||
@ -2650,9 +2651,6 @@ static int sbmac_close(struct net_device *dev)
|
||||
|
||||
phy_disconnect(sc->phy_dev);
|
||||
sc->phy_dev = NULL;
|
||||
|
||||
mdiobus_unregister(sc->mii_bus);
|
||||
|
||||
free_irq(dev->irq, dev);
|
||||
|
||||
sbdma_emptyring(&(sc->sbm_txdma));
|
||||
@ -2760,6 +2758,7 @@ static int __exit sbmac_remove(struct platform_device *pldev)
|
||||
|
||||
unregister_netdev(dev);
|
||||
sbmac_uninitctx(sc);
|
||||
mdiobus_unregister(sc->mii_bus);
|
||||
mdiobus_free(sc->mii_bus);
|
||||
iounmap(sc->sbm_base);
|
||||
free_netdev(dev);
|
||||
|
@ -400,7 +400,6 @@ config USB_IPHETH
|
||||
config USB_SIERRA_NET
|
||||
tristate "USB-to-WWAN Driver for Sierra Wireless modems"
|
||||
depends on USB_USBNET
|
||||
default y
|
||||
help
|
||||
Choose this option if you have a Sierra Wireless USB-to-WWAN device.
|
||||
|
||||
|
@ -240,7 +240,7 @@ static int dm_write_shared_word(struct usbnet *dev, int phy, u8 reg, __le16 valu
|
||||
goto out;
|
||||
|
||||
dm_write_reg(dev, DM_SHARED_ADDR, phy ? (reg | 0x40) : reg);
|
||||
dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1c : 0x14);
|
||||
dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1a : 0x12);
|
||||
|
||||
for (i = 0; i < DM_TIMEOUT; i++) {
|
||||
u8 tmp;
|
||||
|
@ -789,6 +789,9 @@ static int sierra_net_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
/* prepare sync message from template */
|
||||
memcpy(priv->sync_msg, sync_tmplate, sizeof(priv->sync_msg));
|
||||
|
||||
/* initiate the sync sequence */
|
||||
sierra_net_dosync(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -246,7 +246,7 @@ static void p54p_check_tx_ring(struct ieee80211_hw *dev, u32 *index,
|
||||
u32 idx, i;
|
||||
|
||||
i = (*index) % ring_limit;
|
||||
(*index) = idx = le32_to_cpu(ring_control->device_idx[1]);
|
||||
(*index) = idx = le32_to_cpu(ring_control->device_idx[ring_index]);
|
||||
idx %= ring_limit;
|
||||
|
||||
while (i != idx) {
|
||||
|
@ -69,7 +69,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
|
||||
}
|
||||
|
||||
phy = get_phy_device(mdio, be32_to_cpup(addr));
|
||||
if (!phy) {
|
||||
if (!phy || IS_ERR(phy)) {
|
||||
dev_err(&mdio->dev, "error probing PHY at address %i\n",
|
||||
*addr);
|
||||
continue;
|
||||
|
@ -146,7 +146,6 @@ static irqreturn_t db1200_pcmcia_cdirq(int irq, void *data)
|
||||
static int db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock)
|
||||
{
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
|
||||
if (sock->stschg_irq != -1) {
|
||||
ret = request_irq(sock->stschg_irq, db1000_pcmcia_stschgirq,
|
||||
@ -162,30 +161,23 @@ static int db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock)
|
||||
* active one disabled.
|
||||
*/
|
||||
if (sock->board_type == BOARD_TYPE_DB1200) {
|
||||
local_irq_save(flags);
|
||||
|
||||
ret = request_irq(sock->insert_irq, db1200_pcmcia_cdirq,
|
||||
IRQF_DISABLED, "pcmcia_insert", sock);
|
||||
if (ret) {
|
||||
local_irq_restore(flags);
|
||||
if (ret)
|
||||
goto out1;
|
||||
}
|
||||
|
||||
ret = request_irq(sock->eject_irq, db1200_pcmcia_cdirq,
|
||||
IRQF_DISABLED, "pcmcia_eject", sock);
|
||||
if (ret) {
|
||||
free_irq(sock->insert_irq, sock);
|
||||
local_irq_restore(flags);
|
||||
goto out1;
|
||||
}
|
||||
|
||||
/* disable the currently active one */
|
||||
/* enable the currently silent one */
|
||||
if (db1200_card_inserted(sock))
|
||||
disable_irq_nosync(sock->insert_irq);
|
||||
enable_irq(sock->eject_irq);
|
||||
else
|
||||
disable_irq_nosync(sock->eject_irq);
|
||||
|
||||
local_irq_restore(flags);
|
||||
enable_irq(sock->insert_irq);
|
||||
} else {
|
||||
/* all other (older) Db1x00 boards use a GPIO to show
|
||||
* card detection status: use both-edge triggers.
|
||||
|
@ -348,6 +348,8 @@ static const struct pnp_device_id pnp_dev_table[] = {
|
||||
{ "FUJ02E6", 0 },
|
||||
/* Fujitsu Wacom 2FGT Tablet PC device */
|
||||
{ "FUJ02E7", 0 },
|
||||
/* Fujitsu Wacom 1FGT Tablet PC device */
|
||||
{ "FUJ02E9", 0 },
|
||||
/*
|
||||
* LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in
|
||||
* disguise)
|
||||
|
@ -29,39 +29,6 @@
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
/* Platform device Usage :
|
||||
*
|
||||
* Since PSCs can have multiple function, the correct driver for each one
|
||||
* is selected by calling mpc52xx_match_psc_function(...). The function
|
||||
* handled by this driver is "uart".
|
||||
*
|
||||
* The driver init all necessary registers to place the PSC in uart mode without
|
||||
* DCD. However, the pin multiplexing aren't changed and should be set either
|
||||
* by the bootloader or in the platform init code.
|
||||
*
|
||||
* The idx field must be equal to the PSC index (e.g. 0 for PSC1, 1 for PSC2,
|
||||
* and so on). So the PSC1 is mapped to /dev/ttyPSC0, PSC2 to /dev/ttyPSC1 and
|
||||
* so on. But be warned, it's an ABSOLUTE REQUIREMENT ! This is needed mainly
|
||||
* fpr the console code : without this 1:1 mapping, at early boot time, when we
|
||||
* are parsing the kernel args console=ttyPSC?, we wouldn't know which PSC it
|
||||
* will be mapped to.
|
||||
*/
|
||||
|
||||
/* OF Platform device Usage :
|
||||
*
|
||||
* This driver is only used for PSCs configured in uart mode. The device
|
||||
* tree will have a node for each PSC with "mpc52xx-psc-uart" in the compatible
|
||||
* list.
|
||||
*
|
||||
* By default, PSC devices are enumerated in the order they are found. However
|
||||
* a particular PSC number can be forces by adding 'device_no = <port#>'
|
||||
* to the device node.
|
||||
*
|
||||
* The driver init all necessary registers to place the PSC in uart mode without
|
||||
* DCD. However, the pin multiplexing aren't changed and should be set either
|
||||
* by the bootloader or in the platform init code.
|
||||
*/
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/device.h>
|
||||
|
@ -752,8 +752,10 @@ static void pmz_break_ctl(struct uart_port *port, int break_state)
|
||||
uap->curregs[R5] = new_reg;
|
||||
|
||||
/* NOTE: Not subject to 'transmitter active' rule. */
|
||||
if (ZS_IS_ASLEEP(uap))
|
||||
if (ZS_IS_ASLEEP(uap)) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
return;
|
||||
}
|
||||
write_zsreg(uap, R5, uap->curregs[R5]);
|
||||
}
|
||||
|
||||
|
@ -204,6 +204,7 @@ static inline void mcspi_write_chconf0(const struct spi_device *spi, u32 val)
|
||||
|
||||
cs->chconf0 = val;
|
||||
mcspi_write_cs_reg(spi, OMAP2_MCSPI_CHCONF0, val);
|
||||
mcspi_read_cs_reg(spi, OMAP2_MCSPI_CHCONF0);
|
||||
}
|
||||
|
||||
static void omap2_mcspi_set_dma_req(const struct spi_device *spi,
|
||||
@ -532,7 +533,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
|
||||
goto out;
|
||||
}
|
||||
#ifdef VERBOSE
|
||||
dev_dbg(&spi->dev, "write-%d %04x\n",
|
||||
dev_dbg(&spi->dev, "write-%d %08x\n",
|
||||
word_len, *tx);
|
||||
#endif
|
||||
__raw_writel(*tx++, tx_reg);
|
||||
@ -550,7 +551,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
|
||||
mcspi_write_chconf0(spi, l);
|
||||
*rx++ = __raw_readl(rx_reg);
|
||||
#ifdef VERBOSE
|
||||
dev_dbg(&spi->dev, "read-%d %04x\n",
|
||||
dev_dbg(&spi->dev, "read-%d %08x\n",
|
||||
word_len, *(rx - 1));
|
||||
#endif
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ static void spidev_release(struct device *dev)
|
||||
spi->master->cleanup(spi);
|
||||
|
||||
spi_master_put(spi->master);
|
||||
kfree(dev);
|
||||
kfree(spi);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
@ -257,6 +257,7 @@ int spi_add_device(struct spi_device *spi)
|
||||
{
|
||||
static DEFINE_MUTEX(spi_add_lock);
|
||||
struct device *dev = spi->master->dev.parent;
|
||||
struct device *d;
|
||||
int status;
|
||||
|
||||
/* Chipselects are numbered 0..max; validate. */
|
||||
@ -278,10 +279,11 @@ int spi_add_device(struct spi_device *spi)
|
||||
*/
|
||||
mutex_lock(&spi_add_lock);
|
||||
|
||||
if (bus_find_device_by_name(&spi_bus_type, NULL, dev_name(&spi->dev))
|
||||
!= NULL) {
|
||||
d = bus_find_device_by_name(&spi_bus_type, NULL, dev_name(&spi->dev));
|
||||
if (d != NULL) {
|
||||
dev_err(dev, "chipselect %d already in use\n",
|
||||
spi->chip_select);
|
||||
put_device(d);
|
||||
status = -EBUSY;
|
||||
goto done;
|
||||
}
|
||||
|
@ -464,9 +464,9 @@ static void dt3155_init_isr(int minor)
|
||||
/* 50/60 Hz should be set before this point but let's make sure it is */
|
||||
/* right anyway */
|
||||
|
||||
ReadI2C(dt3155_lbase[ minor ], CONFIG, &i2c_csr2.reg);
|
||||
ReadI2C(dt3155_lbase[ minor ], CSR2, &i2c_csr2.reg);
|
||||
i2c_csr2.fld.HZ50 = FORMAT50HZ;
|
||||
WriteI2C(dt3155_lbase[ minor ], CONFIG, i2c_config.reg);
|
||||
WriteI2C(dt3155_lbase[ minor ], CSR2, i2c_csr2.reg);
|
||||
|
||||
/* enable busmaster chip, clear flags */
|
||||
|
||||
|
@ -306,9 +306,9 @@ void HvCleanup(void)
|
||||
DPRINT_ENTER(VMBUS);
|
||||
|
||||
if (gHvContext.SignalEventBuffer) {
|
||||
kfree(gHvContext.SignalEventBuffer);
|
||||
gHvContext.SignalEventBuffer = NULL;
|
||||
gHvContext.SignalEventParam = NULL;
|
||||
kfree(gHvContext.SignalEventBuffer);
|
||||
}
|
||||
|
||||
if (gHvContext.HypercallPage) {
|
||||
|
@ -751,6 +751,7 @@ static int RndisFilterOpenDevice(struct rndis_device *Device)
|
||||
|
||||
ret = RndisFilterSetPacketFilter(Device,
|
||||
NDIS_PACKET_TYPE_BROADCAST |
|
||||
NDIS_PACKET_TYPE_ALL_MULTICAST |
|
||||
NDIS_PACKET_TYPE_DIRECTED);
|
||||
if (ret == 0)
|
||||
Device->State = RNDIS_DEV_DATAINITIALIZED;
|
||||
|
@ -403,8 +403,7 @@ static int netvsc_probe(struct device *device)
|
||||
if (!net_drv_obj->Base.OnDeviceAdd)
|
||||
return -1;
|
||||
|
||||
net = alloc_netdev(sizeof(struct net_device_context), "seth%d",
|
||||
ether_setup);
|
||||
net = alloc_etherdev(sizeof(struct net_device_context));
|
||||
if (!net)
|
||||
return -1;
|
||||
|
||||
|
@ -618,7 +618,7 @@ static int lis3l02dq_thresh_handler_th(struct iio_dev *dev_info,
|
||||
static void lis3l02dq_thresh_handler_bh_no_check(struct work_struct *work_s)
|
||||
{
|
||||
struct iio_work_cont *wc
|
||||
= container_of(work_s, struct iio_work_cont, ws_nocheck);
|
||||
= container_of(work_s, struct iio_work_cont, ws);
|
||||
struct lis3l02dq_state *st = wc->st;
|
||||
u8 t;
|
||||
|
||||
|
@ -493,6 +493,9 @@ int lis3l02dq_probe_trigger(struct iio_dev *indio_dev)
|
||||
struct lis3l02dq_state *state = indio_dev->dev_data;
|
||||
|
||||
state->trig = iio_allocate_trigger();
|
||||
if (!state->trig)
|
||||
return -ENOMEM;
|
||||
|
||||
state->trig->name = kmalloc(IIO_TRIGGER_NAME_LENGTH, GFP_KERNEL);
|
||||
if (!state->trig->name) {
|
||||
ret = -ENOMEM;
|
||||
|
@ -557,6 +557,7 @@ static int __devinit max1363_probe(struct i2c_client *client,
|
||||
if (!IS_ERR(st->reg))
|
||||
regulator_put(st->reg);
|
||||
error_free_st:
|
||||
i2c_set_clientdata(client, NULL);
|
||||
kfree(st);
|
||||
|
||||
error_ret:
|
||||
@ -574,6 +575,7 @@ static int max1363_remove(struct i2c_client *client)
|
||||
regulator_disable(st->reg);
|
||||
regulator_put(st->reg);
|
||||
}
|
||||
i2c_set_clientdata(client, NULL);
|
||||
kfree(st);
|
||||
|
||||
return 0;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user