Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openthos
linux
提交
da1f136c
L
linux
项目概览
openthos
/
linux
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
da1f136c
编写于
9月 05, 2005
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Merge master.kernel.org:/home/rmk/linux-2.6-mmc
上级
64c4813d
1656fa57
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
70 addition
and
15 deletion
+70
-15
drivers/mmc/mmc.c
drivers/mmc/mmc.c
+12
-0
drivers/mmc/wbsd.c
drivers/mmc/wbsd.c
+50
-14
drivers/mmc/wbsd.h
drivers/mmc/wbsd.h
+2
-1
include/linux/mmc/host.h
include/linux/mmc/host.h
+6
-0
未找到文件。
drivers/mmc/mmc.c
浏览文件 @
da1f136c
...
@@ -457,6 +457,11 @@ static void mmc_idle_cards(struct mmc_host *host)
...
@@ -457,6 +457,11 @@ static void mmc_idle_cards(struct mmc_host *host)
{
{
struct
mmc_command
cmd
;
struct
mmc_command
cmd
;
host
->
ios
.
chip_select
=
MMC_CS_HIGH
;
host
->
ops
->
set_ios
(
host
,
&
host
->
ios
);
mmc_delay
(
1
);
cmd
.
opcode
=
MMC_GO_IDLE_STATE
;
cmd
.
opcode
=
MMC_GO_IDLE_STATE
;
cmd
.
arg
=
0
;
cmd
.
arg
=
0
;
cmd
.
flags
=
MMC_RSP_NONE
;
cmd
.
flags
=
MMC_RSP_NONE
;
...
@@ -464,6 +469,11 @@ static void mmc_idle_cards(struct mmc_host *host)
...
@@ -464,6 +469,11 @@ static void mmc_idle_cards(struct mmc_host *host)
mmc_wait_for_cmd
(
host
,
&
cmd
,
0
);
mmc_wait_for_cmd
(
host
,
&
cmd
,
0
);
mmc_delay
(
1
);
mmc_delay
(
1
);
host
->
ios
.
chip_select
=
MMC_CS_DONTCARE
;
host
->
ops
->
set_ios
(
host
,
&
host
->
ios
);
mmc_delay
(
1
);
}
}
/*
/*
...
@@ -475,6 +485,7 @@ static void mmc_power_up(struct mmc_host *host)
...
@@ -475,6 +485,7 @@ static void mmc_power_up(struct mmc_host *host)
host
->
ios
.
vdd
=
bit
;
host
->
ios
.
vdd
=
bit
;
host
->
ios
.
bus_mode
=
MMC_BUSMODE_OPENDRAIN
;
host
->
ios
.
bus_mode
=
MMC_BUSMODE_OPENDRAIN
;
host
->
ios
.
chip_select
=
MMC_CS_DONTCARE
;
host
->
ios
.
power_mode
=
MMC_POWER_UP
;
host
->
ios
.
power_mode
=
MMC_POWER_UP
;
host
->
ops
->
set_ios
(
host
,
&
host
->
ios
);
host
->
ops
->
set_ios
(
host
,
&
host
->
ios
);
...
@@ -492,6 +503,7 @@ static void mmc_power_off(struct mmc_host *host)
...
@@ -492,6 +503,7 @@ static void mmc_power_off(struct mmc_host *host)
host
->
ios
.
clock
=
0
;
host
->
ios
.
clock
=
0
;
host
->
ios
.
vdd
=
0
;
host
->
ios
.
vdd
=
0
;
host
->
ios
.
bus_mode
=
MMC_BUSMODE_OPENDRAIN
;
host
->
ios
.
bus_mode
=
MMC_BUSMODE_OPENDRAIN
;
host
->
ios
.
chip_select
=
MMC_CS_DONTCARE
;
host
->
ios
.
power_mode
=
MMC_POWER_OFF
;
host
->
ios
.
power_mode
=
MMC_POWER_OFF
;
host
->
ops
->
set_ios
(
host
,
&
host
->
ios
);
host
->
ops
->
set_ios
(
host
,
&
host
->
ios
);
}
}
...
...
drivers/mmc/wbsd.c
浏览文件 @
da1f136c
...
@@ -42,7 +42,7 @@
...
@@ -42,7 +42,7 @@
#include "wbsd.h"
#include "wbsd.h"
#define DRIVER_NAME "wbsd"
#define DRIVER_NAME "wbsd"
#define DRIVER_VERSION "1.
3
"
#define DRIVER_VERSION "1.
4
"
#ifdef CONFIG_MMC_DEBUG
#ifdef CONFIG_MMC_DEBUG
#define DBG(x...) \
#define DBG(x...) \
...
@@ -960,8 +960,9 @@ static void wbsd_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
...
@@ -960,8 +960,9 @@ static void wbsd_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
struct
wbsd_host
*
host
=
mmc_priv
(
mmc
);
struct
wbsd_host
*
host
=
mmc_priv
(
mmc
);
u8
clk
,
setup
,
pwr
;
u8
clk
,
setup
,
pwr
;
DBGF
(
"clock %uHz busmode %u powermode %u Vdd %u
\n
"
,
DBGF
(
"clock %uHz busmode %u powermode %u cs %u Vdd %u
\n
"
,
ios
->
clock
,
ios
->
bus_mode
,
ios
->
power_mode
,
ios
->
vdd
);
ios
->
clock
,
ios
->
bus_mode
,
ios
->
power_mode
,
ios
->
chip_select
,
ios
->
vdd
);
spin_lock_bh
(
&
host
->
lock
);
spin_lock_bh
(
&
host
->
lock
);
...
@@ -1003,13 +1004,11 @@ static void wbsd_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
...
@@ -1003,13 +1004,11 @@ static void wbsd_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
/*
/*
* MMC cards need to have pin 1 high during init.
* MMC cards need to have pin 1 high during init.
* Init time corresponds rather nicely with the bus mode.
* It wreaks havoc with the card detection though so
* It wreaks havoc with the card detection though so
* that needs to be disabed.
* that needs to be disab
l
ed.
*/
*/
setup
=
wbsd_read_index
(
host
,
WBSD_IDX_SETUP
);
setup
=
wbsd_read_index
(
host
,
WBSD_IDX_SETUP
);
if
((
ios
->
power_mode
==
MMC_POWER_ON
)
&&
if
(
ios
->
chip_select
==
MMC_CS_HIGH
)
(
ios
->
bus_mode
==
MMC_BUSMODE_OPENDRAIN
))
{
{
setup
|=
WBSD_DAT3_H
;
setup
|=
WBSD_DAT3_H
;
host
->
flags
|=
WBSD_FIGNORE_DETECT
;
host
->
flags
|=
WBSD_FIGNORE_DETECT
;
...
@@ -1017,7 +1016,12 @@ static void wbsd_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
...
@@ -1017,7 +1016,12 @@ static void wbsd_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
else
else
{
{
setup
&=
~
WBSD_DAT3_H
;
setup
&=
~
WBSD_DAT3_H
;
host
->
flags
&=
~
WBSD_FIGNORE_DETECT
;
/*
* We cannot resume card detection immediatly
* because of capacitance and delays in the chip.
*/
mod_timer
(
&
host
->
ignore_timer
,
jiffies
+
HZ
/
100
);
}
}
wbsd_write_index
(
host
,
WBSD_IDX_SETUP
,
setup
);
wbsd_write_index
(
host
,
WBSD_IDX_SETUP
,
setup
);
...
@@ -1035,6 +1039,31 @@ static struct mmc_host_ops wbsd_ops = {
...
@@ -1035,6 +1039,31 @@ static struct mmc_host_ops wbsd_ops = {
* *
* *
\*****************************************************************************/
\*****************************************************************************/
/*
* Helper function to reset detection ignore
*/
static
void
wbsd_reset_ignore
(
unsigned
long
data
)
{
struct
wbsd_host
*
host
=
(
struct
wbsd_host
*
)
data
;
BUG_ON
(
host
==
NULL
);
DBG
(
"Resetting card detection ignore
\n
"
);
spin_lock_bh
(
&
host
->
lock
);
host
->
flags
&=
~
WBSD_FIGNORE_DETECT
;
/*
* Card status might have changed during the
* blackout.
*/
tasklet_schedule
(
&
host
->
card_tasklet
);
spin_unlock_bh
(
&
host
->
lock
);
}
/*
/*
* Helper function for card detection
* Helper function for card detection
*/
*/
...
@@ -1097,7 +1126,7 @@ static void wbsd_tasklet_card(unsigned long param)
...
@@ -1097,7 +1126,7 @@ static void wbsd_tasklet_card(unsigned long param)
* Delay card detection to allow electrical connections
* Delay card detection to allow electrical connections
* to stabilise.
* to stabilise.
*/
*/
mod_timer
(
&
host
->
timer
,
jiffies
+
HZ
/
2
);
mod_timer
(
&
host
->
detect_
timer
,
jiffies
+
HZ
/
2
);
}
}
spin_unlock
(
&
host
->
lock
);
spin_unlock
(
&
host
->
lock
);
...
@@ -1124,6 +1153,8 @@ static void wbsd_tasklet_card(unsigned long param)
...
@@ -1124,6 +1153,8 @@ static void wbsd_tasklet_card(unsigned long param)
mmc_detect_change
(
host
->
mmc
);
mmc_detect_change
(
host
->
mmc
);
}
}
else
spin_unlock
(
&
host
->
lock
);
}
}
static
void
wbsd_tasklet_fifo
(
unsigned
long
param
)
static
void
wbsd_tasklet_fifo
(
unsigned
long
param
)
...
@@ -1328,11 +1359,15 @@ static int __devinit wbsd_alloc_mmc(struct device* dev)
...
@@ -1328,11 +1359,15 @@ static int __devinit wbsd_alloc_mmc(struct device* dev)
spin_lock_init
(
&
host
->
lock
);
spin_lock_init
(
&
host
->
lock
);
/*
/*
* Set up
detection timer
* Set up
timers
*/
*/
init_timer
(
&
host
->
timer
);
init_timer
(
&
host
->
detect_timer
);
host
->
timer
.
data
=
(
unsigned
long
)
host
;
host
->
detect_timer
.
data
=
(
unsigned
long
)
host
;
host
->
timer
.
function
=
wbsd_detect_card
;
host
->
detect_timer
.
function
=
wbsd_detect_card
;
init_timer
(
&
host
->
ignore_timer
);
host
->
ignore_timer
.
data
=
(
unsigned
long
)
host
;
host
->
ignore_timer
.
function
=
wbsd_reset_ignore
;
/*
/*
* Maximum number of segments. Worst case is one sector per segment
* Maximum number of segments. Worst case is one sector per segment
...
@@ -1370,7 +1405,8 @@ static void __devexit wbsd_free_mmc(struct device* dev)
...
@@ -1370,7 +1405,8 @@ static void __devexit wbsd_free_mmc(struct device* dev)
host
=
mmc_priv
(
mmc
);
host
=
mmc_priv
(
mmc
);
BUG_ON
(
host
==
NULL
);
BUG_ON
(
host
==
NULL
);
del_timer_sync
(
&
host
->
timer
);
del_timer_sync
(
&
host
->
ignore_timer
);
del_timer_sync
(
&
host
->
detect_timer
);
mmc_free_host
(
mmc
);
mmc_free_host
(
mmc
);
...
...
drivers/mmc/wbsd.h
浏览文件 @
da1f136c
...
@@ -181,5 +181,6 @@ struct wbsd_host
...
@@ -181,5 +181,6 @@ struct wbsd_host
struct
tasklet_struct
finish_tasklet
;
struct
tasklet_struct
finish_tasklet
;
struct
tasklet_struct
block_tasklet
;
struct
tasklet_struct
block_tasklet
;
struct
timer_list
timer
;
/* Card detection timer */
struct
timer_list
detect_timer
;
/* Card detection timer */
struct
timer_list
ignore_timer
;
/* Ignore detection timer */
};
};
include/linux/mmc/host.h
浏览文件 @
da1f136c
...
@@ -46,6 +46,12 @@ struct mmc_ios {
...
@@ -46,6 +46,12 @@ struct mmc_ios {
#define MMC_BUSMODE_OPENDRAIN 1
#define MMC_BUSMODE_OPENDRAIN 1
#define MMC_BUSMODE_PUSHPULL 2
#define MMC_BUSMODE_PUSHPULL 2
unsigned
char
chip_select
;
/* SPI chip select */
#define MMC_CS_DONTCARE 0
#define MMC_CS_HIGH 1
#define MMC_CS_LOW 2
unsigned
char
power_mode
;
/* power supply mode */
unsigned
char
power_mode
;
/* power supply mode */
#define MMC_POWER_OFF 0
#define MMC_POWER_OFF 0
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录