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
60c4e7c1
Commit
60c4e7c1
authored
Mar 24, 2009
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/ice' into for-linus
parents
593aff6c
e2ea7cfc
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
54 additions
and
26 deletions
+54
-26
sound/pci/ice1712/ice1712.c
sound/pci/ice1712/ice1712.c
+1
-1
sound/pci/ice1712/ice1724.c
sound/pci/ice1712/ice1724.c
+41
-19
sound/pci/ice1712/juli.c
sound/pci/ice1712/juli.c
+3
-2
sound/pci/ice1712/prodigy192.c
sound/pci/ice1712/prodigy192.c
+9
-4
No files found.
sound/pci/ice1712/ice1712.c
View file @
60c4e7c1
...
@@ -458,7 +458,7 @@ static irqreturn_t snd_ice1712_interrupt(int irq, void *dev_id)
...
@@ -458,7 +458,7 @@ static irqreturn_t snd_ice1712_interrupt(int irq, void *dev_id)
u16
pbkstatus
;
u16
pbkstatus
;
struct
snd_pcm_substream
*
substream
;
struct
snd_pcm_substream
*
substream
;
pbkstatus
=
inw
(
ICEDS
(
ice
,
INTSTAT
));
pbkstatus
=
inw
(
ICEDS
(
ice
,
INTSTAT
));
/* printk("pbkstatus = 0x%x\n", pbkstatus); */
/* printk(
KERN_DEBUG
"pbkstatus = 0x%x\n", pbkstatus); */
for
(
idx
=
0
;
idx
<
6
;
idx
++
)
{
for
(
idx
=
0
;
idx
<
6
;
idx
++
)
{
if
((
pbkstatus
&
(
3
<<
(
idx
*
2
)))
==
0
)
if
((
pbkstatus
&
(
3
<<
(
idx
*
2
)))
==
0
)
continue
;
continue
;
...
...
sound/pci/ice1712/ice1724.c
View file @
60c4e7c1
...
@@ -241,6 +241,8 @@ get_rawmidi_substream(struct snd_ice1712 *ice, unsigned int stream)
...
@@ -241,6 +241,8 @@ get_rawmidi_substream(struct snd_ice1712 *ice, unsigned int stream)
struct
snd_rawmidi_substream
,
list
);
struct
snd_rawmidi_substream
,
list
);
}
}
static
void
enable_midi_irq
(
struct
snd_ice1712
*
ice
,
u8
flag
,
int
enable
);
static
void
vt1724_midi_write
(
struct
snd_ice1712
*
ice
)
static
void
vt1724_midi_write
(
struct
snd_ice1712
*
ice
)
{
{
struct
snd_rawmidi_substream
*
s
;
struct
snd_rawmidi_substream
*
s
;
...
@@ -254,6 +256,11 @@ static void vt1724_midi_write(struct snd_ice1712 *ice)
...
@@ -254,6 +256,11 @@ static void vt1724_midi_write(struct snd_ice1712 *ice)
for
(
i
=
0
;
i
<
count
;
++
i
)
for
(
i
=
0
;
i
<
count
;
++
i
)
outb
(
buffer
[
i
],
ICEREG1724
(
ice
,
MPU_DATA
));
outb
(
buffer
[
i
],
ICEREG1724
(
ice
,
MPU_DATA
));
}
}
/* mask irq when all bytes have been transmitted.
* enabled again in output_trigger when the new data comes in.
*/
enable_midi_irq
(
ice
,
VT1724_IRQ_MPU_TX
,
!
snd_rawmidi_transmit_empty
(
s
));
}
}
static
void
vt1724_midi_read
(
struct
snd_ice1712
*
ice
)
static
void
vt1724_midi_read
(
struct
snd_ice1712
*
ice
)
...
@@ -272,31 +279,34 @@ static void vt1724_midi_read(struct snd_ice1712 *ice)
...
@@ -272,31 +279,34 @@ static void vt1724_midi_read(struct snd_ice1712 *ice)
}
}
}
}
static
void
vt1724_enable_midi_irq
(
struct
snd_rawmidi_substream
*
substream
,
/* call with ice->reg_lock */
u8
flag
,
int
enable
)
static
void
enable_midi_irq
(
struct
snd_ice1712
*
ice
,
u8
flag
,
int
enable
)
{
{
struct
snd_ice1712
*
ice
=
substream
->
rmidi
->
private_data
;
u8
mask
=
inb
(
ICEREG1724
(
ice
,
IRQMASK
));
u8
mask
;
spin_lock_irq
(
&
ice
->
reg_lock
);
mask
=
inb
(
ICEREG1724
(
ice
,
IRQMASK
));
if
(
enable
)
if
(
enable
)
mask
&=
~
flag
;
mask
&=
~
flag
;
else
else
mask
|=
flag
;
mask
|=
flag
;
outb
(
mask
,
ICEREG1724
(
ice
,
IRQMASK
));
outb
(
mask
,
ICEREG1724
(
ice
,
IRQMASK
));
}
static
void
vt1724_enable_midi_irq
(
struct
snd_rawmidi_substream
*
substream
,
u8
flag
,
int
enable
)
{
struct
snd_ice1712
*
ice
=
substream
->
rmidi
->
private_data
;
spin_lock_irq
(
&
ice
->
reg_lock
);
enable_midi_irq
(
ice
,
flag
,
enable
);
spin_unlock_irq
(
&
ice
->
reg_lock
);
spin_unlock_irq
(
&
ice
->
reg_lock
);
}
}
static
int
vt1724_midi_output_open
(
struct
snd_rawmidi_substream
*
s
)
static
int
vt1724_midi_output_open
(
struct
snd_rawmidi_substream
*
s
)
{
{
vt1724_enable_midi_irq
(
s
,
VT1724_IRQ_MPU_TX
,
1
);
return
0
;
return
0
;
}
}
static
int
vt1724_midi_output_close
(
struct
snd_rawmidi_substream
*
s
)
static
int
vt1724_midi_output_close
(
struct
snd_rawmidi_substream
*
s
)
{
{
vt1724_enable_midi_irq
(
s
,
VT1724_IRQ_MPU_TX
,
0
);
return
0
;
return
0
;
}
}
...
@@ -311,6 +321,7 @@ static void vt1724_midi_output_trigger(struct snd_rawmidi_substream *s, int up)
...
@@ -311,6 +321,7 @@ static void vt1724_midi_output_trigger(struct snd_rawmidi_substream *s, int up)
vt1724_midi_write
(
ice
);
vt1724_midi_write
(
ice
);
}
else
{
}
else
{
ice
->
midi_output
=
0
;
ice
->
midi_output
=
0
;
enable_midi_irq
(
ice
,
VT1724_IRQ_MPU_TX
,
0
);
}
}
spin_unlock_irqrestore
(
&
ice
->
reg_lock
,
flags
);
spin_unlock_irqrestore
(
&
ice
->
reg_lock
,
flags
);
}
}
...
@@ -320,6 +331,7 @@ static void vt1724_midi_output_drain(struct snd_rawmidi_substream *s)
...
@@ -320,6 +331,7 @@ static void vt1724_midi_output_drain(struct snd_rawmidi_substream *s)
struct
snd_ice1712
*
ice
=
s
->
rmidi
->
private_data
;
struct
snd_ice1712
*
ice
=
s
->
rmidi
->
private_data
;
unsigned
long
timeout
;
unsigned
long
timeout
;
vt1724_enable_midi_irq
(
s
,
VT1724_IRQ_MPU_TX
,
0
);
/* 32 bytes should be transmitted in less than about 12 ms */
/* 32 bytes should be transmitted in less than about 12 ms */
timeout
=
jiffies
+
msecs_to_jiffies
(
15
);
timeout
=
jiffies
+
msecs_to_jiffies
(
15
);
do
{
do
{
...
@@ -389,24 +401,24 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id)
...
@@ -389,24 +401,24 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id)
status
&=
status_mask
;
status
&=
status_mask
;
if
(
status
==
0
)
if
(
status
==
0
)
break
;
break
;
spin_lock
(
&
ice
->
reg_lock
);
if
(
++
timeout
>
10
)
{
if
(
++
timeout
>
10
)
{
status
=
inb
(
ICEREG1724
(
ice
,
IRQSTAT
));
status
=
inb
(
ICEREG1724
(
ice
,
IRQSTAT
));
printk
(
KERN_ERR
"ice1724: Too long irq loop, "
printk
(
KERN_ERR
"ice1724: Too long irq loop, "
"status = 0x%x
\n
"
,
status
);
"status = 0x%x
\n
"
,
status
);
if
(
status
&
VT1724_IRQ_MPU_TX
)
{
if
(
status
&
VT1724_IRQ_MPU_TX
)
{
printk
(
KERN_ERR
"ice1724: Disabling MPU_TX
\n
"
);
printk
(
KERN_ERR
"ice1724: Disabling MPU_TX
\n
"
);
outb
(
inb
(
ICEREG1724
(
ice
,
IRQMASK
))
|
enable_midi_irq
(
ice
,
VT1724_IRQ_MPU_TX
,
0
);
VT1724_IRQ_MPU_TX
,
ICEREG1724
(
ice
,
IRQMASK
));
}
}
spin_unlock
(
&
ice
->
reg_lock
);
break
;
break
;
}
}
handled
=
1
;
handled
=
1
;
if
(
status
&
VT1724_IRQ_MPU_TX
)
{
if
(
status
&
VT1724_IRQ_MPU_TX
)
{
spin_lock
(
&
ice
->
reg_lock
);
if
(
ice
->
midi_output
)
if
(
ice
->
midi_output
)
vt1724_midi_write
(
ice
);
vt1724_midi_write
(
ice
);
spin_unlock
(
&
ice
->
reg_lock
);
else
enable_midi_irq
(
ice
,
VT1724_IRQ_MPU_TX
,
0
);
/* Due to mysterical reasons, MPU_TX is always
/* Due to mysterical reasons, MPU_TX is always
* generated (and can't be cleared) when a PCM
* generated (and can't be cleared) when a PCM
* playback is going. So let's ignore at the
* playback is going. So let's ignore at the
...
@@ -415,15 +427,14 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id)
...
@@ -415,15 +427,14 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id)
status_mask
&=
~
VT1724_IRQ_MPU_TX
;
status_mask
&=
~
VT1724_IRQ_MPU_TX
;
}
}
if
(
status
&
VT1724_IRQ_MPU_RX
)
{
if
(
status
&
VT1724_IRQ_MPU_RX
)
{
spin_lock
(
&
ice
->
reg_lock
);
if
(
ice
->
midi_input
)
if
(
ice
->
midi_input
)
vt1724_midi_read
(
ice
);
vt1724_midi_read
(
ice
);
else
else
vt1724_midi_clear_rx
(
ice
);
vt1724_midi_clear_rx
(
ice
);
spin_unlock
(
&
ice
->
reg_lock
);
}
}
/* ack MPU irq */
/* ack MPU irq */
outb
(
status
,
ICEREG1724
(
ice
,
IRQSTAT
));
outb
(
status
,
ICEREG1724
(
ice
,
IRQSTAT
));
spin_unlock
(
&
ice
->
reg_lock
);
if
(
status
&
VT1724_IRQ_MTPCM
)
{
if
(
status
&
VT1724_IRQ_MTPCM
)
{
/*
/*
* Multi-track PCM
* Multi-track PCM
...
@@ -745,7 +756,14 @@ static int snd_vt1724_playback_pro_prepare(struct snd_pcm_substream *substream)
...
@@ -745,7 +756,14 @@ static int snd_vt1724_playback_pro_prepare(struct snd_pcm_substream *substream)
spin_unlock_irq
(
&
ice
->
reg_lock
);
spin_unlock_irq
(
&
ice
->
reg_lock
);
/* printk("pro prepare: ch = %d, addr = 0x%x, buffer = 0x%x, period = 0x%x\n", substream->runtime->channels, (unsigned int)substream->runtime->dma_addr, snd_pcm_lib_buffer_bytes(substream), snd_pcm_lib_period_bytes(substream)); */
/*
printk(KERN_DEBUG "pro prepare: ch = %d, addr = 0x%x, "
"buffer = 0x%x, period = 0x%x\n",
substream->runtime->channels,
(unsigned int)substream->runtime->dma_addr,
snd_pcm_lib_buffer_bytes(substream),
snd_pcm_lib_period_bytes(substream));
*/
return
0
;
return
0
;
}
}
...
@@ -2122,7 +2140,9 @@ unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice,
...
@@ -2122,7 +2140,9 @@ unsigned char snd_vt1724_read_i2c(struct snd_ice1712 *ice,
wait_i2c_busy
(
ice
);
wait_i2c_busy
(
ice
);
val
=
inb
(
ICEREG1724
(
ice
,
I2C_DATA
));
val
=
inb
(
ICEREG1724
(
ice
,
I2C_DATA
));
mutex_unlock
(
&
ice
->
i2c_mutex
);
mutex_unlock
(
&
ice
->
i2c_mutex
);
/* printk("i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val); */
/*
printk(KERN_DEBUG "i2c_read: [0x%x,0x%x] = 0x%x\n", dev, addr, val);
*/
return
val
;
return
val
;
}
}
...
@@ -2131,7 +2151,9 @@ void snd_vt1724_write_i2c(struct snd_ice1712 *ice,
...
@@ -2131,7 +2151,9 @@ void snd_vt1724_write_i2c(struct snd_ice1712 *ice,
{
{
mutex_lock
(
&
ice
->
i2c_mutex
);
mutex_lock
(
&
ice
->
i2c_mutex
);
wait_i2c_busy
(
ice
);
wait_i2c_busy
(
ice
);
/* printk("i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data); */
/*
printk(KERN_DEBUG "i2c_write: [0x%x,0x%x] = 0x%x\n", dev, addr, data);
*/
outb
(
addr
,
ICEREG1724
(
ice
,
I2C_BYTE_ADDR
));
outb
(
addr
,
ICEREG1724
(
ice
,
I2C_BYTE_ADDR
));
outb
(
data
,
ICEREG1724
(
ice
,
I2C_DATA
));
outb
(
data
,
ICEREG1724
(
ice
,
I2C_DATA
));
outb
(
dev
|
VT1724_I2C_WRITE
,
ICEREG1724
(
ice
,
I2C_DEV_ADDR
));
outb
(
dev
|
VT1724_I2C_WRITE
,
ICEREG1724
(
ice
,
I2C_DEV_ADDR
));
...
...
sound/pci/ice1712/juli.c
View file @
60c4e7c1
...
@@ -345,8 +345,9 @@ static int juli_mute_put(struct snd_kcontrol *kcontrol,
...
@@ -345,8 +345,9 @@ static int juli_mute_put(struct snd_kcontrol *kcontrol,
new_gpio
=
old_gpio
&
new_gpio
=
old_gpio
&
~
((
unsigned
int
)
kcontrol
->
private_value
);
~
((
unsigned
int
)
kcontrol
->
private_value
);
}
}
/* printk("JULI - mute/unmute: control_value: 0x%x, old_gpio: 0x%x, \
/* printk(KERN_DEBUG
new_gpio 0x%x\n",
"JULI - mute/unmute: control_value: 0x%x, old_gpio: 0x%x, "
"new_gpio 0x%x\n",
(unsigned int)ucontrol->value.integer.value[0], old_gpio,
(unsigned int)ucontrol->value.integer.value[0], old_gpio,
new_gpio); */
new_gpio); */
if
(
old_gpio
!=
new_gpio
)
{
if
(
old_gpio
!=
new_gpio
)
{
...
...
sound/pci/ice1712/prodigy192.c
View file @
60c4e7c1
...
@@ -133,8 +133,10 @@ static int stac9460_dac_mute_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e
...
@@ -133,8 +133,10 @@ static int stac9460_dac_mute_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e
idx
=
snd_ctl_get_ioffidx
(
kcontrol
,
&
ucontrol
->
id
)
+
STAC946X_LF_VOLUME
;
idx
=
snd_ctl_get_ioffidx
(
kcontrol
,
&
ucontrol
->
id
)
+
STAC946X_LF_VOLUME
;
/* due to possible conflicts with stac9460_set_rate_val, mutexing */
/* due to possible conflicts with stac9460_set_rate_val, mutexing */
mutex_lock
(
&
spec
->
mute_mutex
);
mutex_lock
(
&
spec
->
mute_mutex
);
/*printk("Mute put: reg 0x%02x, ctrl value: 0x%02x\n", idx,
/*
ucontrol->value.integer.value[0]);*/
printk(KERN_DEBUG "Mute put: reg 0x%02x, ctrl value: 0x%02x\n", idx,
ucontrol->value.integer.value[0]);
*/
change
=
stac9460_dac_mute
(
ice
,
idx
,
ucontrol
->
value
.
integer
.
value
[
0
]);
change
=
stac9460_dac_mute
(
ice
,
idx
,
ucontrol
->
value
.
integer
.
value
[
0
]);
mutex_unlock
(
&
spec
->
mute_mutex
);
mutex_unlock
(
&
spec
->
mute_mutex
);
return
change
;
return
change
;
...
@@ -185,7 +187,10 @@ static int stac9460_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el
...
@@ -185,7 +187,10 @@ static int stac9460_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el
change
=
(
ovol
!=
nvol
);
change
=
(
ovol
!=
nvol
);
if
(
change
)
{
if
(
change
)
{
ovol
=
(
0x7f
-
nvol
)
|
(
tmp
&
0x80
);
ovol
=
(
0x7f
-
nvol
)
|
(
tmp
&
0x80
);
/*printk("DAC Volume: reg 0x%02x: 0x%02x\n", idx, ovol);*/
/*
printk(KERN_DEBUG "DAC Volume: reg 0x%02x: 0x%02x\n",
idx, ovol);
*/
stac9460_put
(
ice
,
idx
,
(
0x7f
-
nvol
)
|
(
tmp
&
0x80
));
stac9460_put
(
ice
,
idx
,
(
0x7f
-
nvol
)
|
(
tmp
&
0x80
));
}
}
return
change
;
return
change
;
...
@@ -344,7 +349,7 @@ static void stac9460_set_rate_val(struct snd_ice1712 *ice, unsigned int rate)
...
@@ -344,7 +349,7 @@ static void stac9460_set_rate_val(struct snd_ice1712 *ice, unsigned int rate)
for
(
idx
=
0
;
idx
<
7
;
++
idx
)
for
(
idx
=
0
;
idx
<
7
;
++
idx
)
changed
[
idx
]
=
stac9460_dac_mute
(
ice
,
changed
[
idx
]
=
stac9460_dac_mute
(
ice
,
STAC946X_MASTER_VOLUME
+
idx
,
0
);
STAC946X_MASTER_VOLUME
+
idx
,
0
);
/*printk("Rate change: %d, new MC: 0x%02x\n", rate, new);*/
/*printk(
KERN_DEBUG
"Rate change: %d, new MC: 0x%02x\n", rate, new);*/
stac9460_put
(
ice
,
STAC946X_MASTER_CLOCKING
,
new
);
stac9460_put
(
ice
,
STAC946X_MASTER_CLOCKING
,
new
);
udelay
(
10
);
udelay
(
10
);
/* unmuting - only originally unmuted dacs -
/* unmuting - only originally unmuted dacs -
...
...
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