Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
35c66c19
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
158
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
35c66c19
编写于
6月 11, 2007
作者:
P
Pierre Ossman
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
sdio: read and decode interesting parts of the CCCR
Signed-off-by:
N
Pierre Ossman
<
drzeus@drzeus.cx
>
上级
fa64efa1
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
74 addition
and
0 deletion
+74
-0
drivers/mmc/core/sdio.c
drivers/mmc/core/sdio.c
+63
-0
include/linux/mmc/card.h
include/linux/mmc/card.h
+11
-0
未找到文件。
drivers/mmc/core/sdio.c
浏览文件 @
35c66c19
...
...
@@ -13,6 +13,7 @@
#include <linux/mmc/host.h>
#include <linux/mmc/card.h>
#include <linux/mmc/sdio.h>
#include <linux/mmc/sdio_func.h>
#include "core.h"
...
...
@@ -39,6 +40,61 @@ static int sdio_init_func(struct mmc_card *card, unsigned int fn)
return
0
;
}
static
int
sdio_read_cccr
(
struct
mmc_card
*
card
)
{
int
ret
;
int
cccr_vsn
;
unsigned
char
data
;
memset
(
&
card
->
cccr
,
0
,
sizeof
(
struct
sdio_cccr
));
ret
=
mmc_io_rw_direct
(
card
,
0
,
0
,
SDIO_CCCR_CCCR
,
0
,
&
data
);
if
(
ret
)
goto
out
;
cccr_vsn
=
data
&
0x0f
;
if
(
cccr_vsn
>
SDIO_CCCR_REV_1_20
)
{
printk
(
KERN_ERR
"%s: unrecognised CCCR structure version %d
\n
"
,
mmc_hostname
(
card
->
host
),
cccr_vsn
);
return
-
EINVAL
;
}
card
->
cccr
.
sdio_vsn
=
(
data
&
0xf0
)
>>
4
;
ret
=
mmc_io_rw_direct
(
card
,
0
,
0
,
SDIO_CCCR_CAPS
,
0
,
&
data
);
if
(
ret
)
goto
out
;
if
(
data
&
SDIO_CCCR_CAP_SMB
)
card
->
cccr
.
multi_block
=
1
;
if
(
data
&
SDIO_CCCR_CAP_LSC
)
card
->
cccr
.
low_speed
=
1
;
if
(
data
&
SDIO_CCCR_CAP_4BLS
)
card
->
cccr
.
wide_bus
=
1
;
if
(
cccr_vsn
>=
SDIO_CCCR_REV_1_10
)
{
ret
=
mmc_io_rw_direct
(
card
,
0
,
0
,
SDIO_CCCR_POWER
,
0
,
&
data
);
if
(
ret
)
goto
out
;
if
(
data
&
SDIO_POWER_SMPC
)
card
->
cccr
.
high_power
=
1
;
}
if
(
cccr_vsn
>=
SDIO_CCCR_REV_1_20
)
{
ret
=
mmc_io_rw_direct
(
card
,
0
,
0
,
SDIO_CCCR_SPEED
,
0
,
&
data
);
if
(
ret
)
goto
out
;
if
(
data
&
SDIO_SPEED_SHS
)
card
->
cccr
.
high_speed
=
1
;
}
out:
return
ret
;
}
/*
* Host is being removed. Free up the current card.
*/
...
...
@@ -180,6 +236,13 @@ int mmc_attach_sdio(struct mmc_host *host, u32 ocr)
if
(
err
)
goto
remove
;
/*
* Read the common registers.
*/
err
=
sdio_read_cccr
(
card
);
if
(
err
)
goto
remove
;
/*
* Initialize (but don't add) all present functions.
*/
...
...
include/linux/mmc/card.h
浏览文件 @
35c66c19
...
...
@@ -55,6 +55,16 @@ struct sd_switch_caps {
unsigned
int
hs_max_dtr
;
};
struct
sdio_cccr
{
unsigned
int
sdio_vsn
;
unsigned
int
sd_vsn
;
unsigned
int
multi_block
:
1
,
low_speed:
1
,
wide_bus:
1
,
high_power:
1
,
high_speed:
1
;
};
struct
mmc_host
;
struct
sdio_func
;
...
...
@@ -87,6 +97,7 @@ struct mmc_card {
struct
sd_switch_caps
sw_caps
;
/* switch (CMD6) caps */
unsigned
int
sdio_funcs
;
/* number of SDIO functions */
struct
sdio_cccr
cccr
;
/* common card info */
struct
sdio_func
*
sdio_func
[
SDIO_MAX_FUNCS
];
/* SDIO functions (devices) */
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录