Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
7af2755d
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看板
提交
7af2755d
编写于
9月 23, 2013
作者:
L
Linus Walleij
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'iop-cleanup' into devel
上级
1dc94272
e34ca9de
变更
19
隐藏空白更改
内联
并排
Showing
19 changed file
with
135 addition
and
128 deletion
+135
-128
arch/arm/Kconfig
arch/arm/Kconfig
+2
-2
arch/arm/include/asm/hardware/iop3xx-gpio.h
arch/arm/include/asm/hardware/iop3xx-gpio.h
+0
-75
arch/arm/include/asm/hardware/iop3xx.h
arch/arm/include/asm/hardware/iop3xx.h
+0
-12
arch/arm/mach-iop32x/em7210.c
arch/arm/mach-iop32x/em7210.c
+2
-0
arch/arm/mach-iop32x/glantank.c
arch/arm/mach-iop32x/glantank.c
+2
-0
arch/arm/mach-iop32x/gpio-iop32x.h
arch/arm/mach-iop32x/gpio-iop32x.h
+10
-0
arch/arm/mach-iop32x/include/mach/gpio.h
arch/arm/mach-iop32x/include/mach/gpio.h
+0
-6
arch/arm/mach-iop32x/include/mach/iop32x.h
arch/arm/mach-iop32x/include/mach/iop32x.h
+0
-1
arch/arm/mach-iop32x/iq31244.c
arch/arm/mach-iop32x/iq31244.c
+2
-0
arch/arm/mach-iop32x/iq80321.c
arch/arm/mach-iop32x/iq80321.c
+2
-0
arch/arm/mach-iop32x/n2100.c
arch/arm/mach-iop32x/n2100.c
+39
-8
arch/arm/mach-iop33x/include/mach/gpio.h
arch/arm/mach-iop33x/include/mach/gpio.h
+0
-6
arch/arm/mach-iop33x/include/mach/iop33x.h
arch/arm/mach-iop33x/include/mach/iop33x.h
+0
-1
arch/arm/mach-iop33x/iq80331.c
arch/arm/mach-iop33x/iq80331.c
+7
-0
arch/arm/mach-iop33x/iq80332.c
arch/arm/mach-iop33x/iq80332.c
+7
-0
arch/arm/plat-iop/Makefile
arch/arm/plat-iop/Makefile
+0
-2
drivers/gpio/Kconfig
drivers/gpio/Kconfig
+9
-0
drivers/gpio/Makefile
drivers/gpio/Makefile
+1
-0
drivers/gpio/gpio-iop.c
drivers/gpio/gpio-iop.c
+52
-15
未找到文件。
arch/arm/Kconfig
浏览文件 @
7af2755d
...
...
@@ -457,7 +457,7 @@ config ARCH_IOP32X
depends on MMU
select ARCH_REQUIRE_GPIOLIB
select CPU_XSCALE
select
NEED_MACH_GPIO_H
select
GPIO_IOP
select NEED_RET_TO_USER
select PCI
select PLAT_IOP
...
...
@@ -470,7 +470,7 @@ config ARCH_IOP33X
depends on MMU
select ARCH_REQUIRE_GPIOLIB
select CPU_XSCALE
select
NEED_MACH_GPIO_H
select
GPIO_IOP
select NEED_RET_TO_USER
select PCI
select PLAT_IOP
...
...
arch/arm/include/asm/hardware/iop3xx-gpio.h
已删除
100644 → 0
浏览文件 @
1dc94272
/*
* arch/arm/include/asm/hardware/iop3xx-gpio.h
*
* IOP3xx GPIO wrappers
*
* Copyright (c) 2008 Arnaud Patard <arnaud.patard@rtp-net.org>
* Based on IXP4XX gpio.h file
*
* 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
* the Free Software Foundation; either version 2 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 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 __ASM_ARM_HARDWARE_IOP3XX_GPIO_H
#define __ASM_ARM_HARDWARE_IOP3XX_GPIO_H
#include <mach/hardware.h>
#include <asm-generic/gpio.h>
#define __ARM_GPIOLIB_COMPLEX
#define IOP3XX_N_GPIOS 8
static
inline
int
gpio_get_value
(
unsigned
gpio
)
{
if
(
gpio
>
IOP3XX_N_GPIOS
)
return
__gpio_get_value
(
gpio
);
return
gpio_line_get
(
gpio
);
}
static
inline
void
gpio_set_value
(
unsigned
gpio
,
int
value
)
{
if
(
gpio
>
IOP3XX_N_GPIOS
)
{
__gpio_set_value
(
gpio
,
value
);
return
;
}
gpio_line_set
(
gpio
,
value
);
}
static
inline
int
gpio_cansleep
(
unsigned
gpio
)
{
if
(
gpio
<
IOP3XX_N_GPIOS
)
return
0
;
else
return
__gpio_cansleep
(
gpio
);
}
/*
* The GPIOs are not generating any interrupt
* Note : manuals are not clear about this
*/
static
inline
int
gpio_to_irq
(
int
gpio
)
{
return
-
EINVAL
;
}
static
inline
int
irq_to_gpio
(
int
gpio
)
{
return
-
EINVAL
;
}
#endif
arch/arm/include/asm/hardware/iop3xx.h
浏览文件 @
7af2755d
...
...
@@ -18,16 +18,9 @@
/*
* IOP3XX GPIO handling
*/
#define GPIO_IN 0
#define GPIO_OUT 1
#define GPIO_LOW 0
#define GPIO_HIGH 1
#define IOP3XX_GPIO_LINE(x) (x)
#ifndef __ASSEMBLY__
extern
void
gpio_line_config
(
int
line
,
int
direction
);
extern
int
gpio_line_get
(
int
line
);
extern
void
gpio_line_set
(
int
line
,
int
value
);
extern
int
init_atu
;
extern
int
iop3xx_get_init_atu
(
void
);
#endif
...
...
@@ -168,11 +161,6 @@ extern int iop3xx_get_init_atu(void);
/* PERCR0 DOESN'T EXIST - index from 1! */
#define IOP3XX_PERCR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0710)
/* General Purpose I/O */
#define IOP3XX_GPOE (volatile u32 *)IOP3XX_GPIO_REG(0x0000)
#define IOP3XX_GPID (volatile u32 *)IOP3XX_GPIO_REG(0x0004)
#define IOP3XX_GPOD (volatile u32 *)IOP3XX_GPIO_REG(0x0008)
/* Timers */
#define IOP3XX_TU_TMR0 (volatile u32 *)IOP3XX_TIMER_REG(0x0000)
#define IOP3XX_TU_TMR1 (volatile u32 *)IOP3XX_TIMER_REG(0x0004)
...
...
arch/arm/mach-iop32x/em7210.c
浏览文件 @
7af2755d
...
...
@@ -32,6 +32,7 @@
#include <asm/mach/time.h>
#include <asm/mach-types.h>
#include <mach/time.h>
#include "gpio-iop32x.h"
static
void
__init
em7210_timer_init
(
void
)
{
...
...
@@ -183,6 +184,7 @@ void em7210_power_off(void)
static
void
__init
em7210_init_machine
(
void
)
{
register_iop32x_gpio
();
platform_device_register
(
&
em7210_serial_device
);
platform_device_register
(
&
iop3xx_i2c0_device
);
platform_device_register
(
&
iop3xx_i2c1_device
);
...
...
arch/arm/mach-iop32x/glantank.c
浏览文件 @
7af2755d
...
...
@@ -34,6 +34,7 @@
#include <asm/mach-types.h>
#include <asm/page.h>
#include <mach/time.h>
#include "gpio-iop32x.h"
/*
* GLAN Tank timer tick configuration.
...
...
@@ -187,6 +188,7 @@ static void glantank_power_off(void)
static
void
__init
glantank_init_machine
(
void
)
{
register_iop32x_gpio
();
platform_device_register
(
&
iop3xx_i2c0_device
);
platform_device_register
(
&
iop3xx_i2c1_device
);
platform_device_register
(
&
glantank_flash_device
);
...
...
arch/arm/mach-iop32x/gpio-iop32x.h
0 → 100644
浏览文件 @
7af2755d
static
struct
resource
iop32x_gpio_res
[]
=
{
DEFINE_RES_MEM
((
IOP3XX_PERIPHERAL_PHYS_BASE
+
0x07c4
),
0x10
),
};
static
inline
void
register_iop32x_gpio
(
void
)
{
platform_device_register_simple
(
"gpio-iop"
,
0
,
iop32x_gpio_res
,
ARRAY_SIZE
(
iop32x_gpio_res
));
}
arch/arm/mach-iop32x/include/mach/gpio.h
已删除
100644 → 0
浏览文件 @
1dc94272
#ifndef __ASM_ARCH_IOP32X_GPIO_H
#define __ASM_ARCH_IOP32X_GPIO_H
#include <asm/hardware/iop3xx-gpio.h>
#endif
arch/arm/mach-iop32x/include/mach/iop32x.h
浏览文件 @
7af2755d
...
...
@@ -19,7 +19,6 @@
* Peripherals that are shared between the iop32x and iop33x but
* located at different addresses.
*/
#define IOP3XX_GPIO_REG(reg) (IOP3XX_PERIPHERAL_VIRT_BASE + 0x07c4 + (reg))
#define IOP3XX_TIMER_REG(reg) (IOP3XX_PERIPHERAL_VIRT_BASE + 0x07e0 + (reg))
#include <asm/hardware/iop3xx.h>
...
...
arch/arm/mach-iop32x/iq31244.c
浏览文件 @
7af2755d
...
...
@@ -37,6 +37,7 @@
#include <asm/page.h>
#include <asm/pgtable.h>
#include <mach/time.h>
#include "gpio-iop32x.h"
/*
* Until March of 2007 iq31244 platforms and ep80219 platforms shared the
...
...
@@ -283,6 +284,7 @@ void ep80219_power_off(void)
static
void
__init
iq31244_init_machine
(
void
)
{
register_iop32x_gpio
();
platform_device_register
(
&
iop3xx_i2c0_device
);
platform_device_register
(
&
iop3xx_i2c1_device
);
platform_device_register
(
&
iq31244_flash_device
);
...
...
arch/arm/mach-iop32x/iq80321.c
浏览文件 @
7af2755d
...
...
@@ -33,6 +33,7 @@
#include <asm/page.h>
#include <asm/pgtable.h>
#include <mach/time.h>
#include "gpio-iop32x.h"
/*
* IQ80321 timer tick configuration.
...
...
@@ -170,6 +171,7 @@ static struct platform_device iq80321_serial_device = {
static
void
__init
iq80321_init_machine
(
void
)
{
register_iop32x_gpio
();
platform_device_register
(
&
iop3xx_i2c0_device
);
platform_device_register
(
&
iop3xx_i2c1_device
);
platform_device_register
(
&
iq80321_flash_device
);
...
...
arch/arm/mach-iop32x/n2100.c
浏览文件 @
7af2755d
...
...
@@ -30,6 +30,7 @@
#include <linux/platform_device.h>
#include <linux/reboot.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <mach/hardware.h>
#include <asm/irq.h>
#include <asm/mach/arch.h>
...
...
@@ -40,6 +41,7 @@
#include <asm/page.h>
#include <asm/pgtable.h>
#include <mach/time.h>
#include "gpio-iop32x.h"
/*
* N2100 timer tick configuration.
...
...
@@ -288,8 +290,14 @@ static void n2100_power_off(void)
static
void
n2100_restart
(
enum
reboot_mode
mode
,
const
char
*
cmd
)
{
gpio_line_set
(
N2100_HARDWARE_RESET
,
GPIO_LOW
);
gpio_line_config
(
N2100_HARDWARE_RESET
,
GPIO_OUT
);
int
ret
;
ret
=
gpio_direction_output
(
N2100_HARDWARE_RESET
,
0
);
if
(
ret
)
{
pr_crit
(
"could not drive reset GPIO low
\n
"
);
return
;
}
/* Wait for reset to happen */
while
(
1
)
;
}
...
...
@@ -299,7 +307,7 @@ static struct timer_list power_button_poll_timer;
static
void
power_button_poll
(
unsigned
long
dummy
)
{
if
(
gpio_
line_get
(
N2100_POWER_BUTTON
)
==
0
)
{
if
(
gpio_
get_value
(
N2100_POWER_BUTTON
)
==
0
)
{
ctrl_alt_del
();
return
;
}
...
...
@@ -308,9 +316,37 @@ static void power_button_poll(unsigned long dummy)
add_timer
(
&
power_button_poll_timer
);
}
static
int
__init
n2100_request_gpios
(
void
)
{
int
ret
;
if
(
!
machine_is_n2100
())
return
0
;
ret
=
gpio_request
(
N2100_HARDWARE_RESET
,
"reset"
);
if
(
ret
)
pr_err
(
"could not request reset GPIO
\n
"
);
ret
=
gpio_request
(
N2100_POWER_BUTTON
,
"power"
);
if
(
ret
)
pr_err
(
"could not request power GPIO
\n
"
);
else
{
ret
=
gpio_direction_input
(
N2100_POWER_BUTTON
);
if
(
ret
)
pr_err
(
"could not set power GPIO as input
\n
"
);
}
/* Set up power button poll timer */
init_timer
(
&
power_button_poll_timer
);
power_button_poll_timer
.
function
=
power_button_poll
;
power_button_poll_timer
.
expires
=
jiffies
+
(
HZ
/
10
);
add_timer
(
&
power_button_poll_timer
);
return
0
;
}
device_initcall
(
n2100_request_gpios
);
static
void
__init
n2100_init_machine
(
void
)
{
register_iop32x_gpio
();
platform_device_register
(
&
iop3xx_i2c0_device
);
platform_device_register
(
&
n2100_flash_device
);
platform_device_register
(
&
n2100_serial_device
);
...
...
@@ -321,11 +357,6 @@ static void __init n2100_init_machine(void)
ARRAY_SIZE
(
n2100_i2c_devices
));
pm_power_off
=
n2100_power_off
;
init_timer
(
&
power_button_poll_timer
);
power_button_poll_timer
.
function
=
power_button_poll
;
power_button_poll_timer
.
expires
=
jiffies
+
(
HZ
/
10
);
add_timer
(
&
power_button_poll_timer
);
}
MACHINE_START
(
N2100
,
"Thecus N2100"
)
...
...
arch/arm/mach-iop33x/include/mach/gpio.h
已删除
100644 → 0
浏览文件 @
1dc94272
#ifndef __ASM_ARCH_IOP33X_GPIO_H
#define __ASM_ARCH_IOP33X_GPIO_H
#include <asm/hardware/iop3xx-gpio.h>
#endif
arch/arm/mach-iop33x/include/mach/iop33x.h
浏览文件 @
7af2755d
...
...
@@ -18,7 +18,6 @@
* Peripherals that are shared between the iop32x and iop33x but
* located at different addresses.
*/
#define IOP3XX_GPIO_REG(reg) (IOP3XX_PERIPHERAL_VIRT_BASE + 0x1780 + (reg))
#define IOP3XX_TIMER_REG(reg) (IOP3XX_PERIPHERAL_VIRT_BASE + 0x07d0 + (reg))
#include <asm/hardware/iop3xx.h>
...
...
arch/arm/mach-iop33x/iq80331.c
浏览文件 @
7af2755d
...
...
@@ -122,8 +122,15 @@ static struct platform_device iq80331_flash_device = {
.
resource
=
&
iq80331_flash_resource
,
};
static
struct
resource
iq80331_gpio_res
[]
=
{
DEFINE_RES_MEM
((
IOP3XX_PERIPHERAL_PHYS_BASE
+
0x1780
),
0x10
),
};
static
void
__init
iq80331_init_machine
(
void
)
{
platform_device_register_simple
(
"gpio-iop"
,
0
,
iq80331_gpio_res
,
ARRAY_SIZE
(
iq80331_gpio_res
));
platform_device_register
(
&
iop3xx_i2c0_device
);
platform_device_register
(
&
iop3xx_i2c1_device
);
platform_device_register
(
&
iop33x_uart0_device
);
...
...
arch/arm/mach-iop33x/iq80332.c
浏览文件 @
7af2755d
...
...
@@ -122,8 +122,15 @@ static struct platform_device iq80332_flash_device = {
.
resource
=
&
iq80332_flash_resource
,
};
static
struct
resource
iq80332_gpio_res
[]
=
{
DEFINE_RES_MEM
((
IOP3XX_PERIPHERAL_PHYS_BASE
+
0x1780
),
0x10
),
};
static
void
__init
iq80332_init_machine
(
void
)
{
platform_device_register_simple
(
"gpio-iop"
,
0
,
iq80332_gpio_res
,
ARRAY_SIZE
(
iq80332_gpio_res
));
platform_device_register
(
&
iop3xx_i2c0_device
);
platform_device_register
(
&
iop3xx_i2c1_device
);
platform_device_register
(
&
iop33x_uart0_device
);
...
...
arch/arm/plat-iop/Makefile
浏览文件 @
7af2755d
...
...
@@ -5,7 +5,6 @@
obj-y
:=
# IOP32X
obj-$(CONFIG_ARCH_IOP32X)
+=
gpio.o
obj-$(CONFIG_ARCH_IOP32X)
+=
i2c.o
obj-$(CONFIG_ARCH_IOP32X)
+=
pci.o
obj-$(CONFIG_ARCH_IOP32X)
+=
setup.o
...
...
@@ -16,7 +15,6 @@ obj-$(CONFIG_ARCH_IOP32X) += pmu.o
obj-$(CONFIG_ARCH_IOP32X)
+=
restart.o
# IOP33X
obj-$(CONFIG_ARCH_IOP33X)
+=
gpio.o
obj-$(CONFIG_ARCH_IOP33X)
+=
i2c.o
obj-$(CONFIG_ARCH_IOP33X)
+=
pci.o
obj-$(CONFIG_ARCH_IOP33X)
+=
setup.o
...
...
drivers/gpio/Kconfig
浏览文件 @
7af2755d
...
...
@@ -320,6 +320,15 @@ config GPIO_ICH
If unsure, say N.
config GPIO_IOP
tristate "Intel IOP GPIO"
depends on ARM && (ARCH_IOP32X || ARCH_IOP33X)
help
Say yes here to support the GPIO functionality of a number of Intel
IOP32X or IOP33X.
If unsure, say N.
config GPIO_VX855
tristate "VIA VX855/VX875 GPIO"
depends on PCI
...
...
drivers/gpio/Makefile
浏览文件 @
7af2755d
...
...
@@ -29,6 +29,7 @@ obj-$(CONFIG_GPIO_F7188X) += gpio-f7188x.o
obj-$(CONFIG_GPIO_GE_FPGA)
+=
gpio-ge.o
obj-$(CONFIG_GPIO_GRGPIO)
+=
gpio-grgpio.o
obj-$(CONFIG_GPIO_ICH)
+=
gpio-ich.o
obj-$(CONFIG_GPIO_IOP)
+=
gpio-iop.o
obj-$(CONFIG_GPIO_IT8761E)
+=
gpio-it8761e.o
obj-$(CONFIG_GPIO_JANZ_TTL)
+=
gpio-janz-ttl.o
obj-$(CONFIG_GPIO_KEMPLD)
+=
gpio-kempld.o
...
...
arch/arm/plat-iop/gpio
.c
→
drivers/gpio/gpio-iop
.c
浏览文件 @
7af2755d
...
...
@@ -16,42 +16,61 @@
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/export.h>
#include <asm/hardware/iop3xx.h>
#include <mach/gpio.h>
#include <linux/platform_device.h>
#include <linux/bitops.h>
#include <linux/io.h>
void
gpio_line_config
(
int
line
,
int
direction
)
#define IOP3XX_N_GPIOS 8
#define GPIO_IN 0
#define GPIO_OUT 1
#define GPIO_LOW 0
#define GPIO_HIGH 1
/* Memory base offset */
static
void
__iomem
*
base
;
#define IOP3XX_GPIO_REG(reg) (base + (reg))
#define IOP3XX_GPOE IOP3XX_GPIO_REG(0x0000)
#define IOP3XX_GPID IOP3XX_GPIO_REG(0x0004)
#define IOP3XX_GPOD IOP3XX_GPIO_REG(0x0008)
static
void
gpio_line_config
(
int
line
,
int
direction
)
{
unsigned
long
flags
;
u32
val
;
local_irq_save
(
flags
);
val
=
readl
(
IOP3XX_GPOE
);
if
(
direction
==
GPIO_IN
)
{
*
IOP3XX_GPOE
|=
1
<<
line
;
val
|=
BIT
(
line
)
;
}
else
if
(
direction
==
GPIO_OUT
)
{
*
IOP3XX_GPOE
&=
~
(
1
<<
line
);
val
&=
~
BIT
(
line
);
}
writel
(
val
,
IOP3XX_GPOE
);
local_irq_restore
(
flags
);
}
EXPORT_SYMBOL
(
gpio_line_config
);
int
gpio_line_get
(
int
line
)
static
int
gpio_line_get
(
int
line
)
{
return
!!
(
*
IOP3XX_GPID
&
(
1
<<
line
));
return
!!
(
readl
(
IOP3XX_GPID
)
&
BIT
(
line
));
}
EXPORT_SYMBOL
(
gpio_line_get
);
void
gpio_line_set
(
int
line
,
int
value
)
static
void
gpio_line_set
(
int
line
,
int
value
)
{
unsigned
long
flags
;
u32
val
;
local_irq_save
(
flags
);
val
=
readl
(
IOP3XX_GPOD
);
if
(
value
==
GPIO_LOW
)
{
*
IOP3XX_GPOD
&=
~
(
1
<<
line
);
val
&=
~
BIT
(
line
);
}
else
if
(
value
==
GPIO_HIGH
)
{
*
IOP3XX_GPOD
|=
1
<<
line
;
val
|=
BIT
(
line
)
;
}
writel
(
val
,
IOP3XX_GPOD
);
local_irq_restore
(
flags
);
}
EXPORT_SYMBOL
(
gpio_line_set
);
static
int
iop3xx_gpio_direction_input
(
struct
gpio_chip
*
chip
,
unsigned
gpio
)
{
...
...
@@ -86,8 +105,26 @@ static struct gpio_chip iop3xx_chip = {
.
ngpio
=
IOP3XX_N_GPIOS
,
};
static
int
__init
iop3xx_gpio_setup
(
void
)
static
int
iop3xx_gpio_probe
(
struct
platform_device
*
pdev
)
{
struct
resource
*
res
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
return
gpiochip_add
(
&
iop3xx_chip
);
}
arch_initcall
(
iop3xx_gpio_setup
);
static
struct
platform_driver
iop3xx_gpio_driver
=
{
.
driver
=
{
.
name
=
"gpio-iop"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
iop3xx_gpio_probe
,
};
static
int
__init
iop3xx_gpio_init
(
void
)
{
return
platform_driver_register
(
&
iop3xx_gpio_driver
);
}
arch_initcall
(
iop3xx_gpio_init
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录