aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/spectra/lld.c
blob: 5c3b9762dc3ee7627c18dba74ca9d3d6a2e0d80d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
/*
 * NAND Flash Controller Device Driver
 * Copyright (c) 2009, Intel Corporation and its suppliers.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope 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.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 *
 */

#include "spectraswconfig.h"
#include "ffsport.h"
#include "ffsdefs.h"
#include "lld.h"
#include "lld_nand.h"

/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
#if FLASH_EMU		/* vector all the LLD calls to the LLD_EMU code */
#include "lld_emu.h"
#include "lld_cdma.h"

/* common functions: */
u16 GLOB_LLD_Flash_Reset(void)
{
	return emu_Flash_Reset();
}

u16 GLOB_LLD_Read_Device_ID(void)
{
	return emu_Read_Device_ID();
}

int GLOB_LLD_Flash_Release(void)
{
	return emu_Flash_Release();
}

u16 GLOB_LLD_Flash_Init(void)
{
	return emu_Flash_Init();
}

u16 GLOB_LLD_Erase_Block(u32 block_add)
{
	return emu_Erase_Block(block_add);
}

u16 GLOB_LLD_Write_Page_Main(u8 *write_data, u32 block, u16 Page,
				u16 PageCount)
{
	return emu_Write_Page_Main(write_data, block, Page, PageCount);
}

u16 GLOB_LLD_Read_Page_Main(u8 *read_data, u32 block, u16 Page,
			       u16 PageCount)
{
	return emu_Read_Page_Main(read_data, block, Page, PageCount);
}

u16 GLOB_LLD_Read_Page_Main_Polling(u8 *read_data,
			u32 block, u16 page, u16 page_count)
{
	return emu_Read_Page_Main(read_data, block, page, page_count);
}

u16 GLOB_LLD_Write_Page_Main_Spare(u8 *write_data, u32 block,
				      u16 Page, u16 PageCount)
{
	return emu_Write_Page_Main_Spare(write_data, block, Page, PageCount);
}

u16 GLOB_LLD_Read_Page_Main_Spare(u8 *read_data, u32 block,
				     u16 Page, u16 PageCount)
{
	return emu_Read_Page_Main_Spare(read_data, block, Page, PageCount);
}

u16 GLOB_LLD_Write_Page_Spare(u8 *write_data, u32 block, u16 Page,
				 u16 PageCount)
{
	return emu_Write_Page_Spare(write_data, block, Page, PageCount);
}

u16 GLOB_LLD_Read_Page_Spare(u8 *read_data, u32 block, u16 Page,
				u16 PageCount)
{
	return emu_Read_Page_Spare(read_data, block, Page, PageCount);
}

u16  GLOB_LLD_Get_Bad_Block(u32 block)
{
    return  emu_Get_Bad_Block(block);
}

#endif /* FLASH_EMU */

/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
#if FLASH_MTD		/* vector all the LLD calls to the LLD_MTD code */
#include "lld_mtd.h"
#include "lld_cdma.h"

/* common functions: */
u16 GLOB_LLD_Flash_Reset(void)
{
	return mtd_Flash_Reset();
}

u16 GLOB_LLD_Read_Device_ID(void)
{
	return mtd_Read_Device_ID();
}

int GLOB_LLD_Flash_Release(void)
{
	return mtd_Flash_Release();
}

u16 GLOB_LLD_Flash_Init(void)
{
	return mtd_Flash_Init();
}

u16 GLOB_LLD_Erase_Block(u32 block_add)
{
	return mtd_Erase_Block(block_add);
}

u16 GLOB_LLD_Write_Page_Main(u8 *write_data, u32 block, u16 Page,
				u16 PageCount)
{
	return mtd_Write_Page_Main(write_data, block, Page, PageCount);
}

u16 GLOB_LLD_Read_Page_Main(u8 *read_data, u32 block, u16 Page,
			       u16 PageCount)
{
	return mtd_Read_Page_Main(read_data, block, Page, PageCount);
}

u16 GLOB_LLD_Read_Page_Main_Polling(u8 *read_data,
			u32 block, u16 page, u16 page_count)
{
	return mtd_Read_Page_Main(read_data, block, page, page_count);
}

u16 GLOB_LLD_Write_Page_Main_Spare(u8 *write_data, u32 block,
				      u16 Page, u16 PageCount)
{
	return mtd_Write_Page_Main_Spare(write_data, block, Page, PageCount);
}

u16 GLOB_LLD_Read_Page_Main_Spare(u8 *read_data, u32 block,
				     u16 Page, u16 PageCount)
{
	return mtd_Read_Page_Main_Spare(read_data, block, Page, PageCount);
}

u16 GLOB_LLD_Write_Page_Spare(u8 *write_data, u32 block, u16 Page,
				 u16 PageCount)
{
	return mtd_Write_Page_Spare(write_data, block, Page, PageCount);
}

u16 GLOB_LLD_Read_Page_Spare(u8 *read_data, u32 block, u16 Page,
				u16 PageCount)
{
	return mtd_Read_Page_Spare(read_data, block, Page, PageCount);
}

