summaryrefslogtreecommitdiff
path: root/driver/battery/smart.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/battery/smart.c')
-rw-r--r--driver/battery/smart.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/driver/battery/smart.c b/driver/battery/smart.c
index 1f9512ce71..539580d201 100644
--- a/driver/battery/smart.c
+++ b/driver/battery/smart.c
@@ -50,6 +50,13 @@ test_mockable int sb_read(int cmd, int *param)
#ifdef CONFIG_BATTERY_CUT_OFF
/*
+ * Ship mode command need to set continuously, can't be interfered
+ * by another command.
+ */
+ if (battery_cutoff_in_progress())
+ return EC_ERROR_ACCESS_DENIED;
+
+ /*
* Some batteries would wake up after cut-off if we talk to it.
*/
if (battery_is_cut_off())
@@ -84,6 +91,13 @@ int sb_read_string(int offset, uint8_t *data, int len)
#ifdef CONFIG_BATTERY_CUT_OFF
/*
+ * Ship mode command need to set continuously, can't be interfered
+ * by another command.
+ */
+ if (battery_cutoff_in_progress())
+ return EC_ERROR_ACCESS_DENIED;
+
+ /*
* Some batteries would wake up after cut-off if we talk to it.
*/
if (battery_is_cut_off())
@@ -102,6 +116,13 @@ int sb_read_sized_block(int offset, uint8_t *data, int len)
if (IS_ENABLED(CONFIG_BATTERY_CUT_OFF)) {
/*
+ * Ship mode command need to set continuously, can't be
+ * interfered by another command.
+ */
+ if (battery_cutoff_in_progress())
+ return EC_ERROR_ACCESS_DENIED;
+
+ /*
* Some batteries would wake up after cut-off if we talk to it.
*/
if (battery_is_cut_off())
@@ -669,7 +690,10 @@ host_command_sb_read_word(struct host_cmd_handler_args *args)
return EC_RES_INVALID_PARAM;
rv = sb_read(p->reg, &val);
if (rv)
- return EC_RES_ERROR;
+ if (rv == EC_ERROR_ACCESS_DENIED)
+ return EC_RES_ACCESS_DENIED;
+ else
+ return EC_RES_ERROR;
r->value = val;
args->response_size = sizeof(struct ec_response_sb_rd_word);
@@ -689,7 +713,10 @@ host_command_sb_write_word(struct host_cmd_handler_args *args)
return EC_RES_INVALID_PARAM;
rv = sb_write(p->reg, p->value);
if (rv)
- return EC_RES_ERROR;
+ if (rv == EC_ERROR_ACCESS_DENIED)
+ return EC_RES_ACCESS_DENIED;
+ else
+ return EC_RES_ERROR;
return EC_RES_SUCCESS;
}
@@ -708,7 +735,10 @@ host_command_sb_read_block(struct host_cmd_handler_args *args)
return EC_RES_INVALID_PARAM;
rv = sb_read_string(p->reg, r->data, 32);
if (rv)
- return EC_RES_ERROR;
+ if (rv == EC_ERROR_ACCESS_DENIED)
+ return EC_RES_ACCESS_DENIED;
+ else
+ return EC_RES_ERROR;
args->response_size = sizeof(struct ec_response_sb_rd_block);