cros_ec: Support the LDO access method used by spring
Add a driver to support the special LDO access used by spring. This is a custom method in the cros_ec protocol - it does not use an I2C pass-through. There are two implementation choices: 1. Write a special LDO driver which can talk across the EC. Duplicate all the logic from TPS65090 for retrying when the LDO fails to come up. 2. Write a special I2C bus driver which pretends to be a TPS65090 and transfers reads and writes using the LDO message. Either is distasteful. The latter method is chosen since it results in less code duplication and a fairly simple (30-line) implementation of the core logic. The crosec 'ldo' subcommand could be removed (since i2c md/mw will work instead) but is retained as a convenience. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -931,31 +931,32 @@ int cros_ec_write_vbnvcontext(struct cros_ec_dev *dev, const uint8_t *block)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cros_ec_set_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t state)
|
||||
int cros_ec_set_ldo(struct udevice *dev, uint8_t index, uint8_t state)
|
||||
{
|
||||
struct cros_ec_dev *cdev = dev_get_uclass_priv(dev);
|
||||
struct ec_params_ldo_set params;
|
||||
|
||||
params.index = index;
|
||||
params.state = state;
|
||||
|
||||
if (ec_command_inptr(dev, EC_CMD_LDO_SET, 0,
|
||||
¶ms, sizeof(params),
|
||||
NULL, 0))
|
||||
if (ec_command_inptr(cdev, EC_CMD_LDO_SET, 0, ¶ms, sizeof(params),
|
||||
NULL, 0))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cros_ec_get_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t *state)
|
||||
int cros_ec_get_ldo(struct udevice *dev, uint8_t index, uint8_t *state)
|
||||
{
|
||||
struct cros_ec_dev *cdev = dev_get_uclass_priv(dev);
|
||||
struct ec_params_ldo_get params;
|
||||
struct ec_response_ldo_get *resp;
|
||||
|
||||
params.index = index;
|
||||
|
||||
if (ec_command_inptr(dev, EC_CMD_LDO_GET, 0,
|
||||
¶ms, sizeof(params),
|
||||
(uint8_t **)&resp, sizeof(*resp)) != sizeof(*resp))
|
||||
if (ec_command_inptr(cdev, EC_CMD_LDO_GET, 0, ¶ms, sizeof(params),
|
||||
(uint8_t **)&resp, sizeof(*resp)) !=
|
||||
sizeof(*resp))
|
||||
return -1;
|
||||
|
||||
*state = resp->state;
|
||||
@@ -1681,9 +1682,9 @@ static int do_cros_ec(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
state = simple_strtoul(argv[3], &endp, 10);
|
||||
if (*argv[3] == 0 || *endp != 0)
|
||||
return CMD_RET_USAGE;
|
||||
ret = cros_ec_set_ldo(dev, index, state);
|
||||
ret = cros_ec_set_ldo(udev, index, state);
|
||||
} else {
|
||||
ret = cros_ec_get_ldo(dev, index, &state);
|
||||
ret = cros_ec_get_ldo(udev, index, &state);
|
||||
if (!ret) {
|
||||
printf("LDO%d: %s\n", index,
|
||||
state == EC_LDO_STATE_ON ?
|
||||
|
||||
Reference in New Issue
Block a user