Merge branch 'from-linus' into upstream
This commit is contained in:
commit
71bfe47f02
|
@ -30,6 +30,11 @@ include/config
|
||||||
include/linux/autoconf.h
|
include/linux/autoconf.h
|
||||||
include/linux/compile.h
|
include/linux/compile.h
|
||||||
include/linux/version.h
|
include/linux/version.h
|
||||||
|
include/linux/utsrelease.h
|
||||||
|
|
||||||
# stgit generated dirs
|
# stgit generated dirs
|
||||||
patches-*
|
patches-*
|
||||||
|
|
||||||
|
# quilt's files
|
||||||
|
patches
|
||||||
|
series
|
||||||
|
|
|
@ -51,8 +51,6 @@ Debugging Information
|
||||||
|
|
||||||
References
|
References
|
||||||
|
|
||||||
IETF IP over InfiniBand (ipoib) Working Group
|
|
||||||
http://ietf.org/html.charters/ipoib-charter.html
|
|
||||||
Transmission of IP over InfiniBand (IPoIB) (RFC 4391)
|
Transmission of IP over InfiniBand (IPoIB) (RFC 4391)
|
||||||
http://ietf.org/rfc/rfc4391.txt
|
http://ietf.org/rfc/rfc4391.txt
|
||||||
IP over InfiniBand (IPoIB) Architecture (RFC 4392)
|
IP over InfiniBand (IPoIB) Architecture (RFC 4392)
|
||||||
|
|
|
@ -59,7 +59,7 @@ bind to an interface (or perhaps several) using an ioctl call. You
|
||||||
would issue more ioctls to the device to communicate to it using
|
would issue more ioctls to the device to communicate to it using
|
||||||
control, bulk, or other kinds of USB transfers. The IOCTLs are
|
control, bulk, or other kinds of USB transfers. The IOCTLs are
|
||||||
listed in the <linux/usbdevice_fs.h> file, and at this writing the
|
listed in the <linux/usbdevice_fs.h> file, and at this writing the
|
||||||
source code (linux/drivers/usb/devio.c) is the primary reference
|
source code (linux/drivers/usb/core/devio.c) is the primary reference
|
||||||
for how to access devices through those files.
|
for how to access devices through those files.
|
||||||
|
|
||||||
Note that since by default these BBB/DDD files are writable only by
|
Note that since by default these BBB/DDD files are writable only by
|
||||||
|
|
|
@ -5,8 +5,7 @@ For USB help other than the readme files that are located in
|
||||||
Documentation/usb/*, see the following:
|
Documentation/usb/*, see the following:
|
||||||
|
|
||||||
Linux-USB project: http://www.linux-usb.org
|
Linux-USB project: http://www.linux-usb.org
|
||||||
mirrors at http://www.suse.cz/development/linux-usb/
|
mirrors at http://usb.in.tum.de/linux-usb/
|
||||||
and http://usb.in.tum.de/linux-usb/
|
|
||||||
and http://it.linux-usb.org
|
and http://it.linux-usb.org
|
||||||
Linux USB Guide: http://linux-usb.sourceforge.net
|
Linux USB Guide: http://linux-usb.sourceforge.net
|
||||||
Linux-USB device overview (working devices and drivers):
|
Linux-USB device overview (working devices and drivers):
|
||||||
|
|
|
@ -214,6 +214,12 @@ W: http://acpi.sourceforge.net/
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
|
T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
ACPI PCI HOTPLUG DRIVER
|
||||||
|
P: Kristen Carlson Accardi
|
||||||
|
M: kristen.c.accardi@intel.com
|
||||||
|
L: pcihpd-discuss@lists.sourceforge.net
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
AD1816 SOUND DRIVER
|
AD1816 SOUND DRIVER
|
||||||
P: Thorsten Knabe
|
P: Thorsten Knabe
|
||||||
M: Thorsten Knabe <linux@thorsten-knabe.de>
|
M: Thorsten Knabe <linux@thorsten-knabe.de>
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -310,8 +310,8 @@ CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
|
||||||
CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
||||||
-fno-strict-aliasing -fno-common
|
-fno-strict-aliasing -fno-common
|
||||||
# Force gcc to behave correct even for buggy distributions
|
# Force gcc to behave correct even for buggy distributions
|
||||||
CFLAGS += $(call cc-option, -fno-stack-protector-all \
|
CFLAGS += $(call cc-option, -fno-stack-protector)
|
||||||
-fno-stack-protector)
|
|
||||||
AFLAGS := -D__ASSEMBLY__
|
AFLAGS := -D__ASSEMBLY__
|
||||||
|
|
||||||
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
||||||
|
@ -368,6 +368,7 @@ endif
|
||||||
|
|
||||||
no-dot-config-targets := clean mrproper distclean \
|
no-dot-config-targets := clean mrproper distclean \
|
||||||
cscope TAGS tags help %docs check% \
|
cscope TAGS tags help %docs check% \
|
||||||
|
include/linux/version.h headers_% \
|
||||||
kernelrelease kernelversion
|
kernelrelease kernelversion
|
||||||
|
|
||||||
config-targets := 0
|
config-targets := 0
|
||||||
|
|
|
@ -95,7 +95,8 @@ static void gic_set_cpu(unsigned int irq, cpumask_t mask_val)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct irqchip gic_chip = {
|
static struct irq_chip gic_chip = {
|
||||||
|
.name = "GIC",
|
||||||
.ack = gic_ack_irq,
|
.ack = gic_ack_irq,
|
||||||
.mask = gic_mask_irq,
|
.mask = gic_mask_irq,
|
||||||
.unmask = gic_unmask_irq,
|
.unmask = gic_unmask_irq,
|
||||||
|
|
|
@ -204,7 +204,8 @@ static void locomo_unmask_irq(unsigned int irq)
|
||||||
locomo_writel(r, mapbase + LOCOMO_ICR);
|
locomo_writel(r, mapbase + LOCOMO_ICR);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip locomo_chip = {
|
static struct irq_chip locomo_chip = {
|
||||||
|
.name = "LOCOMO",
|
||||||
.ack = locomo_ack_irq,
|
.ack = locomo_ack_irq,
|
||||||
.mask = locomo_mask_irq,
|
.mask = locomo_mask_irq,
|
||||||
.unmask = locomo_unmask_irq,
|
.unmask = locomo_unmask_irq,
|
||||||
|
@ -249,7 +250,8 @@ static void locomo_key_unmask_irq(unsigned int irq)
|
||||||
locomo_writel(r, mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC);
|
locomo_writel(r, mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip locomo_key_chip = {
|
static struct irq_chip locomo_key_chip = {
|
||||||
|
.name = "LOCOMO-key",
|
||||||
.ack = locomo_key_ack_irq,
|
.ack = locomo_key_ack_irq,
|
||||||
.mask = locomo_key_mask_irq,
|
.mask = locomo_key_mask_irq,
|
||||||
.unmask = locomo_key_unmask_irq,
|
.unmask = locomo_key_unmask_irq,
|
||||||
|
@ -312,7 +314,8 @@ static void locomo_gpio_unmask_irq(unsigned int irq)
|
||||||
locomo_writel(r, mapbase + LOCOMO_GIE);
|
locomo_writel(r, mapbase + LOCOMO_GIE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip locomo_gpio_chip = {
|
static struct irq_chip locomo_gpio_chip = {
|
||||||
|
.name = "LOCOMO-gpio",
|
||||||
.ack = locomo_gpio_ack_irq,
|
.ack = locomo_gpio_ack_irq,
|
||||||
.mask = locomo_gpio_mask_irq,
|
.mask = locomo_gpio_mask_irq,
|
||||||
.unmask = locomo_gpio_unmask_irq,
|
.unmask = locomo_gpio_unmask_irq,
|
||||||
|
@ -357,7 +360,8 @@ static void locomo_lt_unmask_irq(unsigned int irq)
|
||||||
locomo_writel(r, mapbase + LOCOMO_LTINT);
|
locomo_writel(r, mapbase + LOCOMO_LTINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip locomo_lt_chip = {
|
static struct irq_chip locomo_lt_chip = {
|
||||||
|
.name = "LOCOMO-lt",
|
||||||
.ack = locomo_lt_ack_irq,
|
.ack = locomo_lt_ack_irq,
|
||||||
.mask = locomo_lt_mask_irq,
|
.mask = locomo_lt_mask_irq,
|
||||||
.unmask = locomo_lt_unmask_irq,
|
.unmask = locomo_lt_unmask_irq,
|
||||||
|
@ -418,7 +422,8 @@ static void locomo_spi_unmask_irq(unsigned int irq)
|
||||||
locomo_writel(r, mapbase + LOCOMO_SPIIE);
|
locomo_writel(r, mapbase + LOCOMO_SPIIE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip locomo_spi_chip = {
|
static struct irq_chip locomo_spi_chip = {
|
||||||
|
.name = "LOCOMO-spi",
|
||||||
.ack = locomo_spi_ack_irq,
|
.ack = locomo_spi_ack_irq,
|
||||||
.mask = locomo_spi_mask_irq,
|
.mask = locomo_spi_mask_irq,
|
||||||
.unmask = locomo_spi_unmask_irq,
|
.unmask = locomo_spi_unmask_irq,
|
||||||
|
|
|
@ -272,7 +272,8 @@ static int sa1111_wake_lowirq(unsigned int irq, unsigned int on)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip sa1111_low_chip = {
|
static struct irq_chip sa1111_low_chip = {
|
||||||
|
.name = "SA1111-l",
|
||||||
.ack = sa1111_ack_irq,
|
.ack = sa1111_ack_irq,
|
||||||
.mask = sa1111_mask_lowirq,
|
.mask = sa1111_mask_lowirq,
|
||||||
.unmask = sa1111_unmask_lowirq,
|
.unmask = sa1111_unmask_lowirq,
|
||||||
|
@ -368,7 +369,8 @@ static int sa1111_wake_highirq(unsigned int irq, unsigned int on)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip sa1111_high_chip = {
|
static struct irq_chip sa1111_high_chip = {
|
||||||
|
.name = "SA1111-h",
|
||||||
.ack = sa1111_ack_irq,
|
.ack = sa1111_ack_irq,
|
||||||
.mask = sa1111_mask_highirq,
|
.mask = sa1111_mask_highirq,
|
||||||
.unmask = sa1111_unmask_highirq,
|
.unmask = sa1111_unmask_highirq,
|
||||||
|
|
|
@ -39,7 +39,8 @@ static void vic_unmask_irq(unsigned int irq)
|
||||||
writel(1 << irq, base + VIC_INT_ENABLE);
|
writel(1 << irq, base + VIC_INT_ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip vic_chip = {
|
static struct irq_chip vic_chip = {
|
||||||
|
.name = "VIC",
|
||||||
.ack = vic_mask_irq,
|
.ack = vic_mask_irq,
|
||||||
.mask = vic_mask_irq,
|
.mask = vic_mask_irq,
|
||||||
.unmask = vic_unmask_irq,
|
.unmask = vic_unmask_irq,
|
||||||
|
|
|
@ -470,7 +470,8 @@ static void ecard_irq_mask(unsigned int irqnr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip ecard_chip = {
|
static struct irq_chip ecard_chip = {
|
||||||
|
.name = "ECARD",
|
||||||
.ack = ecard_irq_mask,
|
.ack = ecard_irq_mask,
|
||||||
.mask = ecard_irq_mask,
|
.mask = ecard_irq_mask,
|
||||||
.unmask = ecard_irq_unmask,
|
.unmask = ecard_irq_unmask,
|
||||||
|
|
|
@ -77,6 +77,7 @@ int show_interrupts(struct seq_file *p, void *v)
|
||||||
seq_printf(p, "%3d: ", i);
|
seq_printf(p, "%3d: ", i);
|
||||||
for_each_present_cpu(cpu)
|
for_each_present_cpu(cpu)
|
||||||
seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]);
|
seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]);
|
||||||
|
seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-");
|
||||||
seq_printf(p, " %s", action->name);
|
seq_printf(p, " %s", action->name);
|
||||||
for (action = action->next; action; action = action->next)
|
for (action = action->next; action; action = action->next)
|
||||||
seq_printf(p, ", %s", action->name);
|
seq_printf(p, ", %s", action->name);
|
||||||
|
|
|
@ -327,7 +327,8 @@ static int gpio_irq_type(unsigned pin, unsigned type)
|
||||||
return (type == IRQT_BOTHEDGE) ? 0 : -EINVAL;
|
return (type == IRQT_BOTHEDGE) ? 0 : -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip gpio_irqchip = {
|
static struct irq_chip gpio_irqchip = {
|
||||||
|
.name = "GPIO",
|
||||||
.mask = gpio_irq_mask,
|
.mask = gpio_irq_mask,
|
||||||
.unmask = gpio_irq_unmask,
|
.unmask = gpio_irq_unmask,
|
||||||
.set_type = gpio_irq_type,
|
.set_type = gpio_irq_type,
|
||||||
|
|
|
@ -114,7 +114,8 @@ void at91_irq_resume(void)
|
||||||
#define at91_aic_set_wake NULL
|
#define at91_aic_set_wake NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct irqchip at91_aic_chip = {
|
static struct irq_chip at91_aic_chip = {
|
||||||
|
.name = "AIC",
|
||||||
.ack = at91_aic_mask_irq,
|
.ack = at91_aic_mask_irq,
|
||||||
.mask = at91_aic_mask_irq,
|
.mask = at91_aic_mask_irq,
|
||||||
.unmask = at91_aic_unmask_irq,
|
.unmask = at91_aic_unmask_irq,
|
||||||
|
|
|
@ -204,13 +204,15 @@ imx_gpiod_demux_handler(unsigned int irq_unused, struct irqdesc *desc,
|
||||||
imx_gpio_handler(mask, irq, desc, regs);
|
imx_gpio_handler(mask, irq, desc, regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip imx_internal_chip = {
|
static struct irq_chip imx_internal_chip = {
|
||||||
|
.name = "MPU",
|
||||||
.ack = imx_mask_irq,
|
.ack = imx_mask_irq,
|
||||||
.mask = imx_mask_irq,
|
.mask = imx_mask_irq,
|
||||||
.unmask = imx_unmask_irq,
|
.unmask = imx_unmask_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct irqchip imx_gpio_chip = {
|
static struct irq_chip imx_gpio_chip = {
|
||||||
|
.name = "GPIO",
|
||||||
.ack = imx_gpio_ack_irq,
|
.ack = imx_gpio_ack_irq,
|
||||||
.mask = imx_gpio_mask_irq,
|
.mask = imx_gpio_mask_irq,
|
||||||
.unmask = imx_gpio_unmask_irq,
|
.unmask = imx_gpio_unmask_irq,
|
||||||
|
|
|
@ -161,7 +161,8 @@ static void sc_unmask_irq(unsigned int irq)
|
||||||
writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET);
|
writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip sc_chip = {
|
static struct irq_chip sc_chip = {
|
||||||
|
.name = "SC",
|
||||||
.ack = sc_mask_irq,
|
.ack = sc_mask_irq,
|
||||||
.mask = sc_mask_irq,
|
.mask = sc_mask_irq,
|
||||||
.unmask = sc_unmask_irq,
|
.unmask = sc_unmask_irq,
|
||||||
|
|
|
@ -156,7 +156,8 @@ static void cic_unmask_irq(unsigned int irq)
|
||||||
cic_writel(1 << irq, INTCP_VA_CIC_BASE + IRQ_ENABLE_SET);
|
cic_writel(1 << irq, INTCP_VA_CIC_BASE + IRQ_ENABLE_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip cic_chip = {
|
static struct irq_chip cic_chip = {
|
||||||
|
.name = "CIC",
|
||||||
.ack = cic_mask_irq,
|
.ack = cic_mask_irq,
|
||||||
.mask = cic_mask_irq,
|
.mask = cic_mask_irq,
|
||||||
.unmask = cic_unmask_irq,
|
.unmask = cic_unmask_irq,
|
||||||
|
@ -174,7 +175,8 @@ static void pic_unmask_irq(unsigned int irq)
|
||||||
pic_writel(1 << irq, INTCP_VA_PIC_BASE + IRQ_ENABLE_SET);
|
pic_writel(1 << irq, INTCP_VA_PIC_BASE + IRQ_ENABLE_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip pic_chip = {
|
static struct irq_chip pic_chip = {
|
||||||
|
.name = "PIC",
|
||||||
.ack = pic_mask_irq,
|
.ack = pic_mask_irq,
|
||||||
.mask = pic_mask_irq,
|
.mask = pic_mask_irq,
|
||||||
.unmask = pic_unmask_irq,
|
.unmask = pic_unmask_irq,
|
||||||
|
@ -192,7 +194,8 @@ static void sic_unmask_irq(unsigned int irq)
|
||||||
sic_writel(1 << irq, INTCP_VA_SIC_BASE + IRQ_ENABLE_SET);
|
sic_writel(1 << irq, INTCP_VA_SIC_BASE + IRQ_ENABLE_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip sic_chip = {
|
static struct irq_chip sic_chip = {
|
||||||
|
.name = "SIC",
|
||||||
.ack = sic_mask_irq,
|
.ack = sic_mask_irq,
|
||||||
.mask = sic_mask_irq,
|
.mask = sic_mask_irq,
|
||||||
.unmask = sic_unmask_irq,
|
.unmask = sic_unmask_irq,
|
||||||
|
|
|
@ -52,7 +52,8 @@ iop321_irq_unmask (unsigned int irq)
|
||||||
intctl_write(iop321_mask);
|
intctl_write(iop321_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct irqchip ext_chip = {
|
struct irq_chip ext_chip = {
|
||||||
|
.name = "IOP",
|
||||||
.ack = iop321_irq_mask,
|
.ack = iop321_irq_mask,
|
||||||
.mask = iop321_irq_mask,
|
.mask = iop321_irq_mask,
|
||||||
.unmask = iop321_irq_unmask,
|
.unmask = iop321_irq_unmask,
|
||||||
|
|
|
@ -77,13 +77,15 @@ iop331_irq_unmask2(unsigned int irq)
|
||||||
intctl_write1(iop331_mask1);
|
intctl_write1(iop331_mask1);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct irqchip iop331_irqchip1 = {
|
struct irq_chip iop331_irqchip1 = {
|
||||||
|
.name = "IOP-1",
|
||||||
.ack = iop331_irq_mask1,
|
.ack = iop331_irq_mask1,
|
||||||
.mask = iop331_irq_mask1,
|
.mask = iop331_irq_mask1,
|
||||||
.unmask = iop331_irq_unmask1,
|
.unmask = iop331_irq_unmask1,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct irqchip iop331_irqchip2 = {
|
struct irq_chip iop331_irqchip2 = {
|
||||||
|
.name = "IOP-2",
|
||||||
.ack = iop331_irq_mask2,
|
.ack = iop331_irq_mask2,
|
||||||
.mask = iop331_irq_mask2,
|
.mask = iop331_irq_mask2,
|
||||||
.unmask = iop331_irq_unmask2,
|
.unmask = iop331_irq_unmask2,
|
||||||
|
|
|
@ -63,7 +63,8 @@ static void kev7a400_unmask_cpld_irq (u32 irq)
|
||||||
CPLD_WR_PB_INT_MASK = CPLD_IRQ_mask;
|
CPLD_WR_PB_INT_MASK = CPLD_IRQ_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip kev7a400_cpld_chip = {
|
static struct irq_chip kev7a400_cpld_chip = {
|
||||||
|
.name = "CPLD",
|
||||||
.ack = kev7a400_ack_cpld_irq,
|
.ack = kev7a400_ack_cpld_irq,
|
||||||
.mask = kev7a400_mask_cpld_irq,
|
.mask = kev7a400_mask_cpld_irq,
|
||||||
.unmask = kev7a400_unmask_cpld_irq,
|
.unmask = kev7a400_unmask_cpld_irq,
|
||||||
|
|
|
@ -200,7 +200,8 @@ static void lh7a40x_unmask_cpld_irq (u32 irq)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip lpd7a40x_cpld_chip = {
|
static struct irq_chip lpd7a40x_cpld_chip = {
|
||||||
|
.name = "CPLD",
|
||||||
.ack = lh7a40x_ack_cpld_irq,
|
.ack = lh7a40x_ack_cpld_irq,
|
||||||
.mask = lh7a40x_mask_cpld_irq,
|
.mask = lh7a40x_mask_cpld_irq,
|
||||||
.unmask = lh7a40x_unmask_cpld_irq,
|
.unmask = lh7a40x_unmask_cpld_irq,
|
||||||
|
|
|
@ -43,7 +43,8 @@ lh7a400_unmask_cpld_irq (u32 irq)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct
|
static struct
|
||||||
irqchip lh7a400_cpld_chip = {
|
irq_chip lh7a400_cpld_chip = {
|
||||||
|
.name = "CPLD",
|
||||||
.ack = lh7a400_ack_cpld_irq,
|
.ack = lh7a400_ack_cpld_irq,
|
||||||
.mask = lh7a400_mask_cpld_irq,
|
.mask = lh7a400_mask_cpld_irq,
|
||||||
.unmask = lh7a400_unmask_cpld_irq,
|
.unmask = lh7a400_unmask_cpld_irq,
|
||||||
|
|
|
@ -38,13 +38,15 @@ static void lh7a400_ack_gpio_irq (u32 irq)
|
||||||
INTC_INTENC = (1 << irq);
|
INTC_INTENC = (1 << irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip lh7a400_internal_chip = {
|
static struct irq_chip lh7a400_internal_chip = {
|
||||||
|
.name = "MPU",
|
||||||
.ack = lh7a400_mask_irq, /* Level triggering -> mask is ack */
|
.ack = lh7a400_mask_irq, /* Level triggering -> mask is ack */
|
||||||
.mask = lh7a400_mask_irq,
|
.mask = lh7a400_mask_irq,
|
||||||
.unmask = lh7a400_unmask_irq,
|
.unmask = lh7a400_unmask_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct irqchip lh7a400_gpio_chip = {
|
static struct irq_chip lh7a400_gpio_chip = {
|
||||||
|
.name = "GPIO",
|
||||||
.ack = lh7a400_ack_gpio_irq,
|
.ack = lh7a400_ack_gpio_irq,
|
||||||
.mask = lh7a400_mask_irq,
|
.mask = lh7a400_mask_irq,
|
||||||
.unmask = lh7a400_unmask_irq,
|
.unmask = lh7a400_unmask_irq,
|
||||||
|
|
|
@ -76,25 +76,29 @@ static void lh7a404_vic2_ack_gpio_irq (u32 irq)
|
||||||
VIC2_INTENCLR = (1 << irq);
|
VIC2_INTENCLR = (1 << irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip lh7a404_vic1_chip = {
|
static struct irq_chip lh7a404_vic1_chip = {
|
||||||
|
.name = "VIC1",
|
||||||
.ack = lh7a404_vic1_mask_irq, /* Because level-triggered */
|
.ack = lh7a404_vic1_mask_irq, /* Because level-triggered */
|
||||||
.mask = lh7a404_vic1_mask_irq,
|
.mask = lh7a404_vic1_mask_irq,
|
||||||
.unmask = lh7a404_vic1_unmask_irq,
|
.unmask = lh7a404_vic1_unmask_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct irqchip lh7a404_vic2_chip = {
|
static struct irq_chip lh7a404_vic2_chip = {
|
||||||
|
.name = "VIC2",
|
||||||
.ack = lh7a404_vic2_mask_irq, /* Because level-triggered */
|
.ack = lh7a404_vic2_mask_irq, /* Because level-triggered */
|
||||||
.mask = lh7a404_vic2_mask_irq,
|
.mask = lh7a404_vic2_mask_irq,
|
||||||
.unmask = lh7a404_vic2_unmask_irq,
|
.unmask = lh7a404_vic2_unmask_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct irqchip lh7a404_gpio_vic1_chip = {
|
static struct irq_chip lh7a404_gpio_vic1_chip = {
|
||||||
|
.name = "GPIO-VIC1",
|
||||||
.ack = lh7a404_vic1_ack_gpio_irq,
|
.ack = lh7a404_vic1_ack_gpio_irq,
|
||||||
.mask = lh7a404_vic1_mask_irq,
|
.mask = lh7a404_vic1_mask_irq,
|
||||||
.unmask = lh7a404_vic1_unmask_irq,
|
.unmask = lh7a404_vic1_unmask_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct irqchip lh7a404_gpio_vic2_chip = {
|
static struct irq_chip lh7a404_gpio_vic2_chip = {
|
||||||
|
.name = "GPIO-VIC2",
|
||||||
.ack = lh7a404_vic2_ack_gpio_irq,
|
.ack = lh7a404_vic2_ack_gpio_irq,
|
||||||
.mask = lh7a404_vic2_mask_irq,
|
.mask = lh7a404_vic2_mask_irq,
|
||||||
.unmask = lh7a404_vic2_unmask_irq,
|
.unmask = lh7a404_vic2_unmask_irq,
|
||||||
|
|
|
@ -50,7 +50,8 @@ static void lh7a40x_unmask_cpld_irq (u32 irq)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip lh7a40x_cpld_chip = {
|
static struct irq_chip lh7a40x_cpld_chip = {
|
||||||
|
.name = "CPLD",
|
||||||
.ack = lh7a40x_ack_cpld_irq,
|
.ack = lh7a40x_ack_cpld_irq,
|
||||||
.mask = lh7a40x_mask_cpld_irq,
|
.mask = lh7a40x_mask_cpld_irq,
|
||||||
.unmask = lh7a40x_unmask_cpld_irq,
|
.unmask = lh7a40x_unmask_cpld_irq,
|
||||||
|
|
|
@ -106,14 +106,16 @@ void innovator_fpga_IRQ_demux(unsigned int irq, struct irqdesc *desc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip omap_fpga_irq_ack = {
|
static struct irq_chip omap_fpga_irq_ack = {
|
||||||
|
.name = "FPGA-ack",
|
||||||
.ack = fpga_mask_ack_irq,
|
.ack = fpga_mask_ack_irq,
|
||||||
.mask = fpga_mask_irq,
|
.mask = fpga_mask_irq,
|
||||||
.unmask = fpga_unmask_irq,
|
.unmask = fpga_unmask_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static struct irqchip omap_fpga_irq = {
|
static struct irq_chip omap_fpga_irq = {
|
||||||
|
.name = "FPGA",
|
||||||
.ack = fpga_ack_irq,
|
.ack = fpga_ack_irq,
|
||||||
.mask = fpga_mask_irq,
|
.mask = fpga_mask_irq,
|
||||||
.unmask = fpga_unmask_irq,
|
.unmask = fpga_unmask_irq,
|
||||||
|
|
|
@ -168,7 +168,8 @@ static struct omap_irq_bank omap1610_irq_banks[] = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct irqchip omap_irq_chip = {
|
static struct irq_chip omap_irq_chip = {
|
||||||
|
.name = "MPU",
|
||||||
.ack = omap_mask_ack_irq,
|
.ack = omap_mask_ack_irq,
|
||||||
.mask = omap_mask_irq,
|
.mask = omap_mask_irq,
|
||||||
.unmask = omap_unmask_irq,
|
.unmask = omap_unmask_irq,
|
||||||
|
|
|
@ -94,7 +94,8 @@ static void omap_mask_ack_irq(unsigned int irq)
|
||||||
omap_ack_irq(irq);
|
omap_ack_irq(irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip omap_irq_chip = {
|
static struct irq_chip omap_irq_chip = {
|
||||||
|
.name = "INTC",
|
||||||
.ack = omap_mask_ack_irq,
|
.ack = omap_mask_ack_irq,
|
||||||
.mask = omap_mask_irq,
|
.mask = omap_mask_irq,
|
||||||
.unmask = omap_unmask_irq,
|
.unmask = omap_unmask_irq,
|
||||||
|
|
|
@ -39,7 +39,8 @@ static void pxa_unmask_low_irq(unsigned int irq)
|
||||||
ICMR |= (1 << (irq + PXA_IRQ_SKIP));
|
ICMR |= (1 << (irq + PXA_IRQ_SKIP));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip pxa_internal_chip_low = {
|
static struct irq_chip pxa_internal_chip_low = {
|
||||||
|
.name = "SC",
|
||||||
.ack = pxa_mask_low_irq,
|
.ack = pxa_mask_low_irq,
|
||||||
.mask = pxa_mask_low_irq,
|
.mask = pxa_mask_low_irq,
|
||||||
.unmask = pxa_unmask_low_irq,
|
.unmask = pxa_unmask_low_irq,
|
||||||
|
@ -61,7 +62,8 @@ static void pxa_unmask_high_irq(unsigned int irq)
|
||||||
ICMR2 |= (1 << (irq - 32 + PXA_IRQ_SKIP));
|
ICMR2 |= (1 << (irq - 32 + PXA_IRQ_SKIP));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip pxa_internal_chip_high = {
|
static struct irq_chip pxa_internal_chip_high = {
|
||||||
|
.name = "SC-hi",
|
||||||
.ack = pxa_mask_high_irq,
|
.ack = pxa_mask_high_irq,
|
||||||
.mask = pxa_mask_high_irq,
|
.mask = pxa_mask_high_irq,
|
||||||
.unmask = pxa_unmask_high_irq,
|
.unmask = pxa_unmask_high_irq,
|
||||||
|
@ -129,7 +131,8 @@ static void pxa_ack_low_gpio(unsigned int irq)
|
||||||
GEDR0 = (1 << (irq - IRQ_GPIO0));
|
GEDR0 = (1 << (irq - IRQ_GPIO0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip pxa_low_gpio_chip = {
|
static struct irq_chip pxa_low_gpio_chip = {
|
||||||
|
.name = "GPIO-l",
|
||||||
.ack = pxa_ack_low_gpio,
|
.ack = pxa_ack_low_gpio,
|
||||||
.mask = pxa_mask_low_irq,
|
.mask = pxa_mask_low_irq,
|
||||||
.unmask = pxa_unmask_low_irq,
|
.unmask = pxa_unmask_low_irq,
|
||||||
|
@ -237,7 +240,8 @@ static void pxa_unmask_muxed_gpio(unsigned int irq)
|
||||||
GFER(gpio) = GPIO_IRQ_falling_edge[idx] & GPIO_IRQ_mask[idx];
|
GFER(gpio) = GPIO_IRQ_falling_edge[idx] & GPIO_IRQ_mask[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip pxa_muxed_gpio_chip = {
|
static struct irq_chip pxa_muxed_gpio_chip = {
|
||||||
|
.name = "GPIO",
|
||||||
.ack = pxa_ack_muxed_gpio,
|
.ack = pxa_ack_muxed_gpio,
|
||||||
.mask = pxa_mask_muxed_gpio,
|
.mask = pxa_mask_muxed_gpio,
|
||||||
.unmask = pxa_unmask_muxed_gpio,
|
.unmask = pxa_unmask_muxed_gpio,
|
||||||
|
|
|
@ -68,7 +68,8 @@ static void lpd270_unmask_irq(unsigned int irq)
|
||||||
__raw_writew(lpd270_irq_enabled, LPD270_INT_MASK);
|
__raw_writew(lpd270_irq_enabled, LPD270_INT_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip lpd270_irq_chip = {
|
static struct irq_chip lpd270_irq_chip = {
|
||||||
|
.name = "CPLD",
|
||||||
.ack = lpd270_mask_irq,
|
.ack = lpd270_mask_irq,
|
||||||
.mask = lpd270_mask_irq,
|
.mask = lpd270_mask_irq,
|
||||||
.unmask = lpd270_unmask_irq,
|
.unmask = lpd270_unmask_irq,
|
||||||
|
|
|
@ -78,7 +78,8 @@ static void lubbock_unmask_irq(unsigned int irq)
|
||||||
LUB_IRQ_MASK_EN = (lubbock_irq_enabled |= (1 << lubbock_irq));
|
LUB_IRQ_MASK_EN = (lubbock_irq_enabled |= (1 << lubbock_irq));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip lubbock_irq_chip = {
|
static struct irq_chip lubbock_irq_chip = {
|
||||||
|
.name = "FPGA",
|
||||||
.ack = lubbock_mask_irq,
|
.ack = lubbock_mask_irq,
|
||||||
.mask = lubbock_mask_irq,
|
.mask = lubbock_mask_irq,
|
||||||
.unmask = lubbock_unmask_irq,
|
.unmask = lubbock_unmask_irq,
|
||||||
|
|
|
@ -64,7 +64,8 @@ static void mainstone_unmask_irq(unsigned int irq)
|
||||||
MST_INTMSKENA = (mainstone_irq_enabled |= (1 << mainstone_irq));
|
MST_INTMSKENA = (mainstone_irq_enabled |= (1 << mainstone_irq));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip mainstone_irq_chip = {
|
static struct irq_chip mainstone_irq_chip = {
|
||||||
|
.name = "FPGA",
|
||||||
.ack = mainstone_mask_irq,
|
.ack = mainstone_mask_irq,
|
||||||
.mask = mainstone_mask_irq,
|
.mask = mainstone_mask_irq,
|
||||||
.unmask = mainstone_unmask_irq,
|
.unmask = mainstone_unmask_irq,
|
||||||
|
|
|
@ -95,7 +95,8 @@ static int sa1100_low_gpio_wake(unsigned int irq, unsigned int on)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip sa1100_low_gpio_chip = {
|
static struct irq_chip sa1100_low_gpio_chip = {
|
||||||
|
.name = "GPIO-l",
|
||||||
.ack = sa1100_low_gpio_ack,
|
.ack = sa1100_low_gpio_ack,
|
||||||
.mask = sa1100_low_gpio_mask,
|
.mask = sa1100_low_gpio_mask,
|
||||||
.unmask = sa1100_low_gpio_unmask,
|
.unmask = sa1100_low_gpio_unmask,
|
||||||
|
@ -178,7 +179,8 @@ static int sa1100_high_gpio_wake(unsigned int irq, unsigned int on)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip sa1100_high_gpio_chip = {
|
static struct irq_chip sa1100_high_gpio_chip = {
|
||||||
|
.name = "GPIO-h",
|
||||||
.ack = sa1100_high_gpio_ack,
|
.ack = sa1100_high_gpio_ack,
|
||||||
.mask = sa1100_high_gpio_mask,
|
.mask = sa1100_high_gpio_mask,
|
||||||
.unmask = sa1100_high_gpio_unmask,
|
.unmask = sa1100_high_gpio_unmask,
|
||||||
|
@ -215,7 +217,8 @@ static int sa1100_set_wake(unsigned int irq, unsigned int on)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip sa1100_normal_chip = {
|
static struct irq_chip sa1100_normal_chip = {
|
||||||
|
.name = "SC",
|
||||||
.ack = sa1100_mask_irq,
|
.ack = sa1100_mask_irq,
|
||||||
.mask = sa1100_mask_irq,
|
.mask = sa1100_mask_irq,
|
||||||
.unmask = sa1100_unmask_irq,
|
.unmask = sa1100_unmask_irq,
|
||||||
|
|
|
@ -69,7 +69,8 @@ static irqreturn_t bogus_int(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction cascade;
|
static struct irqaction cascade;
|
||||||
|
|
||||||
static struct irqchip fb_chip = {
|
static struct irq_chip fb_chip = {
|
||||||
|
.name = "XT-PIC",
|
||||||
.ack = shark_ack_8259A_irq,
|
.ack = shark_ack_8259A_irq,
|
||||||
.mask = shark_disable_8259A_irq,
|
.mask = shark_disable_8259A_irq,
|
||||||
.unmask = shark_enable_8259A_irq,
|
.unmask = shark_enable_8259A_irq,
|
||||||
|
|
|
@ -69,7 +69,8 @@ static void sic_unmask_irq(unsigned int irq)
|
||||||
writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_SET);
|
writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip sic_chip = {
|
static struct irq_chip sic_chip = {
|
||||||
|
.name = "SIC",
|
||||||
.ack = sic_mask_irq,
|
.ack = sic_mask_irq,
|
||||||
.mask = sic_mask_irq,
|
.mask = sic_mask_irq,
|
||||||
.unmask = sic_unmask_irq,
|
.unmask = sic_unmask_irq,
|
||||||
|
|
|
@ -944,7 +944,8 @@ static void mpuio_unmask_irq(unsigned int irq)
|
||||||
_set_gpio_irqenable(bank, gpio, 1);
|
_set_gpio_irqenable(bank, gpio, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip gpio_irq_chip = {
|
static struct irq_chip gpio_irq_chip = {
|
||||||
|
.name = "GPIO",
|
||||||
.ack = gpio_ack_irq,
|
.ack = gpio_ack_irq,
|
||||||
.mask = gpio_mask_irq,
|
.mask = gpio_mask_irq,
|
||||||
.unmask = gpio_unmask_irq,
|
.unmask = gpio_unmask_irq,
|
||||||
|
@ -952,10 +953,11 @@ static struct irqchip gpio_irq_chip = {
|
||||||
.set_wake = gpio_wake_enable,
|
.set_wake = gpio_wake_enable,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct irqchip mpuio_irq_chip = {
|
static struct irq_chip mpuio_irq_chip = {
|
||||||
|
.name = "MPUIO",
|
||||||
.ack = mpuio_ack_irq,
|
.ack = mpuio_ack_irq,
|
||||||
.mask = mpuio_mask_irq,
|
.mask = mpuio_mask_irq,
|
||||||
.unmask = mpuio_unmask_irq
|
.unmask = mpuio_unmask_irq
|
||||||
};
|
};
|
||||||
|
|
||||||
static int initialized;
|
static int initialized;
|
||||||
|
|
|
@ -151,7 +151,7 @@ static void
|
||||||
simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset)
|
simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset)
|
||||||
{
|
{
|
||||||
int list_len = sc->use_sg;
|
int list_len = sc->use_sg;
|
||||||
struct scatterlist *sl = (struct scatterlist *)sc->buffer;
|
struct scatterlist *sl = (struct scatterlist *)sc->request_buffer;
|
||||||
struct disk_stat stat;
|
struct disk_stat stat;
|
||||||
struct disk_req req;
|
struct disk_req req;
|
||||||
|
|
||||||
|
@ -244,7 +244,7 @@ static void simscsi_fillresult(struct scsi_cmnd *sc, char *buf, unsigned len)
|
||||||
|
|
||||||
if (scatterlen == 0)
|
if (scatterlen == 0)
|
||||||
memcpy(sc->request_buffer, buf, len);
|
memcpy(sc->request_buffer, buf, len);
|
||||||
else for (slp = (struct scatterlist *)sc->buffer; scatterlen-- > 0 && len > 0; slp++) {
|
else for (slp = (struct scatterlist *)sc->request_buffer; scatterlen-- > 0 && len > 0; slp++) {
|
||||||
unsigned thislen = min(len, slp->length);
|
unsigned thislen = min(len, slp->length);
|
||||||
|
|
||||||
memcpy(page_address(slp->page) + slp->offset, buf, thislen);
|
memcpy(page_address(slp->page) + slp->offset, buf, thislen);
|
||||||
|
|
|
@ -632,7 +632,7 @@ kern_memory_descriptor (unsigned long phys_addr)
|
||||||
if (phys_addr - md->start < (md->num_pages << EFI_PAGE_SHIFT))
|
if (phys_addr - md->start < (md->num_pages << EFI_PAGE_SHIFT))
|
||||||
return md;
|
return md;
|
||||||
}
|
}
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static efi_memory_desc_t *
|
static efi_memory_desc_t *
|
||||||
|
@ -652,7 +652,7 @@ efi_memory_descriptor (unsigned long phys_addr)
|
||||||
if (phys_addr - md->phys_addr < (md->num_pages << EFI_PAGE_SHIFT))
|
if (phys_addr - md->phys_addr < (md->num_pages << EFI_PAGE_SHIFT))
|
||||||
return md;
|
return md;
|
||||||
}
|
}
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32
|
u32
|
||||||
|
@ -923,7 +923,7 @@ find_memmap_space (void)
|
||||||
void
|
void
|
||||||
efi_memmap_init(unsigned long *s, unsigned long *e)
|
efi_memmap_init(unsigned long *s, unsigned long *e)
|
||||||
{
|
{
|
||||||
struct kern_memdesc *k, *prev = 0;
|
struct kern_memdesc *k, *prev = NULL;
|
||||||
u64 contig_low=0, contig_high=0;
|
u64 contig_low=0, contig_high=0;
|
||||||
u64 as, ae, lim;
|
u64 as, ae, lim;
|
||||||
void *efi_map_start, *efi_map_end, *p, *q;
|
void *efi_map_start, *efi_map_end, *p, *q;
|
||||||
|
|
|
@ -853,7 +853,6 @@ END(__ia64_init_fpu)
|
||||||
*/
|
*/
|
||||||
GLOBAL_ENTRY(ia64_switch_mode_phys)
|
GLOBAL_ENTRY(ia64_switch_mode_phys)
|
||||||
{
|
{
|
||||||
alloc r2=ar.pfs,0,0,0,0
|
|
||||||
rsm psr.i | psr.ic // disable interrupts and interrupt collection
|
rsm psr.i | psr.ic // disable interrupts and interrupt collection
|
||||||
mov r15=ip
|
mov r15=ip
|
||||||
}
|
}
|
||||||
|
@ -902,7 +901,6 @@ END(ia64_switch_mode_phys)
|
||||||
*/
|
*/
|
||||||
GLOBAL_ENTRY(ia64_switch_mode_virt)
|
GLOBAL_ENTRY(ia64_switch_mode_virt)
|
||||||
{
|
{
|
||||||
alloc r2=ar.pfs,0,0,0,0
|
|
||||||
rsm psr.i | psr.ic // disable interrupts and interrupt collection
|
rsm psr.i | psr.ic // disable interrupts and interrupt collection
|
||||||
mov r15=ip
|
mov r15=ip
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,7 @@ EXPORT_SYMBOL(__udivdi3);
|
||||||
EXPORT_SYMBOL(__moddi3);
|
EXPORT_SYMBOL(__moddi3);
|
||||||
EXPORT_SYMBOL(__umoddi3);
|
EXPORT_SYMBOL(__umoddi3);
|
||||||
|
|
||||||
#if defined(CONFIG_MD_RAID5) || defined(CONFIG_MD_RAID5_MODULE)
|
#if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE)
|
||||||
extern void xor_ia64_2(void);
|
extern void xor_ia64_2(void);
|
||||||
extern void xor_ia64_3(void);
|
extern void xor_ia64_3(void);
|
||||||
extern void xor_ia64_4(void);
|
extern void xor_ia64_4(void);
|
||||||
|
|
|
@ -217,12 +217,7 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
|
||||||
.body
|
.body
|
||||||
;;
|
;;
|
||||||
ld8 loc2 = [loc2] // loc2 <- entry point
|
ld8 loc2 = [loc2] // loc2 <- entry point
|
||||||
mov out0 = in0 // first argument
|
mov loc3 = psr // save psr
|
||||||
mov out1 = in1 // copy arg2
|
|
||||||
mov out2 = in2 // copy arg3
|
|
||||||
mov out3 = in3 // copy arg3
|
|
||||||
;;
|
|
||||||
mov loc3 = psr // save psr
|
|
||||||
;;
|
;;
|
||||||
mov loc4=ar.rsc // save RSE configuration
|
mov loc4=ar.rsc // save RSE configuration
|
||||||
dep.z loc2=loc2,0,61 // convert pal entry point to physical
|
dep.z loc2=loc2,0,61 // convert pal entry point to physical
|
||||||
|
@ -236,18 +231,23 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
|
||||||
;;
|
;;
|
||||||
andcm r16=loc3,r16 // removes bits to clear from psr
|
andcm r16=loc3,r16 // removes bits to clear from psr
|
||||||
br.call.sptk.many rp=ia64_switch_mode_phys
|
br.call.sptk.many rp=ia64_switch_mode_phys
|
||||||
.ret6:
|
|
||||||
|
mov out0 = in0 // first argument
|
||||||
|
mov out1 = in1 // copy arg2
|
||||||
|
mov out2 = in2 // copy arg3
|
||||||
|
mov out3 = in3 // copy arg3
|
||||||
mov loc5 = r19
|
mov loc5 = r19
|
||||||
mov loc6 = r20
|
mov loc6 = r20
|
||||||
|
|
||||||
br.call.sptk.many rp=b7 // now make the call
|
br.call.sptk.many rp=b7 // now make the call
|
||||||
.ret7:
|
|
||||||
mov ar.rsc=0 // put RSE in enforced lazy, LE mode
|
mov ar.rsc=0 // put RSE in enforced lazy, LE mode
|
||||||
mov r16=loc3 // r16= original psr
|
mov r16=loc3 // r16= original psr
|
||||||
mov r19=loc5
|
mov r19=loc5
|
||||||
mov r20=loc6
|
mov r20=loc6
|
||||||
br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode
|
br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode
|
||||||
|
|
||||||
.ret8: mov psr.l = loc3 // restore init PSR
|
mov psr.l = loc3 // restore init PSR
|
||||||
mov ar.pfs = loc1
|
mov ar.pfs = loc1
|
||||||
mov rp = loc0
|
mov rp = loc0
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -566,29 +566,23 @@ version_info(char *page)
|
||||||
pal_version_u_t min_ver, cur_ver;
|
pal_version_u_t min_ver, cur_ver;
|
||||||
char *p = page;
|
char *p = page;
|
||||||
|
|
||||||
/* The PAL_VERSION call is advertised as being able to support
|
if (ia64_pal_version(&min_ver, &cur_ver) != 0)
|
||||||
* both physical and virtual mode calls. This seems to be a documentation
|
return 0;
|
||||||
* bug rather than firmware bug. In fact, it does only support physical mode.
|
|
||||||
* So now the code reflects this fact and the pal_version() has been updated
|
|
||||||
* accordingly.
|
|
||||||
*/
|
|
||||||
if (ia64_pal_version(&min_ver, &cur_ver) != 0) return 0;
|
|
||||||
|
|
||||||
p += sprintf(p,
|
p += sprintf(p,
|
||||||
"PAL_vendor : 0x%02x (min=0x%02x)\n"
|
"PAL_vendor : 0x%02x (min=0x%02x)\n"
|
||||||
"PAL_A : %x.%x.%x (min=%x.%x.%x)\n"
|
"PAL_A : %02x.%02x (min=%02x.%02x)\n"
|
||||||
"PAL_B : %x.%x.%x (min=%x.%x.%x)\n",
|
"PAL_B : %02x.%02x (min=%02x.%02x)\n",
|
||||||
cur_ver.pal_version_s.pv_pal_vendor, min_ver.pal_version_s.pv_pal_vendor,
|
cur_ver.pal_version_s.pv_pal_vendor,
|
||||||
|
min_ver.pal_version_s.pv_pal_vendor,
|
||||||
cur_ver.pal_version_s.pv_pal_a_model>>4,
|
cur_ver.pal_version_s.pv_pal_a_model,
|
||||||
cur_ver.pal_version_s.pv_pal_a_model&0xf, cur_ver.pal_version_s.pv_pal_a_rev,
|
cur_ver.pal_version_s.pv_pal_a_rev,
|
||||||
min_ver.pal_version_s.pv_pal_a_model>>4,
|
min_ver.pal_version_s.pv_pal_a_model,
|
||||||
min_ver.pal_version_s.pv_pal_a_model&0xf, min_ver.pal_version_s.pv_pal_a_rev,
|
min_ver.pal_version_s.pv_pal_a_rev,
|
||||||
|
cur_ver.pal_version_s.pv_pal_b_model,
|
||||||
cur_ver.pal_version_s.pv_pal_b_model>>4,
|
cur_ver.pal_version_s.pv_pal_b_rev,
|
||||||
cur_ver.pal_version_s.pv_pal_b_model&0xf, cur_ver.pal_version_s.pv_pal_b_rev,
|
min_ver.pal_version_s.pv_pal_b_model,
|
||||||
min_ver.pal_version_s.pv_pal_b_model>>4,
|
min_ver.pal_version_s.pv_pal_b_rev);
|
||||||
min_ver.pal_version_s.pv_pal_b_model&0xf, min_ver.pal_version_s.pv_pal_b_rev);
|
|
||||||
return p - page;
|
return p - page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ lib-y := __divsi3.o __udivsi3.o __modsi3.o __umodsi3.o \
|
||||||
lib-$(CONFIG_ITANIUM) += copy_page.o copy_user.o memcpy.o
|
lib-$(CONFIG_ITANIUM) += copy_page.o copy_user.o memcpy.o
|
||||||
lib-$(CONFIG_MCKINLEY) += copy_page_mck.o memcpy_mck.o
|
lib-$(CONFIG_MCKINLEY) += copy_page_mck.o memcpy_mck.o
|
||||||
lib-$(CONFIG_PERFMON) += carta_random.o
|
lib-$(CONFIG_PERFMON) += carta_random.o
|
||||||
lib-$(CONFIG_MD_RAID5) += xor.o
|
lib-$(CONFIG_MD_RAID456) += xor.o
|
||||||
|
|
||||||
AFLAGS___divdi3.o =
|
AFLAGS___divdi3.o =
|
||||||
AFLAGS___udivdi3.o = -DUNSIGNED
|
AFLAGS___udivdi3.o = -DUNSIGNED
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||||
static unsigned long num_dma_physpages;
|
static unsigned long num_dma_physpages;
|
||||||
|
static unsigned long max_gap;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,9 +46,15 @@ show_mem (void)
|
||||||
|
|
||||||
printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
||||||
i = max_mapnr;
|
i = max_mapnr;
|
||||||
while (i-- > 0) {
|
for (i = 0; i < max_mapnr; i++) {
|
||||||
if (!pfn_valid(i))
|
if (!pfn_valid(i)) {
|
||||||
|
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||||
|
if (max_gap < LARGE_GAP)
|
||||||
|
continue;
|
||||||
|
i = vmemmap_find_next_valid_pfn(0, i) - 1;
|
||||||
|
#endif
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
total++;
|
total++;
|
||||||
if (PageReserved(mem_map+i))
|
if (PageReserved(mem_map+i))
|
||||||
reserved++;
|
reserved++;
|
||||||
|
@ -234,7 +241,6 @@ paging_init (void)
|
||||||
unsigned long zones_size[MAX_NR_ZONES];
|
unsigned long zones_size[MAX_NR_ZONES];
|
||||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||||
unsigned long zholes_size[MAX_NR_ZONES];
|
unsigned long zholes_size[MAX_NR_ZONES];
|
||||||
unsigned long max_gap;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* initialize mem_map[] */
|
/* initialize mem_map[] */
|
||||||
|
@ -266,7 +272,6 @@ paging_init (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
max_gap = 0;
|
|
||||||
efi_memmap_walk(find_largest_hole, (u64 *)&max_gap);
|
efi_memmap_walk(find_largest_hole, (u64 *)&max_gap);
|
||||||
if (max_gap < LARGE_GAP) {
|
if (max_gap < LARGE_GAP) {
|
||||||
vmem_map = (struct page *) 0;
|
vmem_map = (struct page *) 0;
|
||||||
|
@ -277,7 +282,8 @@ paging_init (void)
|
||||||
|
|
||||||
/* allocate virtual_mem_map */
|
/* allocate virtual_mem_map */
|
||||||
|
|
||||||
map_size = PAGE_ALIGN(max_low_pfn * sizeof(struct page));
|
map_size = PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) *
|
||||||
|
sizeof(struct page));
|
||||||
vmalloc_end -= map_size;
|
vmalloc_end -= map_size;
|
||||||
vmem_map = (struct page *) vmalloc_end;
|
vmem_map = (struct page *) vmalloc_end;
|
||||||
efi_memmap_walk(create_mem_map_page_table, NULL);
|
efi_memmap_walk(create_mem_map_page_table, NULL);
|
||||||
|
|
|
@ -534,68 +534,6 @@ void __cpuinit *per_cpu_init(void)
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_SMP */
|
#endif /* CONFIG_SMP */
|
||||||
|
|
||||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
|
||||||
static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i)
|
|
||||||
{
|
|
||||||
unsigned long end_address, hole_next_pfn;
|
|
||||||
unsigned long stop_address;
|
|
||||||
|
|
||||||
end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i];
|
|
||||||
end_address = PAGE_ALIGN(end_address);
|
|
||||||
|
|
||||||
stop_address = (unsigned long) &vmem_map[
|
|
||||||
pgdat->node_start_pfn + pgdat->node_spanned_pages];
|
|
||||||
|
|
||||||
do {
|
|
||||||
pgd_t *pgd;
|
|
||||||
pud_t *pud;
|
|
||||||
pmd_t *pmd;
|
|
||||||
pte_t *pte;
|
|
||||||
|
|
||||||
pgd = pgd_offset_k(end_address);
|
|
||||||
if (pgd_none(*pgd)) {
|
|
||||||
end_address += PGDIR_SIZE;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
pud = pud_offset(pgd, end_address);
|
|
||||||
if (pud_none(*pud)) {
|
|
||||||
end_address += PUD_SIZE;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
pmd = pmd_offset(pud, end_address);
|
|
||||||
if (pmd_none(*pmd)) {
|
|
||||||
end_address += PMD_SIZE;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
pte = pte_offset_kernel(pmd, end_address);
|
|
||||||
retry_pte:
|
|
||||||
if (pte_none(*pte)) {
|
|
||||||
end_address += PAGE_SIZE;
|
|
||||||
pte++;
|
|
||||||
if ((end_address < stop_address) &&
|
|
||||||
(end_address != ALIGN(end_address, 1UL << PMD_SHIFT)))
|
|
||||||
goto retry_pte;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* Found next valid vmem_map page */
|
|
||||||
break;
|
|
||||||
} while (end_address < stop_address);
|
|
||||||
|
|
||||||
end_address = min(end_address, stop_address);
|
|
||||||
end_address = end_address - (unsigned long) vmem_map + sizeof(struct page) - 1;
|
|
||||||
hole_next_pfn = end_address / sizeof(struct page);
|
|
||||||
return hole_next_pfn - pgdat->node_start_pfn;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i)
|
|
||||||
{
|
|
||||||
return i + 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* show_mem - give short summary of memory stats
|
* show_mem - give short summary of memory stats
|
||||||
*
|
*
|
||||||
|
@ -625,7 +563,8 @@ void show_mem(void)
|
||||||
if (pfn_valid(pgdat->node_start_pfn + i))
|
if (pfn_valid(pgdat->node_start_pfn + i))
|
||||||
page = pfn_to_page(pgdat->node_start_pfn + i);
|
page = pfn_to_page(pgdat->node_start_pfn + i);
|
||||||
else {
|
else {
|
||||||
i = find_next_valid_pfn_for_pgdat(pgdat, i) - 1;
|
i = vmemmap_find_next_valid_pfn(pgdat->node_id,
|
||||||
|
i) - 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (PageReserved(page))
|
if (PageReserved(page))
|
||||||
|
@ -751,7 +690,8 @@ void __init paging_init(void)
|
||||||
efi_memmap_walk(filter_rsvd_memory, count_node_pages);
|
efi_memmap_walk(filter_rsvd_memory, count_node_pages);
|
||||||
|
|
||||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||||
vmalloc_end -= PAGE_ALIGN(max_low_pfn * sizeof(struct page));
|
vmalloc_end -= PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) *
|
||||||
|
sizeof(struct page));
|
||||||
vmem_map = (struct page *) vmalloc_end;
|
vmem_map = (struct page *) vmalloc_end;
|
||||||
efi_memmap_walk(create_mem_map_page_table, NULL);
|
efi_memmap_walk(create_mem_map_page_table, NULL);
|
||||||
printk("Virtual mem_map starts at 0x%p\n", vmem_map);
|
printk("Virtual mem_map starts at 0x%p\n", vmem_map);
|
||||||
|
|
|
@ -415,6 +415,61 @@ ia64_mmu_init (void *my_cpu_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||||
|
int vmemmap_find_next_valid_pfn(int node, int i)
|
||||||
|
{
|
||||||
|
unsigned long end_address, hole_next_pfn;
|
||||||
|
unsigned long stop_address;
|
||||||
|
pg_data_t *pgdat = NODE_DATA(node);
|
||||||
|
|
||||||
|
end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i];
|
||||||
|
end_address = PAGE_ALIGN(end_address);
|
||||||
|
|
||||||
|
stop_address = (unsigned long) &vmem_map[
|
||||||
|
pgdat->node_start_pfn + pgdat->node_spanned_pages];
|
||||||
|
|
||||||
|
do {
|
||||||
|
pgd_t *pgd;
|
||||||
|
pud_t *pud;
|
||||||
|
pmd_t *pmd;
|
||||||
|
pte_t *pte;
|
||||||
|
|
||||||
|
pgd = pgd_offset_k(end_address);
|
||||||
|
if (pgd_none(*pgd)) {
|
||||||
|
end_address += PGDIR_SIZE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pud = pud_offset(pgd, end_address);
|
||||||
|
if (pud_none(*pud)) {
|
||||||
|
end_address += PUD_SIZE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pmd = pmd_offset(pud, end_address);
|
||||||
|
if (pmd_none(*pmd)) {
|
||||||
|
end_address += PMD_SIZE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pte = pte_offset_kernel(pmd, end_address);
|
||||||
|
retry_pte:
|
||||||
|
if (pte_none(*pte)) {
|
||||||
|
end_address += PAGE_SIZE;
|
||||||
|
pte++;
|
||||||
|
if ((end_address < stop_address) &&
|
||||||
|
(end_address != ALIGN(end_address, 1UL << PMD_SHIFT)))
|
||||||
|
goto retry_pte;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* Found next valid vmem_map page */
|
||||||
|
break;
|
||||||
|
} while (end_address < stop_address);
|
||||||
|
|
||||||
|
end_address = min(end_address, stop_address);
|
||||||
|
end_address = end_address - (unsigned long) vmem_map + sizeof(struct page) - 1;
|
||||||
|
hole_next_pfn = end_address / sizeof(struct page);
|
||||||
|
return hole_next_pfn - pgdat->node_start_pfn;
|
||||||
|
}
|
||||||
|
|
||||||
int __init
|
int __init
|
||||||
create_mem_map_page_table (u64 start, u64 end, void *arg)
|
create_mem_map_page_table (u64 start, u64 end, void *arg)
|
||||||
|
|
|
@ -32,7 +32,7 @@ ioremap (unsigned long offset, unsigned long size)
|
||||||
*/
|
*/
|
||||||
attr = kern_mem_attribute(offset, size);
|
attr = kern_mem_attribute(offset, size);
|
||||||
if (attr & EFI_MEMORY_WB)
|
if (attr & EFI_MEMORY_WB)
|
||||||
return phys_to_virt(offset);
|
return (void __iomem *) phys_to_virt(offset);
|
||||||
else if (attr & EFI_MEMORY_UC)
|
else if (attr & EFI_MEMORY_UC)
|
||||||
return __ioremap(offset, size);
|
return __ioremap(offset, size);
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ ioremap (unsigned long offset, unsigned long size)
|
||||||
gran_base = GRANULEROUNDDOWN(offset);
|
gran_base = GRANULEROUNDDOWN(offset);
|
||||||
gran_size = GRANULEROUNDUP(offset + size) - gran_base;
|
gran_size = GRANULEROUNDUP(offset + size) - gran_base;
|
||||||
if (efi_mem_attribute(gran_base, gran_size) & EFI_MEMORY_WB)
|
if (efi_mem_attribute(gran_base, gran_size) & EFI_MEMORY_WB)
|
||||||
return phys_to_virt(offset);
|
return (void __iomem *) phys_to_virt(offset);
|
||||||
|
|
||||||
return __ioremap(offset, size);
|
return __ioremap(offset, size);
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ void __iomem *
|
||||||
ioremap_nocache (unsigned long offset, unsigned long size)
|
ioremap_nocache (unsigned long offset, unsigned long size)
|
||||||
{
|
{
|
||||||
if (kern_mem_attribute(offset, size) & EFI_MEMORY_WB)
|
if (kern_mem_attribute(offset, size) & EFI_MEMORY_WB)
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
return __ioremap(offset, size);
|
return __ioremap(offset, size);
|
||||||
}
|
}
|
||||||
|
|
|
@ -480,7 +480,7 @@ xpc_activating(void *__partid)
|
||||||
partid_t partid = (u64) __partid;
|
partid_t partid = (u64) __partid;
|
||||||
struct xpc_partition *part = &xpc_partitions[partid];
|
struct xpc_partition *part = &xpc_partitions[partid];
|
||||||
unsigned long irq_flags;
|
unsigned long irq_flags;
|
||||||
struct sched_param param = { sched_priority: MAX_RT_PRIO - 1 };
|
struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ tioce_mmr_war_pre(struct tioce_kernel *kern, void *mmr_addr)
|
||||||
else
|
else
|
||||||
mmr_war_offset = 0x158;
|
mmr_war_offset = 0x158;
|
||||||
|
|
||||||
readq_relaxed((void *)(mmr_base + mmr_war_offset));
|
readq_relaxed((void __iomem *)(mmr_base + mmr_war_offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,8 +92,8 @@ tioce_mmr_war_post(struct tioce_kernel *kern, void *mmr_addr)
|
||||||
|
|
||||||
if (mmr_offset < 0x45000) {
|
if (mmr_offset < 0x45000) {
|
||||||
if (mmr_offset == 0x100)
|
if (mmr_offset == 0x100)
|
||||||
readq_relaxed((void *)(mmr_base + 0x38));
|
readq_relaxed((void __iomem *)(mmr_base + 0x38));
|
||||||
readq_relaxed((void *)(mmr_base + 0xb050));
|
readq_relaxed((void __iomem *)(mmr_base + 0xb050));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -513,6 +513,7 @@ END(stub_rt_sigreturn)
|
||||||
swapgs
|
swapgs
|
||||||
1: incl %gs:pda_irqcount # RED-PEN should check preempt count
|
1: incl %gs:pda_irqcount # RED-PEN should check preempt count
|
||||||
cmoveq %gs:pda_irqstackptr,%rsp
|
cmoveq %gs:pda_irqstackptr,%rsp
|
||||||
|
push %rbp # backlink for old unwinder
|
||||||
/*
|
/*
|
||||||
* We entered an interrupt context - irqs are off:
|
* We entered an interrupt context - irqs are off:
|
||||||
*/
|
*/
|
||||||
|
@ -1139,18 +1140,21 @@ ENTRY(machine_check)
|
||||||
END(machine_check)
|
END(machine_check)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Call softirq on interrupt stack. Interrupts are off. */
|
||||||
ENTRY(call_softirq)
|
ENTRY(call_softirq)
|
||||||
CFI_STARTPROC
|
CFI_STARTPROC
|
||||||
movq %gs:pda_irqstackptr,%rax
|
push %rbp
|
||||||
movq %rsp,%rdx
|
CFI_ADJUST_CFA_OFFSET 8
|
||||||
CFI_DEF_CFA_REGISTER rdx
|
CFI_REL_OFFSET rbp,0
|
||||||
|
mov %rsp,%rbp
|
||||||
|
CFI_DEF_CFA_REGISTER rbp
|
||||||
incl %gs:pda_irqcount
|
incl %gs:pda_irqcount
|
||||||
cmove %rax,%rsp
|
cmove %gs:pda_irqstackptr,%rsp
|
||||||
pushq %rdx
|
push %rbp # backlink for old unwinder
|
||||||
/*todo CFI_DEF_CFA_EXPRESSION ...*/
|
|
||||||
call __do_softirq
|
call __do_softirq
|
||||||
popq %rsp
|
leaveq
|
||||||
CFI_DEF_CFA_REGISTER rsp
|
CFI_DEF_CFA_REGISTER rsp
|
||||||
|
CFI_ADJUST_CFA_OFFSET -8
|
||||||
decl %gs:pda_irqcount
|
decl %gs:pda_irqcount
|
||||||
ret
|
ret
|
||||||
CFI_ENDPROC
|
CFI_ENDPROC
|
||||||
|
|
|
@ -92,5 +92,7 @@ void __init no_iommu_init(void)
|
||||||
{
|
{
|
||||||
if (dma_ops)
|
if (dma_ops)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
force_iommu = 0; /* no HW IOMMU */
|
||||||
dma_ops = &nommu_dma_ops;
|
dma_ops = &nommu_dma_ops;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,8 +58,8 @@ struct dock_dependent_device {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DOCK_DOCKING 0x00000001
|
#define DOCK_DOCKING 0x00000001
|
||||||
#define DOCK_EVENT KOBJ_DOCK
|
#define DOCK_EVENT 3
|
||||||
#define UNDOCK_EVENT KOBJ_UNDOCK
|
#define UNDOCK_EVENT 2
|
||||||
|
|
||||||
static struct dock_station *dock_station;
|
static struct dock_station *dock_station;
|
||||||
|
|
||||||
|
@ -322,11 +322,10 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event)
|
||||||
|
|
||||||
static void dock_event(struct dock_station *ds, u32 event, int num)
|
static void dock_event(struct dock_station *ds, u32 event, int num)
|
||||||
{
|
{
|
||||||
struct acpi_device *device;
|
/*
|
||||||
|
* we don't do events until someone tells me that
|
||||||
device = dock_create_acpi_device(ds->handle);
|
* they would like to have them.
|
||||||
if (device)
|
*/
|
||||||
kobject_uevent(&device->kobj, num);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -374,7 +374,12 @@ scdrv_init(void)
|
||||||
struct sysctl_data_s *scd;
|
struct sysctl_data_s *scd;
|
||||||
void *salbuf;
|
void *salbuf;
|
||||||
dev_t first_dev, dev;
|
dev_t first_dev, dev;
|
||||||
nasid_t event_nasid = ia64_sn_get_console_nasid();
|
nasid_t event_nasid;
|
||||||
|
|
||||||
|
if (!ia64_platform_is("sn2"))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
event_nasid = ia64_sn_get_console_nasid();
|
||||||
|
|
||||||
if (alloc_chrdev_region(&first_dev, 0, num_cnodes,
|
if (alloc_chrdev_region(&first_dev, 0, num_cnodes,
|
||||||
SYSCTL_BASENAME) < 0) {
|
SYSCTL_BASENAME) < 0) {
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <net/arp.h>
|
#include <net/arp.h>
|
||||||
#include <net/neighbour.h>
|
#include <net/neighbour.h>
|
||||||
#include <net/route.h>
|
#include <net/route.h>
|
||||||
|
#include <net/netevent.h>
|
||||||
#include <rdma/ib_addr.h>
|
#include <rdma/ib_addr.h>
|
||||||
|
|
||||||
MODULE_AUTHOR("Sean Hefty");
|
MODULE_AUTHOR("Sean Hefty");
|
||||||
|
@ -326,25 +327,22 @@ void rdma_addr_cancel(struct rdma_dev_addr *addr)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(rdma_addr_cancel);
|
EXPORT_SYMBOL(rdma_addr_cancel);
|
||||||
|
|
||||||
static int addr_arp_recv(struct sk_buff *skb, struct net_device *dev,
|
static int netevent_callback(struct notifier_block *self, unsigned long event,
|
||||||
struct packet_type *pkt, struct net_device *orig_dev)
|
void *ctx)
|
||||||
{
|
{
|
||||||
struct arphdr *arp_hdr;
|
if (event == NETEVENT_NEIGH_UPDATE) {
|
||||||
|
struct neighbour *neigh = ctx;
|
||||||
|
|
||||||
arp_hdr = (struct arphdr *) skb->nh.raw;
|
if (neigh->dev->type == ARPHRD_INFINIBAND &&
|
||||||
|
(neigh->nud_state & NUD_VALID)) {
|
||||||
if (arp_hdr->ar_op == htons(ARPOP_REQUEST) ||
|
set_timeout(jiffies);
|
||||||
arp_hdr->ar_op == htons(ARPOP_REPLY))
|
}
|
||||||
set_timeout(jiffies);
|
}
|
||||||
|
|
||||||
kfree_skb(skb);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct packet_type addr_arp = {
|
static struct notifier_block nb = {
|
||||||
.type = __constant_htons(ETH_P_ARP),
|
.notifier_call = netevent_callback
|
||||||
.func = addr_arp_recv,
|
|
||||||
.af_packet_priv = (void*) 1,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int addr_init(void)
|
static int addr_init(void)
|
||||||
|
@ -353,13 +351,13 @@ static int addr_init(void)
|
||||||
if (!addr_wq)
|
if (!addr_wq)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
dev_add_pack(&addr_arp);
|
register_netevent_notifier(&nb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void addr_cleanup(void)
|
static void addr_cleanup(void)
|
||||||
{
|
{
|
||||||
dev_remove_pack(&addr_arp);
|
unregister_netevent_notifier(&nb);
|
||||||
destroy_workqueue(addr_wq);
|
destroy_workqueue(addr_wq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -975,8 +975,10 @@ int ib_send_cm_req(struct ib_cm_id *cm_id,
|
||||||
|
|
||||||
cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv->
|
cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv->
|
||||||
id.local_id);
|
id.local_id);
|
||||||
if (IS_ERR(cm_id_priv->timewait_info))
|
if (IS_ERR(cm_id_priv->timewait_info)) {
|
||||||
|
ret = PTR_ERR(cm_id_priv->timewait_info);
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av);
|
ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include <linux/kref.h>
|
#include <linux/kref.h>
|
||||||
#include <linux/idr.h>
|
#include <linux/idr.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
#include <linux/completion.h>
|
||||||
|
|
||||||
#include <rdma/ib_verbs.h>
|
#include <rdma/ib_verbs.h>
|
||||||
#include <rdma/ib_user_verbs.h>
|
#include <rdma/ib_user_verbs.h>
|
||||||
|
@ -69,6 +70,7 @@
|
||||||
|
|
||||||
struct ib_uverbs_device {
|
struct ib_uverbs_device {
|
||||||
struct kref ref;
|
struct kref ref;
|
||||||
|
struct completion comp;
|
||||||
int devnum;
|
int devnum;
|
||||||
struct cdev *dev;
|
struct cdev *dev;
|
||||||
struct class_device *class_dev;
|
struct class_device *class_dev;
|
||||||
|
|
|
@ -122,7 +122,7 @@ static void ib_uverbs_release_dev(struct kref *ref)
|
||||||
struct ib_uverbs_device *dev =
|
struct ib_uverbs_device *dev =
|
||||||
container_of(ref, struct ib_uverbs_device, ref);
|
container_of(ref, struct ib_uverbs_device, ref);
|
||||||
|
|
||||||
kfree(dev);
|
complete(&dev->comp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ib_uverbs_release_ucq(struct ib_uverbs_file *file,
|
void ib_uverbs_release_ucq(struct ib_uverbs_file *file,
|
||||||
|
@ -740,6 +740,7 @@ static void ib_uverbs_add_one(struct ib_device *device)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
kref_init(&uverbs_dev->ref);
|
kref_init(&uverbs_dev->ref);
|
||||||
|
init_completion(&uverbs_dev->comp);
|
||||||
|
|
||||||
spin_lock(&map_lock);
|
spin_lock(&map_lock);
|
||||||
uverbs_dev->devnum = find_first_zero_bit(dev_map, IB_UVERBS_MAX_DEVICES);
|
uverbs_dev->devnum = find_first_zero_bit(dev_map, IB_UVERBS_MAX_DEVICES);
|
||||||
|
@ -793,6 +794,8 @@ err_cdev:
|
||||||
|
|
||||||
err:
|
err:
|
||||||
kref_put(&uverbs_dev->ref, ib_uverbs_release_dev);
|
kref_put(&uverbs_dev->ref, ib_uverbs_release_dev);
|
||||||
|
wait_for_completion(&uverbs_dev->comp);
|
||||||
|
kfree(uverbs_dev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -812,7 +815,10 @@ static void ib_uverbs_remove_one(struct ib_device *device)
|
||||||
spin_unlock(&map_lock);
|
spin_unlock(&map_lock);
|
||||||
|
|
||||||
clear_bit(uverbs_dev->devnum, dev_map);
|
clear_bit(uverbs_dev->devnum, dev_map);
|
||||||
|
|
||||||
kref_put(&uverbs_dev->ref, ib_uverbs_release_dev);
|
kref_put(&uverbs_dev->ref, ib_uverbs_release_dev);
|
||||||
|
wait_for_completion(&uverbs_dev->comp);
|
||||||
|
kfree(uverbs_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags,
|
static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags,
|
||||||
|
|
|
@ -108,14 +108,15 @@ void mthca_alloc_cleanup(struct mthca_alloc *alloc)
|
||||||
* serialize access to the array.
|
* serialize access to the array.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define MTHCA_ARRAY_MASK (PAGE_SIZE / sizeof (void *) - 1)
|
||||||
|
|
||||||
void *mthca_array_get(struct mthca_array *array, int index)
|
void *mthca_array_get(struct mthca_array *array, int index)
|
||||||
{
|
{
|
||||||
int p = (index * sizeof (void *)) >> PAGE_SHIFT;
|
int p = (index * sizeof (void *)) >> PAGE_SHIFT;
|
||||||
|
|
||||||
if (array->page_list[p].page) {
|
if (array->page_list[p].page)
|
||||||
int i = index & (PAGE_SIZE / sizeof (void *) - 1);
|
return array->page_list[p].page[index & MTHCA_ARRAY_MASK];
|
||||||
return array->page_list[p].page[i];
|
else
|
||||||
} else
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,8 +131,7 @@ int mthca_array_set(struct mthca_array *array, int index, void *value)
|
||||||
if (!array->page_list[p].page)
|
if (!array->page_list[p].page)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
array->page_list[p].page[index & (PAGE_SIZE / sizeof (void *) - 1)] =
|
array->page_list[p].page[index & MTHCA_ARRAY_MASK] = value;
|
||||||
value;
|
|
||||||
++array->page_list[p].used;
|
++array->page_list[p].used;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -144,7 +144,8 @@ void mthca_array_clear(struct mthca_array *array, int index)
|
||||||
if (--array->page_list[p].used == 0) {
|
if (--array->page_list[p].used == 0) {
|
||||||
free_page((unsigned long) array->page_list[p].page);
|
free_page((unsigned long) array->page_list[p].page);
|
||||||
array->page_list[p].page = NULL;
|
array->page_list[p].page = NULL;
|
||||||
}
|
} else
|
||||||
|
array->page_list[p].page[index & MTHCA_ARRAY_MASK] = NULL;
|
||||||
|
|
||||||
if (array->page_list[p].used < 0)
|
if (array->page_list[p].used < 0)
|
||||||
pr_debug("Array %p index %d page %d with ref count %d < 0\n",
|
pr_debug("Array %p index %d page %d with ref count %d < 0\n",
|
||||||
|
|
|
@ -6,8 +6,7 @@ config INFINIBAND_IPOIB
|
||||||
transports IP packets over InfiniBand so you can use your IB
|
transports IP packets over InfiniBand so you can use your IB
|
||||||
device as a fancy NIC.
|
device as a fancy NIC.
|
||||||
|
|
||||||
The IPoIB protocol is defined by the IETF ipoib working
|
See Documentation/infiniband/ipoib.txt for more information
|
||||||
group: <http://www.ietf.org/html.charters/ipoib-charter.html>.
|
|
||||||
|
|
||||||
config INFINIBAND_IPOIB_DEBUG
|
config INFINIBAND_IPOIB_DEBUG
|
||||||
bool "IP-over-InfiniBand debugging" if EMBEDDED
|
bool "IP-over-InfiniBand debugging" if EMBEDDED
|
||||||
|
|
|
@ -77,6 +77,14 @@ MODULE_PARM_DESC(topspin_workarounds,
|
||||||
|
|
||||||
static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad };
|
static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad };
|
||||||
|
|
||||||
|
static int mellanox_workarounds = 1;
|
||||||
|
|
||||||
|
module_param(mellanox_workarounds, int, 0444);
|
||||||
|
MODULE_PARM_DESC(mellanox_workarounds,
|
||||||
|
"Enable workarounds for Mellanox SRP target bugs if != 0");
|
||||||
|
|
||||||
|
static const u8 mellanox_oui[3] = { 0x00, 0x02, 0xc9 };
|
||||||
|
|
||||||
static void srp_add_one(struct ib_device *device);
|
static void srp_add_one(struct ib_device *device);
|
||||||
static void srp_remove_one(struct ib_device *device);
|
static void srp_remove_one(struct ib_device *device);
|
||||||
static void srp_completion(struct ib_cq *cq, void *target_ptr);
|
static void srp_completion(struct ib_cq *cq, void *target_ptr);
|
||||||
|
@ -526,8 +534,10 @@ static int srp_reconnect_target(struct srp_target_port *target)
|
||||||
while (ib_poll_cq(target->cq, 1, &wc) > 0)
|
while (ib_poll_cq(target->cq, 1, &wc) > 0)
|
||||||
; /* nothing */
|
; /* nothing */
|
||||||
|
|
||||||
|
spin_lock_irq(target->scsi_host->host_lock);
|
||||||
list_for_each_entry_safe(req, tmp, &target->req_queue, list)
|
list_for_each_entry_safe(req, tmp, &target->req_queue, list)
|
||||||
srp_reset_req(target, req);
|
srp_reset_req(target, req);
|
||||||
|
spin_unlock_irq(target->scsi_host->host_lock);
|
||||||
|
|
||||||
target->rx_head = 0;
|
target->rx_head = 0;
|
||||||
target->tx_head = 0;
|
target->tx_head = 0;
|
||||||
|
@ -567,7 +577,7 @@ err:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int srp_map_fmr(struct srp_device *dev, struct scatterlist *scat,
|
static int srp_map_fmr(struct srp_target_port *target, struct scatterlist *scat,
|
||||||
int sg_cnt, struct srp_request *req,
|
int sg_cnt, struct srp_request *req,
|
||||||
struct srp_direct_buf *buf)
|
struct srp_direct_buf *buf)
|
||||||
{
|
{
|
||||||
|
@ -577,10 +587,15 @@ static int srp_map_fmr(struct srp_device *dev, struct scatterlist *scat,
|
||||||
int page_cnt;
|
int page_cnt;
|
||||||
int i, j;
|
int i, j;
|
||||||
int ret;
|
int ret;
|
||||||
|
struct srp_device *dev = target->srp_host->dev;
|
||||||
|
|
||||||
if (!dev->fmr_pool)
|
if (!dev->fmr_pool)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
if ((sg_dma_address(&scat[0]) & ~dev->fmr_page_mask) &&
|
||||||
|
mellanox_workarounds && !memcmp(&target->ioc_guid, mellanox_oui, 3))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
len = page_cnt = 0;
|
len = page_cnt = 0;
|
||||||
for (i = 0; i < sg_cnt; ++i) {
|
for (i = 0; i < sg_cnt; ++i) {
|
||||||
if (sg_dma_address(&scat[i]) & ~dev->fmr_page_mask) {
|
if (sg_dma_address(&scat[i]) & ~dev->fmr_page_mask) {
|
||||||
|
@ -683,7 +698,7 @@ static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_target_port *target,
|
||||||
buf->va = cpu_to_be64(sg_dma_address(scat));
|
buf->va = cpu_to_be64(sg_dma_address(scat));
|
||||||
buf->key = cpu_to_be32(target->srp_host->dev->mr->rkey);
|
buf->key = cpu_to_be32(target->srp_host->dev->mr->rkey);
|
||||||
buf->len = cpu_to_be32(sg_dma_len(scat));
|
buf->len = cpu_to_be32(sg_dma_len(scat));
|
||||||
} else if (srp_map_fmr(target->srp_host->dev, scat, count, req,
|
} else if (srp_map_fmr(target, scat, count, req,
|
||||||
(void *) cmd->add_data)) {
|
(void *) cmd->add_data)) {
|
||||||
/*
|
/*
|
||||||
* FMR mapping failed, and the scatterlist has more
|
* FMR mapping failed, and the scatterlist has more
|
||||||
|
|
|
@ -526,7 +526,9 @@ static int dvb_frontend_thread(void *data)
|
||||||
fepriv->delay = 3*HZ;
|
fepriv->delay = 3*HZ;
|
||||||
fepriv->status = 0;
|
fepriv->status = 0;
|
||||||
fepriv->wakeup = 0;
|
fepriv->wakeup = 0;
|
||||||
fepriv->reinitialise = 1;
|
fepriv->reinitialise = 0;
|
||||||
|
|
||||||
|
dvb_frontend_init(fe);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
up(&fepriv->sem); /* is locked when we enter the thread... */
|
up(&fepriv->sem); /* is locked when we enter the thread... */
|
||||||
|
@ -1013,17 +1015,18 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
|
if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
|
||||||
|
|
||||||
|
/* normal tune mode when opened R/W */
|
||||||
|
fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
|
||||||
|
fepriv->tone = -1;
|
||||||
|
fepriv->voltage = -1;
|
||||||
|
|
||||||
ret = dvb_frontend_start (fe);
|
ret = dvb_frontend_start (fe);
|
||||||
if (ret)
|
if (ret)
|
||||||
dvb_generic_release (inode, file);
|
dvb_generic_release (inode, file);
|
||||||
|
|
||||||
/* empty event queue */
|
/* empty event queue */
|
||||||
fepriv->events.eventr = fepriv->events.eventw = 0;
|
fepriv->events.eventr = fepriv->events.eventw = 0;
|
||||||
|
|
||||||
/* normal tune mode when opened R/W */
|
|
||||||
fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
|
|
||||||
fepriv->tone = -1;
|
|
||||||
fepriv->voltage = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -194,11 +194,11 @@ struct dvb_pll_desc dvb_pll_tda665x = {
|
||||||
{ 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ },
|
{ 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ },
|
||||||
{ 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ },
|
{ 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ },
|
||||||
{ 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ },
|
{ 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ },
|
||||||
{ 444000000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ },
|
{ 444000000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ },
|
||||||
{ 583834000, 36249333, 166667, 0xca, 0x63 /* 011 0 0 0 11 */ },
|
{ 583834000, 36249333, 166667, 0xca, 0x64 /* 011 0 0 1 00 */ },
|
||||||
{ 793834000, 36249333, 166667, 0xca, 0xa3 /* 101 0 0 0 11 */ },
|
{ 793834000, 36249333, 166667, 0xca, 0xa4 /* 101 0 0 1 00 */ },
|
||||||
{ 444834000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ },
|
{ 444834000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ },
|
||||||
{ 861000000, 36249333, 166667, 0xca, 0xe3 /* 111 0 0 0 11 */ },
|
{ 861000000, 36249333, 166667, 0xca, 0xe4 /* 111 0 0 1 00 */ },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL(dvb_pll_tda665x);
|
EXPORT_SYMBOL(dvb_pll_tda665x);
|
||||||
|
@ -613,7 +613,21 @@ static struct dvb_tuner_ops dvb_pll_tuner_ops = {
|
||||||
|
|
||||||
int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc)
|
int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc)
|
||||||
{
|
{
|
||||||
|
u8 b1 [] = { 0 };
|
||||||
|
struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD, .buf = b1, .len = 1 };
|
||||||
struct dvb_pll_priv *priv = NULL;
|
struct dvb_pll_priv *priv = NULL;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (i2c != NULL) {
|
||||||
|
if (fe->ops.i2c_gate_ctrl)
|
||||||
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||||
|
|
||||||
|
ret = i2c_transfer (i2c, &msg, 1);
|
||||||
|
if (ret != 1)
|
||||||
|
return -1;
|
||||||
|
if (fe->ops.i2c_gate_ctrl)
|
||||||
|
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||||
|
}
|
||||||
|
|
||||||
priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL);
|
priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL);
|
||||||
if (priv == NULL)
|
if (priv == NULL)
|
||||||
|
|
|
@ -2203,8 +2203,8 @@ static int frontend_init(struct av7110 *av7110)
|
||||||
av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params;
|
av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params;
|
||||||
|
|
||||||
/* set TDA9819 into DVB mode */
|
/* set TDA9819 into DVB mode */
|
||||||
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD)
|
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
|
||||||
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF)
|
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
|
||||||
|
|
||||||
/* tuner on this needs a slower i2c bus speed */
|
/* tuner on this needs a slower i2c bus speed */
|
||||||
av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240;
|
av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240;
|
||||||
|
|
|
@ -272,8 +272,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh)
|
||||||
if (ves1820_writereg(dev, 0x09, 0x0f, 0x60))
|
if (ves1820_writereg(dev, 0x09, 0x0f, 0x60))
|
||||||
dprintk(1, "setting band in demodulator failed.\n");
|
dprintk(1, "setting band in demodulator failed.\n");
|
||||||
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
||||||
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9198 pin9(STD)
|
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9819 pin9(STD)
|
||||||
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9198 pin30(VIF)
|
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9819 pin30(VIF)
|
||||||
}
|
}
|
||||||
if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1)
|
if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1)
|
||||||
dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num);
|
dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num);
|
||||||
|
@ -308,8 +308,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh)
|
||||||
if (ves1820_writereg(dev, 0x09, 0x0f, 0x20))
|
if (ves1820_writereg(dev, 0x09, 0x0f, 0x20))
|
||||||
dprintk(1, "setting band in demodulator failed.\n");
|
dprintk(1, "setting band in demodulator failed.\n");
|
||||||
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
||||||
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD)
|
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
|
||||||
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF)
|
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -750,8 +750,8 @@ int av7110_init_analog_module(struct av7110 *av7110)
|
||||||
if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20))
|
if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20))
|
||||||
dprintk(1, "setting band in demodulator failed.\n");
|
dprintk(1, "setting band in demodulator failed.\n");
|
||||||
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
||||||
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD)
|
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
|
||||||
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF)
|
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* init the saa7113 */
|
/* init the saa7113 */
|
||||||
|
|
|
@ -1303,6 +1303,9 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
|
||||||
budget_av->budget.dvb_adapter.priv = budget_av;
|
budget_av->budget.dvb_adapter.priv = budget_av;
|
||||||
frontend_init(budget_av);
|
frontend_init(budget_av);
|
||||||
ciintf_init(budget_av);
|
ciintf_init(budget_av);
|
||||||
|
|
||||||
|
ttpci_budget_init_hooks(&budget_av->budget);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1101,6 +1101,8 @@ static int budget_ci_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
|
||||||
budget_ci->budget.dvb_adapter.priv = budget_ci;
|
budget_ci->budget.dvb_adapter.priv = budget_ci;
|
||||||
frontend_init(budget_ci);
|
frontend_init(budget_ci);
|
||||||
|
|
||||||
|
ttpci_budget_init_hooks(&budget_ci->budget);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,9 +63,6 @@ static int stop_ts_capture(struct budget *budget)
|
||||||
{
|
{
|
||||||
dprintk(2, "budget: %p\n", budget);
|
dprintk(2, "budget: %p\n", budget);
|
||||||
|
|
||||||
if (--budget->feeding)
|
|
||||||
return budget->feeding;
|
|
||||||
|
|
||||||
saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off
|
saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off
|
||||||
SAA7146_IER_DISABLE(budget->dev, MASK_10);
|
SAA7146_IER_DISABLE(budget->dev, MASK_10);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -77,8 +74,8 @@ static int start_ts_capture(struct budget *budget)
|
||||||
|
|
||||||
dprintk(2, "budget: %p\n", budget);
|
dprintk(2, "budget: %p\n", budget);
|
||||||
|
|
||||||
if (budget->feeding)
|
if (!budget->feeding || !budget->fe_synced)
|
||||||
return ++budget->feeding;
|
return 0;
|
||||||
|
|
||||||
saa7146_write(dev, MC1, MASK_20); // DMA3 off
|
saa7146_write(dev, MC1, MASK_20); // DMA3 off
|
||||||
|
|
||||||
|
@ -139,7 +136,33 @@ static int start_ts_capture(struct budget *budget)
|
||||||
SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */
|
SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */
|
||||||
saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */
|
saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */
|
||||||
|
|
||||||
return ++budget->feeding;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int budget_read_fe_status(struct dvb_frontend *fe, fe_status_t *status)
|
||||||
|
{
|
||||||
|
struct budget *budget = (struct budget *) fe->dvb->priv;
|
||||||
|
int synced;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (budget->read_fe_status)
|
||||||
|
ret = budget->read_fe_status(fe, status);
|
||||||
|
else
|
||||||
|
ret = -EINVAL;
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
|
synced = (*status & FE_HAS_LOCK);
|
||||||
|
if (synced != budget->fe_synced) {
|
||||||
|
budget->fe_synced = synced;
|
||||||
|
spin_lock(&budget->feedlock);
|
||||||
|
if (synced)
|
||||||
|
start_ts_capture(budget);
|
||||||
|
else
|
||||||
|
stop_ts_capture(budget);
|
||||||
|
spin_unlock(&budget->feedlock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vpeirq(unsigned long data)
|
static void vpeirq(unsigned long data)
|
||||||
|
@ -267,7 +290,7 @@ static int budget_start_feed(struct dvb_demux_feed *feed)
|
||||||
{
|
{
|
||||||
struct dvb_demux *demux = feed->demux;
|
struct dvb_demux *demux = feed->demux;
|
||||||
struct budget *budget = (struct budget *) demux->priv;
|
struct budget *budget = (struct budget *) demux->priv;
|
||||||
int status;
|
int status = 0;
|
||||||
|
|
||||||
dprintk(2, "budget: %p\n", budget);
|
dprintk(2, "budget: %p\n", budget);
|
||||||
|
|
||||||
|
@ -276,7 +299,8 @@ static int budget_start_feed(struct dvb_demux_feed *feed)
|
||||||
|
|
||||||
spin_lock(&budget->feedlock);
|
spin_lock(&budget->feedlock);
|
||||||
feed->pusi_seen = 0; /* have a clean section start */
|
feed->pusi_seen = 0; /* have a clean section start */
|
||||||
status = start_ts_capture(budget);
|
if (budget->feeding++ == 0)
|
||||||
|
status = start_ts_capture(budget);
|
||||||
spin_unlock(&budget->feedlock);
|
spin_unlock(&budget->feedlock);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -285,12 +309,13 @@ static int budget_stop_feed(struct dvb_demux_feed *feed)
|
||||||
{
|
{
|
||||||
struct dvb_demux *demux = feed->demux;
|
struct dvb_demux *demux = feed->demux;
|
||||||
struct budget *budget = (struct budget *) demux->priv;
|
struct budget *budget = (struct budget *) demux->priv;
|
||||||
int status;
|
int status = 0;
|
||||||
|
|
||||||
dprintk(2, "budget: %p\n", budget);
|
dprintk(2, "budget: %p\n", budget);
|
||||||
|
|
||||||
spin_lock(&budget->feedlock);
|
spin_lock(&budget->feedlock);
|
||||||
status = stop_ts_capture(budget);
|
if (--budget->feeding == 0)
|
||||||
|
status = stop_ts_capture(budget);
|
||||||
spin_unlock(&budget->feedlock);
|
spin_unlock(&budget->feedlock);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -470,6 +495,14 @@ err:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ttpci_budget_init_hooks(struct budget *budget)
|
||||||
|
{
|
||||||
|
if (budget->dvb_frontend && !budget->read_fe_status) {
|
||||||
|
budget->read_fe_status = budget->dvb_frontend->ops.read_status;
|
||||||
|
budget->dvb_frontend->ops.read_status = budget_read_fe_status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int ttpci_budget_deinit(struct budget *budget)
|
int ttpci_budget_deinit(struct budget *budget)
|
||||||
{
|
{
|
||||||
struct saa7146_dev *dev = budget->dev;
|
struct saa7146_dev *dev = budget->dev;
|
||||||
|
@ -508,11 +541,8 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port)
|
||||||
spin_lock(&budget->feedlock);
|
spin_lock(&budget->feedlock);
|
||||||
budget->video_port = video_port;
|
budget->video_port = video_port;
|
||||||
if (budget->feeding) {
|
if (budget->feeding) {
|
||||||
int oldfeeding = budget->feeding;
|
|
||||||
budget->feeding = 1;
|
|
||||||
stop_ts_capture(budget);
|
stop_ts_capture(budget);
|
||||||
start_ts_capture(budget);
|
start_ts_capture(budget);
|
||||||
budget->feeding = oldfeeding;
|
|
||||||
}
|
}
|
||||||
spin_unlock(&budget->feedlock);
|
spin_unlock(&budget->feedlock);
|
||||||
}
|
}
|
||||||
|
@ -520,6 +550,7 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port)
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_debiread);
|
EXPORT_SYMBOL_GPL(ttpci_budget_debiread);
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite);
|
EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite);
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_init);
|
EXPORT_SYMBOL_GPL(ttpci_budget_init);
|
||||||
|
EXPORT_SYMBOL_GPL(ttpci_budget_init_hooks);
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_deinit);
|
EXPORT_SYMBOL_GPL(ttpci_budget_deinit);
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler);
|
EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler);
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port);
|
EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port);
|
||||||
|
|
|
@ -617,6 +617,8 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
|
||||||
budget->dvb_adapter.priv = budget;
|
budget->dvb_adapter.priv = budget;
|
||||||
frontend_init(budget);
|
frontend_init(budget);
|
||||||
|
|
||||||
|
ttpci_budget_init_hooks(budget);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -375,9 +375,6 @@ static void frontend_init(struct budget *budget)
|
||||||
if (budget->dvb_frontend) {
|
if (budget->dvb_frontend) {
|
||||||
budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
|
budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
|
||||||
budget->dvb_frontend->tuner_priv = &budget->i2c_adap;
|
budget->dvb_frontend->tuner_priv = &budget->i2c_adap;
|
||||||
budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd;
|
|
||||||
budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst;
|
|
||||||
budget->dvb_frontend->ops.set_tone = budget_set_tone;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -474,6 +471,8 @@ static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_
|
||||||
budget->dvb_adapter.priv = budget;
|
budget->dvb_adapter.priv = budget;
|
||||||
frontend_init(budget);
|
frontend_init(budget);
|
||||||
|
|
||||||
|
ttpci_budget_init_hooks(budget);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,9 +52,6 @@ struct budget {
|
||||||
struct dmx_frontend hw_frontend;
|
struct dmx_frontend hw_frontend;
|
||||||
struct dmx_frontend mem_frontend;
|
struct dmx_frontend mem_frontend;
|
||||||
|
|
||||||
int fe_synced;
|
|
||||||
struct mutex pid_mutex;
|
|
||||||
|
|
||||||
int ci_present;
|
int ci_present;
|
||||||
int video_port;
|
int video_port;
|
||||||
|
|
||||||
|
@ -74,6 +71,9 @@ struct budget {
|
||||||
|
|
||||||
struct dvb_adapter dvb_adapter;
|
struct dvb_adapter dvb_adapter;
|
||||||
struct dvb_frontend *dvb_frontend;
|
struct dvb_frontend *dvb_frontend;
|
||||||
|
int (*read_fe_status)(struct dvb_frontend *fe, fe_status_t *status);
|
||||||
|
int fe_synced;
|
||||||
|
|
||||||
void *priv;
|
void *priv;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -106,6 +106,7 @@ static struct saa7146_pci_extension_data x_var = { \
|
||||||
extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
|
extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
|
||||||
struct saa7146_pci_extension_data *info,
|
struct saa7146_pci_extension_data *info,
|
||||||
struct module *owner);
|
struct module *owner);
|
||||||
|
extern void ttpci_budget_init_hooks(struct budget *budget);
|
||||||
extern int ttpci_budget_deinit(struct budget *budget);
|
extern int ttpci_budget_deinit(struct budget *budget);
|
||||||
extern void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr);
|
extern void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr);
|
||||||
extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port);
|
extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port);
|
||||||
|
|
|
@ -145,7 +145,7 @@ config VIDEO_SAA5246A
|
||||||
|
|
||||||
config VIDEO_SAA5249
|
config VIDEO_SAA5249
|
||||||
tristate "SAA5249 Teletext processor"
|
tristate "SAA5249 Teletext processor"
|
||||||
depends on VIDEO_DEV && I2C
|
depends on VIDEO_DEV && I2C && VIDEO_V4L1
|
||||||
help
|
help
|
||||||
Support for I2C bus based teletext using the SAA5249 chip. At the
|
Support for I2C bus based teletext using the SAA5249 chip. At the
|
||||||
moment this is only useful on some European WinTV cards.
|
moment this is only useful on some European WinTV cards.
|
||||||
|
@ -155,7 +155,7 @@ config VIDEO_SAA5249
|
||||||
|
|
||||||
config TUNER_3036
|
config TUNER_3036
|
||||||
tristate "SAB3036 tuner"
|
tristate "SAB3036 tuner"
|
||||||
depends on VIDEO_DEV && I2C
|
depends on VIDEO_DEV && I2C && VIDEO_V4L1
|
||||||
help
|
help
|
||||||
Say Y here to include support for Philips SAB3036 compatible tuners.
|
Say Y here to include support for Philips SAB3036 compatible tuners.
|
||||||
If in doubt, say N.
|
If in doubt, say N.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
config VIDEO_BT848
|
config VIDEO_BT848
|
||||||
tristate "BT848 Video For Linux"
|
tristate "BT848 Video For Linux"
|
||||||
depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L2
|
depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L1
|
||||||
select I2C_ALGOBIT
|
select I2C_ALGOBIT
|
||||||
select FW_LOADER
|
select FW_LOADER
|
||||||
select VIDEO_BTCX
|
select VIDEO_BTCX
|
||||||
|
|
|
@ -3923,7 +3923,12 @@ static int __devinit bttv_register_video(struct bttv *btv)
|
||||||
goto err;
|
goto err;
|
||||||
printk(KERN_INFO "bttv%d: registered device video%d\n",
|
printk(KERN_INFO "bttv%d: registered device video%d\n",
|
||||||
btv->c.nr,btv->video_dev->minor & 0x1f);
|
btv->c.nr,btv->video_dev->minor & 0x1f);
|
||||||
video_device_create_file(btv->video_dev, &class_device_attr_card);
|
if (class_device_create_file(&btv->video_dev->class_dev,
|
||||||
|
&class_device_attr_card)<0) {
|
||||||
|
printk(KERN_ERR "bttv%d: class_device_create_file 'card' "
|
||||||
|
"failed\n", btv->c.nr);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
/* vbi */
|
/* vbi */
|
||||||
btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi");
|
btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi");
|
||||||
|
@ -4287,6 +4292,8 @@ static struct pci_driver bttv_pci_driver = {
|
||||||
|
|
||||||
static int bttv_init_module(void)
|
static int bttv_init_module(void)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
bttv_num = 0;
|
bttv_num = 0;
|
||||||
|
|
||||||
printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
|
printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
|
||||||
|
@ -4308,7 +4315,11 @@ static int bttv_init_module(void)
|
||||||
|
|
||||||
bttv_check_chipset();
|
bttv_check_chipset();
|
||||||
|
|
||||||
bus_register(&bttv_sub_bus_type);
|
ret = bus_register(&bttv_sub_bus_type);
|
||||||
|
if (ret < 0) {
|
||||||
|
printk(KERN_WARNING "bttv: bus_register error: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
return pci_register_driver(&bttv_pci_driver);
|
return pci_register_driver(&bttv_pci_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,11 +31,16 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include "bttvp.h"
|
#include "bttvp.h"
|
||||||
|
|
||||||
/* Offset from line sync pulse leading edge (0H) in 1 / sampling_rate:
|
/* Offset from line sync pulse leading edge (0H) to start of VBI capture,
|
||||||
bt8x8 /HRESET pulse starts at 0H and has length 64 / fCLKx1 (E|O_VTC
|
in fCLKx2 pixels. According to the datasheet, VBI capture starts
|
||||||
HSFMT = 0). VBI_HDELAY (always 0) is an offset from the trailing edge
|
VBI_HDELAY fCLKx1 pixels from the tailing edgeof /HRESET, and /HRESET
|
||||||
of /HRESET in 1 / fCLKx1, and the sampling_rate tvnorm->Fsc is fCLKx2. */
|
is 64 fCLKx1 pixels wide. VBI_HDELAY is set to 0, so this should be
|
||||||
#define VBI_OFFSET ((64 + 0) * 2)
|
(64 + 0) * 2 = 128 fCLKx2 pixels. But it's not! The datasheet is
|
||||||
|
Just Plain Wrong. The real value appears to be different for
|
||||||
|
different revisions of the bt8x8 chips, and to be affected by the
|
||||||
|
horizontal scaling factor. Experimentally, the value is measured
|
||||||
|
to be about 244. */
|
||||||
|
#define VBI_OFFSET 244
|
||||||
|
|
||||||
#define VBI_DEFLINES 16
|
#define VBI_DEFLINES 16
|
||||||
#define VBI_MAXLINES 32
|
#define VBI_MAXLINES 32
|
||||||
|
|
|
@ -490,6 +490,23 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct video_code32
|
||||||
|
{
|
||||||
|
char loadwhat[16]; /* name or tag of file being passed */
|
||||||
|
compat_int_t datasize;
|
||||||
|
unsigned char *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline int microcode32(struct video_code *kp, struct video_code32 __user *up)
|
||||||
|
{
|
||||||
|
if(!access_ok(VERIFY_READ, up, sizeof(struct video_code32)) ||
|
||||||
|
copy_from_user(kp->loadwhat, up->loadwhat, sizeof (up->loadwhat)) ||
|
||||||
|
get_user(kp->datasize, &up->datasize) ||
|
||||||
|
copy_from_user(kp->data, up->data, up->datasize))
|
||||||
|
return -EFAULT;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32)
|
#define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32)
|
||||||
#define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32)
|
#define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32)
|
||||||
#define VIDIOCGWIN32 _IOR('v',9, struct video_window32)
|
#define VIDIOCGWIN32 _IOR('v',9, struct video_window32)
|
||||||
|
@ -498,6 +515,7 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user
|
||||||
#define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32)
|
#define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32)
|
||||||
#define VIDIOCGFREQ32 _IOR('v',14, u32)
|
#define VIDIOCGFREQ32 _IOR('v',14, u32)
|
||||||
#define VIDIOCSFREQ32 _IOW('v',15, u32)
|
#define VIDIOCSFREQ32 _IOW('v',15, u32)
|
||||||
|
#define VIDIOCSMICROCODE32 _IOW('v',27, struct video_code32)
|
||||||
|
|
||||||
/* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */
|
/* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */
|
||||||
#define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4)
|
#define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4)
|
||||||
|
@ -590,6 +608,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||||
struct video_tuner vt;
|
struct video_tuner vt;
|
||||||
struct video_buffer vb;
|
struct video_buffer vb;
|
||||||
struct video_window vw;
|
struct video_window vw;
|
||||||
|
struct video_code vc;
|
||||||
struct v4l2_format v2f;
|
struct v4l2_format v2f;
|
||||||
struct v4l2_buffer v2b;
|
struct v4l2_buffer v2b;
|
||||||
struct v4l2_framebuffer v2fb;
|
struct v4l2_framebuffer v2fb;
|
||||||
|
@ -628,6 +647,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||||
case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break;
|
case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break;
|
||||||
case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
|
case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
|
||||||
case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
|
case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
|
||||||
|
case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break;
|
||||||
};
|
};
|
||||||
|
|
||||||
switch(cmd) {
|
switch(cmd) {
|
||||||
|
@ -703,6 +723,10 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
||||||
case VIDIOC_G_FBUF:
|
case VIDIOC_G_FBUF:
|
||||||
case VIDIOC_G_INPUT:
|
case VIDIOC_G_INPUT:
|
||||||
compatible_arg = 0;
|
compatible_arg = 0;
|
||||||
|
case VIDIOCSMICROCODE:
|
||||||
|
err = microcode32(&karg.vc, up);
|
||||||
|
compatible_arg = 0;
|
||||||
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if(err)
|
if(err)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
config VIDEO_CPIA2
|
config VIDEO_CPIA2
|
||||||
tristate "CPiA2 Video For Linux"
|
tristate "CPiA2 Video For Linux"
|
||||||
depends on VIDEO_DEV && USB
|
depends on VIDEO_DEV && USB && VIDEO_V4L1
|
||||||
---help---
|
---help---
|
||||||
This is the video4linux driver for cameras based on Vision's CPiA2
|
This is the video4linux driver for cameras based on Vision's CPiA2
|
||||||
(Colour Processor Interface ASIC), such as the Digital Blue QX5
|
(Colour Processor Interface ASIC), such as the Digital Blue QX5
|
||||||
|
|
|
@ -89,7 +89,7 @@ static void cx88_ir_handle_key(struct cx88_IR *ir)
|
||||||
|
|
||||||
auxgpio = cx_read(MO_GP1_IO);
|
auxgpio = cx_read(MO_GP1_IO);
|
||||||
/* Take out the parity part */
|
/* Take out the parity part */
|
||||||
gpio+=(gpio & 0x7fd) + (auxgpio & 0xef);
|
gpio=(gpio & 0x7fd) + (auxgpio & 0xef);
|
||||||
} else
|
} else
|
||||||
auxgpio = gpio;
|
auxgpio = gpio;
|
||||||
|
|
||||||
|
|
|
@ -1180,7 +1180,6 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
|
||||||
V4L2_CAP_READWRITE |
|
V4L2_CAP_READWRITE |
|
||||||
V4L2_CAP_STREAMING |
|
V4L2_CAP_STREAMING |
|
||||||
V4L2_CAP_VBI_CAPTURE |
|
V4L2_CAP_VBI_CAPTURE |
|
||||||
V4L2_CAP_VIDEO_OVERLAY |
|
|
||||||
0;
|
0;
|
||||||
if (UNSET != core->tuner_type)
|
if (UNSET != core->tuner_type)
|
||||||
cap->capabilities |= V4L2_CAP_TUNER;
|
cap->capabilities |= V4L2_CAP_TUNER;
|
||||||
|
@ -1226,7 +1225,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
|
||||||
struct v4l2_format *f = arg;
|
struct v4l2_format *f = arg;
|
||||||
return cx8800_try_fmt(dev,fh,f);
|
return cx8800_try_fmt(dev,fh,f);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
/* --- streaming capture ------------------------------------- */
|
/* --- streaming capture ------------------------------------- */
|
||||||
case VIDIOCGMBUF:
|
case VIDIOCGMBUF:
|
||||||
{
|
{
|
||||||
|
@ -1585,7 +1584,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file,
|
||||||
*id = 0;
|
*id = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
case VIDIOCSTUNER:
|
case VIDIOCSTUNER:
|
||||||
{
|
{
|
||||||
struct video_tuner *v = arg;
|
struct video_tuner *v = arg;
|
||||||
|
|
|
@ -362,7 +362,7 @@ int msp_sleep(struct msp_state *state, int timeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
#ifdef CONFIG_VIDEO_V4L1
|
||||||
static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode)
|
static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode)
|
||||||
{
|
{
|
||||||
if (rxsubchans == V4L2_TUNER_SUB_MONO)
|
if (rxsubchans == V4L2_TUNER_SUB_MONO)
|
||||||
|
@ -384,6 +384,7 @@ static int msp_mode_v4l1_to_v4l2(int mode)
|
||||||
return V4L2_TUNER_MODE_LANG1;
|
return V4L2_TUNER_MODE_LANG1;
|
||||||
return V4L2_TUNER_MODE_MONO;
|
return V4L2_TUNER_MODE_MONO;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl)
|
static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl)
|
||||||
{
|
{
|
||||||
|
@ -509,6 +510,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
/* --- v4l ioctls --- */
|
/* --- v4l ioctls --- */
|
||||||
/* take care: bttv does userspace copying, we'll get a
|
/* take care: bttv does userspace copying, we'll get a
|
||||||
kernel pointer here... */
|
kernel pointer here... */
|
||||||
|
#ifdef CONFIG_VIDEO_V4L1
|
||||||
case VIDIOCGAUDIO:
|
case VIDIOCGAUDIO:
|
||||||
{
|
{
|
||||||
struct video_audio *va = arg;
|
struct video_audio *va = arg;
|
||||||
|
@ -577,6 +579,12 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
case VIDIOCSFREQ:
|
case VIDIOCSFREQ:
|
||||||
|
{
|
||||||
|
/* new channel -- kick audio carrier scan */
|
||||||
|
msp_wake_thread(client);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
case VIDIOC_S_FREQUENCY:
|
case VIDIOC_S_FREQUENCY:
|
||||||
{
|
{
|
||||||
/* new channel -- kick audio carrier scan */
|
/* new channel -- kick audio carrier scan */
|
||||||
|
|
|
@ -852,7 +852,6 @@ unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
|
||||||
return hdw->serial_number;
|
return hdw->serial_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
|
int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
|
||||||
{
|
{
|
||||||
return hdw->unit_number;
|
return hdw->unit_number;
|
||||||
|
@ -2318,7 +2317,6 @@ void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return name for this driver instance */
|
/* Return name for this driver instance */
|
||||||
const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
|
const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
|
||||||
{
|
{
|
||||||
|
@ -2542,6 +2540,10 @@ static void pvr2_ctl_timeout(unsigned long data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Issue a command and get a response from the device. This extended
|
||||||
|
version includes a probe flag (which if set means that device errors
|
||||||
|
should not be logged or treated as fatal) and a timeout in jiffies.
|
||||||
|
This can be used to non-lethally probe the health of endpoint 1. */
|
||||||
static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
|
static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
|
||||||
unsigned int timeout,int probe_fl,
|
unsigned int timeout,int probe_fl,
|
||||||
void *write_data,unsigned int write_len,
|
void *write_data,unsigned int write_len,
|
||||||
|
@ -2970,6 +2972,7 @@ int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Stop / start video stream transport */
|
||||||
static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
|
static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
@ -3068,6 +3071,7 @@ int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Find I2C address of eeprom */
|
||||||
static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
|
static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
|
static const char *pvr2_buffer_state_decode(enum pvr2_buffer_state);
|
||||||
|
|
||||||
#define BUFFER_SIG 0x47653271
|
#define BUFFER_SIG 0x47653271
|
||||||
|
|
||||||
// #define SANITY_CHECK_BUFFERS
|
// #define SANITY_CHECK_BUFFERS
|
||||||
|
@ -515,6 +517,10 @@ void pvr2_stream_set_callback(struct pvr2_stream *sp,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Query / set the nominal buffer count */
|
/* Query / set the nominal buffer count */
|
||||||
|
int pvr2_stream_get_buffer_count(struct pvr2_stream *sp)
|
||||||
|
{
|
||||||
|
return sp->buffer_target_count;
|
||||||
|
}
|
||||||
|
|
||||||
int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt)
|
int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt)
|
||||||
{
|
{
|
||||||
|
@ -553,7 +559,6 @@ int pvr2_stream_get_ready_count(struct pvr2_stream *sp)
|
||||||
return sp->r_count;
|
return sp->r_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void pvr2_stream_kill(struct pvr2_stream *sp)
|
void pvr2_stream_kill(struct pvr2_stream *sp)
|
||||||
{
|
{
|
||||||
struct pvr2_buffer *bp;
|
struct pvr2_buffer *bp;
|
||||||
|
@ -607,7 +612,6 @@ int pvr2_buffer_queue(struct pvr2_buffer *bp)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt)
|
int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -646,7 +650,6 @@ int pvr2_buffer_get_status(struct pvr2_buffer *bp)
|
||||||
return bp->status;
|
return bp->status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int pvr2_buffer_get_id(struct pvr2_buffer *bp)
|
int pvr2_buffer_get_id(struct pvr2_buffer *bp)
|
||||||
{
|
{
|
||||||
return bp->id;
|
return bp->id;
|
||||||
|
|
|
@ -47,6 +47,7 @@ void pvr2_stream_set_callback(struct pvr2_stream *,
|
||||||
void *data);
|
void *data);
|
||||||
|
|
||||||
/* Query / set the nominal buffer count */
|
/* Query / set the nominal buffer count */
|
||||||
|
int pvr2_stream_get_buffer_count(struct pvr2_stream *);
|
||||||
int pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int);
|
int pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int);
|
||||||
|
|
||||||
/* Get a pointer to a buffer that is either idle, ready, or is specified
|
/* Get a pointer to a buffer that is either idle, ready, or is specified
|
||||||
|
@ -58,6 +59,7 @@ struct pvr2_buffer *pvr2_stream_get_buffer(struct pvr2_stream *sp,int id);
|
||||||
/* Find out how many buffers are idle or ready */
|
/* Find out how many buffers are idle or ready */
|
||||||
int pvr2_stream_get_ready_count(struct pvr2_stream *);
|
int pvr2_stream_get_ready_count(struct pvr2_stream *);
|
||||||
|
|
||||||
|
|
||||||
/* Kill all pending buffers and throw away any ready buffers as well */
|
/* Kill all pending buffers and throw away any ready buffers as well */
|
||||||
void pvr2_stream_kill(struct pvr2_stream *);
|
void pvr2_stream_kill(struct pvr2_stream *);
|
||||||
|
|
||||||
|
|
|
@ -213,7 +213,9 @@ int pvr2_ioread_setup(struct pvr2_ioread *cp,struct pvr2_stream *sp)
|
||||||
" pvr2_ioread_setup (tear-down) id=%p",cp);
|
" pvr2_ioread_setup (tear-down) id=%p",cp);
|
||||||
pvr2_ioread_stop(cp);
|
pvr2_ioread_stop(cp);
|
||||||
pvr2_stream_kill(cp->stream);
|
pvr2_stream_kill(cp->stream);
|
||||||
pvr2_stream_set_buffer_count(cp->stream,0);
|
if (pvr2_stream_get_buffer_count(cp->stream)) {
|
||||||
|
pvr2_stream_set_buffer_count(cp->stream,0);
|
||||||
|
}
|
||||||
cp->stream = NULL;
|
cp->stream = NULL;
|
||||||
}
|
}
|
||||||
if (sp) {
|
if (sp) {
|
||||||
|
@ -251,7 +253,6 @@ int pvr2_ioread_set_enabled(struct pvr2_ioread *cp,int fl)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
|
static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
|
||||||
{
|
{
|
||||||
int stat;
|
int stat;
|
||||||
|
|
|
@ -44,12 +44,16 @@ struct pvr2_sysfs {
|
||||||
struct kobj_type ktype;
|
struct kobj_type ktype;
|
||||||
struct class_device_attribute attr_v4l_minor_number;
|
struct class_device_attribute attr_v4l_minor_number;
|
||||||
struct class_device_attribute attr_unit_number;
|
struct class_device_attribute attr_unit_number;
|
||||||
|
int v4l_minor_number_created_ok;
|
||||||
|
int unit_number_created_ok;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
||||||
struct pvr2_sysfs_debugifc {
|
struct pvr2_sysfs_debugifc {
|
||||||
struct class_device_attribute attr_debugcmd;
|
struct class_device_attribute attr_debugcmd;
|
||||||
struct class_device_attribute attr_debuginfo;
|
struct class_device_attribute attr_debuginfo;
|
||||||
|
int debugcmd_created_ok;
|
||||||
|
int debuginfo_created_ok;
|
||||||
};
|
};
|
||||||
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
||||||
|
|
||||||
|
@ -67,6 +71,7 @@ struct pvr2_sysfs_ctl_item {
|
||||||
struct pvr2_sysfs_ctl_item *item_next;
|
struct pvr2_sysfs_ctl_item *item_next;
|
||||||
struct attribute *attr_gen[7];
|
struct attribute *attr_gen[7];
|
||||||
struct attribute_group grp;
|
struct attribute_group grp;
|
||||||
|
int created_ok;
|
||||||
char name[80];
|
char name[80];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -487,6 +492,7 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id)
|
||||||
struct pvr2_sysfs_func_set *fp;
|
struct pvr2_sysfs_func_set *fp;
|
||||||
struct pvr2_ctrl *cptr;
|
struct pvr2_ctrl *cptr;
|
||||||
unsigned int cnt,acnt;
|
unsigned int cnt,acnt;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) {
|
if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) {
|
||||||
return;
|
return;
|
||||||
|
@ -589,7 +595,13 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id)
|
||||||
cip->grp.name = cip->name;
|
cip->grp.name = cip->name;
|
||||||
cip->grp.attrs = cip->attr_gen;
|
cip->grp.attrs = cip->attr_gen;
|
||||||
|
|
||||||
sysfs_create_group(&sfp->class_dev->kobj,&cip->grp);
|
ret = sysfs_create_group(&sfp->class_dev->kobj,&cip->grp);
|
||||||
|
if (ret) {
|
||||||
|
printk(KERN_WARNING "%s: sysfs_create_group error: %d\n",
|
||||||
|
__FUNCTION__, ret);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cip->created_ok = !0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
||||||
|
@ -600,6 +612,8 @@ static ssize_t debugcmd_store(struct class_device *,const char *,size_t count);
|
||||||
static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp)
|
static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp)
|
||||||
{
|
{
|
||||||
struct pvr2_sysfs_debugifc *dip;
|
struct pvr2_sysfs_debugifc *dip;
|
||||||
|
int ret;
|
||||||
|
|
||||||
dip = kmalloc(sizeof(*dip),GFP_KERNEL);
|
dip = kmalloc(sizeof(*dip),GFP_KERNEL);
|
||||||
if (!dip) return;
|
if (!dip) return;
|
||||||
memset(dip,0,sizeof(*dip));
|
memset(dip,0,sizeof(*dip));
|
||||||
|
@ -613,17 +627,34 @@ static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp)
|
||||||
dip->attr_debuginfo.attr.mode = S_IRUGO;
|
dip->attr_debuginfo.attr.mode = S_IRUGO;
|
||||||
dip->attr_debuginfo.show = debuginfo_show;
|
dip->attr_debuginfo.show = debuginfo_show;
|
||||||
sfp->debugifc = dip;
|
sfp->debugifc = dip;
|
||||||
class_device_create_file(sfp->class_dev,&dip->attr_debugcmd);
|
ret = class_device_create_file(sfp->class_dev,&dip->attr_debugcmd);
|
||||||
class_device_create_file(sfp->class_dev,&dip->attr_debuginfo);
|
if (ret < 0) {
|
||||||
|
printk(KERN_WARNING "%s: class_device_create_file error: %d\n",
|
||||||
|
__FUNCTION__, ret);
|
||||||
|
} else {
|
||||||
|
dip->debugcmd_created_ok = !0;
|
||||||
|
}
|
||||||
|
ret = class_device_create_file(sfp->class_dev,&dip->attr_debuginfo);
|
||||||
|
if (ret < 0) {
|
||||||
|
printk(KERN_WARNING "%s: class_device_create_file error: %d\n",
|
||||||
|
__FUNCTION__, ret);
|
||||||
|
} else {
|
||||||
|
dip->debuginfo_created_ok = !0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp)
|
static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp)
|
||||||
{
|
{
|
||||||
if (!sfp->debugifc) return;
|
if (!sfp->debugifc) return;
|
||||||
class_device_remove_file(sfp->class_dev,
|
if (sfp->debugifc->debuginfo_created_ok) {
|
||||||
&sfp->debugifc->attr_debuginfo);
|
class_device_remove_file(sfp->class_dev,
|
||||||
class_device_remove_file(sfp->class_dev,&sfp->debugifc->attr_debugcmd);
|
&sfp->debugifc->attr_debuginfo);
|
||||||
|
}
|
||||||
|
if (sfp->debugifc->debugcmd_created_ok) {
|
||||||
|
class_device_remove_file(sfp->class_dev,
|
||||||
|
&sfp->debugifc->attr_debugcmd);
|
||||||
|
}
|
||||||
kfree(sfp->debugifc);
|
kfree(sfp->debugifc);
|
||||||
sfp->debugifc = NULL;
|
sfp->debugifc = NULL;
|
||||||
}
|
}
|
||||||
|
@ -645,7 +676,9 @@ static void pvr2_sysfs_tear_down_controls(struct pvr2_sysfs *sfp)
|
||||||
struct pvr2_sysfs_ctl_item *cip1,*cip2;
|
struct pvr2_sysfs_ctl_item *cip1,*cip2;
|
||||||
for (cip1 = sfp->item_first; cip1; cip1 = cip2) {
|
for (cip1 = sfp->item_first; cip1; cip1 = cip2) {
|
||||||
cip2 = cip1->item_next;
|
cip2 = cip1->item_next;
|
||||||
sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp);
|
if (cip1->created_ok) {
|
||||||
|
sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp);
|
||||||
|
}
|
||||||
pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1);
|
pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1);
|
||||||
kfree(cip1);
|
kfree(cip1);
|
||||||
}
|
}
|
||||||
|
@ -675,8 +708,14 @@ static void class_dev_destroy(struct pvr2_sysfs *sfp)
|
||||||
pvr2_sysfs_tear_down_debugifc(sfp);
|
pvr2_sysfs_tear_down_debugifc(sfp);
|
||||||
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
||||||
pvr2_sysfs_tear_down_controls(sfp);
|
pvr2_sysfs_tear_down_controls(sfp);
|
||||||
class_device_remove_file(sfp->class_dev,&sfp->attr_v4l_minor_number);
|
if (sfp->v4l_minor_number_created_ok) {
|
||||||
class_device_remove_file(sfp->class_dev,&sfp->attr_unit_number);
|
class_device_remove_file(sfp->class_dev,
|
||||||
|
&sfp->attr_v4l_minor_number);
|
||||||
|
}
|
||||||
|
if (sfp->unit_number_created_ok) {
|
||||||
|
class_device_remove_file(sfp->class_dev,
|
||||||
|
&sfp->attr_unit_number);
|
||||||
|
}
|
||||||
pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev);
|
pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev);
|
||||||
sfp->class_dev->class_data = NULL;
|
sfp->class_dev->class_data = NULL;
|
||||||
class_device_unregister(sfp->class_dev);
|
class_device_unregister(sfp->class_dev);
|
||||||
|
@ -709,6 +748,8 @@ static void class_dev_create(struct pvr2_sysfs *sfp,
|
||||||
{
|
{
|
||||||
struct usb_device *usb_dev;
|
struct usb_device *usb_dev;
|
||||||
struct class_device *class_dev;
|
struct class_device *class_dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw);
|
usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw);
|
||||||
if (!usb_dev) return;
|
if (!usb_dev) return;
|
||||||
class_dev = kmalloc(sizeof(*class_dev),GFP_KERNEL);
|
class_dev = kmalloc(sizeof(*class_dev),GFP_KERNEL);
|
||||||
|
@ -733,20 +774,40 @@ static void class_dev_create(struct pvr2_sysfs *sfp,
|
||||||
|
|
||||||
sfp->class_dev = class_dev;
|
sfp->class_dev = class_dev;
|
||||||
class_dev->class_data = sfp;
|
class_dev->class_data = sfp;
|
||||||
class_device_register(class_dev);
|
ret = class_device_register(class_dev);
|
||||||
|
if (ret) {
|
||||||
|
printk(KERN_ERR "%s: class_device_register failed\n",
|
||||||
|
__FUNCTION__);
|
||||||
|
kfree(class_dev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
sfp->attr_v4l_minor_number.attr.owner = THIS_MODULE;
|
sfp->attr_v4l_minor_number.attr.owner = THIS_MODULE;
|
||||||
sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number";
|
sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number";
|
||||||
sfp->attr_v4l_minor_number.attr.mode = S_IRUGO;
|
sfp->attr_v4l_minor_number.attr.mode = S_IRUGO;
|
||||||
sfp->attr_v4l_minor_number.show = v4l_minor_number_show;
|
sfp->attr_v4l_minor_number.show = v4l_minor_number_show;
|
||||||
sfp->attr_v4l_minor_number.store = NULL;
|
sfp->attr_v4l_minor_number.store = NULL;
|
||||||
class_device_create_file(sfp->class_dev,&sfp->attr_v4l_minor_number);
|
ret = class_device_create_file(sfp->class_dev,
|
||||||
|
&sfp->attr_v4l_minor_number);
|
||||||
|
if (ret < 0) {
|
||||||
|
printk(KERN_WARNING "%s: class_device_create_file error: %d\n",
|
||||||
|
__FUNCTION__, ret);
|
||||||
|
} else {
|
||||||
|
sfp->v4l_minor_number_created_ok = !0;
|
||||||
|
}
|
||||||
|
|
||||||
sfp->attr_unit_number.attr.owner = THIS_MODULE;
|
sfp->attr_unit_number.attr.owner = THIS_MODULE;
|
||||||
sfp->attr_unit_number.attr.name = "unit_number";
|
sfp->attr_unit_number.attr.name = "unit_number";
|
||||||
sfp->attr_unit_number.attr.mode = S_IRUGO;
|
sfp->attr_unit_number.attr.mode = S_IRUGO;
|
||||||
sfp->attr_unit_number.show = unit_number_show;
|
sfp->attr_unit_number.show = unit_number_show;
|
||||||
sfp->attr_unit_number.store = NULL;
|
sfp->attr_unit_number.store = NULL;
|
||||||
class_device_create_file(sfp->class_dev,&sfp->attr_unit_number);
|
ret = class_device_create_file(sfp->class_dev,&sfp->attr_unit_number);
|
||||||
|
if (ret < 0) {
|
||||||
|
printk(KERN_WARNING "%s: class_device_create_file error: %d\n",
|
||||||
|
__FUNCTION__, ret);
|
||||||
|
} else {
|
||||||
|
sfp->unit_number_created_ok = !0;
|
||||||
|
}
|
||||||
|
|
||||||
pvr2_sysfs_add_controls(sfp);
|
pvr2_sysfs_add_controls(sfp);
|
||||||
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
||||||
|
|
|
@ -997,9 +997,9 @@ static int saa7134_alsa_init(void)
|
||||||
struct saa7134_dev *dev = NULL;
|
struct saa7134_dev *dev = NULL;
|
||||||
struct list_head *list;
|
struct list_head *list;
|
||||||
|
|
||||||
if (!dmasound_init && !dmasound_exit) {
|
if (!saa7134_dmasound_init && !saa7134_dmasound_exit) {
|
||||||
dmasound_init = alsa_device_init;
|
saa7134_dmasound_init = alsa_device_init;
|
||||||
dmasound_exit = alsa_device_exit;
|
saa7134_dmasound_exit = alsa_device_exit;
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n");
|
printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n");
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -1036,8 +1036,8 @@ static void saa7134_alsa_exit(void)
|
||||||
snd_card_free(snd_saa7134_cards[idx]);
|
snd_card_free(snd_saa7134_cards[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
dmasound_init = NULL;
|
saa7134_dmasound_init = NULL;
|
||||||
dmasound_exit = NULL;
|
saa7134_dmasound_exit = NULL;
|
||||||
printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
|
printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -95,8 +95,8 @@ LIST_HEAD(saa7134_devlist);
|
||||||
static LIST_HEAD(mops_list);
|
static LIST_HEAD(mops_list);
|
||||||
static unsigned int saa7134_devcount;
|
static unsigned int saa7134_devcount;
|
||||||
|
|
||||||
int (*dmasound_init)(struct saa7134_dev *dev);
|
int (*saa7134_dmasound_init)(struct saa7134_dev *dev);
|
||||||
int (*dmasound_exit)(struct saa7134_dev *dev);
|
int (*saa7134_dmasound_exit)(struct saa7134_dev *dev);
|
||||||
|
|
||||||
#define dprintk(fmt, arg...) if (core_debug) \
|
#define dprintk(fmt, arg...) if (core_debug) \
|
||||||
printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg)
|
printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg)
|
||||||
|
@ -1008,8 +1008,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
|
||||||
/* check for signal */
|
/* check for signal */
|
||||||
saa7134_irq_video_intl(dev);
|
saa7134_irq_video_intl(dev);
|
||||||
|
|
||||||
if (dmasound_init && !dev->dmasound.priv_data) {
|
if (saa7134_dmasound_init && !dev->dmasound.priv_data) {
|
||||||
dmasound_init(dev);
|
saa7134_dmasound_init(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1036,8 +1036,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
|
||||||
struct saa7134_mpeg_ops *mops;
|
struct saa7134_mpeg_ops *mops;
|
||||||
|
|
||||||
/* Release DMA sound modules if present */
|
/* Release DMA sound modules if present */
|
||||||
if (dmasound_exit && dev->dmasound.priv_data) {
|
if (saa7134_dmasound_exit && dev->dmasound.priv_data) {
|
||||||
dmasound_exit(dev);
|
saa7134_dmasound_exit(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* debugging ... */
|
/* debugging ... */
|
||||||
|
@ -1169,8 +1169,8 @@ EXPORT_SYMBOL(saa7134_boards);
|
||||||
|
|
||||||
/* ----------------- for the DMA sound modules --------------- */
|
/* ----------------- for the DMA sound modules --------------- */
|
||||||
|
|
||||||
EXPORT_SYMBOL(dmasound_init);
|
EXPORT_SYMBOL(saa7134_dmasound_init);
|
||||||
EXPORT_SYMBOL(dmasound_exit);
|
EXPORT_SYMBOL(saa7134_dmasound_exit);
|
||||||
EXPORT_SYMBOL(saa7134_pgtable_free);
|
EXPORT_SYMBOL(saa7134_pgtable_free);
|
||||||
EXPORT_SYMBOL(saa7134_pgtable_build);
|
EXPORT_SYMBOL(saa7134_pgtable_build);
|
||||||
EXPORT_SYMBOL(saa7134_pgtable_alloc);
|
EXPORT_SYMBOL(saa7134_pgtable_alloc);
|
||||||
|
|
|
@ -993,9 +993,9 @@ static int saa7134_oss_init(void)
|
||||||
struct saa7134_dev *dev = NULL;
|
struct saa7134_dev *dev = NULL;
|
||||||
struct list_head *list;
|
struct list_head *list;
|
||||||
|
|
||||||
if (!dmasound_init && !dmasound_exit) {
|
if (!saa7134_dmasound_init && !saa7134_dmasound_exit) {
|
||||||
dmasound_init = oss_device_init;
|
saa7134_dmasound_init = oss_device_init;
|
||||||
dmasound_exit = oss_device_exit;
|
saa7134_dmasound_exit = oss_device_exit;
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n");
|
printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n");
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -1037,8 +1037,8 @@ static void saa7134_oss_exit(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dmasound_init = NULL;
|
saa7134_dmasound_init = NULL;
|
||||||
dmasound_exit = NULL;
|
saa7134_dmasound_exit = NULL;
|
||||||
|
|
||||||
printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");
|
printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
static unsigned int video_debug = 0;
|
static unsigned int video_debug = 0;
|
||||||
static unsigned int gbuffers = 8;
|
static unsigned int gbuffers = 8;
|
||||||
static unsigned int noninterlaced = 0;
|
static unsigned int noninterlaced = 1;
|
||||||
static unsigned int gbufsize = 720*576*4;
|
static unsigned int gbufsize = 720*576*4;
|
||||||
static unsigned int gbufsize_max = 720*576*4;
|
static unsigned int gbufsize_max = 720*576*4;
|
||||||
module_param(video_debug, int, 0644);
|
module_param(video_debug, int, 0644);
|
||||||
|
@ -48,7 +48,7 @@ MODULE_PARM_DESC(video_debug,"enable debug messages [video]");
|
||||||
module_param(gbuffers, int, 0444);
|
module_param(gbuffers, int, 0444);
|
||||||
MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32");
|
MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32");
|
||||||
module_param(noninterlaced, int, 0644);
|
module_param(noninterlaced, int, 0644);
|
||||||
MODULE_PARM_DESC(noninterlaced,"video input is noninterlaced");
|
MODULE_PARM_DESC(noninterlaced,"capture non interlaced video");
|
||||||
|
|
||||||
#define dprintk(fmt, arg...) if (video_debug) \
|
#define dprintk(fmt, arg...) if (video_debug) \
|
||||||
printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg)
|
printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg)
|
||||||
|
@ -2087,7 +2087,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
|
||||||
struct v4l2_format *f = arg;
|
struct v4l2_format *f = arg;
|
||||||
return saa7134_try_fmt(dev,fh,f);
|
return saa7134_try_fmt(dev,fh,f);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
case VIDIOCGMBUF:
|
case VIDIOCGMBUF:
|
||||||
{
|
{
|
||||||
struct video_mbuf *mbuf = arg;
|
struct video_mbuf *mbuf = arg;
|
||||||
|
|
|
@ -586,8 +586,8 @@ void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf);
|
||||||
|
|
||||||
int saa7134_set_dmabits(struct saa7134_dev *dev);
|
int saa7134_set_dmabits(struct saa7134_dev *dev);
|
||||||
|
|
||||||
extern int (*dmasound_init)(struct saa7134_dev *dev);
|
extern int (*saa7134_dmasound_init)(struct saa7134_dev *dev);
|
||||||
extern int (*dmasound_exit)(struct saa7134_dev *dev);
|
extern int (*saa7134_dmasound_exit)(struct saa7134_dev *dev);
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------- */
|
/* ----------------------------------------------------------- */
|
||||||
|
|
|
@ -2181,7 +2181,6 @@ static struct pci_device_id stradis_pci_tbl[] = {
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(pci, stradis_pci_tbl);
|
|
||||||
|
|
||||||
static struct pci_driver stradis_driver = {
|
static struct pci_driver stradis_driver = {
|
||||||
.name = "stradis",
|
.name = "stradis",
|
||||||
|
|
|
@ -196,14 +196,6 @@ static void set_type(struct i2c_client *c, unsigned int type,
|
||||||
i2c_master_send(c, buffer, 4);
|
i2c_master_send(c, buffer, 4);
|
||||||
default_tuner_init(c);
|
default_tuner_init(c);
|
||||||
break;
|
break;
|
||||||
case TUNER_LG_TDVS_H06XF:
|
|
||||||
/* Set the Auxiliary Byte. */
|
|
||||||
buffer[2] &= ~0x20;
|
|
||||||
buffer[2] |= 0x18;
|
|
||||||
buffer[3] = 0x20;
|
|
||||||
i2c_master_send(c, buffer, 4);
|
|
||||||
default_tuner_init(c);
|
|
||||||
break;
|
|
||||||
case TUNER_PHILIPS_TD1316:
|
case TUNER_PHILIPS_TD1316:
|
||||||
buffer[0] = 0x0b;
|
buffer[0] = 0x0b;
|
||||||
buffer[1] = 0xdc;
|
buffer[1] = 0xdc;
|
||||||
|
@ -598,6 +590,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
if (t->standby)
|
if (t->standby)
|
||||||
t->standby (client);
|
t->standby (client);
|
||||||
break;
|
break;
|
||||||
|
#ifdef CONFIG_VIDEO_V4L1
|
||||||
case VIDIOCSAUDIO:
|
case VIDIOCSAUDIO:
|
||||||
if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
|
if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -607,17 +600,6 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
/* Should be implemented, since bttv calls it */
|
/* Should be implemented, since bttv calls it */
|
||||||
tuner_dbg("VIDIOCSAUDIO not implemented.\n");
|
tuner_dbg("VIDIOCSAUDIO not implemented.\n");
|
||||||
break;
|
break;
|
||||||
case TDA9887_SET_CONFIG:
|
|
||||||
if (t->type == TUNER_TDA9887) {
|
|
||||||
int *i = arg;
|
|
||||||
|
|
||||||
t->tda9887_config = *i;
|
|
||||||
set_freq(client, t->tv_freq);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* --- v4l ioctls --- */
|
|
||||||
/* take care: bttv does userspace copying, we'll get a
|
|
||||||
kernel pointer here... */
|
|
||||||
case VIDIOCSCHAN:
|
case VIDIOCSCHAN:
|
||||||
{
|
{
|
||||||
static const v4l2_std_id map[] = {
|
static const v4l2_std_id map[] = {
|
||||||
|
@ -701,7 +683,18 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
|
? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
case TDA9887_SET_CONFIG:
|
||||||
|
if (t->type == TUNER_TDA9887) {
|
||||||
|
int *i = arg;
|
||||||
|
|
||||||
|
t->tda9887_config = *i;
|
||||||
|
set_freq(client, t->tv_freq);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
/* --- v4l ioctls --- */
|
||||||
|
/* take care: bttv does userspace copying, we'll get a
|
||||||
|
kernel pointer here... */
|
||||||
case VIDIOC_S_STD:
|
case VIDIOC_S_STD:
|
||||||
{
|
{
|
||||||
v4l2_std_id *id = arg;
|
v4l2_std_id *id = arg;
|
||||||
|
|
|
@ -339,7 +339,20 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
|
||||||
if (4 != (rc = i2c_master_send(c,buffer,4)))
|
if (4 != (rc = i2c_master_send(c,buffer,4)))
|
||||||
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
|
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
|
||||||
|
|
||||||
if (t->type == TUNER_MICROTUNE_4042FI5) {
|
switch (t->type) {
|
||||||
|
case TUNER_LG_TDVS_H06XF:
|
||||||
|
/* Set the Auxiliary Byte. */
|
||||||
|
buffer[0] = buffer[2];
|
||||||
|
buffer[0] &= ~0x20;
|
||||||
|
buffer[0] |= 0x18;
|
||||||
|
buffer[1] = 0x20;
|
||||||
|
tuner_dbg("tv 0x%02x 0x%02x\n",buffer[0],buffer[1]);
|
||||||
|
|
||||||
|
if (2 != (rc = i2c_master_send(c,buffer,2)))
|
||||||
|
tuner_warn("i2c i/o error: rc == %d (should be 2)\n",rc);
|
||||||
|
break;
|
||||||
|
case TUNER_MICROTUNE_4042FI5:
|
||||||
|
{
|
||||||
// FIXME - this may also work for other tuners
|
// FIXME - this may also work for other tuners
|
||||||
unsigned long timeout = jiffies + msecs_to_jiffies(1);
|
unsigned long timeout = jiffies + msecs_to_jiffies(1);
|
||||||
u8 status_byte = 0;
|
u8 status_byte = 0;
|
||||||
|
@ -364,10 +377,12 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
|
||||||
buffer[2] = config;
|
buffer[2] = config;
|
||||||
buffer[3] = cb;
|
buffer[3] = cb;
|
||||||
tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
|
tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
|
||||||
buffer[0],buffer[1],buffer[2],buffer[3]);
|
buffer[0],buffer[1],buffer[2],buffer[3]);
|
||||||
|
|
||||||
if (4 != (rc = i2c_master_send(c,buffer,4)))
|
if (4 != (rc = i2c_master_send(c,buffer,4)))
|
||||||
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
|
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ config VIDEO_USBVIDEO
|
||||||
|
|
||||||
config USB_VICAM
|
config USB_VICAM
|
||||||
tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)"
|
tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)"
|
||||||
depends on USB && VIDEO_V4L1 && EXPERIMENTAL
|
depends on USB && VIDEO_DEV && VIDEO_V4L1 && EXPERIMENTAL
|
||||||
select VIDEO_USBVIDEO
|
select VIDEO_USBVIDEO
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you have 3com homeconnect camera (vicam).
|
Say Y here if you have 3com homeconnect camera (vicam).
|
||||||
|
@ -13,7 +13,7 @@ config USB_VICAM
|
||||||
|
|
||||||
config USB_IBMCAM
|
config USB_IBMCAM
|
||||||
tristate "USB IBM (Xirlink) C-it Camera support"
|
tristate "USB IBM (Xirlink) C-it Camera support"
|
||||||
depends on USB && VIDEO_V4L1
|
depends on USB && VIDEO_DEV && VIDEO_V4L1
|
||||||
select VIDEO_USBVIDEO
|
select VIDEO_USBVIDEO
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you want to connect a IBM "C-It" camera, also known as
|
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
|
config USB_KONICAWC
|
||||||
tristate "USB Konica Webcam support"
|
tristate "USB Konica Webcam support"
|
||||||
depends on USB && VIDEO_V4L1
|
depends on USB && VIDEO_DEV && VIDEO_V4L1
|
||||||
select VIDEO_USBVIDEO
|
select VIDEO_USBVIDEO
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you want support for webcams based on a Konica
|
Say Y here if you want support for webcams based on a Konica
|
||||||
|
@ -39,7 +39,7 @@ config USB_KONICAWC
|
||||||
|
|
||||||
config USB_QUICKCAM_MESSENGER
|
config USB_QUICKCAM_MESSENGER
|
||||||
tristate "USB Logitech Quickcam Messenger"
|
tristate "USB Logitech Quickcam Messenger"
|
||||||
depends on USB && VIDEO_DEV
|
depends on USB && VIDEO_DEV && VIDEO_V4L1
|
||||||
select VIDEO_USBVIDEO
|
select VIDEO_USBVIDEO
|
||||||
---help---
|
---help---
|
||||||
Say Y or M here to enable support for the USB Logitech Quickcam
|
Say Y or M here to enable support for the USB Logitech Quickcam
|
||||||
|
|
|
@ -202,7 +202,7 @@ static char *v4l2_memory_names[] = {
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
/* debug help functions */
|
/* debug help functions */
|
||||||
|
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
static const char *v4l1_ioctls[] = {
|
static const char *v4l1_ioctls[] = {
|
||||||
[_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
|
[_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
|
||||||
[_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
|
[_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
|
||||||
|
@ -301,7 +301,7 @@ static const char *v4l2_ioctls[] = {
|
||||||
#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
|
#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
|
||||||
|
|
||||||
static const char *v4l2_int_ioctls[] = {
|
static const char *v4l2_int_ioctls[] = {
|
||||||
#ifdef HAVE_VIDEO_DECODER
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
[_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES",
|
[_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES",
|
||||||
[_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
|
[_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
|
||||||
[_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM",
|
[_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM",
|
||||||
|
@ -367,7 +367,7 @@ void v4l_printk_ioctl(unsigned int cmd)
|
||||||
(_IOC_NR(cmd) < V4L2_INT_IOCTLS) ?
|
(_IOC_NR(cmd) < V4L2_INT_IOCTLS) ?
|
||||||
v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
|
v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
case 'v':
|
case 'v':
|
||||||
printk("v4l1 ioctl %s, dir=%s (0x%08x)\n",
|
printk("v4l1 ioctl %s, dir=%s (0x%08x)\n",
|
||||||
(_IOC_NR(cmd) < V4L1_IOCTLS) ?
|
(_IOC_NR(cmd) < V4L1_IOCTLS) ?
|
||||||
|
@ -414,6 +414,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
||||||
printk ("%s: tuner type=%d\n", s, *p);
|
printk ("%s: tuner type=%d\n", s, *p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||||
case DECODER_SET_VBI_BYPASS:
|
case DECODER_SET_VBI_BYPASS:
|
||||||
case DECODER_ENABLE_OUTPUT:
|
case DECODER_ENABLE_OUTPUT:
|
||||||
case DECODER_GET_STATUS:
|
case DECODER_GET_STATUS:
|
||||||
|
@ -424,6 +425,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
||||||
case VIDIOCCAPTURE:
|
case VIDIOCCAPTURE:
|
||||||
case VIDIOCSYNC:
|
case VIDIOCSYNC:
|
||||||
case VIDIOCSWRITEMODE:
|
case VIDIOCSWRITEMODE:
|
||||||
|
#endif
|
||||||
case TUNER_SET_TYPE_ADDR:
|
case TUNER_SET_TYPE_ADDR:
|
||||||
case TUNER_SET_STANDBY:
|
case TUNER_SET_STANDBY:
|
||||||
case TDA9887_SET_CONFIG:
|
case TDA9887_SET_CONFIG:
|
||||||
|
@ -755,6 +757,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
||||||
p->afc);
|
p->afc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||||
case VIDIOCGVBIFMT:
|
case VIDIOCGVBIFMT:
|
||||||
case VIDIOCSVBIFMT:
|
case VIDIOCSVBIFMT:
|
||||||
{
|
{
|
||||||
|
@ -924,6 +927,14 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
||||||
p->clipcount);
|
p->clipcount);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case VIDIOCGFREQ:
|
||||||
|
case VIDIOCSFREQ:
|
||||||
|
{
|
||||||
|
unsigned long *p=arg;
|
||||||
|
printk ("%s: value=%lu\n", s, *p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
case VIDIOC_INT_AUDIO_CLOCK_FREQ:
|
case VIDIOC_INT_AUDIO_CLOCK_FREQ:
|
||||||
case VIDIOC_INT_I2S_CLOCK_FREQ:
|
case VIDIOC_INT_I2S_CLOCK_FREQ:
|
||||||
case VIDIOC_INT_S_STANDBY:
|
case VIDIOC_INT_S_STANDBY:
|
||||||
|
@ -933,13 +944,6 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
||||||
printk ("%s: value=%d\n", s, *p);
|
printk ("%s: value=%d\n", s, *p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case VIDIOCGFREQ:
|
|
||||||
case VIDIOCSFREQ:
|
|
||||||
{
|
|
||||||
unsigned long *p=arg;
|
|
||||||
printk ("%s: value=%lu\n", s, *p);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case VIDIOC_G_STD:
|
case VIDIOC_G_STD:
|
||||||
case VIDIOC_S_STD:
|
case VIDIOC_S_STD:
|
||||||
case VIDIOC_QUERYSTD:
|
case VIDIOC_QUERYSTD:
|
||||||
|
|
|
@ -760,7 +760,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
|
||||||
ret=vfd->vidioc_overlay(file, fh, *i);
|
ret=vfd->vidioc_overlay(file, fh, *i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
/* --- streaming capture ------------------------------------- */
|
/* --- streaming capture ------------------------------------- */
|
||||||
case VIDIOCGMBUF:
|
case VIDIOCGMBUF:
|
||||||
{
|
{
|
||||||
|
@ -1512,6 +1512,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
||||||
int i=0;
|
int i=0;
|
||||||
int base;
|
int base;
|
||||||
int end;
|
int end;
|
||||||
|
int ret;
|
||||||
char *name_base;
|
char *name_base;
|
||||||
|
|
||||||
switch(type)
|
switch(type)
|
||||||
|
@ -1537,6 +1538,8 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
||||||
name_base = "radio";
|
name_base = "radio";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
printk(KERN_ERR "%s called with unknown type: %d\n",
|
||||||
|
__FUNCTION__, type);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1571,9 +1574,18 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
||||||
vfd->class_dev.class = &video_class;
|
vfd->class_dev.class = &video_class;
|
||||||
vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor);
|
vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor);
|
||||||
sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base);
|
sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base);
|
||||||
class_device_register(&vfd->class_dev);
|
ret = class_device_register(&vfd->class_dev);
|
||||||
class_device_create_file(&vfd->class_dev,
|
if (ret < 0) {
|
||||||
&class_device_attr_name);
|
printk(KERN_ERR "%s: class_device_register failed\n",
|
||||||
|
__FUNCTION__);
|
||||||
|
goto fail_minor;
|
||||||
|
}
|
||||||
|
ret = class_device_create_file(&vfd->class_dev, &class_device_attr_name);
|
||||||
|
if (ret < 0) {
|
||||||
|
printk(KERN_ERR "%s: class_device_create_file 'name' failed\n",
|
||||||
|
__FUNCTION__);
|
||||||
|
goto fail_classdev;
|
||||||
|
}
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
/* needed until all drivers are fixed */
|
/* needed until all drivers are fixed */
|
||||||
|
@ -1583,6 +1595,15 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
||||||
"http://lwn.net/Articles/36850/\n", vfd->name);
|
"http://lwn.net/Articles/36850/\n", vfd->name);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail_classdev:
|
||||||
|
class_device_unregister(&vfd->class_dev);
|
||||||
|
fail_minor:
|
||||||
|
mutex_lock(&videodev_lock);
|
||||||
|
video_device[vfd->minor] = NULL;
|
||||||
|
vfd->minor = -1;
|
||||||
|
mutex_unlock(&videodev_lock);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -986,7 +986,7 @@ static int vidioc_dqbuf (struct file *file, void *priv, struct v4l2_buffer *p)
|
||||||
file->f_flags & O_NONBLOCK));
|
file->f_flags & O_NONBLOCK));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf)
|
static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf)
|
||||||
{
|
{
|
||||||
struct vivi_fh *fh=priv;
|
struct vivi_fh *fh=priv;
|
||||||
|
@ -1328,7 +1328,7 @@ static struct video_device vivi = {
|
||||||
.vidioc_s_ctrl = vidioc_s_ctrl,
|
.vidioc_s_ctrl = vidioc_s_ctrl,
|
||||||
.vidioc_streamon = vidioc_streamon,
|
.vidioc_streamon = vidioc_streamon,
|
||||||
.vidioc_streamoff = vidioc_streamoff,
|
.vidioc_streamoff = vidioc_streamoff,
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
.vidiocgmbuf = vidiocgmbuf,
|
.vidiocgmbuf = vidiocgmbuf,
|
||||||
#endif
|
#endif
|
||||||
.tvnorms = tvnorms,
|
.tvnorms = tvnorms,
|
||||||
|
|
|
@ -29,7 +29,7 @@ config ATALK
|
||||||
even politically correct people are allowed to say Y here.
|
even politically correct people are allowed to say Y here.
|
||||||
|
|
||||||
config DEV_APPLETALK
|
config DEV_APPLETALK
|
||||||
bool "Appletalk interfaces support"
|
tristate "Appletalk interfaces support"
|
||||||
depends on ATALK
|
depends on ATALK
|
||||||
help
|
help
|
||||||
AppleTalk is the protocol that Apple computers can use to communicate
|
AppleTalk is the protocol that Apple computers can use to communicate
|
||||||
|
|
|
@ -3127,7 +3127,7 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: dev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
|
/* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
|
||||||
* means we reserve 2 more, this pushes us to allocate from the next
|
* means we reserve 2 more, this pushes us to allocate from the next
|
||||||
* larger slab size
|
* larger slab size
|
||||||
* i.e. RXBUFFER_2048 --> size-4096 slab */
|
* i.e. RXBUFFER_2048 --> size-4096 slab */
|
||||||
|
@ -3708,7 +3708,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
|
||||||
#define E1000_CB_LENGTH 256
|
#define E1000_CB_LENGTH 256
|
||||||
if (length < E1000_CB_LENGTH) {
|
if (length < E1000_CB_LENGTH) {
|
||||||
struct sk_buff *new_skb =
|
struct sk_buff *new_skb =
|
||||||
dev_alloc_skb(length + NET_IP_ALIGN);
|
netdev_alloc_skb(netdev, length + NET_IP_ALIGN);
|
||||||
if (new_skb) {
|
if (new_skb) {
|
||||||
skb_reserve(new_skb, NET_IP_ALIGN);
|
skb_reserve(new_skb, NET_IP_ALIGN);
|
||||||
new_skb->dev = netdev;
|
new_skb->dev = netdev;
|
||||||
|
@ -3979,7 +3979,7 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
|
||||||
|
|
||||||
while (cleaned_count--) {
|
while (cleaned_count--) {
|
||||||
if (!(skb = buffer_info->skb))
|
if (!(skb = buffer_info->skb))
|
||||||
skb = dev_alloc_skb(bufsz);
|
skb = netdev_alloc_skb(netdev, bufsz);
|
||||||
else {
|
else {
|
||||||
skb_trim(skb, 0);
|
skb_trim(skb, 0);
|
||||||
goto map_skb;
|
goto map_skb;
|
||||||
|
@ -3997,7 +3997,7 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
|
||||||
DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes "
|
DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes "
|
||||||
"at %p\n", bufsz, skb->data);
|
"at %p\n", bufsz, skb->data);
|
||||||
/* Try again, without freeing the previous */
|
/* Try again, without freeing the previous */
|
||||||
skb = dev_alloc_skb(bufsz);
|
skb = netdev_alloc_skb(netdev, bufsz);
|
||||||
/* Failed allocation, critical failure */
|
/* Failed allocation, critical failure */
|
||||||
if (!skb) {
|
if (!skb) {
|
||||||
dev_kfree_skb(oldskb);
|
dev_kfree_skb(oldskb);
|
||||||
|
@ -4121,7 +4121,8 @@ e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
||||||
rx_desc->read.buffer_addr[j+1] = ~0;
|
rx_desc->read.buffer_addr[j+1] = ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
skb = dev_alloc_skb(adapter->rx_ps_bsize0 + NET_IP_ALIGN);
|
skb = netdev_alloc_skb(netdev,
|
||||||
|
adapter->rx_ps_bsize0 + NET_IP_ALIGN);
|
||||||
|
|
||||||
if (unlikely(!skb)) {
|
if (unlikely(!skb)) {
|
||||||
adapter->alloc_rx_buff_failed++;
|
adapter->alloc_rx_buff_failed++;
|
||||||
|
|
|
@ -177,6 +177,7 @@ struct myri10ge_priv {
|
||||||
struct work_struct watchdog_work;
|
struct work_struct watchdog_work;
|
||||||
struct timer_list watchdog_timer;
|
struct timer_list watchdog_timer;
|
||||||
int watchdog_tx_done;
|
int watchdog_tx_done;
|
||||||
|
int watchdog_tx_req;
|
||||||
int watchdog_resets;
|
int watchdog_resets;
|
||||||
int tx_linearized;
|
int tx_linearized;
|
||||||
int pause;
|
int pause;
|
||||||
|
@ -448,6 +449,7 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size)
|
||||||
struct mcp_gen_header *hdr;
|
struct mcp_gen_header *hdr;
|
||||||
size_t hdr_offset;
|
size_t hdr_offset;
|
||||||
int status;
|
int status;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) {
|
if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) {
|
||||||
dev_err(dev, "Unable to load %s firmware image via hotplug\n",
|
dev_err(dev, "Unable to load %s firmware image via hotplug\n",
|
||||||
|
@ -479,18 +481,12 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size)
|
||||||
goto abort_with_fw;
|
goto abort_with_fw;
|
||||||
|
|
||||||
crc = crc32(~0, fw->data, fw->size);
|
crc = crc32(~0, fw->data, fw->size);
|
||||||
if (mgp->tx.boundary == 2048) {
|
for (i = 0; i < fw->size; i += 256) {
|
||||||
/* Avoid PCI burst on chipset with unaligned completions. */
|
myri10ge_pio_copy(mgp->sram + MYRI10GE_FW_OFFSET + i,
|
||||||
int i;
|
fw->data + i,
|
||||||
__iomem u32 *ptr = (__iomem u32 *) (mgp->sram +
|
min(256U, (unsigned)(fw->size - i)));
|
||||||
MYRI10GE_FW_OFFSET);
|
mb();
|
||||||
for (i = 0; i < fw->size / 4; i++) {
|
readb(mgp->sram);
|
||||||
__raw_writel(((u32 *) fw->data)[i], ptr + i);
|
|
||||||
wmb();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
myri10ge_pio_copy(mgp->sram + MYRI10GE_FW_OFFSET, fw->data,
|
|
||||||
fw->size);
|
|
||||||
}
|
}
|
||||||
/* corruption checking is good for parity recovery and buggy chipset */
|
/* corruption checking is good for parity recovery and buggy chipset */
|
||||||
memcpy_fromio(fw->data, mgp->sram + MYRI10GE_FW_OFFSET, fw->size);
|
memcpy_fromio(fw->data, mgp->sram + MYRI10GE_FW_OFFSET, fw->size);
|
||||||
|
@ -2547,7 +2543,8 @@ static void myri10ge_watchdog_timer(unsigned long arg)
|
||||||
|
|
||||||
mgp = (struct myri10ge_priv *)arg;
|
mgp = (struct myri10ge_priv *)arg;
|
||||||
if (mgp->tx.req != mgp->tx.done &&
|
if (mgp->tx.req != mgp->tx.done &&
|
||||||
mgp->tx.done == mgp->watchdog_tx_done)
|
mgp->tx.done == mgp->watchdog_tx_done &&
|
||||||
|
mgp->watchdog_tx_req != mgp->watchdog_tx_done)
|
||||||
/* nic seems like it might be stuck.. */
|
/* nic seems like it might be stuck.. */
|
||||||
schedule_work(&mgp->watchdog_work);
|
schedule_work(&mgp->watchdog_work);
|
||||||
else
|
else
|
||||||
|
@ -2556,6 +2553,7 @@ static void myri10ge_watchdog_timer(unsigned long arg)
|
||||||
jiffies + myri10ge_watchdog_timeout * HZ);
|
jiffies + myri10ge_watchdog_timeout * HZ);
|
||||||
|
|
||||||
mgp->watchdog_tx_done = mgp->tx.done;
|
mgp->watchdog_tx_done = mgp->tx.done;
|
||||||
|
mgp->watchdog_tx_req = mgp->tx.req;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
|
|
|
@ -419,9 +419,8 @@ void phy_start_machine(struct phy_device *phydev,
|
||||||
|
|
||||||
/* phy_stop_machine
|
/* phy_stop_machine
|
||||||
*
|
*
|
||||||
* description: Stops the state machine timer, sets the state to
|
* description: Stops the state machine timer, sets the state to UP
|
||||||
* UP (unless it wasn't up yet), and then frees the interrupt,
|
* (unless it wasn't up yet). This function must be called BEFORE
|
||||||
* if it is in use. This function must be called BEFORE
|
|
||||||
* phy_detach.
|
* phy_detach.
|
||||||
*/
|
*/
|
||||||
void phy_stop_machine(struct phy_device *phydev)
|
void phy_stop_machine(struct phy_device *phydev)
|
||||||
|
@ -433,9 +432,6 @@ void phy_stop_machine(struct phy_device *phydev)
|
||||||
phydev->state = PHY_UP;
|
phydev->state = PHY_UP;
|
||||||
spin_unlock(&phydev->lock);
|
spin_unlock(&phydev->lock);
|
||||||
|
|
||||||
if (phydev->irq != PHY_POLL)
|
|
||||||
phy_stop_interrupts(phydev);
|
|
||||||
|
|
||||||
phydev->adjust_state = NULL;
|
phydev->adjust_state = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue