Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Linux-御风守护者
linux
提交
ebebd9b0
L
linux
项目概览
Linux-御风守护者
/
linux
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ebebd9b0
编写于
8月 20, 2007
作者:
R
Russell King
提交者:
Russell King
10月 12, 2007
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[ARM] pxa: update PXA MMC interface driver to use clk support
Signed-off-by:
N
Russell King
<
rmk+kernel@arm.linux.org.uk
>
上级
22d8a73a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
36 addition
and
21 deletion
+36
-21
drivers/mmc/host/pxamci.c
drivers/mmc/host/pxamci.c
+36
-7
drivers/mmc/host/pxamci.h
drivers/mmc/host/pxamci.h
+0
-14
未找到文件。
drivers/mmc/host/pxamci.c
浏览文件 @
ebebd9b0
...
...
@@ -23,6 +23,8 @@
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/dma-mapping.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/mmc/host.h>
#include <asm/dma.h>
...
...
@@ -44,6 +46,8 @@ struct pxamci_host {
spinlock_t
lock
;
struct
resource
*
res
;
void
__iomem
*
base
;
struct
clk
*
clk
;
unsigned
long
clkrate
;
int
irq
;
int
dma
;
unsigned
int
clkrt
;
...
...
@@ -119,7 +123,7 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)
writel
(
nob
,
host
->
base
+
MMC_NOB
);
writel
(
data
->
blksz
,
host
->
base
+
MMC_BLKLEN
);
clks
=
(
unsigned
long
long
)
data
->
timeout_ns
*
CLOCKRATE
;
clks
=
(
unsigned
long
long
)
data
->
timeout_ns
*
host
->
clkrate
;
do_div
(
clks
,
1000000000UL
);
timeout
=
(
unsigned
int
)
clks
+
(
data
->
timeout_clks
<<
host
->
clkrt
);
writel
((
timeout
+
255
)
/
256
,
host
->
base
+
MMC_RDTO
);
...
...
@@ -365,18 +369,25 @@ static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
struct
pxamci_host
*
host
=
mmc_priv
(
mmc
);
if
(
ios
->
clock
)
{
unsigned
int
clk
=
CLOCKRATE
/
ios
->
clock
;
if
(
CLOCKRATE
/
clk
>
ios
->
clock
)
unsigned
long
rate
=
host
->
clkrate
;
unsigned
int
clk
=
rate
/
ios
->
clock
;
/*
* clk might result in a lower divisor than we
* desire. check for that condition and adjust
* as appropriate.
*/
if
(
rate
/
clk
>
ios
->
clock
)
clk
<<=
1
;
host
->
clkrt
=
fls
(
clk
)
-
1
;
pxa_set_cken
(
CKEN_MMC
,
1
);
clk_enable
(
host
->
clk
);
/*
* we write clkrt on the next command
*/
}
else
{
pxamci_stop_clock
(
host
);
pxa_set_cken
(
CKEN_MMC
,
0
);
clk_disable
(
host
->
clk
);
}
if
(
host
->
power_mode
!=
ios
->
power_mode
)
{
...
...
@@ -462,8 +473,6 @@ static int pxamci_probe(struct platform_device *pdev)
}
mmc
->
ops
=
&
pxamci_ops
;
mmc
->
f_min
=
CLOCKRATE_MIN
;
mmc
->
f_max
=
CLOCKRATE_MAX
;
/*
* We can do SG-DMA, but we don't because we never know how much
...
...
@@ -490,6 +499,22 @@ static int pxamci_probe(struct platform_device *pdev)
host
->
mmc
=
mmc
;
host
->
dma
=
-
1
;
host
->
pdata
=
pdev
->
dev
.
platform_data
;
host
->
clk
=
clk_get
(
&
pdev
->
dev
,
"MMCCLK"
);
if
(
IS_ERR
(
host
->
clk
))
{
ret
=
PTR_ERR
(
host
->
clk
);
host
->
clk
=
NULL
;
goto
out
;
}
host
->
clkrate
=
clk_get_rate
(
host
->
clk
);
/*
* Calculate minimum clock rate, rounding up.
*/
mmc
->
f_min
=
(
host
->
clkrate
+
63
)
/
64
;
mmc
->
f_max
=
host
->
clkrate
;
mmc
->
ocr_avail
=
host
->
pdata
?
host
->
pdata
->
ocr_mask
:
MMC_VDD_32_33
|
MMC_VDD_33_34
;
...
...
@@ -554,6 +579,8 @@ static int pxamci_probe(struct platform_device *pdev)
iounmap
(
host
->
base
);
if
(
host
->
sg_cpu
)
dma_free_coherent
(
&
pdev
->
dev
,
PAGE_SIZE
,
host
->
sg_cpu
,
host
->
sg_dma
);
if
(
host
->
clk
)
clk_put
(
host
->
clk
);
}
if
(
mmc
)
mmc_free_host
(
mmc
);
...
...
@@ -588,6 +615,8 @@ static int pxamci_remove(struct platform_device *pdev)
iounmap
(
host
->
base
);
dma_free_coherent
(
&
pdev
->
dev
,
PAGE_SIZE
,
host
->
sg_cpu
,
host
->
sg_dma
);
clk_put
(
host
->
clk
);
release_resource
(
host
->
res
);
mmc_free_host
(
mmc
);
...
...
drivers/mmc/host/pxamci.h
浏览文件 @
ebebd9b0
...
...
@@ -88,17 +88,3 @@
#define MMC_RXFIFO 0x0040
/* 8 bit */
#define MMC_TXFIFO 0x0044
/* 8 bit */
/*
* The base MMC clock rate
*/
#ifdef CONFIG_PXA27x
#define CLOCKRATE_MIN 304688
#define CLOCKRATE_MAX 19500000
#else
#define CLOCKRATE_MIN 312500
#define CLOCKRATE_MAX 20000000
#endif
#define CLOCKRATE CLOCKRATE_MAX
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录