Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
cc3feac3
K
Kernel
项目概览
openeuler
/
Kernel
接近 2 年 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
cc3feac3
编写于
1月 12, 2011
作者:
B
Ben Dooks
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-2638/i2c/mv64xx' into for-linus/i2c-2638
上级
f878133b
eda6bee6
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
38 addition
and
7 deletion
+38
-7
drivers/i2c/busses/i2c-mv64xxx.c
drivers/i2c/busses/i2c-mv64xxx.c
+38
-7
未找到文件。
drivers/i2c/busses/i2c-mv64xxx.c
浏览文件 @
cc3feac3
...
@@ -59,6 +59,7 @@ enum {
...
@@ -59,6 +59,7 @@ enum {
MV64XXX_I2C_STATE_INVALID
,
MV64XXX_I2C_STATE_INVALID
,
MV64XXX_I2C_STATE_IDLE
,
MV64XXX_I2C_STATE_IDLE
,
MV64XXX_I2C_STATE_WAITING_FOR_START_COND
,
MV64XXX_I2C_STATE_WAITING_FOR_START_COND
,
MV64XXX_I2C_STATE_WAITING_FOR_RESTART
,
MV64XXX_I2C_STATE_WAITING_FOR_ADDR_1_ACK
,
MV64XXX_I2C_STATE_WAITING_FOR_ADDR_1_ACK
,
MV64XXX_I2C_STATE_WAITING_FOR_ADDR_2_ACK
,
MV64XXX_I2C_STATE_WAITING_FOR_ADDR_2_ACK
,
MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_ACK
,
MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_ACK
,
...
@@ -70,6 +71,7 @@ enum {
...
@@ -70,6 +71,7 @@ enum {
MV64XXX_I2C_ACTION_INVALID
,
MV64XXX_I2C_ACTION_INVALID
,
MV64XXX_I2C_ACTION_CONTINUE
,
MV64XXX_I2C_ACTION_CONTINUE
,
MV64XXX_I2C_ACTION_SEND_START
,
MV64XXX_I2C_ACTION_SEND_START
,
MV64XXX_I2C_ACTION_SEND_RESTART
,
MV64XXX_I2C_ACTION_SEND_ADDR_1
,
MV64XXX_I2C_ACTION_SEND_ADDR_1
,
MV64XXX_I2C_ACTION_SEND_ADDR_2
,
MV64XXX_I2C_ACTION_SEND_ADDR_2
,
MV64XXX_I2C_ACTION_SEND_DATA
,
MV64XXX_I2C_ACTION_SEND_DATA
,
...
@@ -91,6 +93,7 @@ struct mv64xxx_i2c_data {
...
@@ -91,6 +93,7 @@ struct mv64xxx_i2c_data {
u32
addr2
;
u32
addr2
;
u32
bytes_left
;
u32
bytes_left
;
u32
byte_posn
;
u32
byte_posn
;
u32
send_stop
;
u32
block
;
u32
block
;
int
rc
;
int
rc
;
u32
freq_m
;
u32
freq_m
;
...
@@ -159,8 +162,15 @@ mv64xxx_i2c_fsm(struct mv64xxx_i2c_data *drv_data, u32 status)
...
@@ -159,8 +162,15 @@ mv64xxx_i2c_fsm(struct mv64xxx_i2c_data *drv_data, u32 status)
if
((
drv_data
->
bytes_left
==
0
)
if
((
drv_data
->
bytes_left
==
0
)
||
(
drv_data
->
aborting
||
(
drv_data
->
aborting
&&
(
drv_data
->
byte_posn
!=
0
)))
{
&&
(
drv_data
->
byte_posn
!=
0
)))
{
drv_data
->
action
=
MV64XXX_I2C_ACTION_SEND_STOP
;
if
(
drv_data
->
send_stop
)
{
drv_data
->
state
=
MV64XXX_I2C_STATE_IDLE
;
drv_data
->
action
=
MV64XXX_I2C_ACTION_SEND_STOP
;
drv_data
->
state
=
MV64XXX_I2C_STATE_IDLE
;
}
else
{
drv_data
->
action
=
MV64XXX_I2C_ACTION_SEND_RESTART
;
drv_data
->
state
=
MV64XXX_I2C_STATE_WAITING_FOR_RESTART
;
}
}
else
{
}
else
{
drv_data
->
action
=
MV64XXX_I2C_ACTION_SEND_DATA
;
drv_data
->
action
=
MV64XXX_I2C_ACTION_SEND_DATA
;
drv_data
->
state
=
drv_data
->
state
=
...
@@ -228,6 +238,15 @@ static void
...
@@ -228,6 +238,15 @@ static void
mv64xxx_i2c_do_action
(
struct
mv64xxx_i2c_data
*
drv_data
)
mv64xxx_i2c_do_action
(
struct
mv64xxx_i2c_data
*
drv_data
)
{
{
switch
(
drv_data
->
action
)
{
switch
(
drv_data
->
action
)
{
case
MV64XXX_I2C_ACTION_SEND_RESTART
:
drv_data
->
cntl_bits
|=
MV64XXX_I2C_REG_CONTROL_START
;
drv_data
->
cntl_bits
&=
~
MV64XXX_I2C_REG_CONTROL_INTEN
;
writel
(
drv_data
->
cntl_bits
,
drv_data
->
reg_base
+
MV64XXX_I2C_REG_CONTROL
);
drv_data
->
block
=
0
;
wake_up_interruptible
(
&
drv_data
->
waitq
);
break
;
case
MV64XXX_I2C_ACTION_CONTINUE
:
case
MV64XXX_I2C_ACTION_CONTINUE
:
writel
(
drv_data
->
cntl_bits
,
writel
(
drv_data
->
cntl_bits
,
drv_data
->
reg_base
+
MV64XXX_I2C_REG_CONTROL
);
drv_data
->
reg_base
+
MV64XXX_I2C_REG_CONTROL
);
...
@@ -386,7 +405,8 @@ mv64xxx_i2c_wait_for_completion(struct mv64xxx_i2c_data *drv_data)
...
@@ -386,7 +405,8 @@ mv64xxx_i2c_wait_for_completion(struct mv64xxx_i2c_data *drv_data)
}
}
static
int
static
int
mv64xxx_i2c_execute_msg
(
struct
mv64xxx_i2c_data
*
drv_data
,
struct
i2c_msg
*
msg
)
mv64xxx_i2c_execute_msg
(
struct
mv64xxx_i2c_data
*
drv_data
,
struct
i2c_msg
*
msg
,
int
is_first
,
int
is_last
)
{
{
unsigned
long
flags
;
unsigned
long
flags
;
...
@@ -406,10 +426,18 @@ mv64xxx_i2c_execute_msg(struct mv64xxx_i2c_data *drv_data, struct i2c_msg *msg)
...
@@ -406,10 +426,18 @@ mv64xxx_i2c_execute_msg(struct mv64xxx_i2c_data *drv_data, struct i2c_msg *msg)
drv_data
->
bytes_left
--
;
drv_data
->
bytes_left
--
;
}
}
}
else
{
}
else
{
drv_data
->
action
=
MV64XXX_I2C_ACTION_SEND_START
;
if
(
is_first
)
{
drv_data
->
state
=
MV64XXX_I2C_STATE_WAITING_FOR_START_COND
;
drv_data
->
action
=
MV64XXX_I2C_ACTION_SEND_START
;
drv_data
->
state
=
MV64XXX_I2C_STATE_WAITING_FOR_START_COND
;
}
else
{
drv_data
->
action
=
MV64XXX_I2C_ACTION_SEND_ADDR_1
;
drv_data
->
state
=
MV64XXX_I2C_STATE_WAITING_FOR_ADDR_1_ACK
;
}
}
}
drv_data
->
send_stop
=
is_last
;
drv_data
->
block
=
1
;
drv_data
->
block
=
1
;
mv64xxx_i2c_do_action
(
drv_data
);
mv64xxx_i2c_do_action
(
drv_data
);
spin_unlock_irqrestore
(
&
drv_data
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
drv_data
->
lock
,
flags
);
...
@@ -437,9 +465,12 @@ mv64xxx_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
...
@@ -437,9 +465,12 @@ mv64xxx_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
struct
mv64xxx_i2c_data
*
drv_data
=
i2c_get_adapdata
(
adap
);
struct
mv64xxx_i2c_data
*
drv_data
=
i2c_get_adapdata
(
adap
);
int
i
,
rc
;
int
i
,
rc
;
for
(
i
=
0
;
i
<
num
;
i
++
)
for
(
i
=
0
;
i
<
num
;
i
++
)
{
if
((
rc
=
mv64xxx_i2c_execute_msg
(
drv_data
,
&
msgs
[
i
]))
<
0
)
rc
=
mv64xxx_i2c_execute_msg
(
drv_data
,
&
msgs
[
i
],
i
==
0
,
i
+
1
==
num
);
if
(
rc
<
0
)
return
rc
;
return
rc
;
}
return
num
;
return
num
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录