/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * Smart battery driver for BQ20Z453.
 */

#include "battery_smart.h"
#include "host_command.h"

#define PARAM_CUT_OFF 0x0010

int battery_command_cut_off(struct host_cmd_handler_args *args)
{
	/*
	 * TODO: Since this is a host command, the i2c bus is claimed by host.
	 *       Thus, we would send back the response in advanced so that
	 *       the host can release the bus and then EC can send command to
	 *       battery.
	 *
	 *       Refactoring this via task is a way. However, it is wasteful.
	 *       Need a light-weight solution.
	 */
	args->result = EC_RES_SUCCESS;
	host_send_response(args);

	/* This function would try to claim i2c and then send to battery. */
	sb_write(SB_MANUFACTURER_ACCESS, PARAM_CUT_OFF);

	return EC_RES_SUCCESS;
	/*
	 * Not sure if there is a side-effect since this could send result
	 * back to host TWICE.
	 */
}
DECLARE_HOST_COMMAND(EC_CMD_BATTERY_CUT_OFF, battery_command_cut_off,
		     EC_VER_MASK(0));

/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * Smart battery driver for BQ20Z453.
 */

#include "battery_smart.h"
#include "hooks.h"
#include "host_command.h"

#define PARAM_CUT_OFF 0x0010

static void cutoff(void)
{
	/* Claim i2c and send cutoff command to battery. */
	sb_write(SB_MANUFACTURER_ACCESS, PARAM_CUT_OFF);
}
DECLARE_DEFERRED(cutoff);

int battery_command_cut_off(struct host_cmd_handler_args *args)
{
	/*
	 * Queue battery cutoff.  This must be deferred so we can send the
	 * response to the host first.  Some platforms (snow) share an I2C bus
	 * between the EC, AP, and battery, so we need the host to complete the
	 * transaction and release the I2C bus before we'll be abl eto send the
	 * cutoff command.
	 */
	hook_call_deferred(cutoff, 1000);

	return EC_RES_SUCCESS;
}
DECLARE_HOST_COMMAND(EC_CMD_BATTERY_CUT_OFF, battery_command_cut_off,
		     EC_VER_MASK(0));

Fix battery cutoff command to use deferred function call
pit: Fix battery cutoff command to use deferred function call

Rather than hackily sending a host response before sending the battery
cutoff command, just put the cutoff command in a deferred function
call and respond normally to the host command.

BUG=chrome-os-partner:23568
BRANCH=none
TEST=On battery power, 'ectool batterycutoff' prints success, then the
     system loses power due to battery cutoff.

Change-Id: Ic42d08ef94a10f89d093290cda63da01fca985a5
Signed-off-by: Randall Spangler <62698fdbb84d1779579ee80c3f39fac22017e5bc@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/174573
Reviewed-by: Bill Richardson <129945214b1d548d8e49b6c29c43094f8c78057f@chromium.org>
