Commit d4a307d4 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/davem/sparc-2.5

into home.osdl.org:/home/torvalds/v2.5/linux
parents a167fa85 0182a438
...@@ -1118,54 +1118,10 @@ source "fs/Kconfig.binfmt" ...@@ -1118,54 +1118,10 @@ source "fs/Kconfig.binfmt"
endmenu endmenu
source "drivers/base/Kconfig" source "drivers/Kconfig"
source "drivers/mtd/Kconfig"
source "drivers/parport/Kconfig"
source "drivers/pnp/Kconfig"
source "drivers/block/Kconfig"
source "drivers/ide/Kconfig"
source "drivers/scsi/Kconfig"
source "drivers/cdrom/Kconfig"
source "drivers/md/Kconfig"
source "drivers/message/fusion/Kconfig"
source "drivers/ieee1394/Kconfig"
source "drivers/message/i2o/Kconfig"
source "net/Kconfig"
source "drivers/isdn/Kconfig"
source "drivers/telephony/Kconfig"
#
# input before char - char/joystick depends on it. As does USB.
#
source "drivers/input/Kconfig"
source "drivers/char/Kconfig"
#source drivers/misc/Config.in
source "drivers/media/Kconfig"
source "fs/Kconfig" source "fs/Kconfig"
source "drivers/video/Kconfig"
source "sound/Kconfig"
source "drivers/usb/Kconfig"
source "arch/i386/oprofile/Kconfig" source "arch/i386/oprofile/Kconfig"
......
...@@ -326,40 +326,30 @@ source "drivers/usb/Kconfig" ...@@ -326,40 +326,30 @@ source "drivers/usb/Kconfig"
menu "Kernel hacking" menu "Kernel hacking"
config FULLDEBUG config DEBUG_KERNEL
bool "Full Symbolic/Source Debugging support" bool "Kernel debugging"
config DEBUG_INFO
bool "Compile the kernel with debug info"
depends on DEBUG_KERNEL
help help
Enable debuging symbols on kernel build. If you say Y here the resulting kernel image will include
debugging info resulting in a larger kernel image.
Say Y here only if you plan to use gdb to debug the kernel.
If you don't debug the kernel, you can say N.
config MAGIC_SYSRQ config MAGIC_SYSRQ
bool "Magic SysRq key" bool "Magic SysRq key"
depends on DEBUG_KERNEL
help help
Enables console device to interprent special characters as Enables console device to interprent special characters as
commands to dump state information. commands to dump state information.
config HIGHPROFILE
bool "Use fast second timer for profiling"
help
Use a fast secondary clock to produce profiling information.
config DUMPTOFLASH
bool "Panic/Dump to FLASH"
depends on COLDFIRE
help
Dump any panic of trap output into a flash memory segment
for later analysis.
config NO_KERNEL_MSG config NO_KERNEL_MSG
bool "Suppress Kernel BUG Messages" bool "Suppress Kernel BUG Messages"
help help
Do not output any debug BUG messages within the kernel. Do not output any debug BUG messages within the kernel.
config BDM_DISABLE
bool "Disable BDM signals"
depends on (EXPERIMENTAL && COLDFIRE)
help
Disable the CPU's BDM signals.
endmenu endmenu
source "security/Kconfig" source "security/Kconfig"
......
...@@ -6,9 +6,9 @@ MEMORY { ...@@ -6,9 +6,9 @@ MEMORY {
ROM : ORIGIN = 0, LENGTH = 0x00800000 ROM : ORIGIN = 0, LENGTH = 0x00800000
/* 1MB of static RAM. This memory is mirrored 64 times. */ /* 1MB of static RAM. This memory is mirrored 64 times. */
SRAM : ORIGIN = 0x04000000, LENGTH = 0x00100000 SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE
/* 64MB of DRAM. */ /* 64MB of DRAM. */
SDRAM : ORIGIN = 0x08000000, LENGTH = 0x04000000 SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE
} }
SECTIONS { SECTIONS {
......
...@@ -8,9 +8,9 @@ MEMORY { ...@@ -8,9 +8,9 @@ MEMORY {
iMEM1 : ORIGIN = 0x00040000, LENGTH = 0x00040000 iMEM1 : ORIGIN = 0x00040000, LENGTH = 0x00040000
/* 1MB of static RAM. This memory is mirrored 64 times. */ /* 1MB of static RAM. This memory is mirrored 64 times. */
SRAM : ORIGIN = 0x04000000, LENGTH = 0x00100000 SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE
/* 64MB of DRAM. */ /* 64MB of DRAM. */
SDRAM : ORIGIN = 0x08000000, LENGTH = 0x04000000 SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE
} }
SECTIONS { SECTIONS {
......
...@@ -6,14 +6,14 @@ MEMORY { ...@@ -6,14 +6,14 @@ MEMORY {
ROM : ORIGIN = 0, LENGTH = 0x00400000 ROM : ORIGIN = 0, LENGTH = 0x00400000
/* 1MB of static RAM. */ /* 1MB of static RAM. */
SRAM : ORIGIN = 0x00400000, LENGTH = 0x00100000 SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE
/* About 58MB of DRAM. This can actually be at one of two /* About 58MB of DRAM. This can actually be at one of two
positions, determined by jumper JP3; we have to use the first positions, determined by jumper JP3; we have to use the first
position because the second is partially out of processor position because the second is partially out of processor
instruction addressing range (though in the second position instruction addressing range (though in the second position
there's actually 64MB available). */ there's actually 64MB available). */
SDRAM : ORIGIN = 0x00600000, LENGTH = 0x039F8000 SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE
} }
SECTIONS { SECTIONS {
......
...@@ -2,18 +2,18 @@ ...@@ -2,18 +2,18 @@
(CONFIG_V850E_AS85EP1). */ (CONFIG_V850E_AS85EP1). */
MEMORY { MEMORY {
/* 1MB of internal memory ($BFbB"L?Na(BRAM). */ /* 1MB of internal memory (Æâ¢̿ÎáRAM). */
iMEM0 : ORIGIN = 0, LENGTH = 0x00100000 iMEM0 : ORIGIN = 0, LENGTH = 0x00100000
/* 1MB of static RAM. */ /* 1MB of static RAM. */
SRAM : ORIGIN = 0x00400000, LENGTH = 0x00100000 SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE
/* About 58MB of DRAM. This can actually be at one of two /* About 58MB of DRAM. This can actually be at one of two
positions, determined by jump JP3; we have to use the first positions, determined by jump JP3; we have to use the first
position because the second is partially out of processor position because the second is partially out of processor
instruction addressing range (though in the second position instruction addressing range (though in the second position
there's actually 64MB available). */ there's actually 64MB available). */
SDRAM : ORIGIN = 0x00600000, LENGTH = 0x039F8000 SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE
} }
SECTIONS { SECTIONS {
......
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
MEMORY { MEMORY {
ROM : ORIGIN = 0x00000000, LENGTH = 0x00100000 ROM : ORIGIN = 0x00000000, LENGTH = 0x00100000
/* 1MB of SRAM. This memory is mirrored 4 times. */ /* 1MB of SRAM. This memory is mirrored 4 times. */
SRAM : ORIGIN = 0x00400000, LENGTH = 0x00100000 SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE
/* 32MB of SDRAM. */ /* 32MB of SDRAM. */
SDRAM : ORIGIN = 0x00800000, LENGTH = 0x02000000 SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE
} }
SECTIONS { SECTIONS {
......
...@@ -4,11 +4,11 @@ ...@@ -4,11 +4,11 @@
MEMORY { MEMORY {
/* 1MB of SRAM; we can't use the last 32KB, because it's used by /* 1MB of SRAM; we can't use the last 32KB, because it's used by
the monitor scratch-RAM. This memory is mirrored 4 times. */ the monitor scratch-RAM. This memory is mirrored 4 times. */
SRAM : ORIGIN = 0x00400000, LENGTH = 0x000F8000 SRAM : ORIGIN = SRAM_ADDR, LENGTH = (SRAM_SIZE - MON_SCRATCH_SIZE)
/* Monitor scratch RAM; only the interrupt vectors should go here. */ /* Monitor scratch RAM; only the interrupt vectors should go here. */
MRAM : ORIGIN = 0x004F8000, LENGTH = 0x00008000 MRAM : ORIGIN = MON_SCRATCH_ADDR, LENGTH = MON_SCRATCH_SIZE
/* 32MB of SDRAM. */ /* 32MB of SDRAM. */
SDRAM : ORIGIN = 0x00800000, LENGTH = 0x02000000 SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE
} }
#ifdef CONFIG_RTE_CB_MA1_KSRAM #ifdef CONFIG_RTE_CB_MA1_KSRAM
......
...@@ -6,7 +6,7 @@ MEMORY { ...@@ -6,7 +6,7 @@ MEMORY {
IRAM : ORIGIN = 0x00000000, LENGTH = 0x00020000 IRAM : ORIGIN = 0x00000000, LENGTH = 0x00020000
/* 32MB of SDRAM. */ /* 32MB of SDRAM. */
SDRAM : ORIGIN = 0x00800000, LENGTH = 0x02000000 SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE
} }
#define KRAM SDRAM #define KRAM SDRAM
......
...@@ -4,11 +4,11 @@ ...@@ -4,11 +4,11 @@
MEMORY { MEMORY {
/* 1MB of SRAM; we can't use the last 96KB, because it's used by /* 1MB of SRAM; we can't use the last 96KB, because it's used by
the monitor scratch-RAM. This memory is mirrored 4 times. */ the monitor scratch-RAM. This memory is mirrored 4 times. */
SRAM : ORIGIN = 0x03C00000, LENGTH = 0x000E8000 SRAM : ORIGIN = SRAM_ADDR, LENGTH = (SRAM_SIZE - MON_SCRATCH_SIZE)
/* Monitor scratch RAM; only the interrupt vectors should go here. */ /* Monitor scratch RAM; only the interrupt vectors should go here. */
MRAM : ORIGIN = 0x03CE8000, LENGTH = 0x00018000 MRAM : ORIGIN = MON_SCRATCH_ADDR, LENGTH = MON_SCRATCH_SIZE
/* 16MB of SDRAM. */ /* 16MB of SDRAM. */
SDRAM : ORIGIN = 0x01000000, LENGTH = 0x01000000 SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE
} }
#ifdef CONFIG_RTE_CB_NB85E_KSRAM #ifdef CONFIG_RTE_CB_NB85E_KSRAM
......
...@@ -3,13 +3,10 @@ ...@@ -3,13 +3,10 @@
MEMORY { MEMORY {
LOW : ORIGIN = 0x0, LENGTH = 0x00100000 LOW : ORIGIN = 0x0, LENGTH = 0x00100000
/* 1MB of SRAM; we can't use the last 96KB, because it's used by /* 1MB of SRAM This memory is mirrored 4 times. */
the monitor scratch-RAM. This memory is mirrored 4 times. */ SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE
SRAM : ORIGIN = 0x03C00000, LENGTH = 0x000E8000
/* Monitor scratch RAM; only the interrupt vectors should go here. */
MRAM : ORIGIN = 0x03CE8000, LENGTH = 0x00018000
/* 16MB of SDRAM. */ /* 16MB of SDRAM. */
SDRAM : ORIGIN = 0x01000000, LENGTH = 0x01000000 SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE
} }
#ifdef CONFIG_RTE_CB_NB85E_KSRAM #ifdef CONFIG_RTE_CB_NB85E_KSRAM
......
...@@ -3,9 +3,8 @@ ...@@ -3,9 +3,8 @@
MEMORY { MEMORY {
/* Interrupt vectors. */ /* Interrupt vectors. */
INTV : ORIGIN = 0x0, LENGTH = 0xe0 INTV : ORIGIN = 0x0, LENGTH = 0xe0
/* 16MB of RAM. /* Main RAM. */
This must match RAM_ADDR and RAM_SIZE in include/asm-v850/sim.h */ RAM : ORIGIN = RAM_ADDR, LENGTH = RAM_SIZE
RAM : ORIGIN = 0x8F000000, LENGTH = 0x01000000
} }
SECTIONS { SECTIONS {
......
...@@ -3,26 +3,18 @@ ...@@ -3,26 +3,18 @@
MEMORY { MEMORY {
/* 1MB of `instruction RAM', starting at 0. /* 1MB of `instruction RAM', starting at 0.
Instruction fetches are much faster from IRAM than from DRAM. Instruction fetches are much faster from IRAM than from DRAM. */
This should match IRAM_ADDR in "include/asm-v580/sim85e2c.h". */ IRAM : ORIGIN = IRAM_ADDR, LENGTH = IRAM_SIZE
IRAM : ORIGIN = 0x00000000, LENGTH = 0x00100000
/* 1MB of `data RAM', below and contiguous with the I/O space. /* 1MB of `data RAM', below and contiguous with the I/O space.
Data fetches are much faster from DRAM than from IRAM. Data fetches are much faster from DRAM than from IRAM. */
This should match DRAM_ADDR in "include/asm-v580/sim85e2c.h". */ DRAM : ORIGIN = DRAM_ADDR, LENGTH = DRAM_SIZE
DRAM : ORIGIN = 0xfff00000, LENGTH = 0x000ff000
/* We have to load DRAM at a mirror-address of 0x1ff00000,
because the simulator's preprocessing script isn't smart
enough to deal with the above LMA. */
DRAM_LOAD : ORIGIN = 0x1ff00000, LENGTH = 0x000ff000
/* `external ram' (CS1 area), comes after IRAM. /* `external ram' (CS1 area), comes after IRAM. */
This should match ERAM_ADDR in "include/asm-v580/sim85e2c.h". */ ERAM : ORIGIN = ERAM_ADDR, LENGTH = ERAM_SIZE
ERAM : ORIGIN = 0x00100000, LENGTH = 0x07f00000
/* Dynamic RAM; uses memory controller. */ /* Dynamic RAM; uses memory controller. */
/* SDRAM : ORIGIN = 0x10000000, LENGTH = 0x01000000 */ SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE
SDRAM : ORIGIN = 0x10000000, LENGTH = 0x00200000/*use 2MB*/
} }
SECTIONS { SECTIONS {
......
...@@ -32,6 +32,14 @@ EXPORT_SYMBOL(jiffies_64); ...@@ -32,6 +32,14 @@ EXPORT_SYMBOL(jiffies_64);
#define TICK_SIZE (tick_nsec / 1000) #define TICK_SIZE (tick_nsec / 1000)
/*
* Scheduler clock - returns current time in nanosec units.
*/
unsigned long long sched_clock(void)
{
return (unsigned long long)jiffies * (1000000000 / HZ);
}
static inline void do_profile (unsigned long pc) static inline void do_profile (unsigned long pc)
{ {
if (prof_buffer && current->pid) { if (prof_buffer && current->pid) {
......
...@@ -14,6 +14,9 @@ ...@@ -14,6 +14,9 @@
#include <linux/config.h> #include <linux/config.h>
#include <asm-generic/vmlinux.lds.h> #include <asm-generic/vmlinux.lds.h>
/* For most platforms, this will define useful things like RAM addr/size. */
#include <asm/machdep.h>
/* The following macros contain the usual definitions for various data areas. /* The following macros contain the usual definitions for various data areas.
The prefix `RAMK_' is used to indicate macros suitable for kernels loaded The prefix `RAMK_' is used to indicate macros suitable for kernels loaded
......
# drivers/Kconfig
menu "Device Drivers"
source "drivers/base/Kconfig"
source "drivers/mtd/Kconfig"
source "drivers/parport/Kconfig"
source "drivers/pnp/Kconfig"
source "drivers/block/Kconfig"
source "drivers/ide/Kconfig"
source "drivers/scsi/Kconfig"
source "drivers/cdrom/Kconfig"
source "drivers/md/Kconfig"
source "drivers/message/fusion/Kconfig"
source "drivers/ieee1394/Kconfig"
source "drivers/message/i2o/Kconfig"
source "net/Kconfig"
source "drivers/isdn/Kconfig"
source "drivers/telephony/Kconfig"
# input before char - char/joystick depends on it. As does USB.
source "drivers/input/Kconfig"
source "drivers/char/Kconfig"
# source "drivers/misc/Kconfig"
source "drivers/media/Kconfig"
source "drivers/video/Kconfig"
source "sound/Kconfig"
source "drivers/usb/Kconfig"
endmenu
config VIDEO_SAA7146 config VIDEO_SAA7146
tristate tristate
default y if DVB_AV7110=y || DVB_BUDGET=y || DVB_BUDGET_AV=y || VIDEO_MXB=y || VIDEO_DPC=y || VIDEO_HEXIUM_ORION=y || VIDEO_HEXIUM_GEMINI=y select I2C
default m if DVB_AV7110=m || DVB_BUDGET=m || DVB_BUDGET_AV=m || VIDEO_MXB=m || VIDEO_DPC=m || VIDEO_HEXIUM_ORION=m || VIDEO_HEXIUM_GEMINI=m
depends on VIDEO_DEV && PCI && I2C config VIDEO_SAA7146_VV
tristate
select VIDEO_BUF
select VIDEO_VIDEOBUF
select VIDEO_SAA7146
config VIDEO_VIDEOBUF config VIDEO_VIDEOBUF
tristate tristate
default y if VIDEO_SAA7134=y || VIDEO_BT848=y || VIDEO_SAA7146=y
default m if VIDEO_SAA7134=m || VIDEO_BT848=m || VIDEO_SAA7146=m
depends on VIDEO_DEV
saa7146-objs := saa7146_i2c.o saa7146_core.o saa7146-objs := saa7146_i2c.o saa7146_core.o
saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o
obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o saa7146_vv.o obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o
obj-$(CONFIG_VIDEO_SAA7146_VV) += saa7146_vv.o
...@@ -139,34 +139,42 @@ int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt) ...@@ -139,34 +139,42 @@ int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt)
return 0; return 0;
} }
void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length ) void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt,
struct scatterlist *list, int sglen )
{ {
u32 *ptr, fill; u32 *ptr, fill;
int nr_pages = 0;
int i,p; int i,p;
//fm DEB_EE(("pci:%p, pt:%p, sl:%p, len:%d\n",pci,pt,list,length)); BUG_ON( 0 == sglen);
/* if we have a user buffer, the first page may not be /* if we have a user buffer, the first page may not be
aligned to a page boundary. */ aligned to a page boundary. */
pt->offset = list->offset; pt->offset = list->offset;
ptr = pt->cpu; ptr = pt->cpu;
for (i = 0; i < length; i++, list++) { for (i = 0; i < sglen; i++, list++) {
/*
printk("i:%d, adr:0x%08x, len:%d, offset:%d\n", i,sg_dma_address(list), sg_dma_len(list), list->offset);
*/
for (p = 0; p * 4096 < list->length; p++, ptr++) { for (p = 0; p * 4096 < list->length; p++, ptr++) {
*ptr = sg_dma_address(list) - list->offset; *ptr = sg_dma_address(list) + p * 4096;
nr_pages++;
} }
} }
/* safety; fill the page table up with the last valid page */ /* safety; fill the page table up with the last valid page */
fill = *(ptr-1); fill = *(ptr-1);
for(;i<1024;i++) { for(i=nr_pages;i<1024;i++) {
*ptr++ = fill; *ptr++ = fill;
} }
/* /*
ptr = pt->cpu; ptr = pt->cpu;
for(j=0;j<60;j++) { printk("offset: %d\n",pt->offset);
printk("ptr1 %d: 0x%08x\n",j,ptr[j]); for(i=0;i<5;i++) {
printk("ptr1 %d: 0x%08x\n",i,ptr[i]);
} }
*/ */
} }
......
...@@ -304,6 +304,7 @@ static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait) ...@@ -304,6 +304,7 @@ static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait)
return videobuf_poll_stream(file, &fh->vbi_q, wait); return videobuf_poll_stream(file, &fh->vbi_q, wait);
q = &fh->vbi_q; q = &fh->vbi_q;
} else { } else {
DEB_D(("using video queue.\n"));
q = &fh->video_q; q = &fh->video_q;
} }
...@@ -311,14 +312,17 @@ static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait) ...@@ -311,14 +312,17 @@ static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait)
buf = list_entry(q->stream.next, struct videobuf_buffer, stream); buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
if (!buf) { if (!buf) {
DEB_D(("buf == NULL!\n"));
return POLLERR; return POLLERR;
} }
poll_wait(file, &buf->done, wait); poll_wait(file, &buf->done, wait);
if (buf->state == STATE_DONE || buf->state == STATE_ERROR) { if (buf->state == STATE_DONE || buf->state == STATE_ERROR) {
DEB_D(("poll succeeded!\n"));
return POLLIN|POLLRDNORM; return POLLIN|POLLRDNORM;
} }
DEB_D(("nothing to poll for, buf->state:%d\n",buf->state));
return 0; return 0;
} }
......
...@@ -742,6 +742,7 @@ static int calculate_video_dma_grab_packed(struct saa7146_dev* dev, struct saa71 ...@@ -742,6 +742,7 @@ static int calculate_video_dma_grab_packed(struct saa7146_dev* dev, struct saa71
int width = buf->fmt->width; int width = buf->fmt->width;
int height = buf->fmt->height; int height = buf->fmt->height;
int bytesperline = buf->fmt->bytesperline;
enum v4l2_field field = buf->fmt->field; enum v4l2_field field = buf->fmt->field;
int depth = sfmt->depth; int depth = sfmt->depth;
...@@ -749,7 +750,11 @@ static int calculate_video_dma_grab_packed(struct saa7146_dev* dev, struct saa71 ...@@ -749,7 +750,11 @@ static int calculate_video_dma_grab_packed(struct saa7146_dev* dev, struct saa71
DEB_CAP(("[size=%dx%d,fields=%s]\n", DEB_CAP(("[size=%dx%d,fields=%s]\n",
width,height,v4l2_field_names[field])); width,height,v4l2_field_names[field]));
if( bytesperline != 0) {
vdma1.pitch = bytesperline*2;
} else {
vdma1.pitch = (width*depth*2)/8; vdma1.pitch = (width*depth*2)/8;
}
vdma1.num_line_byte = ((vv->standard->v_field<<16) + vv->standard->h_pixels); vdma1.num_line_byte = ((vv->standard->v_field<<16) + vv->standard->h_pixels);
vdma1.base_page = buf->pt[0].dma | ME1; vdma1.base_page = buf->pt[0].dma | ME1;
...@@ -799,6 +804,8 @@ static int calc_planar_422(struct saa7146_vv *vv, struct saa7146_buf *buf, struc ...@@ -799,6 +804,8 @@ static int calc_planar_422(struct saa7146_vv *vv, struct saa7146_buf *buf, struc
vdma2->pitch = width; vdma2->pitch = width;
vdma3->pitch = width; vdma3->pitch = width;
/* fixme: look at bytesperline! */
if( 0 != vv->vflip ) { if( 0 != vv->vflip ) {
vdma2->prot_addr = buf->pt[1].offset; vdma2->prot_addr = buf->pt[1].offset;
vdma2->base_even = ((vdma2->pitch/2)*height)+buf->pt[1].offset; vdma2->base_even = ((vdma2->pitch/2)*height)+buf->pt[1].offset;
...@@ -871,6 +878,8 @@ static int calculate_video_dma_grab_planar(struct saa7146_dev* dev, struct saa71 ...@@ -871,6 +878,8 @@ static int calculate_video_dma_grab_planar(struct saa7146_dev* dev, struct saa71
DEB_CAP(("[size=%dx%d,fields=%s]\n", DEB_CAP(("[size=%dx%d,fields=%s]\n",
width,height,v4l2_field_names[field])); width,height,v4l2_field_names[field]));
/* fixme: look at bytesperline! */
/* fixme: what happens for user space buffers here?. The offsets are /* fixme: what happens for user space buffers here?. The offsets are
most likely wrong, this version here only works for page-aligned most likely wrong, this version here only works for page-aligned
buffers, modifications to the pagetable-functions are necessary...*/ buffers, modifications to the pagetable-functions are necessary...*/
...@@ -997,8 +1006,10 @@ static void program_capture_engine(struct saa7146_dev *dev, int planar) ...@@ -997,8 +1006,10 @@ static void program_capture_engine(struct saa7146_dev *dev, int planar)
WRITE_RPS0(CMD_PAUSE | o_wait); WRITE_RPS0(CMD_PAUSE | o_wait);
WRITE_RPS0(CMD_PAUSE | e_wait); WRITE_RPS0(CMD_PAUSE | e_wait);
} else if ( vv->last_field == V4L2_FIELD_TOP ) { } else if ( vv->last_field == V4L2_FIELD_TOP ) {
WRITE_RPS0(CMD_PAUSE | (vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? MASK_10 : MASK_09));
WRITE_RPS0(CMD_PAUSE | o_wait); WRITE_RPS0(CMD_PAUSE | o_wait);
} else if ( vv->last_field == V4L2_FIELD_BOTTOM ) { } else if ( vv->last_field == V4L2_FIELD_BOTTOM ) {
WRITE_RPS0(CMD_PAUSE | (vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? MASK_10 : MASK_09));
WRITE_RPS0(CMD_PAUSE | e_wait); WRITE_RPS0(CMD_PAUSE | e_wait);
} }
...@@ -1033,16 +1044,6 @@ void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struc ...@@ -1033,16 +1044,6 @@ void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struc
DEB_CAP(("buf:%p, next:%p\n",buf,next)); DEB_CAP(("buf:%p, next:%p\n",buf,next));
/*
printk("vdma%d.base_even: 0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
printk("vdma%d.base_odd: 0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
printk("vdma%d.prot_addr: 0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1));
printk("vdma%d.base_page: 0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1));
printk("vdma%d.pitch: 0x%08x\n", 1,saa7146_read(dev,PITCH1));
printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1));
printk("vdma%d => vptr : 0x%08x\n", 1,saa7146_read(dev,PCI_VDP1));
*/
vdma1_prot_addr = saa7146_read(dev, PROT_ADDR1); vdma1_prot_addr = saa7146_read(dev, PROT_ADDR1);
if( 0 == vdma1_prot_addr ) { if( 0 == vdma1_prot_addr ) {
/* clear out beginning of streaming bit (rps register 0)*/ /* clear out beginning of streaming bit (rps register 0)*/
...@@ -1069,6 +1070,16 @@ void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struc ...@@ -1069,6 +1070,16 @@ void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struc
program_capture_engine(dev,0); program_capture_engine(dev,0);
} }
/*
printk("vdma%d.base_even: 0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
printk("vdma%d.base_odd: 0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
printk("vdma%d.prot_addr: 0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1));
printk("vdma%d.base_page: 0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1));
printk("vdma%d.pitch: 0x%08x\n", 1,saa7146_read(dev,PITCH1));
printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1));
printk("vdma%d => vptr : 0x%08x\n", 1,saa7146_read(dev,PCI_VDP1));
*/
/* write the address of the rps-program */ /* write the address of the rps-program */
saa7146_write(dev, RPS_ADDR0, dev->d_rps0.dma_handle); saa7146_write(dev, RPS_ADDR0, dev->d_rps0.dma_handle);
......
This diff is collapsed.
...@@ -3,16 +3,16 @@ ...@@ -3,16 +3,16 @@
# #
menu "Digital Video Broadcasting Devices" menu "Digital Video Broadcasting Devices"
depends on NET && INET
config DVB config DVB
bool "DVB For Linux" bool "DVB For Linux"
depends on NET && INET
---help--- ---help---
Support Digital Video Broadcasting hardware. Enable this if you Support Digital Video Broadcasting hardware. Enable this if you
own a DVB adapter and want to use it or if you compile Linux for own a DVB adapter and want to use it or if you compile Linux for
a digital SetTopBox. a digital SetTopBox.
API specs and user tools and are available for example from API specs and user tools are available from
<http://www.linuxtv.org/>. <http://www.linuxtv.org/>.
Please report problems regarding this driver to the LinuxDVB Please report problems regarding this driver to the LinuxDVB
...@@ -33,18 +33,16 @@ source "drivers/media/dvb/dvb-core/Kconfig" ...@@ -33,18 +33,16 @@ source "drivers/media/dvb/dvb-core/Kconfig"
source "drivers/media/dvb/frontends/Kconfig" source "drivers/media/dvb/frontends/Kconfig"
comment "Supported SAA7146 based PCI Adapters" comment "Supported SAA7146 based PCI Adapters"
depends on DVB && PCI depends on DVB_CORE && PCI
source "drivers/media/dvb/ttpci/Kconfig" source "drivers/media/dvb/ttpci/Kconfig"
comment "Supported USB Adapters" comment "Supported USB Adapters"
depends on DVB && USB depends on DVB_CORE && USB
source "drivers/media/dvb/ttusb-budget/Kconfig" source "drivers/media/dvb/ttusb-budget/Kconfig"
source "drivers/media/dvb/ttusb-dec/Kconfig" source "drivers/media/dvb/ttusb-dec/Kconfig"
comment "Supported FlexCopII (B2C2) Adapters" comment "Supported FlexCopII (B2C2) Adapters"
depends on DVB && PCI depends on DVB_CORE && PCI
source "drivers/media/dvb/b2c2/Kconfig" source "drivers/media/dvb/b2c2/Kconfig"
endmenu endmenu
......
...@@ -4,5 +4,8 @@ config DVB_CORE ...@@ -4,5 +4,8 @@ config DVB_CORE
select CRC32 select CRC32
help help
DVB core utility functions for device handling, software fallbacks etc. DVB core utility functions for device handling, software fallbacks etc.
Say Y when you have a DVB card and want to use it. Say Y if your want
to build your drivers outside the kernel, but need the DVB core. All
in-kernel drivers will select this automatically if needed.
If unsure say N.
Say Y when you have a DVB card and want to use it. If unsure say N.
obj-$(CONFIG_DVB_CORE) += crc32.o
/* demux.h /*
* demux.h
* *
* Copyright (c) 2002 Convergence GmbH * Copyright (c) 2002 Convergence GmbH
* *
......
/* /*
* dmxdev.h * dmxdev.h
* *
* Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> * Copyright (C) 2000 Ralph Metzler & Marcus Metzler
* & Marcus Metzler <marcus@convergence.de> * for convergence integrated media GmbH
for convergence integrated media GmbH
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License * modify it under the terms of the GNU Lesser General Public License
......
...@@ -391,7 +391,9 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, size_t cou ...@@ -391,7 +391,9 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, size_t cou
spin_lock(&demux->lock); spin_lock(&demux->lock);
while (count--) { while (count--) {
if(buf[0] == 0x47) {
dvb_dmx_swfilter_packet(demux, buf); dvb_dmx_swfilter_packet(demux, buf);
}
buf += 188; buf += 188;
} }
......
/* /*
* dvb_demux.h - DVB kernel demux API * dvb_demux.h: DVB kernel demux API
* *
* Copyright (C) 2000-2001 Marcus Metzler <marcus@convergence.de> * Copyright (C) 2000-2001 Marcus Metzler & Ralph Metzler
* & Ralph Metzler <ralph@convergence.de>
* for convergence integrated media GmbH * for convergence integrated media GmbH
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
......
/*
* dvb_filter.h
*
* Copyright (C) 2003 Convergence GmbH
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _DVB_FILTER_H_ #ifndef _DVB_FILTER_H_
#define _DVB_FILTER_H_ #define _DVB_FILTER_H_
......
...@@ -870,6 +870,7 @@ dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend, ...@@ -870,6 +870,7 @@ dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend,
static const struct dvb_device dvbdev_template = { static const struct dvb_device dvbdev_template = {
.users = ~0, .users = ~0,
.writers = 1, .writers = 1,
.readers = (~0)-1,
.fops = &dvb_frontend_fops, .fops = &dvb_frontend_fops,
.kernel_ioctl = dvb_frontend_ioctl .kernel_ioctl = dvb_frontend_ioctl
}; };
......
/* /*
* dvb-core.h * dvb_frontend.h
*
* Copyright (C) 2001 Ralph Metzler for convergence integrated media GmbH
* overhauled by Holger Waechtler for Convergence GmbH
* *
* Copyright (C) 2001 Ralph Metzler <ralph@convergence.de>
* overhauled by Holger Waechtler <holger@convergence.de>
* for convergence integrated media GmbH
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License * modify it under the terms of the GNU Lesser General Public License
......
/*
* dvb_functions.h: isolate some Linux specific stuff from the dvb-core
* that can't be expressed as a one-liner
* in order to make porting to other environments easier
*
* Copyright (C) 2003 Convergence GmbH
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Lesser Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
#ifndef __DVB_FUNCTIONS_H__ #ifndef __DVB_FUNCTIONS_H__
#define __DVB_FUNCTIONS_H__ #define __DVB_FUNCTIONS_H__
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
* Copyright (C) 2002 Holger Waechtler for convergence integrated media GmbH * Copyright (C) 2002 Holger Waechtler for convergence integrated media GmbH
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2 * as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version. * of the License, or (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
...@@ -13,10 +13,9 @@ ...@@ -13,10 +13,9 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* Or, point your browser to http://www.gnu.org/copyleft/gpl.html
*/ */
#ifndef _DVB_I2C_H_ #ifndef _DVB_I2C_H_
......
/* /*
* dvb_net.h * dvb_net.h
* *
* Copyright (C) 2001 Convergence integrated media GmbH * Copyright (C) 2001 Ralph Metzler for convergence integrated media GmbH
* Ralph Metzler <ralph@convergence.de>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License * modify it under the terms of the GNU Lesser General Public License
......
...@@ -5,28 +5,22 @@ ...@@ -5,28 +5,22 @@
* Copyright (C) 2003 Oliver Endriss * Copyright (C) 2003 Oliver Endriss
* *
* based on code originally found in av7110.c: * based on code originally found in av7110.c:
* Copyright (C) 1999-2002 Ralph Metzler * Copyright (C) 1999-2002 Ralph Metzler & Marcus Metzler
* & Marcus Metzler for convergence integrated media GmbH * for convergence integrated media GmbH
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2 * as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version. * of the License, or (at your option) any later version.
* *
*
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* * You should have received a copy of the GNU Lesser General Public License
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* Or, point your browser to http://www.gnu.org/copyleft/gpl.html
*
*
* the project's page is at http://www.linuxtv.org/dvb/
*/ */
#ifndef _DVB_RINGBUFFER_H_ #ifndef _DVB_RINGBUFFER_H_
......
...@@ -112,7 +112,11 @@ int dvb_generic_open(struct inode *inode, struct file *file) ...@@ -112,7 +112,11 @@ int dvb_generic_open(struct inode *inode, struct file *file)
if (!dvbdev->users) if (!dvbdev->users)
return -EBUSY; return -EBUSY;
if ((file->f_flags & O_ACCMODE) != O_RDONLY) { if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
if (!dvbdev->readers)
return -EBUSY;
dvbdev->readers--;
} else {
if (!dvbdev->writers) if (!dvbdev->writers)
return -EBUSY; return -EBUSY;
dvbdev->writers--; dvbdev->writers--;
...@@ -130,8 +134,11 @@ int dvb_generic_release(struct inode *inode, struct file *file) ...@@ -130,8 +134,11 @@ int dvb_generic_release(struct inode *inode, struct file *file)
if (!dvbdev) if (!dvbdev)
return -ENODEV; return -ENODEV;
if ((file->f_flags & O_ACCMODE) != O_RDONLY) if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
dvbdev->readers++;
} else {
dvbdev->writers++; dvbdev->writers++;
}
dvbdev->users++; dvbdev->users++;
return 0; return 0;
......
/* /*
* dvbdev.h * dvbdev.h
* *
* Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> * Copyright (C) 2000 Ralph Metzler & Marcus Metzler
* & Marcus Metzler <marcus@convergence.de> * for convergence integrated media GmbH
for convergence integrated media GmbH
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Lesser Public License * modify it under the terms of the GNU General Lesser Public License
...@@ -55,12 +54,18 @@ struct dvb_adapter { ...@@ -55,12 +54,18 @@ struct dvb_adapter {
struct dvb_device { struct dvb_device {
struct list_head list_head; struct list_head list_head;
struct file_operations *fops; struct file_operations *fops;
struct dvb_adapter *adapter; struct dvb_adapter *adapter;
int type; int type;
u32 id; u32 id;
int users; /* in theory, 'users' can vanish now,
but I don't want to change too much now... */
int readers;
int writers; int writers;
int users;
/* don't really need those !? -- FIXME: use video_usercopy */ /* don't really need those !? -- FIXME: use video_usercopy */
int (*kernel_ioctl)(struct inode *inode, struct file *file, int (*kernel_ioctl)(struct inode *inode, struct file *file,
......
...@@ -26,6 +26,16 @@ config DVB_ALPS_BSRV2 ...@@ -26,6 +26,16 @@ config DVB_ALPS_BSRV2
DVB adapter simply enable all supported frontends, the DVB adapter simply enable all supported frontends, the
right one will get autodetected. right one will get autodetected.
config DVB_SP887X
tristate "Frontends with sp887x demodulators, e.g. Microtune DTF7072"
depends on DVB_CORE
help
A DVB-T demodulator driver. Say Y when you want to support the sp887x.
If you don't know what tuner module is soldered on your
DVB adapter simply enable all supported frontends, the
right one will get autodetected.
config DVB_ALPS_TDLB7 config DVB_ALPS_TDLB7
tristate "Alps TDLB7 (OFDM)" tristate "Alps TDLB7 (OFDM)"
depends on DVB_CORE depends on DVB_CORE
......
...@@ -15,3 +15,4 @@ obj-$(CONFIG_DVB_GRUNDIG_29504_401) += grundig_29504-401.o ...@@ -15,3 +15,4 @@ obj-$(CONFIG_DVB_GRUNDIG_29504_401) += grundig_29504-401.o
obj-$(CONFIG_DVB_MT312) += mt312.o obj-$(CONFIG_DVB_MT312) += mt312.o
obj-$(CONFIG_DVB_VES1820) += ves1820.o obj-$(CONFIG_DVB_VES1820) += ves1820.o
obj-$(CONFIG_DVB_TDA1004X) += tda1004x.o obj-$(CONFIG_DVB_TDA1004X) += tda1004x.o
obj-$(CONFIG_DVB_SP887X) += sp887x.o
...@@ -85,7 +85,7 @@ static int mt312_read(struct dvb_i2c_bus *i2c, ...@@ -85,7 +85,7 @@ static int mt312_read(struct dvb_i2c_bus *i2c,
printk(KERN_ERR "%s: ret == %d\n", __FUNCTION__, ret); printk(KERN_ERR "%s: ret == %d\n", __FUNCTION__, ret);
return -EREMOTEIO; return -EREMOTEIO;
} }
#ifdef MT312_DEBUG #if MT312_DEBUG
{ {
int i; int i;
printk(KERN_INFO "R(%d):", reg & 0x7f); printk(KERN_INFO "R(%d):", reg & 0x7f);
...@@ -106,7 +106,7 @@ static int mt312_write(struct dvb_i2c_bus *i2c, ...@@ -106,7 +106,7 @@ static int mt312_write(struct dvb_i2c_bus *i2c,
u8 buf[count + 1]; u8 buf[count + 1];
struct i2c_msg msg; struct i2c_msg msg;
#ifdef MT312_DEBUG #if MT312_DEBUG
{ {
int i; int i;
printk(KERN_INFO "W(%d):", reg & 0x7f); printk(KERN_INFO "W(%d):", reg & 0x7f);
......
This diff is collapsed.
This diff is collapsed.
...@@ -913,7 +913,10 @@ static long probe_tuner (struct dvb_i2c_bus *i2c) ...@@ -913,7 +913,10 @@ static long probe_tuner (struct dvb_i2c_bus *i2c)
static int uni0299_attach (struct dvb_i2c_bus *i2c) static int uni0299_attach (struct dvb_i2c_bus *i2c)
{ {
long tuner_type; long tuner_type;
u8 id = stv0299_readreg (i2c, 0x00); u8 id;
stv0299_writereg (i2c, 0x02, 0x00); /* standby off */
id = stv0299_readreg (i2c, 0x00);
dprintk ("%s: id == 0x%02x\n", __FUNCTION__, id); dprintk ("%s: id == 0x%02x\n", __FUNCTION__, id);
......
/* /*
Driver for Philips tda1004x OFDM Frontend Driver for Philips tda1004xh OFDM Frontend
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
......
...@@ -36,6 +36,9 @@ ...@@ -36,6 +36,9 @@
#define dprintk(x...) #define dprintk(x...)
#endif #endif
#define MAX_UNITS 4
static int pwm[MAX_UNITS] = { -1, -1, -1, -1 };
static int verbose;
/** /**
* since we need only a few bits to store internal state we don't allocate * since we need only a few bits to store internal state we don't allocate
...@@ -116,9 +119,9 @@ static int ves1820_writereg (struct dvb_frontend *fe, u8 reg, u8 data) ...@@ -116,9 +119,9 @@ static int ves1820_writereg (struct dvb_frontend *fe, u8 reg, u8 data)
ret = i2c->xfer (i2c, &msg, 1); ret = i2c->xfer (i2c, &msg, 1);
if (ret != 1) if (ret != 1)
dprintk("%s: writereg error " printk("DVB: VES1820(%d): %s, writereg error "
"(reg == 0x%02x, val == 0x%02x, ret == %i)\n", "(reg == 0x%02x, val == 0x%02x, ret == %i)\n",
__FUNCTION__, reg, data, ret); fe->i2c->adapter->num, __FUNCTION__, reg, data, ret);
dvb_delay(10); dvb_delay(10);
return (ret != 1) ? -EREMOTEIO : 0; return (ret != 1) ? -EREMOTEIO : 0;
...@@ -138,7 +141,8 @@ static u8 ves1820_readreg (struct dvb_frontend *fe, u8 reg) ...@@ -138,7 +141,8 @@ static u8 ves1820_readreg (struct dvb_frontend *fe, u8 reg)
ret = i2c->xfer (i2c, msg, 2); ret = i2c->xfer (i2c, msg, 2);
if (ret != 2) if (ret != 2)
dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); printk("DVB: VES1820(%d): %s: readreg error (ret == %i)\n",
fe->i2c->adapter->num, __FUNCTION__, ret);
return b1[0]; return b1[0];
} }
...@@ -152,7 +156,8 @@ static int tuner_write (struct dvb_i2c_bus *i2c, u8 addr, u8 data [4]) ...@@ -152,7 +156,8 @@ static int tuner_write (struct dvb_i2c_bus *i2c, u8 addr, u8 data [4])
ret = i2c->xfer (i2c, &msg, 1); ret = i2c->xfer (i2c, &msg, 1);
if (ret != 1) if (ret != 1)
printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret); printk("DVB: VES1820(%d): %s: i/o error (ret == %i)\n",
i2c->adapter->num, __FUNCTION__, ret);
return (ret != 1) ? -EREMOTEIO : 0; return (ret != 1) ? -EREMOTEIO : 0;
} }
...@@ -173,7 +178,8 @@ static int tuner_set_tv_freq (struct dvb_frontend *fe, u32 freq) ...@@ -173,7 +178,8 @@ static int tuner_set_tv_freq (struct dvb_frontend *fe, u32 freq)
if (tuner_type == 0xff) /* PLL not reachable over i2c ... */ if (tuner_type == 0xff) /* PLL not reachable over i2c ... */
return 0; return 0;
if (strstr (fe->i2c->adapter->name, "Technotrend")) if (strstr (fe->i2c->adapter->name, "Technotrend") ||
strstr (fe->i2c->adapter->name, "TT-Budget"))
ifreq = 35937500; ifreq = 35937500;
else else
ifreq = 36125000; ifreq = 36125000;
...@@ -232,7 +238,7 @@ static int ves1820_init (struct dvb_frontend *fe) ...@@ -232,7 +238,7 @@ static int ves1820_init (struct dvb_frontend *fe)
{ {
int i; int i;
dprintk("VES1820: init chip\n"); dprintk("DVB: VES1820(%d): init chip\n", fe->i2c->adapter->num);
ves1820_writereg (fe, 0, 0); ves1820_writereg (fe, 0, 0);
...@@ -408,10 +414,11 @@ static int ves1820_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg) ...@@ -408,10 +414,11 @@ static int ves1820_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
if (sync & 2) if (sync & 2)
/* AFC only valid when carrier has been recovered */ /* AFC only valid when carrier has been recovered */
afc = ves1820_readreg(fe, 0x19); afc = ves1820_readreg(fe, 0x19);
printk ("%s: AFC (%d) %dHz\n", __FILE__, afc, if (verbose)
printk ("DVB: VES1820(%d): AFC (%d) %dHz\n",
fe->i2c->adapter->num, afc,
-((s32)(p->u.qam.symbol_rate >> 3) * afc >> 7)); -((s32)(p->u.qam.symbol_rate >> 3) * afc >> 7));
p->inversion = reg0 & 0x20 ? INVERSION_OFF : INVERSION_ON; p->inversion = reg0 & 0x20 ? INVERSION_OFF : INVERSION_ON;
p->u.qam.modulation = ((reg0 >> 2) & 7) + QAM_16; p->u.qam.modulation = ((reg0 >> 2) & 7) + QAM_16;
...@@ -449,15 +456,14 @@ static long probe_tuner (struct dvb_i2c_bus *i2c) ...@@ -449,15 +456,14 @@ static long probe_tuner (struct dvb_i2c_bus *i2c)
if (i2c->xfer(i2c, &msg1, 1) == 1) { if (i2c->xfer(i2c, &msg1, 1) == 1) {
type = 0; type = 0;
printk ("%s: setup for tuner spXXXX\n", __FILE__); printk ("DVB: VES1820(%d): setup for tuner spXXXX\n", i2c->adapter->num);
} else if (i2c->xfer(i2c, &msg2, 1) == 1) { } else if (i2c->xfer(i2c, &msg2, 1) == 1) {
type = 1; type = 1;
printk ("%s: setup for tuner sp5659c\n", __FILE__); printk ("DVB: VES1820(%d): setup for tuner sp5659c\n", i2c->adapter->num);
} else { } else {
type = -1; type = -1;
printk ("%s: unknown PLL, " printk ("DVB: VES1820(%d): unknown PLL, "
"please report to <linuxdvb@linuxtv.org>!!\n", "please report to <linuxdvb@linuxtv.org>!!\n", i2c->adapter->num);
__FILE__);
} }
return type; return type;
...@@ -473,7 +479,7 @@ static u8 read_pwm (struct dvb_i2c_bus *i2c) ...@@ -473,7 +479,7 @@ static u8 read_pwm (struct dvb_i2c_bus *i2c)
i2c->xfer (i2c, msg, 2); i2c->xfer (i2c, msg, 2);
dprintk("VES1820: pwm=%02x\n", pwm); printk("DVB: VES1820(%d): pwm=0x%02x\n", i2c->adapter->num, pwm);
if (pwm == 0xff) if (pwm == 0xff)
pwm = 0x48; pwm = 0x48;
...@@ -513,6 +519,12 @@ static int ves1820_attach (struct dvb_i2c_bus *i2c) ...@@ -513,6 +519,12 @@ static int ves1820_attach (struct dvb_i2c_bus *i2c)
if ((tuner_type = probe_tuner(i2c)) < 0) if ((tuner_type = probe_tuner(i2c)) < 0)
return -ENODEV; return -ENODEV;
if ((i2c->adapter->num < MAX_UNITS) && pwm[i2c->adapter->num] != -1) {
printk("DVB: VES1820(%d): pwm=0x%02x (user specified)\n",
i2c->adapter->num, pwm[i2c->adapter->num]);
SET_PWM(data, pwm[i2c->adapter->num]);
}
else
SET_PWM(data, read_pwm(i2c)); SET_PWM(data, read_pwm(i2c));
SET_REG0(data, ves1820_inittab[0]); SET_REG0(data, ves1820_inittab[0]);
SET_TUNER(data, tuner_type); SET_TUNER(data, tuner_type);
...@@ -532,6 +544,10 @@ static void ves1820_detach (struct dvb_i2c_bus *i2c) ...@@ -532,6 +544,10 @@ static void ves1820_detach (struct dvb_i2c_bus *i2c)
static int __init init_ves1820 (void) static int __init init_ves1820 (void)
{ {
int i;
for (i = 0; i < MAX_UNITS; i++)
if (pwm[i] < -1 || pwm[i] > 255)
return -EINVAL;
return dvb_register_i2c_device (THIS_MODULE, return dvb_register_i2c_device (THIS_MODULE,
ves1820_attach, ves1820_detach); ves1820_attach, ves1820_detach);
} }
...@@ -546,6 +562,11 @@ static void __exit exit_ves1820 (void) ...@@ -546,6 +562,11 @@ static void __exit exit_ves1820 (void)
module_init(init_ves1820); module_init(init_ves1820);
module_exit(exit_ves1820); module_exit(exit_ves1820);
MODULE_PARM(pwm, "1-" __MODULE_STRING(MAX_UNITS) "i");
MODULE_PARM_DESC(pwm, "override PWM value stored in EEPROM (tuner calibration)");
MODULE_PARM(verbose, "i");
MODULE_PARM_DESC(verbose, "print AFC offset after tuning for debugging the PWM setting");
MODULE_DESCRIPTION("VES1820 DVB-C frontend driver"); MODULE_DESCRIPTION("VES1820 DVB-C frontend driver");
MODULE_AUTHOR("Ralph Metzler, Holger Waechtler"); MODULE_AUTHOR("Ralph Metzler, Holger Waechtler");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
......
config DVB_AV7110 config DVB_AV7110
tristate "AV7110 cards" tristate "AV7110 cards"
depends on VIDEO_DEV && DVB_CORE depends on DVB_CORE
select VIDEO_DEV
select VIDEO_SAA7146_VV
help help
Support for SAA7146 and AV7110 based DVB cards as produced Support for SAA7146 and AV7110 based DVB cards as produced
by Fujitsu-Siemens, Technotrend, Hauppauge and others. by Fujitsu-Siemens, Technotrend, Hauppauge and others.
...@@ -26,6 +28,7 @@ config DVB_AV7110_OSD ...@@ -26,6 +28,7 @@ config DVB_AV7110_OSD
config DVB_BUDGET config DVB_BUDGET
tristate "Budget cards" tristate "Budget cards"
depends on DVB_CORE depends on DVB_CORE
select VIDEO_SAA7146
help help
Support for simple SAA7146 based DVB cards Support for simple SAA7146 based DVB cards
(so called Budget- or Nova-PCI cards) without onboard (so called Budget- or Nova-PCI cards) without onboard
...@@ -38,7 +41,8 @@ config DVB_BUDGET ...@@ -38,7 +41,8 @@ config DVB_BUDGET
config DVB_BUDGET_CI config DVB_BUDGET_CI
tristate "Budget cards with onboard CI connector" tristate "Budget cards with onboard CI connector"
depends on VIDEO_DEV && DVB_CORE && DVB_BUDGET depends on DVB_CORE
select VIDEO_SAA7146
help help
Support for simple SAA7146 based DVB cards Support for simple SAA7146 based DVB cards
(so called Budget- or Nova-PCI cards) without onboard (so called Budget- or Nova-PCI cards) without onboard
...@@ -51,7 +55,9 @@ config DVB_BUDGET_CI ...@@ -51,7 +55,9 @@ config DVB_BUDGET_CI
config DVB_BUDGET_AV config DVB_BUDGET_AV
tristate "Budget cards with analog video inputs" tristate "Budget cards with analog video inputs"
depends on VIDEO_DEV && DVB_CORE && DVB_BUDGET depends on DVB_CORE
select VIDEO_DEV
select VIDEO_SAA7146_VV
help help
Support for simple SAA7146 based DVB cards Support for simple SAA7146 based DVB cards
(so called Budget- or Nova-PCI cards) without onboard (so called Budget- or Nova-PCI cards) without onboard
...@@ -64,7 +70,9 @@ config DVB_BUDGET_AV ...@@ -64,7 +70,9 @@ config DVB_BUDGET_AV
config DVB_BUDGET_PATCH config DVB_BUDGET_PATCH
tristate "AV7110 cards with Budget Patch" tristate "AV7110 cards with Budget Patch"
depends on DVB_CORE && DVB_BUDGET depends on DVB_BUDGET
select VIDEO_DEV
select VIDEO_SAA7146_VV
help help
Support for Budget Patch (full TS) modification on Support for Budget Patch (full TS) modification on
SAA7146+AV7110 based cards (DVB-S cards). This SAA7146+AV7110 based cards (DVB-S cards). This
......
This diff is collapsed.
...@@ -399,7 +399,7 @@ struct av7110 { ...@@ -399,7 +399,7 @@ struct av7110 {
struct dvb_device dvb_dev; struct dvb_device dvb_dev;
struct dvb_net dvb_net; struct dvb_net dvb_net;
struct video_device vd; struct video_device v4l_dev;
struct saa7146_dev *dev; struct saa7146_dev *dev;
......
This diff is collapsed.
...@@ -357,10 +357,12 @@ static int budget_ci_detach (struct saa7146_dev* dev) ...@@ -357,10 +357,12 @@ static int budget_ci_detach (struct saa7146_dev* dev)
static struct saa7146_extension budget_extension; static struct saa7146_extension budget_extension;
MAKE_BUDGET_INFO(ttbci, "TT-Budget/WinTV-NOVA-CI PCI", BUDGET_TT_HW_DISEQC); MAKE_BUDGET_INFO(ttbci, "TT-Budget/WinTV-NOVA-CI PCI", BUDGET_TT_HW_DISEQC);
MAKE_BUDGET_INFO(ttbt2, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT);
static struct pci_device_id pci_tbl[] = { static struct pci_device_id pci_tbl[] = {
MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100c), MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100c),
MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100f), MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100f),
MAKE_EXTENSION_PCI(ttbt2, 0x13c2, 0x1011),
{ {
.vendor = 0, .vendor = 0,
} }
......
...@@ -46,12 +46,12 @@ static int start_ts_capture (struct budget *budget) ...@@ -46,12 +46,12 @@ static int start_ts_capture (struct budget *budget)
mdelay(10); mdelay(10);
saa7146_write(dev, BASE_ODD3, 0); saa7146_write(dev, BASE_ODD3, 0);
saa7146_write(dev, BASE_EVEN3, TS_WIDTH*TS_HEIGHT/2); saa7146_write(dev, BASE_EVEN3, 0);
saa7146_write(dev, PROT_ADDR3, TS_WIDTH*TS_HEIGHT); saa7146_write(dev, PROT_ADDR3, TS_WIDTH*TS_HEIGHT);
saa7146_write(dev, BASE_PAGE3, budget->pt.dma |ME1|0x90); saa7146_write(dev, BASE_PAGE3, budget->pt.dma |ME1|0x90);
saa7146_write(dev, PITCH3, TS_WIDTH); saa7146_write(dev, PITCH3, TS_WIDTH);
saa7146_write(dev, NUM_LINE_BYTE3, ((TS_HEIGHT/2)<<16)|TS_WIDTH); saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT<<16)|TS_WIDTH);
saa7146_write(dev, MC2, (MASK_04 | MASK_20)); saa7146_write(dev, MC2, (MASK_04 | MASK_20));
saa7146_write(dev, MC1, (MASK_04 | MASK_20)); // DMA3 on saa7146_write(dev, MC1, (MASK_04 | MASK_20)); // DMA3 on
...@@ -80,14 +80,11 @@ static void vpeirq (unsigned long data) ...@@ -80,14 +80,11 @@ static void vpeirq (unsigned long data)
return; return;
if (newdma > olddma) { /* no wraparound, dump olddma..newdma */ if (newdma > olddma) { /* no wraparound, dump olddma..newdma */
if(mem[olddma] == 0x47)
dvb_dmx_swfilter_packets(&budget->demux, dvb_dmx_swfilter_packets(&budget->demux,
mem+olddma, (newdma-olddma) / 188); mem+olddma, (newdma-olddma) / 188);
} else { /* wraparound, dump olddma..buflen and 0..newdma */ } else { /* wraparound, dump olddma..buflen and 0..newdma */
if(mem[olddma] == 0x47)
dvb_dmx_swfilter_packets(&budget->demux, dvb_dmx_swfilter_packets(&budget->demux,
mem+olddma, (TS_BUFLEN-olddma) / 188); mem+olddma, (TS_BUFLEN-olddma) / 188);
if(mem[0] == 0x47)
dvb_dmx_swfilter_packets(&budget->demux, dvb_dmx_swfilter_packets(&budget->demux,
mem, newdma / 188); mem, newdma / 188);
} }
......
...@@ -192,7 +192,6 @@ static struct saa7146_extension budget_extension; ...@@ -192,7 +192,6 @@ static struct saa7146_extension budget_extension;
MAKE_BUDGET_INFO(ttbs, "TT-Budget/WinTV-NOVA-S PCI", BUDGET_TT); MAKE_BUDGET_INFO(ttbs, "TT-Budget/WinTV-NOVA-S PCI", BUDGET_TT);
MAKE_BUDGET_INFO(ttbc, "TT-Budget/WinTV-NOVA-C PCI", BUDGET_TT); MAKE_BUDGET_INFO(ttbc, "TT-Budget/WinTV-NOVA-C PCI", BUDGET_TT);
MAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); MAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT);
MAKE_BUDGET_INFO(ttbt2, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT);
MAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI", BUDGET_TT_HW_DISEQC); MAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI", BUDGET_TT_HW_DISEQC);
/* Uncomment for Budget Patch */ /* Uncomment for Budget Patch */
/*MAKE_BUDGET_INFO(fs_1_3,"Siemens/Technotrend/Hauppauge PCI rev1.3+Budget_Patch", BUDGET_PATCH);*/ /*MAKE_BUDGET_INFO(fs_1_3,"Siemens/Technotrend/Hauppauge PCI rev1.3+Budget_Patch", BUDGET_PATCH);*/
...@@ -203,7 +202,6 @@ static struct pci_device_id pci_tbl[] = { ...@@ -203,7 +202,6 @@ static struct pci_device_id pci_tbl[] = {
MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1003), MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1003),
MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004), MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004),
MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005), MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005),
MAKE_EXTENSION_PCI(ttbt2, 0x13c2, 0x1011),
MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013),
{ {
.vendor = 0, .vendor = 0,
......
config DVB_TTUSB_BUDGET config DVB_TTUSB_BUDGET
tristate "Technotrend/Hauppauge Nova-USB devices" tristate "Technotrend/Hauppauge Nova-USB devices"
depends on DVB_CORE && USB depends on DVB_CORE
help help
Support for external USB adapters designed by Technotrend and Support for external USB adapters designed by Technotrend and
produced by Hauppauge, shipped under the brand name 'Nova-USB'. produced by Hauppauge, shipped under the brand name 'Nova-USB'.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# #
menu "Video For Linux" menu "Video For Linux"
depends on VIDEO_DEV!=n depends on VIDEO_DEV
comment "Video Adapters" comment "Video Adapters"
...@@ -228,7 +228,8 @@ config VIDEO_SAA7134 ...@@ -228,7 +228,8 @@ config VIDEO_SAA7134
config VIDEO_MXB config VIDEO_MXB
tristate "Siemens-Nixdorf 'Multimedia eXtension Board'" tristate "Siemens-Nixdorf 'Multimedia eXtension Board'"
depends on VIDEO_DEV && PCI && I2C depends on VIDEO_DEV && PCI
select VIDEO_SAA7146_VV
---help--- ---help---
This is a video4linux driver for the 'Multimedia eXtension Board' This is a video4linux driver for the 'Multimedia eXtension Board'
TV card by Siemens-Nixdorf. TV card by Siemens-Nixdorf.
...@@ -238,7 +239,8 @@ config VIDEO_MXB ...@@ -238,7 +239,8 @@ config VIDEO_MXB
config VIDEO_DPC config VIDEO_DPC
tristate "Philips-Semiconductors 'dpc7146 demonstration board'" tristate "Philips-Semiconductors 'dpc7146 demonstration board'"
depends on VIDEO_DEV && PCI && I2C depends on VIDEO_DEV && PCI
select VIDEO_SAA7146_VV
---help--- ---help---
This is a video4linux driver for the 'dpc7146 demonstration This is a video4linux driver for the 'dpc7146 demonstration
board' by Philips-Semiconductors. It's the reference design board' by Philips-Semiconductors. It's the reference design
...@@ -251,7 +253,8 @@ config VIDEO_DPC ...@@ -251,7 +253,8 @@ config VIDEO_DPC
config VIDEO_HEXIUM_ORION config VIDEO_HEXIUM_ORION
tristate "Hexium HV-PCI6 and Orion frame grabber" tristate "Hexium HV-PCI6 and Orion frame grabber"
depends on VIDEO_DEV && PCI && I2C depends on VIDEO_DEV && PCI
select VIDEO_SAA7146_VV
---help--- ---help---
This is a video4linux driver for the Hexium HV-PCI6 and This is a video4linux driver for the Hexium HV-PCI6 and
Orion frame grabber cards by Hexium. Orion frame grabber cards by Hexium.
...@@ -261,7 +264,8 @@ config VIDEO_HEXIUM_ORION ...@@ -261,7 +264,8 @@ config VIDEO_HEXIUM_ORION
config VIDEO_HEXIUM_GEMINI config VIDEO_HEXIUM_GEMINI
tristate "Hexium Gemini frame grabber" tristate "Hexium Gemini frame grabber"
depends on VIDEO_DEV && PCI && I2C depends on VIDEO_DEV && PCI
select VIDEO_SAA7146_VV
---help--- ---help---
This is a video4linux driver for the Hexium Gemini frame This is a video4linux driver for the Hexium Gemini frame
grabber card by Hexium. Please note that the Gemini Dual grabber card by Hexium. Please note that the Gemini Dual
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
/* We use a weird value for RAM, not just 0, for testing purposes. /* We use a weird value for RAM, not just 0, for testing purposes.
These must match the values used in the linker script. */ These must match the values used in the linker script. */
#define RAM_ADDR 0x8F000000 #define RAM_ADDR 0x8F000000
#define RAM_SIZE 0x01000000 #define RAM_SIZE 0x03000000
/* For <asm/page.h> */ /* For <asm/page.h> */
......
...@@ -38,11 +38,7 @@ ...@@ -38,11 +38,7 @@
#define ERAM_SIZE 0x07f00000 /* 127MB (max) */ #define ERAM_SIZE 0x07f00000 /* 127MB (max) */
/* Dynamic RAM; uses memory controller. */ /* Dynamic RAM; uses memory controller. */
#define SDRAM_ADDR 0x10000000 #define SDRAM_ADDR 0x10000000
#if 0
#define SDRAM_SIZE 0x01000000 /* 16MB */ #define SDRAM_SIZE 0x01000000 /* 16MB */
#else
#define SDRAM_SIZE 0x00200000 /* Only use 2MB for testing */
#endif
/* Simulator specific control registers. */ /* Simulator specific control registers. */
......
...@@ -2773,6 +2773,7 @@ void ptrinfo(unsigned long addr) ...@@ -2773,6 +2773,7 @@ void ptrinfo(unsigned long addr)
printk("virt addr invalid.\n"); printk("virt addr invalid.\n");
return; return;
} }
#ifdef CONFIG_MMU
do { do {
pgd_t *pgd = pgd_offset_k(addr); pgd_t *pgd = pgd_offset_k(addr);
pmd_t *pmd; pmd_t *pmd;
...@@ -2794,6 +2795,7 @@ void ptrinfo(unsigned long addr) ...@@ -2794,6 +2795,7 @@ void ptrinfo(unsigned long addr)
printk("normal page, pte_val 0x%llx\n", printk("normal page, pte_val 0x%llx\n",
(unsigned long long)pte_val(*pte_offset_kernel(pmd, addr))); (unsigned long long)pte_val(*pte_offset_kernel(pmd, addr)));
} while(0); } while(0);
#endif
page = virt_to_page((void*)addr); page = virt_to_page((void*)addr);
printk("struct page at %p, flags %lxh.\n", page, page->flags); printk("struct page at %p, flags %lxh.\n", page, page->flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment