mirror of
https://github.com/torvalds/linux.git
synced 2024-12-12 06:02:38 +00:00
Merge branch 'from-linus' into upstream
This commit is contained in:
commit
3b38f317e5
@ -259,9 +259,9 @@ sub dibusb {
|
||||
}
|
||||
|
||||
sub nxt2002 {
|
||||
my $sourcefile = "Broadband4PC_4_2_11.zip";
|
||||
my $sourcefile = "Technisat_DVB-PC_4_4_COMPACT.zip";
|
||||
my $url = "http://www.bbti.us/download/windows/$sourcefile";
|
||||
my $hash = "c6d2ea47a8f456d887ada0cfb718ff2a";
|
||||
my $hash = "476befae8c7c1bb9648954060b1eec1f";
|
||||
my $outfile = "dvb-fe-nxt2002.fw";
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||
|
||||
@ -269,8 +269,8 @@ sub nxt2002 {
|
||||
|
||||
wgetfile($sourcefile, $url);
|
||||
unzip($sourcefile, $tmpdir);
|
||||
verify("$tmpdir/SkyNETU.sys", $hash);
|
||||
extract("$tmpdir/SkyNETU.sys", 375832, 5908, $outfile);
|
||||
verify("$tmpdir/SkyNET.sys", $hash);
|
||||
extract("$tmpdir/SkyNET.sys", 331624, 5908, $outfile);
|
||||
|
||||
$outfile;
|
||||
}
|
||||
|
@ -57,6 +57,15 @@ Who: Jody McIntyre <scjody@steamballoon.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: sbp2: module parameter "force_inquiry_hack"
|
||||
When: July 2006
|
||||
Why: Superceded by parameter "workarounds". Both parameters are meant to be
|
||||
used ad-hoc and for single devices only, i.e. not in modprobe.conf,
|
||||
therefore the impact of this feature replacement should be low.
|
||||
Who: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: Video4Linux API 1 ioctls and video_decoder.h from Video devices.
|
||||
When: July 2006
|
||||
Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
|
||||
|
@ -105,20 +105,3 @@
|
||||
on the setup, so I think that the choice on what firmware to make
|
||||
persistent should be left to userspace.
|
||||
|
||||
- Why register_firmware()+__init can be useful:
|
||||
- For boot devices needing firmware.
|
||||
- To make the transition easier:
|
||||
The firmware can be declared __init and register_firmware()
|
||||
called on module_init. Then the firmware is warranted to be
|
||||
there even if "firmware hotplug userspace" is not there yet or
|
||||
it doesn't yet provide the needed firmware.
|
||||
Once the firmware is widely available in userspace, it can be
|
||||
removed from the kernel. Or made optional (CONFIG_.*_FIRMWARE).
|
||||
|
||||
In either case, if firmware hotplug support is there, it can move the
|
||||
firmware out of kernel memory into the real filesystem for later
|
||||
usage.
|
||||
|
||||
Note: If persistence is implemented on top of initramfs,
|
||||
register_firmware() may not be appropriate.
|
||||
|
||||
|
@ -5,8 +5,6 @@
|
||||
*
|
||||
* Sample code on how to use request_firmware() from drivers.
|
||||
*
|
||||
* Note that register_firmware() is currently useless.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -17,11 +15,6 @@
|
||||
|
||||
#include "linux/firmware.h"
|
||||
|
||||
#define WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE
|
||||
#ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE
|
||||
char __init inkernel_firmware[] = "let's say that this is firmware\n";
|
||||
#endif
|
||||
|
||||
static struct device ghost_device = {
|
||||
.bus_id = "ghost0",
|
||||
};
|
||||
@ -104,10 +97,6 @@ static void sample_probe_async(void)
|
||||
|
||||
static int sample_init(void)
|
||||
{
|
||||
#ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE
|
||||
register_firmware("sample_driver_fw", inkernel_firmware,
|
||||
sizeof(inkernel_firmware));
|
||||
#endif
|
||||
device_initialize(&ghost_device);
|
||||
/* since there is no real hardware insertion I just call the
|
||||
* sample probe functions here */
|
||||
|
@ -36,6 +36,9 @@ timeout or margin. The simplest way to ping the watchdog is to write
|
||||
some data to the device. So a very simple watchdog daemon would look
|
||||
like this:
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
int main(int argc, const char *argv[]) {
|
||||
int fd=open("/dev/watchdog",O_WRONLY);
|
||||
if (fd==-1) {
|
||||
|
29
MAINTAINERS
29
MAINTAINERS
@ -40,11 +40,20 @@ trivial patch so apply some common sense.
|
||||
PLEASE document known bugs. If it doesn't work for everything
|
||||
or does something very odd once a month document it.
|
||||
|
||||
PLEASE remember that submissions must be made under the terms
|
||||
of the OSDL certificate of contribution
|
||||
(http://www.osdl.org/newsroom/press_releases/2004/2004_05_24_dco.html)
|
||||
and should include a Signed-off-by: line.
|
||||
|
||||
6. Make sure you have the right to send any changes you make. If you
|
||||
do changes at work you may find your employer owns the patch
|
||||
not you.
|
||||
|
||||
7. Happy hacking.
|
||||
7. When sending security related changes or reports to a maintainer
|
||||
please Cc: security@kernel.org, especially if the maintainer
|
||||
does not respond.
|
||||
|
||||
8. Happy hacking.
|
||||
|
||||
-----------------------------------
|
||||
|
||||
@ -969,7 +978,7 @@ S: Maintained
|
||||
EXT3 FILE SYSTEM
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@osdl.org, adilger@clusterfs.com
|
||||
L: ext3-users@redhat.com
|
||||
L: ext2-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
F71805F HARDWARE MONITORING DRIVER
|
||||
@ -1530,12 +1539,28 @@ W: http://jfs.sourceforge.net/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git
|
||||
S: Supported
|
||||
|
||||
JOURNALLING LAYER FOR BLOCK DEVICS (JBD)
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@osdl.org
|
||||
L: ext2-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
KCONFIG
|
||||
P: Roman Zippel
|
||||
M: zippel@linux-m68k.org
|
||||
L: kbuild-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
KDUMP
|
||||
P: Vivek Goyal
|
||||
M: vgoyal@in.ibm.com
|
||||
P: Haren Myneni
|
||||
M: hbabu@us.ibm.com
|
||||
L: fastboot@lists.osdl.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://lse.sourceforge.net/kdump/
|
||||
S: Maintained
|
||||
|
||||
KERNEL AUTOMOUNTER (AUTOFS)
|
||||
P: H. Peter Anvin
|
||||
M: hpa@zytor.com
|
||||
|
@ -95,7 +95,10 @@ static void __init mainstone_init_irq(void)
|
||||
for(irq = MAINSTONE_IRQ(0); irq <= MAINSTONE_IRQ(15); irq++) {
|
||||
set_irq_chip(irq, &mainstone_irq_chip);
|
||||
set_irq_handler(irq, do_level_IRQ);
|
||||
set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
|
||||
if (irq == MAINSTONE_IRQ(10) || irq == MAINSTONE_IRQ(14))
|
||||
set_irq_flags(irq, IRQF_VALID | IRQF_PROBE | IRQF_NOAUTOEN);
|
||||
else
|
||||
set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
|
||||
}
|
||||
set_irq_flags(MAINSTONE_IRQ(8), 0);
|
||||
set_irq_flags(MAINSTONE_IRQ(12), 0);
|
||||
|
@ -59,8 +59,7 @@ ENTRY(s3c2410_cpu_suspend)
|
||||
mrc p15, 0, r5, c13, c0, 0 @ PID
|
||||
mrc p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||
mrc p15, 0, r7, c2, c0, 0 @ translation table base address
|
||||
mrc p15, 0, r8, c2, c0, 0 @ auxiliary control register
|
||||
mrc p15, 0, r9, c1, c0, 0 @ control register
|
||||
mrc p15, 0, r8, c1, c0, 0 @ control register
|
||||
|
||||
stmia r0, { r4 - r13 }
|
||||
|
||||
@ -165,7 +164,6 @@ ENTRY(s3c2410_cpu_resume)
|
||||
mcr p15, 0, r5, c13, c0, 0 @ PID
|
||||
mcr p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||
mcr p15, 0, r7, c2, c0, 0 @ translation table base
|
||||
mcr p15, 0, r8, c1, c1, 0 @ auxilliary control
|
||||
|
||||
#ifdef CONFIG_DEBUG_RESUME
|
||||
mov r3, #'R'
|
||||
@ -173,7 +171,7 @@ ENTRY(s3c2410_cpu_resume)
|
||||
#endif
|
||||
|
||||
ldr r2, =resume_with_mmu
|
||||
mcr p15, 0, r9, c1, c0, 0 @ turn on MMU, etc
|
||||
mcr p15, 0, r8, c1, c0, 0 @ turn on MMU, etc
|
||||
nop @ second-to-last before mmu
|
||||
mov pc, r2 @ go back to virtual address
|
||||
|
||||
|
@ -1341,6 +1341,14 @@ int __init APIC_init_uniprocessor (void)
|
||||
|
||||
connect_bsp_APIC();
|
||||
|
||||
/*
|
||||
* Hack: In case of kdump, after a crash, kernel might be booting
|
||||
* on a cpu with non-zero lapic id. But boot_cpu_physical_apicid
|
||||
* might be zero if read from MP tables. Get it from LAPIC.
|
||||
*/
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID));
|
||||
#endif
|
||||
phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid);
|
||||
|
||||
setup_local_APIC();
|
||||
|
@ -130,9 +130,8 @@ static inline int print_addr_and_symbol(unsigned long addr, char *log_lvl,
|
||||
print_symbol("%s", addr);
|
||||
|
||||
printed = (printed + 1) % CONFIG_STACK_BACKTRACE_COLS;
|
||||
|
||||
if (printed)
|
||||
printk(" ");
|
||||
printk(" ");
|
||||
else
|
||||
printk("\n");
|
||||
|
||||
@ -212,7 +211,6 @@ static void show_stack_log_lvl(struct task_struct *task, unsigned long *esp,
|
||||
}
|
||||
|
||||
stack = esp;
|
||||
printk(log_lvl);
|
||||
for(i = 0; i < kstack_depth_to_print; i++) {
|
||||
if (kstack_end(stack))
|
||||
break;
|
||||
|
@ -651,7 +651,7 @@ void __init mem_init(void)
|
||||
* Specifically, in the case of x86, we will always add
|
||||
* memory to the highmem for now.
|
||||
*/
|
||||
#ifdef CONFIG_HOTPLUG_MEMORY
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
||||
int add_memory(u64 start, u64 size)
|
||||
{
|
||||
|
@ -134,7 +134,7 @@ CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
|
||||
CONFIG_NUMA=y
|
||||
CONFIG_NODES_SHIFT=8
|
||||
CONFIG_NODES_SHIFT=10
|
||||
CONFIG_VIRTUAL_MEM_MAP=y
|
||||
CONFIG_HOLES_IN_ZONE=y
|
||||
CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
|
||||
@ -1159,7 +1159,7 @@ CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
|
@ -416,7 +416,7 @@ iosapic_end_level_irq (unsigned int irq)
|
||||
ia64_vector vec = irq_to_vector(irq);
|
||||
struct iosapic_rte_info *rte;
|
||||
|
||||
move_irq(irq);
|
||||
move_native_irq(irq);
|
||||
list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list)
|
||||
iosapic_eoi(rte->addr, vec);
|
||||
}
|
||||
@ -458,7 +458,7 @@ iosapic_ack_edge_irq (unsigned int irq)
|
||||
{
|
||||
irq_desc_t *idesc = irq_descp(irq);
|
||||
|
||||
move_irq(irq);
|
||||
move_native_irq(irq);
|
||||
/*
|
||||
* Once we have recorded IRQ_PENDING already, we can mask the
|
||||
* interrupt for real. This prevents IRQ storms from unhandled
|
||||
|
@ -101,7 +101,6 @@ void set_irq_affinity_info (unsigned int irq, int hwid, int redir)
|
||||
|
||||
if (irq < NR_IRQS) {
|
||||
irq_affinity[irq] = mask;
|
||||
set_irq_info(irq, mask);
|
||||
irq_redir[irq] = (char) (redir & 0xff);
|
||||
}
|
||||
}
|
||||
|
@ -272,7 +272,7 @@ static inline void stop_hz_timer(void)
|
||||
next = next_timer_interrupt();
|
||||
do {
|
||||
seq = read_seqbegin_irqsave(&xtime_lock, flags);
|
||||
timer = (__u64)(next - jiffies) + jiffies_64;
|
||||
timer = (__u64 next) - (__u64 jiffies) + jiffies_64;
|
||||
} while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
|
||||
todval = -1ULL;
|
||||
/* Be careful about overflows. */
|
||||
|
@ -79,6 +79,7 @@ sys_call_table:
|
||||
/*285*/ .long sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64
|
||||
/*290*/ .long sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
/*295*/ .long sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare
|
||||
/*300*/ .long sys_set_robust_list, sys_get_robust_list
|
||||
|
||||
#ifdef CONFIG_SUNOS_EMUL
|
||||
/* Now the SunOS syscall table. */
|
||||
@ -190,6 +191,6 @@ sunos_sys_table:
|
||||
/*290*/ .long sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.long sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.long sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.long sunos_nosys
|
||||
.long sunos_nosys, sunos_nosys, sunos_nosys
|
||||
|
||||
#endif
|
||||
|
@ -78,8 +78,9 @@ sys_call_table32:
|
||||
.word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid
|
||||
/*280*/ .word sys32_tee, sys_add_key, sys_request_key, sys_keyctl, compat_sys_openat
|
||||
.word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64
|
||||
/*285*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
/*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
.word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare
|
||||
/*300*/ .word compat_sys_set_robust_list, compat_sys_get_robust_list
|
||||
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
@ -147,8 +148,9 @@ sys_call_table:
|
||||
.word sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify, sys_mq_getsetattr, sys_waitid
|
||||
/*280*/ .word sys_tee, sys_add_key, sys_request_key, sys_keyctl, sys_openat
|
||||
.word sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64
|
||||
/*285*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
/*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
.word sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare
|
||||
/*300*/ .word sys_set_robust_list, sys_get_robust_list
|
||||
|
||||
#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \
|
||||
defined(CONFIG_SOLARIS_EMUL_MODULE)
|
||||
@ -261,5 +263,5 @@ sunos_sys_table:
|
||||
/*290*/ .word sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.word sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.word sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.word sunos_nosys
|
||||
.word sunos_nosys, sunos_nosys, sunos_nosys
|
||||
#endif
|
||||
|
@ -514,13 +514,13 @@ static void __kprobes resume_execution(struct kprobe *p,
|
||||
*tos = orig_rip + (*tos - copy_rip);
|
||||
break;
|
||||
case 0xff:
|
||||
if ((*insn & 0x30) == 0x10) {
|
||||
if ((insn[1] & 0x30) == 0x10) {
|
||||
/* call absolute, indirect */
|
||||
/* Fix return addr; rip is correct. */
|
||||
next_rip = regs->rip;
|
||||
*tos = orig_rip + (*tos - copy_rip);
|
||||
} else if (((*insn & 0x31) == 0x20) || /* jmp near, absolute indirect */
|
||||
((*insn & 0x31) == 0x21)) { /* jmp far, absolute indirect */
|
||||
} else if (((insn[1] & 0x31) == 0x20) || /* jmp near, absolute indirect */
|
||||
((insn[1] & 0x31) == 0x21)) { /* jmp far, absolute indirect */
|
||||
/* rip is correct. */
|
||||
next_rip = regs->rip;
|
||||
}
|
||||
|
@ -86,18 +86,9 @@ firmware_timeout_store(struct class *class, const char *buf, size_t count)
|
||||
static CLASS_ATTR(timeout, 0644, firmware_timeout_show, firmware_timeout_store);
|
||||
|
||||
static void fw_class_dev_release(struct class_device *class_dev);
|
||||
int firmware_class_uevent(struct class_device *dev, char **envp,
|
||||
int num_envp, char *buffer, int buffer_size);
|
||||
|
||||
static struct class firmware_class = {
|
||||
.name = "firmware",
|
||||
.uevent = firmware_class_uevent,
|
||||
.release = fw_class_dev_release,
|
||||
};
|
||||
|
||||
int
|
||||
firmware_class_uevent(struct class_device *class_dev, char **envp,
|
||||
int num_envp, char *buffer, int buffer_size)
|
||||
static int firmware_class_uevent(struct class_device *class_dev, char **envp,
|
||||
int num_envp, char *buffer, int buffer_size)
|
||||
{
|
||||
struct firmware_priv *fw_priv = class_get_devdata(class_dev);
|
||||
int i = 0, len = 0;
|
||||
@ -116,6 +107,12 @@ firmware_class_uevent(struct class_device *class_dev, char **envp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct class firmware_class = {
|
||||
.name = "firmware",
|
||||
.uevent = firmware_class_uevent,
|
||||
.release = fw_class_dev_release,
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
firmware_loading_show(struct class_device *class_dev, char *buf)
|
||||
{
|
||||
@ -493,25 +490,6 @@ release_firmware(const struct firmware *fw)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* register_firmware: - provide a firmware image for later usage
|
||||
* @name: name of firmware image file
|
||||
* @data: buffer pointer for the firmware image
|
||||
* @size: size of the data buffer area
|
||||
*
|
||||
* Make sure that @data will be available by requesting firmware @name.
|
||||
*
|
||||
* Note: This will not be possible until some kind of persistence
|
||||
* is available.
|
||||
**/
|
||||
void
|
||||
register_firmware(const char *name, const u8 *data, size_t size)
|
||||
{
|
||||
/* This is meaningless without firmware caching, so until we
|
||||
* decide if firmware caching is reasonable just leave it as a
|
||||
* noop */
|
||||
}
|
||||
|
||||
/* Async support */
|
||||
struct firmware_work {
|
||||
struct work_struct work;
|
||||
@ -630,4 +608,3 @@ module_exit(firmware_class_exit);
|
||||
EXPORT_SYMBOL(release_firmware);
|
||||
EXPORT_SYMBOL(request_firmware);
|
||||
EXPORT_SYMBOL(request_firmware_nowait);
|
||||
EXPORT_SYMBOL(register_firmware);
|
||||
|
@ -33,11 +33,6 @@
|
||||
* 82801E (C-ICH) : document number 273599-001, 273645-002,
|
||||
* 82801EB (ICH5) : document number 252516-001, 252517-003,
|
||||
* 82801ER (ICH5R) : document number 252516-001, 252517-003,
|
||||
* 82801FB (ICH6) : document number 301473-002, 301474-007,
|
||||
* 82801FR (ICH6R) : document number 301473-002, 301474-007,
|
||||
* 82801FBM (ICH6-M) : document number 301473-002, 301474-007,
|
||||
* 82801FW (ICH6W) : document number 301473-001, 301474-007,
|
||||
* 82801FRW (ICH6RW) : document number 301473-001, 301474-007
|
||||
*
|
||||
* 20000710 Nils Faerber
|
||||
* Initial Version 0.01
|
||||
@ -66,6 +61,10 @@
|
||||
* 20050807 Wim Van Sebroeck <wim@iguana.be>
|
||||
* 0.08 Make sure that the watchdog is only "armed" when started.
|
||||
* (Kernel Bug 4251)
|
||||
* 20060416 Wim Van Sebroeck <wim@iguana.be>
|
||||
* 0.09 Remove support for the ICH6, ICH6R, ICH6-M, ICH6W and ICH6RW and
|
||||
* ICH7 chipsets. (See Kernel Bug 6031 - other code will support these
|
||||
* chipsets)
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -90,7 +89,7 @@
|
||||
#include "i8xx_tco.h"
|
||||
|
||||
/* Module and version information */
|
||||
#define TCO_VERSION "0.08"
|
||||
#define TCO_VERSION "0.09"
|
||||
#define TCO_MODULE_NAME "i8xx TCO timer"
|
||||
#define TCO_DRIVER_NAME TCO_MODULE_NAME ", v" TCO_VERSION
|
||||
#define PFX TCO_MODULE_NAME ": "
|
||||
@ -391,11 +390,6 @@ static struct pci_device_id i8xx_tco_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_2, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ 0, }, /* End of list */
|
||||
};
|
||||
|
@ -423,6 +423,12 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
|
||||
if (tmr_atboot && started == 0) {
|
||||
printk(KERN_INFO PFX "Starting Watchdog Timer\n");
|
||||
s3c2410wdt_start();
|
||||
} else if (!tmr_atboot) {
|
||||
/* if we're not enabling the watchdog, then ensure it is
|
||||
* disabled if it has been left running from the bootloader
|
||||
* or other source */
|
||||
|
||||
s3c2410wdt_stop();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -377,7 +377,7 @@ static int __init sc1200wdt_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
printk(banner);
|
||||
printk("%s\n", banner);
|
||||
|
||||
spin_lock_init(&sc1200wdt_lock);
|
||||
sema_init(&open_sem, 1);
|
||||
|
@ -553,6 +553,8 @@ pmac_ide_init_hwif_ports(hw_regs_t *hw,
|
||||
|
||||
if (irq != NULL)
|
||||
*irq = pmac_ide[ix].irq;
|
||||
|
||||
hw->dev = &pmac_ide[ix].mdev->ofdev.dev;
|
||||
}
|
||||
|
||||
#define PMAC_IDE_REG(x) ((void __iomem *)(IDE_DATA_REG+(x)))
|
||||
|
@ -553,7 +553,7 @@ static void ohci_initialize(struct ti_ohci *ohci)
|
||||
* register content.
|
||||
* To actually enable physical responses is the job of our interrupt
|
||||
* handler which programs the physical request filter. */
|
||||
reg_write(ohci, OHCI1394_PhyUpperBound, 0xffff0000);
|
||||
reg_write(ohci, OHCI1394_PhyUpperBound, 0x01000000);
|
||||
|
||||
DBGMSG("physUpperBoundOffset=%08x",
|
||||
reg_read(ohci, OHCI1394_PhyUpperBound));
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/fs.h>
|
||||
@ -117,7 +118,8 @@ MODULE_PARM_DESC(serialize_io, "Serialize I/O coming from scsi drivers (default
|
||||
*/
|
||||
static int max_sectors = SBP2_MAX_SECTORS;
|
||||
module_param(max_sectors, int, 0444);
|
||||
MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported (default = 255)");
|
||||
MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported (default = "
|
||||
__stringify(SBP2_MAX_SECTORS) ")");
|
||||
|
||||
/*
|
||||
* Exclusive login to sbp2 device? In most cases, the sbp2 driver should
|
||||
@ -135,18 +137,45 @@ module_param(exclusive_login, int, 0644);
|
||||
MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device (default = 1)");
|
||||
|
||||
/*
|
||||
* SCSI inquiry hack for really badly behaved sbp2 devices. Turn this on
|
||||
* if your sbp2 device is not properly handling the SCSI inquiry command.
|
||||
* This hack makes the inquiry look more like a typical MS Windows inquiry
|
||||
* by enforcing 36 byte inquiry and avoiding access to mode_sense page 8.
|
||||
* If any of the following workarounds is required for your device to work,
|
||||
* please submit the kernel messages logged by sbp2 to the linux1394-devel
|
||||
* mailing list.
|
||||
*
|
||||
* If force_inquiry_hack=1 is required for your device to work,
|
||||
* please submit the logged sbp2_firmware_revision value of this device to
|
||||
* the linux1394-devel mailing list.
|
||||
* - 128kB max transfer
|
||||
* Limit transfer size. Necessary for some old bridges.
|
||||
*
|
||||
* - 36 byte inquiry
|
||||
* When scsi_mod probes the device, let the inquiry command look like that
|
||||
* from MS Windows.
|
||||
*
|
||||
* - skip mode page 8
|
||||
* Suppress sending of mode_sense for mode page 8 if the device pretends to
|
||||
* support the SCSI Primary Block commands instead of Reduced Block Commands.
|
||||
*
|
||||
* - fix capacity
|
||||
* Tell sd_mod to correct the last sector number reported by read_capacity.
|
||||
* Avoids access beyond actual disk limits on devices with an off-by-one bug.
|
||||
* Don't use this with devices which don't have this bug.
|
||||
*
|
||||
* - override internal blacklist
|
||||
* Instead of adding to the built-in blacklist, use only the workarounds
|
||||
* specified in the module load parameter.
|
||||
* Useful if a blacklist entry interfered with a non-broken device.
|
||||
*/
|
||||
static int sbp2_default_workarounds;
|
||||
module_param_named(workarounds, sbp2_default_workarounds, int, 0644);
|
||||
MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0"
|
||||
", 128kB max transfer = " __stringify(SBP2_WORKAROUND_128K_MAX_TRANS)
|
||||
", 36 byte inquiry = " __stringify(SBP2_WORKAROUND_INQUIRY_36)
|
||||
", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8)
|
||||
", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY)
|
||||
", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
|
||||
", or a combination)");
|
||||
|
||||
/* legacy parameter */
|
||||
static int force_inquiry_hack;
|
||||
module_param(force_inquiry_hack, int, 0644);
|
||||
MODULE_PARM_DESC(force_inquiry_hack, "Force SCSI inquiry hack (default = 0)");
|
||||
MODULE_PARM_DESC(force_inquiry_hack, "Deprecated, use 'workarounds'");
|
||||
|
||||
/*
|
||||
* Export information about protocols/devices supported by this driver.
|
||||
@ -266,14 +295,55 @@ static struct hpsb_protocol_driver sbp2_driver = {
|
||||
};
|
||||
|
||||
/*
|
||||
* List of device firmwares that require the inquiry hack.
|
||||
* Yields a few false positives but did not break other devices so far.
|
||||
* List of devices with known bugs.
|
||||
*
|
||||
* The firmware_revision field, masked with 0xffff00, is the best indicator
|
||||
* for the type of bridge chip of a device. It yields a few false positives
|
||||
* but this did not break correctly behaving devices so far.
|
||||
*/
|
||||
static u32 sbp2_broken_inquiry_list[] = {
|
||||
0x00002800, /* Stefan Richter <stefanr@s5r6.in-berlin.de> */
|
||||
/* DViCO Momobay CX-1 */
|
||||
0x00000200 /* Andreas Plesch <plesch@fas.harvard.edu> */
|
||||
/* QPS Fire DVDBurner */
|
||||
static const struct {
|
||||
u32 firmware_revision;
|
||||
u32 model_id;
|
||||
unsigned workarounds;
|
||||
} sbp2_workarounds_table[] = {
|
||||
/* TSB42AA9 */ {
|
||||
.firmware_revision = 0x002800,
|
||||
.workarounds = SBP2_WORKAROUND_INQUIRY_36 |
|
||||
SBP2_WORKAROUND_MODE_SENSE_8,
|
||||
},
|
||||
/* Initio bridges, actually only needed for some older ones */ {
|
||||
.firmware_revision = 0x000200,
|
||||
.workarounds = SBP2_WORKAROUND_INQUIRY_36,
|
||||
},
|
||||
/* Symbios bridge */ {
|
||||
.firmware_revision = 0xa0b800,
|
||||
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
||||
},
|
||||
/*
|
||||
* Note about the following Apple iPod blacklist entries:
|
||||
*
|
||||
* There are iPods (2nd gen, 3rd gen) with model_id==0. Since our
|
||||
* matching logic treats 0 as a wildcard, we cannot match this ID
|
||||
* without rewriting the matching routine. Fortunately these iPods
|
||||
* do not feature the read_capacity bug according to one report.
|
||||
* Read_capacity behaviour as well as model_id could change due to
|
||||
* Apple-supplied firmware updates though.
|
||||
*/
|
||||
/* iPod 4th generation */ {
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model_id = 0x000021,
|
||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
},
|
||||
/* iPod mini */ {
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model_id = 0x000023,
|
||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
},
|
||||
/* iPod Photo */ {
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model_id = 0x00007e,
|
||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
}
|
||||
};
|
||||
|
||||
/**************************************
|
||||
@ -765,11 +835,16 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud
|
||||
|
||||
/* Register the status FIFO address range. We could use the same FIFO
|
||||
* for targets at different nodes. However we need different FIFOs per
|
||||
* target in order to support multi-unit devices. */
|
||||
* target in order to support multi-unit devices.
|
||||
* The FIFO is located out of the local host controller's physical range
|
||||
* but, if possible, within the posted write area. Status writes will
|
||||
* then be performed as unified transactions. This slightly reduces
|
||||
* bandwidth usage, and some Prolific based devices seem to require it.
|
||||
*/
|
||||
scsi_id->status_fifo_addr = hpsb_allocate_and_register_addrspace(
|
||||
&sbp2_highlevel, ud->ne->host, &sbp2_ops,
|
||||
sizeof(struct sbp2_status_block), sizeof(quadlet_t),
|
||||
~0ULL, ~0ULL);
|
||||
0x010000000000ULL, CSR1212_ALL_SPACE_END);
|
||||
if (!scsi_id->status_fifo_addr) {
|
||||
SBP2_ERR("failed to allocate status FIFO address range");
|
||||
goto failed_alloc;
|
||||
@ -1450,7 +1525,8 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id,
|
||||
struct csr1212_dentry *dentry;
|
||||
u64 management_agent_addr;
|
||||
u32 command_set_spec_id, command_set, unit_characteristics,
|
||||
firmware_revision, workarounds;
|
||||
firmware_revision;
|
||||
unsigned workarounds;
|
||||
int i;
|
||||
|
||||
SBP2_DEBUG_ENTER();
|
||||
@ -1506,12 +1582,8 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id,
|
||||
case SBP2_FIRMWARE_REVISION_KEY:
|
||||
/* Firmware revision */
|
||||
firmware_revision = kv->value.immediate;
|
||||
if (force_inquiry_hack)
|
||||
SBP2_INFO("sbp2_firmware_revision = %x",
|
||||
(unsigned int)firmware_revision);
|
||||
else
|
||||
SBP2_DEBUG("sbp2_firmware_revision = %x",
|
||||
(unsigned int)firmware_revision);
|
||||
SBP2_DEBUG("sbp2_firmware_revision = %x",
|
||||
(unsigned int)firmware_revision);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1519,41 +1591,44 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id,
|
||||
}
|
||||
}
|
||||
|
||||
/* This is the start of our broken device checking. We try to hack
|
||||
* around oddities and known defects. */
|
||||
workarounds = 0x0;
|
||||
|
||||
/* If the vendor id is 0xa0b8 (Symbios vendor id), then we have a
|
||||
* bridge with 128KB max transfer size limitation. For sanity, we
|
||||
* only voice this when the current max_sectors setting
|
||||
* exceeds the 128k limit. By default, that is not the case.
|
||||
*
|
||||
* It would be really nice if we could detect this before the scsi
|
||||
* host gets initialized. That way we can down-force the
|
||||
* max_sectors to account for it. That is not currently
|
||||
* possible. */
|
||||
if ((firmware_revision & 0xffff00) ==
|
||||
SBP2_128KB_BROKEN_FIRMWARE &&
|
||||
(max_sectors * 512) > (128*1024)) {
|
||||
SBP2_WARN("Node " NODE_BUS_FMT ": Bridge only supports 128KB max transfer size.",
|
||||
NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid));
|
||||
SBP2_WARN("WARNING: Current max_sectors setting is larger than 128KB (%d sectors)!",
|
||||
max_sectors);
|
||||
workarounds |= SBP2_BREAKAGE_128K_MAX_TRANSFER;
|
||||
workarounds = sbp2_default_workarounds;
|
||||
if (force_inquiry_hack) {
|
||||
SBP2_WARN("force_inquiry_hack is deprecated. "
|
||||
"Use parameter 'workarounds' instead.");
|
||||
workarounds |= SBP2_WORKAROUND_INQUIRY_36;
|
||||
}
|
||||
|
||||
/* Check for a blacklisted set of devices that require us to force
|
||||
* a 36 byte host inquiry. This can be overriden as a module param
|
||||
* (to force all hosts). */
|
||||
for (i = 0; i < ARRAY_SIZE(sbp2_broken_inquiry_list); i++) {
|
||||
if ((firmware_revision & 0xffff00) ==
|
||||
sbp2_broken_inquiry_list[i]) {
|
||||
SBP2_WARN("Node " NODE_BUS_FMT ": Using 36byte inquiry workaround",
|
||||
NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid));
|
||||
workarounds |= SBP2_BREAKAGE_INQUIRY_HACK;
|
||||
break; /* No need to continue. */
|
||||
if (!(workarounds & SBP2_WORKAROUND_OVERRIDE))
|
||||
for (i = 0; i < ARRAY_SIZE(sbp2_workarounds_table); i++) {
|
||||
if (sbp2_workarounds_table[i].firmware_revision &&
|
||||
sbp2_workarounds_table[i].firmware_revision !=
|
||||
(firmware_revision & 0xffff00))
|
||||
continue;
|
||||
if (sbp2_workarounds_table[i].model_id &&
|
||||
sbp2_workarounds_table[i].model_id != ud->model_id)
|
||||
continue;
|
||||
workarounds |= sbp2_workarounds_table[i].workarounds;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (workarounds)
|
||||
SBP2_INFO("Workarounds for node " NODE_BUS_FMT ": 0x%x "
|
||||
"(firmware_revision 0x%06x, vendor_id 0x%06x,"
|
||||
" model_id 0x%06x)",
|
||||
NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid),
|
||||
workarounds, firmware_revision,
|
||||
ud->vendor_id ? ud->vendor_id : ud->ne->vendor_id,
|
||||
ud->model_id);
|
||||
|
||||
/* We would need one SCSI host template for each target to adjust
|
||||
* max_sectors on the fly, therefore warn only. */
|
||||
if (workarounds & SBP2_WORKAROUND_128K_MAX_TRANS &&
|
||||
(max_sectors * 512) > (128 * 1024))
|
||||
SBP2_WARN("Node " NODE_BUS_FMT ": Bridge only supports 128KB "
|
||||
"max transfer size. WARNING: Current max_sectors "
|
||||
"setting is larger than 128KB (%d sectors)",
|
||||
NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid),
|
||||
max_sectors);
|
||||
|
||||
/* If this is a logical unit directory entry, process the parent
|
||||
* to get the values. */
|
||||
@ -2447,19 +2522,25 @@ static int sbp2scsi_slave_alloc(struct scsi_device *sdev)
|
||||
|
||||
scsi_id->sdev = sdev;
|
||||
|
||||
if (force_inquiry_hack ||
|
||||
scsi_id->workarounds & SBP2_BREAKAGE_INQUIRY_HACK) {
|
||||
if (scsi_id->workarounds & SBP2_WORKAROUND_INQUIRY_36)
|
||||
sdev->inquiry_len = 36;
|
||||
sdev->skip_ms_page_8 = 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sbp2scsi_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
struct scsi_id_instance_data *scsi_id =
|
||||
(struct scsi_id_instance_data *)sdev->host->hostdata[0];
|
||||
|
||||
blk_queue_dma_alignment(sdev->request_queue, (512 - 1));
|
||||
sdev->use_10_for_rw = 1;
|
||||
sdev->use_10_for_ms = 1;
|
||||
|
||||
if (sdev->type == TYPE_DISK &&
|
||||
scsi_id->workarounds & SBP2_WORKAROUND_MODE_SENSE_8)
|
||||
sdev->skip_ms_page_8 = 1;
|
||||
if (scsi_id->workarounds & SBP2_WORKAROUND_FIX_CAPACITY)
|
||||
sdev->fix_capacity = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2603,7 +2684,9 @@ static int sbp2_module_init(void)
|
||||
scsi_driver_template.cmd_per_lun = 1;
|
||||
}
|
||||
|
||||
/* Set max sectors (module load option). Default is 255 sectors. */
|
||||
if (sbp2_default_workarounds & SBP2_WORKAROUND_128K_MAX_TRANS &&
|
||||
(max_sectors * 512) > (128 * 1024))
|
||||
max_sectors = 128 * 1024 / 512;
|
||||
scsi_driver_template.max_sectors = max_sectors;
|
||||
|
||||
/* Register our high level driver with 1394 stack */
|
||||
|
@ -226,11 +226,6 @@ struct sbp2_status_block {
|
||||
#define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e
|
||||
#define SBP2_SW_VERSION_ENTRY 0x00010483
|
||||
|
||||
/*
|
||||
* Other misc defines
|
||||
*/
|
||||
#define SBP2_128KB_BROKEN_FIRMWARE 0xa0b800
|
||||
|
||||
/*
|
||||
* SCSI specific stuff
|
||||
*/
|
||||
@ -239,6 +234,13 @@ struct sbp2_status_block {
|
||||
#define SBP2_MAX_SECTORS 255 /* Max sectors supported */
|
||||
#define SBP2_MAX_CMDS 8 /* This should be safe */
|
||||
|
||||
/* Flags for detected oddities and brokeness */
|
||||
#define SBP2_WORKAROUND_128K_MAX_TRANS 0x1
|
||||
#define SBP2_WORKAROUND_INQUIRY_36 0x2
|
||||
#define SBP2_WORKAROUND_MODE_SENSE_8 0x4
|
||||
#define SBP2_WORKAROUND_FIX_CAPACITY 0x8
|
||||
#define SBP2_WORKAROUND_OVERRIDE 0x100
|
||||
|
||||
/* This is the two dma types we use for cmd_dma below */
|
||||
enum cmd_dma_types {
|
||||
CMD_DMA_NONE,
|
||||
@ -268,10 +270,6 @@ struct sbp2_command_info {
|
||||
|
||||
};
|
||||
|
||||
/* A list of flags for detected oddities and brokeness. */
|
||||
#define SBP2_BREAKAGE_128K_MAX_TRANSFER 0x1
|
||||
#define SBP2_BREAKAGE_INQUIRY_HACK 0x2
|
||||
|
||||
struct sbp2scsi_host_info;
|
||||
|
||||
/*
|
||||
@ -345,7 +343,7 @@ struct scsi_id_instance_data {
|
||||
struct Scsi_Host *scsi_host;
|
||||
|
||||
/* Device specific workarounds/brokeness */
|
||||
u32 workarounds;
|
||||
unsigned workarounds;
|
||||
};
|
||||
|
||||
/* Sbp2 host data structure (one per IEEE1394 host) */
|
||||
|
@ -211,8 +211,10 @@ void ib_umem_release_on_close(struct ib_device *dev, struct ib_umem *umem)
|
||||
*/
|
||||
|
||||
work = kmalloc(sizeof *work, GFP_KERNEL);
|
||||
if (!work)
|
||||
if (!work) {
|
||||
mmput(mm);
|
||||
return;
|
||||
}
|
||||
|
||||
INIT_WORK(&work->work, ib_umem_account, work);
|
||||
work->mm = mm;
|
||||
|
@ -182,7 +182,7 @@ struct mthca_cmd_context {
|
||||
u8 status;
|
||||
};
|
||||
|
||||
static int fw_cmd_doorbell = 1;
|
||||
static int fw_cmd_doorbell = 0;
|
||||
module_param(fw_cmd_doorbell, int, 0644);
|
||||
MODULE_PARM_DESC(fw_cmd_doorbell, "post FW commands through doorbell page if nonzero "
|
||||
"(and supported by FW)");
|
||||
|
@ -1727,23 +1727,7 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
|
||||
|
||||
ind = qp->rq.next_ind;
|
||||
|
||||
for (nreq = 0; wr; ++nreq, wr = wr->next) {
|
||||
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
|
||||
nreq = 0;
|
||||
|
||||
doorbell[0] = cpu_to_be32((qp->rq.next_ind << qp->rq.wqe_shift) | size0);
|
||||
doorbell[1] = cpu_to_be32(qp->qpn << 8);
|
||||
|
||||
wmb();
|
||||
|
||||
mthca_write64(doorbell,
|
||||
dev->kar + MTHCA_RECEIVE_DOORBELL,
|
||||
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
|
||||
|
||||
qp->rq.head += MTHCA_TAVOR_MAX_WQES_PER_RECV_DB;
|
||||
size0 = 0;
|
||||
}
|
||||
|
||||
for (nreq = 0; wr; wr = wr->next) {
|
||||
if (mthca_wq_overflow(&qp->rq, nreq, qp->ibqp.recv_cq)) {
|
||||
mthca_err(dev, "RQ %06x full (%u head, %u tail,"
|
||||
" %d max, %d nreq)\n", qp->qpn,
|
||||
@ -1797,6 +1781,23 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
|
||||
++ind;
|
||||
if (unlikely(ind >= qp->rq.max))
|
||||
ind -= qp->rq.max;
|
||||
|
||||
++nreq;
|
||||
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
|
||||
nreq = 0;
|
||||
|
||||
doorbell[0] = cpu_to_be32((qp->rq.next_ind << qp->rq.wqe_shift) | size0);
|
||||
doorbell[1] = cpu_to_be32(qp->qpn << 8);
|
||||
|
||||
wmb();
|
||||
|
||||
mthca_write64(doorbell,
|
||||
dev->kar + MTHCA_RECEIVE_DOORBELL,
|
||||
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
|
||||
|
||||
qp->rq.head += MTHCA_TAVOR_MAX_WQES_PER_RECV_DB;
|
||||
size0 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
|
@ -340,7 +340,10 @@ static void srp_disconnect_target(struct srp_target_port *target)
|
||||
/* XXX should send SRP_I_LOGOUT request */
|
||||
|
||||
init_completion(&target->done);
|
||||
ib_send_cm_dreq(target->cm_id, NULL, 0);
|
||||
if (ib_send_cm_dreq(target->cm_id, NULL, 0)) {
|
||||
printk(KERN_DEBUG PFX "Sending CM DREQ failed\n");
|
||||
return;
|
||||
}
|
||||
wait_for_completion(&target->done);
|
||||
}
|
||||
|
||||
@ -351,7 +354,6 @@ static void srp_remove_work(void *target_ptr)
|
||||
spin_lock_irq(target->scsi_host->host_lock);
|
||||
if (target->state != SRP_TARGET_DEAD) {
|
||||
spin_unlock_irq(target->scsi_host->host_lock);
|
||||
scsi_host_put(target->scsi_host);
|
||||
return;
|
||||
}
|
||||
target->state = SRP_TARGET_REMOVED;
|
||||
@ -365,8 +367,6 @@ static void srp_remove_work(void *target_ptr)
|
||||
ib_destroy_cm_id(target->cm_id);
|
||||
srp_free_target_ib(target);
|
||||
scsi_host_put(target->scsi_host);
|
||||
/* And another put to really free the target port... */
|
||||
scsi_host_put(target->scsi_host);
|
||||
}
|
||||
|
||||
static int srp_connect_target(struct srp_target_port *target)
|
||||
@ -1241,7 +1241,7 @@ static int srp_reset_device(struct scsi_cmnd *scmnd)
|
||||
list_for_each_entry_safe(req, tmp, &target->req_queue, list)
|
||||
if (req->scmnd->device == scmnd->device) {
|
||||
req->scmnd->result = DID_RESET << 16;
|
||||
scmnd->scsi_done(scmnd);
|
||||
req->scmnd->scsi_done(req->scmnd);
|
||||
srp_remove_req(target, req);
|
||||
}
|
||||
|
||||
|
@ -2880,7 +2880,7 @@ isdn_tty_cmd_ATand(char **p, modem_info * info)
|
||||
p[0]++;
|
||||
i = 0;
|
||||
while (*p[0] && (strchr("0123456789,-*[]?;", *p[0])) &&
|
||||
(i < ISDN_LMSNLEN))
|
||||
(i < ISDN_LMSNLEN - 1))
|
||||
m->lmsn[i++] = *p[0]++;
|
||||
m->lmsn[i] = '\0';
|
||||
break;
|
||||
|
@ -2252,7 +2252,7 @@ action_store(mddev_t *mddev, const char *page, size_t len)
|
||||
} else {
|
||||
if (cmd_match(page, "check"))
|
||||
set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
|
||||
else if (cmd_match(page, "repair"))
|
||||
else if (!cmd_match(page, "repair"))
|
||||
return -EINVAL;
|
||||
set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
|
||||
set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
|
||||
|
@ -8,22 +8,54 @@ config VIDEO_DEV
|
||||
tristate "Video For Linux"
|
||||
---help---
|
||||
Support for audio/video capture and overlay devices and FM radio
|
||||
cards. The exact capabilities of each device vary. User tools for
|
||||
this are available from
|
||||
<ftp://ftp.uk.linux.org/pub/linux/video4linux/>.
|
||||
cards. The exact capabilities of each device vary.
|
||||
|
||||
This kernel includes support for the new Video for Linux Two API,
|
||||
(V4L2) as well as the original system. Drivers and applications
|
||||
need to be rewritten to use V4L2, but drivers for popular cards
|
||||
and applications for most video capture functions already exist.
|
||||
|
||||
Documentation for the original API is included in the file
|
||||
<file:Documentation/video4linux/API.html>. Documentation for V4L2 is
|
||||
available on the web at <http://bytesex.org/v4l/>.
|
||||
Additional info and docs are available on the web at
|
||||
<http://linuxtv.org>
|
||||
|
||||
Documentation for V4L2 is also available on the web at
|
||||
<http://bytesex.org/v4l/>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called videodev.
|
||||
|
||||
config VIDEO_V4L1
|
||||
boolean "Enable Video For Linux API 1 (DEPRECATED)"
|
||||
depends on VIDEO_DEV
|
||||
select VIDEO_V4L1_COMPAT
|
||||
default y
|
||||
---help---
|
||||
Enables a compatibility API used by most V4L2 devices to allow
|
||||
its usage with legacy applications that supports only V4L1 api.
|
||||
|
||||
If you are unsure as to whether this is required, answer Y.
|
||||
|
||||
config VIDEO_V4L1_COMPAT
|
||||
boolean "Enable Video For Linux API 1 compatible Layer"
|
||||
depends on VIDEO_DEV
|
||||
default y
|
||||
---help---
|
||||
This api were developed to be used at Kernel 2.2 and 2.4, but
|
||||
lacks support for several video standards. There are several
|
||||
drivers at kernel that still depends on it.
|
||||
|
||||
Documentation for the original API is included in the file
|
||||
<Documentation/video4linux/API.html>.
|
||||
|
||||
User tools for this are available from
|
||||
<ftp://ftp.uk.linux.org/pub/linux/video4linux/>.
|
||||
|
||||
If you are unsure as to whether this is required, answer Y.
|
||||
|
||||
config VIDEO_V4L2
|
||||
tristate
|
||||
default y
|
||||
|
||||
source "drivers/media/video/Kconfig"
|
||||
|
||||
source "drivers/media/radio/Kconfig"
|
||||
@ -65,4 +97,3 @@ config USB_DABUSB
|
||||
module will be called dabusb.
|
||||
|
||||
endmenu
|
||||
|
||||
|
@ -4,6 +4,7 @@ config VIDEO_SAA7146
|
||||
|
||||
config VIDEO_SAA7146_VV
|
||||
tristate
|
||||
select VIDEO_V4L2
|
||||
select VIDEO_BUF
|
||||
select VIDEO_VIDEOBUF
|
||||
select VIDEO_SAA7146
|
||||
|
@ -7,6 +7,7 @@ config DVB_BT8XX
|
||||
select DVB_CX24110
|
||||
select DVB_OR51211
|
||||
select DVB_LGDT330X
|
||||
select DVB_ZL10353
|
||||
select FW_LOADER
|
||||
help
|
||||
Support for PCI cards based on the Bt8xx PCI bridge. Examples are
|
||||
|
@ -902,7 +902,10 @@ static int cinergyt2_probe (struct usb_interface *intf,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, THIS_MODULE);
|
||||
if ((err = dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, THIS_MODULE)) < 0) {
|
||||
kfree(cinergyt2);
|
||||
return err;
|
||||
}
|
||||
|
||||
cinergyt2->demux.priv = cinergyt2;
|
||||
cinergyt2->demux.filternum = 256;
|
||||
|
@ -106,6 +106,8 @@ struct dvb_frontend_private {
|
||||
unsigned long tune_mode_flags;
|
||||
unsigned int delay;
|
||||
unsigned int reinitialise;
|
||||
int tone;
|
||||
int voltage;
|
||||
|
||||
/* swzigzag values */
|
||||
unsigned int state;
|
||||
@ -537,6 +539,12 @@ static int dvb_frontend_thread(void *data)
|
||||
|
||||
if (fepriv->reinitialise) {
|
||||
dvb_frontend_init(fe);
|
||||
if (fepriv->tone != -1) {
|
||||
fe->ops->set_tone(fe, fepriv->tone);
|
||||
}
|
||||
if (fepriv->voltage != -1) {
|
||||
fe->ops->set_voltage(fe, fepriv->voltage);
|
||||
}
|
||||
fepriv->reinitialise = 0;
|
||||
}
|
||||
|
||||
@ -788,6 +796,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
|
||||
case FE_SET_TONE:
|
||||
if (fe->ops->set_tone) {
|
||||
err = fe->ops->set_tone(fe, (fe_sec_tone_mode_t) parg);
|
||||
fepriv->tone = (fe_sec_tone_mode_t) parg;
|
||||
fepriv->state = FESTATE_DISEQC;
|
||||
fepriv->status = 0;
|
||||
}
|
||||
@ -796,6 +805,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
|
||||
case FE_SET_VOLTAGE:
|
||||
if (fe->ops->set_voltage) {
|
||||
err = fe->ops->set_voltage(fe, (fe_sec_voltage_t) parg);
|
||||
fepriv->voltage = (fe_sec_voltage_t) parg;
|
||||
fepriv->state = FESTATE_DISEQC;
|
||||
fepriv->status = 0;
|
||||
}
|
||||
@ -995,6 +1005,8 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
|
||||
|
||||
/* normal tune mode when opened R/W */
|
||||
fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
|
||||
fepriv->tone = -1;
|
||||
fepriv->voltage = -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -219,8 +219,6 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
|
||||
memcpy(dvbdev, template, sizeof(struct dvb_device));
|
||||
dvbdev->type = type;
|
||||
dvbdev->id = id;
|
||||
@ -231,6 +229,8 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
|
||||
list_add_tail (&dvbdev->list_head, &adap->device_list);
|
||||
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
|
||||
devfs_mk_cdev(MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)),
|
||||
S_IFCHR | S_IRUSR | S_IWUSR,
|
||||
"dvb/adapter%d/%s%d", adap->num, dnames[type], id);
|
||||
|
@ -150,6 +150,15 @@ static int cxusb_power_ctrl(struct dvb_usb_device *d, int onoff)
|
||||
return cxusb_ctrl_msg(d, CMD_POWER_OFF, &b, 1, NULL, 0);
|
||||
}
|
||||
|
||||
static int cxusb_bluebird_power_ctrl(struct dvb_usb_device *d, int onoff)
|
||||
{
|
||||
u8 b = 0;
|
||||
if (onoff)
|
||||
return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cxusb_streaming_ctrl(struct dvb_usb_device *d, int onoff)
|
||||
{
|
||||
u8 buf[2] = { 0x03, 0x00 };
|
||||
@ -544,7 +553,7 @@ static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties = {
|
||||
.size_of_priv = sizeof(struct cxusb_state),
|
||||
|
||||
.streaming_ctrl = cxusb_streaming_ctrl,
|
||||
.power_ctrl = cxusb_power_ctrl,
|
||||
.power_ctrl = cxusb_bluebird_power_ctrl,
|
||||
.frontend_attach = cxusb_lgdt3303_frontend_attach,
|
||||
.tuner_attach = cxusb_lgh064f_tuner_attach,
|
||||
|
||||
@ -589,7 +598,7 @@ static struct dvb_usb_properties cxusb_bluebird_dee1601_properties = {
|
||||
.size_of_priv = sizeof(struct cxusb_state),
|
||||
|
||||
.streaming_ctrl = cxusb_streaming_ctrl,
|
||||
.power_ctrl = cxusb_power_ctrl,
|
||||
.power_ctrl = cxusb_bluebird_power_ctrl,
|
||||
.frontend_attach = cxusb_dee1601_frontend_attach,
|
||||
.tuner_attach = cxusb_dee1601_tuner_attach,
|
||||
|
||||
@ -638,7 +647,7 @@ static struct dvb_usb_properties cxusb_bluebird_lgz201_properties = {
|
||||
.size_of_priv = sizeof(struct cxusb_state),
|
||||
|
||||
.streaming_ctrl = cxusb_streaming_ctrl,
|
||||
.power_ctrl = cxusb_power_ctrl,
|
||||
.power_ctrl = cxusb_bluebird_power_ctrl,
|
||||
.frontend_attach = cxusb_mt352_frontend_attach,
|
||||
.tuner_attach = cxusb_lgz201_tuner_attach,
|
||||
|
||||
@ -683,7 +692,7 @@ static struct dvb_usb_properties cxusb_bluebird_dtt7579_properties = {
|
||||
.size_of_priv = sizeof(struct cxusb_state),
|
||||
|
||||
.streaming_ctrl = cxusb_streaming_ctrl,
|
||||
.power_ctrl = cxusb_power_ctrl,
|
||||
.power_ctrl = cxusb_bluebird_power_ctrl,
|
||||
.frontend_attach = cxusb_mt352_frontend_attach,
|
||||
.tuner_attach = cxusb_dtt7579_tuner_attach,
|
||||
|
||||
|
@ -29,6 +29,9 @@
|
||||
#include "dvb_frontend.h"
|
||||
#include "cx24123.h"
|
||||
|
||||
#define XTAL 10111000
|
||||
|
||||
static int force_band;
|
||||
static int debug;
|
||||
#define dprintk(args...) \
|
||||
do { \
|
||||
@ -52,6 +55,7 @@ struct cx24123_state
|
||||
u32 VGAarg;
|
||||
u32 bandselectarg;
|
||||
u32 pllarg;
|
||||
u32 FILTune;
|
||||
|
||||
/* The Demod/Tuner can't easily provide these, we cache them */
|
||||
u32 currentfreq;
|
||||
@ -63,43 +67,33 @@ static struct
|
||||
{
|
||||
u32 symbolrate_low;
|
||||
u32 symbolrate_high;
|
||||
u32 VCAslope;
|
||||
u32 VCAoffset;
|
||||
u32 VGA1offset;
|
||||
u32 VGA2offset;
|
||||
u32 VCAprogdata;
|
||||
u32 VGAprogdata;
|
||||
u32 FILTune;
|
||||
} cx24123_AGC_vals[] =
|
||||
{
|
||||
{
|
||||
.symbolrate_low = 1000000,
|
||||
.symbolrate_high = 4999999,
|
||||
.VCAslope = 0x07,
|
||||
.VCAoffset = 0x0f,
|
||||
.VGA1offset = 0x1f8,
|
||||
.VGA2offset = 0x1f8,
|
||||
.VGAprogdata = (2 << 18) | (0x1f8 << 9) | 0x1f8,
|
||||
.VCAprogdata = (4 << 18) | (0x07 << 9) | 0x07,
|
||||
/* the specs recommend other values for VGA offsets,
|
||||
but tests show they are wrong */
|
||||
.VGAprogdata = (1 << 19) | (0x180 << 9) | 0x1e0,
|
||||
.VCAprogdata = (2 << 19) | (0x07 << 9) | 0x07,
|
||||
.FILTune = 0x27f /* 0.41 V */
|
||||
},
|
||||
{
|
||||
.symbolrate_low = 5000000,
|
||||
.symbolrate_high = 14999999,
|
||||
.VCAslope = 0x1f,
|
||||
.VCAoffset = 0x1f,
|
||||
.VGA1offset = 0x1e0,
|
||||
.VGA2offset = 0x180,
|
||||
.VGAprogdata = (2 << 18) | (0x180 << 9) | 0x1e0,
|
||||
.VCAprogdata = (4 << 18) | (0x07 << 9) | 0x1f,
|
||||
.VGAprogdata = (1 << 19) | (0x180 << 9) | 0x1e0,
|
||||
.VCAprogdata = (2 << 19) | (0x07 << 9) | 0x1f,
|
||||
.FILTune = 0x317 /* 0.90 V */
|
||||
},
|
||||
{
|
||||
.symbolrate_low = 15000000,
|
||||
.symbolrate_high = 45000000,
|
||||
.VCAslope = 0x3f,
|
||||
.VCAoffset = 0x3f,
|
||||
.VGA1offset = 0x180,
|
||||
.VGA2offset = 0x100,
|
||||
.VGAprogdata = (2 << 18) | (0x100 << 9) | 0x180,
|
||||
.VCAprogdata = (4 << 18) | (0x07 << 9) | 0x3f,
|
||||
.VGAprogdata = (1 << 19) | (0x100 << 9) | 0x180,
|
||||
.VCAprogdata = (2 << 19) | (0x07 << 9) | 0x3f,
|
||||
.FILTune = 0x145 /* 2.70 V */
|
||||
},
|
||||
};
|
||||
|
||||
@ -112,91 +106,80 @@ static struct
|
||||
{
|
||||
u32 freq_low;
|
||||
u32 freq_high;
|
||||
u32 bandselect;
|
||||
u32 VCOdivider;
|
||||
u32 VCOnumber;
|
||||
u32 progdata;
|
||||
} cx24123_bandselect_vals[] =
|
||||
{
|
||||
/* band 1 */
|
||||
{
|
||||
.freq_low = 950000,
|
||||
.freq_high = 1018999,
|
||||
.bandselect = 0x40,
|
||||
.VCOdivider = 4,
|
||||
.VCOnumber = 7,
|
||||
.progdata = (0 << 18) | (0 << 9) | 0x40,
|
||||
},
|
||||
{
|
||||
.freq_low = 1019000,
|
||||
.freq_high = 1074999,
|
||||
.bandselect = 0x80,
|
||||
.VCOdivider = 4,
|
||||
.VCOnumber = 8,
|
||||
.progdata = (0 << 18) | (0 << 9) | 0x80,
|
||||
.progdata = (0 << 19) | (0 << 9) | 0x40,
|
||||
},
|
||||
|
||||
/* band 2 */
|
||||
{
|
||||
.freq_low = 1075000,
|
||||
.freq_high = 1227999,
|
||||
.bandselect = 0x01,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 1,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x01,
|
||||
.freq_high = 1177999,
|
||||
.VCOdivider = 4,
|
||||
.progdata = (0 << 19) | (0 << 9) | 0x80,
|
||||
},
|
||||
|
||||
/* band 3 */
|
||||
{
|
||||
.freq_low = 1228000,
|
||||
.freq_high = 1349999,
|
||||
.bandselect = 0x02,
|
||||
.freq_low = 1178000,
|
||||
.freq_high = 1295999,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 2,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x02,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x01,
|
||||
},
|
||||
|
||||
/* band 4 */
|
||||
{
|
||||
.freq_low = 1350000,
|
||||
.freq_high = 1481999,
|
||||
.bandselect = 0x04,
|
||||
.freq_low = 1296000,
|
||||
.freq_high = 1431999,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 3,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x04,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x02,
|
||||
},
|
||||
|
||||
/* band 5 */
|
||||
{
|
||||
.freq_low = 1482000,
|
||||
.freq_high = 1595999,
|
||||
.bandselect = 0x08,
|
||||
.freq_low = 1432000,
|
||||
.freq_high = 1575999,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 4,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x08,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x04,
|
||||
},
|
||||
|
||||
/* band 6 */
|
||||
{
|
||||
.freq_low = 1596000,
|
||||
.freq_low = 1576000,
|
||||
.freq_high = 1717999,
|
||||
.bandselect = 0x10,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 5,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x10,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x08,
|
||||
},
|
||||
|
||||
/* band 7 */
|
||||
{
|
||||
.freq_low = 1718000,
|
||||
.freq_high = 1855999,
|
||||
.bandselect = 0x20,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 6,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x20,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x10,
|
||||
},
|
||||
|
||||
/* band 8 */
|
||||
{
|
||||
.freq_low = 1856000,
|
||||
.freq_high = 2035999,
|
||||
.bandselect = 0x40,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 7,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x40,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x20,
|
||||
},
|
||||
|
||||
/* band 9 */
|
||||
{
|
||||
.freq_low = 2036000,
|
||||
.freq_high = 2149999,
|
||||
.bandselect = 0x80,
|
||||
.freq_high = 2150000,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 8,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x80,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x40,
|
||||
},
|
||||
};
|
||||
|
||||
@ -207,49 +190,44 @@ static struct {
|
||||
{
|
||||
{0x00, 0x03}, /* Reset system */
|
||||
{0x00, 0x00}, /* Clear reset */
|
||||
{0x01, 0x3b}, /* Apply sensible defaults, from an i2c sniffer */
|
||||
{0x03, 0x07},
|
||||
{0x04, 0x10},
|
||||
{0x05, 0x04},
|
||||
{0x06, 0x31},
|
||||
{0x0d, 0x02},
|
||||
{0x0e, 0x03},
|
||||
{0x0f, 0xfe},
|
||||
{0x10, 0x01},
|
||||
{0x14, 0x01},
|
||||
{0x15, 0x98},
|
||||
{0x16, 0x00},
|
||||
{0x17, 0x01},
|
||||
{0x1b, 0x05},
|
||||
{0x1c, 0x80},
|
||||
{0x1d, 0x00},
|
||||
{0x1e, 0x00},
|
||||
{0x20, 0x41},
|
||||
{0x21, 0x15},
|
||||
{0x27, 0x14},
|
||||
{0x28, 0x46},
|
||||
{0x29, 0x00},
|
||||
{0x2a, 0xb0},
|
||||
{0x2b, 0x73},
|
||||
{0x2c, 0x00},
|
||||
{0x03, 0x07}, /* QPSK, DVB, Auto Acquisition (default) */
|
||||
{0x04, 0x10}, /* MPEG */
|
||||
{0x05, 0x04}, /* MPEG */
|
||||
{0x06, 0x31}, /* MPEG (default) */
|
||||
{0x0b, 0x00}, /* Freq search start point (default) */
|
||||
{0x0c, 0x00}, /* Demodulator sample gain (default) */
|
||||
{0x0d, 0x02}, /* Frequency search range = Fsymbol / 4 (default) */
|
||||
{0x0e, 0x03}, /* Default non-inverted, FEC 3/4 (default) */
|
||||
{0x0f, 0xfe}, /* FEC search mask (all supported codes) */
|
||||
{0x10, 0x01}, /* Default search inversion, no repeat (default) */
|
||||
{0x16, 0x00}, /* Enable reading of frequency */
|
||||
{0x17, 0x01}, /* Enable EsNO Ready Counter */
|
||||
{0x1c, 0x80}, /* Enable error counter */
|
||||
{0x20, 0x00}, /* Tuner burst clock rate = 500KHz */
|
||||
{0x21, 0x15}, /* Tuner burst mode, word length = 0x15 */
|
||||
{0x28, 0x00}, /* Enable FILTERV with positive pol., DiSEqC 2.x off */
|
||||
{0x29, 0x00}, /* DiSEqC LNB_DC off */
|
||||
{0x2a, 0xb0}, /* DiSEqC Parameters (default) */
|
||||
{0x2b, 0x73}, /* DiSEqC Tone Frequency (default) */
|
||||
{0x2c, 0x00}, /* DiSEqC Message (0x2c - 0x31) */
|
||||
{0x2d, 0x00},
|
||||
{0x2e, 0x00},
|
||||
{0x2f, 0x00},
|
||||
{0x30, 0x00},
|
||||
{0x31, 0x00},
|
||||
{0x32, 0x8c},
|
||||
{0x33, 0x00},
|
||||
{0x32, 0x8c}, /* DiSEqC Parameters (default) */
|
||||
{0x33, 0x00}, /* Interrupts off (0x33 - 0x34) */
|
||||
{0x34, 0x00},
|
||||
{0x35, 0x03},
|
||||
{0x36, 0x02},
|
||||
{0x37, 0x3a},
|
||||
{0x3a, 0x00}, /* Enable AGC accumulator */
|
||||
{0x44, 0x00},
|
||||
{0x45, 0x00},
|
||||
{0x46, 0x05},
|
||||
{0x56, 0x41},
|
||||
{0x57, 0xff},
|
||||
{0x67, 0x83},
|
||||
{0x35, 0x03}, /* DiSEqC Tone Amplitude (default) */
|
||||
{0x36, 0x02}, /* DiSEqC Parameters (default) */
|
||||
{0x37, 0x3a}, /* DiSEqC Parameters (default) */
|
||||
{0x3a, 0x00}, /* Enable AGC accumulator (for signal strength) */
|
||||
{0x44, 0x00}, /* Constellation (default) */
|
||||
{0x45, 0x00}, /* Symbol count (default) */
|
||||
{0x46, 0x0d}, /* Symbol rate estimator on (default) */
|
||||
{0x56, 0x41}, /* Various (default) */
|
||||
{0x57, 0xff}, /* Error Counter Window (default) */
|
||||
{0x67, 0x83}, /* Non-DCII symbol clock */
|
||||
};
|
||||
|
||||
static int cx24123_writereg(struct cx24123_state* state, int reg, int data)
|
||||
@ -258,6 +236,10 @@ static int cx24123_writereg(struct cx24123_state* state, int reg, int data)
|
||||
struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 };
|
||||
int err;
|
||||
|
||||
if (debug>1)
|
||||
printk("cx24123: %s: write reg 0x%02x, value 0x%02x\n",
|
||||
__FUNCTION__,reg, data);
|
||||
|
||||
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
|
||||
printk("%s: writereg error(err == %i, reg == 0x%02x,"
|
||||
" data == 0x%02x)\n", __FUNCTION__, err, reg, data);
|
||||
@ -274,6 +256,10 @@ static int cx24123_writelnbreg(struct cx24123_state* state, int reg, int data)
|
||||
struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = buf, .len = 2 };
|
||||
int err;
|
||||
|
||||
if (debug>1)
|
||||
printk("cx24123: %s: writeln addr=0x08, reg 0x%02x, value 0x%02x\n",
|
||||
__FUNCTION__,reg, data);
|
||||
|
||||
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
|
||||
printk("%s: writelnbreg error (err == %i, reg == 0x%02x,"
|
||||
" data == 0x%02x)\n", __FUNCTION__, err, reg, data);
|
||||
@ -303,6 +289,9 @@ static int cx24123_readreg(struct cx24123_state* state, u8 reg)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (debug>1)
|
||||
printk("cx24123: read reg 0x%02x, value 0x%02x\n",reg, ret);
|
||||
|
||||
return b1[0];
|
||||
}
|
||||
|
||||
@ -313,17 +302,23 @@ static int cx24123_readlnbreg(struct cx24123_state* state, u8 reg)
|
||||
|
||||
static int cx24123_set_inversion(struct cx24123_state* state, fe_spectral_inversion_t inversion)
|
||||
{
|
||||
u8 nom_reg = cx24123_readreg(state, 0x0e);
|
||||
u8 auto_reg = cx24123_readreg(state, 0x10);
|
||||
|
||||
switch (inversion) {
|
||||
case INVERSION_OFF:
|
||||
cx24123_writereg(state, 0x0e, cx24123_readreg(state, 0x0e) & 0x7f);
|
||||
cx24123_writereg(state, 0x10, cx24123_readreg(state, 0x10) | 0x80);
|
||||
dprintk("%s: inversion off\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg & ~0x80);
|
||||
cx24123_writereg(state, 0x10, auto_reg | 0x80);
|
||||
break;
|
||||
case INVERSION_ON:
|
||||
cx24123_writereg(state, 0x0e, cx24123_readreg(state, 0x0e) | 0x80);
|
||||
cx24123_writereg(state, 0x10, cx24123_readreg(state, 0x10) | 0x80);
|
||||
dprintk("%s: inversion on\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x80);
|
||||
cx24123_writereg(state, 0x10, auto_reg | 0x80);
|
||||
break;
|
||||
case INVERSION_AUTO:
|
||||
cx24123_writereg(state, 0x10, cx24123_readreg(state, 0x10) & 0x7f);
|
||||
dprintk("%s: inversion auto\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x10, auto_reg & ~0x80);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@ -338,92 +333,191 @@ static int cx24123_get_inversion(struct cx24123_state* state, fe_spectral_invers
|
||||
|
||||
val = cx24123_readreg(state, 0x1b) >> 7;
|
||||
|
||||
if (val == 0)
|
||||
if (val == 0) {
|
||||
dprintk("%s: read inversion off\n",__FUNCTION__);
|
||||
*inversion = INVERSION_OFF;
|
||||
else
|
||||
} else {
|
||||
dprintk("%s: read inversion on\n",__FUNCTION__);
|
||||
*inversion = INVERSION_ON;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cx24123_set_fec(struct cx24123_state* state, fe_code_rate_t fec)
|
||||
{
|
||||
u8 nom_reg = cx24123_readreg(state, 0x0e) & ~0x07;
|
||||
|
||||
if ( (fec < FEC_NONE) || (fec > FEC_AUTO) )
|
||||
fec = FEC_AUTO;
|
||||
|
||||
/* Hardware has 5/11 and 3/5 but are never unused */
|
||||
switch (fec) {
|
||||
case FEC_NONE:
|
||||
return cx24123_writereg(state, 0x0f, 0x01);
|
||||
case FEC_1_2:
|
||||
return cx24123_writereg(state, 0x0f, 0x02);
|
||||
dprintk("%s: set FEC to 1/2\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x01);
|
||||
cx24123_writereg(state, 0x0f, 0x02);
|
||||
break;
|
||||
case FEC_2_3:
|
||||
return cx24123_writereg(state, 0x0f, 0x04);
|
||||
dprintk("%s: set FEC to 2/3\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x02);
|
||||
cx24123_writereg(state, 0x0f, 0x04);
|
||||
break;
|
||||
case FEC_3_4:
|
||||
return cx24123_writereg(state, 0x0f, 0x08);
|
||||
dprintk("%s: set FEC to 3/4\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x03);
|
||||
cx24123_writereg(state, 0x0f, 0x08);
|
||||
break;
|
||||
case FEC_4_5:
|
||||
dprintk("%s: set FEC to 4/5\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x04);
|
||||
cx24123_writereg(state, 0x0f, 0x10);
|
||||
break;
|
||||
case FEC_5_6:
|
||||
return cx24123_writereg(state, 0x0f, 0x20);
|
||||
dprintk("%s: set FEC to 5/6\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x05);
|
||||
cx24123_writereg(state, 0x0f, 0x20);
|
||||
break;
|
||||
case FEC_6_7:
|
||||
dprintk("%s: set FEC to 6/7\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x06);
|
||||
cx24123_writereg(state, 0x0f, 0x40);
|
||||
break;
|
||||
case FEC_7_8:
|
||||
return cx24123_writereg(state, 0x0f, 0x80);
|
||||
dprintk("%s: set FEC to 7/8\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x07);
|
||||
cx24123_writereg(state, 0x0f, 0x80);
|
||||
break;
|
||||
case FEC_AUTO:
|
||||
return cx24123_writereg(state, 0x0f, 0xae);
|
||||
dprintk("%s: set FEC to auto\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0f, 0xfe);
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
static int cx24123_get_fec(struct cx24123_state* state, fe_code_rate_t *fec)
|
||||
{
|
||||
int ret;
|
||||
u8 val;
|
||||
|
||||
ret = cx24123_readreg (state, 0x1b);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
val = ret & 0x07;
|
||||
switch (val) {
|
||||
case 1:
|
||||
*fec = FEC_1_2;
|
||||
break;
|
||||
case 3:
|
||||
*fec = FEC_2_3;
|
||||
break;
|
||||
case 4:
|
||||
*fec = FEC_3_4;
|
||||
break;
|
||||
case 5:
|
||||
*fec = FEC_4_5;
|
||||
break;
|
||||
case 6:
|
||||
*fec = FEC_5_6;
|
||||
break;
|
||||
case 7:
|
||||
*fec = FEC_7_8;
|
||||
break;
|
||||
case 2: /* *fec = FEC_3_5; break; */
|
||||
case 0: /* *fec = FEC_5_11; break; */
|
||||
*fec = FEC_AUTO;
|
||||
break;
|
||||
default:
|
||||
*fec = FEC_NONE; // can't happen
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* fixme: Symbol rates < 3MSps may not work because of precision loss */
|
||||
static int cx24123_get_fec(struct cx24123_state* state, fe_code_rate_t *fec)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cx24123_readreg (state, 0x1b);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = ret & 0x07;
|
||||
|
||||
switch (ret) {
|
||||
case 1:
|
||||
*fec = FEC_1_2;
|
||||
break;
|
||||
case 2:
|
||||
*fec = FEC_2_3;
|
||||
break;
|
||||
case 3:
|
||||
*fec = FEC_3_4;
|
||||
break;
|
||||
case 4:
|
||||
*fec = FEC_4_5;
|
||||
break;
|
||||
case 5:
|
||||
*fec = FEC_5_6;
|
||||
break;
|
||||
case 6:
|
||||
*fec = FEC_6_7;
|
||||
break;
|
||||
case 7:
|
||||
*fec = FEC_7_8;
|
||||
break;
|
||||
default:
|
||||
/* this can happen when there's no lock */
|
||||
*fec = FEC_NONE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Approximation of closest integer of log2(a/b). It actually gives the
|
||||
lowest integer i such that 2^i >= round(a/b) */
|
||||
static u32 cx24123_int_log2(u32 a, u32 b)
|
||||
{
|
||||
u32 exp, nearest = 0;
|
||||
u32 div = a / b;
|
||||
if(a % b >= b / 2) ++div;
|
||||
if(div < (1 << 31))
|
||||
{
|
||||
for(exp = 1; div > exp; nearest++)
|
||||
exp += exp;
|
||||
}
|
||||
return nearest;
|
||||
}
|
||||
|
||||
static int cx24123_set_symbolrate(struct cx24123_state* state, u32 srate)
|
||||
{
|
||||
u32 val;
|
||||
u32 tmp, sample_rate, ratio, sample_gain;
|
||||
u8 pll_mult;
|
||||
|
||||
val = (srate / 1185) * 100;
|
||||
/* check if symbol rate is within limits */
|
||||
if ((srate > state->ops.info.symbol_rate_max) ||
|
||||
(srate < state->ops.info.symbol_rate_min))
|
||||
return -EOPNOTSUPP;;
|
||||
|
||||
/* Compensate for scaling up, by removing 17 symbols per 1Msps */
|
||||
val = val - (17 * (srate / 1000000));
|
||||
/* choose the sampling rate high enough for the required operation,
|
||||
while optimizing the power consumed by the demodulator */
|
||||
if (srate < (XTAL*2)/2)
|
||||
pll_mult = 2;
|
||||
else if (srate < (XTAL*3)/2)
|
||||
pll_mult = 3;
|
||||
else if (srate < (XTAL*4)/2)
|
||||
pll_mult = 4;
|
||||
else if (srate < (XTAL*5)/2)
|
||||
pll_mult = 5;
|
||||
else if (srate < (XTAL*6)/2)
|
||||
pll_mult = 6;
|
||||
else if (srate < (XTAL*7)/2)
|
||||
pll_mult = 7;
|
||||
else if (srate < (XTAL*8)/2)
|
||||
pll_mult = 8;
|
||||
else
|
||||
pll_mult = 9;
|
||||
|
||||
cx24123_writereg(state, 0x08, (val >> 16) & 0xff );
|
||||
cx24123_writereg(state, 0x09, (val >> 8) & 0xff );
|
||||
cx24123_writereg(state, 0x0a, (val ) & 0xff );
|
||||
|
||||
sample_rate = pll_mult * XTAL;
|
||||
|
||||
/*
|
||||
SYSSymbolRate[21:0] = (srate << 23) / sample_rate
|
||||
|
||||
We have to use 32 bit unsigned arithmetic without precision loss.
|
||||
The maximum srate is 45000000 or 0x02AEA540. This number has
|
||||
only 6 clear bits on top, hence we can shift it left only 6 bits
|
||||
at a time. Borrowed from cx24110.c
|
||||
*/
|
||||
|
||||
tmp = srate << 6;
|
||||
ratio = tmp / sample_rate;
|
||||
|
||||
tmp = (tmp % sample_rate) << 6;
|
||||
ratio = (ratio << 6) + (tmp / sample_rate);
|
||||
|
||||
tmp = (tmp % sample_rate) << 6;
|
||||
ratio = (ratio << 6) + (tmp / sample_rate);
|
||||
|
||||
tmp = (tmp % sample_rate) << 5;
|
||||
ratio = (ratio << 5) + (tmp / sample_rate);
|
||||
|
||||
|
||||
cx24123_writereg(state, 0x01, pll_mult * 6);
|
||||
|
||||
cx24123_writereg(state, 0x08, (ratio >> 16) & 0x3f );
|
||||
cx24123_writereg(state, 0x09, (ratio >> 8) & 0xff );
|
||||
cx24123_writereg(state, 0x0a, (ratio ) & 0xff );
|
||||
|
||||
/* also set the demodulator sample gain */
|
||||
sample_gain = cx24123_int_log2(sample_rate, srate);
|
||||
tmp = cx24123_readreg(state, 0x0c) & ~0xe0;
|
||||
cx24123_writereg(state, 0x0c, tmp | sample_gain << 5);
|
||||
|
||||
dprintk("%s: srate=%d, ratio=0x%08x, sample_rate=%i sample_gain=%d\n", __FUNCTION__, srate, ratio, sample_rate, sample_gain);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -437,6 +531,9 @@ static int cx24123_pll_calculate(struct dvb_frontend* fe, struct dvb_frontend_pa
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
u32 ndiv = 0, adiv = 0, vco_div = 0;
|
||||
int i = 0;
|
||||
int pump = 2;
|
||||
int band = 0;
|
||||
int num_bands = sizeof(cx24123_bandselect_vals) / sizeof(cx24123_bandselect_vals[0]);
|
||||
|
||||
/* Defaults for low freq, low rate */
|
||||
state->VCAarg = cx24123_AGC_vals[0].VCAprogdata;
|
||||
@ -444,38 +541,49 @@ static int cx24123_pll_calculate(struct dvb_frontend* fe, struct dvb_frontend_pa
|
||||
state->bandselectarg = cx24123_bandselect_vals[0].progdata;
|
||||
vco_div = cx24123_bandselect_vals[0].VCOdivider;
|
||||
|
||||
/* For the given symbolerate, determine the VCA and VGA programming bits */
|
||||
/* For the given symbol rate, determine the VCA, VGA and FILTUNE programming bits */
|
||||
for (i = 0; i < sizeof(cx24123_AGC_vals) / sizeof(cx24123_AGC_vals[0]); i++)
|
||||
{
|
||||
if ((cx24123_AGC_vals[i].symbolrate_low <= p->u.qpsk.symbol_rate) &&
|
||||
(cx24123_AGC_vals[i].symbolrate_high >= p->u.qpsk.symbol_rate) ) {
|
||||
(cx24123_AGC_vals[i].symbolrate_high >= p->u.qpsk.symbol_rate) ) {
|
||||
state->VCAarg = cx24123_AGC_vals[i].VCAprogdata;
|
||||
state->VGAarg = cx24123_AGC_vals[i].VGAprogdata;
|
||||
state->FILTune = cx24123_AGC_vals[i].FILTune;
|
||||
}
|
||||
}
|
||||
|
||||
/* For the given frequency, determine the bandselect programming bits */
|
||||
for (i = 0; i < sizeof(cx24123_bandselect_vals) / sizeof(cx24123_bandselect_vals[0]); i++)
|
||||
/* determine the band to use */
|
||||
if(force_band < 1 || force_band > num_bands)
|
||||
{
|
||||
if ((cx24123_bandselect_vals[i].freq_low <= p->frequency) &&
|
||||
(cx24123_bandselect_vals[i].freq_high >= p->frequency) ) {
|
||||
state->bandselectarg = cx24123_bandselect_vals[i].progdata;
|
||||
vco_div = cx24123_bandselect_vals[i].VCOdivider;
|
||||
for (i = 0; i < num_bands; i++)
|
||||
{
|
||||
if ((cx24123_bandselect_vals[i].freq_low <= p->frequency) &&
|
||||
(cx24123_bandselect_vals[i].freq_high >= p->frequency) )
|
||||
band = i;
|
||||
}
|
||||
}
|
||||
else
|
||||
band = force_band - 1;
|
||||
|
||||
state->bandselectarg = cx24123_bandselect_vals[band].progdata;
|
||||
vco_div = cx24123_bandselect_vals[band].VCOdivider;
|
||||
|
||||
/* determine the charge pump current */
|
||||
if ( p->frequency < (cx24123_bandselect_vals[band].freq_low + cx24123_bandselect_vals[band].freq_high)/2 )
|
||||
pump = 0x01;
|
||||
else
|
||||
pump = 0x02;
|
||||
|
||||
/* Determine the N/A dividers for the requested lband freq (in kHz). */
|
||||
/* Note: 10111 (kHz) is the Crystal Freq and divider of 10. */
|
||||
ndiv = ( ((p->frequency * vco_div) / (10111 / 10) / 2) / 32) & 0x1ff;
|
||||
adiv = ( ((p->frequency * vco_div) / (10111 / 10) / 2) % 32) & 0x1f;
|
||||
/* Note: the reference divider R=10, frequency is in KHz, XTAL is in Hz */
|
||||
ndiv = ( ((p->frequency * vco_div * 10) / (2 * XTAL / 1000)) / 32) & 0x1ff;
|
||||
adiv = ( ((p->frequency * vco_div * 10) / (2 * XTAL / 1000)) % 32) & 0x1f;
|
||||
|
||||
if (adiv == 0)
|
||||
adiv++;
|
||||
ndiv++;
|
||||
|
||||
/* determine the correct pll frequency values. */
|
||||
/* Command 11, refdiv 11, cpump polarity 1, cpump current 3mA 10. */
|
||||
state->pllarg = (3 << 19) | (3 << 17) | (1 << 16) | (2 << 14);
|
||||
state->pllarg |= (ndiv << 5) | adiv;
|
||||
/* control bits 11, refdiv 11, charge pump polarity 1, charge pump current, ndiv, adiv */
|
||||
state->pllarg = (3 << 19) | (3 << 17) | (1 << 16) | (pump << 14) | (ndiv << 5) | adiv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -489,6 +597,8 @@ static int cx24123_pll_writereg(struct dvb_frontend* fe, struct dvb_frontend_par
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
unsigned long timeout;
|
||||
|
||||
dprintk("%s: pll writereg called, data=0x%08x\n",__FUNCTION__,data);
|
||||
|
||||
/* align the 21 bytes into to bit23 boundary */
|
||||
data = data << 3;
|
||||
|
||||
@ -538,6 +648,9 @@ static int cx24123_pll_writereg(struct dvb_frontend* fe, struct dvb_frontend_par
|
||||
static int cx24123_pll_tune(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
|
||||
{
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
u8 val;
|
||||
|
||||
dprintk("frequency=%i\n", p->frequency);
|
||||
|
||||
if (cx24123_pll_calculate(fe, p) != 0) {
|
||||
printk("%s: cx24123_pll_calcutate failed\n",__FUNCTION__);
|
||||
@ -552,6 +665,14 @@ static int cx24123_pll_tune(struct dvb_frontend* fe, struct dvb_frontend_paramet
|
||||
cx24123_pll_writereg(fe, p, state->bandselectarg);
|
||||
cx24123_pll_writereg(fe, p, state->pllarg);
|
||||
|
||||
/* set the FILTUNE voltage */
|
||||
val = cx24123_readreg(state, 0x28) & ~0x3;
|
||||
cx24123_writereg(state, 0x27, state->FILTune >> 2);
|
||||
cx24123_writereg(state, 0x28, val | (state->FILTune & 0x3));
|
||||
|
||||
dprintk("%s: pll tune VCA=%d, band=%d, pll=%d\n",__FUNCTION__,state->VCAarg,
|
||||
state->bandselectarg,state->pllarg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -560,6 +681,8 @@ static int cx24123_initfe(struct dvb_frontend* fe)
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
int i;
|
||||
|
||||
dprintk("%s: init frontend\n",__FUNCTION__);
|
||||
|
||||
/* Configure the demod to a good set of defaults */
|
||||
for (i = 0; i < sizeof(cx24123_regdata) / sizeof(cx24123_regdata[0]); i++)
|
||||
cx24123_writereg(state, cx24123_regdata[i].reg, cx24123_regdata[i].data);
|
||||
@ -587,10 +710,13 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage
|
||||
|
||||
switch (voltage) {
|
||||
case SEC_VOLTAGE_13:
|
||||
dprintk("%s: isl6421 voltage = 13V\n",__FUNCTION__);
|
||||
return cx24123_writelnbreg(state, 0x0, val & 0x32); /* V 13v */
|
||||
case SEC_VOLTAGE_18:
|
||||
dprintk("%s: isl6421 voltage = 18V\n",__FUNCTION__);
|
||||
return cx24123_writelnbreg(state, 0x0, val | 0x04); /* H 18v */
|
||||
case SEC_VOLTAGE_OFF:
|
||||
dprintk("%s: isl5421 voltage off\n",__FUNCTION__);
|
||||
return cx24123_writelnbreg(state, 0x0, val & 0x30);
|
||||
default:
|
||||
return -EINVAL;
|
||||
@ -624,13 +750,93 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cx24123_send_diseqc_msg(struct dvb_frontend* fe,
|
||||
struct dvb_diseqc_master_cmd *cmd)
|
||||
/* wait for diseqc queue to become ready (or timeout) */
|
||||
static void cx24123_wait_for_diseqc(struct cx24123_state *state)
|
||||
{
|
||||
/* fixme: Implement diseqc */
|
||||
printk("%s: No support yet\n",__FUNCTION__);
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(200);
|
||||
while (!(cx24123_readreg(state, 0x29) & 0x40)) {
|
||||
if(time_after(jiffies, timeout)) {
|
||||
printk("%s: diseqc queue not ready, command may be lost.\n", __FUNCTION__);
|
||||
break;
|
||||
}
|
||||
msleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
return -ENOTSUPP;
|
||||
static int cx24123_send_diseqc_msg(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd *cmd)
|
||||
{
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
int i, val;
|
||||
|
||||
dprintk("%s:\n",__FUNCTION__);
|
||||
|
||||
/* check if continuous tone has been stopped */
|
||||
if (state->config->use_isl6421)
|
||||
val = cx24123_readlnbreg(state, 0x00) & 0x10;
|
||||
else
|
||||
val = cx24123_readreg(state, 0x29) & 0x10;
|
||||
|
||||
|
||||
if (val) {
|
||||
printk("%s: ERROR: attempt to send diseqc command before tone is off\n", __FUNCTION__);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
/* wait for diseqc queue ready */
|
||||
cx24123_wait_for_diseqc(state);
|
||||
|
||||
/* select tone mode */
|
||||
cx24123_writereg(state, 0x2a, cx24123_readreg(state, 0x2a) & 0xf8);
|
||||
|
||||
for (i = 0; i < cmd->msg_len; i++)
|
||||
cx24123_writereg(state, 0x2C + i, cmd->msg[i]);
|
||||
|
||||
val = cx24123_readreg(state, 0x29);
|
||||
cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40) | ((cmd->msg_len-3) & 3));
|
||||
|
||||
/* wait for diseqc message to finish sending */
|
||||
cx24123_wait_for_diseqc(state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cx24123_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t burst)
|
||||
{
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
int val;
|
||||
|
||||
dprintk("%s:\n", __FUNCTION__);
|
||||
|
||||
/* check if continuous tone has been stoped */
|
||||
if (state->config->use_isl6421)
|
||||
val = cx24123_readlnbreg(state, 0x00) & 0x10;
|
||||
else
|
||||
val = cx24123_readreg(state, 0x29) & 0x10;
|
||||
|
||||
|
||||
if (val) {
|
||||
printk("%s: ERROR: attempt to send diseqc command before tone is off\n", __FUNCTION__);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
cx24123_wait_for_diseqc(state);
|
||||
|
||||
/* select tone mode */
|
||||
val = cx24123_readreg(state, 0x2a) & 0xf8;
|
||||
cx24123_writereg(state, 0x2a, val | 0x04);
|
||||
|
||||
val = cx24123_readreg(state, 0x29);
|
||||
|
||||
if (burst == SEC_MINI_A)
|
||||
cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40 | 0x00));
|
||||
else if (burst == SEC_MINI_B)
|
||||
cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40 | 0x08));
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
cx24123_wait_for_diseqc(state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cx24123_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
||||
@ -642,13 +848,15 @@ static int cx24123_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
||||
|
||||
*status = 0;
|
||||
if (lock & 0x01)
|
||||
*status |= FE_HAS_CARRIER | FE_HAS_SIGNAL;
|
||||
*status |= FE_HAS_SIGNAL;
|
||||
if (sync & 0x02)
|
||||
*status |= FE_HAS_CARRIER;
|
||||
if (sync & 0x04)
|
||||
*status |= FE_HAS_VITERBI;
|
||||
if (sync & 0x08)
|
||||
*status |= FE_HAS_CARRIER;
|
||||
*status |= FE_HAS_SYNC;
|
||||
if (sync & 0x80)
|
||||
*status |= FE_HAS_SYNC | FE_HAS_LOCK;
|
||||
*status |= FE_HAS_LOCK;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -681,6 +889,8 @@ static int cx24123_read_ber(struct dvb_frontend* fe, u32* ber)
|
||||
else
|
||||
state->snr = 0;
|
||||
|
||||
dprintk("%s: BER = %d, S/N index = %d\n",__FUNCTION__,state->lastber, state->snr);
|
||||
|
||||
*ber = state->lastber;
|
||||
|
||||
return 0;
|
||||
@ -691,6 +901,8 @@ static int cx24123_read_signal_strength(struct dvb_frontend* fe, u16* signal_str
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
*signal_strength = cx24123_readreg(state, 0x3b) << 8; /* larger = better */
|
||||
|
||||
dprintk("%s: Signal strength = %d\n",__FUNCTION__,*signal_strength);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -699,6 +911,8 @@ static int cx24123_read_snr(struct dvb_frontend* fe, u16* snr)
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
*snr = state->snr;
|
||||
|
||||
dprintk("%s: read S/N index = %d\n",__FUNCTION__,*snr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -707,6 +921,8 @@ static int cx24123_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
*ucblocks = state->lastber;
|
||||
|
||||
dprintk("%s: ucblocks (ber) = %d\n",__FUNCTION__,*ucblocks);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -714,6 +930,8 @@ static int cx24123_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
|
||||
{
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
|
||||
dprintk("%s: set_frontend\n",__FUNCTION__);
|
||||
|
||||
if (state->config->set_ts_params)
|
||||
state->config->set_ts_params(fe, 0);
|
||||
|
||||
@ -737,6 +955,8 @@ static int cx24123_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
|
||||
{
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
|
||||
dprintk("%s: get_frontend\n",__FUNCTION__);
|
||||
|
||||
if (cx24123_get_inversion(state, &p->inversion) != 0) {
|
||||
printk("%s: Failed to get inversion status\n",__FUNCTION__);
|
||||
return -EREMOTEIO;
|
||||
@ -763,8 +983,10 @@ static int cx24123_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
|
||||
|
||||
switch (tone) {
|
||||
case SEC_TONE_ON:
|
||||
dprintk("%s: isl6421 sec tone on\n",__FUNCTION__);
|
||||
return cx24123_writelnbreg(state, 0x0, val | 0x10);
|
||||
case SEC_TONE_OFF:
|
||||
dprintk("%s: isl6421 sec tone off\n",__FUNCTION__);
|
||||
return cx24123_writelnbreg(state, 0x0, val & 0x2f);
|
||||
default:
|
||||
printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone);
|
||||
@ -855,12 +1077,13 @@ static struct dvb_frontend_ops cx24123_ops = {
|
||||
.frequency_min = 950000,
|
||||
.frequency_max = 2150000,
|
||||
.frequency_stepsize = 1011, /* kHz for QPSK frontends */
|
||||
.frequency_tolerance = 29500,
|
||||
.frequency_tolerance = 5000,
|
||||
.symbol_rate_min = 1000000,
|
||||
.symbol_rate_max = 45000000,
|
||||
.caps = FE_CAN_INVERSION_AUTO |
|
||||
FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
|
||||
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
|
||||
FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
|
||||
FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
|
||||
FE_CAN_QPSK | FE_CAN_RECOVER
|
||||
},
|
||||
|
||||
@ -875,12 +1098,16 @@ static struct dvb_frontend_ops cx24123_ops = {
|
||||
.read_snr = cx24123_read_snr,
|
||||
.read_ucblocks = cx24123_read_ucblocks,
|
||||
.diseqc_send_master_cmd = cx24123_send_diseqc_msg,
|
||||
.diseqc_send_burst = cx24123_diseqc_send_burst,
|
||||
.set_tone = cx24123_set_tone,
|
||||
.set_voltage = cx24123_set_voltage,
|
||||
};
|
||||
|
||||
module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
|
||||
MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
|
||||
|
||||
module_param(force_band, int, 0644);
|
||||
MODULE_PARM_DESC(force_band, "Force a specific band select (1-9, default:off).");
|
||||
|
||||
MODULE_DESCRIPTION("DVB Frontend module for Conexant cx24123/cx24109 hardware");
|
||||
MODULE_AUTHOR("Steven Toth");
|
||||
|
@ -235,8 +235,8 @@ struct dvb_pll_desc dvb_pll_tdvs_tua6034 = {
|
||||
.max = 863000000,
|
||||
.count = 3,
|
||||
.entries = {
|
||||
{ 160000000, 44000000, 62500, 0xce, 0x01 },
|
||||
{ 455000000, 44000000, 62500, 0xce, 0x02 },
|
||||
{ 165000000, 44000000, 62500, 0xce, 0x01 },
|
||||
{ 450000000, 44000000, 62500, 0xce, 0x02 },
|
||||
{ 999999999, 44000000, 62500, 0xce, 0x04 },
|
||||
},
|
||||
};
|
||||
|
@ -1,3 +1,3 @@
|
||||
obj-$(CONFIG_DVB_PLUTO2) = pluto2.o
|
||||
obj-$(CONFIG_DVB_PLUTO2) += pluto2.o
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
|
@ -1,8 +1,7 @@
|
||||
config DVB_AV7110
|
||||
tristate "AV7110 cards"
|
||||
depends on DVB_CORE && PCI
|
||||
depends on DVB_CORE && PCI && VIDEO_V4L1
|
||||
select FW_LOADER
|
||||
select VIDEO_DEV
|
||||
select VIDEO_SAA7146_VV
|
||||
select DVB_VES1820
|
||||
select DVB_VES1X93
|
||||
@ -59,7 +58,7 @@ config DVB_AV7110_OSD
|
||||
|
||||
config DVB_BUDGET
|
||||
tristate "Budget cards"
|
||||
depends on DVB_CORE && PCI
|
||||
depends on DVB_CORE && PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146
|
||||
select DVB_STV0299
|
||||
select DVB_VES1X93
|
||||
@ -80,7 +79,7 @@ config DVB_BUDGET
|
||||
|
||||
config DVB_BUDGET_CI
|
||||
tristate "Budget cards with onboard CI connector"
|
||||
depends on DVB_CORE && PCI
|
||||
depends on DVB_CORE && PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146
|
||||
select DVB_STV0297
|
||||
select DVB_STV0299
|
||||
@ -100,8 +99,7 @@ config DVB_BUDGET_CI
|
||||
|
||||
config DVB_BUDGET_AV
|
||||
tristate "Budget cards with analog video inputs"
|
||||
depends on DVB_CORE && PCI
|
||||
select VIDEO_DEV
|
||||
depends on DVB_CORE && PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select DVB_STV0299
|
||||
select DVB_TDA1004X
|
||||
@ -119,7 +117,7 @@ config DVB_BUDGET_AV
|
||||
|
||||
config DVB_BUDGET_PATCH
|
||||
tristate "AV7110 cards with Budget Patch"
|
||||
depends on DVB_CORE && DVB_BUDGET
|
||||
depends on DVB_CORE && DVB_BUDGET && VIDEO_V4L1
|
||||
select DVB_AV7110
|
||||
select DVB_STV0299
|
||||
select DVB_VES1X93
|
||||
|
@ -1190,8 +1190,6 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
|
||||
SAA7146_HPS_SYNC_PORT_A);
|
||||
|
||||
saa7113_setinput(budget_av, 0);
|
||||
} else {
|
||||
ciintf_init(budget_av);
|
||||
}
|
||||
|
||||
/* fixme: find some sane values here... */
|
||||
@ -1211,6 +1209,10 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
|
||||
budget_av->budget.dvb_adapter.priv = budget_av;
|
||||
frontend_init(budget_av);
|
||||
|
||||
if (!budget_av->has_saa7113) {
|
||||
ciintf_init(budget_av);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -71,6 +71,7 @@ struct budget_ci {
|
||||
struct tasklet_struct msp430_irq_tasklet;
|
||||
struct tasklet_struct ciintf_irq_tasklet;
|
||||
int slot_status;
|
||||
int ci_irq;
|
||||
struct dvb_ca_en50221 ca;
|
||||
char ir_dev_name[50];
|
||||
u8 tuner_pll_address; /* used for philips_tdm1316l configs */
|
||||
@ -276,8 +277,10 @@ static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot)
|
||||
if (slot != 0)
|
||||
return -EINVAL;
|
||||
|
||||
// trigger on RISING edge during reset so we know when READY is re-asserted
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
|
||||
if (budget_ci->ci_irq) {
|
||||
// trigger on RISING edge during reset so we know when READY is re-asserted
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
|
||||
}
|
||||
budget_ci->slot_status = SLOTSTATUS_RESET;
|
||||
ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0);
|
||||
msleep(1);
|
||||
@ -370,11 +373,50 @@ static void ciintf_interrupt(unsigned long data)
|
||||
}
|
||||
}
|
||||
|
||||
static int ciintf_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open)
|
||||
{
|
||||
struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
|
||||
unsigned int flags;
|
||||
|
||||
// ensure we don't get spurious IRQs during initialisation
|
||||
if (!budget_ci->budget.ci_present)
|
||||
return -EINVAL;
|
||||
|
||||
// read the CAM status
|
||||
flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
|
||||
if (flags & CICONTROL_CAMDETECT) {
|
||||
// mark it as present if it wasn't before
|
||||
if (budget_ci->slot_status & SLOTSTATUS_NONE) {
|
||||
budget_ci->slot_status = SLOTSTATUS_PRESENT;
|
||||
}
|
||||
|
||||
// during a RESET, we check if we can read from IO memory to see when CAM is ready
|
||||
if (budget_ci->slot_status & SLOTSTATUS_RESET) {
|
||||
if (ciintf_read_attribute_mem(ca, slot, 0) == 0x1d) {
|
||||
budget_ci->slot_status = SLOTSTATUS_READY;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
budget_ci->slot_status = SLOTSTATUS_NONE;
|
||||
}
|
||||
|
||||
if (budget_ci->slot_status != SLOTSTATUS_NONE) {
|
||||
if (budget_ci->slot_status & SLOTSTATUS_READY) {
|
||||
return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
|
||||
}
|
||||
return DVB_CA_EN50221_POLL_CAM_PRESENT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ciintf_init(struct budget_ci *budget_ci)
|
||||
{
|
||||
struct saa7146_dev *saa = budget_ci->budget.dev;
|
||||
int flags;
|
||||
int result;
|
||||
int ci_version;
|
||||
int ca_flags;
|
||||
|
||||
memset(&budget_ci->ca, 0, sizeof(struct dvb_ca_en50221));
|
||||
|
||||
@ -382,16 +424,29 @@ static int ciintf_init(struct budget_ci *budget_ci)
|
||||
saa7146_write(saa, MC1, saa7146_read(saa, MC1) | (0x800 << 16) | 0x800);
|
||||
|
||||
// test if it is there
|
||||
if ((ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CIVERSION, 1, 1, 0) & 0xa0) != 0xa0) {
|
||||
ci_version = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CIVERSION, 1, 1, 0);
|
||||
if ((ci_version & 0xa0) != 0xa0) {
|
||||
result = -ENODEV;
|
||||
goto error;
|
||||
}
|
||||
|
||||
// determine whether a CAM is present or not
|
||||
flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
|
||||
budget_ci->slot_status = SLOTSTATUS_NONE;
|
||||
if (flags & CICONTROL_CAMDETECT)
|
||||
budget_ci->slot_status = SLOTSTATUS_PRESENT;
|
||||
|
||||
// version 0xa2 of the CI firmware doesn't generate interrupts
|
||||
if (ci_version == 0xa2) {
|
||||
ca_flags = 0;
|
||||
budget_ci->ci_irq = 0;
|
||||
} else {
|
||||
ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE |
|
||||
DVB_CA_EN50221_FLAG_IRQ_FR |
|
||||
DVB_CA_EN50221_FLAG_IRQ_DA;
|
||||
budget_ci->ci_irq = 1;
|
||||
}
|
||||
|
||||
// register CI interface
|
||||
budget_ci->ca.owner = THIS_MODULE;
|
||||
budget_ci->ca.read_attribute_mem = ciintf_read_attribute_mem;
|
||||
@ -401,23 +456,27 @@ static int ciintf_init(struct budget_ci *budget_ci)
|
||||
budget_ci->ca.slot_reset = ciintf_slot_reset;
|
||||
budget_ci->ca.slot_shutdown = ciintf_slot_shutdown;
|
||||
budget_ci->ca.slot_ts_enable = ciintf_slot_ts_enable;
|
||||
budget_ci->ca.poll_slot_status = ciintf_poll_slot_status;
|
||||
budget_ci->ca.data = budget_ci;
|
||||
if ((result = dvb_ca_en50221_init(&budget_ci->budget.dvb_adapter,
|
||||
&budget_ci->ca,
|
||||
DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE |
|
||||
DVB_CA_EN50221_FLAG_IRQ_FR |
|
||||
DVB_CA_EN50221_FLAG_IRQ_DA, 1)) != 0) {
|
||||
ca_flags, 1)) != 0) {
|
||||
printk("budget_ci: CI interface detected, but initialisation failed.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
// Setup CI slot IRQ
|
||||
tasklet_init(&budget_ci->ciintf_irq_tasklet, ciintf_interrupt, (unsigned long) budget_ci);
|
||||
if (budget_ci->slot_status != SLOTSTATUS_NONE) {
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO);
|
||||
} else {
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
|
||||
if (budget_ci->ci_irq) {
|
||||
tasklet_init(&budget_ci->ciintf_irq_tasklet, ciintf_interrupt, (unsigned long) budget_ci);
|
||||
if (budget_ci->slot_status != SLOTSTATUS_NONE) {
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO);
|
||||
} else {
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
|
||||
}
|
||||
saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_03);
|
||||
}
|
||||
saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_03);
|
||||
|
||||
// enable interface
|
||||
ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
|
||||
CICONTROL_RESET, 1, 0);
|
||||
|
||||
@ -426,10 +485,12 @@ static int ciintf_init(struct budget_ci *budget_ci)
|
||||
budget_ci->budget.ci_present = 1;
|
||||
|
||||
// forge a fake CI IRQ so the CAM state is setup correctly
|
||||
flags = DVB_CA_EN50221_CAMCHANGE_REMOVED;
|
||||
if (budget_ci->slot_status != SLOTSTATUS_NONE)
|
||||
flags = DVB_CA_EN50221_CAMCHANGE_INSERTED;
|
||||
dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0, flags);
|
||||
if (budget_ci->ci_irq) {
|
||||
flags = DVB_CA_EN50221_CAMCHANGE_REMOVED;
|
||||
if (budget_ci->slot_status != SLOTSTATUS_NONE)
|
||||
flags = DVB_CA_EN50221_CAMCHANGE_INSERTED;
|
||||
dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0, flags);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@ -443,9 +504,13 @@ static void ciintf_deinit(struct budget_ci *budget_ci)
|
||||
struct saa7146_dev *saa = budget_ci->budget.dev;
|
||||
|
||||
// disable CI interrupts
|
||||
saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_03);
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_INPUT);
|
||||
tasklet_kill(&budget_ci->ciintf_irq_tasklet);
|
||||
if (budget_ci->ci_irq) {
|
||||
saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_03);
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_INPUT);
|
||||
tasklet_kill(&budget_ci->ciintf_irq_tasklet);
|
||||
}
|
||||
|
||||
// reset interface
|
||||
ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0);
|
||||
msleep(1);
|
||||
ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
|
||||
@ -473,7 +538,7 @@ static void budget_ci_irq(struct saa7146_dev *dev, u32 * isr)
|
||||
if (*isr & MASK_10)
|
||||
ttpci_budget_irq10_handler(dev, isr);
|
||||
|
||||
if ((*isr & MASK_03) && (budget_ci->budget.ci_present))
|
||||
if ((*isr & MASK_03) && (budget_ci->budget.ci_present) && (budget_ci->ci_irq))
|
||||
tasklet_schedule(&budget_ci->ciintf_irq_tasklet);
|
||||
}
|
||||
|
||||
|
@ -1507,7 +1507,11 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
|
||||
mutex_unlock(&ttusb->semi2c);
|
||||
|
||||
dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE);
|
||||
if ((result = dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE)) < 0) {
|
||||
ttusb_free_iso_urbs(ttusb);
|
||||
kfree(ttusb);
|
||||
return result;
|
||||
}
|
||||
ttusb->adapter.priv = ttusb;
|
||||
|
||||
/* i2c */
|
||||
|
@ -7,7 +7,7 @@ menu "Radio Adapters"
|
||||
|
||||
config RADIO_CADET
|
||||
tristate "ADS Cadet AM/FM Tuner"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these AM/FM radio cards, and then
|
||||
fill in the port address below.
|
||||
@ -25,7 +25,7 @@ config RADIO_CADET
|
||||
|
||||
config RADIO_RTRACK
|
||||
tristate "AIMSlab RadioTrack (aka RadioReveal) support"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards, and then fill
|
||||
in the port address below.
|
||||
@ -59,7 +59,7 @@ config RADIO_RTRACK_PORT
|
||||
|
||||
config RADIO_RTRACK2
|
||||
tristate "AIMSlab RadioTrack II support"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have this FM radio card, and then fill in the
|
||||
port address below.
|
||||
@ -82,7 +82,7 @@ config RADIO_RTRACK2_PORT
|
||||
|
||||
config RADIO_AZTECH
|
||||
tristate "Aztech/Packard Bell Radio"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards, and then fill
|
||||
in the port address below.
|
||||
@ -106,7 +106,7 @@ config RADIO_AZTECH_PORT
|
||||
|
||||
config RADIO_GEMTEK
|
||||
tristate "GemTek Radio Card support"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have this FM radio card, and then fill in the
|
||||
port address below.
|
||||
@ -131,7 +131,7 @@ config RADIO_GEMTEK_PORT
|
||||
|
||||
config RADIO_GEMTEK_PCI
|
||||
tristate "GemTek PCI Radio Card support"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on VIDEO_V4L1 && PCI
|
||||
---help---
|
||||
Choose Y here if you have this PCI FM radio card.
|
||||
|
||||
@ -145,7 +145,7 @@ config RADIO_GEMTEK_PCI
|
||||
|
||||
config RADIO_MAXIRADIO
|
||||
tristate "Guillemot MAXI Radio FM 2000 radio"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on VIDEO_V4L1 && PCI
|
||||
---help---
|
||||
Choose Y here if you have this radio card. This card may also be
|
||||
found as Gemtek PCI FM.
|
||||
@ -160,7 +160,7 @@ config RADIO_MAXIRADIO
|
||||
|
||||
config RADIO_MAESTRO
|
||||
tristate "Maestro on board radio"
|
||||
depends on VIDEO_DEV
|
||||
depends on VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here to directly support the on-board radio tuner on the
|
||||
Maestro 2 or 2E sound card.
|
||||
@ -175,7 +175,7 @@ config RADIO_MAESTRO
|
||||
|
||||
config RADIO_MIROPCM20
|
||||
tristate "miroSOUND PCM20 radio"
|
||||
depends on ISA && VIDEO_DEV && SOUND_ACI_MIXER
|
||||
depends on ISA && VIDEO_V4L1 && SOUND_ACI_MIXER
|
||||
---help---
|
||||
Choose Y here if you have this FM radio card. You also need to say Y
|
||||
to "ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20 radio)" (in "Sound")
|
||||
@ -208,7 +208,7 @@ config RADIO_MIROPCM20_RDS
|
||||
|
||||
config RADIO_SF16FMI
|
||||
tristate "SF16FMI Radio"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards. If you
|
||||
compile the driver into the kernel and your card is not PnP one, you
|
||||
@ -225,7 +225,7 @@ config RADIO_SF16FMI
|
||||
|
||||
config RADIO_SF16FMR2
|
||||
tristate "SF16FMR2 Radio"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards.
|
||||
|
||||
@ -239,7 +239,7 @@ config RADIO_SF16FMR2
|
||||
|
||||
config RADIO_TERRATEC
|
||||
tristate "TerraTec ActiveRadio ISA Standalone"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have this FM radio card, and then fill in the
|
||||
port address below. (TODO)
|
||||
@ -268,7 +268,7 @@ config RADIO_TERRATEC_PORT
|
||||
|
||||
config RADIO_TRUST
|
||||
tristate "Trust FM radio card"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
help
|
||||
This is a driver for the Trust FM radio cards. Say Y if you have
|
||||
such a card and want to use it under Linux.
|
||||
@ -286,7 +286,7 @@ config RADIO_TRUST_PORT
|
||||
|
||||
config RADIO_TYPHOON
|
||||
tristate "Typhoon Radio (a.k.a. EcoRadio)"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards, and then fill
|
||||
in the port address and the frequency used for muting below.
|
||||
@ -330,7 +330,7 @@ config RADIO_TYPHOON_MUTEFREQ
|
||||
|
||||
config RADIO_ZOLTRIX
|
||||
tristate "Zoltrix Radio"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards, and then fill
|
||||
in the port address below.
|
||||
|
@ -2,10 +2,10 @@
|
||||
# Multimedia Video device configuration
|
||||
#
|
||||
|
||||
menu "Video For Linux"
|
||||
menu "Video Capture Adapters"
|
||||
depends on VIDEO_DEV
|
||||
|
||||
comment "Video Adapters"
|
||||
comment "Video Capture Adapters"
|
||||
|
||||
config VIDEO_ADV_DEBUG
|
||||
bool "Enable advanced debug functionality"
|
||||
@ -16,11 +16,23 @@ config VIDEO_ADV_DEBUG
|
||||
V4L devices.
|
||||
In doubt, say N.
|
||||
|
||||
config VIDEO_VIVI
|
||||
tristate "Virtual Video Driver"
|
||||
depends on VIDEO_V4L2 && !SPARC32 && !SPARC64
|
||||
select VIDEO_BUF
|
||||
default n
|
||||
---help---
|
||||
Enables a virtual video driver. This device shows a color bar
|
||||
and a timestamp, as a real device would generate by using V4L2
|
||||
api.
|
||||
Say Y here if you want to test video apps or debug V4L devices.
|
||||
In doubt, say N.
|
||||
|
||||
source "drivers/media/video/bt8xx/Kconfig"
|
||||
|
||||
config VIDEO_SAA6588
|
||||
tristate "SAA6588 Radio Chip RDS decoder support on BT848 cards"
|
||||
depends on VIDEO_DEV && I2C && VIDEO_BT848
|
||||
depends on I2C && VIDEO_BT848
|
||||
|
||||
help
|
||||
Support for Radio Data System (RDS) decoder. This allows seeing
|
||||
@ -32,7 +44,7 @@ config VIDEO_SAA6588
|
||||
|
||||
config VIDEO_PMS
|
||||
tristate "Mediavision Pro Movie Studio Video For Linux"
|
||||
depends on VIDEO_DEV && ISA
|
||||
depends on ISA && VIDEO_V4L1
|
||||
help
|
||||
Say Y if you have such a thing.
|
||||
|
||||
@ -41,7 +53,7 @@ config VIDEO_PMS
|
||||
|
||||
config VIDEO_PLANB
|
||||
tristate "PlanB Video-In on PowerMac"
|
||||
depends on PPC_PMAC && VIDEO_DEV && BROKEN
|
||||
depends on PPC_PMAC && VIDEO_V4L1 && BROKEN
|
||||
help
|
||||
PlanB is the V4L driver for the PowerMac 7x00/8x00 series video
|
||||
input hardware. If you want to experiment with this, say Y.
|
||||
@ -52,7 +64,7 @@ config VIDEO_PLANB
|
||||
|
||||
config VIDEO_BWQCAM
|
||||
tristate "Quickcam BW Video For Linux"
|
||||
depends on VIDEO_DEV && PARPORT
|
||||
depends on PARPORT && VIDEO_V4L1
|
||||
help
|
||||
Say Y have if you the black and white version of the QuickCam
|
||||
camera. See the next option for the color version.
|
||||
@ -62,7 +74,7 @@ config VIDEO_BWQCAM
|
||||
|
||||
config VIDEO_CQCAM
|
||||
tristate "QuickCam Colour Video For Linux (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL && VIDEO_DEV && PARPORT
|
||||
depends on EXPERIMENTAL && PARPORT && VIDEO_V4L1
|
||||
help
|
||||
This is the video4linux driver for the colour version of the
|
||||
Connectix QuickCam. If you have one of these cameras, say Y here,
|
||||
@ -73,7 +85,7 @@ config VIDEO_CQCAM
|
||||
|
||||
config VIDEO_W9966
|
||||
tristate "W9966CF Webcam (FlyCam Supra and others) Video For Linux"
|
||||
depends on PARPORT_1284 && VIDEO_DEV && PARPORT
|
||||
depends on PARPORT_1284 && PARPORT && VIDEO_V4L1
|
||||
help
|
||||
Video4linux driver for Winbond's w9966 based Webcams.
|
||||
Currently tested with the LifeView FlyCam Supra.
|
||||
@ -86,7 +98,7 @@ config VIDEO_W9966
|
||||
|
||||
config VIDEO_CPIA
|
||||
tristate "CPiA Video For Linux"
|
||||
depends on VIDEO_DEV
|
||||
depends on VIDEO_V4L1
|
||||
---help---
|
||||
This is the video4linux driver for cameras based on Vision's CPiA
|
||||
(Colour Processor Interface ASIC), such as the Creative Labs Video
|
||||
@ -123,7 +135,7 @@ source "drivers/media/video/cpia2/Kconfig"
|
||||
|
||||
config VIDEO_SAA5246A
|
||||
tristate "SAA5246A, SAA5281 Teletext processor"
|
||||
depends on VIDEO_DEV && I2C
|
||||
depends on I2C && VIDEO_V4L1
|
||||
help
|
||||
Support for I2C bus based teletext using the SAA5246A or SAA5281
|
||||
chip. Useful only if you live in Europe.
|
||||
@ -150,7 +162,7 @@ config TUNER_3036
|
||||
|
||||
config VIDEO_VINO
|
||||
tristate "SGI Vino Video For Linux (EXPERIMENTAL)"
|
||||
depends on VIDEO_DEV && I2C && SGI_IP22 && EXPERIMENTAL
|
||||
depends on I2C && SGI_IP22 && EXPERIMENTAL && VIDEO_V4L1
|
||||
select I2C_ALGO_SGI
|
||||
help
|
||||
Say Y here to build in support for the Vino video input system found
|
||||
@ -158,7 +170,7 @@ config VIDEO_VINO
|
||||
|
||||
config VIDEO_STRADIS
|
||||
tristate "Stradis 4:2:2 MPEG-2 video driver (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL && VIDEO_DEV && PCI
|
||||
depends on EXPERIMENTAL && PCI && VIDEO_V4L1
|
||||
help
|
||||
Say Y here to enable support for the Stradis 4:2:2 MPEG-2 video
|
||||
driver for PCI. There is a product page at
|
||||
@ -166,7 +178,7 @@ config VIDEO_STRADIS
|
||||
|
||||
config VIDEO_ZORAN
|
||||
tristate "Zoran ZR36057/36067 Video For Linux"
|
||||
depends on VIDEO_DEV && PCI && I2C_ALGOBIT
|
||||
depends on PCI && I2C_ALGOBIT && VIDEO_V4L1
|
||||
help
|
||||
Say Y for support for MJPEG capture cards based on the Zoran
|
||||
36057/36067 PCI controller chipset. This includes the Iomega
|
||||
@ -214,7 +226,7 @@ config VIDEO_ZORAN_LML33R10
|
||||
|
||||
config VIDEO_ZR36120
|
||||
tristate "Zoran ZR36120/36125 Video For Linux"
|
||||
depends on VIDEO_DEV && PCI && I2C && BROKEN
|
||||
depends on PCI && I2C && VIDEO_V4L1 && BROKEN
|
||||
help
|
||||
Support for ZR36120/ZR36125 based frame grabber/overlay boards.
|
||||
This includes the Victor II, WaveWatcher, Video Wonder, Maxi-TV,
|
||||
@ -226,7 +238,7 @@ config VIDEO_ZR36120
|
||||
|
||||
config VIDEO_MEYE
|
||||
tristate "Sony Vaio Picturebook Motion Eye Video For Linux"
|
||||
depends on VIDEO_DEV && PCI && SONYPI
|
||||
depends on PCI && SONYPI && VIDEO_V4L1
|
||||
---help---
|
||||
This is the video4linux driver for the Motion Eye camera found
|
||||
in the Vaio Picturebook laptops. Please read the material in
|
||||
@ -242,7 +254,7 @@ source "drivers/media/video/saa7134/Kconfig"
|
||||
|
||||
config VIDEO_MXB
|
||||
tristate "Siemens-Nixdorf 'Multimedia eXtension Board'"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_TUNER
|
||||
---help---
|
||||
@ -254,8 +266,9 @@ config VIDEO_MXB
|
||||
|
||||
config VIDEO_DPC
|
||||
tristate "Philips-Semiconductors 'dpc7146 demonstration board'"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_V4L2
|
||||
---help---
|
||||
This is a video4linux driver for the 'dpc7146 demonstration
|
||||
board' by Philips-Semiconductors. It's the reference design
|
||||
@ -268,8 +281,9 @@ config VIDEO_DPC
|
||||
|
||||
config VIDEO_HEXIUM_ORION
|
||||
tristate "Hexium HV-PCI6 and Orion frame grabber"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_V4L2
|
||||
---help---
|
||||
This is a video4linux driver for the Hexium HV-PCI6 and
|
||||
Orion frame grabber cards by Hexium.
|
||||
@ -279,8 +293,9 @@ config VIDEO_HEXIUM_ORION
|
||||
|
||||
config VIDEO_HEXIUM_GEMINI
|
||||
tristate "Hexium Gemini frame grabber"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_V4L2
|
||||
---help---
|
||||
This is a video4linux driver for the Hexium Gemini frame
|
||||
grabber card by Hexium. Please note that the Gemini Dual
|
||||
@ -293,7 +308,7 @@ source "drivers/media/video/cx88/Kconfig"
|
||||
|
||||
config VIDEO_OVCAMCHIP
|
||||
tristate "OmniVision Camera Chip support"
|
||||
depends on VIDEO_DEV && I2C
|
||||
depends on I2C && VIDEO_V4L1
|
||||
---help---
|
||||
Support for the OmniVision OV6xxx and OV7xxx series of camera chips.
|
||||
This driver is intended to be used with the ov511 and w9968cf USB
|
||||
@ -304,7 +319,7 @@ config VIDEO_OVCAMCHIP
|
||||
|
||||
config VIDEO_M32R_AR
|
||||
tristate "AR devices"
|
||||
depends on M32R
|
||||
depends on M32R && VIDEO_V4L1
|
||||
---help---
|
||||
This is a video4linux driver for the Renesas AR (Artificial Retina)
|
||||
camera module.
|
||||
@ -365,17 +380,17 @@ config VIDEO_WM8739
|
||||
source "drivers/media/video/cx25840/Kconfig"
|
||||
|
||||
config VIDEO_SAA711X
|
||||
tristate "Philips SAA7113/4/5 video decoders"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
tristate "Philips SAA7113/4/5 video decoders (OBSOLETED)"
|
||||
depends on VIDEO_V4L1 && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the Philips SAA7113/4/5 video decoders.
|
||||
Old support for the Philips SAA7113/4 video decoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called saa7115.
|
||||
|
||||
config VIDEO_SAA7127
|
||||
tristate "Philips SAA7127/9 digital video encoders"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
depends on VIDEO_V4L2 && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the Philips SAA7127/9 digital video encoders.
|
||||
|
||||
@ -384,7 +399,7 @@ config VIDEO_SAA7127
|
||||
|
||||
config VIDEO_UPD64031A
|
||||
tristate "NEC Electronics uPD64031A Ghost Reduction"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
depends on VIDEO_V4L2 && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the NEC Electronics uPD64031A Ghost Reduction
|
||||
video chip. It is most often found in NTSC TV cards made for
|
||||
@ -396,7 +411,7 @@ config VIDEO_UPD64031A
|
||||
|
||||
config VIDEO_UPD64083
|
||||
tristate "NEC Electronics uPD64083 3-Dimensional Y/C separation"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
depends on VIDEO_V4L2 && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the NEC Electronics uPD64083 3-Dimensional Y/C
|
||||
separation video chip. It is used to improve the quality of
|
||||
@ -418,7 +433,7 @@ source "drivers/media/video/em28xx/Kconfig"
|
||||
|
||||
config USB_DSBR
|
||||
tristate "D-Link USB FM radio support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_DEV && EXPERIMENTAL
|
||||
depends on USB && VIDEO_V4L1 && EXPERIMENTAL
|
||||
---help---
|
||||
Say Y here if you want to connect this type of radio to your
|
||||
computer's USB port. Note that the audio is not digital, and
|
||||
@ -434,7 +449,7 @@ source "drivers/media/video/et61x251/Kconfig"
|
||||
|
||||
config USB_OV511
|
||||
tristate "USB OV511 Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port. See <file:Documentation/video4linux/ov511.txt>
|
||||
@ -445,7 +460,7 @@ config USB_OV511
|
||||
|
||||
config USB_SE401
|
||||
tristate "USB SE401 Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port. See <file:Documentation/video4linux/se401.txt>
|
||||
@ -458,7 +473,7 @@ source "drivers/media/video/sn9c102/Kconfig"
|
||||
|
||||
config USB_STV680
|
||||
tristate "USB STV680 (Pencam) Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port. This includes the Pencam line of cameras.
|
||||
@ -470,7 +485,7 @@ config USB_STV680
|
||||
|
||||
config USB_W9968CF
|
||||
tristate "USB W996[87]CF JPEG Dual Mode Camera support"
|
||||
depends on USB && VIDEO_DEV && I2C
|
||||
depends on USB && VIDEO_V4L1 && I2C
|
||||
select VIDEO_OVCAMCHIP
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on OV681 or
|
||||
|
@ -10,7 +10,8 @@ tuner-objs := tuner-core.o tuner-types.o tuner-simple.o \
|
||||
|
||||
msp3400-objs := msp3400-driver.o msp3400-kthreads.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-common.o v4l1-compat.o compat_ioctl32.o
|
||||
obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-common.o compat_ioctl32.o
|
||||
obj-$(CONFIG_VIDEO_V4L1_COMPAT) += v4l1-compat.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_BT848) += bt8xx/
|
||||
obj-$(CONFIG_VIDEO_BT848) += tvaudio.o tda7432.o tda9875.o ir-kbd-i2c.o
|
||||
@ -84,4 +85,8 @@ obj-$(CONFIG_USB_IBMCAM) += usbvideo/
|
||||
obj-$(CONFIG_USB_KONICAWC) += usbvideo/
|
||||
obj-$(CONFIG_USB_VICAM) += usbvideo/
|
||||
|
||||
obj-$(CONFIG_VIDEO_VIVI) += vivi.o
|
||||
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
|
||||
extra-cflags-$(CONFIG_VIDEO_V4L1_COMPAT) += -DCONFIG_VIDEO_V4L1_COMPAT
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
config VIDEO_BT848
|
||||
tristate "BT848 Video For Linux"
|
||||
depends on VIDEO_DEV && PCI && I2C
|
||||
depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L2
|
||||
select I2C_ALGOBIT
|
||||
select FW_LOADER
|
||||
select VIDEO_BTCX
|
||||
|
@ -8,5 +8,5 @@ bttv-objs := bttv-driver.o bttv-cards.o bttv-if.o \
|
||||
|
||||
obj-$(CONFIG_VIDEO_BT848) += bttv.o
|
||||
|
||||
EXTRA_CFLAGS += -I$(src)/..
|
||||
EXTRA_CFLAGS += -Idrivers/media/video
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
|
||||
|
@ -2991,13 +2991,13 @@ void __devinit bttv_idcard(struct bttv *btv)
|
||||
|
||||
if (UNSET != audiomux[0]) {
|
||||
gpiobits = 0;
|
||||
for (i = 0; i < 5; i++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
bttv_tvcards[btv->c.type].gpiomux[i] = audiomux[i];
|
||||
gpiobits |= audiomux[i];
|
||||
}
|
||||
} else {
|
||||
gpiobits = audioall;
|
||||
for (i = 0; i < 5; i++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
bttv_tvcards[btv->c.type].gpiomux[i] = audioall;
|
||||
}
|
||||
}
|
||||
|
@ -233,7 +233,7 @@ bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
|
||||
const struct bttv_format *fmt, struct bttv_overlay *ov,
|
||||
int skip_even, int skip_odd)
|
||||
{
|
||||
int instructions,rc,line,maxy,start,end,skip,nskips;
|
||||
int dwords,rc,line,maxy,start,end,skip,nskips;
|
||||
struct btcx_skiplist *skips;
|
||||
u32 *rp,ri,ra;
|
||||
u32 addr;
|
||||
@ -242,12 +242,12 @@ bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
|
||||
if (NULL == (skips = kmalloc(sizeof(*skips) * ov->nclips,GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
/* estimate risc mem: worst case is (clip+1) * lines instructions
|
||||
/* estimate risc mem: worst case is (1.5*clip+1) * lines instructions
|
||||
+ sync + jump (all 2 dwords) */
|
||||
instructions = (ov->nclips + 1) *
|
||||
((skip_even || skip_odd) ? ov->w.height>>1 : ov->w.height);
|
||||
instructions += 2;
|
||||
if ((rc = btcx_riscmem_alloc(btv->c.pci,risc,instructions*8)) < 0) {
|
||||
dwords = (3 * ov->nclips + 2) *
|
||||
((skip_even || skip_odd) ? (ov->w.height+1)>>1 : ov->w.height);
|
||||
dwords += 4;
|
||||
if ((rc = btcx_riscmem_alloc(btv->c.pci,risc,dwords*4)) < 0) {
|
||||
kfree(skips);
|
||||
return rc;
|
||||
}
|
||||
@ -276,8 +276,6 @@ bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
|
||||
if (line > maxy)
|
||||
btcx_calc_skips(line, ov->w.width, &maxy,
|
||||
skips, &nskips, ov->clips, ov->nclips);
|
||||
else
|
||||
nskips = 0;
|
||||
|
||||
/* write out risc code */
|
||||
for (start = 0, skip = 0; start < ov->w.width; start = end) {
|
||||
|
@ -39,29 +39,12 @@
|
||||
|
||||
#define FWDEV(x) &((x)->adapter->dev)
|
||||
|
||||
static int fastfw = 1;
|
||||
static char *firmware = FWFILE;
|
||||
|
||||
module_param(fastfw, bool, 0444);
|
||||
module_param(firmware, charp, 0444);
|
||||
|
||||
MODULE_PARM_DESC(fastfw, "Load firmware fast [0=100MHz 1=333MHz (default)]");
|
||||
MODULE_PARM_DESC(firmware, "Firmware image [default: " FWFILE "]");
|
||||
|
||||
static void set_i2c_delay(struct i2c_client *client, int delay)
|
||||
{
|
||||
struct i2c_algo_bit_data *algod = client->adapter->algo_data;
|
||||
|
||||
/* We aren't guaranteed to be using algo_bit,
|
||||
* so avoid the null pointer dereference
|
||||
* and disable the 'fast firmware load' */
|
||||
if (algod) {
|
||||
algod->udelay = delay;
|
||||
} else {
|
||||
fastfw = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void start_fw_load(struct i2c_client *client)
|
||||
{
|
||||
/* DL_ADDR_LB=0 DL_ADDR_HB=0 */
|
||||
@ -71,16 +54,10 @@ static void start_fw_load(struct i2c_client *client)
|
||||
cx25840_write(client, 0x803, 0x0b);
|
||||
/* AUTO_INC_DIS=1 */
|
||||
cx25840_write(client, 0x000, 0x20);
|
||||
|
||||
if (fastfw)
|
||||
set_i2c_delay(client, 3);
|
||||
}
|
||||
|
||||
static void end_fw_load(struct i2c_client *client)
|
||||
{
|
||||
if (fastfw)
|
||||
set_i2c_delay(client, 10);
|
||||
|
||||
/* AUTO_INC_DIS=0 */
|
||||
cx25840_write(client, 0x000, 0x00);
|
||||
/* DL_ENABLE=0 */
|
||||
@ -107,30 +84,8 @@ static int fw_write(struct i2c_client *client, u8 * data, int size)
|
||||
int sent;
|
||||
|
||||
if ((sent = i2c_master_send(client, data, size)) < size) {
|
||||
|
||||
if (fastfw) {
|
||||
v4l_err(client, "333MHz i2c firmware load failed\n");
|
||||
fastfw = 0;
|
||||
set_i2c_delay(client, 10);
|
||||
|
||||
if (sent > 2) {
|
||||
u16 dl_addr = cx25840_read(client, 0x801) << 8;
|
||||
dl_addr |= cx25840_read(client, 0x800);
|
||||
dl_addr -= sent - 2;
|
||||
cx25840_write(client, 0x801, dl_addr >> 8);
|
||||
cx25840_write(client, 0x800, dl_addr & 0xff);
|
||||
}
|
||||
|
||||
if (i2c_master_send(client, data, size) < size) {
|
||||
v4l_err(client, "100MHz i2c firmware load failed\n");
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
} else {
|
||||
v4l_err(client, "firmware load i2c failure\n");
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
v4l_err(client, "firmware load i2c failure\n");
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -564,7 +564,7 @@ struct cx88_board cx88_boards[] = {
|
||||
},
|
||||
[CX88_BOARD_PCHDTV_HD3000] = {
|
||||
.name = "pcHDTV HD3000 HDTV",
|
||||
.tuner_type = TUNER_THOMSON_DTT7610,
|
||||
.tuner_type = TUNER_THOMSON_DTT761X,
|
||||
.radio_type = UNSET,
|
||||
.tuner_addr = ADDR_UNSET,
|
||||
.radio_addr = ADDR_UNSET,
|
||||
|
@ -146,9 +146,11 @@ int cx88_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc,
|
||||
fields++;
|
||||
|
||||
/* estimate risc mem: worst case is one write per page border +
|
||||
one write per scan line + syncs + jump (all 2 dwords) */
|
||||
instructions = (bpl * lines * fields) / PAGE_SIZE + lines * fields;
|
||||
instructions += 3 + 4;
|
||||
one write per scan line + syncs + jump (all 2 dwords). Padding
|
||||
can cause next bpl to start close to a page border. First DMA
|
||||
region may be smaller than PAGE_SIZE */
|
||||
instructions = fields * (1 + ((bpl + padding) * lines) / PAGE_SIZE + lines);
|
||||
instructions += 2;
|
||||
if ((rc = btcx_riscmem_alloc(pci,risc,instructions*8)) < 0)
|
||||
return rc;
|
||||
|
||||
@ -176,9 +178,11 @@ int cx88_risc_databuffer(struct pci_dev *pci, struct btcx_riscmem *risc,
|
||||
int rc;
|
||||
|
||||
/* estimate risc mem: worst case is one write per page border +
|
||||
one write per scan line + syncs + jump (all 2 dwords) */
|
||||
instructions = (bpl * lines) / PAGE_SIZE + lines;
|
||||
instructions += 3 + 4;
|
||||
one write per scan line + syncs + jump (all 2 dwords). Here
|
||||
there is no padding and no sync. First DMA region may be smaller
|
||||
than PAGE_SIZE */
|
||||
instructions = 1 + (bpl * lines) / PAGE_SIZE + lines;
|
||||
instructions += 1;
|
||||
if ((rc = btcx_riscmem_alloc(pci,risc,instructions*8)) < 0)
|
||||
return rc;
|
||||
|
||||
|
@ -372,7 +372,7 @@ static int or51132_set_ts_param(struct dvb_frontend* fe,
|
||||
static struct or51132_config pchdtv_hd3000 = {
|
||||
.demod_address = 0x15,
|
||||
.pll_address = 0x61,
|
||||
.pll_desc = &dvb_pll_thomson_dtt7610,
|
||||
.pll_desc = &dvb_pll_thomson_dtt761x,
|
||||
.set_ts_params = or51132_set_ts_param,
|
||||
};
|
||||
#endif
|
||||
|
@ -35,8 +35,10 @@
|
||||
#include "cx88.h"
|
||||
#include <media/v4l2-common.h>
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
/* Include V4L1 specific functions. Should be removed soon */
|
||||
#include <linux/videodev.h>
|
||||
#endif
|
||||
|
||||
MODULE_DESCRIPTION("v4l2 driver module for cx2388x based TV cards");
|
||||
MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
|
||||
|
@ -1,6 +1,6 @@
|
||||
config VIDEO_EM28XX
|
||||
tristate "Empia EM2800/2820/2840 USB video capture support"
|
||||
depends on VIDEO_DEV && USB && I2C
|
||||
depends on VIDEO_V4L1 && USB && I2C
|
||||
select VIDEO_BUF
|
||||
select VIDEO_TUNER
|
||||
select VIDEO_TVEEPROM
|
||||
|
@ -1576,8 +1576,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
||||
errCode = em28xx_config(dev);
|
||||
if (errCode) {
|
||||
em28xx_errdev("error configuring device\n");
|
||||
kfree(dev);
|
||||
em28xx_devused&=~(1<<dev->devno);
|
||||
kfree(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -1603,8 +1603,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
||||
dev->vdev = video_device_alloc();
|
||||
if (NULL == dev->vdev) {
|
||||
em28xx_errdev("cannot allocate video_device.\n");
|
||||
kfree(dev);
|
||||
em28xx_devused&=~(1<<dev->devno);
|
||||
kfree(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -1612,8 +1612,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
||||
if (NULL == dev->vbi_dev) {
|
||||
em28xx_errdev("cannot allocate video_device.\n");
|
||||
kfree(dev->vdev);
|
||||
kfree(dev);
|
||||
em28xx_devused&=~(1<<dev->devno);
|
||||
kfree(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -1650,8 +1650,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
||||
mutex_unlock(&dev->lock);
|
||||
list_del(&dev->devlist);
|
||||
video_device_release(dev->vdev);
|
||||
kfree(dev);
|
||||
em28xx_devused&=~(1<<dev->devno);
|
||||
kfree(dev);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -1662,8 +1662,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
||||
list_del(&dev->devlist);
|
||||
video_device_release(dev->vbi_dev);
|
||||
video_device_release(dev->vdev);
|
||||
kfree(dev);
|
||||
em28xx_devused&=~(1<<dev->devno);
|
||||
kfree(dev);
|
||||
return -ENODEV;
|
||||
} else {
|
||||
printk("registered VBI\n");
|
||||
|
@ -1,6 +1,6 @@
|
||||
config USB_ET61X251
|
||||
tristate "USB ET61X[12]51 PC Camera Controller support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on Etoms ET61X151
|
||||
or ET61X251 PC Camera Controllers.
|
||||
|
@ -1,6 +1,6 @@
|
||||
config USB_PWC
|
||||
tristate "USB Philips Cameras"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y or M here if you want to use one of these Philips & OEM
|
||||
webcams:
|
||||
|
@ -1,20 +1,3 @@
|
||||
ifneq ($(KERNELRELEASE),)
|
||||
|
||||
pwc-objs := pwc-if.o pwc-misc.o pwc-ctrl.o pwc-uncompress.o pwc-timon.o pwc-kiara.o
|
||||
|
||||
obj-$(CONFIG_USB_PWC) += pwc.o
|
||||
|
||||
else
|
||||
|
||||
KDIR := /lib/modules/$(shell uname -r)/build
|
||||
PWD := $(shell pwd)
|
||||
|
||||
default:
|
||||
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
|
||||
|
||||
endif
|
||||
|
||||
clean:
|
||||
rm -f *.[oas] .*.flags *.ko .*.cmd .*.d .*.tmp *.mod.c
|
||||
rm -rf .tmp_versions
|
||||
|
||||
|
@ -142,6 +142,7 @@ struct i2c_reg_value {
|
||||
static const struct i2c_reg_value saa7129_init_config_extra[] = {
|
||||
{ SAA7127_REG_OUTPUT_PORT_CONTROL, 0x38 },
|
||||
{ SAA7127_REG_VTRIG, 0xfa },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static const struct i2c_reg_value saa7127_init_config_common[] = {
|
||||
|
@ -3504,6 +3504,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
|
||||
/* power-up tuner chip */
|
||||
saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000);
|
||||
saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000000);
|
||||
break;
|
||||
case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:
|
||||
/* this turns the remote control chip off to work around a bug in it */
|
||||
saa_writeb(SAA7134_GPIO_GPMODE1, 0x80);
|
||||
|
@ -548,6 +548,8 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
|
||||
if (report & SAA7134_IRQ_REPORT_GPIO16) {
|
||||
switch (dev->has_remote) {
|
||||
case SAA7134_REMOTE_GPIO:
|
||||
if (!dev->remote)
|
||||
break;
|
||||
if (dev->remote->mask_keydown & 0x10000) {
|
||||
saa7134_input_irq(dev);
|
||||
}
|
||||
@ -564,6 +566,8 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
|
||||
if (report & SAA7134_IRQ_REPORT_GPIO18) {
|
||||
switch (dev->has_remote) {
|
||||
case SAA7134_REMOTE_GPIO:
|
||||
if (!dev->remote)
|
||||
break;
|
||||
if ((dev->remote->mask_keydown & 0x40000) ||
|
||||
(dev->remote->mask_keyup & 0x40000)) {
|
||||
saa7134_input_irq(dev);
|
||||
@ -676,7 +680,7 @@ static int saa7134_hwinit2(struct saa7134_dev *dev)
|
||||
SAA7134_IRQ2_INTE_PE |
|
||||
SAA7134_IRQ2_INTE_AR;
|
||||
|
||||
if (dev->has_remote == SAA7134_REMOTE_GPIO) {
|
||||
if (dev->has_remote == SAA7134_REMOTE_GPIO && dev->remote) {
|
||||
if (dev->remote->mask_keydown & 0x10000)
|
||||
irq2_mask |= SAA7134_IRQ2_INTE_GPIO16;
|
||||
else if (dev->remote->mask_keydown & 0x40000)
|
||||
|
@ -31,8 +31,10 @@
|
||||
#include "saa7134.h"
|
||||
#include <media/v4l2-common.h>
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
/* Include V4L1 specific functions. Should be removed soon */
|
||||
#include <linux/videodev.h>
|
||||
#endif
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
config USB_SN9C102
|
||||
tristate "USB SN9C10x PC Camera Controller support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on SONiX SN9C101,
|
||||
SN9C102 or SN9C103 PC Camera Controllers.
|
||||
|
@ -877,8 +877,8 @@ static struct tuner_params tuner_philips_fmd1216me_mk3_params[] = {
|
||||
/* ------------ TUNER_LG_TDVS_H062F - INFINEON ATSC ------------ */
|
||||
|
||||
static struct tuner_range tuner_tua6034_ntsc_ranges[] = {
|
||||
{ 16 * 160.00 /*MHz*/, 0x8e, 0x01 },
|
||||
{ 16 * 455.00 /*MHz*/, 0x8e, 0x02 },
|
||||
{ 16 * 165.00 /*MHz*/, 0x8e, 0x01 },
|
||||
{ 16 * 450.00 /*MHz*/, 0x8e, 0x02 },
|
||||
{ 16 * 999.99 , 0x8e, 0x04 },
|
||||
};
|
||||
|
||||
|
@ -218,7 +218,7 @@ hauppauge_tuner[] =
|
||||
/* 110-119 */
|
||||
{ TUNER_ABSENT, "Thompson DTT75105"},
|
||||
{ TUNER_ABSENT, "Conexant_CX24109"},
|
||||
{ TUNER_ABSENT, "TCL M2523_5N_E"},
|
||||
{ TUNER_TCL_2002N, "TCL M2523_5N_E"},
|
||||
{ TUNER_ABSENT, "TCL M2523_3DB_E"},
|
||||
{ TUNER_ABSENT, "Philips 8275A"},
|
||||
{ TUNER_ABSENT, "Microtune MT2060"},
|
||||
|
@ -3,7 +3,7 @@ config VIDEO_USBVIDEO
|
||||
|
||||
config USB_VICAM
|
||||
tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_DEV && EXPERIMENTAL
|
||||
depends on USB && VIDEO_V4L1 && EXPERIMENTAL
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you have 3com homeconnect camera (vicam).
|
||||
@ -13,7 +13,7 @@ config USB_VICAM
|
||||
|
||||
config USB_IBMCAM
|
||||
tristate "USB IBM (Xirlink) C-it Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you want to connect a IBM "C-It" camera, also known as
|
||||
@ -28,7 +28,7 @@ config USB_IBMCAM
|
||||
|
||||
config USB_KONICAWC
|
||||
tristate "USB Konica Webcam support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you want support for webcams based on a Konica
|
||||
|
@ -26,6 +26,11 @@
|
||||
#include <linux/random.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
/* Include V4L1 specific functions. Should be removed soon */
|
||||
#include <linux/videodev.h>
|
||||
#endif
|
||||
#include <linux/interrupt.h>
|
||||
#include <media/video-buf.h>
|
||||
#include <media/v4l2-common.h>
|
||||
|
@ -1,6 +1,6 @@
|
||||
config USB_ZC0301
|
||||
tristate "USB ZC0301 Image Processor and Control Chip support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on the ZC0301
|
||||
Image Processor and Control Chip.
|
||||
|
@ -310,7 +310,7 @@ static void au1xmmc_data_complete(struct au1xmmc_host *host, u32 status)
|
||||
}
|
||||
else
|
||||
data->bytes_xfered =
|
||||
(data->blocks * (1 << data->blksz_bits)) -
|
||||
(data->blocks * data->blksz) -
|
||||
host->pio.len;
|
||||
}
|
||||
|
||||
@ -575,7 +575,7 @@ static int
|
||||
au1xmmc_prepare_data(struct au1xmmc_host *host, struct mmc_data *data)
|
||||
{
|
||||
|
||||
int datalen = data->blocks * (1 << data->blksz_bits);
|
||||
int datalen = data->blocks * data->blksz;
|
||||
|
||||
if (dma != 0)
|
||||
host->flags |= HOST_F_DMA;
|
||||
@ -596,7 +596,7 @@ au1xmmc_prepare_data(struct au1xmmc_host *host, struct mmc_data *data)
|
||||
if (host->dma.len == 0)
|
||||
return MMC_ERR_TIMEOUT;
|
||||
|
||||
au_writel((1 << data->blksz_bits) - 1, HOST_BLKSIZE(host));
|
||||
au_writel(data->blksz - 1, HOST_BLKSIZE(host));
|
||||
|
||||
if (host->flags & HOST_F_DMA) {
|
||||
int i;
|
||||
|
@ -218,8 +218,10 @@ static int imxmci_busy_wait_for_status(struct imxmci_host *host,
|
||||
if(!loops)
|
||||
return 0;
|
||||
|
||||
dev_info(mmc_dev(host->mmc), "busy wait for %d usec in %s, STATUS = 0x%x (0x%x)\n",
|
||||
loops, where, *pstat, stat_mask);
|
||||
/* The busy-wait is expected there for clock <8MHz due to SDHC hardware flaws */
|
||||
if(!(stat_mask & STATUS_END_CMD_RESP) || (host->mmc->ios.clock>=8000000))
|
||||
dev_info(mmc_dev(host->mmc), "busy wait for %d usec in %s, STATUS = 0x%x (0x%x)\n",
|
||||
loops, where, *pstat, stat_mask);
|
||||
return loops;
|
||||
}
|
||||
|
||||
@ -333,6 +335,9 @@ static void imxmci_start_cmd(struct imxmci_host *host, struct mmc_command *cmd,
|
||||
WARN_ON(host->cmd != NULL);
|
||||
host->cmd = cmd;
|
||||
|
||||
/* Ensure, that clock are stopped else command programming and start fails */
|
||||
imxmci_stop_clock(host);
|
||||
|
||||
if (cmd->flags & MMC_RSP_BUSY)
|
||||
cmdat |= CMD_DAT_CONT_BUSY;
|
||||
|
||||
@ -553,7 +558,7 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat)
|
||||
int trans_done = 0;
|
||||
unsigned int stat = *pstat;
|
||||
|
||||
if(host->actual_bus_width == MMC_BUS_WIDTH_4)
|
||||
if(host->actual_bus_width != MMC_BUS_WIDTH_4)
|
||||
burst_len = 16;
|
||||
else
|
||||
burst_len = 64;
|
||||
@ -591,8 +596,7 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat)
|
||||
stat = MMC_STATUS;
|
||||
|
||||
/* Flush extra bytes from FIFO */
|
||||
while(flush_len >= 2){
|
||||
flush_len -= 2;
|
||||
while(flush_len && !(stat & STATUS_DATA_TRANS_DONE)){
|
||||
i = MMC_BUFFER_ACCESS;
|
||||
stat = MMC_STATUS;
|
||||
stat &= ~STATUS_CRC_READ_ERR; /* Stupid but required there */
|
||||
@ -746,10 +750,6 @@ static void imxmci_tasklet_fnc(unsigned long data)
|
||||
data_dir_mask = STATUS_DATA_TRANS_DONE;
|
||||
}
|
||||
|
||||
imxmci_busy_wait_for_status(host, &stat,
|
||||
data_dir_mask,
|
||||
50, "imxmci_tasklet_fnc data");
|
||||
|
||||
if(stat & data_dir_mask) {
|
||||
clear_bit(IMXMCI_PEND_DMA_END_b, &host->pending_events);
|
||||
imxmci_data_done(host, stat);
|
||||
@ -865,7 +865,11 @@ static void imxmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
||||
|
||||
imxmci_stop_clock(host);
|
||||
MMC_CLK_RATE = (prescaler<<3) | clk;
|
||||
imxmci_start_clock(host);
|
||||
/*
|
||||
* Under my understanding, clock should not be started there, because it would
|
||||
* initiate SDHC sequencer and send last or random command into card
|
||||
*/
|
||||
/*imxmci_start_clock(host);*/
|
||||
|
||||
dev_dbg(mmc_dev(host->mmc), "MMC_CLK_RATE: 0x%08x\n", MMC_CLK_RATE);
|
||||
} else {
|
||||
|
@ -951,6 +951,7 @@ static void mmc_read_scrs(struct mmc_host *host)
|
||||
data.timeout_ns = card->csd.tacc_ns * 10;
|
||||
data.timeout_clks = card->csd.tacc_clks * 10;
|
||||
data.blksz_bits = 3;
|
||||
data.blksz = 1 << 3;
|
||||
data.blocks = 1;
|
||||
data.flags = MMC_DATA_READ;
|
||||
data.sg = &sg;
|
||||
|
@ -175,6 +175,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
|
||||
brq.data.timeout_ns = card->csd.tacc_ns * 10;
|
||||
brq.data.timeout_clks = card->csd.tacc_clks * 10;
|
||||
brq.data.blksz_bits = md->block_bits;
|
||||
brq.data.blksz = 1 << md->block_bits;
|
||||
brq.data.blocks = req->nr_sectors >> (md->block_bits - 9);
|
||||
brq.stop.opcode = MMC_STOP_TRANSMISSION;
|
||||
brq.stop.arg = 0;
|
||||
|
@ -119,7 +119,7 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)
|
||||
nob = 0xffff;
|
||||
|
||||
writel(nob, host->base + MMC_NOB);
|
||||
writel(1 << data->blksz_bits, host->base + MMC_BLKLEN);
|
||||
writel(data->blksz, host->base + MMC_BLKLEN);
|
||||
|
||||
clks = (unsigned long long)data->timeout_ns * CLOCKRATE;
|
||||
do_div(clks, 1000000000UL);
|
||||
@ -283,7 +283,7 @@ static int pxamci_data_done(struct pxamci_host *host, unsigned int stat)
|
||||
* data blocks as being in error.
|
||||
*/
|
||||
if (data->error == MMC_ERR_NONE)
|
||||
data->bytes_xfered = data->blocks << data->blksz_bits;
|
||||
data->bytes_xfered = data->blocks * data->blksz;
|
||||
else
|
||||
data->bytes_xfered = 0;
|
||||
|
||||
|
@ -662,14 +662,14 @@ static void wbsd_prepare_data(struct wbsd_host *host, struct mmc_data *data)
|
||||
unsigned long dmaflags;
|
||||
|
||||
DBGF("blksz %04x blks %04x flags %08x\n",
|
||||
1 << data->blksz_bits, data->blocks, data->flags);
|
||||
data->blksz, data->blocks, data->flags);
|
||||
DBGF("tsac %d ms nsac %d clk\n",
|
||||
data->timeout_ns / 1000000, data->timeout_clks);
|
||||
|
||||
/*
|
||||
* Calculate size.
|
||||
*/
|
||||
host->size = data->blocks << data->blksz_bits;
|
||||
host->size = data->blocks * data->blksz;
|
||||
|
||||
/*
|
||||
* Check timeout values for overflow.
|
||||
@ -696,12 +696,12 @@ static void wbsd_prepare_data(struct wbsd_host *host, struct mmc_data *data)
|
||||
* Two bytes are needed for each data line.
|
||||
*/
|
||||
if (host->bus_width == MMC_BUS_WIDTH_1) {
|
||||
blksize = (1 << data->blksz_bits) + 2;
|
||||
blksize = data->blksz + 2;
|
||||
|
||||
wbsd_write_index(host, WBSD_IDX_PBSMSB, (blksize >> 4) & 0xF0);
|
||||
wbsd_write_index(host, WBSD_IDX_PBSLSB, blksize & 0xFF);
|
||||
} else if (host->bus_width == MMC_BUS_WIDTH_4) {
|
||||
blksize = (1 << data->blksz_bits) + 2 * 4;
|
||||
blksize = data->blksz + 2 * 4;
|
||||
|
||||
wbsd_write_index(host, WBSD_IDX_PBSMSB,
|
||||
((blksize >> 4) & 0xF0) | WBSD_DATA_WIDTH);
|
||||
|
@ -2891,78 +2891,6 @@ static int nv_open(struct net_device *dev)
|
||||
goto out_drain;
|
||||
}
|
||||
|
||||
if (np->msi_flags & NV_MSI_X_CAPABLE) {
|
||||
for (i = 0; i < (np->msi_flags & NV_MSI_X_VECTORS_MASK); i++) {
|
||||
np->msi_x_entry[i].entry = i;
|
||||
}
|
||||
if ((ret = pci_enable_msix(np->pci_dev, np->msi_x_entry, (np->msi_flags & NV_MSI_X_VECTORS_MASK))) == 0) {
|
||||
np->msi_flags |= NV_MSI_X_ENABLED;
|
||||
if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) {
|
||||
/* Request irq for rx handling */
|
||||
if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector, &nv_nic_irq_rx, SA_SHIRQ, dev->name, dev) != 0) {
|
||||
printk(KERN_INFO "forcedeth: request_irq failed for rx %d\n", ret);
|
||||
pci_disable_msix(np->pci_dev);
|
||||
np->msi_flags &= ~NV_MSI_X_ENABLED;
|
||||
goto out_drain;
|
||||
}
|
||||
/* Request irq for tx handling */
|
||||
if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector, &nv_nic_irq_tx, SA_SHIRQ, dev->name, dev) != 0) {
|
||||
printk(KERN_INFO "forcedeth: request_irq failed for tx %d\n", ret);
|
||||
pci_disable_msix(np->pci_dev);
|
||||
np->msi_flags &= ~NV_MSI_X_ENABLED;
|
||||
goto out_drain;
|
||||
}
|
||||
/* Request irq for link and timer handling */
|
||||
if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector, &nv_nic_irq_other, SA_SHIRQ, dev->name, dev) != 0) {
|
||||
printk(KERN_INFO "forcedeth: request_irq failed for link %d\n", ret);
|
||||
pci_disable_msix(np->pci_dev);
|
||||
np->msi_flags &= ~NV_MSI_X_ENABLED;
|
||||
goto out_drain;
|
||||
}
|
||||
|
||||
/* map interrupts to their respective vector */
|
||||
writel(0, base + NvRegMSIXMap0);
|
||||
writel(0, base + NvRegMSIXMap1);
|
||||
set_msix_vector_map(dev, NV_MSI_X_VECTOR_RX, NVREG_IRQ_RX_ALL);
|
||||
set_msix_vector_map(dev, NV_MSI_X_VECTOR_TX, NVREG_IRQ_TX_ALL);
|
||||
set_msix_vector_map(dev, NV_MSI_X_VECTOR_OTHER, NVREG_IRQ_OTHER);
|
||||
} else {
|
||||
/* Request irq for all interrupts */
|
||||
if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector, &nv_nic_irq, SA_SHIRQ, dev->name, dev) != 0) {
|
||||
printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret);
|
||||
pci_disable_msix(np->pci_dev);
|
||||
np->msi_flags &= ~NV_MSI_X_ENABLED;
|
||||
goto out_drain;
|
||||
}
|
||||
|
||||
/* map interrupts to vector 0 */
|
||||
writel(0, base + NvRegMSIXMap0);
|
||||
writel(0, base + NvRegMSIXMap1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ret != 0 && np->msi_flags & NV_MSI_CAPABLE) {
|
||||
if ((ret = pci_enable_msi(np->pci_dev)) == 0) {
|
||||
np->msi_flags |= NV_MSI_ENABLED;
|
||||
if (request_irq(np->pci_dev->irq, &nv_nic_irq, SA_SHIRQ, dev->name, dev) != 0) {
|
||||
printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret);
|
||||
pci_disable_msi(np->pci_dev);
|
||||
np->msi_flags &= ~NV_MSI_ENABLED;
|
||||
goto out_drain;
|
||||
}
|
||||
|
||||
/* map interrupts to vector 0 */
|
||||
writel(0, base + NvRegMSIMap0);
|
||||
writel(0, base + NvRegMSIMap1);
|
||||
/* enable msi vector 0 */
|
||||
writel(NVREG_MSI_VECTOR_0_ENABLED, base + NvRegMSIIrqMask);
|
||||
}
|
||||
}
|
||||
if (ret != 0) {
|
||||
if (request_irq(np->pci_dev->irq, &nv_nic_irq, SA_SHIRQ, dev->name, dev) != 0)
|
||||
goto out_drain;
|
||||
}
|
||||
|
||||
/* ask for interrupts */
|
||||
nv_enable_hw_interrupts(dev, np->irqmask);
|
||||
|
||||
|
@ -149,6 +149,8 @@ static void enp2611_check_link_status(unsigned long __dummy)
|
||||
int status;
|
||||
|
||||
dev = nds[i];
|
||||
if (dev == NULL)
|
||||
continue;
|
||||
|
||||
status = pm3386_is_link_up(i);
|
||||
if (status && !netif_carrier_ok(dev)) {
|
||||
@ -191,6 +193,7 @@ static void enp2611_set_port_admin_status(int port, int up)
|
||||
|
||||
static int __init enp2611_init_module(void)
|
||||
{
|
||||
int ports;
|
||||
int i;
|
||||
|
||||
if (!machine_is_enp2611())
|
||||
@ -199,7 +202,8 @@ static int __init enp2611_init_module(void)
|
||||
caleb_reset();
|
||||
pm3386_reset();
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
ports = pm3386_port_count();
|
||||
for (i = 0; i < ports; i++) {
|
||||
nds[i] = ixpdev_alloc(i, sizeof(struct enp2611_ixpdev_priv));
|
||||
if (nds[i] == NULL) {
|
||||
while (--i >= 0)
|
||||
@ -215,9 +219,10 @@ static int __init enp2611_init_module(void)
|
||||
|
||||
ixp2400_msf_init(&enp2611_msf_parameters);
|
||||
|
||||
if (ixpdev_init(3, nds, enp2611_set_port_admin_status)) {
|
||||
for (i = 0; i < 3; i++)
|
||||
free_netdev(nds[i]);
|
||||
if (ixpdev_init(ports, nds, enp2611_set_port_admin_status)) {
|
||||
for (i = 0; i < ports; i++)
|
||||
if (nds[i])
|
||||
free_netdev(nds[i]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -86,40 +86,53 @@ static void pm3386_port_reg_write(int port, int _reg, int spacing, u16 value)
|
||||
pm3386_reg_write(port >> 1, reg, value);
|
||||
}
|
||||
|
||||
int pm3386_secondary_present(void)
|
||||
{
|
||||
return pm3386_reg_read(1, 0) == 0x3386;
|
||||
}
|
||||
|
||||
void pm3386_reset(void)
|
||||
{
|
||||
u8 mac[3][6];
|
||||
int secondary;
|
||||
|
||||
secondary = pm3386_secondary_present();
|
||||
|
||||
/* Save programmed MAC addresses. */
|
||||
pm3386_get_mac(0, mac[0]);
|
||||
pm3386_get_mac(1, mac[1]);
|
||||
pm3386_get_mac(2, mac[2]);
|
||||
if (secondary)
|
||||
pm3386_get_mac(2, mac[2]);
|
||||
|
||||
/* Assert analog and digital reset. */
|
||||
pm3386_reg_write(0, 0x002, 0x0060);
|
||||
pm3386_reg_write(1, 0x002, 0x0060);
|
||||
if (secondary)
|
||||
pm3386_reg_write(1, 0x002, 0x0060);
|
||||
mdelay(1);
|
||||
|
||||
/* Deassert analog reset. */
|
||||
pm3386_reg_write(0, 0x002, 0x0062);
|
||||
pm3386_reg_write(1, 0x002, 0x0062);
|
||||
if (secondary)
|
||||
pm3386_reg_write(1, 0x002, 0x0062);
|
||||
mdelay(10);
|
||||
|
||||
/* Deassert digital reset. */
|
||||
pm3386_reg_write(0, 0x002, 0x0063);
|
||||
pm3386_reg_write(1, 0x002, 0x0063);
|
||||
if (secondary)
|
||||
pm3386_reg_write(1, 0x002, 0x0063);
|
||||
mdelay(10);
|
||||
|
||||
/* Restore programmed MAC addresses. */
|
||||
pm3386_set_mac(0, mac[0]);
|
||||
pm3386_set_mac(1, mac[1]);
|
||||
pm3386_set_mac(2, mac[2]);
|
||||
if (secondary)
|
||||
pm3386_set_mac(2, mac[2]);
|
||||
|
||||
/* Disable carrier on all ports. */
|
||||
pm3386_set_carrier(0, 0);
|
||||
pm3386_set_carrier(1, 0);
|
||||
pm3386_set_carrier(2, 0);
|
||||
if (secondary)
|
||||
pm3386_set_carrier(2, 0);
|
||||
}
|
||||
|
||||
static u16 swaph(u16 x)
|
||||
@ -127,6 +140,11 @@ static u16 swaph(u16 x)
|
||||
return ((x << 8) | (x >> 8)) & 0xffff;
|
||||
}
|
||||
|
||||
int pm3386_port_count(void)
|
||||
{
|
||||
return 2 + pm3386_secondary_present();
|
||||
}
|
||||
|
||||
void pm3386_init_port(int port)
|
||||
{
|
||||
int pm = port >> 1;
|
||||
|
@ -13,6 +13,7 @@
|
||||
#define __PM3386_H
|
||||
|
||||
void pm3386_reset(void);
|
||||
int pm3386_port_count(void);
|
||||
void pm3386_init_port(int port);
|
||||
void pm3386_get_mac(int port, u8 *mac);
|
||||
void pm3386_set_mac(int port, u8 *mac);
|
||||
|
@ -1691,17 +1691,6 @@ static void do_set_multicast_list(struct net_device *dev)
|
||||
memset(ei_local->mcfilter, 0xFF, 8);
|
||||
}
|
||||
|
||||
/*
|
||||
* DP8390 manuals don't specify any magic sequence for altering
|
||||
* the multicast regs on an already running card. To be safe, we
|
||||
* ensure multicast mode is off prior to loading up the new hash
|
||||
* table. If this proves to be not enough, we can always resort
|
||||
* to stopping the NIC, loading the table and then restarting.
|
||||
*/
|
||||
|
||||
if (netif_running(dev))
|
||||
outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
|
||||
|
||||
outb_p(E8390_NODMA + E8390_PAGE1, e8390_base + E8390_CMD);
|
||||
for(i = 0; i < 8; i++)
|
||||
{
|
||||
@ -1715,6 +1704,8 @@ static void do_set_multicast_list(struct net_device *dev)
|
||||
outb_p(E8390_RXCONFIG | 0x48, e8390_base + EN0_RXCR);
|
||||
else
|
||||
outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR);
|
||||
|
||||
outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -78,8 +78,7 @@ static const struct pci_device_id skge_id_table[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_GE) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_YU) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, PCI_DEVICE_ID_DLINK_DGE510T), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b00) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b01) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b01) }, /* DGE-530T */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4320) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5005) }, /* Belkin */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_CNET, PCI_DEVICE_ID_CNET_GIGACARD) },
|
||||
@ -402,7 +401,7 @@ static int skge_set_ring_param(struct net_device *dev,
|
||||
int err;
|
||||
|
||||
if (p->rx_pending == 0 || p->rx_pending > MAX_RX_RING_SIZE ||
|
||||
p->tx_pending == 0 || p->tx_pending > MAX_TX_RING_SIZE)
|
||||
p->tx_pending < MAX_SKB_FRAGS+1 || p->tx_pending > MAX_TX_RING_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
skge->rx_ring.count = p->rx_pending;
|
||||
@ -2717,8 +2716,7 @@ static int skge_poll(struct net_device *dev, int *budget)
|
||||
if (control & BMU_OWN)
|
||||
break;
|
||||
|
||||
skb = skge_rx_get(skge, e, control, rd->status,
|
||||
le16_to_cpu(rd->csum2));
|
||||
skb = skge_rx_get(skge, e, control, rd->status, rd->csum2);
|
||||
if (likely(skb)) {
|
||||
dev->last_rx = jiffies;
|
||||
netif_receive_skb(skb);
|
||||
|
@ -51,7 +51,7 @@
|
||||
#include "sky2.h"
|
||||
|
||||
#define DRV_NAME "sky2"
|
||||
#define DRV_VERSION "1.3"
|
||||
#define DRV_VERSION "1.4"
|
||||
#define PFX DRV_NAME " "
|
||||
|
||||
/*
|
||||
@ -105,6 +105,7 @@ MODULE_PARM_DESC(idle_timeout, "Idle timeout workaround for lost interrupts (ms)
|
||||
static const struct pci_device_id sky2_id_table[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b00) }, /* DGE-560T */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4340) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4341) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4342) },
|
||||
@ -235,6 +236,7 @@ static int sky2_set_power_state(struct sky2_hw *hw, pci_power_t state)
|
||||
}
|
||||
|
||||
if (hw->chip_id == CHIP_ID_YUKON_EC_U) {
|
||||
sky2_write16(hw, B0_CTST, Y2_HW_WOL_ON);
|
||||
sky2_pci_write32(hw, PCI_DEV_REG3, 0);
|
||||
reg1 = sky2_pci_read32(hw, PCI_DEV_REG4);
|
||||
reg1 &= P_ASPM_CONTROL_MSK;
|
||||
@ -306,7 +308,7 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port)
|
||||
u16 ctrl, ct1000, adv, pg, ledctrl, ledover;
|
||||
|
||||
if (sky2->autoneg == AUTONEG_ENABLE &&
|
||||
(hw->chip_id != CHIP_ID_YUKON_XL || hw->chip_id == CHIP_ID_YUKON_EC_U)) {
|
||||
!(hw->chip_id == CHIP_ID_YUKON_XL || hw->chip_id == CHIP_ID_YUKON_EC_U)) {
|
||||
u16 ectrl = gm_phy_read(hw, port, PHY_MARV_EXT_CTRL);
|
||||
|
||||
ectrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK |
|
||||
@ -1020,7 +1022,25 @@ static int sky2_up(struct net_device *dev)
|
||||
struct sky2_hw *hw = sky2->hw;
|
||||
unsigned port = sky2->port;
|
||||
u32 ramsize, rxspace, imask;
|
||||
int err = -ENOMEM;
|
||||
int cap, err = -ENOMEM;
|
||||
struct net_device *otherdev = hw->dev[sky2->port^1];
|
||||
|
||||
/*
|
||||
* On dual port PCI-X card, there is an problem where status
|
||||
* can be received out of order due to split transactions
|
||||
*/
|
||||
if (otherdev && netif_running(otherdev) &&
|
||||
(cap = pci_find_capability(hw->pdev, PCI_CAP_ID_PCIX))) {
|
||||
struct sky2_port *osky2 = netdev_priv(otherdev);
|
||||
u16 cmd;
|
||||
|
||||
cmd = sky2_pci_read16(hw, cap + PCI_X_CMD);
|
||||
cmd &= ~PCI_X_CMD_MAX_SPLIT;
|
||||
sky2_pci_write16(hw, cap + PCI_X_CMD, cmd);
|
||||
|
||||
sky2->rx_csum = 0;
|
||||
osky2->rx_csum = 0;
|
||||
}
|
||||
|
||||
if (netif_msg_ifup(sky2))
|
||||
printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
|
||||
@ -1899,6 +1919,12 @@ static inline void sky2_tx_done(struct net_device *dev, u16 last)
|
||||
}
|
||||
}
|
||||
|
||||
/* Is status ring empty or is there more to do? */
|
||||
static inline int sky2_more_work(const struct sky2_hw *hw)
|
||||
{
|
||||
return (hw->st_idx != sky2_read16(hw, STAT_PUT_IDX));
|
||||
}
|
||||
|
||||
/* Process status response ring */
|
||||
static int sky2_status_intr(struct sky2_hw *hw, int to_do)
|
||||
{
|
||||
@ -2171,19 +2197,19 @@ static int sky2_poll(struct net_device *dev0, int *budget)
|
||||
if (status & Y2_IS_CHK_TXA2)
|
||||
sky2_descriptor_error(hw, 1, "transmit", Y2_IS_CHK_TXA2);
|
||||
|
||||
if (status & Y2_IS_STAT_BMU)
|
||||
sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ);
|
||||
|
||||
work_done = sky2_status_intr(hw, work_limit);
|
||||
*budget -= work_done;
|
||||
dev0->quota -= work_done;
|
||||
|
||||
if (work_done >= work_limit)
|
||||
if (status & Y2_IS_STAT_BMU)
|
||||
sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ);
|
||||
|
||||
if (sky2_more_work(hw))
|
||||
return 1;
|
||||
|
||||
netif_rx_complete(dev0);
|
||||
|
||||
status = sky2_read32(hw, B0_Y2_SP_LISR);
|
||||
sky2_read32(hw, B0_Y2_SP_LISR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3067,12 +3093,7 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
|
||||
sky2->duplex = -1;
|
||||
sky2->speed = -1;
|
||||
sky2->advertising = sky2_supported_modes(hw);
|
||||
|
||||
/* Receive checksum disabled for Yukon XL
|
||||
* because of observed problems with incorrect
|
||||
* values when multiple packets are received in one interrupt
|
||||
*/
|
||||
sky2->rx_csum = (hw->chip_id != CHIP_ID_YUKON_XL);
|
||||
sky2->rx_csum = 1;
|
||||
|
||||
spin_lock_init(&sky2->phy_lock);
|
||||
sky2->tx_pending = TX_DEF_PENDING;
|
||||
|
@ -214,6 +214,8 @@ enum csr_regs {
|
||||
enum {
|
||||
Y2_VMAIN_AVAIL = 1<<17,/* VMAIN available (YUKON-2 only) */
|
||||
Y2_VAUX_AVAIL = 1<<16,/* VAUX available (YUKON-2 only) */
|
||||
Y2_HW_WOL_ON = 1<<15,/* HW WOL On (Yukon-EC Ultra A1 only) */
|
||||
Y2_HW_WOL_OFF = 1<<14,/* HW WOL On (Yukon-EC Ultra A1 only) */
|
||||
Y2_ASF_ENABLE = 1<<13,/* ASF Unit Enable (YUKON-2 only) */
|
||||
Y2_ASF_DISABLE = 1<<12,/* ASF Unit Disable (YUKON-2 only) */
|
||||
Y2_CLK_RUN_ENA = 1<<11,/* CLK_RUN Enable (YUKON-2 only) */
|
||||
|
@ -850,7 +850,7 @@ static void init_rxtx_rings(struct net_device *dev)
|
||||
break;
|
||||
skb->dev = dev; /* Mark as being used by this device. */
|
||||
np->rx_addr[i] = pci_map_single(np->pci_dev,skb->data,
|
||||
skb->len,PCI_DMA_FROMDEVICE);
|
||||
np->rx_buf_sz,PCI_DMA_FROMDEVICE);
|
||||
|
||||
np->rx_ring[i].buffer1 = np->rx_addr[i];
|
||||
np->rx_ring[i].status = DescOwn;
|
||||
@ -1316,7 +1316,7 @@ static int netdev_rx(struct net_device *dev)
|
||||
skb->dev = dev; /* Mark as being used by this device. */
|
||||
np->rx_addr[entry] = pci_map_single(np->pci_dev,
|
||||
skb->data,
|
||||
skb->len, PCI_DMA_FROMDEVICE);
|
||||
np->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
||||
np->rx_ring[entry].buffer1 = np->rx_addr[entry];
|
||||
}
|
||||
wmb();
|
||||
|
@ -491,8 +491,6 @@ struct rhine_private {
|
||||
u8 tx_thresh, rx_thresh;
|
||||
|
||||
struct mii_if_info mii_if;
|
||||
struct work_struct tx_timeout_task;
|
||||
struct work_struct check_media_task;
|
||||
void __iomem *base;
|
||||
};
|
||||
|
||||
@ -500,8 +498,6 @@ static int mdio_read(struct net_device *dev, int phy_id, int location);
|
||||
static void mdio_write(struct net_device *dev, int phy_id, int location, int value);
|
||||
static int rhine_open(struct net_device *dev);
|
||||
static void rhine_tx_timeout(struct net_device *dev);
|
||||
static void rhine_tx_timeout_task(struct net_device *dev);
|
||||
static void rhine_check_media_task(struct net_device *dev);
|
||||
static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev);
|
||||
static irqreturn_t rhine_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
|
||||
static void rhine_tx(struct net_device *dev);
|
||||
@ -856,12 +852,6 @@ static int __devinit rhine_init_one(struct pci_dev *pdev,
|
||||
if (rp->quirks & rqRhineI)
|
||||
dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM;
|
||||
|
||||
INIT_WORK(&rp->tx_timeout_task,
|
||||
(void (*)(void *))rhine_tx_timeout_task, dev);
|
||||
|
||||
INIT_WORK(&rp->check_media_task,
|
||||
(void (*)(void *))rhine_check_media_task, dev);
|
||||
|
||||
/* dev->name not defined before register_netdev()! */
|
||||
rc = register_netdev(dev);
|
||||
if (rc)
|
||||
@ -1108,11 +1098,6 @@ static void rhine_set_carrier(struct mii_if_info *mii)
|
||||
netif_carrier_ok(mii->dev));
|
||||
}
|
||||
|
||||
static void rhine_check_media_task(struct net_device *dev)
|
||||
{
|
||||
rhine_check_media(dev, 0);
|
||||
}
|
||||
|
||||
static void init_registers(struct net_device *dev)
|
||||
{
|
||||
struct rhine_private *rp = netdev_priv(dev);
|
||||
@ -1166,8 +1151,8 @@ static void rhine_disable_linkmon(void __iomem *ioaddr, u32 quirks)
|
||||
if (quirks & rqRhineI) {
|
||||
iowrite8(0x01, ioaddr + MIIRegAddr); // MII_BMSR
|
||||
|
||||
/* Do not call from ISR! */
|
||||
msleep(1);
|
||||
/* Can be called from ISR. Evil. */
|
||||
mdelay(1);
|
||||
|
||||
/* 0x80 must be set immediately before turning it off */
|
||||
iowrite8(0x80, ioaddr + MIICmd);
|
||||
@ -1255,16 +1240,6 @@ static int rhine_open(struct net_device *dev)
|
||||
}
|
||||
|
||||
static void rhine_tx_timeout(struct net_device *dev)
|
||||
{
|
||||
struct rhine_private *rp = netdev_priv(dev);
|
||||
|
||||
/*
|
||||
* Move bulk of work outside of interrupt context
|
||||
*/
|
||||
schedule_work(&rp->tx_timeout_task);
|
||||
}
|
||||
|
||||
static void rhine_tx_timeout_task(struct net_device *dev)
|
||||
{
|
||||
struct rhine_private *rp = netdev_priv(dev);
|
||||
void __iomem *ioaddr = rp->base;
|
||||
@ -1677,7 +1652,7 @@ static void rhine_error(struct net_device *dev, int intr_status)
|
||||
spin_lock(&rp->lock);
|
||||
|
||||
if (intr_status & IntrLinkChange)
|
||||
schedule_work(&rp->check_media_task);
|
||||
rhine_check_media(dev, 0);
|
||||
if (intr_status & IntrStatsMax) {
|
||||
rp->stats.rx_crc_errors += ioread16(ioaddr + RxCRCErrs);
|
||||
rp->stats.rx_missed_errors += ioread16(ioaddr + RxMissed);
|
||||
@ -1927,9 +1902,6 @@ static int rhine_close(struct net_device *dev)
|
||||
spin_unlock_irq(&rp->lock);
|
||||
|
||||
free_irq(rp->pdev->irq, dev);
|
||||
|
||||
flush_scheduled_work();
|
||||
|
||||
free_rbufs(dev);
|
||||
free_tbufs(dev);
|
||||
free_ring(dev);
|
||||
|
@ -33,13 +33,10 @@ acpi_query_osc (
|
||||
acpi_status status;
|
||||
struct acpi_object_list input;
|
||||
union acpi_object in_params[4];
|
||||
struct acpi_buffer output;
|
||||
union acpi_object out_obj;
|
||||
struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
union acpi_object *out_obj;
|
||||
u32 osc_dw0;
|
||||
|
||||
/* Setting up output buffer */
|
||||
output.length = sizeof(out_obj) + 3*sizeof(u32);
|
||||
output.pointer = &out_obj;
|
||||
|
||||
/* Setting up input parameters */
|
||||
input.count = 4;
|
||||
@ -61,12 +58,15 @@ acpi_query_osc (
|
||||
"Evaluate _OSC Set fails. Status = 0x%04x\n", status);
|
||||
return status;
|
||||
}
|
||||
if (out_obj.type != ACPI_TYPE_BUFFER) {
|
||||
out_obj = output.pointer;
|
||||
|
||||
if (out_obj->type != ACPI_TYPE_BUFFER) {
|
||||
printk(KERN_DEBUG
|
||||
"Evaluate _OSC returns wrong type\n");
|
||||
return AE_TYPE;
|
||||
status = AE_TYPE;
|
||||
goto query_osc_out;
|
||||
}
|
||||
osc_dw0 = *((u32 *) out_obj.buffer.pointer);
|
||||
osc_dw0 = *((u32 *) out_obj->buffer.pointer);
|
||||
if (osc_dw0) {
|
||||
if (osc_dw0 & OSC_REQUEST_ERROR)
|
||||
printk(KERN_DEBUG "_OSC request fails\n");
|
||||
@ -76,15 +76,21 @@ acpi_query_osc (
|
||||
printk(KERN_DEBUG "_OSC invalid revision\n");
|
||||
if (osc_dw0 & OSC_CAPABILITIES_MASK_ERROR) {
|
||||
/* Update Global Control Set */
|
||||
global_ctrlsets = *((u32 *)(out_obj.buffer.pointer+8));
|
||||
return AE_OK;
|
||||
global_ctrlsets = *((u32 *)(out_obj->buffer.pointer+8));
|
||||
status = AE_OK;
|
||||
goto query_osc_out;
|
||||
}
|
||||
return AE_ERROR;
|
||||
status = AE_ERROR;
|
||||
goto query_osc_out;
|
||||
}
|
||||
|
||||
/* Update Global Control Set */
|
||||
global_ctrlsets = *((u32 *)(out_obj.buffer.pointer + 8));
|
||||
return AE_OK;
|
||||
global_ctrlsets = *((u32 *)(out_obj->buffer.pointer + 8));
|
||||
status = AE_OK;
|
||||
|
||||
query_osc_out:
|
||||
kfree(output.pointer);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@ -96,14 +102,10 @@ acpi_run_osc (
|
||||
acpi_status status;
|
||||
struct acpi_object_list input;
|
||||
union acpi_object in_params[4];
|
||||
struct acpi_buffer output;
|
||||
union acpi_object out_obj;
|
||||
struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
union acpi_object *out_obj;
|
||||
u32 osc_dw0;
|
||||
|
||||
/* Setting up output buffer */
|
||||
output.length = sizeof(out_obj) + 3*sizeof(u32);
|
||||
output.pointer = &out_obj;
|
||||
|
||||
/* Setting up input parameters */
|
||||
input.count = 4;
|
||||
input.pointer = in_params;
|
||||
@ -124,12 +126,14 @@ acpi_run_osc (
|
||||
"Evaluate _OSC Set fails. Status = 0x%04x\n", status);
|
||||
return status;
|
||||
}
|
||||
if (out_obj.type != ACPI_TYPE_BUFFER) {
|
||||
out_obj = output.pointer;
|
||||
if (out_obj->type != ACPI_TYPE_BUFFER) {
|
||||
printk(KERN_DEBUG
|
||||
"Evaluate _OSC returns wrong type\n");
|
||||
return AE_TYPE;
|
||||
status = AE_TYPE;
|
||||
goto run_osc_out;
|
||||
}
|
||||
osc_dw0 = *((u32 *) out_obj.buffer.pointer);
|
||||
osc_dw0 = *((u32 *) out_obj->buffer.pointer);
|
||||
if (osc_dw0) {
|
||||
if (osc_dw0 & OSC_REQUEST_ERROR)
|
||||
printk(KERN_DEBUG "_OSC request fails\n");
|
||||
@ -139,11 +143,17 @@ acpi_run_osc (
|
||||
printk(KERN_DEBUG "_OSC invalid revision\n");
|
||||
if (osc_dw0 & OSC_CAPABILITIES_MASK_ERROR) {
|
||||
printk(KERN_DEBUG "_OSC FW not grant req. control\n");
|
||||
return AE_SUPPORT;
|
||||
status = AE_SUPPORT;
|
||||
goto run_osc_out;
|
||||
}
|
||||
return AE_ERROR;
|
||||
status = AE_ERROR;
|
||||
goto run_osc_out;
|
||||
}
|
||||
return AE_OK;
|
||||
status = AE_OK;
|
||||
|
||||
run_osc_out:
|
||||
kfree(output.pointer);
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -589,7 +589,7 @@ static int pd6729_check_irq(int irq, int flags)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u_int __init pd6729_isa_scan(void)
|
||||
static u_int __devinit pd6729_isa_scan(void)
|
||||
{
|
||||
u_int mask0, mask = 0;
|
||||
int i;
|
||||
|
@ -141,13 +141,13 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file,
|
||||
/* try the driver's ioctl interface */
|
||||
if (ops->ioctl) {
|
||||
err = ops->ioctl(class_dev->dev, cmd, arg);
|
||||
if (err != -EINVAL)
|
||||
if (err != -ENOIOCTLCMD)
|
||||
return err;
|
||||
}
|
||||
|
||||
/* if the driver does not provide the ioctl interface
|
||||
* or if that particular ioctl was not implemented
|
||||
* (-EINVAL), we will try to emulate here.
|
||||
* (-ENOIOCTLCMD), we will try to emulate here.
|
||||
*/
|
||||
|
||||
switch (cmd) {
|
||||
@ -233,7 +233,7 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file,
|
||||
break;
|
||||
|
||||
default:
|
||||
err = -EINVAL;
|
||||
err = -ENOTTY;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -247,7 +247,7 @@ static int sa1100_rtc_ioctl(struct device *dev, unsigned int cmd,
|
||||
rtc_freq = arg;
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
static int sa1100_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
|
@ -71,7 +71,7 @@ static int test_rtc_ioctl(struct device *dev, unsigned int cmd,
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -270,7 +270,7 @@ static int vr41xx_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long
|
||||
epoch = arg;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -864,6 +864,9 @@ static unsigned int ata_id_xfermask(const u16 *id)
|
||||
/**
|
||||
* ata_port_queue_task - Queue port_task
|
||||
* @ap: The ata_port to queue port_task for
|
||||
* @fn: workqueue function to be scheduled
|
||||
* @data: data value to pass to workqueue function
|
||||
* @delay: delay time for workqueue function
|
||||
*
|
||||
* Schedule @fn(@data) for execution after @delay jiffies using
|
||||
* port_task. There is one port_task per port and it's the
|
||||
@ -2739,6 +2742,8 @@ static unsigned int ata_dev_set_xfermode(struct ata_port *ap,
|
||||
* ata_dev_init_params - Issue INIT DEV PARAMS command
|
||||
* @ap: Port associated with device @dev
|
||||
* @dev: Device to which command will be sent
|
||||
* @heads: Number of heads (taskfile parameter)
|
||||
* @sectors: Number of sectors (taskfile parameter)
|
||||
*
|
||||
* LOCKING:
|
||||
* Kernel thread context (may sleep)
|
||||
@ -4302,6 +4307,7 @@ int ata_device_resume(struct ata_port *ap, struct ata_device *dev)
|
||||
* ata_device_suspend - prepare a device for suspend
|
||||
* @ap: port the device is connected to
|
||||
* @dev: the device to suspend
|
||||
* @state: target power management state
|
||||
*
|
||||
* Flush the cache on the drive, if appropriate, then issue a
|
||||
* standbynow command.
|
||||
|
@ -37,7 +37,7 @@
|
||||
#include <asm/io.h>
|
||||
|
||||
#define DRV_NAME "sata_mv"
|
||||
#define DRV_VERSION "0.6"
|
||||
#define DRV_VERSION "0.7"
|
||||
|
||||
enum {
|
||||
/* BAR's are enumerated in terms of pci_resource_start() terms */
|
||||
@ -50,6 +50,12 @@ enum {
|
||||
|
||||
MV_PCI_REG_BASE = 0,
|
||||
MV_IRQ_COAL_REG_BASE = 0x18000, /* 6xxx part only */
|
||||
MV_IRQ_COAL_CAUSE = (MV_IRQ_COAL_REG_BASE + 0x08),
|
||||
MV_IRQ_COAL_CAUSE_LO = (MV_IRQ_COAL_REG_BASE + 0x88),
|
||||
MV_IRQ_COAL_CAUSE_HI = (MV_IRQ_COAL_REG_BASE + 0x8c),
|
||||
MV_IRQ_COAL_THRESHOLD = (MV_IRQ_COAL_REG_BASE + 0xcc),
|
||||
MV_IRQ_COAL_TIME_THRESHOLD = (MV_IRQ_COAL_REG_BASE + 0xd0),
|
||||
|
||||
MV_SATAHC0_REG_BASE = 0x20000,
|
||||
MV_FLASH_CTL = 0x1046c,
|
||||
MV_GPIO_PORT_CTL = 0x104f0,
|
||||
@ -302,9 +308,6 @@ struct mv_port_priv {
|
||||
dma_addr_t crpb_dma;
|
||||
struct mv_sg *sg_tbl;
|
||||
dma_addr_t sg_tbl_dma;
|
||||
|
||||
unsigned req_producer; /* cp of req_in_ptr */
|
||||
unsigned rsp_consumer; /* cp of rsp_out_ptr */
|
||||
u32 pp_flags;
|
||||
};
|
||||
|
||||
@ -937,8 +940,6 @@ static int mv_port_start(struct ata_port *ap)
|
||||
writelfl(pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK,
|
||||
port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
|
||||
|
||||
pp->req_producer = pp->rsp_consumer = 0;
|
||||
|
||||
/* Don't turn on EDMA here...do it before DMA commands only. Else
|
||||
* we'll be unable to send non-data, PIO, etc due to restricted access
|
||||
* to shadow regs.
|
||||
@ -1022,16 +1023,16 @@ static void mv_fill_sg(struct ata_queued_cmd *qc)
|
||||
}
|
||||
}
|
||||
|
||||
static inline unsigned mv_inc_q_index(unsigned *index)
|
||||
static inline unsigned mv_inc_q_index(unsigned index)
|
||||
{
|
||||
*index = (*index + 1) & MV_MAX_Q_DEPTH_MASK;
|
||||
return *index;
|
||||
return (index + 1) & MV_MAX_Q_DEPTH_MASK;
|
||||
}
|
||||
|
||||
static inline void mv_crqb_pack_cmd(u16 *cmdw, u8 data, u8 addr, unsigned last)
|
||||
{
|
||||
*cmdw = data | (addr << CRQB_CMD_ADDR_SHIFT) | CRQB_CMD_CS |
|
||||
u16 tmp = data | (addr << CRQB_CMD_ADDR_SHIFT) | CRQB_CMD_CS |
|
||||
(last ? CRQB_CMD_LAST : 0);
|
||||
*cmdw = cpu_to_le16(tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1053,15 +1054,11 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
||||
u16 *cw;
|
||||
struct ata_taskfile *tf;
|
||||
u16 flags = 0;
|
||||
unsigned in_index;
|
||||
|
||||
if (ATA_PROT_DMA != qc->tf.protocol)
|
||||
return;
|
||||
|
||||
/* the req producer index should be the same as we remember it */
|
||||
WARN_ON(((readl(mv_ap_base(qc->ap) + EDMA_REQ_Q_IN_PTR_OFS) >>
|
||||
EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) !=
|
||||
pp->req_producer);
|
||||
|
||||
/* Fill in command request block
|
||||
*/
|
||||
if (!(qc->tf.flags & ATA_TFLAG_WRITE))
|
||||
@ -1069,13 +1066,17 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
||||
WARN_ON(MV_MAX_Q_DEPTH <= qc->tag);
|
||||
flags |= qc->tag << CRQB_TAG_SHIFT;
|
||||
|
||||
pp->crqb[pp->req_producer].sg_addr =
|
||||
cpu_to_le32(pp->sg_tbl_dma & 0xffffffff);
|
||||
pp->crqb[pp->req_producer].sg_addr_hi =
|
||||
cpu_to_le32((pp->sg_tbl_dma >> 16) >> 16);
|
||||
pp->crqb[pp->req_producer].ctrl_flags = cpu_to_le16(flags);
|
||||
/* get current queue index from hardware */
|
||||
in_index = (readl(mv_ap_base(ap) + EDMA_REQ_Q_IN_PTR_OFS)
|
||||
>> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
|
||||
|
||||
cw = &pp->crqb[pp->req_producer].ata_cmd[0];
|
||||
pp->crqb[in_index].sg_addr =
|
||||
cpu_to_le32(pp->sg_tbl_dma & 0xffffffff);
|
||||
pp->crqb[in_index].sg_addr_hi =
|
||||
cpu_to_le32((pp->sg_tbl_dma >> 16) >> 16);
|
||||
pp->crqb[in_index].ctrl_flags = cpu_to_le16(flags);
|
||||
|
||||
cw = &pp->crqb[in_index].ata_cmd[0];
|
||||
tf = &qc->tf;
|
||||
|
||||
/* Sadly, the CRQB cannot accomodate all registers--there are
|
||||
@ -1144,16 +1145,12 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
||||
struct mv_port_priv *pp = ap->private_data;
|
||||
struct mv_crqb_iie *crqb;
|
||||
struct ata_taskfile *tf;
|
||||
unsigned in_index;
|
||||
u32 flags = 0;
|
||||
|
||||
if (ATA_PROT_DMA != qc->tf.protocol)
|
||||
return;
|
||||
|
||||
/* the req producer index should be the same as we remember it */
|
||||
WARN_ON(((readl(mv_ap_base(qc->ap) + EDMA_REQ_Q_IN_PTR_OFS) >>
|
||||
EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) !=
|
||||
pp->req_producer);
|
||||
|
||||
/* Fill in Gen IIE command request block
|
||||
*/
|
||||
if (!(qc->tf.flags & ATA_TFLAG_WRITE))
|
||||
@ -1162,7 +1159,11 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
||||
WARN_ON(MV_MAX_Q_DEPTH <= qc->tag);
|
||||
flags |= qc->tag << CRQB_TAG_SHIFT;
|
||||
|
||||
crqb = (struct mv_crqb_iie *) &pp->crqb[pp->req_producer];
|
||||
/* get current queue index from hardware */
|
||||
in_index = (readl(mv_ap_base(ap) + EDMA_REQ_Q_IN_PTR_OFS)
|
||||
>> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
|
||||
|
||||
crqb = (struct mv_crqb_iie *) &pp->crqb[in_index];
|
||||
crqb->addr = cpu_to_le32(pp->sg_tbl_dma & 0xffffffff);
|
||||
crqb->addr_hi = cpu_to_le32((pp->sg_tbl_dma >> 16) >> 16);
|
||||
crqb->flags = cpu_to_le32(flags);
|
||||
@ -1210,6 +1211,7 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
|
||||
{
|
||||
void __iomem *port_mmio = mv_ap_base(qc->ap);
|
||||
struct mv_port_priv *pp = qc->ap->private_data;
|
||||
unsigned in_index;
|
||||
u32 in_ptr;
|
||||
|
||||
if (ATA_PROT_DMA != qc->tf.protocol) {
|
||||
@ -1221,23 +1223,20 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
|
||||
return ata_qc_issue_prot(qc);
|
||||
}
|
||||
|
||||
in_ptr = readl(port_mmio + EDMA_REQ_Q_IN_PTR_OFS);
|
||||
in_ptr = readl(port_mmio + EDMA_REQ_Q_IN_PTR_OFS);
|
||||
in_index = (in_ptr >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
|
||||
|
||||
/* the req producer index should be the same as we remember it */
|
||||
WARN_ON(((in_ptr >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) !=
|
||||
pp->req_producer);
|
||||
/* until we do queuing, the queue should be empty at this point */
|
||||
WARN_ON(((in_ptr >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) !=
|
||||
((readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS) >>
|
||||
EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK));
|
||||
WARN_ON(in_index != ((readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS)
|
||||
>> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK));
|
||||
|
||||
mv_inc_q_index(&pp->req_producer); /* now incr producer index */
|
||||
in_index = mv_inc_q_index(in_index); /* now incr producer index */
|
||||
|
||||
mv_start_dma(port_mmio, pp);
|
||||
|
||||
/* and write the request in pointer to kick the EDMA to life */
|
||||
in_ptr &= EDMA_REQ_Q_BASE_LO_MASK;
|
||||
in_ptr |= pp->req_producer << EDMA_REQ_Q_PTR_SHIFT;
|
||||
in_ptr |= in_index << EDMA_REQ_Q_PTR_SHIFT;
|
||||
writelfl(in_ptr, port_mmio + EDMA_REQ_Q_IN_PTR_OFS);
|
||||
|
||||
return 0;
|
||||
@ -1260,28 +1259,26 @@ static u8 mv_get_crpb_status(struct ata_port *ap)
|
||||
{
|
||||
void __iomem *port_mmio = mv_ap_base(ap);
|
||||
struct mv_port_priv *pp = ap->private_data;
|
||||
unsigned out_index;
|
||||
u32 out_ptr;
|
||||
u8 ata_status;
|
||||
|
||||
out_ptr = readl(port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
|
||||
out_ptr = readl(port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
|
||||
out_index = (out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
|
||||
|
||||
/* the response consumer index should be the same as we remember it */
|
||||
WARN_ON(((out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) !=
|
||||
pp->rsp_consumer);
|
||||
|
||||
ata_status = pp->crpb[pp->rsp_consumer].flags >> CRPB_FLAG_STATUS_SHIFT;
|
||||
ata_status = le16_to_cpu(pp->crpb[out_index].flags)
|
||||
>> CRPB_FLAG_STATUS_SHIFT;
|
||||
|
||||
/* increment our consumer index... */
|
||||
pp->rsp_consumer = mv_inc_q_index(&pp->rsp_consumer);
|
||||
out_index = mv_inc_q_index(out_index);
|
||||
|
||||
/* and, until we do NCQ, there should only be 1 CRPB waiting */
|
||||
WARN_ON(((readl(port_mmio + EDMA_RSP_Q_IN_PTR_OFS) >>
|
||||
EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) !=
|
||||
pp->rsp_consumer);
|
||||
WARN_ON(out_index != ((readl(port_mmio + EDMA_RSP_Q_IN_PTR_OFS)
|
||||
>> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK));
|
||||
|
||||
/* write out our inc'd consumer index so EDMA knows we're caught up */
|
||||
out_ptr &= EDMA_RSP_Q_BASE_LO_MASK;
|
||||
out_ptr |= pp->rsp_consumer << EDMA_RSP_Q_PTR_SHIFT;
|
||||
out_ptr |= out_index << EDMA_RSP_Q_PTR_SHIFT;
|
||||
writelfl(out_ptr, port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
|
||||
|
||||
/* Return ATA status register for completed CRPB */
|
||||
@ -1291,6 +1288,7 @@ static u8 mv_get_crpb_status(struct ata_port *ap)
|
||||
/**
|
||||
* mv_err_intr - Handle error interrupts on the port
|
||||
* @ap: ATA channel to manipulate
|
||||
* @reset_allowed: bool: 0 == don't trigger from reset here
|
||||
*
|
||||
* In most cases, just clear the interrupt and move on. However,
|
||||
* some cases require an eDMA reset, which is done right before
|
||||
@ -1301,7 +1299,7 @@ static u8 mv_get_crpb_status(struct ata_port *ap)
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*/
|
||||
static void mv_err_intr(struct ata_port *ap)
|
||||
static void mv_err_intr(struct ata_port *ap, int reset_allowed)
|
||||
{
|
||||
void __iomem *port_mmio = mv_ap_base(ap);
|
||||
u32 edma_err_cause, serr = 0;
|
||||
@ -1323,9 +1321,8 @@ static void mv_err_intr(struct ata_port *ap)
|
||||
writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
|
||||
|
||||
/* check for fatal here and recover if needed */
|
||||
if (EDMA_ERR_FATAL & edma_err_cause) {
|
||||
if (reset_allowed && (EDMA_ERR_FATAL & edma_err_cause))
|
||||
mv_stop_and_reset(ap);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1374,12 +1371,12 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
|
||||
struct ata_port *ap = host_set->ports[port];
|
||||
struct mv_port_priv *pp = ap->private_data;
|
||||
|
||||
hard_port = port & MV_PORT_MASK; /* range 0-3 */
|
||||
hard_port = mv_hardport_from_port(port); /* range 0..3 */
|
||||
handled = 0; /* ensure ata_status is set if handled++ */
|
||||
|
||||
/* Note that DEV_IRQ might happen spuriously during EDMA,
|
||||
* and should be ignored in such cases. We could mask it,
|
||||
* but it's pretty rare and may not be worth the overhead.
|
||||
* and should be ignored in such cases.
|
||||
* The cause of this is still under investigation.
|
||||
*/
|
||||
if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) {
|
||||
/* EDMA: check for response queue interrupt */
|
||||
@ -1393,6 +1390,11 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
|
||||
ata_status = readb((void __iomem *)
|
||||
ap->ioaddr.status_addr);
|
||||
handled = 1;
|
||||
/* ignore spurious intr if drive still BUSY */
|
||||
if (ata_status & ATA_BUSY) {
|
||||
ata_status = 0;
|
||||
handled = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1406,7 +1408,7 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
|
||||
shift++; /* skip bit 8 in the HC Main IRQ reg */
|
||||
}
|
||||
if ((PORT0_ERR << shift) & relevant) {
|
||||
mv_err_intr(ap);
|
||||
mv_err_intr(ap, 1);
|
||||
err_mask |= AC_ERR_OTHER;
|
||||
handled = 1;
|
||||
}
|
||||
@ -1448,6 +1450,7 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance,
|
||||
struct ata_host_set *host_set = dev_instance;
|
||||
unsigned int hc, handled = 0, n_hcs;
|
||||
void __iomem *mmio = host_set->mmio_base;
|
||||
struct mv_host_priv *hpriv;
|
||||
u32 irq_stat;
|
||||
|
||||
irq_stat = readl(mmio + HC_MAIN_IRQ_CAUSE_OFS);
|
||||
@ -1469,6 +1472,17 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance,
|
||||
handled++;
|
||||
}
|
||||
}
|
||||
|
||||
hpriv = host_set->private_data;
|
||||
if (IS_60XX(hpriv)) {
|
||||
/* deal with the interrupt coalescing bits */
|
||||
if (irq_stat & (TRAN_LO_DONE | TRAN_HI_DONE | PORTS_0_7_COAL_DONE)) {
|
||||
writelfl(0, mmio + MV_IRQ_COAL_CAUSE_LO);
|
||||
writelfl(0, mmio + MV_IRQ_COAL_CAUSE_HI);
|
||||
writelfl(0, mmio + MV_IRQ_COAL_CAUSE);
|
||||
}
|
||||
}
|
||||
|
||||
if (PCI_ERR & irq_stat) {
|
||||
printk(KERN_ERR DRV_NAME ": PCI ERROR; PCI IRQ cause=0x%08x\n",
|
||||
readl(mmio + PCI_IRQ_CAUSE_OFS));
|
||||
@ -1867,7 +1881,8 @@ static void mv_channel_reset(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
|
||||
if (IS_60XX(hpriv)) {
|
||||
u32 ifctl = readl(port_mmio + SATA_INTERFACE_CTL);
|
||||
ifctl |= (1 << 12) | (1 << 7);
|
||||
ifctl |= (1 << 7); /* enable gen2i speed */
|
||||
ifctl = (ifctl & 0xfff) | 0x9b1000; /* from chip spec */
|
||||
writelfl(ifctl, port_mmio + SATA_INTERFACE_CTL);
|
||||
}
|
||||
|
||||
@ -2031,11 +2046,14 @@ static void mv_eng_timeout(struct ata_port *ap)
|
||||
ap->host_set->mmio_base, ap, qc, qc->scsicmd,
|
||||
&qc->scsicmd->cmnd);
|
||||
|
||||
mv_err_intr(ap);
|
||||
mv_err_intr(ap, 0);
|
||||
mv_stop_and_reset(ap);
|
||||
|
||||
qc->err_mask |= AC_ERR_TIMEOUT;
|
||||
ata_eh_qc_complete(qc);
|
||||
WARN_ON(!(qc->flags & ATA_QCFLAG_ACTIVE));
|
||||
if (qc->flags & ATA_QCFLAG_ACTIVE) {
|
||||
qc->err_mask |= AC_ERR_TIMEOUT;
|
||||
ata_eh_qc_complete(qc);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2229,7 +2247,8 @@ static int mv_init_host(struct pci_dev *pdev, struct ata_probe_ent *probe_ent,
|
||||
void __iomem *port_mmio = mv_port_base(mmio, port);
|
||||
|
||||
u32 ifctl = readl(port_mmio + SATA_INTERFACE_CTL);
|
||||
ifctl |= (1 << 12);
|
||||
ifctl |= (1 << 7); /* enable gen2i speed */
|
||||
ifctl = (ifctl & 0xfff) | 0x9b1000; /* from chip spec */
|
||||
writelfl(ifctl, port_mmio + SATA_INTERFACE_CTL);
|
||||
}
|
||||
|
||||
@ -2330,6 +2349,7 @@ static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (rc) {
|
||||
return rc;
|
||||
}
|
||||
pci_set_master(pdev);
|
||||
|
||||
rc = pci_request_regions(pdev, DRV_NAME);
|
||||
if (rc) {
|
||||
|
@ -4054,7 +4054,7 @@ static int st_probe(struct device *dev)
|
||||
}
|
||||
|
||||
sdev_printk(KERN_WARNING, SDp,
|
||||
"Attached scsi tape %s", tape_name(tpnt));
|
||||
"Attached scsi tape %s\n", tape_name(tpnt));
|
||||
printk(KERN_WARNING "%s: try direct i/o: %s (alignment %d B)\n",
|
||||
tape_name(tpnt), tpnt->try_dio ? "yes" : "no",
|
||||
queue_dma_alignment(SDp->request_queue) + 1);
|
||||
|
@ -1730,3 +1730,4 @@ static void __exit sunsu_exit(void)
|
||||
|
||||
module_init(sunsu_probe);
|
||||
module_exit(sunsu_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -75,6 +75,18 @@ config SPI_BUTTERFLY
|
||||
inexpensive battery powered microcontroller evaluation board.
|
||||
This same cable can be used to flash new firmware.
|
||||
|
||||
config SPI_MPC83xx
|
||||
tristate "Freescale MPC83xx SPI controller"
|
||||
depends on SPI_MASTER && PPC_83xx && EXPERIMENTAL
|
||||
select SPI_BITBANG
|
||||
help
|
||||
This enables using the Freescale MPC83xx SPI controller in master
|
||||
mode.
|
||||
|
||||
Note, this driver uniquely supports the SPI controller on the MPC83xx
|
||||
family of PowerPC processors. The MPC83xx uses a simple set of shift
|
||||
registers for data (opposed to the CPM based descriptor model).
|
||||
|
||||
config SPI_PXA2XX
|
||||
tristate "PXA2xx SSP SPI master"
|
||||
depends on SPI_MASTER && ARCH_PXA && EXPERIMENTAL
|
||||
@ -83,11 +95,25 @@ config SPI_PXA2XX
|
||||
The driver can be configured to use any SSP port and additional
|
||||
documentation can be found a Documentation/spi/pxa2xx.
|
||||
|
||||
config SPI_S3C24XX_GPIO
|
||||
tristate "Samsung S3C24XX series SPI by GPIO"
|
||||
depends on SPI_MASTER && ARCH_S3C2410 && SPI_BITBANG && EXPERIMENTAL
|
||||
help
|
||||
SPI driver for Samsung S3C24XX series ARM SoCs using
|
||||
GPIO lines to provide the SPI bus. This can be used where
|
||||
the inbuilt hardware cannot provide the transfer mode, or
|
||||
where the board is using non hardware connected pins.
|
||||
#
|
||||
# Add new SPI master controllers in alphabetical order above this line
|
||||
#
|
||||
|
||||
|
||||
config SPI_S3C24XX
|
||||
tristate "Samsung S3C24XX series SPI"
|
||||
depends on SPI_MASTER && ARCH_S3C2410 && EXPERIMENTAL
|
||||
help
|
||||
SPI driver for Samsung S3C24XX series ARM SoCs
|
||||
|
||||
#
|
||||
# There are lots of SPI device types, with sensors and memory
|
||||
# being probably the most widely used ones.
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user