summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Kiryanov <nikita@compulab.co.il>2014-11-21 12:47:24 +0200
committerStefano Babic <sbabic@denx.de>2014-11-24 12:00:00 +0100
commitd957c28a7eb0e5a28e9541a64ab3536831d63ec5 (patch)
treebd855ddf27f74c7f17c1193793649fb6eef0dc99
parent10ee8ecafbb4405ac77f6df081325630617aa7cd (diff)
cmd_sata: implement sata stop command
Implement sata stop command. This introduces the __sata_stop() weak function, which mirrors the weak __sata_initialize() function, giving users the option of undoing the custom steps performed in overrides of sata_initialize(). Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il> Cc: Marek Vasut <marex@denx.de> Cc: Tom Rini <trini@ti.com>
-rw-r--r--common/cmd_sata.c24
-rw-r--r--include/sata.h2
2 files changed, 25 insertions, 1 deletions
diff --git a/common/cmd_sata.c b/common/cmd_sata.c
index fc92131966..51f67033ae 100644
--- a/common/cmd_sata.c
+++ b/common/cmd_sata.c
@@ -48,6 +48,20 @@ int __sata_initialize(void)
}
int sata_initialize(void) __attribute__((weak,alias("__sata_initialize")));
+__weak int __sata_stop(void)
+{
+ int i, err = 0;
+
+ for (i = 0; i < CONFIG_SYS_SATA_MAX_DEVICE; i++)
+ err |= reset_sata(i);
+
+ if (err)
+ printf("Could not reset some SATA devices\n");
+
+ return err;
+}
+int sata_stop(void) __attribute__((weak, alias("__sata_stop")));
+
#ifdef CONFIG_PARTITIONS
block_dev_desc_t *sata_get_dev(int dev)
{
@@ -59,8 +73,15 @@ static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int rc = 0;
- if (argc == 2 && strcmp(argv[1], "init") == 0)
+ if (argc == 2 && strcmp(argv[1], "stop") == 0)
+ return sata_stop();
+
+ if (argc == 2 && strcmp(argv[1], "init") == 0) {
+ if (sata_curr_device != -1)
+ sata_stop();
+
return sata_initialize();
+ }
/* If the user has not yet run `sata init`, do it now */
if (sata_curr_device == -1)
@@ -185,6 +206,7 @@ U_BOOT_CMD(
sata, 5, 1, do_sata,
"SATA sub system",
"init - init SATA sub system\n"
+ "sata stop - disable SATA sub system\n"
"sata info - show available SATA devices\n"
"sata device [dev] - show or set current device\n"
"sata part [dev] - print partition table\n"
diff --git a/include/sata.h b/include/sata.h
index c2bbe1a993..fa61da8ddd 100644
--- a/include/sata.h
+++ b/include/sata.h
@@ -10,6 +10,8 @@ ulong sata_write(int dev, ulong blknr, lbaint_t blkcnt, const void *buffer);
int sata_initialize(void);
int __sata_initialize(void);
+int sata_stop(void);
+int __sata_stop(void);
int sata_port_status(int dev, int port);
extern block_dev_desc_t sata_dev_desc[];