Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
linux_grx
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Issue analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Intel
linux_grx
Commits
22f98e12
Commit
22f98e12
authored
7 years ago
by
Wu Zhixian
Committed by
Kenneth Johansson
7 years ago
Browse files
Options
Downloads
Patches
Plain Diff
support QSPI NAND FLASH, test pass at HAPS
parent
fc51b1f4
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
drivers/mtd/ltq-spinand/ltq_spinand.c
+54
-11
54 additions, 11 deletions
drivers/mtd/ltq-spinand/ltq_spinand.c
drivers/mtd/ltq-spinand/ltq_spinand.h
+1
-1
1 addition, 1 deletion
drivers/mtd/ltq-spinand/ltq_spinand.h
with
55 additions
and
12 deletions
drivers/mtd/ltq-spinand/ltq_spinand.c
+
54
−
11
View file @
22f98e12
/*
/*
* (C) Copyright 2016 Intel Corporation
* Author: William Widjaja <w.widjaja@intel.com>
...
...
@@ -240,6 +241,9 @@ static int spi_nand_manufacture_init(struct mtd_info *mtd, struct nand_chip *chi
chip
->
ecc
.
size
=
mtd
->
writesize
>>
2
;
//chip->ecc.steps = 4; /* 4 regions within page */
chip
->
ecc
.
bytes
=
8
;
/* !<TODO : ??? */
if
(
type
->
dev_id
==
0x12
)
{
info
->
options
|=
QSPI_NAND_FLASH_TYPE
;
}
break
;
...
...
@@ -627,15 +631,25 @@ static int spinand_write_enable(struct spi_device *spi)
*/
static
int
spinand_read_page_to_cache
(
struct
spi_device
*
spi
,
int
page_id
)
{
struct
mtd_info
*
mtd
=
(
struct
mtd_info
*
)
dev_get_drvdata
((
const
struct
device
*
)
&
(
spi
->
dev
));
struct
nand_chip
*
chip
=
mtd_to_nand
(
mtd
);
struct
spinand_info
*
info
=
(
struct
spinand_info
*
)
chip
->
priv
;
struct
spinand_cmd
cmd
=
{
0
};
u16
row
;
row
=
page_id
;
cmd
.
cmd
=
CMD_READ
;
cmd
.
n_addr
=
3
;
cmd
.
addr
[
0
]
=
(
u8
)
((
page_id
&
0xff0000
)
>>
16
);
cmd
.
addr
[
1
]
=
(
u8
)((
page_id
&
0xff00
)
>>
8
);
cmd
.
addr
[
2
]
=
(
u8
)(
page_id
&
0x00ff
);
if
(
info
->
options
&
QSPI_NAND_FLASH_TYPE
)
{
cmd
.
addr
[
2
]
=
(
u8
)
((
page_id
&
0xff0000
)
>>
16
);
cmd
.
addr
[
1
]
=
(
u8
)((
page_id
&
0xff00
)
>>
8
);
cmd
.
addr
[
0
]
=
(
u8
)(
page_id
&
0x00ff
);
}
else
{
cmd
.
addr
[
0
]
=
(
u8
)
((
page_id
&
0xff0000
)
>>
16
);
cmd
.
addr
[
1
]
=
(
u8
)((
page_id
&
0xff00
)
>>
8
);
cmd
.
addr
[
2
]
=
(
u8
)(
page_id
&
0x00ff
);
}
return
spinand_cmd
(
spi
,
&
cmd
);
}
...
...
@@ -670,6 +684,10 @@ static int spinand_read_from_cache(struct spi_device *spi, int page_id,
cmd
.
addr
[
0
]
=
0
;
cmd
.
addr
[
1
]
=
(
u8
)(
column
>>
8
);
cmd
.
addr
[
2
]
=
(
u8
)
column
;
}
else
if
(
info
->
options
&
QSPI_NAND_FLASH_TYPE
)
{
cmd
.
addr
[
0
]
=
0
;
cmd
.
addr
[
1
]
=
(
u8
)(
column
>>
8
);
cmd
.
addr
[
2
]
=
(
u8
)
column
;
}
else
{
cmd
.
addr
[
0
]
=
(
u8
)((
column
&
0xff00
)
>>
8
);
cmd
.
addr
[
1
]
=
(
u8
)(
column
&
0x00ff
);
...
...
@@ -824,14 +842,23 @@ static int spinand_program_data_to_cache(struct spi_device *spi,
*/
static
int
spinand_program_execute
(
struct
spi_device
*
spi
,
int
page_id
)
{
struct
mtd_info
*
mtd
=
(
struct
mtd_info
*
)
dev_get_drvdata
((
const
struct
device
*
)
&
(
spi
->
dev
));
struct
nand_chip
*
chip
=
mtd_to_nand
(
mtd
);
struct
spinand_info
*
info
=
(
struct
spinand_info
*
)
chip
->
priv
;
struct
spinand_cmd
cmd
=
{
0
};
/* NOTE: this is changed so you can write above 128 MB */
cmd
.
cmd
=
CMD_PROG_PAGE_EXC
;
cmd
.
n_addr
=
3
;
cmd
.
addr
[
0
]
=
(
u8
)((
page_id
&
0xff0000
)
>>
16
);
cmd
.
addr
[
1
]
=
(
u8
)((
page_id
&
0xff00
)
>>
8
);
cmd
.
addr
[
2
]
=
(
u8
)(
page_id
&
0x00ff
);
if
(
info
->
options
&
QSPI_NAND_FLASH_TYPE
)
{
cmd
.
addr
[
2
]
=
(
u8
)((
page_id
&
0xff0000
)
>>
16
);
cmd
.
addr
[
1
]
=
(
u8
)((
page_id
&
0xff00
)
>>
8
);
cmd
.
addr
[
0
]
=
(
u8
)(
page_id
&
0x00ff
);
}
else
{
cmd
.
addr
[
0
]
=
(
u8
)((
page_id
&
0xff0000
)
>>
16
);
cmd
.
addr
[
1
]
=
(
u8
)((
page_id
&
0xff00
)
>>
8
);
cmd
.
addr
[
2
]
=
(
u8
)(
page_id
&
0x00ff
);
}
return
spinand_cmd
(
spi
,
&
cmd
);
}
...
...
@@ -869,14 +896,21 @@ static int spinand_program_page(struct spi_device *spi,
if
(
wait_till_ready
(
spi
))
dev_err
(
&
spi
->
dev
,
"wait timedout!!!
\n
"
);
/* PROGRAM LOAD (02h), 2 bytes address, 2048 bytes data + 64 bytes OOB, no response */
retval
=
spinand_program_data_to_cache
(
spi
,
page_id
,
offset
,
len
,
wbuf
);
if
(
retval
<
0
)
if
(
retval
<
0
)
{
dev_err
(
&
spi
->
dev
,
"[%s]spinand_program_data_to_cache fail retval=0x%x
\n
"
,
__func__
,
retval
);
return
retval
;
}
/* PROGRAM EXECUTE (10h), 3 bytes address,no data, no response */
retval
=
spinand_program_execute
(
spi
,
page_id
);
if
(
retval
<
0
)
if
(
retval
<
0
)
{
dev_err
(
&
spi
->
dev
,
"[%s]spinand_program_execute fail retval=0x%x
\n
"
,
__func__
,
retval
);
return
retval
;
}
while
(
1
)
{
/* GET FEATUR from command to read status (0Fh), 1 byte address for Status register address (C0h), 1 byte status response */
retval
=
spinand_read_status
(
spi
,
&
status
);
if
(
retval
<
0
)
{
dev_err
(
&
spi
->
dev
,
...
...
@@ -911,15 +945,24 @@ static int spinand_program_page(struct spi_device *spi,
*/
static
int
spinand_erase_block_erase
(
struct
spi_device
*
spi
,
u32
block_id
)
{
struct
mtd_info
*
mtd
=
(
struct
mtd_info
*
)
dev_get_drvdata
((
const
struct
device
*
)
&
(
spi
->
dev
));
struct
nand_chip
*
chip
=
mtd_to_nand
(
mtd
);
struct
spinand_info
*
info
=
(
struct
spinand_info
*
)
chip
->
priv
;
struct
spinand_cmd
cmd
=
{
0
};
u16
row
;
row
=
block_id
;
cmd
.
cmd
=
CMD_ERASE_BLK
;
cmd
.
n_addr
=
3
;
cmd
.
addr
[
0
]
=
(
u8
)((
block_id
&
0xff0000
)
>>
16
);
cmd
.
addr
[
1
]
=
(
u8
)((
block_id
&
0xff00
)
>>
8
);
cmd
.
addr
[
2
]
=
(
u8
)(
block_id
&
0x00ff
);
if
(
info
->
options
&
QSPI_NAND_FLASH_TYPE
)
{
cmd
.
addr
[
2
]
=
(
u8
)((
block_id
&
0xff0000
)
>>
16
);
cmd
.
addr
[
1
]
=
(
u8
)((
block_id
&
0xff00
)
>>
8
);
cmd
.
addr
[
0
]
=
(
u8
)(
block_id
&
0x00ff
);
}
else
{
cmd
.
addr
[
0
]
=
(
u8
)((
block_id
&
0xff0000
)
>>
16
);
cmd
.
addr
[
1
]
=
(
u8
)((
block_id
&
0xff00
)
>>
8
);
cmd
.
addr
[
2
]
=
(
u8
)(
block_id
&
0x00ff
);
}
return
spinand_cmd
(
spi
,
&
cmd
);
}
...
...
This diff is collapsed.
Click to expand it.
drivers/mtd/ltq-spinand/ltq_spinand.h
+
1
−
1
View file @
22f98e12
...
...
@@ -137,6 +137,6 @@ struct nand_ecclayout {
* - CMD_READ_RDM : extra dummy byte before column address
*/
#define GIGADEVICE_DUMMY_TYPE 0x1
#define QSPI_NAND_FLASH_TYPE 0x02
#endif
/* __LTQ_MTD_SPI_NAND_H__ */
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment