Lines Matching +full:bank +full:- +full:number
5 * SPDX-License-Identifier: GPL-2.0+
82 * smi_wait_xfer_finish - Wait until TFF is set in status register
92 if (readl(&smicntl->smi_sr) & TFF) in smi_wait_xfer_finish()
99 return -1; in smi_wait_xfer_finish()
103 * smi_read_id - Read flash id
105 * @banknum: bank number
107 * Read the flash id present at bank #banknum
113 writel(readl(&smicntl->smi_cr1) | SW_MODE, &smicntl->smi_cr1); in smi_read_id()
114 writel(READ_ID, &smicntl->smi_tr); in smi_read_id()
116 &smicntl->smi_cr2); in smi_read_id()
119 return -EIO; in smi_read_id()
121 value = (readl(&smicntl->smi_rr) & 0x00FFFFFF); in smi_read_id()
123 writel(readl(&smicntl->smi_sr) & ~TFF, &smicntl->smi_sr); in smi_read_id()
124 writel(readl(&smicntl->smi_cr1) & ~SW_MODE, &smicntl->smi_cr1); in smi_read_id()
130 * flash_get_size - Detect the SMI flash by reading the ID.
131 * @base: Base address of the flash area bank #banknum
132 * @banknum: Bank number
150 /* Matches chip-id to entire list of 'serial-nor flash' ids */ in flash_get_size()
153 info->size = flash_devices[i].size_in_bytes; in flash_get_size()
154 info->flash_id = value; in flash_get_size()
155 info->start[0] = base; in flash_get_size()
156 info->sector_count = in flash_get_size()
157 info->size/flash_devices[i].sectorsize; in flash_get_size()
159 return info->size; in flash_get_size()
167 * smi_read_sr - Read status register of SMI
168 * @bank: bank number
171 * given bank
173 static int smi_read_sr(int bank) in smi_read_sr() argument
178 ctrlreg1 = readl(&smicntl->smi_cr1); in smi_read_sr()
181 writel(readl(&smicntl->smi_cr1) & ~(SW_MODE | WB_MODE), in smi_read_sr()
182 &smicntl->smi_cr1); in smi_read_sr()
185 writel((bank << BANKSEL_SHIFT) | RD_STATUS_REG, &smicntl->smi_cr2); in smi_read_sr()
188 return -1; in smi_read_sr()
190 val = readl(&smicntl->smi_sr); in smi_read_sr()
193 writel(ctrlreg1, &smicntl->smi_cr1); in smi_read_sr()
199 * smi_wait_till_ready - Wait till last operation is over.
200 * @bank: bank number shifted.
203 * This routine checks for WIP(write in progress)bit in Status register(SMSR-b0)
204 * The routine checks for #timeout loops, each at interval of 1 milli-second.
207 static int smi_wait_till_ready(int bank, int timeout) in smi_wait_till_ready() argument
215 sr = smi_read_sr(bank); in smi_wait_till_ready()
221 } while (timeout--); in smi_wait_till_ready()
224 return -EIO; in smi_wait_till_ready()
228 * smi_write_enable - Enable the flash to do write operation
229 * @bank: bank number
234 static int smi_write_enable(int bank) in smi_write_enable() argument
242 ctrlreg1 = readl(&smicntl->smi_cr1); in smi_write_enable()
245 writel(readl(&smicntl->smi_cr1) & ~SW_MODE, &smicntl->smi_cr1); in smi_write_enable()
248 writel((bank << BANKSEL_SHIFT) | WE, &smicntl->smi_cr2); in smi_write_enable()
251 return -1; in smi_write_enable()
254 writel(ctrlreg1, &smicntl->smi_cr1); in smi_write_enable()
258 sr = smi_read_sr(bank); in smi_write_enable()
259 if ((sr >= 0) && (sr & (1 << (bank + WM_SHIFT)))) in smi_write_enable()
266 return -1; in smi_write_enable()
270 * smi_init - SMI initialization routine
278 &smicntl->smi_cr1); in smi_init()
282 * smi_sector_erase - Erase flash sector
284 * @sector: sector number
291 int bank; in smi_sector_erase() local
295 switch (info->start[0]) { in smi_sector_erase()
297 bank = BANK0; in smi_sector_erase()
300 bank = BANK1; in smi_sector_erase()
303 bank = BANK2; in smi_sector_erase()
306 bank = BANK3; in smi_sector_erase()
309 return -1; in smi_sector_erase()
312 sect_add = sector * (info->size / info->sector_count); in smi_sector_erase()
315 writel(readl(&smicntl->smi_sr) & ~(ERF1 | ERF2), &smicntl->smi_sr); in smi_sector_erase()
318 if (smi_wait_till_ready(bank, CONFIG_SYS_FLASH_ERASE_TOUT)) in smi_sector_erase()
319 return -EBUSY; in smi_sector_erase()
322 if (smi_write_enable(bank)) in smi_sector_erase()
323 return -EIO; in smi_sector_erase()
326 writel(readl(&smicntl->smi_cr1) | SW_MODE, &smicntl->smi_cr1); in smi_sector_erase()
329 writel(instruction, &smicntl->smi_tr); in smi_sector_erase()
330 writel((bank << BANKSEL_SHIFT) | SEND | TX_LEN_4, in smi_sector_erase()
331 &smicntl->smi_cr2); in smi_sector_erase()
333 return -EIO; in smi_sector_erase()
335 if (smi_wait_till_ready(bank, CONFIG_SYS_FLASH_ERASE_TOUT)) in smi_sector_erase()
336 return -EBUSY; in smi_sector_erase()
339 writel(readl(&smicntl->smi_cr1) & ~SW_MODE, in smi_sector_erase()
340 &smicntl->smi_cr1); in smi_sector_erase()
346 * smi_write - Write to SMI flash
350 * @bank: bank base address
376 return -1; in smi_write()
380 return -EBUSY; in smi_write()
383 writel(readl(&smicntl->smi_cr1) & ~SW_MODE, &smicntl->smi_cr1); in smi_write()
386 return -EIO; in smi_write()
393 return -EBUSY; in smi_write()
396 return -EIO; in smi_write()
412 if ((readl(&smicntl->smi_sr) & (ERF1 | ERF2))) in smi_write()
413 return -EIO; in smi_write()
417 return -EBUSY; in smi_write()
419 writel(readl(&smicntl->smi_sr) & ~(WCF), &smicntl->smi_sr); in smi_write()
425 * write_buff - Write to SMI flash
436 length, info->start[0]); in write_buff()
440 * flash_init - SMI flash initialization
459 flash_info[j].start[i - 1] + in flash_init()
460 flash_info->size / flash_info->sector_count; in flash_init()
468 * flash_print_info - Print SMI flash information
475 if (info->flash_id == FLASH_UNKNOWN) { in flash_print_info()
480 if (info->size >= 0x100000) in flash_print_info()
482 info->size >> 20, info->sector_count); in flash_print_info()
485 info->size >> 10, info->sector_count); in flash_print_info()
488 for (i = 0; i < info->sector_count; ++i) { in flash_print_info()
497 size = (info->size) / (info->sector_count); in flash_print_info()
498 flash = (u32 *) info->start[i]; in flash_print_info()
501 while ((size--) && (*flash++ == ~0)) in flash_print_info()
514 info->start[i], in flash_print_info()
515 erased ? " E" : " ", info->protect[i] ? "RO " : " "); in flash_print_info()
520 info->start[i], info->protect[i] ? " (RO) " : " "); in flash_print_info()
528 * flash_erase - Erase SMI flash
539 puts("- no sectors to erase\n"); in flash_erase()
544 if (info->protect[sect]) in flash_erase()
548 printf("- Warning: %d protected sectors will not be erased!\n", in flash_erase()
555 if (info->protect[sect] == 0) { in flash_erase()