Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
37fa84d8
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
37fa84d8
编写于
11月 26, 2010
作者:
T
Takashi Iwai
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'fix/asoc' into for-linus
上级
5a8cfb4e
25436180
变更
23
隐藏空白更改
内联
并排
Showing
23 changed file
with
85 addition
and
38 deletion
+85
-38
sound/soc/atmel/sam9g20_wm8731.c
sound/soc/atmel/sam9g20_wm8731.c
+6
-3
sound/soc/atmel/snd-soc-afeb9260.c
sound/soc/atmel/snd-soc-afeb9260.c
+0
-1
sound/soc/codecs/max98088.c
sound/soc/codecs/max98088.c
+3
-0
sound/soc/codecs/stac9766.c
sound/soc/codecs/stac9766.c
+1
-0
sound/soc/codecs/tlv320aic3x.c
sound/soc/codecs/tlv320aic3x.c
+3
-3
sound/soc/codecs/tpa6130a2.c
sound/soc/codecs/tpa6130a2.c
+3
-1
sound/soc/codecs/wm8523.c
sound/soc/codecs/wm8523.c
+0
-1
sound/soc/codecs/wm8904.c
sound/soc/codecs/wm8904.c
+2
-0
sound/soc/codecs/wm8961.c
sound/soc/codecs/wm8961.c
+2
-2
sound/soc/codecs/wm8994.c
sound/soc/codecs/wm8994.c
+4
-0
sound/soc/davinci/davinci-vcif.c
sound/soc/davinci/davinci-vcif.c
+3
-0
sound/soc/ep93xx/simone.c
sound/soc/ep93xx/simone.c
+10
-8
sound/soc/fsl/efika-audio-fabric.c
sound/soc/fsl/efika-audio-fabric.c
+1
-0
sound/soc/fsl/mpc5200_dma.c
sound/soc/fsl/mpc5200_dma.c
+0
-1
sound/soc/fsl/pcm030-audio-fabric.c
sound/soc/fsl/pcm030-audio-fabric.c
+1
-0
sound/soc/imx/imx-ssi.c
sound/soc/imx/imx-ssi.c
+11
-4
sound/soc/imx/phycore-ac97.c
sound/soc/imx/phycore-ac97.c
+21
-7
sound/soc/nuc900/nuc900-ac97.c
sound/soc/nuc900/nuc900-ac97.c
+1
-1
sound/soc/omap/omap3pandora.c
sound/soc/omap/omap3pandora.c
+1
-0
sound/soc/omap/osk5912.c
sound/soc/omap/osk5912.c
+8
-3
sound/soc/pxa/Kconfig
sound/soc/pxa/Kconfig
+1
-0
sound/soc/s3c24xx/smdk_spdif.c
sound/soc/s3c24xx/smdk_spdif.c
+2
-2
sound/soc/sh/ssi.c
sound/soc/sh/ssi.c
+1
-1
未找到文件。
sound/soc/atmel/sam9g20_wm8731.c
浏览文件 @
37fa84d8
...
...
@@ -222,9 +222,9 @@ static int __init at91sam9g20ek_init(void)
}
pllb
=
clk_get
(
NULL
,
"pllb"
);
if
(
IS_ERR
(
mclk
))
{
if
(
IS_ERR
(
pllb
))
{
printk
(
KERN_ERR
"ASoC: Failed to get PLLB
\n
"
);
ret
=
PTR_ERR
(
mclk
);
ret
=
PTR_ERR
(
pllb
);
goto
err_mclk
;
}
ret
=
clk_set_parent
(
mclk
,
pllb
);
...
...
@@ -240,6 +240,7 @@ static int __init at91sam9g20ek_init(void)
if
(
!
at91sam9g20ek_snd_device
)
{
printk
(
KERN_ERR
"ASoC: Platform device allocation failed
\n
"
);
ret
=
-
ENOMEM
;
goto
err_mclk
;
}
platform_set_drvdata
(
at91sam9g20ek_snd_device
,
...
...
@@ -248,11 +249,13 @@ static int __init at91sam9g20ek_init(void)
ret
=
platform_device_add
(
at91sam9g20ek_snd_device
);
if
(
ret
)
{
printk
(
KERN_ERR
"ASoC: Platform device allocation failed
\n
"
);
platform_device_put
(
at91sam9g20ek_snd_device
)
;
goto
err_device_add
;
}
return
ret
;
err_device_add:
platform_device_put
(
at91sam9g20ek_snd_device
);
err_mclk:
clk_put
(
mclk
);
mclk
=
NULL
;
...
...
sound/soc/atmel/snd-soc-afeb9260.c
浏览文件 @
37fa84d8
...
...
@@ -167,7 +167,6 @@ static int __init afeb9260_soc_init(void)
return
0
;
err1:
platform_device_del
(
afeb9260_snd_device
);
platform_device_put
(
afeb9260_snd_device
);
return
err
;
}
...
...
sound/soc/codecs/max98088.c
浏览文件 @
37fa84d8
...
...
@@ -2019,7 +2019,10 @@ static int max98088_probe(struct snd_soc_codec *codec)
static
int
max98088_remove
(
struct
snd_soc_codec
*
codec
)
{
struct
max98088_priv
*
max98088
=
snd_soc_codec_get_drvdata
(
codec
);
max98088_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
kfree
(
max98088
->
eq_texts
);
return
0
;
}
...
...
sound/soc/codecs/stac9766.c
浏览文件 @
37fa84d8
...
...
@@ -383,6 +383,7 @@ static struct snd_soc_codec_driver soc_codec_dev_stac9766 = {
.
reg_cache_size
=
sizeof
(
stac9766_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_step
=
2
,
.
reg_cache_default
=
stac9766_reg
,
};
static
__devinit
int
stac9766_probe
(
struct
platform_device
*
pdev
)
...
...
sound/soc/codecs/tlv320aic3x.c
浏览文件 @
37fa84d8
...
...
@@ -1176,7 +1176,7 @@ EXPORT_SYMBOL_GPL(aic3x_set_gpio);
int
aic3x_get_gpio
(
struct
snd_soc_codec
*
codec
,
int
gpio
)
{
u8
reg
=
gpio
?
AIC3X_GPIO2_REG
:
AIC3X_GPIO1_REG
;
u8
val
,
bit
=
gpio
?
2
:
1
;
u8
val
=
0
,
bit
=
gpio
?
2
:
1
;
aic3x_read
(
codec
,
reg
,
&
val
);
return
(
val
>>
bit
)
&
1
;
...
...
@@ -1204,7 +1204,7 @@ EXPORT_SYMBOL_GPL(aic3x_set_headset_detection);
int
aic3x_headset_detected
(
struct
snd_soc_codec
*
codec
)
{
u8
val
;
u8
val
=
0
;
aic3x_read
(
codec
,
AIC3X_HEADSET_DETECT_CTRL_B
,
&
val
);
return
(
val
>>
4
)
&
1
;
}
...
...
@@ -1212,7 +1212,7 @@ EXPORT_SYMBOL_GPL(aic3x_headset_detected);
int
aic3x_button_pressed
(
struct
snd_soc_codec
*
codec
)
{
u8
val
;
u8
val
=
0
;
aic3x_read
(
codec
,
AIC3X_HEADSET_DETECT_CTRL_B
,
&
val
);
return
(
val
>>
5
)
&
1
;
}
...
...
sound/soc/codecs/tpa6130a2.c
浏览文件 @
37fa84d8
...
...
@@ -78,8 +78,10 @@ static int tpa6130a2_i2c_write(int reg, u8 value)
if
(
data
->
power_state
)
{
val
=
i2c_smbus_write_byte_data
(
tpa6130a2_client
,
reg
,
value
);
if
(
val
<
0
)
if
(
val
<
0
)
{
dev_err
(
&
tpa6130a2_client
->
dev
,
"Write failed
\n
"
);
return
val
;
}
}
/* Either powered on or off, we save the context */
...
...
sound/soc/codecs/wm8523.c
浏览文件 @
37fa84d8
...
...
@@ -146,7 +146,6 @@ static int wm8523_startup(struct snd_pcm_substream *substream,
return
-
EINVAL
;
}
return
0
;
snd_pcm_hw_constraint_list
(
substream
->
runtime
,
0
,
SNDRV_PCM_HW_PARAM_RATE
,
&
wm8523
->
rate_constraint
);
...
...
sound/soc/codecs/wm8904.c
浏览文件 @
37fa84d8
...
...
@@ -2498,6 +2498,8 @@ static int wm8904_remove(struct snd_soc_codec *codec)
wm8904_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
regulator_bulk_free
(
ARRAY_SIZE
(
wm8904
->
supplies
),
wm8904
->
supplies
);
kfree
(
wm8904
->
retune_mobile_texts
);
kfree
(
wm8904
->
drc_texts
);
return
0
;
}
...
...
sound/soc/codecs/wm8961.c
浏览文件 @
37fa84d8
...
...
@@ -711,7 +711,7 @@ static int wm8961_hw_params(struct snd_pcm_substream *substream,
if
(
fs
<=
24000
)
reg
|=
WM8961_DACSLOPE
;
else
reg
&=
WM8961_DACSLOPE
;
reg
&=
~
WM8961_DACSLOPE
;
snd_soc_write
(
codec
,
WM8961_ADC_DAC_CONTROL_2
,
reg
);
return
0
;
...
...
@@ -736,7 +736,7 @@ static int wm8961_set_sysclk(struct snd_soc_dai *dai, int clk_id,
freq
/=
2
;
}
else
{
dev_dbg
(
codec
->
dev
,
"Using MCLK/1 for %dHz MCLK
\n
"
,
freq
);
reg
&=
WM8961_MCLKDIV
;
reg
&=
~
WM8961_MCLKDIV
;
}
snd_soc_write
(
codec
,
WM8961_CLOCKING1
,
reg
);
...
...
sound/soc/codecs/wm8994.c
浏览文件 @
37fa84d8
...
...
@@ -4061,6 +4061,8 @@ static int wm8994_codec_remove(struct snd_soc_codec *codec)
wm8994_free_irq
(
codec
->
control_data
,
WM8994_IRQ_MIC2_DET
,
wm8994
);
wm8994_free_irq
(
codec
->
control_data
,
WM8994_IRQ_MIC1_SHRT
,
wm8994
);
wm8994_free_irq
(
codec
->
control_data
,
WM8994_IRQ_MIC1_DET
,
wm8994
);
kfree
(
wm8994
->
retune_mobile_texts
);
kfree
(
wm8994
->
drc_texts
);
kfree
(
wm8994
);
return
0
;
...
...
@@ -4073,6 +4075,8 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8994 = {
.
resume
=
wm8994_resume
,
.
read
=
wm8994_read
,
.
write
=
wm8994_write
,
.
readable_register
=
wm8994_readable
,
.
volatile_register
=
wm8994_volatile
,
.
set_bias_level
=
wm8994_set_bias_level
,
};
...
...
sound/soc/davinci/davinci-vcif.c
浏览文件 @
37fa84d8
...
...
@@ -247,7 +247,10 @@ static int davinci_vcif_probe(struct platform_device *pdev)
static
int
davinci_vcif_remove
(
struct
platform_device
*
pdev
)
{
struct
davinci_vcif_dev
*
davinci_vcif_dev
=
dev_get_drvdata
(
&
pdev
->
dev
);
snd_soc_unregister_dai
(
&
pdev
->
dev
);
kfree
(
davinci_vcif_dev
);
return
0
;
}
...
...
sound/soc/ep93xx/simone.c
浏览文件 @
37fa84d8
...
...
@@ -54,24 +54,26 @@ static int __init simone_init(void)
ret
=
platform_device_add
(
simone_snd_ac97_device
);
if
(
ret
)
goto
fail
;
goto
fail
1
;
simone_snd_device
=
platform_device_alloc
(
"soc-audio"
,
-
1
);
if
(
!
simone_snd_device
)
{
ret
=
-
ENOMEM
;
goto
fail
;
goto
fail
2
;
}
platform_set_drvdata
(
simone_snd_device
,
&
snd_soc_simone
);
ret
=
platform_device_add
(
simone_snd_device
);
if
(
ret
)
{
platform_device_put
(
simone_snd_device
);
goto
fail
;
}
if
(
ret
)
goto
fail3
;
return
ret
;
return
0
;
fail:
fail3:
platform_device_put
(
simone_snd_device
);
fail2:
platform_device_del
(
simone_snd_ac97_device
);
fail1:
platform_device_put
(
simone_snd_ac97_device
);
return
ret
;
}
...
...
sound/soc/fsl/efika-audio-fabric.c
浏览文件 @
37fa84d8
...
...
@@ -76,6 +76,7 @@ static __init int efika_fabric_init(void)
rc
=
platform_device_add
(
pdev
);
if
(
rc
)
{
pr_err
(
"efika_fabric_init: platform_device_add() failed
\n
"
);
platform_device_put
(
pdev
);
return
-
ENODEV
;
}
return
0
;
...
...
sound/soc/fsl/mpc5200_dma.c
浏览文件 @
37fa84d8
...
...
@@ -9,7 +9,6 @@
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/slab.h>
#include <linux/of_device.h>
#include <linux/of_platform.h>
#include <sound/soc.h>
...
...
sound/soc/fsl/pcm030-audio-fabric.c
浏览文件 @
37fa84d8
...
...
@@ -76,6 +76,7 @@ static __init int pcm030_fabric_init(void)
rc
=
platform_device_add
(
pdev
);
if
(
rc
)
{
pr_err
(
"pcm030_fabric_init: platform_device_add() failed
\n
"
);
platform_device_put
(
pdev
);
return
-
ENODEV
;
}
return
0
;
...
...
sound/soc/imx/imx-ssi.c
浏览文件 @
37fa84d8
...
...
@@ -679,8 +679,11 @@ static int imx_ssi_probe(struct platform_device *pdev)
}
ssi
->
soc_platform_pdev_fiq
=
platform_device_alloc
(
"imx-fiq-pcm-audio"
,
pdev
->
id
);
if
(
!
ssi
->
soc_platform_pdev_fiq
)
if
(
!
ssi
->
soc_platform_pdev_fiq
)
{
ret
=
-
ENOMEM
;
goto
failed_pdev_fiq_alloc
;
}
platform_set_drvdata
(
ssi
->
soc_platform_pdev_fiq
,
ssi
);
ret
=
platform_device_add
(
ssi
->
soc_platform_pdev_fiq
);
if
(
ret
)
{
...
...
@@ -689,8 +692,11 @@ static int imx_ssi_probe(struct platform_device *pdev)
}
ssi
->
soc_platform_pdev
=
platform_device_alloc
(
"imx-pcm-audio"
,
pdev
->
id
);
if
(
!
ssi
->
soc_platform_pdev
)
if
(
!
ssi
->
soc_platform_pdev
)
{
ret
=
-
ENOMEM
;
goto
failed_pdev_alloc
;
}
platform_set_drvdata
(
ssi
->
soc_platform_pdev
,
ssi
);
ret
=
platform_device_add
(
ssi
->
soc_platform_pdev
);
if
(
ret
)
{
...
...
@@ -703,6 +709,7 @@ static int imx_ssi_probe(struct platform_device *pdev)
failed_pdev_add:
platform_device_put
(
ssi
->
soc_platform_pdev
);
failed_pdev_alloc:
platform_device_del
(
ssi
->
soc_platform_pdev_fiq
);
failed_pdev_fiq_add:
platform_device_put
(
ssi
->
soc_platform_pdev_fiq
);
failed_pdev_fiq_alloc:
...
...
@@ -726,8 +733,8 @@ static int __devexit imx_ssi_remove(struct platform_device *pdev)
struct
resource
*
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
struct
imx_ssi
*
ssi
=
platform_get_drvdata
(
pdev
);
platform_device_
del
(
ssi
->
soc_platform_pdev
);
platform_device_
put
(
ssi
->
soc_platform_pdev
);
platform_device_
unregister
(
ssi
->
soc_platform_pdev
);
platform_device_
unregister
(
ssi
->
soc_platform_pdev_fiq
);
snd_soc_unregister_dai
(
&
pdev
->
dev
);
...
...
sound/soc/imx/phycore-ac97.c
浏览文件 @
37fa84d8
...
...
@@ -43,6 +43,7 @@ static struct snd_soc_card imx_phycore = {
.
num_links
=
ARRAY_SIZE
(
imx_phycore_dai_ac97
),
};
static
struct
platform_device
*
imx_phycore_snd_ac97_device
;
static
struct
platform_device
*
imx_phycore_snd_device
;
static
int
__init
imx_phycore_init
(
void
)
...
...
@@ -53,29 +54,42 @@ static int __init imx_phycore_init(void)
/* return happy. We might run on a totally different machine */
return
0
;
imx_phycore_snd_device
=
platform_device_alloc
(
"soc-audio"
,
-
1
);
if
(
!
imx_phycore_snd_device
)
imx_phycore_snd_
ac97_
device
=
platform_device_alloc
(
"soc-audio"
,
-
1
);
if
(
!
imx_phycore_snd_
ac97_
device
)
return
-
ENOMEM
;
platform_set_drvdata
(
imx_phycore_snd_device
,
&
imx_phycore
);
ret
=
platform_device_add
(
imx_phycore_snd_device
);
platform_set_drvdata
(
imx_phycore_snd_ac97_device
,
&
imx_phycore
);
ret
=
platform_device_add
(
imx_phycore_snd_ac97_device
);
if
(
ret
)
goto
fail1
;
imx_phycore_snd_device
=
platform_device_alloc
(
"wm9712-codec"
,
-
1
);
if
(
!
imx_phycore_snd_device
)
return
-
ENOMEM
;
if
(
!
imx_phycore_snd_device
)
{
ret
=
-
ENOMEM
;
goto
fail2
;
}
ret
=
platform_device_add
(
imx_phycore_snd_device
);
if
(
ret
)
{
printk
(
KERN_ERR
"ASoC: Platform device allocation failed
\n
"
);
platform_device_put
(
imx_phycore_snd_device
)
;
goto
fail3
;
}
return
0
;
fail3:
platform_device_put
(
imx_phycore_snd_device
);
fail2:
platform_device_del
(
imx_phycore_snd_ac97_device
);
fail1:
platform_device_put
(
imx_phycore_snd_ac97_device
);
return
ret
;
}
static
void
__exit
imx_phycore_exit
(
void
)
{
platform_device_unregister
(
imx_phycore_snd_device
);
platform_device_unregister
(
imx_phycore_snd_ac97_device
);
}
late_initcall
(
imx_phycore_init
);
...
...
sound/soc/nuc900/nuc900-ac97.c
浏览文件 @
37fa84d8
...
...
@@ -384,7 +384,6 @@ static int __devinit nuc900_ac97_drvprobe(struct platform_device *pdev)
static
int
__devexit
nuc900_ac97_drvremove
(
struct
platform_device
*
pdev
)
{
snd_soc_unregister_dai
(
&
pdev
->
dev
);
clk_put
(
nuc900_ac97_data
->
clk
);
...
...
@@ -392,6 +391,7 @@ static int __devexit nuc900_ac97_drvremove(struct platform_device *pdev)
release_mem_region
(
nuc900_ac97_data
->
res
->
start
,
resource_size
(
nuc900_ac97_data
->
res
));
kfree
(
nuc900_ac97_data
);
nuc900_ac97_data
=
NULL
;
return
0
;
...
...
sound/soc/omap/omap3pandora.c
浏览文件 @
37fa84d8
...
...
@@ -306,6 +306,7 @@ static int __init omap3pandora_soc_init(void)
pr_err
(
PREFIX
"Failed to get DAC regulator from %s: %ld
\n
"
,
dev_name
(
&
omap3pandora_snd_device
->
dev
),
PTR_ERR
(
omap3pandora_dac_reg
));
ret
=
PTR_ERR
(
omap3pandora_dac_reg
);
goto
fail3
;
}
...
...
sound/soc/omap/osk5912.c
浏览文件 @
37fa84d8
...
...
@@ -177,7 +177,8 @@ static int __init osk_soc_init(void)
tlv320aic23_mclk
=
clk_get
(
dev
,
"mclk"
);
if
(
IS_ERR
(
tlv320aic23_mclk
))
{
printk
(
KERN_ERR
"Could not get mclk clock
\n
"
);
return
-
ENODEV
;
err
=
PTR_ERR
(
tlv320aic23_mclk
);
goto
err2
;
}
/*
...
...
@@ -188,7 +189,7 @@ static int __init osk_soc_init(void)
if
(
clk_set_rate
(
tlv320aic23_mclk
,
CODEC_CLOCK
))
{
printk
(
KERN_ERR
"Cannot set MCLK for AIC23 CODEC
\n
"
);
err
=
-
ECANCELED
;
goto
err
1
;
goto
err
3
;
}
}
...
...
@@ -196,9 +197,12 @@ static int __init osk_soc_init(void)
(
uint
)
clk_get_rate
(
tlv320aic23_mclk
),
CODEC_CLOCK
);
return
0
;
err1:
err3:
clk_put
(
tlv320aic23_mclk
);
err2:
platform_device_del
(
osk_snd_device
);
err1:
platform_device_put
(
osk_snd_device
);
return
err
;
...
...
@@ -207,6 +211,7 @@ static int __init osk_soc_init(void)
static
void
__exit
osk_soc_exit
(
void
)
{
clk_put
(
tlv320aic23_mclk
);
platform_device_unregister
(
osk_snd_device
);
}
...
...
sound/soc/pxa/Kconfig
浏览文件 @
37fa84d8
config SND_PXA2XX_SOC
tristate "SoC Audio for the Intel PXA2xx chip"
depends on ARCH_PXA
select SND_ARM
select SND_PXA2XX_LIB
help
Say Y or M if you want to add support for codecs attached to
...
...
sound/soc/s3c24xx/smdk_spdif.c
浏览文件 @
37fa84d8
...
...
@@ -38,7 +38,7 @@ static int set_audio_clock_heirachy(struct platform_device *pdev)
}
mout_epll
=
clk_get
(
NULL
,
"mout_epll"
);
if
(
IS_ERR
(
f
out_epll
))
{
if
(
IS_ERR
(
m
out_epll
))
{
printk
(
KERN_WARNING
"%s: Cannot find mout_epll.
\n
"
,
__func__
);
ret
=
-
EINVAL
;
...
...
@@ -54,7 +54,7 @@ static int set_audio_clock_heirachy(struct platform_device *pdev)
}
sclk_spdif
=
clk_get
(
NULL
,
"sclk_spdif"
);
if
(
IS_ERR
(
fout_epll
))
{
if
(
IS_ERR
(
sclk_spdif
))
{
printk
(
KERN_WARNING
"%s: Cannot find sclk_spdif.
\n
"
,
__func__
);
ret
=
-
EINVAL
;
...
...
sound/soc/sh/ssi.c
浏览文件 @
37fa84d8
...
...
@@ -387,7 +387,7 @@ static int __devinit sh4_soc_dai_probe(struct platform_device *pdev)
static
int
__devexit
sh4_soc_dai_remove
(
struct
platform_device
*
pdev
)
{
snd_soc_unregister_dai
(
&
pdev
->
dev
,
ARRAY_SIZE
(
sh4_ssi_dai
));
snd_soc_unregister_dai
s
(
&
pdev
->
dev
,
ARRAY_SIZE
(
sh4_ssi_dai
));
return
0
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录