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
9e82294a
Commit
9e82294a
authored
Dec 17, 2002
by
Jaroslav Kysela
Browse files
Options
Browse Files
Download
Plain Diff
Merge suse.cz:/home/perex/bk/linux-sound/linux-sound
into suse.cz:/home/perex/bk/linux-sound/work
parents
7a4b62d0
8a1f8f8e
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
116 additions
and
58 deletions
+116
-58
include/sound/version.h
include/sound/version.h
+1
-1
sound/core/pcm_sgbuf.c
sound/core/pcm_sgbuf.c
+51
-1
sound/drivers/mtpav.c
sound/drivers/mtpav.c
+39
-39
sound/pci/ali5451/ali5451.c
sound/pci/ali5451/ali5451.c
+7
-4
sound/pci/fm801.c
sound/pci/fm801.c
+1
-1
sound/pci/ice1712/hoontech.h
sound/pci/ice1712/hoontech.h
+5
-2
sound/usb/usbmixer.c
sound/usb/usbmixer.c
+12
-10
No files found.
include/sound/version.h
View file @
9e82294a
/* include/version.h. Generated automatically by configure. */
#define CONFIG_SND_VERSION "0.9.0rc6"
#define CONFIG_SND_DATE " (
Wed Dec 11 21:24:39
2002 UTC)"
#define CONFIG_SND_DATE " (
Mon Dec 16 14:23:15
2002 UTC)"
sound/core/pcm_sgbuf.c
View file @
9e82294a
...
...
@@ -92,6 +92,56 @@ int snd_pcm_sgbuf_delete(snd_pcm_substream_t *substream)
return
0
;
}
/*
* snd_pci_alloc_page - allocate a page in the valid pci dma mask
*
* returns the virtual address and stores the physical address on
* addrp. this function cannot be called from interrupt handlers or
* within spinlocks.
*/
#ifdef __i386__
/*
* on ix86, we allocate a page with GFP_KERNEL to assure the
* allocation. the code is almost same with kernel/i386/pci-dma.c but
* it allocates only a single page and checkes the validity of the
* page address with the given pci dma mask.
*/
inline
static
void
*
snd_pci_alloc_page
(
struct
pci_dev
*
pci
,
dma_addr_t
*
addrp
)
{
void
*
ptr
;
dma_addr_t
addr
;
unsigned
long
rmask
;
if
(
pci
)
rmask
=
~
(
unsigned
long
)
pci
->
dma_mask
;
else
rmask
=
0
;
ptr
=
(
void
*
)
__get_free_page
(
GFP_KERNEL
);
if
(
ptr
)
{
addr
=
virt_to_phys
(
ptr
);
if
(((
unsigned
long
)
addr
+
PAGE_SIZE
-
1
)
&
rmask
)
{
/* try to reallocate with the GFP_DMA */
free_page
((
unsigned
long
)
ptr
);
ptr
=
(
void
*
)
__get_free_page
(
GFP_KERNEL
|
GFP_DMA
);
if
(
ptr
)
/* ok, the address must be within lower 16MB... */
addr
=
virt_to_phys
(
ptr
);
else
addr
=
0
;
}
}
else
addr
=
0
;
if
(
ptr
)
memset
(
ptr
,
0
,
PAGE_SIZE
);
*
addrp
=
addr
;
return
ptr
;
}
#else
/* on other architectures, call snd_malloc_pci_pages() helper function
* which uses pci_alloc_consistent().
*/
#define snd_pci_alloc_page(pci, addrp) snd_malloc_pci_pages(pci, PAGE_SIZE, addrp)
#endif
/*
* allocate sg buffer table with the given byte size.
* if the buffer table already exists, try to resize it.
...
...
@@ -128,7 +178,7 @@ int snd_pcm_sgbuf_alloc(snd_pcm_substream_t *substream, size_t size)
while
(
sgbuf
->
pages
<
pages
)
{
void
*
ptr
;
dma_addr_t
addr
;
ptr
=
snd_
malloc_pci_pages
(
sgbuf
->
pci
,
PAGE_SIZE
,
&
addr
);
ptr
=
snd_
pci_alloc_page
(
sgbuf
->
pci
,
&
addr
);
if
(
!
ptr
)
return
-
ENOMEM
;
sgbuf
->
table
[
sgbuf
->
pages
].
buf
=
ptr
;
...
...
sound/drivers/mtpav.c
View file @
9e82294a
...
...
@@ -205,19 +205,19 @@ static int translate_subdevice_to_hwport(mtpav_t *chip, int subdev)
static
int
translate_hwport_to_subdevice
(
mtpav_t
*
chip
,
int
hwport
)
{
int
p
ort
;
int
p
;
if
(
hwport
<=
0x00
)
/* all ports */
return
chip
->
num_ports
+
MTPAV_PIDX_BROADCAST
;
else
if
(
hwport
<=
0x08
)
{
/* single port */
p
ort
=
hwport
-
1
;
if
(
p
ort
>=
chip
->
num_ports
)
p
ort
=
0
;
return
p
ort
;
p
=
hwport
-
1
;
if
(
p
>=
chip
->
num_ports
)
p
=
0
;
return
p
;
}
else
if
(
hwport
<=
0x10
)
{
/* remote port */
p
ort
=
hwport
-
0x09
+
chip
->
num_ports
;
if
(
p
ort
>=
chip
->
num_ports
*
2
)
p
ort
=
chip
->
num_ports
;
return
p
ort
;
p
=
hwport
-
0x09
+
chip
->
num_ports
;
if
(
p
>=
chip
->
num_ports
*
2
)
p
=
chip
->
num_ports
;
return
p
;
}
else
if
(
hwport
==
0x11
)
/* computer port */
return
chip
->
num_ports
+
MTPAV_PIDX_COMPUTER
;
else
/* ADAT */
...
...
@@ -335,11 +335,11 @@ static void snd_mtpav_output_write(snd_rawmidi_substream_t * substream)
static
void
snd_mtpav_portscan
(
mtpav_t
*
chip
)
// put mtp into smart routing mode
{
u8
p
ort
;
u8
p
;
for
(
p
ort
=
0
;
port
<
8
;
port
++
)
{
for
(
p
=
0
;
p
<
8
;
p
++
)
{
snd_mtpav_send_byte
(
chip
,
0xf5
);
snd_mtpav_send_byte
(
chip
,
p
ort
);
snd_mtpav_send_byte
(
chip
,
p
);
snd_mtpav_send_byte
(
chip
,
0xfe
);
}
}
...
...
@@ -350,12 +350,12 @@ static void snd_mtpav_portscan(mtpav_t *chip) // put mtp into smart routing mode
static
int
snd_mtpav_input_open
(
snd_rawmidi_substream_t
*
substream
)
{
unsigned
long
flags
;
mtpav_port_t
*
port
=
&
mtp_card
->
ports
[
substream
->
number
];
mtpav_port_t
*
port
p
=
&
mtp_card
->
ports
[
substream
->
number
];
//printk("mtpav port: %d opened\n", (int) substream->number);
spin_lock_irqsave
(
&
mtp_card
->
spinlock
,
flags
);
port
->
mode
|=
MTPAV_MODE_INPUT_OPENED
;
port
->
input
=
substream
;
port
p
->
mode
|=
MTPAV_MODE_INPUT_OPENED
;
port
p
->
input
=
substream
;
if
(
mtp_card
->
share_irq
++
==
0
)
snd_mtpav_mputreg
(
mtp_card
,
CREG
,
(
SIGC_INTEN
|
SIGC_WRITE
));
// enable pport interrupts
spin_unlock_irqrestore
(
&
mtp_card
->
spinlock
,
flags
);
...
...
@@ -368,14 +368,14 @@ static int snd_mtpav_input_open(snd_rawmidi_substream_t * substream)
static
int
snd_mtpav_input_close
(
snd_rawmidi_substream_t
*
substream
)
{
unsigned
long
flags
;
mtpav_port_t
*
port
=
&
mtp_card
->
ports
[
substream
->
number
];
mtpav_port_t
*
port
p
=
&
mtp_card
->
ports
[
substream
->
number
];
//printk("mtpav port: %d closed\n", (int) port);
//printk("mtpav port: %d closed\n", (int) port
p
);
spin_lock_irqsave
(
&
mtp_card
->
spinlock
,
flags
);
port
->
mode
&=
(
~
MTPAV_MODE_INPUT_OPENED
);
port
->
input
=
NULL
;
port
p
->
mode
&=
(
~
MTPAV_MODE_INPUT_OPENED
);
port
p
->
input
=
NULL
;
if
(
--
mtp_card
->
share_irq
==
0
)
snd_mtpav_mputreg
(
mtp_card
,
CREG
,
0
);
// disable pport interrupts
...
...
@@ -389,13 +389,13 @@ static int snd_mtpav_input_close(snd_rawmidi_substream_t *substream)
static
void
snd_mtpav_input_trigger
(
snd_rawmidi_substream_t
*
substream
,
int
up
)
{
unsigned
long
flags
;
mtpav_port_t
*
port
=
&
mtp_card
->
ports
[
substream
->
number
];
mtpav_port_t
*
port
p
=
&
mtp_card
->
ports
[
substream
->
number
];
spin_lock_irqsave
(
&
mtp_card
->
spinlock
,
flags
);
if
(
up
)
port
->
mode
|=
MTPAV_MODE_INPUT_TRIGGERED
;
port
p
->
mode
|=
MTPAV_MODE_INPUT_TRIGGERED
;
else
port
->
mode
&=
~
MTPAV_MODE_INPUT_TRIGGERED
;
port
p
->
mode
&=
~
MTPAV_MODE_INPUT_TRIGGERED
;
spin_unlock_irqrestore
(
&
mtp_card
->
spinlock
,
flags
);
}
...
...
@@ -416,9 +416,9 @@ static void snd_mtpav_output_timer(unsigned long data)
add_timer
(
&
chip
->
timer
);
/* process each port */
for
(
p
=
0
;
p
<=
chip
->
num_ports
*
2
+
MTPAV_PIDX_BROADCAST
;
p
++
)
{
mtpav_port_t
*
port
=
&
mtp_card
->
ports
[
p
];
if
((
port
->
mode
&
MTPAV_MODE_OUTPUT_TRIGGERED
)
&&
port
->
output
)
snd_mtpav_output_port_write
(
port
,
port
->
output
);
mtpav_port_t
*
port
p
=
&
mtp_card
->
ports
[
p
];
if
((
port
p
->
mode
&
MTPAV_MODE_OUTPUT_TRIGGERED
)
&&
portp
->
output
)
snd_mtpav_output_port_write
(
port
p
,
portp
->
output
);
}
spin_unlock
(
&
chip
->
spinlock
);
}
...
...
@@ -445,11 +445,11 @@ static void snd_mtpav_remove_output_timer(mtpav_t *chip)
static
int
snd_mtpav_output_open
(
snd_rawmidi_substream_t
*
substream
)
{
unsigned
long
flags
;
mtpav_port_t
*
port
=
&
mtp_card
->
ports
[
substream
->
number
];
mtpav_port_t
*
port
p
=
&
mtp_card
->
ports
[
substream
->
number
];
spin_lock_irqsave
(
&
mtp_card
->
spinlock
,
flags
);
port
->
mode
|=
MTPAV_MODE_OUTPUT_OPENED
;
port
->
output
=
substream
;
port
p
->
mode
|=
MTPAV_MODE_OUTPUT_OPENED
;
port
p
->
output
=
substream
;
spin_unlock_irqrestore
(
&
mtp_card
->
spinlock
,
flags
);
return
0
;
};
...
...
@@ -460,11 +460,11 @@ static int snd_mtpav_output_open(snd_rawmidi_substream_t * substream)
static
int
snd_mtpav_output_close
(
snd_rawmidi_substream_t
*
substream
)
{
unsigned
long
flags
;
mtpav_port_t
*
port
=
&
mtp_card
->
ports
[
substream
->
number
];
mtpav_port_t
*
port
p
=
&
mtp_card
->
ports
[
substream
->
number
];
spin_lock_irqsave
(
&
mtp_card
->
spinlock
,
flags
);
port
->
mode
&=
(
~
MTPAV_MODE_OUTPUT_OPENED
);
port
->
output
=
NULL
;
port
p
->
mode
&=
(
~
MTPAV_MODE_OUTPUT_OPENED
);
port
p
->
output
=
NULL
;
spin_unlock_irqrestore
(
&
mtp_card
->
spinlock
,
flags
);
return
0
;
};
...
...
@@ -475,17 +475,17 @@ static int snd_mtpav_output_close(snd_rawmidi_substream_t * substream)
static
void
snd_mtpav_output_trigger
(
snd_rawmidi_substream_t
*
substream
,
int
up
)
{
unsigned
long
flags
;
mtpav_port_t
*
port
=
&
mtp_card
->
ports
[
substream
->
number
];
mtpav_port_t
*
port
p
=
&
mtp_card
->
ports
[
substream
->
number
];
spin_lock_irqsave
(
&
mtp_card
->
spinlock
,
flags
);
if
(
up
)
{
if
(
!
(
port
->
mode
&
MTPAV_MODE_OUTPUT_TRIGGERED
))
{
if
(
!
(
port
p
->
mode
&
MTPAV_MODE_OUTPUT_TRIGGERED
))
{
if
(
mtp_card
->
istimer
++
==
0
)
snd_mtpav_add_output_timer
(
mtp_card
);
port
->
mode
|=
MTPAV_MODE_OUTPUT_TRIGGERED
;
port
p
->
mode
|=
MTPAV_MODE_OUTPUT_TRIGGERED
;
}
}
else
{
port
->
mode
&=
~
MTPAV_MODE_OUTPUT_TRIGGERED
;
port
p
->
mode
&=
~
MTPAV_MODE_OUTPUT_TRIGGERED
;
if
(
--
mtp_card
->
istimer
==
0
)
snd_mtpav_remove_output_timer
(
mtp_card
);
}
...
...
@@ -501,15 +501,15 @@ static void snd_mtpav_output_trigger(snd_rawmidi_substream_t * substream, int up
static
void
snd_mtpav_inmidi_process
(
mtpav_t
*
mcrd
,
u8
inbyte
)
{
mtpav_port_t
*
port
;
mtpav_port_t
*
port
p
;
if
(
mcrd
->
inmidiport
>
mcrd
->
num_ports
*
2
+
MTPAV_PIDX_BROADCAST
)
return
;
port
=
&
mcrd
->
ports
[
mcrd
->
inmidiport
];
if
(
port
->
mode
&
MTPAV_MODE_INPUT_TRIGGERED
)
{
port
p
=
&
mcrd
->
ports
[
mcrd
->
inmidiport
];
if
(
port
p
->
mode
&
MTPAV_MODE_INPUT_TRIGGERED
)
{
spin_unlock
(
&
mcrd
->
spinlock
);
snd_rawmidi_receive
(
port
->
input
,
&
inbyte
,
1
);
snd_rawmidi_receive
(
port
p
->
input
,
&
inbyte
,
1
);
spin_lock
(
&
mcrd
->
spinlock
);
}
}
...
...
sound/pci/ali5451/ali5451.c
View file @
9e82294a
...
...
@@ -1831,9 +1831,10 @@ static int snd_ali5451_spdif_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t
return
change
;
}
static
snd_kcontrol_new_t
snd_ali5451_mixer_spdif
[]
__devinit
=
{
static
snd_kcontrol_new_t
snd_ali5451_mixer_spdif
[]
__devinit
data
=
{
/* spdif aplayback switch */
ALI5451_SPDIF
(
SNDRV_CTL_NAME_IEC958
(
""
,
PLAYBACK
,
SWITCH
),
0
,
0
),
/* FIXME: "IEC958 Playback Switch" may conflict with one on ac97_codec */
ALI5451_SPDIF
(
"IEC958 Output switch"
,
0
,
0
),
/* spdif out to spdif channel */
ALI5451_SPDIF
(
"IEC958 Channel Output Switch"
,
0
,
1
),
/* spdif in from spdif channel */
...
...
@@ -1861,7 +1862,7 @@ static int __devinit snd_ali_mixer(ali_t * codec)
return
err
;
}
if
(
codec
->
revision
==
ALI_5451_V02
)
{
for
(
idx
=
0
;
idx
<
3
;
idx
++
)
{
for
(
idx
=
0
;
idx
<
ARRAY_SIZE
(
snd_ali5451_mixer_spdif
)
;
idx
++
)
{
err
=
snd_ctl_add
(
codec
->
card
,
snd_ctl_new1
(
&
snd_ali5451_mixer_spdif
[
idx
],
codec
));
if
(
err
<
0
)
return
err
;
}
...
...
@@ -2010,10 +2011,12 @@ static int snd_ali_chip_init(ali_t *codec)
if
(
codec
->
revision
==
ALI_5451_V02
)
{
pci_dev
=
codec
->
pci_m1533
;
pci_read_config_byte
(
pci_dev
,
0x59
,
&
temp
);
temp
|=
0x80
;
pci_write_config_byte
(
pci_dev
,
0x59
,
temp
);
pci_dev
=
codec
->
pci_m7101
;
pci_read_config_byte
(
pci_dev
,
0xb8
,
&
temp
);
temp
|=
1
<<
6
;
temp
|=
0x20
;
pci_write_config_byte
(
pci_dev
,
0xB8
,
temp
);
}
...
...
sound/pci/fm801.c
View file @
9e82294a
...
...
@@ -164,7 +164,7 @@ struct _snd_fm801 {
};
static
struct
pci_device_id
snd_fm801_ids
[]
__devinitdata
=
{
{
0x1319
,
0x0801
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
,
},
/* FM801 */
{
0x1319
,
0x0801
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_CLASS_MULTIMEDIA_AUDIO
<<
8
,
0xffff0
0
,
0
,
},
/* FM801 */
{
0
,
}
};
...
...
sound/pci/ice1712/hoontech.h
View file @
9e82294a
...
...
@@ -24,9 +24,12 @@
*
*/
#define HOONTECH_DEVICE_DESC "{Hoontech SoundTrack DSP 24},"
#define HOONTECH_DEVICE_DESC \
"{Hoontech SoundTrack DSP 24}," \
"{Hoontech SoundTrack DSP 24 Value}," \
"{Hoontech SoundTrack DSP 24 Media 7.1}," \
#define ICE1712_SUBDEVICE_STDSP24 0x12141217
/* Hoontech SoundTrack Audio DSP 24 */
#define ICE1712_SUBDEVICE_STDSP24
0x12141217
/* Hoontech SoundTrack Audio DSP 24 */
#define ICE1712_SUBDEVICE_STDSP24_MEDIA7_1 0x16141217
/* Hoontech ST Audio DSP24 Media 7.1 */
extern
struct
snd_ice1712_card_info
snd_ice1712_hoontech_cards
[];
...
...
sound/usb/usbmixer.c
View file @
9e82294a
...
...
@@ -296,7 +296,7 @@ static int get_ctl_value(usb_mixer_elem_info_t *cval, int request, int validx, i
return
0
;
}
}
snd_printdd
(
KERN_ERR
"cannot get ctl value: req = 0x%x,
idx = 0x%x, val
= 0x%x, type = %d
\n
"
,
request
,
validx
,
cval
->
ctrlif
|
(
cval
->
id
<<
8
),
cval
->
val_type
);
snd_printdd
(
KERN_ERR
"cannot get ctl value: req = 0x%x,
wValue = 0x%x, wIndex
= 0x%x, type = %d
\n
"
,
request
,
validx
,
cval
->
ctrlif
|
(
cval
->
id
<<
8
),
cval
->
val_type
);
return
-
EINVAL
;
}
...
...
@@ -331,6 +331,7 @@ static int set_ctl_value(usb_mixer_elem_info_t *cval, int request, int validx, i
validx
,
cval
->
ctrlif
|
(
cval
->
id
<<
8
),
buf
,
val_len
,
HZ
/
10
)
>=
0
)
return
0
;
snd_printdd
(
KERN_ERR
"cannot set ctl value: req = 0x%x, wValue = 0x%x, wIndex = 0x%x, type = %d, data = 0x%x/0x%x
\n
"
,
request
,
validx
,
cval
->
ctrlif
|
(
cval
->
id
<<
8
),
cval
->
val_type
,
buf
[
0
],
buf
[
1
]);
return
-
EINVAL
;
}
...
...
@@ -571,11 +572,11 @@ static void usb_mixer_elem_free(snd_kcontrol_t *kctl)
/*
* retrieve the minimum and maximum values for the specified control
*/
static
int
get_min_max
(
usb_mixer_elem_info_t
*
cval
)
static
int
get_min_max
(
usb_mixer_elem_info_t
*
cval
,
int
default_min
)
{
/* for failsafe */
cval
->
min
=
0
;
cval
->
max
=
1
;
cval
->
min
=
default_min
;
cval
->
max
=
cval
->
min
+
1
;
cval
->
res
=
1
;
if
(
cval
->
val_type
==
USB_MIXER_BOOLEAN
||
...
...
@@ -634,7 +635,7 @@ static int mixer_ctl_feature_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t
uinfo
->
value
.
integer
.
max
=
1
;
}
else
{
if
(
!
cval
->
initialized
)
get_min_max
(
cval
);
get_min_max
(
cval
,
0
);
uinfo
->
value
.
integer
.
min
=
0
;
uinfo
->
value
.
integer
.
max
=
(
cval
->
max
-
cval
->
min
)
/
cval
->
res
;
}
...
...
@@ -784,7 +785,7 @@ static void build_feature_ctl(mixer_build_t *state, unsigned char *desc,
}
/* get min/max values */
get_min_max
(
cval
);
get_min_max
(
cval
,
0
);
kctl
=
snd_ctl_new1
(
&
usb_feature_unit_ctl
,
cval
);
if
(
!
kctl
)
{
...
...
@@ -952,7 +953,7 @@ static void build_mixer_unit_ctl(mixer_build_t *state, unsigned char *desc,
}
/* get min/max values */
get_min_max
(
cval
);
get_min_max
(
cval
,
0
);
kctl
=
snd_ctl_new1
(
&
usb_feature_unit_ctl
,
cval
);
if
(
!
kctl
)
{
...
...
@@ -1060,6 +1061,7 @@ struct procunit_value_info {
int
control
;
char
*
suffix
;
int
val_type
;
int
min_value
;
};
struct
procunit_info
{
...
...
@@ -1070,12 +1072,12 @@ struct procunit_info {
static
struct
procunit_value_info
updown_proc_info
[]
=
{
{
USB_PROC_UPDOWN_SWITCH
,
"Switch"
,
USB_MIXER_BOOLEAN
},
{
USB_PROC_UPDOWN_MODE_SEL
,
"Mode Select"
,
USB_MIXER_U8
},
{
USB_PROC_UPDOWN_MODE_SEL
,
"Mode Select"
,
USB_MIXER_U8
,
1
},
{
0
}
};
static
struct
procunit_value_info
prologic_proc_info
[]
=
{
{
USB_PROC_PROLOGIC_SWITCH
,
"Switch"
,
USB_MIXER_BOOLEAN
},
{
USB_PROC_PROLOGIC_MODE_SEL
,
"Mode Select"
,
USB_MIXER_U8
},
{
USB_PROC_PROLOGIC_MODE_SEL
,
"Mode Select"
,
USB_MIXER_U8
,
1
},
{
0
}
};
static
struct
procunit_value_info
threed_enh_proc_info
[]
=
{
...
...
@@ -1173,7 +1175,7 @@ static int build_audio_procunit(mixer_build_t *state, int unitid, unsigned char
cval
->
channels
=
1
;
/* get min/max values */
get_min_max
(
cval
);
get_min_max
(
cval
,
valinfo
->
min_value
);
kctl
=
snd_ctl_new1
(
&
mixer_procunit_ctl
,
cval
);
if
(
!
kctl
)
{
...
...
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