1235537Sgber#-
2235537Sgber# Copyright (C) 2009-2012 Semihalf
3235537Sgber# All rights reserved.
4235537Sgber#
5235537Sgber# Redistribution and use in source and binary forms, with or without
6235537Sgber# modification, are permitted provided that the following conditions
7235537Sgber# are met:
8235537Sgber# 1. Redistributions of source code must retain the above copyright
9235537Sgber#    notice, this list of conditions and the following disclaimer.
10235537Sgber# 2. Redistributions in binary form must reproduce the above copyright
11235537Sgber#    notice, this list of conditions and the following disclaimer in the
12235537Sgber#    documentation and/or other materials provided with the distribution.
13235537Sgber#
14235537Sgber# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15235537Sgber# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16235537Sgber# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17235537Sgber# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18235537Sgber# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19235537Sgber# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20235537Sgber# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21235537Sgber# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22235537Sgber# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23235537Sgber# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24235537Sgber# SUCH DAMAGE.
25235537Sgber#
26235537Sgber# $FreeBSD$
27235537Sgber
28235537Sgber# NAND chip interface description
29235537Sgber#
30235537Sgber
31235537Sgber#include <sys/bus.h>
32235537Sgber#include <dev/nand/nand.h>
33235537Sgber
34235537SgberINTERFACE nand;
35235537Sgber
36235537SgberCODE {
37235537Sgber	static int nand_method_not_supported(device_t dev)
38235537Sgber	{
39235537Sgber		return (ENOENT);
40235537Sgber	}
41235537Sgber};
42235537Sgber
43235537Sgber# Read NAND page
44235537Sgber#
45235537Sgber# Return values:
46235537Sgber# 0: Success
47235537Sgber#
48235537SgberMETHOD int read_page {
49235537Sgber	device_t dev;
50235537Sgber	uint32_t page;
51235537Sgber	void* buf;
52235537Sgber	uint32_t len;
53235537Sgber	uint32_t offset;
54235537Sgber};
55235537Sgber
56235537Sgber# Program NAND page
57235537Sgber#
58235537Sgber# Return values:
59235537Sgber# 0: Success
60235537Sgber#
61235537SgberMETHOD int program_page {
62235537Sgber	device_t dev;
63235537Sgber	uint32_t page;
64235537Sgber	void* buf;
65235537Sgber	uint32_t len;
66235537Sgber	uint32_t offset;
67235537Sgber};
68235537Sgber
69235537Sgber# Program NAND page interleaved
70235537Sgber#
71235537Sgber# Return values:
72235537Sgber# 0: Success
73235537Sgber#
74235537SgberMETHOD int program_page_intlv {
75235537Sgber	device_t dev;
76235537Sgber	uint32_t page;
77235537Sgber	void* buf;
78235537Sgber	uint32_t len;
79235537Sgber	uint32_t offset;
80235537Sgber} DEFAULT nand_method_not_supported;
81235537Sgber
82235537Sgber# Read NAND oob
83235537Sgber#
84235537Sgber# Return values:
85235537Sgber# 0: Success
86235537Sgber#
87235537SgberMETHOD int read_oob {
88235537Sgber	device_t dev;
89235537Sgber	uint32_t page;
90235537Sgber	void* buf;
91235537Sgber	uint32_t len;
92235537Sgber	uint32_t offset;
93235537Sgber};
94235537Sgber
95235537Sgber# Program NAND oob
96235537Sgber#
97235537Sgber# Return values:
98235537Sgber# 0: Success
99235537Sgber#
100235537SgberMETHOD int program_oob {
101235537Sgber	device_t dev;
102235537Sgber	uint32_t page;
103235537Sgber	void* buf;
104235537Sgber	uint32_t len;
105235537Sgber	uint32_t offset;
106235537Sgber};
107235537Sgber
108235537Sgber# Erase NAND block
109235537Sgber#
110235537Sgber# Return values:
111235537Sgber# 0: Success
112235537Sgber#
113235537SgberMETHOD int erase_block {
114235537Sgber	device_t dev;
115235537Sgber	uint32_t block;
116235537Sgber};
117235537Sgber
118235537Sgber# Erase NAND block interleaved
119235537Sgber#
120235537Sgber# Return values:
121235537Sgber# 0: Success
122235537Sgber#
123235537SgberMETHOD int erase_block_intlv {
124235537Sgber	device_t dev;
125235537Sgber	uint32_t block;
126235537Sgber} DEFAULT nand_method_not_supported;
127235537Sgber
128235537Sgber# NAND get status
129235537Sgber#
130235537Sgber# Return values:
131235537Sgber# 0: Success
132235537Sgber#
133235537SgberMETHOD int get_status {
134235537Sgber	device_t dev;
135235537Sgber	uint8_t *status;
136235537Sgber};
137235537Sgber
138235537Sgber# NAND check if block is bad
139235537Sgber#
140235537Sgber# Return values:
141235537Sgber# 0: Success
142235537Sgber#
143235537SgberMETHOD int is_blk_bad {
144235537Sgber	device_t dev;
145235537Sgber	uint32_t block_number;
146235537Sgber	uint8_t  *bad;
147235537Sgber};
148235537Sgber
149235537Sgber# NAND get ECC
150235537Sgber#
151235537Sgber#
152235537SgberMETHOD int get_ecc {
153235537Sgber	device_t dev;
154235537Sgber	void *buf;
155235537Sgber	void *ecc;
156235537Sgber	int *needwrite;
157235537Sgber};
158235537Sgber
159235537Sgber# NAND correct ECC
160235537Sgber#
161235537Sgber#
162235537SgberMETHOD int correct_ecc {
163235537Sgber	device_t dev;
164235537Sgber	void *buf;
165235537Sgber	void *readecc;
166235537Sgber	void *calcecc;
167235537Sgber};
168235537Sgber
169