u16  GLOB_LLD_Get_Bad_Block(u32 block)
{
    return  mtd_Get_Bad_Block(block);
}

#endif /* FLASH_MTD */

/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
#if FLASH_NAND	/* vector all the LLD calls to the NAND controller code */
#include "lld_nand.h"
#include "lld_cdma.h"
#include "flash.h"

/* common functions for LLD_NAND */
void GLOB_LLD_ECC_Control(int enable)
{
	NAND_ECC_Ctrl(enable);
}

/* common functions for LLD_NAND */
u16 GLOB_LLD_Flash_Reset(void)
{
	return NAND_Flash_Reset();
}

u16 GLOB_LLD_Read_Device_ID(void)
{
	return NAND_Read_Device_ID();
}

u16 GLOB_LLD_UnlockArrayAll(void)
{
	return NAND_UnlockArrayAll();
}

u16 GLOB_LLD_Flash_Init(void)
{
	return NAND_Flash_Init();
}

int GLOB_LLD_Flash_Release(void)
{
	return nand_release_spectra();
}

u16 GLOB_LLD_Erase_Block(u32 block_add)
{
	return NAND_Erase_Block(block_add);
}


u16 GLOB_LLD_Write_Page_Main(u8 *write_data, u32 block, u16 Page,
				u16 PageCount)
{
	return NAND_Write_Page_Main(write_data, block, Page, PageCount);
}

u16 GLOB_LLD_Read_Page_Main(u8 *read_data, u32 block, u16 page,
			       u16 page_count)
{
	if (page_count == 1) /* Using polling to improve read speed */
		return NAND_Read_Page_Main_Polling(read_data, block, page, 1);
	else
		return NAND_Read_Page_Main(read_data, block, page, page_count);
}

u16 GLOB_LLD_Read_Page_Main_Polling(u8 *read_data,
			u32 block, u16 page, u16 page_count)
{
	return NAND_Read_Page_Main_Polling(read_data,
			block, page, page_count);
}

u16 GLOB_LLD_Write_Page_Main_Spare(u8 *write_data, u32 block,
				      u16 Page, u16 PageCount)
{
	return NAND_Write_Page_Main_Spare(write_data, block, Page, PageCount);
}

u16 GLOB_LLD_Write_Page_Spare(u8 *write_data, u32 block, u16 Page,
				 u16 PageCount)
{
	return NAND_Write_Page_Spare(write_data, block, Page, PageCount);
}

u16 GLOB_LLD_Read_Page_Main_Spare(u8 *read_data, u32 block,
				     u16 page, u16 page_count)
{
	return NAND_Read_Page_Main_Spare(read_data, block, page, page_count);
}

u16 GLOB_LLD_Read_Page_Spare(u8 *read_data, u32 block, u16 Page,
				u16 PageCount)
{
	return NAND_Read_Page_Spare(read_data, block, Page, PageCount);
}

u16  GLOB_LLD_Get_Bad_Block(u32 block)
{
	return  NAND_Get_Bad_Block(block);
}

#if CMD_DMA
u16 GLOB_LLD_Event_Status(void)
{
	return CDMA_Event_Status();
}

u16 glob_lld_execute_cmds(void)
{
	return CDMA_Execute_CMDs();
}

u16 GLOB_LLD_MemCopy_CMD(u8 *dest, u8 *src,
			u32 ByteCount, u16 flag)
{
	/* Replace the hardware memcopy with software memcpy function */
	if (CDMA_Execute_CMDs())
		return FAIL;
	memcpy(dest, src, ByteCount);
	return PASS;

	/* return CDMA_MemCopy_CMD(dest, src, ByteCount, flag); */
}

u16 GLOB_LLD_Erase_Block_cdma(u32 block, u16 flags)
{
	return CDMA_Data_CMD(ERASE_CMD, 0, block, 0, 0, flags);
}

u16 GLOB_LLD_Write_Page_Main_cdma(u8 *data, u32 block, u16 page, u16 count)
{
	return CDMA_Data_CMD(WRITE_MAIN_CMD, data, block, page, count, 0);
}

u16 GLOB_LLD_Read_Page_Main_cdma(u8 *data, u32 block, u16 page,
				u16 count, u16 flags)
{
	return CDMA_Data_CMD(READ_MAIN_CMD, data, block, page, count, flags);
}

u16 GLOB_LLD_Write_Page_Main_Spare_cdma(u8 *data, u32 block, u16 page,
					u16 count, u16 flags)
{
	return CDMA_Data_CMD(WRITE_MAIN_SPARE_CMD,
			data, block, page, count, flags);
}

u16 GLOB_LLD_Read_Page_Main_Spare_cdma(u8 *data,
				u32 block, u16 page, u16 count)
{
	return CDMA_Data_CMD(READ_MAIN_SPARE_CMD, data, block, page, count,
			LLD_CMD_FLAG_MODE_CDMA);
}

#endif /* CMD_DMA */
#endif /* FLASH_NAND */

/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/

/* end of LLD.c */