Merge branch 'master' into for-linus
This commit is contained in:
Коммит
3e2bcad898
|
@ -1115,6 +1115,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
libata.dma=4 Compact Flash DMA only
|
||||
Combinations also work, so libata.dma=3 enables DMA
|
||||
for disks and CDROMs, but not CFs.
|
||||
|
||||
libata.ignore_hpa= [LIBATA] Ignore HPA limit
|
||||
libata.ignore_hpa=0 keep BIOS limits (default)
|
||||
libata.ignore_hpa=1 ignore limits, using full disk
|
||||
|
||||
libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume
|
||||
when set.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
0 -> Unknown EM2800 video grabber (em2800) [eb1a:2800]
|
||||
1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2820,eb1a:2821,eb1a:2860,eb1a:2861,eb1a:2870,eb1a:2881,eb1a:2883]
|
||||
1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2710,eb1a:2820,eb1a:2821,eb1a:2860,eb1a:2861,eb1a:2870,eb1a:2881,eb1a:2883]
|
||||
2 -> Terratec Cinergy 250 USB (em2820/em2840) [0ccd:0036]
|
||||
3 -> Pinnacle PCTV USB 2 (em2820/em2840) [2304:0208]
|
||||
4 -> Hauppauge WinTV USB 2 (em2820/em2840) [2040:4200,2040:4201]
|
||||
|
|
|
@ -153,8 +153,8 @@
|
|||
152 -> Asus Tiger Rev:1.00 [1043:4857]
|
||||
153 -> Kworld Plus TV Analog Lite PCI [17de:7128]
|
||||
154 -> Avermedia AVerTV GO 007 FM Plus [1461:f31d]
|
||||
155 -> Hauppauge WinTV-HVR1120 ATSC/QAM-Hybrid [0070:6706,0070:6708]
|
||||
156 -> Hauppauge WinTV-HVR1110r3 DVB-T/Hybrid [0070:6707,0070:6709,0070:670a]
|
||||
155 -> Hauppauge WinTV-HVR1150 ATSC/QAM-Hybrid [0070:6706,0070:6708]
|
||||
156 -> Hauppauge WinTV-HVR1120 DVB-T/Hybrid [0070:6707,0070:6709,0070:670a]
|
||||
157 -> Avermedia AVerTV Studio 507UA [1461:a11b]
|
||||
158 -> AVerMedia Cardbus TV/Radio (E501R) [1461:b7e9]
|
||||
159 -> Beholder BeholdTV 505 RDS [0000:505B]
|
||||
|
|
|
@ -2238,6 +2238,14 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
|
|||
S: Maintained
|
||||
F: drivers/media/video/gspca/pac207.c
|
||||
|
||||
GSPCA SN9C20X SUBDRIVER
|
||||
P: Brian Johnson
|
||||
M: brijohn@gmail.com
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
|
||||
S: Maintained
|
||||
F: drivers/media/video/gspca/sn9c20x.c
|
||||
|
||||
GSPCA T613 SUBDRIVER
|
||||
M: Leandro Costantino <lcostantino@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 31
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Man-Eating Seals of Antiquity
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -41,11 +41,6 @@ $(error Sorry, you need a newer version of the assember, one that is built from
|
|||
ftp://ftp.hpl.hp.com/pub/linux-ia64/gas-030124.tar.gz)
|
||||
endif
|
||||
|
||||
ifeq ($(call cc-version),0304)
|
||||
cflags-$(CONFIG_ITANIUM) += -mtune=merced
|
||||
cflags-$(CONFIG_MCKINLEY) += -mtune=mckinley
|
||||
endif
|
||||
|
||||
KBUILD_CFLAGS += $(cflags-y)
|
||||
head-y := arch/ia64/kernel/head.o arch/ia64/kernel/init_task.o
|
||||
|
||||
|
|
|
@ -286,7 +286,7 @@ __test_and_clear_bit(int nr, volatile void * addr)
|
|||
{
|
||||
__u32 *p = (__u32 *) addr + (nr >> 5);
|
||||
__u32 m = 1 << (nr & 31);
|
||||
int oldbitset = *p & m;
|
||||
int oldbitset = (*p & m) != 0;
|
||||
|
||||
*p &= ~m;
|
||||
return oldbitset;
|
||||
|
|
|
@ -155,7 +155,6 @@
|
|||
#include <linux/bitops.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
/*
|
||||
* Next come the mappings that determine how mmap() protection bits
|
||||
|
|
|
@ -21,6 +21,7 @@ EXPORT_SYMBOL(csum_ipv6_magic);
|
|||
|
||||
#include <asm/page.h>
|
||||
EXPORT_SYMBOL(clear_page);
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
|
||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||
#include <linux/bootmem.h>
|
||||
|
@ -60,9 +61,6 @@ EXPORT_SYMBOL(__udivdi3);
|
|||
EXPORT_SYMBOL(__moddi3);
|
||||
EXPORT_SYMBOL(__umoddi3);
|
||||
|
||||
#include <asm/page.h>
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
|
||||
#if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE)
|
||||
extern void xor_ia64_2(void);
|
||||
extern void xor_ia64_3(void);
|
||||
|
|
|
@ -1072,6 +1072,10 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base)
|
|||
}
|
||||
|
||||
addr = ioremap(phys_addr, 0);
|
||||
if (addr == NULL) {
|
||||
spin_unlock_irqrestore(&iosapic_lock, flags);
|
||||
return -ENOMEM;
|
||||
}
|
||||
ver = iosapic_version(addr);
|
||||
if ((err = iosapic_check_gsi_range(gsi_base, ver))) {
|
||||
iounmap(addr);
|
||||
|
|
|
@ -69,11 +69,6 @@ iommu_dma_init(void)
|
|||
|
||||
int iommu_dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
struct dma_map_ops *ops = platform_dma_get_ops(dev);
|
||||
|
||||
if (ops->dma_supported)
|
||||
return ops->dma_supported(dev, mask);
|
||||
|
||||
/* Copied from i386. Doesn't make much sense, because it will
|
||||
only work for pci_alloc_coherent.
|
||||
The caller just has to use GFP_DMA in this case. */
|
||||
|
|
|
@ -372,6 +372,10 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
|
|||
retval = kobject_init_and_add(&all_cpu_cache_info[cpu].kobj,
|
||||
&cache_ktype_percpu_entry, &sys_dev->kobj,
|
||||
"%s", "cache");
|
||||
if (unlikely(retval < 0)) {
|
||||
cpu_cache_sysfs_exit(cpu);
|
||||
return retval;
|
||||
}
|
||||
|
||||
for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) {
|
||||
this_object = LEAF_KOBJECT_PTR(cpu,i);
|
||||
|
@ -385,7 +389,7 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
|
|||
}
|
||||
kobject_put(&all_cpu_cache_info[cpu].kobj);
|
||||
cpu_cache_sysfs_exit(cpu);
|
||||
break;
|
||||
return retval;
|
||||
}
|
||||
kobject_uevent(&(this_object->kobj), KOBJ_ADD);
|
||||
}
|
||||
|
|
|
@ -547,7 +547,7 @@ static int __init ap325rxa_devices_setup(void)
|
|||
return platform_add_devices(ap325rxa_devices,
|
||||
ARRAY_SIZE(ap325rxa_devices));
|
||||
}
|
||||
device_initcall(ap325rxa_devices_setup);
|
||||
arch_initcall(ap325rxa_devices_setup);
|
||||
|
||||
/* Return the board specific boot mode pin configuration */
|
||||
static int ap325rxa_mode_pins(void)
|
||||
|
|
|
@ -608,7 +608,7 @@ static int __init migor_devices_setup(void)
|
|||
|
||||
return platform_add_devices(migor_devices, ARRAY_SIZE(migor_devices));
|
||||
}
|
||||
__initcall(migor_devices_setup);
|
||||
arch_initcall(migor_devices_setup);
|
||||
|
||||
/* Return the board specific boot mode pin configuration */
|
||||
static int migor_mode_pins(void)
|
||||
|
|
|
@ -187,7 +187,7 @@ static int __init sh7619_devices_setup(void)
|
|||
return platform_add_devices(sh7619_devices,
|
||||
ARRAY_SIZE(sh7619_devices));
|
||||
}
|
||||
__initcall(sh7619_devices_setup);
|
||||
arch_initcall(sh7619_devices_setup);
|
||||
|
||||
void __init plat_irq_setup(void)
|
||||
{
|
||||
|
|
|
@ -238,7 +238,7 @@ static int __init mxg_devices_setup(void)
|
|||
return platform_add_devices(mxg_devices,
|
||||
ARRAY_SIZE(mxg_devices));
|
||||
}
|
||||
__initcall(mxg_devices_setup);
|
||||
arch_initcall(mxg_devices_setup);
|
||||
|
||||
void __init plat_irq_setup(void)
|
||||
{
|
||||
|
|
|
@ -357,7 +357,7 @@ static int __init sh7201_devices_setup(void)
|
|||
return platform_add_devices(sh7201_devices,
|
||||
ARRAY_SIZE(sh7201_devices));
|
||||
}
|
||||
__initcall(sh7201_devices_setup);
|
||||
arch_initcall(sh7201_devices_setup);
|
||||
|
||||
void __init plat_irq_setup(void)
|
||||
{
|
||||
|
|
|
@ -367,7 +367,7 @@ static int __init sh7203_devices_setup(void)
|
|||
return platform_add_devices(sh7203_devices,
|
||||
ARRAY_SIZE(sh7203_devices));
|
||||
}
|
||||
__initcall(sh7203_devices_setup);
|
||||
arch_initcall(sh7203_devices_setup);
|
||||
|
||||
void __init plat_irq_setup(void)
|
||||
{
|
||||
|
|
|
@ -338,7 +338,7 @@ static int __init sh7206_devices_setup(void)
|
|||
return platform_add_devices(sh7206_devices,
|
||||
ARRAY_SIZE(sh7206_devices));
|
||||
}
|
||||
__initcall(sh7206_devices_setup);
|
||||
arch_initcall(sh7206_devices_setup);
|
||||
|
||||
void __init plat_irq_setup(void)
|
||||
{
|
||||
|
|
|
@ -222,7 +222,7 @@ static int __init sh7705_devices_setup(void)
|
|||
return platform_add_devices(sh7705_devices,
|
||||
ARRAY_SIZE(sh7705_devices));
|
||||
}
|
||||
__initcall(sh7705_devices_setup);
|
||||
arch_initcall(sh7705_devices_setup);
|
||||
|
||||
static struct platform_device *sh7705_early_devices[] __initdata = {
|
||||
&tmu0_device,
|
||||
|
|
|
@ -250,7 +250,7 @@ static int __init sh770x_devices_setup(void)
|
|||
return platform_add_devices(sh770x_devices,
|
||||
ARRAY_SIZE(sh770x_devices));
|
||||
}
|
||||
__initcall(sh770x_devices_setup);
|
||||
arch_initcall(sh770x_devices_setup);
|
||||
|
||||
static struct platform_device *sh770x_early_devices[] __initdata = {
|
||||
&tmu0_device,
|
||||
|
|
|
@ -226,7 +226,7 @@ static int __init sh7710_devices_setup(void)
|
|||
return platform_add_devices(sh7710_devices,
|
||||
ARRAY_SIZE(sh7710_devices));
|
||||
}
|
||||
__initcall(sh7710_devices_setup);
|
||||
arch_initcall(sh7710_devices_setup);
|
||||
|
||||
static struct platform_device *sh7710_early_devices[] __initdata = {
|
||||
&tmu0_device,
|
||||
|
|
|
@ -388,7 +388,7 @@ static int __init sh7720_devices_setup(void)
|
|||
return platform_add_devices(sh7720_devices,
|
||||
ARRAY_SIZE(sh7720_devices));
|
||||
}
|
||||
__initcall(sh7720_devices_setup);
|
||||
arch_initcall(sh7720_devices_setup);
|
||||
|
||||
static struct platform_device *sh7720_early_devices[] __initdata = {
|
||||
&cmt0_device,
|
||||
|
|
|
@ -138,7 +138,7 @@ static int __init sh4202_devices_setup(void)
|
|||
return platform_add_devices(sh4202_devices,
|
||||
ARRAY_SIZE(sh4202_devices));
|
||||
}
|
||||
__initcall(sh4202_devices_setup);
|
||||
arch_initcall(sh4202_devices_setup);
|
||||
|
||||
static struct platform_device *sh4202_early_devices[] __initdata = {
|
||||
&tmu0_device,
|
||||
|
|
|
@ -239,7 +239,7 @@ static int __init sh7750_devices_setup(void)
|
|||
return platform_add_devices(sh7750_devices,
|
||||
ARRAY_SIZE(sh7750_devices));
|
||||
}
|
||||
__initcall(sh7750_devices_setup);
|
||||
arch_initcall(sh7750_devices_setup);
|
||||
|
||||
static struct platform_device *sh7750_early_devices[] __initdata = {
|
||||
&tmu0_device,
|
||||
|
|
|
@ -265,7 +265,7 @@ static int __init sh7760_devices_setup(void)
|
|||
return platform_add_devices(sh7760_devices,
|
||||
ARRAY_SIZE(sh7760_devices));
|
||||
}
|
||||
__initcall(sh7760_devices_setup);
|
||||
arch_initcall(sh7760_devices_setup);
|
||||
|
||||
static struct platform_device *sh7760_early_devices[] __initdata = {
|
||||
&tmu0_device,
|
||||
|
|
|
@ -325,7 +325,7 @@ static int __init sh7343_devices_setup(void)
|
|||
return platform_add_devices(sh7343_devices,
|
||||
ARRAY_SIZE(sh7343_devices));
|
||||
}
|
||||
__initcall(sh7343_devices_setup);
|
||||
arch_initcall(sh7343_devices_setup);
|
||||
|
||||
static struct platform_device *sh7343_early_devices[] __initdata = {
|
||||
&cmt_device,
|
||||
|
|
|
@ -318,7 +318,7 @@ static int __init sh7366_devices_setup(void)
|
|||
return platform_add_devices(sh7366_devices,
|
||||
ARRAY_SIZE(sh7366_devices));
|
||||
}
|
||||
__initcall(sh7366_devices_setup);
|
||||
arch_initcall(sh7366_devices_setup);
|
||||
|
||||
static struct platform_device *sh7366_early_devices[] __initdata = {
|
||||
&cmt_device,
|
||||
|
|
|
@ -359,7 +359,7 @@ static int __init sh7722_devices_setup(void)
|
|||
return platform_add_devices(sh7722_devices,
|
||||
ARRAY_SIZE(sh7722_devices));
|
||||
}
|
||||
__initcall(sh7722_devices_setup);
|
||||
arch_initcall(sh7722_devices_setup);
|
||||
|
||||
static struct platform_device *sh7722_early_devices[] __initdata = {
|
||||
&cmt_device,
|
||||
|
|
|
@ -473,7 +473,7 @@ static int __init sh7723_devices_setup(void)
|
|||
return platform_add_devices(sh7723_devices,
|
||||
ARRAY_SIZE(sh7723_devices));
|
||||
}
|
||||
__initcall(sh7723_devices_setup);
|
||||
arch_initcall(sh7723_devices_setup);
|
||||
|
||||
static struct platform_device *sh7723_early_devices[] __initdata = {
|
||||
&cmt_device,
|
||||
|
|
|
@ -508,7 +508,7 @@ static int __init sh7724_devices_setup(void)
|
|||
return platform_add_devices(sh7724_devices,
|
||||
ARRAY_SIZE(sh7724_devices));
|
||||
}
|
||||
device_initcall(sh7724_devices_setup);
|
||||
arch_initcall(sh7724_devices_setup);
|
||||
|
||||
static struct platform_device *sh7724_early_devices[] __initdata = {
|
||||
&cmt_device,
|
||||
|
|
|
@ -314,7 +314,7 @@ static int __init sh7763_devices_setup(void)
|
|||
return platform_add_devices(sh7763_devices,
|
||||
ARRAY_SIZE(sh7763_devices));
|
||||
}
|
||||
__initcall(sh7763_devices_setup);
|
||||
arch_initcall(sh7763_devices_setup);
|
||||
|
||||
static struct platform_device *sh7763_early_devices[] __initdata = {
|
||||
&tmu0_device,
|
||||
|
|
|
@ -368,7 +368,7 @@ static int __init sh7770_devices_setup(void)
|
|||
return platform_add_devices(sh7770_devices,
|
||||
ARRAY_SIZE(sh7770_devices));
|
||||
}
|
||||
__initcall(sh7770_devices_setup);
|
||||
arch_initcall(sh7770_devices_setup);
|
||||
|
||||
static struct platform_device *sh7770_early_devices[] __initdata = {
|
||||
&tmu0_device,
|
||||
|
|
|
@ -256,7 +256,7 @@ static int __init sh7780_devices_setup(void)
|
|||
return platform_add_devices(sh7780_devices,
|
||||
ARRAY_SIZE(sh7780_devices));
|
||||
}
|
||||
__initcall(sh7780_devices_setup);
|
||||
arch_initcall(sh7780_devices_setup);
|
||||
|
||||
static struct platform_device *sh7780_early_devices[] __initdata = {
|
||||
&tmu0_device,
|
||||
|
|
|
@ -263,7 +263,7 @@ static int __init sh7785_devices_setup(void)
|
|||
return platform_add_devices(sh7785_devices,
|
||||
ARRAY_SIZE(sh7785_devices));
|
||||
}
|
||||
__initcall(sh7785_devices_setup);
|
||||
arch_initcall(sh7785_devices_setup);
|
||||
|
||||
static struct platform_device *sh7785_early_devices[] __initdata = {
|
||||
&tmu0_device,
|
||||
|
|
|
@ -547,7 +547,7 @@ static int __init sh7786_devices_setup(void)
|
|||
return platform_add_devices(sh7786_devices,
|
||||
ARRAY_SIZE(sh7786_devices));
|
||||
}
|
||||
device_initcall(sh7786_devices_setup);
|
||||
arch_initcall(sh7786_devices_setup);
|
||||
|
||||
void __init plat_early_device_setup(void)
|
||||
{
|
||||
|
|
|
@ -256,7 +256,7 @@ static int __init shx3_devices_setup(void)
|
|||
return platform_add_devices(shx3_devices,
|
||||
ARRAY_SIZE(shx3_devices));
|
||||
}
|
||||
__initcall(shx3_devices_setup);
|
||||
arch_initcall(shx3_devices_setup);
|
||||
|
||||
void __init plat_early_device_setup(void)
|
||||
{
|
||||
|
|
|
@ -186,7 +186,7 @@ static int __init sh5_devices_setup(void)
|
|||
return platform_add_devices(sh5_devices,
|
||||
ARRAY_SIZE(sh5_devices));
|
||||
}
|
||||
__initcall(sh5_devices_setup);
|
||||
arch_initcall(sh5_devices_setup);
|
||||
|
||||
void __init plat_early_device_setup(void)
|
||||
{
|
||||
|
|
|
@ -24,6 +24,7 @@ config X86
|
|||
select HAVE_UNSTABLE_SCHED_CLOCK
|
||||
select HAVE_IDE
|
||||
select HAVE_OPROFILE
|
||||
select HAVE_PERF_COUNTERS if (!M386 && !M486)
|
||||
select HAVE_IOREMAP_PROT
|
||||
select HAVE_KPROBES
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
|
@ -742,7 +743,6 @@ config X86_UP_IOAPIC
|
|||
config X86_LOCAL_APIC
|
||||
def_bool y
|
||||
depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC
|
||||
select HAVE_PERF_COUNTERS if (!M386 && !M486)
|
||||
|
||||
config X86_IO_APIC
|
||||
def_bool y
|
||||
|
|
|
@ -400,6 +400,13 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
|||
level = cpuid_eax(1);
|
||||
if((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58)
|
||||
set_cpu_cap(c, X86_FEATURE_REP_GOOD);
|
||||
|
||||
/*
|
||||
* Some BIOSes incorrectly force this feature, but only K8
|
||||
* revision D (model = 0x14) and later actually support it.
|
||||
*/
|
||||
if (c->x86_model < 0x14)
|
||||
clear_cpu_cap(c, X86_FEATURE_LAHF_LM);
|
||||
}
|
||||
if (c->x86 == 0x10 || c->x86 == 0x11)
|
||||
set_cpu_cap(c, X86_FEATURE_REP_GOOD);
|
||||
|
|
|
@ -59,7 +59,30 @@ void __init setup_cpu_local_masks(void)
|
|||
alloc_bootmem_cpumask_var(&cpu_sibling_setup_mask);
|
||||
}
|
||||
|
||||
static const struct cpu_dev *this_cpu __cpuinitdata;
|
||||
static void __cpuinit default_init(struct cpuinfo_x86 *c)
|
||||
{
|
||||
#ifdef CONFIG_X86_64
|
||||
display_cacheinfo(c);
|
||||
#else
|
||||
/* Not much we can do here... */
|
||||
/* Check if at least it has cpuid */
|
||||
if (c->cpuid_level == -1) {
|
||||
/* No cpuid. It must be an ancient CPU */
|
||||
if (c->x86 == 4)
|
||||
strcpy(c->x86_model_id, "486");
|
||||
else if (c->x86 == 3)
|
||||
strcpy(c->x86_model_id, "386");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static const struct cpu_dev __cpuinitconst default_cpu = {
|
||||
.c_init = default_init,
|
||||
.c_vendor = "Unknown",
|
||||
.c_x86_vendor = X86_VENDOR_UNKNOWN,
|
||||
};
|
||||
|
||||
static const struct cpu_dev *this_cpu __cpuinitdata = &default_cpu;
|
||||
|
||||
DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = {
|
||||
#ifdef CONFIG_X86_64
|
||||
|
@ -332,29 +355,6 @@ void switch_to_new_gdt(int cpu)
|
|||
|
||||
static const struct cpu_dev *__cpuinitdata cpu_devs[X86_VENDOR_NUM] = {};
|
||||
|
||||
static void __cpuinit default_init(struct cpuinfo_x86 *c)
|
||||
{
|
||||
#ifdef CONFIG_X86_64
|
||||
display_cacheinfo(c);
|
||||
#else
|
||||
/* Not much we can do here... */
|
||||
/* Check if at least it has cpuid */
|
||||
if (c->cpuid_level == -1) {
|
||||
/* No cpuid. It must be an ancient CPU */
|
||||
if (c->x86 == 4)
|
||||
strcpy(c->x86_model_id, "486");
|
||||
else if (c->x86 == 3)
|
||||
strcpy(c->x86_model_id, "386");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static const struct cpu_dev __cpuinitconst default_cpu = {
|
||||
.c_init = default_init,
|
||||
.c_vendor = "Unknown",
|
||||
.c_x86_vendor = X86_VENDOR_UNKNOWN,
|
||||
};
|
||||
|
||||
static void __cpuinit get_model_name(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned int *v;
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
|
||||
static DEFINE_PER_CPU(__u64, next_check) = INITIAL_JIFFIES;
|
||||
static DEFINE_PER_CPU(unsigned long, thermal_throttle_count);
|
||||
static DEFINE_PER_CPU(bool, thermal_throttle_active);
|
||||
|
||||
static atomic_t therm_throt_en = ATOMIC_INIT(0);
|
||||
|
||||
|
@ -96,24 +97,27 @@ static int therm_throt_process(int curr)
|
|||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
__u64 tmp_jiffs = get_jiffies_64();
|
||||
bool was_throttled = __get_cpu_var(thermal_throttle_active);
|
||||
bool is_throttled = __get_cpu_var(thermal_throttle_active) = curr;
|
||||
|
||||
if (curr)
|
||||
if (is_throttled)
|
||||
__get_cpu_var(thermal_throttle_count)++;
|
||||
|
||||
if (time_before64(tmp_jiffs, __get_cpu_var(next_check)))
|
||||
if (!(was_throttled ^ is_throttled) &&
|
||||
time_before64(tmp_jiffs, __get_cpu_var(next_check)))
|
||||
return 0;
|
||||
|
||||
__get_cpu_var(next_check) = tmp_jiffs + CHECK_INTERVAL;
|
||||
|
||||
/* if we just entered the thermal event */
|
||||
if (curr) {
|
||||
if (is_throttled) {
|
||||
printk(KERN_CRIT "CPU%d: Temperature above threshold, "
|
||||
"cpu clock throttled (total events = %lu)\n", cpu,
|
||||
__get_cpu_var(thermal_throttle_count));
|
||||
"cpu clock throttled (total events = %lu)\n",
|
||||
cpu, __get_cpu_var(thermal_throttle_count));
|
||||
|
||||
add_taint(TAINT_MACHINE_CHECK);
|
||||
} else {
|
||||
printk(KERN_CRIT "CPU%d: Temperature/speed normal\n", cpu);
|
||||
} else if (was_throttled) {
|
||||
printk(KERN_INFO "CPU%d: Temperature/speed normal\n", cpu);
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -55,6 +55,7 @@ struct x86_pmu {
|
|||
int num_counters_fixed;
|
||||
int counter_bits;
|
||||
u64 counter_mask;
|
||||
int apic;
|
||||
u64 max_period;
|
||||
u64 intel_ctrl;
|
||||
};
|
||||
|
@ -72,8 +73,8 @@ static const u64 p6_perfmon_event_map[] =
|
|||
{
|
||||
[PERF_COUNT_HW_CPU_CYCLES] = 0x0079,
|
||||
[PERF_COUNT_HW_INSTRUCTIONS] = 0x00c0,
|
||||
[PERF_COUNT_HW_CACHE_REFERENCES] = 0x0000,
|
||||
[PERF_COUNT_HW_CACHE_MISSES] = 0x0000,
|
||||
[PERF_COUNT_HW_CACHE_REFERENCES] = 0x0f2e,
|
||||
[PERF_COUNT_HW_CACHE_MISSES] = 0x012e,
|
||||
[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 0x00c4,
|
||||
[PERF_COUNT_HW_BRANCH_MISSES] = 0x00c5,
|
||||
[PERF_COUNT_HW_BUS_CYCLES] = 0x0062,
|
||||
|
@ -613,6 +614,7 @@ static DEFINE_MUTEX(pmc_reserve_mutex);
|
|||
|
||||
static bool reserve_pmc_hardware(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
int i;
|
||||
|
||||
if (nmi_watchdog == NMI_LOCAL_APIC)
|
||||
|
@ -627,9 +629,11 @@ static bool reserve_pmc_hardware(void)
|
|||
if (!reserve_evntsel_nmi(x86_pmu.eventsel + i))
|
||||
goto eventsel_fail;
|
||||
}
|
||||
#endif
|
||||
|
||||
return true;
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
eventsel_fail:
|
||||
for (i--; i >= 0; i--)
|
||||
release_evntsel_nmi(x86_pmu.eventsel + i);
|
||||
|
@ -644,10 +648,12 @@ perfctr_fail:
|
|||
enable_lapic_nmi_watchdog();
|
||||
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void release_pmc_hardware(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
int i;
|
||||
|
||||
for (i = 0; i < x86_pmu.num_counters; i++) {
|
||||
|
@ -657,6 +663,7 @@ static void release_pmc_hardware(void)
|
|||
|
||||
if (nmi_watchdog == NMI_LOCAL_APIC)
|
||||
enable_lapic_nmi_watchdog();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void hw_perf_counter_destroy(struct perf_counter *counter)
|
||||
|
@ -748,6 +755,15 @@ static int __hw_perf_counter_init(struct perf_counter *counter)
|
|||
hwc->sample_period = x86_pmu.max_period;
|
||||
hwc->last_period = hwc->sample_period;
|
||||
atomic64_set(&hwc->period_left, hwc->sample_period);
|
||||
} else {
|
||||
/*
|
||||
* If we have a PMU initialized but no APIC
|
||||
* interrupts, we cannot sample hardware
|
||||
* counters (user-space has to fall back and
|
||||
* sample via a hrtimer based software counter):
|
||||
*/
|
||||
if (!x86_pmu.apic)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
counter->destroy = hw_perf_counter_destroy;
|
||||
|
@ -1449,18 +1465,22 @@ void smp_perf_pending_interrupt(struct pt_regs *regs)
|
|||
|
||||
void set_perf_counter_pending(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
apic->send_IPI_self(LOCAL_PENDING_VECTOR);
|
||||
#endif
|
||||
}
|
||||
|
||||
void perf_counters_lapic_init(void)
|
||||
{
|
||||
if (!x86_pmu_initialized())
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
if (!x86_pmu.apic || !x86_pmu_initialized())
|
||||
return;
|
||||
|
||||
/*
|
||||
* Always use NMI for PMU
|
||||
*/
|
||||
apic_write(APIC_LVTPC, APIC_DM_NMI);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int __kprobes
|
||||
|
@ -1484,7 +1504,9 @@ perf_counter_nmi_handler(struct notifier_block *self,
|
|||
|
||||
regs = args->regs;
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
apic_write(APIC_LVTPC, APIC_DM_NMI);
|
||||
#endif
|
||||
/*
|
||||
* Can't rely on the handled return value to say it was our NMI, two
|
||||
* counters could trigger 'simultaneously' raising two back-to-back NMIs.
|
||||
|
@ -1515,6 +1537,7 @@ static struct x86_pmu p6_pmu = {
|
|||
.event_map = p6_pmu_event_map,
|
||||
.raw_event = p6_pmu_raw_event,
|
||||
.max_events = ARRAY_SIZE(p6_perfmon_event_map),
|
||||
.apic = 1,
|
||||
.max_period = (1ULL << 31) - 1,
|
||||
.version = 0,
|
||||
.num_counters = 2,
|
||||
|
@ -1541,6 +1564,7 @@ static struct x86_pmu intel_pmu = {
|
|||
.event_map = intel_pmu_event_map,
|
||||
.raw_event = intel_pmu_raw_event,
|
||||
.max_events = ARRAY_SIZE(intel_perfmon_event_map),
|
||||
.apic = 1,
|
||||
/*
|
||||
* Intel PMCs cannot be accessed sanely above 32 bit width,
|
||||
* so we install an artificial 1<<31 period regardless of
|
||||
|
@ -1564,6 +1588,7 @@ static struct x86_pmu amd_pmu = {
|
|||
.num_counters = 4,
|
||||
.counter_bits = 48,
|
||||
.counter_mask = (1ULL << 48) - 1,
|
||||
.apic = 1,
|
||||
/* use highest bit to detect overflow */
|
||||
.max_period = (1ULL << 47) - 1,
|
||||
};
|
||||
|
@ -1589,12 +1614,13 @@ static int p6_pmu_init(void)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!cpu_has_apic) {
|
||||
pr_info("no Local APIC, try rebooting with lapic");
|
||||
return -ENODEV;
|
||||
}
|
||||
x86_pmu = p6_pmu;
|
||||
|
||||
x86_pmu = p6_pmu;
|
||||
if (!cpu_has_apic) {
|
||||
pr_info("no APIC, boot with the \"lapic\" boot parameter to force-enable it.\n");
|
||||
pr_info("no hardware sampling interrupt available.\n");
|
||||
x86_pmu.apic = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -418,20 +418,20 @@ static int __init set_pci_reboot(const struct dmi_system_id *d)
|
|||
}
|
||||
|
||||
static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
|
||||
{ /* Handle problems with rebooting on Apple MacBook5,2 */
|
||||
{ /* Handle problems with rebooting on Apple MacBook5 */
|
||||
.callback = set_pci_reboot,
|
||||
.ident = "Apple MacBook",
|
||||
.ident = "Apple MacBook5",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5"),
|
||||
},
|
||||
},
|
||||
{ /* Handle problems with rebooting on Apple MacBookPro5,1 */
|
||||
{ /* Handle problems with rebooting on Apple MacBookPro5 */
|
||||
.callback = set_pci_reboot,
|
||||
.ident = "Apple MacBookPro5,1",
|
||||
.ident = "Apple MacBookPro5",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,1"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
|
|
|
@ -219,6 +219,8 @@ enum {
|
|||
AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */
|
||||
AHCI_HFLAG_YES_NCQ = (1 << 9), /* force NCQ cap on */
|
||||
AHCI_HFLAG_NO_SUSPEND = (1 << 10), /* don't suspend */
|
||||
AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = (1 << 11), /* treat SRST timeout as
|
||||
link offline */
|
||||
|
||||
/* ap->flags bits */
|
||||
|
||||
|
@ -1663,6 +1665,7 @@ static int ahci_do_softreset(struct ata_link *link, unsigned int *class,
|
|||
int (*check_ready)(struct ata_link *link))
|
||||
{
|
||||
struct ata_port *ap = link->ap;
|
||||
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||
const char *reason = NULL;
|
||||
unsigned long now, msecs;
|
||||
struct ata_taskfile tf;
|
||||
|
@ -1701,12 +1704,21 @@ static int ahci_do_softreset(struct ata_link *link, unsigned int *class,
|
|||
|
||||
/* wait for link to become ready */
|
||||
rc = ata_wait_after_reset(link, deadline, check_ready);
|
||||
/* link occupied, -ENODEV too is an error */
|
||||
if (rc) {
|
||||
if (rc == -EBUSY && hpriv->flags & AHCI_HFLAG_SRST_TOUT_IS_OFFLINE) {
|
||||
/*
|
||||
* Workaround for cases where link online status can't
|
||||
* be trusted. Treat device readiness timeout as link
|
||||
* offline.
|
||||
*/
|
||||
ata_link_printk(link, KERN_INFO,
|
||||
"device not ready, treating as offline\n");
|
||||
*class = ATA_DEV_NONE;
|
||||
} else if (rc) {
|
||||
/* link occupied, -ENODEV too is an error */
|
||||
reason = "device not ready";
|
||||
goto fail;
|
||||
}
|
||||
*class = ahci_dev_classify(ap);
|
||||
} else
|
||||
*class = ahci_dev_classify(ap);
|
||||
|
||||
DPRINTK("EXIT, class=%u\n", *class);
|
||||
return 0;
|
||||
|
@ -1773,7 +1785,8 @@ static int ahci_sb600_softreset(struct ata_link *link, unsigned int *class,
|
|||
irq_sts = readl(port_mmio + PORT_IRQ_STAT);
|
||||
if (irq_sts & PORT_IRQ_BAD_PMP) {
|
||||
ata_link_printk(link, KERN_WARNING,
|
||||
"failed due to HW bug, retry pmp=0\n");
|
||||
"applying SB600 PMP SRST workaround "
|
||||
"and retrying\n");
|
||||
rc = ahci_do_softreset(link, class, 0, deadline,
|
||||
ahci_check_ready);
|
||||
}
|
||||
|
@ -2726,6 +2739,56 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
|
|||
return !ver || strcmp(ver, dmi->driver_data) < 0;
|
||||
}
|
||||
|
||||
static bool ahci_broken_online(struct pci_dev *pdev)
|
||||
{
|
||||
#define ENCODE_BUSDEVFN(bus, slot, func) \
|
||||
(void *)(unsigned long)(((bus) << 8) | PCI_DEVFN((slot), (func)))
|
||||
static const struct dmi_system_id sysids[] = {
|
||||
/*
|
||||
* There are several gigabyte boards which use
|
||||
* SIMG5723s configured as hardware RAID. Certain
|
||||
* 5723 firmware revisions shipped there keep the link
|
||||
* online but fail to answer properly to SRST or
|
||||
* IDENTIFY when no device is attached downstream
|
||||
* causing libata to retry quite a few times leading
|
||||
* to excessive detection delay.
|
||||
*
|
||||
* As these firmwares respond to the second reset try
|
||||
* with invalid device signature, considering unknown
|
||||
* sig as offline works around the problem acceptably.
|
||||
*/
|
||||
{
|
||||
.ident = "EP45-DQ6",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR,
|
||||
"Gigabyte Technology Co., Ltd."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "EP45-DQ6"),
|
||||
},
|
||||
.driver_data = ENCODE_BUSDEVFN(0x0a, 0x00, 0),
|
||||
},
|
||||
{
|
||||
.ident = "EP45-DS5",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR,
|
||||
"Gigabyte Technology Co., Ltd."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "EP45-DS5"),
|
||||
},
|
||||
.driver_data = ENCODE_BUSDEVFN(0x03, 0x00, 0),
|
||||
},
|
||||
{ } /* terminate list */
|
||||
};
|
||||
#undef ENCODE_BUSDEVFN
|
||||
const struct dmi_system_id *dmi = dmi_first_match(sysids);
|
||||
unsigned int val;
|
||||
|
||||
if (!dmi)
|
||||
return false;
|
||||
|
||||
val = (unsigned long)dmi->driver_data;
|
||||
|
||||
return pdev->bus->number == (val >> 8) && pdev->devfn == (val & 0xff);
|
||||
}
|
||||
|
||||
static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
static int printed_version;
|
||||
|
@ -2841,6 +2904,12 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
"BIOS update required for suspend/resume\n");
|
||||
}
|
||||
|
||||
if (ahci_broken_online(pdev)) {
|
||||
hpriv->flags |= AHCI_HFLAG_SRST_TOUT_IS_OFFLINE;
|
||||
dev_info(&pdev->dev,
|
||||
"online status unreliable, applying workaround\n");
|
||||
}
|
||||
|
||||
/* CAP.NP sometimes indicate the index of the last enabled
|
||||
* port, at other times, that of the last possible port, so
|
||||
* determining the maximum port number requires looking at
|
||||
|
|
|
@ -4302,6 +4302,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|||
{ "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA },
|
||||
{ "MAXTOR 6L080L4", "A93.0500", ATA_HORKAGE_BROKEN_HPA },
|
||||
|
||||
/* this one allows HPA unlocking but fails IOs on the area */
|
||||
{ "OCZ-VERTEX", "1.30", ATA_HORKAGE_BROKEN_HPA },
|
||||
|
||||
/* Devices which report 1 sector over size HPA */
|
||||
{ "ST340823A", NULL, ATA_HORKAGE_HPA_SIZE, },
|
||||
{ "ST320413A", NULL, ATA_HORKAGE_HPA_SIZE, },
|
||||
|
|
|
@ -250,7 +250,7 @@ static int __devinit pata_at91_probe(struct platform_device *pdev)
|
|||
ata_port_desc(ap, "no IRQ, using PIO polling");
|
||||
}
|
||||
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
|
||||
|
||||
if (!info) {
|
||||
dev_err(dev, "failed to allocate memory for private data\n");
|
||||
|
@ -275,7 +275,7 @@ static int __devinit pata_at91_probe(struct platform_device *pdev)
|
|||
if (!info->ide_addr) {
|
||||
dev_err(dev, "failed to map IO base\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_ide_ioremap;
|
||||
goto err_put;
|
||||
}
|
||||
|
||||
info->alt_addr = devm_ioremap(dev,
|
||||
|
@ -284,7 +284,7 @@ static int __devinit pata_at91_probe(struct platform_device *pdev)
|
|||
if (!info->alt_addr) {
|
||||
dev_err(dev, "failed to map CTL base\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_alt_ioremap;
|
||||
goto err_put;
|
||||
}
|
||||
|
||||
ap->ioaddr.cmd_addr = info->ide_addr;
|
||||
|
@ -303,13 +303,8 @@ static int __devinit pata_at91_probe(struct platform_device *pdev)
|
|||
irq ? ata_sff_interrupt : NULL,
|
||||
irq_flags, &pata_at91_sht);
|
||||
|
||||
err_alt_ioremap:
|
||||
devm_iounmap(dev, info->ide_addr);
|
||||
|
||||
err_ide_ioremap:
|
||||
err_put:
|
||||
clk_put(info->mck);
|
||||
kfree(info);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -317,7 +312,6 @@ static int __devexit pata_at91_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct ata_host *host = dev_get_drvdata(&pdev->dev);
|
||||
struct at91_ide_info *info;
|
||||
struct device *dev = &pdev->dev;
|
||||
|
||||
if (!host)
|
||||
return 0;
|
||||
|
@ -328,11 +322,8 @@ static int __devexit pata_at91_remove(struct platform_device *pdev)
|
|||
if (!info)
|
||||
return 0;
|
||||
|
||||
devm_iounmap(dev, info->ide_addr);
|
||||
devm_iounmap(dev, info->alt_addr);
|
||||
clk_put(info->mck);
|
||||
|
||||
kfree(info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* pata_atiixp.c - ATI PATA for new ATA layer
|
||||
* (C) 2005 Red Hat Inc
|
||||
* (C) 2009 Bartlomiej Zolnierkiewicz
|
||||
*
|
||||
* Based on
|
||||
*
|
||||
|
@ -61,20 +62,19 @@ static void atiixp_set_pio_timing(struct ata_port *ap, struct ata_device *adev,
|
|||
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
int dn = 2 * ap->port_no + adev->devno;
|
||||
|
||||
/* Check this is correct - the order is odd in both drivers */
|
||||
int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1);
|
||||
u16 pio_mode_data, pio_timing_data;
|
||||
u32 pio_timing_data;
|
||||
u16 pio_mode_data;
|
||||
|
||||
pci_read_config_word(pdev, ATIIXP_IDE_PIO_MODE, &pio_mode_data);
|
||||
pio_mode_data &= ~(0x7 << (4 * dn));
|
||||
pio_mode_data |= pio << (4 * dn);
|
||||
pci_write_config_word(pdev, ATIIXP_IDE_PIO_MODE, pio_mode_data);
|
||||
|
||||
pci_read_config_word(pdev, ATIIXP_IDE_PIO_TIMING, &pio_timing_data);
|
||||
pci_read_config_dword(pdev, ATIIXP_IDE_PIO_TIMING, &pio_timing_data);
|
||||
pio_timing_data &= ~(0xFF << timing_shift);
|
||||
pio_timing_data |= (pio_timings[pio] << timing_shift);
|
||||
pci_write_config_word(pdev, ATIIXP_IDE_PIO_TIMING, pio_timing_data);
|
||||
pci_write_config_dword(pdev, ATIIXP_IDE_PIO_TIMING, pio_timing_data);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -119,16 +119,17 @@ static void atiixp_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
|||
udma_mode_data |= dma << (4 * dn);
|
||||
pci_write_config_word(pdev, ATIIXP_IDE_UDMA_MODE, udma_mode_data);
|
||||
} else {
|
||||
u16 mwdma_timing_data;
|
||||
/* Check this is correct - the order is odd in both drivers */
|
||||
int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1);
|
||||
u32 mwdma_timing_data;
|
||||
|
||||
dma -= XFER_MW_DMA_0;
|
||||
|
||||
pci_read_config_word(pdev, ATIIXP_IDE_MWDMA_TIMING, &mwdma_timing_data);
|
||||
pci_read_config_dword(pdev, ATIIXP_IDE_MWDMA_TIMING,
|
||||
&mwdma_timing_data);
|
||||
mwdma_timing_data &= ~(0xFF << timing_shift);
|
||||
mwdma_timing_data |= (mwdma_timings[dma] << timing_shift);
|
||||
pci_write_config_word(pdev, ATIIXP_IDE_MWDMA_TIMING, mwdma_timing_data);
|
||||
pci_write_config_dword(pdev, ATIIXP_IDE_MWDMA_TIMING,
|
||||
mwdma_timing_data);
|
||||
}
|
||||
/*
|
||||
* We must now look at the PIO mode situation. We may need to
|
||||
|
|
|
@ -602,6 +602,7 @@ MODULE_VERSION(DRV_VERSION);
|
|||
|
||||
static int adma_enabled;
|
||||
static int swncq_enabled = 1;
|
||||
static int msi_enabled;
|
||||
|
||||
static void nv_adma_register_mode(struct ata_port *ap)
|
||||
{
|
||||
|
@ -2459,6 +2460,11 @@ static int nv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
} else if (type == SWNCQ)
|
||||
nv_swncq_host_init(host);
|
||||
|
||||
if (msi_enabled) {
|
||||
dev_printk(KERN_NOTICE, &pdev->dev, "Using MSI\n");
|
||||
pci_enable_msi(pdev);
|
||||
}
|
||||
|
||||
pci_set_master(pdev);
|
||||
return ata_host_activate(host, pdev->irq, ipriv->irq_handler,
|
||||
IRQF_SHARED, ipriv->sht);
|
||||
|
@ -2558,4 +2564,6 @@ module_param_named(adma, adma_enabled, bool, 0444);
|
|||
MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: false)");
|
||||
module_param_named(swncq, swncq_enabled, bool, 0444);
|
||||
MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)");
|
||||
module_param_named(msi, msi_enabled, bool, 0444);
|
||||
MODULE_PARM_DESC(msi, "Enable use of MSI (Default: false)");
|
||||
|
||||
|
|
|
@ -483,9 +483,6 @@ int platform_driver_register(struct platform_driver *drv)
|
|||
drv->driver.remove = platform_drv_remove;
|
||||
if (drv->shutdown)
|
||||
drv->driver.shutdown = platform_drv_shutdown;
|
||||
if (drv->suspend || drv->resume)
|
||||
pr_warning("Platform driver '%s' needs updating - please use "
|
||||
"dev_pm_ops\n", drv->driver.name);
|
||||
|
||||
return driver_register(&drv->driver);
|
||||
}
|
||||
|
|
|
@ -359,6 +359,7 @@ static mddev_t * mddev_find(dev_t unit)
|
|||
else
|
||||
new->md_minor = MINOR(unit) >> MdpMinorShift;
|
||||
|
||||
mutex_init(&new->open_mutex);
|
||||
mutex_init(&new->reconfig_mutex);
|
||||
INIT_LIST_HEAD(&new->disks);
|
||||
INIT_LIST_HEAD(&new->all_mddevs);
|
||||
|
@ -1974,17 +1975,14 @@ repeat:
|
|||
/* otherwise we have to go forward and ... */
|
||||
mddev->events ++;
|
||||
if (!mddev->in_sync || mddev->recovery_cp != MaxSector) { /* not clean */
|
||||
/* .. if the array isn't clean, insist on an odd 'events' */
|
||||
if ((mddev->events&1)==0) {
|
||||
mddev->events++;
|
||||
/* .. if the array isn't clean, an 'even' event must also go
|
||||
* to spares. */
|
||||
if ((mddev->events&1)==0)
|
||||
nospares = 0;
|
||||
}
|
||||
} else {
|
||||
/* otherwise insist on an even 'events' (for clean states) */
|
||||
if ((mddev->events&1)) {
|
||||
mddev->events++;
|
||||
/* otherwise an 'odd' event must go to spares */
|
||||
if ((mddev->events&1))
|
||||
nospares = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3601,6 +3599,7 @@ max_sync_store(mddev_t *mddev, const char *buf, size_t len)
|
|||
if (max < mddev->resync_min)
|
||||
return -EINVAL;
|
||||
if (max < mddev->resync_max &&
|
||||
mddev->ro == 0 &&
|
||||
test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
|
||||
return -EBUSY;
|
||||
|
||||
|
@ -4304,12 +4303,11 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
|
|||
struct gendisk *disk = mddev->gendisk;
|
||||
mdk_rdev_t *rdev;
|
||||
|
||||
mutex_lock(&mddev->open_mutex);
|
||||
if (atomic_read(&mddev->openers) > is_open) {
|
||||
printk("md: %s still in use.\n",mdname(mddev));
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (mddev->pers) {
|
||||
err = -EBUSY;
|
||||
} else if (mddev->pers) {
|
||||
|
||||
if (mddev->sync_thread) {
|
||||
set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
||||
|
@ -4367,7 +4365,10 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
|
|||
set_disk_ro(disk, 1);
|
||||
clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
||||
}
|
||||
|
||||
out:
|
||||
mutex_unlock(&mddev->open_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
/*
|
||||
* Free resources if final stop
|
||||
*/
|
||||
|
@ -4433,7 +4434,6 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
|
|||
blk_integrity_unregister(disk);
|
||||
md_new_event(mddev);
|
||||
sysfs_notify_dirent(mddev->sysfs_state);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -5518,12 +5518,12 @@ static int md_open(struct block_device *bdev, fmode_t mode)
|
|||
}
|
||||
BUG_ON(mddev != bdev->bd_disk->private_data);
|
||||
|
||||
if ((err = mutex_lock_interruptible_nested(&mddev->reconfig_mutex, 1)))
|
||||
if ((err = mutex_lock_interruptible(&mddev->open_mutex)))
|
||||
goto out;
|
||||
|
||||
err = 0;
|
||||
atomic_inc(&mddev->openers);
|
||||
mddev_unlock(mddev);
|
||||
mutex_unlock(&mddev->open_mutex);
|
||||
|
||||
check_disk_change(bdev);
|
||||
out:
|
||||
|
|
|
@ -223,6 +223,16 @@ struct mddev_s
|
|||
* so we don't loop trying */
|
||||
|
||||
int in_sync; /* know to not need resync */
|
||||
/* 'open_mutex' avoids races between 'md_open' and 'do_md_stop', so
|
||||
* that we are never stopping an array while it is open.
|
||||
* 'reconfig_mutex' protects all other reconfiguration.
|
||||
* These locks are separate due to conflicting interactions
|
||||
* with bdev->bd_mutex.
|
||||
* Lock ordering is:
|
||||
* reconfig_mutex -> bd_mutex : e.g. do_md_run -> revalidate_disk
|
||||
* bd_mutex -> open_mutex: e.g. __blkdev_get -> md_open
|
||||
*/
|
||||
struct mutex open_mutex;
|
||||
struct mutex reconfig_mutex;
|
||||
atomic_t active; /* general refcount */
|
||||
atomic_t openers; /* number of active opens */
|
||||
|
|
|
@ -3785,7 +3785,7 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped
|
|||
conf->reshape_progress < raid5_size(mddev, 0, 0)) {
|
||||
sector_nr = raid5_size(mddev, 0, 0)
|
||||
- conf->reshape_progress;
|
||||
} else if (mddev->delta_disks > 0 &&
|
||||
} else if (mddev->delta_disks >= 0 &&
|
||||
conf->reshape_progress > 0)
|
||||
sector_nr = conf->reshape_progress;
|
||||
sector_div(sector_nr, new_data_disks);
|
||||
|
@ -4509,7 +4509,26 @@ static int run(mddev_t *mddev)
|
|||
(old_disks-max_degraded));
|
||||
/* here_old is the first stripe that we might need to read
|
||||
* from */
|
||||
if (here_new >= here_old) {
|
||||
if (mddev->delta_disks == 0) {
|
||||
/* We cannot be sure it is safe to start an in-place
|
||||
* reshape. It is only safe if user-space if monitoring
|
||||
* and taking constant backups.
|
||||
* mdadm always starts a situation like this in
|
||||
* readonly mode so it can take control before
|
||||
* allowing any writes. So just check for that.
|
||||
*/
|
||||
if ((here_new * mddev->new_chunk_sectors !=
|
||||
here_old * mddev->chunk_sectors) ||
|
||||
mddev->ro == 0) {
|
||||
printk(KERN_ERR "raid5: in-place reshape must be started"
|
||||
" in read-only mode - aborting\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (mddev->delta_disks < 0
|
||||
? (here_new * mddev->new_chunk_sectors <=
|
||||
here_old * mddev->chunk_sectors)
|
||||
: (here_new * mddev->new_chunk_sectors >=
|
||||
here_old * mddev->chunk_sectors)) {
|
||||
/* Reading from the same stripe as writing to - bad */
|
||||
printk(KERN_ERR "raid5: reshape_position too early for "
|
||||
"auto-recovery - aborting.\n");
|
||||
|
@ -5078,8 +5097,15 @@ static void raid5_finish_reshape(mddev_t *mddev)
|
|||
mddev->degraded--;
|
||||
for (d = conf->raid_disks ;
|
||||
d < conf->raid_disks - mddev->delta_disks;
|
||||
d++)
|
||||
raid5_remove_disk(mddev, d);
|
||||
d++) {
|
||||
mdk_rdev_t *rdev = conf->disks[d].rdev;
|
||||
if (rdev && raid5_remove_disk(mddev, d) == 0) {
|
||||
char nm[20];
|
||||
sprintf(nm, "rd%d", rdev->raid_disk);
|
||||
sysfs_remove_link(&mddev->kobj, nm);
|
||||
rdev->raid_disk = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
mddev->layout = conf->algorithm;
|
||||
mddev->chunk_sectors = conf->chunk_sectors;
|
||||
|
|
|
@ -64,24 +64,22 @@ static int qt1010_writereg(struct qt1010_priv *priv, u8 reg, u8 val)
|
|||
/* dump all registers */
|
||||
static void qt1010_dump_regs(struct qt1010_priv *priv)
|
||||
{
|
||||
char buf[52], buf2[4];
|
||||
u8 reg, val;
|
||||
|
||||
for (reg = 0; ; reg++) {
|
||||
if (reg % 16 == 0) {
|
||||
if (reg)
|
||||
printk("%s\n", buf);
|
||||
sprintf(buf, "%02x: ", reg);
|
||||
printk(KERN_CONT "\n");
|
||||
printk(KERN_DEBUG "%02x:", reg);
|
||||
}
|
||||
if (qt1010_readreg(priv, reg, &val) == 0)
|
||||
sprintf(buf2, "%02x ", val);
|
||||
printk(KERN_CONT " %02x", val);
|
||||
else
|
||||
strcpy(buf2, "-- ");
|
||||
strcat(buf, buf2);
|
||||
printk(KERN_CONT " --");
|
||||
if (reg == 0x2f)
|
||||
break;
|
||||
}
|
||||
printk("%s\n", buf);
|
||||
printk(KERN_CONT "\n");
|
||||
}
|
||||
|
||||
static int qt1010_set_params(struct dvb_frontend *fe,
|
||||
|
|
|
@ -1119,8 +1119,8 @@ static int xc2028_sleep(struct dvb_frontend *fe)
|
|||
struct xc2028_data *priv = fe->tuner_priv;
|
||||
int rc = 0;
|
||||
|
||||
/* Avoid firmware reload on slow devices */
|
||||
if (no_poweroff)
|
||||
/* Avoid firmware reload on slow devices or if PM disabled */
|
||||
if (no_poweroff || priv->ctrl.disable_power_mgmt)
|
||||
return 0;
|
||||
|
||||
tuner_dbg("Putting xc2028/3028 into poweroff mode.\n");
|
||||
|
|
|
@ -38,6 +38,7 @@ struct xc2028_ctrl {
|
|||
unsigned int input1:1;
|
||||
unsigned int vhfbw7:1;
|
||||
unsigned int uhfbw8:1;
|
||||
unsigned int disable_power_mgmt:1;
|
||||
unsigned int demod;
|
||||
enum firmware_type type:2;
|
||||
};
|
||||
|
|
|
@ -81,7 +81,6 @@ static int af9015_rw_udev(struct usb_device *udev, struct req_t *req)
|
|||
|
||||
switch (req->cmd) {
|
||||
case GET_CONFIG:
|
||||
case BOOT:
|
||||
case READ_MEMORY:
|
||||
case RECONNECT_USB:
|
||||
case GET_IR_CODE:
|
||||
|
@ -100,6 +99,7 @@ static int af9015_rw_udev(struct usb_device *udev, struct req_t *req)
|
|||
case WRITE_VIRTUAL_MEMORY:
|
||||
case COPY_FIRMWARE:
|
||||
case DOWNLOAD_FIRMWARE:
|
||||
case BOOT:
|
||||
break;
|
||||
default:
|
||||
err("unknown command:%d", req->cmd);
|
||||
|
|
|
@ -380,7 +380,7 @@ struct dvb_frontend* cx22700_attach(const struct cx22700_config* config,
|
|||
struct cx22700_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct cx22700_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct cx22700_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -580,7 +580,7 @@ struct dvb_frontend *cx22702_attach(const struct cx22702_config *config,
|
|||
struct cx22702_state *state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct cx22702_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct cx22702_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -598,7 +598,7 @@ struct dvb_frontend* cx24110_attach(const struct cx24110_config* config,
|
|||
int ret;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct cx24110_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct cx24110_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -117,7 +117,7 @@ struct dvb_frontend* dvb_dummy_fe_ofdm_attach(void)
|
|||
struct dvb_dummy_fe_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* create dvb_frontend */
|
||||
|
@ -137,7 +137,7 @@ struct dvb_frontend *dvb_dummy_fe_qpsk_attach(void)
|
|||
struct dvb_dummy_fe_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* create dvb_frontend */
|
||||
|
@ -157,7 +157,7 @@ struct dvb_frontend *dvb_dummy_fe_qam_attach(void)
|
|||
struct dvb_dummy_fe_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* create dvb_frontend */
|
||||
|
|
|
@ -501,7 +501,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
|
|||
{ .addr = config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct l64781_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct l64781_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -387,7 +387,7 @@ lgs8gl5_attach(const struct lgs8gl5_config *config, struct i2c_adapter *i2c)
|
|||
dprintk("%s\n", __func__);
|
||||
|
||||
/* Allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct lgs8gl5_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct lgs8gl5_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -782,7 +782,7 @@ struct dvb_frontend *mt312_attach(const struct mt312_config *config,
|
|||
struct mt312_state *state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct mt312_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct mt312_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -545,7 +545,7 @@ struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config,
|
|||
struct nxt6000_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct nxt6000_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct nxt6000_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -562,7 +562,7 @@ struct dvb_frontend* or51132_attach(const struct or51132_config* config,
|
|||
struct or51132_state* state = NULL;
|
||||
|
||||
/* Allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct or51132_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct or51132_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -527,7 +527,7 @@ struct dvb_frontend* or51211_attach(const struct or51211_config* config,
|
|||
struct or51211_state* state = NULL;
|
||||
|
||||
/* Allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct or51211_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct or51211_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -796,7 +796,7 @@ struct dvb_frontend *s5h1409_attach(const struct s5h1409_config *config,
|
|||
u16 reg;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct s5h1409_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct s5h1409_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -844,7 +844,7 @@ struct dvb_frontend *s5h1411_attach(const struct s5h1411_config *config,
|
|||
u16 reg;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct s5h1411_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct s5h1411_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -928,7 +928,7 @@ struct dvb_frontend *si21xx_attach(const struct si21xx_config *config,
|
|||
dprintk("%s\n", __func__);
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct si21xx_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct si21xx_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -557,7 +557,7 @@ struct dvb_frontend* sp8870_attach(const struct sp8870_config* config,
|
|||
struct sp8870_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct sp8870_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct sp8870_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -557,7 +557,7 @@ struct dvb_frontend* sp887x_attach(const struct sp887x_config* config,
|
|||
struct sp887x_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct sp887x_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct sp887x_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -570,7 +570,7 @@ struct dvb_frontend *stv0288_attach(const struct stv0288_config *config,
|
|||
int id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct stv0288_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct stv0288_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -663,7 +663,7 @@ struct dvb_frontend *stv0297_attach(const struct stv0297_config *config,
|
|||
struct stv0297_state *state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct stv0297_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct stv0297_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -667,7 +667,7 @@ struct dvb_frontend* stv0299_attach(const struct stv0299_config* config,
|
|||
int id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct stv0299_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct stv0299_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -413,7 +413,7 @@ struct dvb_frontend* tda10021_attach(const struct tda1002x_config* config,
|
|||
u8 id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda10021_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda10021_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -1095,7 +1095,7 @@ struct dvb_frontend *tda10048_attach(const struct tda10048_config *config,
|
|||
dprintk(1, "%s()\n", __func__);
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda10048_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda10048_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -1269,7 +1269,7 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
|
|||
int id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
||||
if (!state) {
|
||||
printk(KERN_ERR "Can't alocate memory for tda10045 state\n");
|
||||
return NULL;
|
||||
|
@ -1339,7 +1339,7 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
|
|||
int id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
||||
if (!state) {
|
||||
printk(KERN_ERR "Can't alocate memory for tda10046 state\n");
|
||||
return NULL;
|
||||
|
|
|
@ -745,7 +745,7 @@ struct dvb_frontend* tda10086_attach(const struct tda10086_config* config,
|
|||
dprintk ("%s\n", __func__);
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda10086_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda10086_state), GFP_KERNEL);
|
||||
if (!state)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -417,7 +417,7 @@ struct dvb_frontend* tda8083_attach(const struct tda8083_config* config,
|
|||
struct tda8083_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda8083_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda8083_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -374,7 +374,7 @@ struct dvb_frontend* ves1820_attach(const struct ves1820_config* config,
|
|||
struct ves1820_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct ves1820_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct ves1820_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -456,7 +456,7 @@ struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config,
|
|||
u8 identity;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct ves1x93_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct ves1x93_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -98,7 +98,6 @@ static int zl10353_read_register(struct zl10353_state *state, u8 reg)
|
|||
static void zl10353_dump_regs(struct dvb_frontend *fe)
|
||||
{
|
||||
struct zl10353_state *state = fe->demodulator_priv;
|
||||
char buf[52], buf2[4];
|
||||
int ret;
|
||||
u8 reg;
|
||||
|
||||
|
@ -106,19 +105,18 @@ static void zl10353_dump_regs(struct dvb_frontend *fe)
|
|||
for (reg = 0; ; reg++) {
|
||||
if (reg % 16 == 0) {
|
||||
if (reg)
|
||||
printk(KERN_DEBUG "%s\n", buf);
|
||||
sprintf(buf, "%02x: ", reg);
|
||||
printk(KERN_CONT "\n");
|
||||
printk(KERN_DEBUG "%02x:", reg);
|
||||
}
|
||||
ret = zl10353_read_register(state, reg);
|
||||
if (ret >= 0)
|
||||
sprintf(buf2, "%02x ", (u8)ret);
|
||||
printk(KERN_CONT " %02x", (u8)ret);
|
||||
else
|
||||
strcpy(buf2, "-- ");
|
||||
strcat(buf, buf2);
|
||||
printk(KERN_CONT " --");
|
||||
if (reg == 0xff)
|
||||
break;
|
||||
}
|
||||
printk(KERN_DEBUG "%s\n", buf);
|
||||
printk(KERN_CONT "\n");
|
||||
}
|
||||
|
||||
static void zl10353_calc_nominal_rate(struct dvb_frontend *fe,
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
config DVB_SIANO_SMS1XXX
|
||||
tristate "Siano SMS1XXX USB dongle support"
|
||||
depends on DVB_CORE && USB
|
||||
depends on DVB_CORE && USB && INPUT
|
||||
---help---
|
||||
Choose Y here if you have a USB dongle with a SMS1XXX chipset.
|
||||
|
||||
|
|
|
@ -116,99 +116,21 @@ static inline void sms_gpio_assign_11xx_default_led_config(
|
|||
|
||||
int sms_board_event(struct smscore_device_t *coredev,
|
||||
enum SMS_BOARD_EVENTS gevent) {
|
||||
int board_id = smscore_get_board_id(coredev);
|
||||
struct sms_board *board = sms_get_board(board_id);
|
||||
struct smscore_gpio_config MyGpioConfig;
|
||||
|
||||
sms_gpio_assign_11xx_default_led_config(&MyGpioConfig);
|
||||
|
||||
switch (gevent) {
|
||||
case BOARD_EVENT_POWER_INIT: /* including hotplug */
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
/* set I/O and turn off all LEDs */
|
||||
smscore_gpio_configure(coredev,
|
||||
board->board_cfg.leds_power,
|
||||
&MyGpioConfig);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.leds_power, 0);
|
||||
smscore_gpio_configure(coredev, board->board_cfg.led0,
|
||||
&MyGpioConfig);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led0, 0);
|
||||
smscore_gpio_configure(coredev, board->board_cfg.led1,
|
||||
&MyGpioConfig);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
|
||||
/* set I/O and turn off LNA */
|
||||
smscore_gpio_configure(coredev,
|
||||
board->board_cfg.foreign_lna0_ctrl,
|
||||
&MyGpioConfig);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.foreign_lna0_ctrl,
|
||||
0);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_BIND */
|
||||
|
||||
case BOARD_EVENT_POWER_SUSPEND:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.leds_power, 0);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led0, 0);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.foreign_lna0_ctrl,
|
||||
0);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_POWER_SUSPEND */
|
||||
|
||||
case BOARD_EVENT_POWER_RESUME:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.leds_power, 1);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led0, 1);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.foreign_lna0_ctrl,
|
||||
1);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_POWER_RESUME */
|
||||
|
||||
case BOARD_EVENT_BIND:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.leds_power, 1);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led0, 1);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.foreign_lna0_ctrl,
|
||||
1);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_BIND */
|
||||
|
||||
case BOARD_EVENT_SCAN_PROG:
|
||||
|
@ -218,20 +140,8 @@ int sms_board_event(struct smscore_device_t *coredev,
|
|||
case BOARD_EVENT_EMERGENCY_WARNING_SIGNAL:
|
||||
break; /* BOARD_EVENT_EMERGENCY_WARNING_SIGNAL */
|
||||
case BOARD_EVENT_FE_LOCK:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 1);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_FE_LOCK */
|
||||
case BOARD_EVENT_FE_UNLOCK:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_FE_UNLOCK */
|
||||
case BOARD_EVENT_DEMOD_LOCK:
|
||||
break; /* BOARD_EVENT_DEMOD_LOCK */
|
||||
|
@ -248,20 +158,8 @@ int sms_board_event(struct smscore_device_t *coredev,
|
|||
case BOARD_EVENT_RECEPTION_LOST_0:
|
||||
break; /* BOARD_EVENT_RECEPTION_LOST_0 */
|
||||
case BOARD_EVENT_MULTIPLEX_OK:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 1);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_MULTIPLEX_OK */
|
||||
case BOARD_EVENT_MULTIPLEX_ERRORS:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_MULTIPLEX_ERRORS */
|
||||
|
||||
default:
|
||||
|
|
|
@ -816,7 +816,7 @@ int smscore_set_device_mode(struct smscore_device_t *coredev, int mode)
|
|||
|
||||
sms_debug("set device mode to %d", mode);
|
||||
if (coredev->device_flags & SMS_DEVICE_FAMILY2) {
|
||||
if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_RAW_TUNER) {
|
||||
if (mode < DEVICE_MODE_DVBT || mode >= DEVICE_MODE_RAW_TUNER) {
|
||||
sms_err("invalid mode specified %d", mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -920,6 +920,8 @@ source "drivers/media/video/pwc/Kconfig"
|
|||
config USB_ZR364XX
|
||||
tristate "USB ZR364XX Camera support"
|
||||
depends on VIDEO_V4L2
|
||||
select VIDEOBUF_GEN
|
||||
select VIDEOBUF_VMALLOC
|
||||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port.
|
||||
|
|
|
@ -992,7 +992,7 @@ static int accept_bwqcam(struct parport *port)
|
|||
|
||||
if (parport[0] && strncmp(parport[0], "auto", 4) != 0) {
|
||||
/* user gave parport parameters */
|
||||
for(n=0; parport[n] && n<MAX_CAMS; n++){
|
||||
for (n = 0; n < MAX_CAMS && parport[n]; n++) {
|
||||
char *ep;
|
||||
unsigned long r;
|
||||
r = simple_strtoul(parport[n], &ep, 0);
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "cx18-driver.h"
|
||||
#include "cx18-cards.h"
|
||||
|
@ -317,7 +318,7 @@ int cx18_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c)
|
|||
idx = p.audio_properties & 0x03;
|
||||
/* The audio clock of the digitizer must match the codec sample
|
||||
rate otherwise you get some very strange effects. */
|
||||
if (idx < sizeof(freqs))
|
||||
if (idx < ARRAY_SIZE(freqs))
|
||||
cx18_call_all(cx, audio, s_clock_freq, freqs[idx]);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -1715,6 +1715,8 @@ static struct video_device cx23885_mpeg_template = {
|
|||
.fops = &mpeg_fops,
|
||||
.ioctl_ops = &mpeg_ioctl_ops,
|
||||
.minor = -1,
|
||||
.tvnorms = CX23885_NORMS,
|
||||
.current_norm = V4L2_STD_NTSC_M,
|
||||
};
|
||||
|
||||
void cx23885_417_unregister(struct cx23885_dev *dev)
|
||||
|
|
|
@ -3003,6 +3003,14 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
|
|||
case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
|
||||
ctl->demod = XC3028_FE_OREN538;
|
||||
break;
|
||||
case CX88_BOARD_GENIATECH_X8000_MT:
|
||||
/* FIXME: For this board, the xc3028 never recovers after being
|
||||
powered down (the reset GPIO probably is not set properly).
|
||||
We don't have access to the hardware so we cannot determine
|
||||
which GPIO is used for xc3028, so just disable power xc3028
|
||||
power management for now */
|
||||
ctl->disable_power_mgmt = 1;
|
||||
break;
|
||||
case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
|
||||
case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
|
||||
case CX88_BOARD_PROLINK_PV_8000GT:
|
||||
|
|
|
@ -501,6 +501,7 @@ static struct zl10353_config cx88_pinnacle_hybrid_pctv = {
|
|||
static struct zl10353_config cx88_geniatech_x8000_mt = {
|
||||
.demod_address = (0x1e >> 1),
|
||||
.no_tuner = 1,
|
||||
.disable_i2c_gate_ctrl = 1,
|
||||
};
|
||||
|
||||
static struct s5h1411_config dvico_fusionhdtv7_config = {
|
||||
|
|
|
@ -116,6 +116,10 @@ static int cx8802_start_dma(struct cx8802_dev *dev,
|
|||
udelay(100);
|
||||
break;
|
||||
case CX88_BOARD_HAUPPAUGE_HVR1300:
|
||||
/* Enable MPEG parallel IO and video signal pins */
|
||||
cx_write(MO_PINMUX_IO, 0x88);
|
||||
cx_write(TS_SOP_STAT, 0);
|
||||
cx_write(TS_VALERR_CNTRL, 0);
|
||||
break;
|
||||
case CX88_BOARD_PINNACLE_PCTV_HD_800i:
|
||||
/* Enable MPEG parallel IO and video signal pins */
|
||||
|
|
|
@ -218,7 +218,7 @@ static struct em28xx_reg_seq silvercrest_reg_seq[] = {
|
|||
struct em28xx_board em28xx_boards[] = {
|
||||
[EM2750_BOARD_UNKNOWN] = {
|
||||
.name = "EM2710/EM2750/EM2751 webcam grabber",
|
||||
.xclk = EM28XX_XCLK_FREQUENCY_48MHZ,
|
||||
.xclk = EM28XX_XCLK_FREQUENCY_20MHZ,
|
||||
.tuner_type = TUNER_ABSENT,
|
||||
.is_webcam = 1,
|
||||
.input = { {
|
||||
|
@ -622,22 +622,27 @@ struct em28xx_board em28xx_boards[] = {
|
|||
},
|
||||
[EM2861_BOARD_PLEXTOR_PX_TV100U] = {
|
||||
.name = "Plextor ConvertX PX-TV100U",
|
||||
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
||||
.tuner_type = TUNER_TNF_5335MF,
|
||||
.xclk = EM28XX_XCLK_I2S_MSB_TIMING |
|
||||
EM28XX_XCLK_FREQUENCY_12MHZ,
|
||||
.tda9887_conf = TDA9887_PRESENT,
|
||||
.decoder = EM28XX_TVP5150,
|
||||
.has_msp34xx = 1,
|
||||
.input = { {
|
||||
.type = EM28XX_VMUX_TELEVISION,
|
||||
.vmux = TVP5150_COMPOSITE0,
|
||||
.amux = EM28XX_AMUX_LINE_IN,
|
||||
.gpio = pinnacle_hybrid_pro_analog,
|
||||
}, {
|
||||
.type = EM28XX_VMUX_COMPOSITE1,
|
||||
.vmux = TVP5150_COMPOSITE1,
|
||||
.amux = EM28XX_AMUX_LINE_IN,
|
||||
.gpio = pinnacle_hybrid_pro_analog,
|
||||
}, {
|
||||
.type = EM28XX_VMUX_SVIDEO,
|
||||
.vmux = TVP5150_SVIDEO,
|
||||
.amux = EM28XX_AMUX_LINE_IN,
|
||||
.gpio = pinnacle_hybrid_pro_analog,
|
||||
} },
|
||||
},
|
||||
|
||||
|
@ -1544,6 +1549,8 @@ struct usb_device_id em28xx_id_table[] = {
|
|||
.driver_info = EM2750_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0x2800),
|
||||
.driver_info = EM2800_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0x2710),
|
||||
.driver_info = EM2820_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0x2820),
|
||||
.driver_info = EM2820_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0x2821),
|
||||
|
@ -1761,6 +1768,7 @@ static int em28xx_hint_sensor(struct em28xx *dev)
|
|||
__be16 version_be;
|
||||
u16 version;
|
||||
|
||||
/* Micron sensor detection */
|
||||
dev->i2c_client.addr = 0xba >> 1;
|
||||
cmd = 0;
|
||||
i2c_master_send(&dev->i2c_client, &cmd, 1);
|
||||
|
@ -1769,15 +1777,27 @@ static int em28xx_hint_sensor(struct em28xx *dev)
|
|||
return -EINVAL;
|
||||
|
||||
version = be16_to_cpu(version_be);
|
||||
|
||||
switch (version) {
|
||||
case 0x8243: /* mt9v011 640x480 1.3 Mpix sensor */
|
||||
case 0x8232: /* mt9v011 640x480 1.3 Mpix sensor */
|
||||
case 0x8243: /* mt9v011 rev B 640x480 1.3 Mpix sensor */
|
||||
dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
|
||||
em28xx_set_model(dev);
|
||||
|
||||
sensor_name = "mt9v011";
|
||||
dev->em28xx_sensor = EM28XX_MT9V011;
|
||||
dev->sensor_xres = 640;
|
||||
dev->sensor_yres = 480;
|
||||
dev->sensor_xtal = 6300000;
|
||||
/*
|
||||
* FIXME: mt9v011 uses I2S speed as xtal clk - at least with
|
||||
* the Silvercrest cam I have here for testing - for higher
|
||||
* resolutions, a high clock cause horizontal artifacts, so we
|
||||
* need to use a lower xclk frequency.
|
||||
* Yet, it would be possible to adjust xclk depending on the
|
||||
* desired resolution, since this affects directly the
|
||||
* frame rate.
|
||||
*/
|
||||
dev->board.xclk = EM28XX_XCLK_FREQUENCY_4_3MHZ;
|
||||
dev->sensor_xtal = 4300000;
|
||||
|
||||
/* probably means GRGB 16 bit bayer */
|
||||
dev->vinmode = 0x0d;
|
||||
|
@ -1786,6 +1806,8 @@ static int em28xx_hint_sensor(struct em28xx *dev)
|
|||
break;
|
||||
case 0x8431:
|
||||
dev->model = EM2750_BOARD_UNKNOWN;
|
||||
em28xx_set_model(dev);
|
||||
|
||||
sensor_name = "mt9m001";
|
||||
dev->em28xx_sensor = EM28XX_MT9M001;
|
||||
em28xx_initialize_mt9m001(dev);
|
||||
|
@ -1802,6 +1824,9 @@ static int em28xx_hint_sensor(struct em28xx *dev)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Setup webcam defaults */
|
||||
em28xx_pre_card_setup(dev);
|
||||
|
||||
em28xx_errdev("Sensor is %s, using model %s entry.\n",
|
||||
sensor_name, em28xx_boards[dev->model].name);
|
||||
|
||||
|
@ -1813,60 +1838,6 @@ static int em28xx_hint_sensor(struct em28xx *dev)
|
|||
*/
|
||||
void em28xx_pre_card_setup(struct em28xx *dev)
|
||||
{
|
||||
int rc;
|
||||
|
||||
em28xx_set_model(dev);
|
||||
|
||||
em28xx_info("Identified as %s (card=%d)\n",
|
||||
dev->board.name, dev->model);
|
||||
|
||||
/* Set the default GPO/GPIO for legacy devices */
|
||||
dev->reg_gpo_num = EM2880_R04_GPO;
|
||||
dev->reg_gpio_num = EM28XX_R08_GPIO;
|
||||
|
||||
dev->wait_after_write = 5;
|
||||
|
||||
/* Based on the Chip ID, set the device configuration */
|
||||
rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
|
||||
if (rc > 0) {
|
||||
dev->chip_id = rc;
|
||||
|
||||
switch (dev->chip_id) {
|
||||
case CHIP_ID_EM2750:
|
||||
em28xx_info("chip ID is em2750\n");
|
||||
break;
|
||||
case CHIP_ID_EM2820:
|
||||
em28xx_info("chip ID is em2710 or em2820\n");
|
||||
break;
|
||||
case CHIP_ID_EM2840:
|
||||
em28xx_info("chip ID is em2840\n");
|
||||
break;
|
||||
case CHIP_ID_EM2860:
|
||||
em28xx_info("chip ID is em2860\n");
|
||||
break;
|
||||
case CHIP_ID_EM2870:
|
||||
em28xx_info("chip ID is em2870\n");
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
case CHIP_ID_EM2874:
|
||||
em28xx_info("chip ID is em2874\n");
|
||||
dev->reg_gpio_num = EM2874_R80_GPIO;
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
case CHIP_ID_EM2883:
|
||||
em28xx_info("chip ID is em2882/em2883\n");
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
default:
|
||||
em28xx_info("em28xx chip ID = %d\n", dev->chip_id);
|
||||
}
|
||||
}
|
||||
|
||||
/* Prepopulate cached GPO register content */
|
||||
rc = em28xx_read_reg(dev, dev->reg_gpo_num);
|
||||
if (rc >= 0)
|
||||
dev->reg_gpo = rc;
|
||||
|
||||
/* Set the initial XCLK and I2C clock values based on the board
|
||||
definition */
|
||||
em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
|
||||
|
@ -1876,9 +1847,8 @@ void em28xx_pre_card_setup(struct em28xx *dev)
|
|||
/* request some modules */
|
||||
switch (dev->model) {
|
||||
case EM2861_BOARD_PLEXTOR_PX_TV100U:
|
||||
/* FIXME guess */
|
||||
/* Turn on analog audio output */
|
||||
em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
|
||||
/* Sets the msp34xx I2S speed */
|
||||
dev->i2s_speed = 2048000;
|
||||
break;
|
||||
case EM2861_BOARD_KWORLD_PVRTV_300U:
|
||||
case EM2880_BOARD_KWORLD_DVB_305U:
|
||||
|
@ -2216,7 +2186,20 @@ void em28xx_register_i2c_ir(struct em28xx *dev)
|
|||
|
||||
void em28xx_card_setup(struct em28xx *dev)
|
||||
{
|
||||
em28xx_set_model(dev);
|
||||
/*
|
||||
* If the device can be a webcam, seek for a sensor.
|
||||
* If sensor is not found, then it isn't a webcam.
|
||||
*/
|
||||
if (dev->board.is_webcam) {
|
||||
if (em28xx_hint_sensor(dev) < 0)
|
||||
dev->board.is_webcam = 0;
|
||||
else
|
||||
dev->progressive = 1;
|
||||
} else
|
||||
em28xx_set_model(dev);
|
||||
|
||||
em28xx_info("Identified as %s (card=%d)\n",
|
||||
dev->board.name, dev->model);
|
||||
|
||||
dev->tuner_type = em28xx_boards[dev->model].tuner_type;
|
||||
if (em28xx_boards[dev->model].tuner_addr)
|
||||
|
@ -2290,10 +2273,6 @@ void em28xx_card_setup(struct em28xx *dev)
|
|||
em28xx_gpio_set(dev, dev->board.tuner_gpio);
|
||||
em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
|
||||
break;
|
||||
case EM2820_BOARD_SILVERCREST_WEBCAM:
|
||||
/* FIXME: need to document the registers bellow */
|
||||
em28xx_write_reg(dev, 0x0d, 0x42);
|
||||
em28xx_write_reg(dev, 0x13, 0x08);
|
||||
}
|
||||
|
||||
if (dev->board.has_snapshot_button)
|
||||
|
@ -2433,7 +2412,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
int minor)
|
||||
{
|
||||
struct em28xx *dev = *devhandle;
|
||||
int retval = -ENOMEM;
|
||||
int retval;
|
||||
int errCode;
|
||||
|
||||
dev->udev = udev;
|
||||
|
@ -2450,6 +2429,58 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
dev->em28xx_read_reg_req = em28xx_read_reg_req;
|
||||
dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
|
||||
|
||||
em28xx_set_model(dev);
|
||||
|
||||
/* Set the default GPO/GPIO for legacy devices */
|
||||
dev->reg_gpo_num = EM2880_R04_GPO;
|
||||
dev->reg_gpio_num = EM28XX_R08_GPIO;
|
||||
|
||||
dev->wait_after_write = 5;
|
||||
|
||||
/* Based on the Chip ID, set the device configuration */
|
||||
retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
|
||||
if (retval > 0) {
|
||||
dev->chip_id = retval;
|
||||
|
||||
switch (dev->chip_id) {
|
||||
case CHIP_ID_EM2710:
|
||||
em28xx_info("chip ID is em2710\n");
|
||||
break;
|
||||
case CHIP_ID_EM2750:
|
||||
em28xx_info("chip ID is em2750\n");
|
||||
break;
|
||||
case CHIP_ID_EM2820:
|
||||
em28xx_info("chip ID is em2820 (or em2710)\n");
|
||||
break;
|
||||
case CHIP_ID_EM2840:
|
||||
em28xx_info("chip ID is em2840\n");
|
||||
break;
|
||||
case CHIP_ID_EM2860:
|
||||
em28xx_info("chip ID is em2860\n");
|
||||
break;
|
||||
case CHIP_ID_EM2870:
|
||||
em28xx_info("chip ID is em2870\n");
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
case CHIP_ID_EM2874:
|
||||
em28xx_info("chip ID is em2874\n");
|
||||
dev->reg_gpio_num = EM2874_R80_GPIO;
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
case CHIP_ID_EM2883:
|
||||
em28xx_info("chip ID is em2882/em2883\n");
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
default:
|
||||
em28xx_info("em28xx chip ID = %d\n", dev->chip_id);
|
||||
}
|
||||
}
|
||||
|
||||
/* Prepopulate cached GPO register content */
|
||||
retval = em28xx_read_reg(dev, dev->reg_gpo_num);
|
||||
if (retval >= 0)
|
||||
dev->reg_gpo = retval;
|
||||
|
||||
em28xx_pre_card_setup(dev);
|
||||
|
||||
if (!dev->board.is_em2800) {
|
||||
|
@ -2484,14 +2515,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
dev->vinmode = 0x10;
|
||||
dev->vinctl = 0x11;
|
||||
|
||||
/*
|
||||
* If the device can be a webcam, seek for a sensor.
|
||||
* If sensor is not found, then it isn't a webcam.
|
||||
*/
|
||||
if (dev->board.is_webcam)
|
||||
if (em28xx_hint_sensor(dev) < 0)
|
||||
dev->board.is_webcam = 0;
|
||||
|
||||
/* Do board specific init and eeprom reading */
|
||||
em28xx_card_setup(dev);
|
||||
|
||||
|
|
|
@ -632,6 +632,9 @@ int em28xx_capture_start(struct em28xx *dev, int start)
|
|||
return rc;
|
||||
}
|
||||
|
||||
if (dev->board.is_webcam)
|
||||
rc = em28xx_write_reg(dev, 0x13, 0x0c);
|
||||
|
||||
/* enable video capture */
|
||||
rc = em28xx_write_reg(dev, 0x48, 0x00);
|
||||
|
||||
|
@ -720,7 +723,10 @@ int em28xx_resolution_set(struct em28xx *dev)
|
|||
{
|
||||
int width, height;
|
||||
width = norm_maxw(dev);
|
||||
height = norm_maxh(dev) >> 1;
|
||||
height = norm_maxh(dev);
|
||||
|
||||
if (!dev->progressive)
|
||||
height >>= norm_maxh(dev);
|
||||
|
||||
em28xx_set_outfmt(dev);
|
||||
|
||||
|
|
|
@ -478,7 +478,6 @@ static int dvb_init(struct em28xx *dev)
|
|||
}
|
||||
break;
|
||||
case EM2880_BOARD_KWORLD_DVB_310U:
|
||||
case EM2880_BOARD_EMPIRE_DUAL_TV:
|
||||
dvb->frontend = dvb_attach(zl10353_attach,
|
||||
&em28xx_zl10353_with_xc3028,
|
||||
&dev->i2c_adap);
|
||||
|
@ -488,6 +487,7 @@ static int dvb_init(struct em28xx *dev)
|
|||
}
|
||||
break;
|
||||
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
|
||||
case EM2880_BOARD_EMPIRE_DUAL_TV:
|
||||
dvb->frontend = dvb_attach(zl10353_attach,
|
||||
&em28xx_zl10353_xc3028_no_i2c_gate,
|
||||
&dev->i2c_adap);
|
||||
|
|
|
@ -176,7 +176,8 @@
|
|||
|
||||
/* FIXME: Need to be populated with the other chip ID's */
|
||||
enum em28xx_chip_id {
|
||||
CHIP_ID_EM2820 = 18, /* Also used by em2710 */
|
||||
CHIP_ID_EM2710 = 17,
|
||||
CHIP_ID_EM2820 = 18, /* Also used by some em2710 */
|
||||
CHIP_ID_EM2840 = 20,
|
||||
CHIP_ID_EM2750 = 33,
|
||||
CHIP_ID_EM2860 = 34,
|
||||
|
|
|
@ -194,15 +194,24 @@ static void em28xx_copy_video(struct em28xx *dev,
|
|||
startread = p;
|
||||
remain = len;
|
||||
|
||||
/* Interlaces frame */
|
||||
if (buf->top_field)
|
||||
if (dev->progressive)
|
||||
fieldstart = outp;
|
||||
else
|
||||
fieldstart = outp + bytesperline;
|
||||
else {
|
||||
/* Interlaces two half frames */
|
||||
if (buf->top_field)
|
||||
fieldstart = outp;
|
||||
else
|
||||
fieldstart = outp + bytesperline;
|
||||
}
|
||||
|
||||
linesdone = dma_q->pos / bytesperline;
|
||||
currlinedone = dma_q->pos % bytesperline;
|
||||
offset = linesdone * bytesperline * 2 + currlinedone;
|
||||
|
||||
if (dev->progressive)
|
||||
offset = linesdone * bytesperline + currlinedone;
|
||||
else
|
||||
offset = linesdone * bytesperline * 2 + currlinedone;
|
||||
|
||||
startwrite = fieldstart + offset;
|
||||
lencopy = bytesperline - currlinedone;
|
||||
lencopy = lencopy > remain ? remain : lencopy;
|
||||
|
@ -376,7 +385,7 @@ static inline int em28xx_isoc_copy(struct em28xx *dev, struct urb *urb)
|
|||
em28xx_isocdbg("Video frame %d, length=%i, %s\n", p[2],
|
||||
len, (p[2] & 1) ? "odd" : "even");
|
||||
|
||||
if (!(p[2] & 1)) {
|
||||
if (dev->progressive || !(p[2] & 1)) {
|
||||
if (buf != NULL)
|
||||
buffer_filled(dev, dma_q, buf);
|
||||
get_next_buf(dma_q, &buf);
|
||||
|
@ -689,7 +698,10 @@ static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
|
|||
f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
|
||||
/* FIXME: TOP? NONE? BOTTOM? ALTENATE? */
|
||||
f->fmt.pix.field = dev->interlaced ?
|
||||
if (dev->progressive)
|
||||
f->fmt.pix.field = V4L2_FIELD_NONE;
|
||||
else
|
||||
f->fmt.pix.field = dev->interlaced ?
|
||||
V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
|
||||
|
||||
mutex_unlock(&dev->lock);
|
||||
|
@ -753,7 +765,11 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
|
|||
f->fmt.pix.bytesperline = (dev->width * fmt->depth + 7) >> 3;
|
||||
f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * height;
|
||||
f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
f->fmt.pix.field = V4L2_FIELD_INTERLACED;
|
||||
if (dev->progressive)
|
||||
f->fmt.pix.field = V4L2_FIELD_NONE;
|
||||
else
|
||||
f->fmt.pix.field = dev->interlaced ?
|
||||
V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -846,6 +862,41 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int vidioc_g_parm(struct file *file, void *priv,
|
||||
struct v4l2_streamparm *p)
|
||||
{
|
||||
struct em28xx_fh *fh = priv;
|
||||
struct em28xx *dev = fh->dev;
|
||||
int rc = 0;
|
||||
|
||||
if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
return -EINVAL;
|
||||
|
||||
if (dev->board.is_webcam)
|
||||
rc = v4l2_device_call_until_err(&dev->v4l2_dev, 0,
|
||||
video, g_parm, p);
|
||||
else
|
||||
v4l2_video_std_frame_period(dev->norm,
|
||||
&p->parm.capture.timeperframe);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int vidioc_s_parm(struct file *file, void *priv,
|
||||
struct v4l2_streamparm *p)
|
||||
{
|
||||
struct em28xx_fh *fh = priv;
|
||||
struct em28xx *dev = fh->dev;
|
||||
|
||||
if (!dev->board.is_webcam)
|
||||
return -EINVAL;
|
||||
|
||||
if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
return -EINVAL;
|
||||
|
||||
return v4l2_device_call_until_err(&dev->v4l2_dev, 0, video, s_parm, p);
|
||||
}
|
||||
|
||||
static const char *iname[] = {
|
||||
[EM28XX_VMUX_COMPOSITE1] = "Composite1",
|
||||
[EM28XX_VMUX_COMPOSITE2] = "Composite2",
|
||||
|
@ -1624,6 +1675,7 @@ static int em28xx_v4l2_open(struct file *filp)
|
|||
struct em28xx *dev;
|
||||
enum v4l2_buf_type fh_type;
|
||||
struct em28xx_fh *fh;
|
||||
enum v4l2_field field;
|
||||
|
||||
dev = em28xx_get_device(minor, &fh_type, &radio);
|
||||
|
||||
|
@ -1665,8 +1717,13 @@ static int em28xx_v4l2_open(struct file *filp)
|
|||
|
||||
dev->users++;
|
||||
|
||||
if (dev->progressive)
|
||||
field = V4L2_FIELD_NONE;
|
||||
else
|
||||
field = V4L2_FIELD_INTERLACED;
|
||||
|
||||
videobuf_queue_vmalloc_init(&fh->vb_vidq, &em28xx_video_qops,
|
||||
NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
|
||||
NULL, &dev->slock, fh->type, field,
|
||||
sizeof(struct em28xx_buffer), fh);
|
||||
|
||||
mutex_unlock(&dev->lock);
|
||||
|
@ -1885,6 +1942,8 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = {
|
|||
.vidioc_qbuf = vidioc_qbuf,
|
||||
.vidioc_dqbuf = vidioc_dqbuf,
|
||||
.vidioc_s_std = vidioc_s_std,
|
||||
.vidioc_g_parm = vidioc_g_parm,
|
||||
.vidioc_s_parm = vidioc_s_parm,
|
||||
.vidioc_enum_input = vidioc_enum_input,
|
||||
.vidioc_g_input = vidioc_g_input,
|
||||
.vidioc_s_input = vidioc_s_input,
|
||||
|
|
|
@ -484,6 +484,9 @@ struct em28xx {
|
|||
int sensor_xres, sensor_yres;
|
||||
int sensor_xtal;
|
||||
|
||||
/* Allows progressive (e. g. non-interlaced) mode */
|
||||
int progressive;
|
||||
|
||||
/* Vinmode/Vinctl used at the driver */
|
||||
int vinmode, vinctl;
|
||||
|
||||
|
|
|
@ -1220,6 +1220,8 @@ static const struct video_device hdpvr_video_template = {
|
|||
V4L2_STD_PAL_G | V4L2_STD_PAL_H | V4L2_STD_PAL_I |
|
||||
V4L2_STD_PAL_D | V4L2_STD_PAL_M | V4L2_STD_PAL_N |
|
||||
V4L2_STD_PAL_60,
|
||||
.current_norm = V4L2_STD_NTSC | V4L2_STD_PAL_M |
|
||||
V4L2_STD_PAL_60,
|
||||
};
|
||||
|
||||
int hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent,
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче