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 controller interface description
29235537Sgber#
30235537Sgber
31235537Sgber#include <sys/bus.h>
32235537Sgber#include <dev/nand/nand.h>
33235537Sgber
34235537SgberINTERFACE nfc;
35235537Sgber
36235537SgberCODE {
37235537Sgber	static int nfc_default_method(device_t dev)
38235537Sgber	{
39235537Sgber		return (0);
40235537Sgber	}
41235537Sgber
42235537Sgber	static int nfc_softecc_get(device_t dev, void *buf, int pagesize, 
43235537Sgber	    void *ecc, int *needwrite)
44235537Sgber	{
45235537Sgber		*needwrite = 1;
46235537Sgber		return (nand_softecc_get(dev, buf, pagesize, ecc));
47235537Sgber	}
48235537Sgber
49235537Sgber	static int nfc_softecc_correct(device_t dev, void *buf, int pagesize,
50235537Sgber	    void *readecc, void *calcecc)
51235537Sgber	{
52235537Sgber		return (nand_softecc_correct(dev, buf, pagesize, readecc,
53235537Sgber		    calcecc));
54235537Sgber	}
55235537Sgber};
56235537Sgber
57235537Sgber# Send command to a NAND chip
58235537Sgber#
59235537Sgber# Return values:
60235537Sgber# 0: Success
61235537Sgber#
62235537SgberMETHOD int send_command {
63235537Sgber	device_t dev;
64235537Sgber	uint8_t command;
65235537Sgber};
66235537Sgber
67235537Sgber# Send address to a NAND chip
68235537Sgber#
69235537Sgber# Return values:
70235537Sgber# 0: Success
71235537Sgber#
72235537SgberMETHOD int send_address {
73235537Sgber	device_t dev;
74235537Sgber	uint8_t address;
75235537Sgber};
76235537Sgber
77235537Sgber# Read byte
78235537Sgber#
79235537Sgber# Return values:
80235537Sgber# byte read
81235537Sgber#
82235537SgberMETHOD uint8_t read_byte {
83235537Sgber	device_t dev;
84235537Sgber};
85235537Sgber
86235537Sgber# Write byte
87235537Sgber#
88235537SgberMETHOD void write_byte {
89235537Sgber	device_t dev;
90235537Sgber	uint8_t byte;
91235537Sgber};
92235537Sgber
93235537Sgber# Read word
94235537Sgber#
95235537Sgber# Return values:
96235537Sgber# word read
97235537Sgber#
98235537SgberMETHOD uint16_t read_word {
99235537Sgber	device_t dev;
100235537Sgber};
101235537Sgber
102235537Sgber# Write word
103235537Sgber#
104235537SgberMETHOD void write_word {
105235537Sgber	device_t dev;
106235537Sgber	uint16_t word;
107235537Sgber};
108235537Sgber
109235537Sgber# Read buf
110235537Sgber#
111235537SgberMETHOD void read_buf {
112235537Sgber	device_t dev;
113235537Sgber	void *buf;
114235537Sgber	uint32_t len;
115235537Sgber};
116235537Sgber
117235537Sgber# Write buf
118235537Sgber#
119235537SgberMETHOD void write_buf {
120235537Sgber	device_t dev;
121235537Sgber	void *buf;
122235537Sgber	uint32_t len;
123235537Sgber};
124235537Sgber
125235537Sgber# Select CS
126235537Sgber#
127235537SgberMETHOD int select_cs {
128235537Sgber	device_t dev;
129235537Sgber	uint8_t cs;
130235537Sgber};
131235537Sgber
132235537Sgber# Read ready/busy signal
133235537Sgber#
134235537SgberMETHOD int read_rnb {
135235537Sgber	device_t dev;
136235537Sgber};
137235537Sgber
138235537Sgber# Start command
139235537Sgber#
140235537Sgber# Return values:
141235537Sgber# 0: Success
142235537Sgber#
143235537SgberMETHOD int start_command {
144235537Sgber	device_t dev;
145235537Sgber} DEFAULT nfc_default_method;
146235537Sgber
147235537Sgber# Generate ECC or get it from H/W
148235537Sgber#
149235537SgberMETHOD int get_ecc {
150235537Sgber	device_t dev;
151235537Sgber	void *buf;
152235537Sgber	int pagesize;
153235537Sgber	void *ecc;
154235537Sgber	int *needwrite;
155235537Sgber} DEFAULT nfc_softecc_get;
156235537Sgber
157235537Sgber# Correct ECC
158235537Sgber#
159235537SgberMETHOD int correct_ecc {
160235537Sgber	device_t dev;
161235537Sgber	void *buf;
162235537Sgber	int pagesize;
163235537Sgber	void *readecc;
164235537Sgber	void *calcecc;
165235537Sgber} DEFAULT nfc_softecc_correct;
166