Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OS
U-Boot.Mirror
提交
b839fc9d
U
U-Boot.Mirror
项目概览
OS
/
U-Boot.Mirror
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
U-Boot.Mirror
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b839fc9d
编写于
2月 26, 2021
作者:
T
Tom Rini
浏览文件
操作
浏览文件
下载
差异文件
Merge
https://gitlab.denx.de/u-boot/custodians/u-boot-spi
- new GigaDevice flash ids - fixes for imx, nxp_spi drivers
上级
a3c6d287
783a15b3
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
113 addition
and
36 deletion
+113
-36
cmd/sf.c
cmd/sf.c
+18
-11
drivers/mtd/nand/spi/gigadevice.c
drivers/mtd/nand/spi/gigadevice.c
+69
-10
drivers/mtd/spi/spi-nor-ids.c
drivers/mtd/spi/spi-nor-ids.c
+9
-1
drivers/spi/mxc_spi.c
drivers/spi/mxc_spi.c
+4
-1
drivers/spi/nxp_fspi.c
drivers/spi/nxp_fspi.c
+2
-2
include/linux/mtd/spi-nor.h
include/linux/mtd/spi-nor.h
+11
-11
未找到文件。
cmd/sf.c
浏览文件 @
b839fc9d
...
...
@@ -344,8 +344,11 @@ static int do_spi_flash_erase(int argc, char *const argv[])
}
ret
=
spi_flash_erase
(
flash
,
offset
,
size
);
printf
(
"SF: %zu bytes @ %#x Erased: %s
\n
"
,
(
size_t
)
size
,
(
u32
)
offset
,
ret
?
"ERROR"
:
"OK"
);
printf
(
"SF: %zu bytes @ %#x Erased: "
,
(
size_t
)
size
,
(
u32
)
offset
);
if
(
ret
)
printf
(
"ERROR %d
\n
"
,
ret
);
else
printf
(
"OK
\n
"
);
return
ret
==
0
?
0
:
1
;
}
...
...
@@ -442,20 +445,22 @@ static int spi_flash_test(struct spi_flash *flash, uint8_t *buf, ulong len,
ulong
offset
,
uint8_t
*
vbuf
)
{
struct
test_info
test
;
int
i
;
int
err
,
i
;
printf
(
"SPI flash test:
\n
"
);
memset
(
&
test
,
'\0'
,
sizeof
(
test
));
test
.
base_ms
=
get_timer
(
0
);
test
.
bytes
=
len
;
if
(
spi_flash_erase
(
flash
,
offset
,
len
))
{
printf
(
"Erase failed
\n
"
);
err
=
spi_flash_erase
(
flash
,
offset
,
len
);
if
(
err
)
{
printf
(
"Erase failed (err = %d)
\n
"
,
err
);
return
-
1
;
}
spi_test_next_stage
(
&
test
);
if
(
spi_flash_read
(
flash
,
offset
,
len
,
vbuf
))
{
printf
(
"Check read failed
\n
"
);
err
=
spi_flash_read
(
flash
,
offset
,
len
,
vbuf
);
if
(
err
)
{
printf
(
"Check read failed (err = %d)
\n
"
,
err
);
return
-
1
;
}
for
(
i
=
0
;
i
<
len
;
i
++
)
{
...
...
@@ -468,15 +473,17 @@ static int spi_flash_test(struct spi_flash *flash, uint8_t *buf, ulong len,
}
spi_test_next_stage
(
&
test
);
if
(
spi_flash_write
(
flash
,
offset
,
len
,
buf
))
{
printf
(
"Write failed
\n
"
);
err
=
spi_flash_write
(
flash
,
offset
,
len
,
buf
);
if
(
err
)
{
printf
(
"Write failed (err = %d)
\n
"
,
err
);
return
-
1
;
}
memset
(
vbuf
,
'\0'
,
len
);
spi_test_next_stage
(
&
test
);
if
(
spi_flash_read
(
flash
,
offset
,
len
,
vbuf
))
{
printf
(
"Read failed
\n
"
);
err
=
spi_flash_read
(
flash
,
offset
,
len
,
vbuf
);
if
(
err
)
{
printf
(
"Read failed (ret = %d)
\n
"
,
err
);
return
-
1
;
}
spi_test_next_stage
(
&
test
);
...
...
drivers/mtd/nand/spi/gigadevice.c
浏览文件 @
b839fc9d
...
...
@@ -17,9 +17,22 @@
#define GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS (1 << 4)
#define GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS (3 << 4)
#define GD5FXGQ4XEXXG_REG_STATUS2 0xf0
#define GD5FXGQ5XE_STATUS_ECC_1_4_BITFLIPS (1 << 4)
#define GD5FXGQ5XE_STATUS_ECC_4_BITFLIPS (3 << 4)
static
SPINAND_OP_VARIANTS
(
read_cache_variants
,
#define GD5FXGQXXEXXG_REG_STATUS2 0xf0
/* Q4 devices, QUADIO: Dummy bytes valid for 1 and 2 GBit variants */
static
SPINAND_OP_VARIANTS
(
gd5fxgq4_read_cache_variants
,
SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP
(
0
,
1
,
NULL
,
0
),
SPINAND_PAGE_READ_FROM_CACHE_X4_OP
(
0
,
1
,
NULL
,
0
),
SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP
(
0
,
1
,
NULL
,
0
),
SPINAND_PAGE_READ_FROM_CACHE_X2_OP
(
0
,
1
,
NULL
,
0
),
SPINAND_PAGE_READ_FROM_CACHE_OP
(
true
,
0
,
1
,
NULL
,
0
),
SPINAND_PAGE_READ_FROM_CACHE_OP
(
false
,
0
,
1
,
NULL
,
0
));
/* Q5 devices, QUADIO: Dummy bytes only valid for 1 GBit variants */
static
SPINAND_OP_VARIANTS
(
gd5f1gq5_read_cache_variants
,
SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP
(
0
,
2
,
NULL
,
0
),
SPINAND_PAGE_READ_FROM_CACHE_X4_OP
(
0
,
1
,
NULL
,
0
),
SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP
(
0
,
1
,
NULL
,
0
),
...
...
@@ -35,7 +48,7 @@ static SPINAND_OP_VARIANTS(update_cache_variants,
SPINAND_PROG_LOAD_X4
(
false
,
0
,
NULL
,
0
),
SPINAND_PROG_LOAD
(
false
,
0
,
NULL
,
0
));
static
int
gd5fxgq
4
xexxg_ooblayout_ecc
(
struct
mtd_info
*
mtd
,
int
section
,
static
int
gd5fxgq
x
xexxg_ooblayout_ecc
(
struct
mtd_info
*
mtd
,
int
section
,
struct
mtd_oob_region
*
region
)
{
if
(
section
)
...
...
@@ -47,7 +60,7 @@ static int gd5fxgq4xexxg_ooblayout_ecc(struct mtd_info *mtd, int section,
return
0
;
}
static
int
gd5fxgq
4
xexxg_ooblayout_free
(
struct
mtd_info
*
mtd
,
int
section
,
static
int
gd5fxgq
x
xexxg_ooblayout_free
(
struct
mtd_info
*
mtd
,
int
section
,
struct
mtd_oob_region
*
region
)
{
if
(
section
)
...
...
@@ -64,7 +77,7 @@ static int gd5fxgq4xexxg_ecc_get_status(struct spinand_device *spinand,
u8
status
)
{
u8
status2
;
struct
spi_mem_op
op
=
SPINAND_GET_FEATURE_OP
(
GD5FXGQ
4
XEXXG_REG_STATUS2
,
struct
spi_mem_op
op
=
SPINAND_GET_FEATURE_OP
(
GD5FXGQ
X
XEXXG_REG_STATUS2
,
&
status2
);
int
ret
;
...
...
@@ -102,21 +115,67 @@ static int gd5fxgq4xexxg_ecc_get_status(struct spinand_device *spinand,
return
-
EINVAL
;
}
static
const
struct
mtd_ooblayout_ops
gd5fxgq4xexxg_ooblayout
=
{
.
ecc
=
gd5fxgq4xexxg_ooblayout_ecc
,
.
rfree
=
gd5fxgq4xexxg_ooblayout_free
,
static
int
gd5fxgq5xexxg_ecc_get_status
(
struct
spinand_device
*
spinand
,
u8
status
)
{
u8
status2
;
struct
spi_mem_op
op
=
SPINAND_GET_FEATURE_OP
(
GD5FXGQXXEXXG_REG_STATUS2
,
&
status2
);
int
ret
;
switch
(
status
&
STATUS_ECC_MASK
)
{
case
STATUS_ECC_NO_BITFLIPS
:
return
0
;
case
GD5FXGQ5XE_STATUS_ECC_1_4_BITFLIPS
:
/*
* Read status2 register to determine a more fine grained
* bit error status
*/
ret
=
spi_mem_exec_op
(
spinand
->
slave
,
&
op
);
if
(
ret
)
return
ret
;
/*
* 1 ... 4 bits are flipped (and corrected)
*/
/* bits sorted this way (1...0): ECCSE1, ECCSE0 */
return
((
status2
&
STATUS_ECC_MASK
)
>>
4
)
+
1
;
case
STATUS_ECC_UNCOR_ERROR
:
return
-
EBADMSG
;
default:
break
;
}
return
-
EINVAL
;
}
static
const
struct
mtd_ooblayout_ops
gd5fxgqxxexxg_ooblayout
=
{
.
ecc
=
gd5fxgqxxexxg_ooblayout_ecc
,
.
rfree
=
gd5fxgqxxexxg_ooblayout_free
,
};
static
const
struct
spinand_info
gigadevice_spinand_table
[]
=
{
SPINAND_INFO
(
"GD5F1GQ4UExxG"
,
0xd1
,
NAND_MEMORG
(
1
,
2048
,
128
,
64
,
1024
,
1
,
1
,
1
),
NAND_ECCREQ
(
8
,
512
),
SPINAND_INFO_OP_VARIANTS
(
&
read_cache_variants
,
SPINAND_INFO_OP_VARIANTS
(
&
gd5fxgq4_
read_cache_variants
,
&
write_cache_variants
,
&
update_cache_variants
),
0
,
SPINAND_ECCINFO
(
&
gd5fxgq
4
xexxg_ooblayout
,
SPINAND_ECCINFO
(
&
gd5fxgq
x
xexxg_ooblayout
,
gd5fxgq4xexxg_ecc_get_status
)),
SPINAND_INFO
(
"GD5F1GQ5UExxG"
,
0x51
,
NAND_MEMORG
(
1
,
2048
,
128
,
64
,
1024
,
1
,
1
,
1
),
NAND_ECCREQ
(
4
,
512
),
SPINAND_INFO_OP_VARIANTS
(
&
gd5f1gq5_read_cache_variants
,
&
write_cache_variants
,
&
update_cache_variants
),
0
,
SPINAND_ECCINFO
(
&
gd5fxgqxxexxg_ooblayout
,
gd5fxgq5xexxg_ecc_get_status
)),
};
static
int
gigadevice_spinand_detect
(
struct
spinand_device
*
spinand
)
...
...
drivers/mtd/spi/spi-nor-ids.c
浏览文件 @
b839fc9d
...
...
@@ -107,6 +107,11 @@ const struct flash_info spi_nor_ids[] = {
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
|
SPI_NOR_HAS_LOCK
|
SPI_NOR_HAS_TB
)
},
{
INFO
(
"gd25lq64c"
,
0xc86017
,
0
,
64
*
1024
,
128
,
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
|
SPI_NOR_HAS_LOCK
|
SPI_NOR_HAS_TB
)
},
{
INFO
(
"gd25q128"
,
0xc84018
,
0
,
64
*
1024
,
256
,
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
|
...
...
@@ -319,7 +324,10 @@ const struct flash_info spi_nor_ids[] = {
{
INFO
(
"w25q80bl"
,
0xef4014
,
0
,
64
*
1024
,
16
,
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
)
},
{
INFO
(
"w25q16cl"
,
0xef4015
,
0
,
64
*
1024
,
32
,
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
)
},
{
INFO
(
"w25q64cv"
,
0xef4017
,
0
,
64
*
1024
,
128
,
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
)
},
{
INFO
(
"w25q128"
,
0xef4018
,
0
,
64
*
1024
,
256
,
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
)
},
{
INFO
(
"w25q128"
,
0xef4018
,
0
,
64
*
1024
,
256
,
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
|
SPI_NOR_HAS_LOCK
|
SPI_NOR_HAS_TB
)
},
{
INFO
(
"w25q256"
,
0xef4019
,
0
,
64
*
1024
,
512
,
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
)
},
{
INFO
(
"w25m512jw"
,
0xef6119
,
0
,
64
*
1024
,
1024
,
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
)
},
{
INFO
(
"w25m512jv"
,
0xef7119
,
0
,
64
*
1024
,
1024
,
SECT_4K
|
SPI_NOR_DUAL_READ
|
SPI_NOR_QUAD_READ
)
},
...
...
drivers/spi/mxc_spi.c
浏览文件 @
b839fc9d
...
...
@@ -662,7 +662,10 @@ static int mxc_spi_release_bus(struct udevice *dev)
static
int
mxc_spi_set_speed
(
struct
udevice
*
bus
,
uint
speed
)
{
/* Nothing to do */
struct
mxc_spi_slave
*
mxcs
=
dev_get_plat
(
bus
);
mxcs
->
max_hz
=
speed
;
return
0
;
}
...
...
drivers/spi/nxp_fspi.c
浏览文件 @
b839fc9d
...
...
@@ -823,7 +823,7 @@ static int nxp_fspi_default_setup(struct nxp_fspi *f)
/* the default frequency, we will change it later if necessary. */
ret
=
clk_set_rate
(
&
f
->
clk
,
20000000
);
if
(
ret
)
if
(
ret
<
0
)
return
ret
;
ret
=
nxp_fspi_clk_prep_enable
(
f
);
...
...
@@ -914,7 +914,7 @@ static int nxp_fspi_set_speed(struct udevice *bus, uint speed)
nxp_fspi_clk_disable_unprep
(
f
);
ret
=
clk_set_rate
(
&
f
->
clk
,
speed
);
if
(
ret
)
if
(
ret
<
0
)
return
ret
;
ret
=
nxp_fspi_clk_prep_enable
(
f
);
...
...
include/linux/mtd/spi-nor.h
浏览文件 @
b839fc9d
...
...
@@ -48,13 +48,13 @@
#define SPINOR_OP_READ_1_2_2 0xbb
/* Read data bytes (Dual I/O SPI) */
#define SPINOR_OP_READ_1_1_4 0x6b
/* Read data bytes (Quad Output SPI) */
#define SPINOR_OP_READ_1_4_4 0xeb
/* Read data bytes (Quad I/O SPI) */
#define SPINOR_OP_READ_1_1_8 0x8b
/* Read data bytes (Octal Output SPI) */
#define SPINOR_OP_READ_1_8_8 0xcb
/* Read data bytes (Octal I/O SPI) */
#define SPINOR_OP_READ_1_1_8 0x8b
/* Read data bytes (Octal Output SPI) */
#define SPINOR_OP_READ_1_8_8 0xcb
/* Read data bytes (Octal I/O SPI) */
#define SPINOR_OP_PP 0x02
/* Page program (up to 256 bytes) */
#define SPINOR_OP_PP_1_1_4 0x32
/* Quad page program */
#define SPINOR_OP_PP_1_4_4 0x38
/* Quad page program */
#define SPINOR_OP_PP_1_1_8 0x82
/* Octal page program */
#define SPINOR_OP_PP_1_8_8 0xc2
/* Octal page program */
#define SPINOR_OP_PP_1_1_8 0x82
/* Octal page program */
#define SPINOR_OP_PP_1_8_8 0xc2
/* Octal page program */
#define SPINOR_OP_BE_4K 0x20
/* Erase 4KiB block */
#define SPINOR_OP_BE_4K_PMC 0xd7
/* Erase 4KiB block on PMC chips */
#define SPINOR_OP_BE_32K 0x52
/* Erase 32KiB block */
...
...
@@ -75,13 +75,13 @@
#define SPINOR_OP_READ_1_2_2_4B 0xbc
/* Read data bytes (Dual I/O SPI) */
#define SPINOR_OP_READ_1_1_4_4B 0x6c
/* Read data bytes (Quad Output SPI) */
#define SPINOR_OP_READ_1_4_4_4B 0xec
/* Read data bytes (Quad I/O SPI) */
#define SPINOR_OP_READ_1_1_8_4B 0x7c
/* Read data bytes (Octal Output SPI) */
#define SPINOR_OP_READ_1_8_8_4B 0xcc
/* Read data bytes (Octal I/O SPI) */
#define SPINOR_OP_READ_1_1_8_4B 0x7c
/* Read data bytes (Octal Output SPI) */
#define SPINOR_OP_READ_1_8_8_4B 0xcc
/* Read data bytes (Octal I/O SPI) */
#define SPINOR_OP_PP_4B 0x12
/* Page program (up to 256 bytes) */
#define SPINOR_OP_PP_1_1_4_4B 0x34
/* Quad page program */
#define SPINOR_OP_PP_1_4_4_4B 0x3e
/* Quad page program */
#define SPINOR_OP_PP_1_1_8_4B 0x84
/* Octal page program */
#define SPINOR_OP_PP_1_8_8_4B 0x8e
/* Octal page program */
#define SPINOR_OP_PP_1_1_8_4B 0x84
/* Octal page program */
#define SPINOR_OP_PP_1_8_8_4B 0x8e
/* Octal page program */
#define SPINOR_OP_BE_4K_4B 0x21
/* Erase 4KiB block */
#define SPINOR_OP_BE_32K_4B 0x5c
/* Erase 32KiB block */
#define SPINOR_OP_SE_4B 0xdc
/* Sector erase (usually 64KiB) */
...
...
@@ -122,8 +122,8 @@
#define SPINOR_OP_CLSR 0x30
/* Clear status register 1 */
/* Used for Micron flashes only. */
#define SPINOR_OP_RD_EVCR
0x65
/* Read EVCR register */
#define SPINOR_OP_WD_EVCR
0x61
/* Write EVCR register */
#define SPINOR_OP_RD_EVCR
0x65
/* Read EVCR register */
#define SPINOR_OP_WD_EVCR
0x61
/* Write EVCR register */
/* Status Register bits. */
#define SR_WIP BIT(0)
/* Write in progress */
...
...
@@ -302,8 +302,8 @@ struct spi_flash {
* @flash_lock: [FLASH-SPECIFIC] lock a region of the SPI NOR
* @flash_unlock: [FLASH-SPECIFIC] unlock a region of the SPI NOR
* @flash_is_locked: [FLASH-SPECIFIC] check if a region of the SPI NOR is
* @quad_enable: [FLASH-SPECIFIC] enables SPI NOR quad mode
* completely locked
* @quad_enable: [FLASH-SPECIFIC] enables SPI NOR quad mode
* @priv: the private data
*/
struct
spi_nor
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录