[PATCH v2 04/11] rockchip: idb: add info and stop command

Add info and stop command to become aware of what goes on inside the driver and to release some resources.
Signed-off-by: Johan Jonker jbx6244@gmail.com ---
optional --- arch/arm/mach-rockchip/rockchip_idb.c | 116 ++++++++++++++++++++++++++ 1 file changed, 116 insertions(+)
diff --git a/arch/arm/mach-rockchip/rockchip_idb.c b/arch/arm/mach-rockchip/rockchip_idb.c index 832b3251..0692ce1a 100644 --- a/arch/arm/mach-rockchip/rockchip_idb.c +++ b/arch/arm/mach-rockchip/rockchip_idb.c @@ -1456,10 +1456,124 @@ int rk_idb_start(void)
#if !defined(CONFIG_SPL_BUILD)
+int rk_idb_stop(void) +{ + struct udevice *bdev; + int ret; + + ret = blk_find_device(IF_TYPE_RK_IDB, 0, &bdev); + if (ret) { + printf("no IDB blk device found\n"); + return 0; + } + + device_remove(bdev, DM_REMOVE_NORMAL); + device_unbind(bdev); + + return 0; +} + +void rk_idb_print_idb_data(u32 *data) +{ + struct sector0 *sec0 = (struct sector0 *)data; + + printf("\n"); + + printf("magic : %08x\n" + "rc4_flag : %08x\n" + "boot_code1_offset: %d\n" + "flash_data_size : %d\n" + "flash_boot_size : %d\n", + sec0->magic, + sec0->rc4_flag, + sec0->boot_code1_offset, + sec0->flash_data_size, + sec0->flash_boot_size); + + printf("\n"); +} + +static int rk_idb_info(void) +{ + struct rk_idb *plat; + struct udevice *dev; + u32 data[512]; + u32 spare[2]; + int ret; + int i, j; + + ret = uclass_find_device(UCLASS_RK_IDB, 0, &dev); + if (ret) { + printf("no IDB device found\n"); + return CMD_RET_FAILURE; + } + + if (!device_active(dev)) { + printf("IDB device present but not probed\n"); + return CMD_RET_FAILURE; + } + + plat = dev_get_plat(dev); + + printf("\n##### HARDWARE #####\n"); + + printf("REG : 0x%08x\n", (u32)plat->regs); + + printf("FLASH ID : %02x %02x %02x %02x %02x %02x\n", + plat->info->nand_id[0], + plat->info->nand_id[1], + plat->info->nand_id[2], + plat->info->nand_id[3], + plat->info->nand_id[4], + plat->info->nand_id[5]); + + printf("page_per_blk : %d\n", plat->info->page_per_blk); + printf("lsb_mode : %d\n", plat->info->lsb_mode); + printf("randomizer : %d\n", (plat->info->operation_opt >> 7) & 1); + + printf("\n##### BLOCK DEVICE #####\n"); + + ret = blk_find_device(IF_TYPE_RK_IDB, 0, &dev); + if (ret) { + printf("no IDB blk device found\n"); + } else { + struct blk_desc *blk_dev = dev_get_uclass_plat(dev); + + printf("blocks : %lu\n", (unsigned long)blk_dev->lba); + } + + printf("uuid_part_str : %s\n", plat->uuid_part_str); + printf("uuid_disk_str : %s\n", plat->uuid_disk_str); + + printf("\n##### IDB #####\n"); + for (i = 0; i < plat->blk_counter; i++) { + rk_idb_read_block(plat, j, 4, data, spare); + + for (j = 0; j < 4; j++) { + if (j != 1) + rk_idb_rc4((char *)data + j * 512, 512); + } + + printf("\nblk : %d\n", plat->idblock[i].blk); + printf("ecc : %d\n", plat->idblock[i].ecc); + printf("sectors : %d\n", plat->idblock[i].sectors); + + rk_idb_print_idb_data(data); + } + + return 0; +} + static int rk_idb_do(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { if (argc == 2) { + if (!strcmp(argv[1], "info")) + return rk_idb_info(); + + if (!strcmp(argv[1], "stop")) + return rk_idb_stop(); + if (!strcmp(argv[1], "start")) return rk_idb_start(); } @@ -1471,6 +1585,8 @@ U_BOOT_CMD( idb, 5, 1, rk_idb_do, "Rockchip IDB block device", "start - start IDB device\n" + "idb stop - stop IDB blk device\n" + "idb info - show IDB device info\n" );
#endif
participants (1)
-
Johan Jonker