Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
ca22f040
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看板
提交
ca22f040
编写于
5月 12, 2015
作者:
B
Brian Norris
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
mtd: brcmnand: add support for Broadcom's IPROC family
Signed-off-by:
N
Brian Norris
<
computersforpeace@gmail.com
>
上级
c26211d3
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
153 addition
and
0 deletion
+153
-0
drivers/mtd/nand/brcmnand/Makefile
drivers/mtd/nand/brcmnand/Makefile
+3
-0
drivers/mtd/nand/brcmnand/iproc_nand.c
drivers/mtd/nand/brcmnand/iproc_nand.c
+150
-0
未找到文件。
drivers/mtd/nand/brcmnand/Makefile
浏览文件 @
ca22f040
# link order matters; don't link the more generic brcmstb_nand.o before the
# more specific iproc_nand.o, for instance
obj-$(CONFIG_MTD_NAND_BRCMNAND)
+=
iproc_nand.o
obj-$(CONFIG_MTD_NAND_BRCMNAND)
+=
brcmstb_nand.o
obj-$(CONFIG_MTD_NAND_BRCMNAND)
+=
brcmnand.o
drivers/mtd/nand/brcmnand/iproc_nand.c
0 → 100644
浏览文件 @
ca22f040
/*
* Copyright © 2015 Broadcom Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/device.h>
#include <linux/io.h>
#include <linux/ioport.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include "brcmnand.h"
struct
iproc_nand_soc_priv
{
void
__iomem
*
idm_base
;
void
__iomem
*
ext_base
;
spinlock_t
idm_lock
;
};
#define IPROC_NAND_CTLR_READY_OFFSET 0x10
#define IPROC_NAND_CTLR_READY BIT(0)
#define IPROC_NAND_IO_CTRL_OFFSET 0x00
#define IPROC_NAND_APB_LE_MODE BIT(24)
#define IPROC_NAND_INT_CTRL_READ_ENABLE BIT(6)
static
bool
iproc_nand_intc_ack
(
struct
brcmnand_soc
*
soc
)
{
struct
iproc_nand_soc_priv
*
priv
=
soc
->
priv
;
void
__iomem
*
mmio
=
priv
->
ext_base
+
IPROC_NAND_CTLR_READY_OFFSET
;
u32
val
=
brcmnand_readl
(
mmio
);
if
(
val
&
IPROC_NAND_CTLR_READY
)
{
brcmnand_writel
(
IPROC_NAND_CTLR_READY
,
mmio
);
return
true
;
}
return
false
;
}
static
void
iproc_nand_intc_set
(
struct
brcmnand_soc
*
soc
,
bool
en
)
{
struct
iproc_nand_soc_priv
*
priv
=
soc
->
priv
;
void
__iomem
*
mmio
=
priv
->
idm_base
+
IPROC_NAND_IO_CTRL_OFFSET
;
u32
val
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
priv
->
idm_lock
,
flags
);
val
=
brcmnand_readl
(
mmio
);
if
(
en
)
val
|=
IPROC_NAND_INT_CTRL_READ_ENABLE
;
else
val
&=
~
IPROC_NAND_INT_CTRL_READ_ENABLE
;
brcmnand_writel
(
val
,
mmio
);
spin_unlock_irqrestore
(
&
priv
->
idm_lock
,
flags
);
}
static
void
iproc_nand_apb_access
(
struct
brcmnand_soc
*
soc
,
bool
prepare
)
{
struct
iproc_nand_soc_priv
*
priv
=
soc
->
priv
;
void
__iomem
*
mmio
=
priv
->
idm_base
+
IPROC_NAND_IO_CTRL_OFFSET
;
u32
val
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
priv
->
idm_lock
,
flags
);
val
=
brcmnand_readl
(
mmio
);
if
(
prepare
)
val
|=
IPROC_NAND_APB_LE_MODE
;
else
val
&=
~
IPROC_NAND_APB_LE_MODE
;
brcmnand_writel
(
val
,
mmio
);
spin_unlock_irqrestore
(
&
priv
->
idm_lock
,
flags
);
}
static
int
iproc_nand_probe
(
struct
platform_device
*
pdev
)
{
struct
device
*
dev
=
&
pdev
->
dev
;
struct
iproc_nand_soc_priv
*
priv
;
struct
brcmnand_soc
*
soc
;
struct
resource
*
res
;
soc
=
devm_kzalloc
(
dev
,
sizeof
(
*
soc
),
GFP_KERNEL
);
if
(
!
soc
)
return
-
ENOMEM
;
priv
=
devm_kzalloc
(
dev
,
sizeof
(
*
priv
),
GFP_KERNEL
);
if
(
!
priv
)
return
-
ENOMEM
;
spin_lock_init
(
&
priv
->
idm_lock
);
res
=
platform_get_resource_byname
(
pdev
,
IORESOURCE_MEM
,
"iproc-idm"
);
priv
->
idm_base
=
devm_ioremap_resource
(
dev
,
res
);
if
(
IS_ERR
(
priv
->
idm_base
))
return
PTR_ERR
(
priv
->
idm_base
);
res
=
platform_get_resource_byname
(
pdev
,
IORESOURCE_MEM
,
"iproc-ext"
);
priv
->
ext_base
=
devm_ioremap_resource
(
dev
,
res
);
if
(
IS_ERR
(
priv
->
ext_base
))
return
PTR_ERR
(
priv
->
ext_base
);
soc
->
pdev
=
pdev
;
soc
->
priv
=
priv
;
soc
->
ctlrdy_ack
=
iproc_nand_intc_ack
;
soc
->
ctlrdy_set_enabled
=
iproc_nand_intc_set
;
soc
->
prepare_data_bus
=
iproc_nand_apb_access
;
return
brcmnand_probe
(
pdev
,
soc
);
}
static
const
struct
of_device_id
iproc_nand_of_match
[]
=
{
{
.
compatible
=
"brcm,nand-iproc"
},
{},
};
MODULE_DEVICE_TABLE
(
of
,
iproc_nand_of_match
);
static
struct
platform_driver
iproc_nand_driver
=
{
.
probe
=
iproc_nand_probe
,
.
remove
=
brcmnand_remove
,
.
driver
=
{
.
name
=
"iproc_nand"
,
.
pm
=
&
brcmnand_pm_ops
,
.
of_match_table
=
iproc_nand_of_match
,
}
};
module_platform_driver
(
iproc_nand_driver
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_AUTHOR
(
"Brian Norris"
);
MODULE_AUTHOR
(
"Ray Jui"
);
MODULE_DESCRIPTION
(
"NAND driver for Broadcom IPROC-based SoCs"
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录