Lines Matching +full:smi +full:- +full:common
5 * SPDX-License-Identifier: GPL-2.0+
8 #include <common.h>
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
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.
134 * Detect the SMI flash by reading the ID. Initializes the flash_info structure
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
178 ctrlreg1 = readl(&smicntl->smi_cr1); in smi_read_sr()
180 /* Program SMI in HW Mode */ 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.
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.
221 } while (timeout--); in smi_wait_till_ready()
223 printf("SMI controller is still in wait, timeout=%d\n", 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
242 ctrlreg1 = readl(&smicntl->smi_cr1); in smi_write_enable()
244 /* Program SMI in H/W Mode */ 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()
266 return -1; in smi_write_enable()
270 * smi_init - SMI initialization routine
272 * SMI initialization routine. Sets SMI control register1.
276 /* Setting the fast mode values. SMI working at 166/4 = 41.5 MHz */ in smi_init()
278 &smicntl->smi_cr1); in smi_init()
282 * smi_sector_erase - Erase flash sector
295 switch (info->start[0]) { 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()
319 return -EBUSY; in smi_sector_erase()
323 return -EIO; in smi_sector_erase()
325 /* Put SMI in SW mode */ 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()
331 &smicntl->smi_cr2); in smi_sector_erase()
333 return -EIO; in smi_sector_erase()
336 return -EBUSY; in smi_sector_erase()
338 /* Put SMI in HW mode */ 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
352 * Write to SMI flash
376 return -1; in smi_write()
380 return -EBUSY; in smi_write()
382 /* Set SMI in Hardware Mode */ 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
431 * Write to SMI flash
436 length, info->start[0]); in write_buff()
440 * flash_init - SMI flash initialization
442 * 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
470 * 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
530 * 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()