Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
3d2a98cd
cloud-kernel
项目概览
openanolis
/
cloud-kernel
接近 2 年 前同步成功
通知
169
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看板
提交
3d2a98cd
编写于
4月 13, 2009
作者:
E
Eric Miao
提交者:
Eric Miao
6月 05, 2009
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[ARM] pxa: simplify secondary PWM handling and use platform_device_id table
Signed-off-by:
N
Eric Miao
<
eric.miao@marvell.com
>
上级
1a77920e
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
49 addition
and
67 deletion
+49
-67
arch/arm/mach-pxa/pwm.c
arch/arm/mach-pxa/pwm.c
+49
-67
未找到文件。
arch/arm/mach-pxa/pwm.c
浏览文件 @
3d2a98cd
...
@@ -21,6 +21,16 @@
...
@@ -21,6 +21,16 @@
#include <asm/div64.h>
#include <asm/div64.h>
#define HAS_SECONDARY_PWM 0x10
static
const
struct
platform_device_id
pwm_id_table
[]
=
{
/* PWM has_secondary_pwm? */
{
"pxa25x-pwm"
,
0
},
{
"pxa27x-pwm"
,
HAS_SECONDARY_PWM
},
{
},
};
MODULE_DEVICE_TABLE
(
platform
,
pwm_id_table
);
/* PWM registers and bits definitions */
/* PWM registers and bits definitions */
#define PWMCR (0x00)
#define PWMCR (0x00)
#define PWMDCR (0x04)
#define PWMDCR (0x04)
...
@@ -31,7 +41,8 @@
...
@@ -31,7 +41,8 @@
struct
pwm_device
{
struct
pwm_device
{
struct
list_head
node
;
struct
list_head
node
;
struct
platform_device
*
pdev
;
struct
pwm_device
*
secondary
;
struct
platform_device
*
pdev
;
const
char
*
label
;
const
char
*
label
;
struct
clk
*
clk
;
struct
clk
*
clk
;
...
@@ -159,17 +170,17 @@ static inline void __add_pwm(struct pwm_device *pwm)
...
@@ -159,17 +170,17 @@ static inline void __add_pwm(struct pwm_device *pwm)
mutex_unlock
(
&
pwm_lock
);
mutex_unlock
(
&
pwm_lock
);
}
}
static
struct
pwm_device
*
pwm_probe
(
struct
platform_device
*
pdev
,
static
int
__devinit
pwm_probe
(
struct
platform_device
*
pdev
)
unsigned
int
pwm_id
,
struct
pwm_device
*
parent_pwm
)
{
{
struct
pwm_device
*
pwm
;
struct
platform_device_id
*
id
=
platform_get_device_id
(
pdev
);
struct
pwm_device
*
pwm
,
*
secondary
=
NULL
;
struct
resource
*
r
;
struct
resource
*
r
;
int
ret
=
0
;
int
ret
=
0
;
pwm
=
kzalloc
(
sizeof
(
struct
pwm_device
),
GFP_KERNEL
);
pwm
=
kzalloc
(
sizeof
(
struct
pwm_device
),
GFP_KERNEL
);
if
(
pwm
==
NULL
)
{
if
(
pwm
==
NULL
)
{
dev_err
(
&
pdev
->
dev
,
"failed to allocate memory
\n
"
);
dev_err
(
&
pdev
->
dev
,
"failed to allocate memory
\n
"
);
return
ERR_PTR
(
-
ENOMEM
)
;
return
-
ENOMEM
;
}
}
pwm
->
clk
=
clk_get
(
&
pdev
->
dev
,
NULL
);
pwm
->
clk
=
clk_get
(
&
pdev
->
dev
,
NULL
);
...
@@ -180,16 +191,9 @@ static struct pwm_device *pwm_probe(struct platform_device *pdev,
...
@@ -180,16 +191,9 @@ static struct pwm_device *pwm_probe(struct platform_device *pdev,
pwm
->
clk_enabled
=
0
;
pwm
->
clk_enabled
=
0
;
pwm
->
use_count
=
0
;
pwm
->
use_count
=
0
;
pwm
->
pwm_id
=
p
wm_
id
;
pwm
->
pwm_id
=
p
dev
->
id
;
pwm
->
pdev
=
pdev
;
pwm
->
pdev
=
pdev
;
if
(
parent_pwm
!=
NULL
)
{
/* registers for the second PWM has offset of 0x10 */
pwm
->
mmio_base
=
parent_pwm
->
mmio_base
+
0x10
;
__add_pwm
(
pwm
);
return
pwm
;
}
r
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
r
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
r
==
NULL
)
{
if
(
r
==
NULL
)
{
dev_err
(
&
pdev
->
dev
,
"no memory resource defined
\n
"
);
dev_err
(
&
pdev
->
dev
,
"no memory resource defined
\n
"
);
...
@@ -211,9 +215,27 @@ static struct pwm_device *pwm_probe(struct platform_device *pdev,
...
@@ -211,9 +215,27 @@ static struct pwm_device *pwm_probe(struct platform_device *pdev,
goto
err_free_mem
;
goto
err_free_mem
;
}
}
if
(
id
->
driver_data
&
HAS_SECONDARY_PWM
)
{
secondary
=
kzalloc
(
sizeof
(
struct
pwm_device
),
GFP_KERNEL
);
if
(
secondary
==
NULL
)
{
ret
=
-
ENOMEM
;
goto
err_free_mem
;
}
*
secondary
=
*
pwm
;
pwm
->
secondary
=
secondary
;
/* registers for the second PWM has offset of 0x10 */
secondary
->
mmio_base
=
pwm
->
mmio_base
+
0x10
;
secondary
->
pwm_id
=
pdev
->
id
+
2
;
}
__add_pwm
(
pwm
);
__add_pwm
(
pwm
);
if
(
secondary
)
__add_pwm
(
secondary
);
platform_set_drvdata
(
pdev
,
pwm
);
platform_set_drvdata
(
pdev
,
pwm
);
return
pwm
;
return
0
;
err_free_mem:
err_free_mem:
release_mem_region
(
r
->
start
,
r
->
end
-
r
->
start
+
1
);
release_mem_region
(
r
->
start
,
r
->
end
-
r
->
start
+
1
);
...
@@ -221,32 +243,7 @@ static struct pwm_device *pwm_probe(struct platform_device *pdev,
...
@@ -221,32 +243,7 @@ static struct pwm_device *pwm_probe(struct platform_device *pdev,
clk_put
(
pwm
->
clk
);
clk_put
(
pwm
->
clk
);
err_free:
err_free:
kfree
(
pwm
);
kfree
(
pwm
);
return
ERR_PTR
(
ret
);
return
ret
;
}
static
int
__devinit
pxa25x_pwm_probe
(
struct
platform_device
*
pdev
)
{
struct
pwm_device
*
pwm
=
pwm_probe
(
pdev
,
pdev
->
id
,
NULL
);
if
(
IS_ERR
(
pwm
))
return
PTR_ERR
(
pwm
);
return
0
;
}
static
int
__devinit
pxa27x_pwm_probe
(
struct
platform_device
*
pdev
)
{
struct
pwm_device
*
pwm
;
pwm
=
pwm_probe
(
pdev
,
pdev
->
id
,
NULL
);
if
(
IS_ERR
(
pwm
))
return
PTR_ERR
(
pwm
);
pwm
=
pwm_probe
(
pdev
,
pdev
->
id
+
2
,
pwm
);
if
(
IS_ERR
(
pwm
))
return
PTR_ERR
(
pwm
);
return
0
;
}
}
static
int
__devexit
pwm_remove
(
struct
platform_device
*
pdev
)
static
int
__devexit
pwm_remove
(
struct
platform_device
*
pdev
)
...
@@ -259,6 +256,12 @@ static int __devexit pwm_remove(struct platform_device *pdev)
...
@@ -259,6 +256,12 @@ static int __devexit pwm_remove(struct platform_device *pdev)
return
-
ENODEV
;
return
-
ENODEV
;
mutex_lock
(
&
pwm_lock
);
mutex_lock
(
&
pwm_lock
);
if
(
pwm
->
secondary
)
{
list_del
(
&
pwm
->
secondary
->
node
);
kfree
(
pwm
->
secondary
);
}
list_del
(
&
pwm
->
node
);
list_del
(
&
pwm
->
node
);
mutex_unlock
(
&
pwm_lock
);
mutex_unlock
(
&
pwm_lock
);
...
@@ -272,46 +275,25 @@ static int __devexit pwm_remove(struct platform_device *pdev)
...
@@ -272,46 +275,25 @@ static int __devexit pwm_remove(struct platform_device *pdev)
return
0
;
return
0
;
}
}
static
struct
platform_driver
p
xa25x_p
wm_driver
=
{
static
struct
platform_driver
pwm_driver
=
{
.
driver
=
{
.
driver
=
{
.
name
=
"pxa25x-pwm"
,
.
name
=
"pxa25x-pwm"
,
.
owner
=
THIS_MODULE
,
},
},
.
probe
=
pxa25x_pwm_probe
,
.
probe
=
pwm_probe
,
.
remove
=
__devexit_p
(
pwm_remove
),
};
static
struct
platform_driver
pxa27x_pwm_driver
=
{
.
driver
=
{
.
name
=
"pxa27x-pwm"
,
},
.
probe
=
pxa27x_pwm_probe
,
.
remove
=
__devexit_p
(
pwm_remove
),
.
remove
=
__devexit_p
(
pwm_remove
),
.
id_table
=
pwm_id_table
,
};
};
static
int
__init
pwm_init
(
void
)
static
int
__init
pwm_init
(
void
)
{
{
int
ret
=
0
;
return
platform_driver_register
(
&
pwm_driver
);
ret
=
platform_driver_register
(
&
pxa25x_pwm_driver
);
if
(
ret
)
{
printk
(
KERN_ERR
"failed to register pxa25x_pwm_driver
\n
"
);
return
ret
;
}
ret
=
platform_driver_register
(
&
pxa27x_pwm_driver
);
if
(
ret
)
{
printk
(
KERN_ERR
"failed to register pxa27x_pwm_driver
\n
"
);
return
ret
;
}
return
ret
;
}
}
arch_initcall
(
pwm_init
);
arch_initcall
(
pwm_init
);
static
void
__exit
pwm_exit
(
void
)
static
void
__exit
pwm_exit
(
void
)
{
{
platform_driver_unregister
(
&
pxa25x_pwm_driver
);
platform_driver_unregister
(
&
pwm_driver
);
platform_driver_unregister
(
&
pxa27x_pwm_driver
);
}
}
module_exit
(
pwm_exit
);
module_exit
(
pwm_exit
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录