int sata_remove(int devnum) { #ifdef CONFIG_AHCI struct udevice *dev; int rc; rc = uclass_find_device(UCLASS_AHCI, devnum, &dev); if (!rc && !dev) rc = uclass_find_first_device(UCLASS_AHCI, &dev); if (rc || !dev) { printf("Cannot find SATA device %d (err=%d)\n", devnum, rc); return CMD_RET_FAILURE; } rc = device_remove(dev, DM_REMOVE_NORMAL); if (rc) { printf("Cannot remove SATA device '%s' (err=%d)\n", dev->name, rc); return CMD_RET_FAILURE; } return 0; #else return sata_stop(); #endif }
void arch_preboot_os(void) { #if defined(CONFIG_CMD_SATA) sata_stop(); #endif #if defined(CONFIG_VIDEO_IPUV3) /* disable video before launching O/S */ ipuv3_fb_shutdown(); #endif }
void arch_preboot_os(void) { #if defined(CONFIG_CMD_SATA) sata_stop(); #if defined(CONFIG_MX6) disable_sata_clock(); #endif #endif #if defined(CONFIG_VIDEO_IPUV3) /* disable video before launching O/S */ ipuv3_fb_shutdown(); #endif #if defined(CONFIG_VIDEO_MXS) lcdif_power_down(); #endif }
static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int rc = 0; if (argc == 2 && strcmp(argv[1], "stop") == 0) return sata_stop(); if (argc == 2 && strcmp(argv[1], "init") == 0) { if (dev_curr != -1) sata_stop(); return dev_initialize(); // return sata_initialize(); } /* If the user has not yet run `sata init`, do it now */ if (dev_curr == -1) if (dev_initialize()) return 1; switch (argc) { case 0: case 1: return CMD_RET_USAGE; case 2: if (strncmp(argv[1],"inf", 3) == 0) { int i; puts('\n'); for (i = 0; i < CONFIG_SYS_MAX_DEVICE; ++i) { if (dev_desc[i].type == DEV_TYPE_UNKNOWN) continue; printf ("SATA device %d: ", i); dev_print(&dev_desc[i]); } return 0; } else if (strncmp(argv[1],"dev", 3) == 0) { if ((dev_curr < 0) || (dev_curr >= CONFIG_SYS_MAX_DEVICE)) { puts("\nno SATA devices available\n"); return 1; } printf("\nSATA device %d: ", dev_curr); dev_print(&dev_desc[dev_curr]); return 0; } else if (strncmp(argv[1],"part",4) == 0) { int dev, ok; for (ok = 0, dev = 0; dev < CONFIG_SYS_MAX_DEVICE; ++dev) { if (dev_desc[dev].part_type != PART_TYPE_UNKNOWN) { ++ok; if (dev) puts ('\n'); print_part(&dev_desc[dev]); } } if (!ok) { puts("\nno SATA devices available\n"); rc ++; } return rc; } return CMD_RET_USAGE; case 3: if (strncmp(argv[1], "dev", 3) == 0) { int dev = (int)strtoul(argv[2], NULL, 10); printf("\nSATA device %d: ", dev); if (dev >= CONFIG_SYS_MAX_DEVICE) { puts ("unknown device\n"); return 1; } dev_print(&dev_desc[dev]); if (dev_desc[dev].type == DEV_TYPE_UNKNOWN) return 1; dev_curr = dev; puts("... is now current device\n"); return 0; } else if (strncmp(argv[1], "part", 4) == 0) { int dev = (int)strtoul(argv[2], NULL, 10); if (dev_desc[dev].part_type != PART_TYPE_UNKNOWN) { print_part(&dev_desc[dev]); } else { printf("\nSATA device %d not available\n", dev); rc = 1; } return rc; } return CMD_RET_USAGE; default: /* at least 4 args */ if (strcmp(argv[1], "read") == 0) { ulong addr = strtoull(argv[2], NULL, 16); ulong cnt = strtoull(argv[4], NULL, 16); ulong n; lbaint_t blk = strtoull(argv[3], NULL, 16); printf("\nSATA read: device %d block # %ld, count %ld ... ", dev_curr, blk, cnt); // n = sata_read(dev_curr, blk, cnt, (uint32_t *)addr); /* flush cache after read */ // flush_cache(addr, cnt * dev_desc[dev_curr].blksz); printf("%ld blocks read: %s\n", n, (n==cnt) ? "OK" : "ERROR"); return (n == cnt) ? 0 : 1; } else if (strcmp(argv[1], "write") == 0) { ulong addr = strtoull(argv[2], NULL, 16); ulong cnt = strtoull(argv[4], NULL, 16); ulong n; lbaint_t blk = strtoull(argv[3], NULL, 16); printf("\nSATA write: device %d block # %ld, count %ld ... ", dev_curr, blk, cnt); n = dev_bwrite(dev_curr, blk, cnt, (uint32_t *)addr); printf("%ld blocks written: %s\n", n, (n == cnt) ? "OK" : "ERROR"); return (n == cnt) ? 0 : 1; } else { return CMD_RET_USAGE; } return rc; } }