Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
86bd4103
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看板
提交
86bd4103
编写于
9月 16, 2013
作者:
P
Patrik Jakobsson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/gma500: Add aux device support for gmbus
Signed-off-by:
N
Patrik Jakobsson
<
patrik.r.jakobsson@gmail.com
>
上级
2657929d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
49 addition
and
41 deletion
+49
-41
drivers/gpu/drm/gma500/intel_gmbus.c
drivers/gpu/drm/gma500/intel_gmbus.c
+49
-41
未找到文件。
drivers/gpu/drm/gma500/intel_gmbus.c
浏览文件 @
86bd4103
...
...
@@ -51,6 +51,9 @@
#define wait_for(COND, MS) _wait_for(COND, MS, 1)
#define wait_for_atomic(COND, MS) _wait_for(COND, MS, 0)
#define GMBUS_REG_READ(reg) ioread32(dev_priv->gmbus_reg + (reg))
#define GMBUS_REG_WRITE(reg, val) iowrite32((val), dev_priv->gmbus_reg + (reg))
/* Intel GPIO access functions */
#define I2C_RISEFALL_TIME 20
...
...
@@ -71,7 +74,8 @@ struct intel_gpio {
void
gma_intel_i2c_reset
(
struct
drm_device
*
dev
)
{
REG_WRITE
(
GMBUS0
,
0
);
struct
drm_psb_private
*
dev_priv
=
dev
->
dev_private
;
GMBUS_REG_WRITE
(
GMBUS0
,
0
);
}
static
void
intel_i2c_quirk_set
(
struct
drm_psb_private
*
dev_priv
,
bool
enable
)
...
...
@@ -98,11 +102,10 @@ static void intel_i2c_quirk_set(struct drm_psb_private *dev_priv, bool enable)
static
u32
get_reserved
(
struct
intel_gpio
*
gpio
)
{
struct
drm_psb_private
*
dev_priv
=
gpio
->
dev_priv
;
struct
drm_device
*
dev
=
dev_priv
->
dev
;
u32
reserved
=
0
;
/* On most chips, these bits must be preserved in software. */
reserved
=
REG_READ
(
gpio
->
reg
)
&
reserved
=
GMBUS_
REG_READ
(
gpio
->
reg
)
&
(
GPIO_DATA_PULLUP_DISABLE
|
GPIO_CLOCK_PULLUP_DISABLE
);
...
...
@@ -113,29 +116,26 @@ static int get_clock(void *data)
{
struct
intel_gpio
*
gpio
=
data
;
struct
drm_psb_private
*
dev_priv
=
gpio
->
dev_priv
;
struct
drm_device
*
dev
=
dev_priv
->
dev
;
u32
reserved
=
get_reserved
(
gpio
);
REG_WRITE
(
gpio
->
reg
,
reserved
|
GPIO_CLOCK_DIR_MASK
);
REG_WRITE
(
gpio
->
reg
,
reserved
);
return
(
REG_READ
(
gpio
->
reg
)
&
GPIO_CLOCK_VAL_IN
)
!=
0
;
GMBUS_
REG_WRITE
(
gpio
->
reg
,
reserved
|
GPIO_CLOCK_DIR_MASK
);
GMBUS_
REG_WRITE
(
gpio
->
reg
,
reserved
);
return
(
GMBUS_
REG_READ
(
gpio
->
reg
)
&
GPIO_CLOCK_VAL_IN
)
!=
0
;
}
static
int
get_data
(
void
*
data
)
{
struct
intel_gpio
*
gpio
=
data
;
struct
drm_psb_private
*
dev_priv
=
gpio
->
dev_priv
;
struct
drm_device
*
dev
=
dev_priv
->
dev
;
u32
reserved
=
get_reserved
(
gpio
);
REG_WRITE
(
gpio
->
reg
,
reserved
|
GPIO_DATA_DIR_MASK
);
REG_WRITE
(
gpio
->
reg
,
reserved
);
return
(
REG_READ
(
gpio
->
reg
)
&
GPIO_DATA_VAL_IN
)
!=
0
;
GMBUS_
REG_WRITE
(
gpio
->
reg
,
reserved
|
GPIO_DATA_DIR_MASK
);
GMBUS_
REG_WRITE
(
gpio
->
reg
,
reserved
);
return
(
GMBUS_
REG_READ
(
gpio
->
reg
)
&
GPIO_DATA_VAL_IN
)
!=
0
;
}
static
void
set_clock
(
void
*
data
,
int
state_high
)
{
struct
intel_gpio
*
gpio
=
data
;
struct
drm_psb_private
*
dev_priv
=
gpio
->
dev_priv
;
struct
drm_device
*
dev
=
dev_priv
->
dev
;
u32
reserved
=
get_reserved
(
gpio
);
u32
clock_bits
;
...
...
@@ -145,15 +145,14 @@ static void set_clock(void *data, int state_high)
clock_bits
=
GPIO_CLOCK_DIR_OUT
|
GPIO_CLOCK_DIR_MASK
|
GPIO_CLOCK_VAL_MASK
;
REG_WRITE
(
gpio
->
reg
,
reserved
|
clock_bits
);
REG_READ
(
gpio
->
reg
);
/* Posting */
GMBUS_
REG_WRITE
(
gpio
->
reg
,
reserved
|
clock_bits
);
GMBUS_
REG_READ
(
gpio
->
reg
);
/* Posting */
}
static
void
set_data
(
void
*
data
,
int
state_high
)
{
struct
intel_gpio
*
gpio
=
data
;
struct
drm_psb_private
*
dev_priv
=
gpio
->
dev_priv
;
struct
drm_device
*
dev
=
dev_priv
->
dev
;
u32
reserved
=
get_reserved
(
gpio
);
u32
data_bits
;
...
...
@@ -163,8 +162,8 @@ static void set_data(void *data, int state_high)
data_bits
=
GPIO_DATA_DIR_OUT
|
GPIO_DATA_DIR_MASK
|
GPIO_DATA_VAL_MASK
;
REG_WRITE
(
gpio
->
reg
,
reserved
|
data_bits
);
REG_READ
(
gpio
->
reg
);
GMBUS_
REG_WRITE
(
gpio
->
reg
,
reserved
|
data_bits
);
GMBUS_
REG_READ
(
gpio
->
reg
);
}
static
struct
i2c_adapter
*
...
...
@@ -251,7 +250,6 @@ gmbus_xfer(struct i2c_adapter *adapter,
struct
intel_gmbus
,
adapter
);
struct
drm_psb_private
*
dev_priv
=
adapter
->
algo_data
;
struct
drm_device
*
dev
=
dev_priv
->
dev
;
int
i
,
reg_offset
;
if
(
bus
->
force_bit
)
...
...
@@ -260,28 +258,30 @@ gmbus_xfer(struct i2c_adapter *adapter,
reg_offset
=
0
;
REG_WRITE
(
GMBUS0
+
reg_offset
,
bus
->
reg0
);
GMBUS_
REG_WRITE
(
GMBUS0
+
reg_offset
,
bus
->
reg0
);
for
(
i
=
0
;
i
<
num
;
i
++
)
{
u16
len
=
msgs
[
i
].
len
;
u8
*
buf
=
msgs
[
i
].
buf
;
if
(
msgs
[
i
].
flags
&
I2C_M_RD
)
{
REG_WRITE
(
GMBUS1
+
reg_offset
,
GMBUS_CYCLE_WAIT
|
(
i
+
1
==
num
?
GMBUS_CYCLE_STOP
:
0
)
|
(
len
<<
GMBUS_BYTE_COUNT_SHIFT
)
|
(
msgs
[
i
].
addr
<<
GMBUS_SLAVE_ADDR_SHIFT
)
|
GMBUS_SLAVE_READ
|
GMBUS_SW_RDY
);
REG_READ
(
GMBUS2
+
reg_offset
);
GMBUS_REG_WRITE
(
GMBUS1
+
reg_offset
,
GMBUS_CYCLE_WAIT
|
(
i
+
1
==
num
?
GMBUS_CYCLE_STOP
:
0
)
|
(
len
<<
GMBUS_BYTE_COUNT_SHIFT
)
|
(
msgs
[
i
].
addr
<<
GMBUS_SLAVE_ADDR_SHIFT
)
|
GMBUS_SLAVE_READ
|
GMBUS_SW_RDY
);
GMBUS_REG_READ
(
GMBUS2
+
reg_offset
);
do
{
u32
val
,
loop
=
0
;
if
(
wait_for
(
REG_READ
(
GMBUS2
+
reg_offset
)
&
(
GMBUS_SATOER
|
GMBUS_HW_RDY
),
50
))
if
(
wait_for
(
GMBUS_REG_READ
(
GMBUS2
+
reg_offset
)
&
(
GMBUS_SATOER
|
GMBUS_HW_RDY
),
50
))
goto
timeout
;
if
(
REG_READ
(
GMBUS2
+
reg_offset
)
&
GMBUS_SATOER
)
if
(
GMBUS_
REG_READ
(
GMBUS2
+
reg_offset
)
&
GMBUS_SATOER
)
goto
clear_err
;
val
=
REG_READ
(
GMBUS3
+
reg_offset
);
val
=
GMBUS_
REG_READ
(
GMBUS3
+
reg_offset
);
do
{
*
buf
++
=
val
&
0xff
;
val
>>=
8
;
...
...
@@ -295,18 +295,20 @@ gmbus_xfer(struct i2c_adapter *adapter,
val
|=
*
buf
++
<<
(
8
*
loop
);
}
while
(
--
len
&&
++
loop
<
4
);
REG_WRITE
(
GMBUS3
+
reg_offset
,
val
);
REG_WRITE
(
GMBUS1
+
reg_offset
,
GMBUS_
REG_WRITE
(
GMBUS3
+
reg_offset
,
val
);
GMBUS_
REG_WRITE
(
GMBUS1
+
reg_offset
,
(
i
+
1
==
num
?
GMBUS_CYCLE_STOP
:
GMBUS_CYCLE_WAIT
)
|
(
msgs
[
i
].
len
<<
GMBUS_BYTE_COUNT_SHIFT
)
|
(
msgs
[
i
].
addr
<<
GMBUS_SLAVE_ADDR_SHIFT
)
|
GMBUS_SLAVE_WRITE
|
GMBUS_SW_RDY
);
REG_READ
(
GMBUS2
+
reg_offset
);
GMBUS_
REG_READ
(
GMBUS2
+
reg_offset
);
while
(
len
)
{
if
(
wait_for
(
REG_READ
(
GMBUS2
+
reg_offset
)
&
(
GMBUS_SATOER
|
GMBUS_HW_RDY
),
50
))
if
(
wait_for
(
GMBUS_REG_READ
(
GMBUS2
+
reg_offset
)
&
(
GMBUS_SATOER
|
GMBUS_HW_RDY
),
50
))
goto
timeout
;
if
(
REG_READ
(
GMBUS2
+
reg_offset
)
&
GMBUS_SATOER
)
if
(
GMBUS_REG_READ
(
GMBUS2
+
reg_offset
)
&
GMBUS_SATOER
)
goto
clear_err
;
val
=
loop
=
0
;
...
...
@@ -314,14 +316,14 @@ gmbus_xfer(struct i2c_adapter *adapter,
val
|=
*
buf
++
<<
(
8
*
loop
);
}
while
(
--
len
&&
++
loop
<
4
);
REG_WRITE
(
GMBUS3
+
reg_offset
,
val
);
REG_READ
(
GMBUS2
+
reg_offset
);
GMBUS_
REG_WRITE
(
GMBUS3
+
reg_offset
,
val
);
GMBUS_
REG_READ
(
GMBUS2
+
reg_offset
);
}
}
if
(
i
+
1
<
num
&&
wait_for
(
REG_READ
(
GMBUS2
+
reg_offset
)
&
(
GMBUS_SATOER
|
GMBUS_HW_WAIT_PHASE
),
50
))
if
(
i
+
1
<
num
&&
wait_for
(
GMBUS_
REG_READ
(
GMBUS2
+
reg_offset
)
&
(
GMBUS_SATOER
|
GMBUS_HW_WAIT_PHASE
),
50
))
goto
timeout
;
if
(
REG_READ
(
GMBUS2
+
reg_offset
)
&
GMBUS_SATOER
)
if
(
GMBUS_
REG_READ
(
GMBUS2
+
reg_offset
)
&
GMBUS_SATOER
)
goto
clear_err
;
}
...
...
@@ -332,20 +334,20 @@ gmbus_xfer(struct i2c_adapter *adapter,
* of resetting the GMBUS controller and so clearing the
* BUS_ERROR raised by the slave's NAK.
*/
REG_WRITE
(
GMBUS1
+
reg_offset
,
GMBUS_SW_CLR_INT
);
REG_WRITE
(
GMBUS1
+
reg_offset
,
0
);
GMBUS_
REG_WRITE
(
GMBUS1
+
reg_offset
,
GMBUS_SW_CLR_INT
);
GMBUS_
REG_WRITE
(
GMBUS1
+
reg_offset
,
0
);
done:
/* Mark the GMBUS interface as disabled. We will re-enable it at the
* start of the next xfer, till then let it sleep.
*/
REG_WRITE
(
GMBUS0
+
reg_offset
,
0
);
GMBUS_
REG_WRITE
(
GMBUS0
+
reg_offset
,
0
);
return
i
;
timeout:
DRM_INFO
(
"GMBUS timed out, falling back to bit banging on pin %d [%s]
\n
"
,
bus
->
reg0
&
0xff
,
bus
->
adapter
.
name
);
REG_WRITE
(
GMBUS0
+
reg_offset
,
0
);
GMBUS_
REG_WRITE
(
GMBUS0
+
reg_offset
,
0
);
/* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
bus
->
force_bit
=
intel_gpio_create
(
dev_priv
,
bus
->
reg0
&
0xff
);
...
...
@@ -399,6 +401,11 @@ int gma_intel_setup_gmbus(struct drm_device *dev)
if
(
dev_priv
->
gmbus
==
NULL
)
return
-
ENOMEM
;
if
(
IS_MRST
(
dev
))
dev_priv
->
gmbus_reg
=
dev_priv
->
aux_reg
;
else
dev_priv
->
gmbus_reg
=
dev_priv
->
vdc_reg
;
for
(
i
=
0
;
i
<
GMBUS_NUM_PORTS
;
i
++
)
{
struct
intel_gmbus
*
bus
=
&
dev_priv
->
gmbus
[
i
];
...
...
@@ -487,6 +494,7 @@ void gma_intel_teardown_gmbus(struct drm_device *dev)
i2c_del_adapter
(
&
bus
->
adapter
);
}
dev_priv
->
gmbus_reg
=
NULL
;
/* iounmap is done in driver_unload */
kfree
(
dev_priv
->
gmbus
);
dev_priv
->
gmbus
=
NULL
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录