Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
bd53afd8
Commit
bd53afd8
authored
Jul 28, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://gkernel.bkbits.net/misc-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
628505a0
1b09d7af
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
119 additions
and
83 deletions
+119
-83
drivers/video/cirrusfb.c
drivers/video/cirrusfb.c
+1
-1
sound/oss/i810_audio.c
sound/oss/i810_audio.c
+118
-82
No files found.
drivers/video/cirrusfb.c
View file @
bd53afd8
...
@@ -2142,7 +2142,7 @@ static void get_pci_addrs (const struct pci_dev *pdev,
...
@@ -2142,7 +2142,7 @@ static void get_pci_addrs (const struct pci_dev *pdev,
}
}
static
void
__devexit
cirrusfb_pci_unmap
(
struct
cirrusfb_info
*
cinfo
)
static
void
cirrusfb_pci_unmap
(
struct
cirrusfb_info
*
cinfo
)
{
{
struct
pci_dev
*
pdev
=
cinfo
->
pdev
;
struct
pci_dev
*
pdev
=
cinfo
->
pdev
;
...
...
sound/oss/i810_audio.c
View file @
bd53afd8
...
@@ -450,12 +450,38 @@ struct i810_card {
...
@@ -450,12 +450,38 @@ struct i810_card {
/* extract register offset from codec struct */
/* extract register offset from codec struct */
#define IO_REG_OFF(codec) (((struct i810_card *) codec->private_data)->ac97_id_map[codec->id])
#define IO_REG_OFF(codec) (((struct i810_card *) codec->private_data)->ac97_id_map[codec->id])
#define GET_CIV(port) MODULOP2(inb((port) + OFF_CIV), SG_LEN)
#define I810_IOREAD(size, type, card, off) \
#define GET_LVI(port) MODULOP2(inb((port) + OFF_LVI), SG_LEN)
({ \
type val; \
if (card->use_mmio) \
val=read##size(card->iobase_mmio+off); \
else \
val=in##size(card->iobase+off); \
val; \
})
#define I810_IOREADL(card, off) I810_IOREAD(l, u32, card, off)
#define I810_IOREADW(card, off) I810_IOREAD(w, u16, card, off)
#define I810_IOREADB(card, off) I810_IOREAD(b, u8, card, off)
#define I810_IOWRITE(size, val, card, off) \
({ \
if (card->use_mmio) \
write##size(val, card->iobase_mmio+off); \
else \
out##size(val, card->iobase+off); \
})
#define I810_IOWRITEL(val, card, off) I810_IOWRITE(l, val, card, off)
#define I810_IOWRITEW(val, card, off) I810_IOWRITE(w, val, card, off)
#define I810_IOWRITEB(val, card, off) I810_IOWRITE(b, val, card, off)
#define GET_CIV(card, port) MODULOP2(I810_IOREADB((card), (port) + OFF_CIV), SG_LEN)
#define GET_LVI(card, port) MODULOP2(I810_IOREADB((card), (port) + OFF_LVI), SG_LEN)
/* set LVI from CIV */
/* set LVI from CIV */
#define CIV_TO_LVI(port, off) \
#define CIV_TO_LVI(
card,
port, off) \
outb(MODULOP2(GET_CIV((port)) + (off), SG_LEN
), (port) + OFF_LVI)
I810_IOWRITEB(MODULOP2(GET_CIV((card), (port)) + (off), SG_LEN), (card
), (port) + OFF_LVI)
static
struct
i810_card
*
devs
=
NULL
;
static
struct
i810_card
*
devs
=
NULL
;
...
@@ -714,9 +740,9 @@ static inline unsigned i810_get_dma_addr(struct i810_state *state, int rec)
...
@@ -714,9 +740,9 @@ static inline unsigned i810_get_dma_addr(struct i810_state *state, int rec)
return
0
;
return
0
;
if
(
rec
)
if
(
rec
)
port
=
state
->
card
->
iobase
+
dmabuf
->
read_channel
->
port
;
port
=
dmabuf
->
read_channel
->
port
;
else
else
port
=
state
->
card
->
iobase
+
dmabuf
->
write_channel
->
port
;
port
=
dmabuf
->
write_channel
->
port
;
if
(
state
->
card
->
pci_id
==
PCI_DEVICE_ID_SI_7012
)
{
if
(
state
->
card
->
pci_id
==
PCI_DEVICE_ID_SI_7012
)
{
port_picb
=
port
+
OFF_SR
;
port_picb
=
port
+
OFF_SR
;
...
@@ -725,8 +751,8 @@ static inline unsigned i810_get_dma_addr(struct i810_state *state, int rec)
...
@@ -725,8 +751,8 @@ static inline unsigned i810_get_dma_addr(struct i810_state *state, int rec)
port_picb
=
port
+
OFF_PICB
;
port_picb
=
port
+
OFF_PICB
;
do
{
do
{
civ
=
GET_CIV
(
port
);
civ
=
GET_CIV
(
state
->
card
,
port
);
offset
=
inw
(
port_picb
);
offset
=
I810_IOREADW
(
state
->
card
,
port_picb
);
/* Must have a delay here! */
/* Must have a delay here! */
if
(
offset
==
0
)
if
(
offset
==
0
)
udelay
(
1
);
udelay
(
1
);
...
@@ -745,7 +771,7 @@ static inline unsigned i810_get_dma_addr(struct i810_state *state, int rec)
...
@@ -745,7 +771,7 @@ static inline unsigned i810_get_dma_addr(struct i810_state *state, int rec)
* that we won't have to worry about the chip still being
* that we won't have to worry about the chip still being
* out of sync with reality ;-)
* out of sync with reality ;-)
*/
*/
}
while
(
civ
!=
GET_CIV
(
port
)
||
offset
!=
inw
(
port_picb
));
}
while
(
civ
!=
GET_CIV
(
state
->
card
,
port
)
||
offset
!=
I810_IOREADW
(
state
->
card
,
port_picb
));
return
(((
civ
+
1
)
*
dmabuf
->
fragsize
-
(
bytes
*
offset
))
return
(((
civ
+
1
)
*
dmabuf
->
fragsize
-
(
bytes
*
offset
))
%
dmabuf
->
dmasize
);
%
dmabuf
->
dmasize
);
...
@@ -758,15 +784,15 @@ static inline void __stop_adc(struct i810_state *state)
...
@@ -758,15 +784,15 @@ static inline void __stop_adc(struct i810_state *state)
struct
i810_card
*
card
=
state
->
card
;
struct
i810_card
*
card
=
state
->
card
;
dmabuf
->
enable
&=
~
ADC_RUNNING
;
dmabuf
->
enable
&=
~
ADC_RUNNING
;
outb
(
0
,
card
->
iobase
+
PI_CR
);
I810_IOWRITEB
(
0
,
card
,
PI_CR
);
// wait for the card to acknowledge shutdown
// wait for the card to acknowledge shutdown
while
(
inb
(
card
->
iobase
+
PI_CR
)
!=
0
)
;
while
(
I810_IOREADB
(
card
,
PI_CR
)
!=
0
)
;
// now clear any latent interrupt bits (like the halt bit)
// now clear any latent interrupt bits (like the halt bit)
if
(
card
->
pci_id
==
PCI_DEVICE_ID_SI_7012
)
if
(
card
->
pci_id
==
PCI_DEVICE_ID_SI_7012
)
outb
(
inb
(
card
->
iobase
+
PI_PICB
),
card
->
iobase
+
PI_PICB
);
I810_IOWRITEB
(
I810_IOREADB
(
card
,
PI_PICB
),
card
,
PI_PICB
);
else
else
outb
(
inb
(
card
->
iobase
+
PI_SR
),
card
->
iobase
+
PI_SR
);
I810_IOWRITEB
(
I810_IOREADB
(
card
,
PI_SR
),
card
,
PI_SR
);
outl
(
inl
(
card
->
iobase
+
GLOB_STA
)
&
INT_PI
,
card
->
iobase
+
GLOB_STA
);
I810_IOWRITEL
(
I810_IOREADL
(
card
,
GLOB_STA
)
&
INT_PI
,
card
,
GLOB_STA
);
}
}
static
void
stop_adc
(
struct
i810_state
*
state
)
static
void
stop_adc
(
struct
i810_state
*
state
)
...
@@ -787,7 +813,7 @@ static inline void __start_adc(struct i810_state *state)
...
@@ -787,7 +813,7 @@ static inline void __start_adc(struct i810_state *state)
(
dmabuf
->
trigger
&
PCM_ENABLE_INPUT
))
{
(
dmabuf
->
trigger
&
PCM_ENABLE_INPUT
))
{
dmabuf
->
enable
|=
ADC_RUNNING
;
dmabuf
->
enable
|=
ADC_RUNNING
;
// Interrupt enable, LVI enable, DMA enable
// Interrupt enable, LVI enable, DMA enable
outb
(
0x10
|
0x04
|
0x01
,
state
->
card
->
iobase
+
PI_CR
);
I810_IOWRITEB
(
0x10
|
0x04
|
0x01
,
state
->
card
,
PI_CR
);
}
}
}
}
...
@@ -808,15 +834,15 @@ static inline void __stop_dac(struct i810_state *state)
...
@@ -808,15 +834,15 @@ static inline void __stop_dac(struct i810_state *state)
struct
i810_card
*
card
=
state
->
card
;
struct
i810_card
*
card
=
state
->
card
;
dmabuf
->
enable
&=
~
DAC_RUNNING
;
dmabuf
->
enable
&=
~
DAC_RUNNING
;
outb
(
0
,
card
->
iobase
+
PO_CR
);
I810_IOWRITEB
(
0
,
card
,
PO_CR
);
// wait for the card to acknowledge shutdown
// wait for the card to acknowledge shutdown
while
(
inb
(
card
->
iobase
+
PO_CR
)
!=
0
)
;
while
(
I810_IOREADB
(
card
,
PO_CR
)
!=
0
)
;
// now clear any latent interrupt bits (like the halt bit)
// now clear any latent interrupt bits (like the halt bit)
if
(
card
->
pci_id
==
PCI_DEVICE_ID_SI_7012
)
if
(
card
->
pci_id
==
PCI_DEVICE_ID_SI_7012
)
outb
(
inb
(
card
->
iobase
+
PO_PICB
),
card
->
iobase
+
PO_PICB
);
I810_IOWRITEB
(
I810_IOREADB
(
card
,
PO_PICB
),
card
,
PO_PICB
);
else
else
outb
(
inb
(
card
->
iobase
+
PO_SR
),
card
->
iobase
+
PO_SR
);
I810_IOWRITEB
(
I810_IOREADB
(
card
,
PO_SR
),
card
,
PO_SR
);
outl
(
inl
(
card
->
iobase
+
GLOB_STA
)
&
INT_PO
,
card
->
iobase
+
GLOB_STA
);
I810_IOWRITEL
(
I810_IOREADL
(
card
,
GLOB_STA
)
&
INT_PO
,
card
,
GLOB_STA
);
}
}
static
void
stop_dac
(
struct
i810_state
*
state
)
static
void
stop_dac
(
struct
i810_state
*
state
)
...
@@ -837,7 +863,7 @@ static inline void __start_dac(struct i810_state *state)
...
@@ -837,7 +863,7 @@ static inline void __start_dac(struct i810_state *state)
(
dmabuf
->
trigger
&
PCM_ENABLE_OUTPUT
))
{
(
dmabuf
->
trigger
&
PCM_ENABLE_OUTPUT
))
{
dmabuf
->
enable
|=
DAC_RUNNING
;
dmabuf
->
enable
|=
DAC_RUNNING
;
// Interrupt enable, LVI enable, DMA enable
// Interrupt enable, LVI enable, DMA enable
outb
(
0x10
|
0x04
|
0x01
,
state
->
card
->
iobase
+
PO_CR
);
I810_IOWRITEB
(
0x10
|
0x04
|
0x01
,
state
->
card
,
PO_CR
);
}
}
}
}
static
void
start_dac
(
struct
i810_state
*
state
)
static
void
start_dac
(
struct
i810_state
*
state
)
...
@@ -1000,12 +1026,12 @@ static int prog_dmabuf(struct i810_state *state, unsigned rec)
...
@@ -1000,12 +1026,12 @@ static int prog_dmabuf(struct i810_state *state, unsigned rec)
sg
++
;
sg
++
;
}
}
spin_lock_irqsave
(
&
state
->
card
->
lock
,
flags
);
spin_lock_irqsave
(
&
state
->
card
->
lock
,
flags
);
outb
(
2
,
state
->
card
->
iobase
+
c
->
port
+
OFF_CR
);
/* reset DMA machine */
I810_IOWRITEB
(
2
,
state
->
card
,
c
->
port
+
OFF_CR
);
/* reset DMA machine */
while
(
inb
(
state
->
card
->
iobase
+
c
->
port
+
OFF_CR
)
&
0x02
)
;
while
(
I810_IOREADB
(
state
->
card
,
c
->
port
+
OFF_CR
)
&
0x02
)
;
outl
((
u32
)
state
->
card
->
chandma
+
I810_IOWRITEL
((
u32
)
state
->
card
->
chandma
+
c
->
num
*
sizeof
(
struct
i810_channel
),
c
->
num
*
sizeof
(
struct
i810_channel
),
state
->
card
->
iobase
+
c
->
port
+
OFF_BDBAR
);
state
->
card
,
c
->
port
+
OFF_BDBAR
);
CIV_TO_LVI
(
state
->
card
->
iobase
+
c
->
port
,
0
);
CIV_TO_LVI
(
state
->
card
,
c
->
port
,
0
);
spin_unlock_irqrestore
(
&
state
->
card
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
state
->
card
->
lock
,
flags
);
...
@@ -1037,14 +1063,13 @@ static void __i810_update_lvi(struct i810_state *state, int rec)
...
@@ -1037,14 +1063,13 @@ static void __i810_update_lvi(struct i810_state *state, int rec)
void
(
*
start
)(
struct
i810_state
*
);
void
(
*
start
)(
struct
i810_state
*
);
count
=
dmabuf
->
count
;
count
=
dmabuf
->
count
;
port
=
state
->
card
->
iobase
;
if
(
rec
)
{
if
(
rec
)
{
port
+
=
dmabuf
->
read_channel
->
port
;
port
=
dmabuf
->
read_channel
->
port
;
trigger
=
PCM_ENABLE_INPUT
;
trigger
=
PCM_ENABLE_INPUT
;
start
=
__start_adc
;
start
=
__start_adc
;
count
=
dmabuf
->
dmasize
-
count
;
count
=
dmabuf
->
dmasize
-
count
;
}
else
{
}
else
{
port
+
=
dmabuf
->
write_channel
->
port
;
port
=
dmabuf
->
write_channel
->
port
;
trigger
=
PCM_ENABLE_OUTPUT
;
trigger
=
PCM_ENABLE_OUTPUT
;
start
=
__start_dac
;
start
=
__start_dac
;
}
}
...
@@ -1059,14 +1084,14 @@ static void __i810_update_lvi(struct i810_state *state, int rec)
...
@@ -1059,14 +1084,14 @@ static void __i810_update_lvi(struct i810_state *state, int rec)
return
;
return
;
start
(
state
);
start
(
state
);
while
(
!
(
inb
(
port
+
OFF_CR
)
&
((
1
<<
4
)
|
(
1
<<
2
))))
while
(
!
(
I810_IOREADB
(
state
->
card
,
port
+
OFF_CR
)
&
((
1
<<
4
)
|
(
1
<<
2
))))
;
;
}
}
/* MASKP2(swptr, fragsize) - 1 is the tail of our transfer */
/* MASKP2(swptr, fragsize) - 1 is the tail of our transfer */
x
=
MODULOP2
(
MASKP2
(
dmabuf
->
swptr
,
fragsize
)
-
1
,
dmabuf
->
dmasize
);
x
=
MODULOP2
(
MASKP2
(
dmabuf
->
swptr
,
fragsize
)
-
1
,
dmabuf
->
dmasize
);
x
>>=
dmabuf
->
fragshift
;
x
>>=
dmabuf
->
fragshift
;
outb
(
x
,
port
+
OFF_LVI
);
I810_IOWRITEB
(
x
,
state
->
card
,
port
+
OFF_LVI
);
}
}
static
void
i810_update_lvi
(
struct
i810_state
*
state
,
int
rec
)
static
void
i810_update_lvi
(
struct
i810_state
*
state
,
int
rec
)
...
@@ -1108,8 +1133,8 @@ static void i810_update_ptr(struct i810_state *state)
...
@@ -1108,8 +1133,8 @@ static void i810_update_ptr(struct i810_state *state)
/* this is normal for the end of a read */
/* this is normal for the end of a read */
/* only give an error if we went past the */
/* only give an error if we went past the */
/* last valid sg entry */
/* last valid sg entry */
if
(
GET_CIV
(
state
->
card
->
iobase
+
PI_BASE
)
!=
if
(
GET_CIV
(
state
->
card
,
PI_BASE
)
!=
GET_LVI
(
state
->
card
->
iobase
+
PI_BASE
))
{
GET_LVI
(
state
->
card
,
PI_BASE
))
{
printk
(
KERN_WARNING
"i810_audio: DMA overrun on read
\n
"
);
printk
(
KERN_WARNING
"i810_audio: DMA overrun on read
\n
"
);
dmabuf
->
error
++
;
dmabuf
->
error
++
;
}
}
...
@@ -1133,13 +1158,13 @@ static void i810_update_ptr(struct i810_state *state)
...
@@ -1133,13 +1158,13 @@ static void i810_update_ptr(struct i810_state *state)
/* this is normal for the end of a write */
/* this is normal for the end of a write */
/* only give an error if we went past the */
/* only give an error if we went past the */
/* last valid sg entry */
/* last valid sg entry */
if
(
GET_CIV
(
state
->
card
->
iobase
+
PO_BASE
)
!=
if
(
GET_CIV
(
state
->
card
,
PO_BASE
)
!=
GET_LVI
(
state
->
card
->
iobase
+
PO_BASE
))
{
GET_LVI
(
state
->
card
,
PO_BASE
))
{
printk
(
KERN_WARNING
"i810_audio: DMA overrun on write
\n
"
);
printk
(
KERN_WARNING
"i810_audio: DMA overrun on write
\n
"
);
printk
(
"i810_audio: CIV %d, LVI %d, hwptr %x, "
printk
(
"i810_audio: CIV %d, LVI %d, hwptr %x, "
"count %d
\n
"
,
"count %d
\n
"
,
GET_CIV
(
state
->
card
->
iobase
+
PO_BASE
),
GET_CIV
(
state
->
card
,
PO_BASE
),
GET_LVI
(
state
->
card
->
iobase
+
PO_BASE
),
GET_LVI
(
state
->
card
,
PO_BASE
),
dmabuf
->
hwptr
,
dmabuf
->
count
);
dmabuf
->
hwptr
,
dmabuf
->
count
);
dmabuf
->
error
++
;
dmabuf
->
error
++
;
}
}
...
@@ -1287,7 +1312,7 @@ static void i810_channel_interrupt(struct i810_card *card)
...
@@ -1287,7 +1312,7 @@ static void i810_channel_interrupt(struct i810_card *card)
struct
i810_state
*
state
=
card
->
states
[
i
];
struct
i810_state
*
state
=
card
->
states
[
i
];
struct
i810_channel
*
c
;
struct
i810_channel
*
c
;
struct
dmabuf
*
dmabuf
;
struct
dmabuf
*
dmabuf
;
unsigned
long
port
=
card
->
iobase
;
unsigned
long
port
;
u16
status
;
u16
status
;
if
(
!
state
)
if
(
!
state
)
...
@@ -1302,12 +1327,12 @@ static void i810_channel_interrupt(struct i810_card *card)
...
@@ -1302,12 +1327,12 @@ static void i810_channel_interrupt(struct i810_card *card)
}
else
/* This can occur going from R/W to close */
}
else
/* This can occur going from R/W to close */
continue
;
continue
;
port
+=
c
->
port
;
port
=
c
->
port
;
if
(
card
->
pci_id
==
PCI_DEVICE_ID_SI_7012
)
if
(
card
->
pci_id
==
PCI_DEVICE_ID_SI_7012
)
status
=
inw
(
port
+
OFF_PICB
);
status
=
I810_IOREADW
(
card
,
port
+
OFF_PICB
);
else
else
status
=
inw
(
port
+
OFF_SR
);
status
=
I810_IOREADW
(
card
,
port
+
OFF_SR
);
#ifdef DEBUG_INTERRUPTS
#ifdef DEBUG_INTERRUPTS
printk
(
"NUM %d PORT %X IRQ ( ST%d "
,
c
->
num
,
c
->
port
,
status
);
printk
(
"NUM %d PORT %X IRQ ( ST%d "
,
c
->
num
,
c
->
port
,
status
);
...
@@ -1340,7 +1365,7 @@ static void i810_channel_interrupt(struct i810_card *card)
...
@@ -1340,7 +1365,7 @@ static void i810_channel_interrupt(struct i810_card *card)
if
(
dmabuf
->
enable
&
ADC_RUNNING
)
if
(
dmabuf
->
enable
&
ADC_RUNNING
)
count
=
dmabuf
->
dmasize
-
count
;
count
=
dmabuf
->
dmasize
-
count
;
if
(
count
>=
(
int
)
dmabuf
->
fragsize
)
{
if
(
count
>=
(
int
)
dmabuf
->
fragsize
)
{
outb
(
inb
(
port
+
OFF_CR
)
|
1
,
port
+
OFF_CR
);
I810_IOWRITEB
(
I810_IOREADB
(
card
,
port
+
OFF_CR
)
|
1
,
card
,
port
+
OFF_CR
);
#ifdef DEBUG_INTERRUPTS
#ifdef DEBUG_INTERRUPTS
printk
(
" CONTINUE "
);
printk
(
" CONTINUE "
);
#endif
#endif
...
@@ -1356,9 +1381,9 @@ static void i810_channel_interrupt(struct i810_card *card)
...
@@ -1356,9 +1381,9 @@ static void i810_channel_interrupt(struct i810_card *card)
}
}
}
}
if
(
card
->
pci_id
==
PCI_DEVICE_ID_SI_7012
)
if
(
card
->
pci_id
==
PCI_DEVICE_ID_SI_7012
)
outw
(
status
&
DMA_INT_MASK
,
port
+
OFF_PICB
);
I810_IOWRITEW
(
status
&
DMA_INT_MASK
,
card
,
port
+
OFF_PICB
);
else
else
outw
(
status
&
DMA_INT_MASK
,
port
+
OFF_SR
);
I810_IOWRITEW
(
status
&
DMA_INT_MASK
,
card
,
port
+
OFF_SR
);
}
}
#ifdef DEBUG_INTERRUPTS
#ifdef DEBUG_INTERRUPTS
printk
(
")
\n
"
);
printk
(
")
\n
"
);
...
@@ -1372,7 +1397,7 @@ static irqreturn_t i810_interrupt(int irq, void *dev_id, struct pt_regs *regs)
...
@@ -1372,7 +1397,7 @@ static irqreturn_t i810_interrupt(int irq, void *dev_id, struct pt_regs *regs)
spin_lock
(
&
card
->
lock
);
spin_lock
(
&
card
->
lock
);
status
=
inl
(
card
->
iobase
+
GLOB_STA
);
status
=
I810_IOREADL
(
card
,
GLOB_STA
);
if
(
!
(
status
&
INT_MASK
))
if
(
!
(
status
&
INT_MASK
))
{
{
...
@@ -1384,7 +1409,7 @@ static irqreturn_t i810_interrupt(int irq, void *dev_id, struct pt_regs *regs)
...
@@ -1384,7 +1409,7 @@ static irqreturn_t i810_interrupt(int irq, void *dev_id, struct pt_regs *regs)
i810_channel_interrupt
(
card
);
i810_channel_interrupt
(
card
);
/* clear 'em */
/* clear 'em */
outl
(
status
&
INT_MASK
,
card
->
iobase
+
GLOB_STA
);
I810_IOWRITEL
(
status
&
INT_MASK
,
card
,
GLOB_STA
);
spin_unlock
(
&
card
->
lock
);
spin_unlock
(
&
card
->
lock
);
return
IRQ_HANDLED
;
return
IRQ_HANDLED
;
}
}
...
@@ -1784,13 +1809,13 @@ static int i810_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -1784,13 +1809,13 @@ static int i810_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
__stop_adc
(
state
);
__stop_adc
(
state
);
}
}
if
(
c
!=
NULL
)
{
if
(
c
!=
NULL
)
{
outb
(
2
,
state
->
card
->
iobase
+
c
->
port
+
OFF_CR
);
/* reset DMA machine */
I810_IOWRITEB
(
2
,
state
->
card
,
c
->
port
+
OFF_CR
);
/* reset DMA machine */
while
(
inb
(
state
->
card
->
iobase
+
c
->
port
+
OFF_CR
)
&
2
)
while
(
I810_IOREADB
(
state
->
card
,
c
->
port
+
OFF_CR
)
&
2
)
cpu_relax
();
cpu_relax
();
outl
((
u32
)
state
->
card
->
chandma
+
I810_IOWRITEL
((
u32
)
state
->
card
->
chandma
+
c
->
num
*
sizeof
(
struct
i810_channel
),
c
->
num
*
sizeof
(
struct
i810_channel
),
state
->
card
->
iobase
+
c
->
port
+
OFF_BDBAR
);
state
->
card
,
c
->
port
+
OFF_BDBAR
);
CIV_TO_LVI
(
state
->
card
->
iobase
+
c
->
port
,
0
);
CIV_TO_LVI
(
state
->
card
,
c
->
port
,
0
);
}
}
spin_unlock_irqrestore
(
&
state
->
card
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
state
->
card
->
lock
,
flags
);
...
@@ -1920,7 +1945,7 @@ static int i810_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -1920,7 +1945,7 @@ static int i810_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
/* Global Status and Global Control register are now */
/* Global Status and Global Control register are now */
/* used to indicate this. */
/* used to indicate this. */
i_glob_cnt
=
inl
(
state
->
card
->
iobase
+
GLOB_CNT
);
i_glob_cnt
=
I810_IOREADL
(
state
->
card
,
GLOB_CNT
);
/* Current # of channels enabled */
/* Current # of channels enabled */
if
(
i_glob_cnt
&
0x0100000
)
if
(
i_glob_cnt
&
0x0100000
)
...
@@ -1932,14 +1957,14 @@ static int i810_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -1932,14 +1957,14 @@ static int i810_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
switch
(
val
)
{
switch
(
val
)
{
case
2
:
/* 2 channels is always supported */
case
2
:
/* 2 channels is always supported */
outl
(
i_glob_cnt
&
0xffcfffff
,
I810_IOWRITEL
(
i_glob_cnt
&
0xffcfffff
,
state
->
card
->
iobase
+
GLOB_CNT
);
state
->
card
,
GLOB_CNT
);
/* Do we need to change mixer settings???? */
/* Do we need to change mixer settings???? */
break
;
break
;
case
4
:
/* Supported on some chipsets, better check first */
case
4
:
/* Supported on some chipsets, better check first */
if
(
state
->
card
->
channels
>=
4
)
{
if
(
state
->
card
->
channels
>=
4
)
{
outl
((
i_glob_cnt
&
0xffcfffff
)
|
0x100000
,
I810_IOWRITEL
((
i_glob_cnt
&
0xffcfffff
)
|
0x100000
,
state
->
card
->
iobase
+
GLOB_CNT
);
state
->
card
,
GLOB_CNT
);
/* Do we need to change mixer settings??? */
/* Do we need to change mixer settings??? */
}
else
{
}
else
{
val
=
ret
;
val
=
ret
;
...
@@ -1947,8 +1972,8 @@ static int i810_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -1947,8 +1972,8 @@ static int i810_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
break
;
break
;
case
6
:
/* Supported on some chipsets, better check first */
case
6
:
/* Supported on some chipsets, better check first */
if
(
state
->
card
->
channels
>=
6
)
{
if
(
state
->
card
->
channels
>=
6
)
{
outl
((
i_glob_cnt
&
0xffcfffff
)
|
0x200000
,
I810_IOWRITEL
((
i_glob_cnt
&
0xffcfffff
)
|
0x200000
,
state
->
card
->
iobase
+
GLOB_CNT
);
state
->
card
,
GLOB_CNT
);
/* Do we need to change mixer settings??? */
/* Do we need to change mixer settings??? */
}
else
{
}
else
{
val
=
ret
;
val
=
ret
;
...
@@ -2477,8 +2502,8 @@ static int i810_open(struct inode *inode, struct file *file)
...
@@ -2477,8 +2502,8 @@ static int i810_open(struct inode *inode, struct file *file)
}
else
{
}
else
{
i810_set_dac_rate
(
state
,
8000
);
i810_set_dac_rate
(
state
,
8000
);
/* Put the ACLink in 2 channel mode by default */
/* Put the ACLink in 2 channel mode by default */
i
=
inl
(
card
->
iobase
+
GLOB_CNT
);
i
=
I810_IOREADL
(
card
,
GLOB_CNT
);
outl
(
i
&
0xffcfffff
,
card
->
iobase
+
GLOB_CNT
);
I810_IOWRITEL
(
i
&
0xffcfffff
,
card
,
GLOB_CNT
);
}
}
}
}
...
@@ -2569,7 +2594,7 @@ static u16 i810_ac97_get_io(struct ac97_codec *dev, u8 reg)
...
@@ -2569,7 +2594,7 @@ static u16 i810_ac97_get_io(struct ac97_codec *dev, u8 reg)
int
count
=
100
;
int
count
=
100
;
u16
reg_set
=
IO_REG_OFF
(
dev
)
|
(
reg
&
0x7f
);
u16
reg_set
=
IO_REG_OFF
(
dev
)
|
(
reg
&
0x7f
);
while
(
count
--
&&
(
inb
(
card
->
iobase
+
CAS
)
&
1
))
while
(
count
--
&&
(
I810_IOREADB
(
card
,
CAS
)
&
1
))
udelay
(
1
);
udelay
(
1
);
return
inw
(
card
->
ac97base
+
reg_set
);
return
inw
(
card
->
ac97base
+
reg_set
);
...
@@ -2597,7 +2622,7 @@ static void i810_ac97_set_io(struct ac97_codec *dev, u8 reg, u16 data)
...
@@ -2597,7 +2622,7 @@ static void i810_ac97_set_io(struct ac97_codec *dev, u8 reg, u16 data)
int
count
=
100
;
int
count
=
100
;
u16
reg_set
=
IO_REG_OFF
(
dev
)
|
(
reg
&
0x7f
);
u16
reg_set
=
IO_REG_OFF
(
dev
)
|
(
reg
&
0x7f
);
while
(
count
--
&&
(
inb
(
card
->
iobase
+
CAS
)
&
1
))
while
(
count
--
&&
(
I810_IOREADB
(
card
,
CAS
)
&
1
))
udelay
(
1
);
udelay
(
1
);
outw
(
data
,
card
->
ac97base
+
reg_set
);
outw
(
data
,
card
->
ac97base
+
reg_set
);
...
@@ -2686,7 +2711,7 @@ static /*const*/ struct file_operations i810_mixer_fops = {
...
@@ -2686,7 +2711,7 @@ static /*const*/ struct file_operations i810_mixer_fops = {
static
inline
int
i810_ac97_exists
(
struct
i810_card
*
card
,
int
ac97_number
)
static
inline
int
i810_ac97_exists
(
struct
i810_card
*
card
,
int
ac97_number
)
{
{
u32
reg
=
inl
(
card
->
iobase
+
GLOB_STA
);
u32
reg
=
I810_IOREADL
(
card
,
GLOB_STA
);
switch
(
ac97_number
)
{
switch
(
ac97_number
)
{
case
0
:
case
0
:
return
reg
&
(
1
<<
8
);
return
reg
&
(
1
<<
8
);
...
@@ -2757,7 +2782,7 @@ static inline int ich_use_mmio(struct i810_card *card)
...
@@ -2757,7 +2782,7 @@ static inline int ich_use_mmio(struct i810_card *card)
static
int
i810_ac97_power_up_bus
(
struct
i810_card
*
card
)
static
int
i810_ac97_power_up_bus
(
struct
i810_card
*
card
)
{
{
u32
reg
=
inl
(
card
->
iobase
+
GLOB_CNT
);
u32
reg
=
I810_IOREADL
(
card
,
GLOB_CNT
);
int
i
;
int
i
;
int
primary_codec_id
=
0
;
int
primary_codec_id
=
0
;
...
@@ -2769,14 +2794,14 @@ static int i810_ac97_power_up_bus(struct i810_card *card)
...
@@ -2769,14 +2794,14 @@ static int i810_ac97_power_up_bus(struct i810_card *card)
reg
&=~
8
;
/* ACLink on */
reg
&=~
8
;
/* ACLink on */
/* At this point we deassert AC_RESET # */
/* At this point we deassert AC_RESET # */
outl
(
reg
,
card
->
iobase
+
GLOB_CNT
);
I810_IOWRITEL
(
reg
,
card
,
GLOB_CNT
);
/* We must now allow time for the Codec initialisation.
/* We must now allow time for the Codec initialisation.
600mS is the specified time */
600mS is the specified time */
for
(
i
=
0
;
i
<
10
;
i
++
)
for
(
i
=
0
;
i
<
10
;
i
++
)
{
{
if
((
inl
(
card
->
iobase
+
GLOB_CNT
)
&
4
)
==
0
)
if
((
I810_IOREADL
(
card
,
GLOB_CNT
)
&
4
)
==
0
)
break
;
break
;
set_current_state
(
TASK_UNINTERRUPTIBLE
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
...
@@ -2795,7 +2820,10 @@ static int i810_ac97_power_up_bus(struct i810_card *card)
...
@@ -2795,7 +2820,10 @@ static int i810_ac97_power_up_bus(struct i810_card *card)
* See if the primary codec comes ready. This must happen
* See if the primary codec comes ready. This must happen
* before we start doing DMA stuff
* before we start doing DMA stuff
*/
*/
/* see i810_ac97_init for the next 7 lines (jsaw) */
/* see i810_ac97_init for the next 10 lines (jsaw) */
if
(
card
->
use_mmio
)
readw
(
card
->
ac97base_mmio
);
else
inw
(
card
->
ac97base
);
inw
(
card
->
ac97base
);
if
(
ich_use_mmio
(
card
))
{
if
(
ich_use_mmio
(
card
))
{
primary_codec_id
=
(
int
)
readl
(
card
->
iobase_mmio
+
SDM
)
&
0x3
;
primary_codec_id
=
(
int
)
readl
(
card
->
iobase_mmio
+
SDM
)
&
0x3
;
...
@@ -2814,6 +2842,9 @@ static int i810_ac97_power_up_bus(struct i810_card *card)
...
@@ -2814,6 +2842,9 @@ static int i810_ac97_power_up_bus(struct i810_card *card)
else
else
printk
(
"no response.
\n
"
);
printk
(
"no response.
\n
"
);
}
}
if
(
card
->
use_mmio
)
readw
(
card
->
ac97base_mmio
);
else
inw
(
card
->
ac97base
);
inw
(
card
->
ac97base
);
return
1
;
return
1
;
}
}
...
@@ -2839,15 +2870,15 @@ static int __devinit i810_ac97_init(struct i810_card *card)
...
@@ -2839,15 +2870,15 @@ static int __devinit i810_ac97_init(struct i810_card *card)
/* to check.... */
/* to check.... */
card
->
channels
=
2
;
card
->
channels
=
2
;
reg
=
inl
(
card
->
iobase
+
GLOB_STA
);
reg
=
I810_IOREADL
(
card
,
GLOB_STA
);
if
(
reg
&
0x0200000
)
if
(
reg
&
0x0200000
)
card
->
channels
=
6
;
card
->
channels
=
6
;
else
if
(
reg
&
0x0100000
)
else
if
(
reg
&
0x0100000
)
card
->
channels
=
4
;
card
->
channels
=
4
;
printk
(
KERN_INFO
"i810_audio: Audio Controller supports %d channels.
\n
"
,
card
->
channels
);
printk
(
KERN_INFO
"i810_audio: Audio Controller supports %d channels.
\n
"
,
card
->
channels
);
printk
(
KERN_INFO
"i810_audio: Defaulting to base 2 channel mode.
\n
"
);
printk
(
KERN_INFO
"i810_audio: Defaulting to base 2 channel mode.
\n
"
);
reg
=
inl
(
card
->
iobase
+
GLOB_CNT
);
reg
=
I810_IOREADL
(
card
,
GLOB_CNT
);
outl
(
reg
&
0xffcfffff
,
card
->
iobase
+
GLOB_CNT
);
I810_IOWRITEL
(
reg
&
0xffcfffff
,
card
,
GLOB_CNT
);
for
(
num_ac97
=
0
;
num_ac97
<
NR_AC97
;
num_ac97
++
)
for
(
num_ac97
=
0
;
num_ac97
<
NR_AC97
;
num_ac97
++
)
card
->
ac97_codec
[
num_ac97
]
=
NULL
;
card
->
ac97_codec
[
num_ac97
]
=
NULL
;
...
@@ -2858,8 +2889,10 @@ static int __devinit i810_ac97_init(struct i810_card *card)
...
@@ -2858,8 +2889,10 @@ static int __devinit i810_ac97_init(struct i810_card *card)
for
(
num_ac97
=
0
;
num_ac97
<
nr_ac97_max
;
num_ac97
++
)
{
for
(
num_ac97
=
0
;
num_ac97
<
nr_ac97_max
;
num_ac97
++
)
{
/* codec reset */
/* codec reset */
printk
(
KERN_INFO
"i810_audio: Resetting connection %d
\n
"
,
num_ac97
);
printk
(
KERN_INFO
"i810_audio: Resetting connection %d
\n
"
,
num_ac97
);
if
(
card
->
use_mmio
)
readw
(
card
->
ac97base_mmio
+
0x80
*
num_ac97
);
if
(
card
->
use_mmio
)
else
inw
(
card
->
ac97base
+
0x80
*
num_ac97
);
readw
(
card
->
ac97base_mmio
+
0x80
*
num_ac97
);
else
inw
(
card
->
ac97base
+
0x80
*
num_ac97
);
/* If we have the SDATA_IN Map Register, as on ICH4, we
/* If we have the SDATA_IN Map Register, as on ICH4, we
do not loop thru all possible codec IDs but thru all
do not loop thru all possible codec IDs but thru all
...
@@ -3062,7 +3095,7 @@ static void __devinit i810_configure_clocking (void)
...
@@ -3062,7 +3095,7 @@ static void __devinit i810_configure_clocking (void)
goto
config_out
;
goto
config_out
;
}
}
dmabuf
->
count
=
dmabuf
->
dmasize
;
dmabuf
->
count
=
dmabuf
->
dmasize
;
CIV_TO_LVI
(
card
->
iobase
+
dmabuf
->
write_channel
->
port
,
-
1
);
CIV_TO_LVI
(
card
,
dmabuf
->
write_channel
->
port
,
-
1
);
local_irq_save
(
flags
);
local_irq_save
(
flags
);
start_dac
(
state
);
start_dac
(
state
);
offset
=
i810_get_dma_addr
(
state
,
0
);
offset
=
i810_get_dma_addr
(
state
,
0
);
...
@@ -3106,13 +3139,6 @@ static int __devinit i810_probe(struct pci_dev *pci_dev, const struct pci_device
...
@@ -3106,13 +3139,6 @@ static int __devinit i810_probe(struct pci_dev *pci_dev, const struct pci_device
return
-
ENODEV
;
return
-
ENODEV
;
}
}
if
(
pci_resource_start
(
pci_dev
,
1
)
==
0
)
{
/* MMIO only ICH5 .. here be dragons .. */
printk
(
KERN_ERR
"i810_audio: Pure MMIO interfaces not yet supported.
\n
"
);
return
-
ENODEV
;
}
if
((
card
=
kmalloc
(
sizeof
(
struct
i810_card
),
GFP_KERNEL
))
==
NULL
)
{
if
((
card
=
kmalloc
(
sizeof
(
struct
i810_card
),
GFP_KERNEL
))
==
NULL
)
{
printk
(
KERN_ERR
"i810_audio: out of memory
\n
"
);
printk
(
KERN_ERR
"i810_audio: out of memory
\n
"
);
return
-
ENOMEM
;
return
-
ENOMEM
;
...
@@ -3125,6 +3151,11 @@ static int __devinit i810_probe(struct pci_dev *pci_dev, const struct pci_device
...
@@ -3125,6 +3151,11 @@ static int __devinit i810_probe(struct pci_dev *pci_dev, const struct pci_device
card
->
ac97base
=
pci_resource_start
(
pci_dev
,
0
);
card
->
ac97base
=
pci_resource_start
(
pci_dev
,
0
);
card
->
iobase
=
pci_resource_start
(
pci_dev
,
1
);
card
->
iobase
=
pci_resource_start
(
pci_dev
,
1
);
if
(
!
(
card
->
ac97base
)
||
!
(
card
->
iobase
))
{
card
->
ac97base
=
0
;
card
->
iobase
=
0
;
}
/* if chipset could have mmio capability, check it */
/* if chipset could have mmio capability, check it */
if
(
card_cap
[
pci_id
->
driver_data
].
flags
&
CAP_MMIO
)
{
if
(
card_cap
[
pci_id
->
driver_data
].
flags
&
CAP_MMIO
)
{
card
->
ac97base_mmio_phys
=
pci_resource_start
(
pci_dev
,
2
);
card
->
ac97base_mmio_phys
=
pci_resource_start
(
pci_dev
,
2
);
...
@@ -3139,6 +3170,11 @@ static int __devinit i810_probe(struct pci_dev *pci_dev, const struct pci_device
...
@@ -3139,6 +3170,11 @@ static int __devinit i810_probe(struct pci_dev *pci_dev, const struct pci_device
}
}
}
}
if
(
!
(
card
->
use_mmio
)
&&
(
!
(
card
->
iobase
)
||
!
(
card
->
ac97base
)))
{
printk
(
KERN_ERR
"i810_audio: No I/O resources available.
\n
"
);
goto
out_mem
;
}
card
->
irq
=
pci_dev
->
irq
;
card
->
irq
=
pci_dev
->
irq
;
card
->
next
=
devs
;
card
->
next
=
devs
;
card
->
magic
=
I810_CARD_MAGIC
;
card
->
magic
=
I810_CARD_MAGIC
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment