diff options
Diffstat (limited to 'zephyr/emul/emul_isl923x.c')
-rw-r--r-- | zephyr/emul/emul_isl923x.c | 115 |
1 files changed, 58 insertions, 57 deletions
diff --git a/zephyr/emul/emul_isl923x.c b/zephyr/emul/emul_isl923x.c index 9896804f7f..1ecb9e79f9 100644 --- a/zephyr/emul/emul_isl923x.c +++ b/zephyr/emul/emul_isl923x.c @@ -1,4 +1,4 @@ -/* Copyright 2021 The Chromium OS Authors. All rights reserved. +/* Copyright 2021 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ @@ -11,7 +11,7 @@ #include <zephyr/drivers/emul.h> #include <errno.h> #include <zephyr/sys/__assert.h> -#include <ztest.h> +#include <zephyr/ztest.h> #include "driver/charger/isl923x.h" #include "driver/charger/isl923x_public.h" @@ -19,14 +19,11 @@ #include "emul/emul_isl923x.h" #include "emul/emul_smart_battery.h" #include "i2c.h" +#include "emul/emul_stub_device.h" #include <zephyr/logging/log.h> LOG_MODULE_REGISTER(isl923x_emul, CONFIG_ISL923X_EMUL_LOG_LEVEL); -#define ISL923X_DATA_FROM_I2C_EMUL(_emul) \ - CONTAINER_OF(CONTAINER_OF(_emul, struct i2c_common_emul_data, emul), \ - struct isl923x_emul_data, common) - /** Mask used for the charge current register */ #define REG_CHG_CURRENT_MASK GENMASK(12, 2) @@ -71,7 +68,7 @@ LOG_MODULE_REGISTER(isl923x_emul, CONFIG_ISL923X_EMUL_LOG_LEVEL); #define DEFAULT_R_SNS 10 #define R_SNS CONFIG_CHARGER_SENSE_RESISTOR -#define REG_TO_CURRENT(REG) ((REG) * DEFAULT_R_SNS / R_SNS) +#define REG_TO_CURRENT(REG) ((REG)*DEFAULT_R_SNS / R_SNS) struct isl923x_emul_data { /** Common I2C data */ @@ -113,7 +110,7 @@ struct isl923x_emul_data { /** Emulated input voltage register */ uint16_t input_voltage_reg; /** Pointer to battery emulator. */ - int battery_ord; + const struct emul *battery_emul; }; struct isl923x_emul_cfg { @@ -128,11 +125,10 @@ const struct device *isl923x_emul_get_parent(const struct emul *emulator) return data->common.i2c; } -struct i2c_emul *isl923x_emul_get_i2c_emul(const struct emul *emulator) +const struct i2c_common_emul_cfg * +isl923x_emul_get_cfg(const struct emul *emulator) { - struct isl923x_emul_data *data = emulator->data; - - return &(data->common.emul); + return emulator->cfg; } static void isl923x_emul_reset(struct isl923x_emul_data *data) @@ -145,11 +141,11 @@ void isl923x_emul_reset_registers(const struct emul *emulator) { struct isl923x_emul_data *data = emulator->data; struct i2c_common_emul_data common_backup = data->common; - int battery_ord = data->battery_ord; + const struct emul *battery_emul = data->battery_emul; memset(data, 0, sizeof(struct isl923x_emul_data)); data->common = common_backup; - data->battery_ord = battery_ord; + data->battery_emul = battery_emul; } void isl923x_emul_set_manufacturer_id(const struct emul *emulator, @@ -160,8 +156,7 @@ void isl923x_emul_set_manufacturer_id(const struct emul *emulator, data->manufacturer_id_reg = manufacturer_id; } -void isl923x_emul_set_device_id(const struct emul *emulator, - uint16_t device_id) +void isl923x_emul_set_device_id(const struct emul *emulator, uint16_t device_id) { struct isl923x_emul_data *data = emulator->data; @@ -215,10 +210,10 @@ void raa489000_emul_set_acok_pin(const struct emul *emulator, uint16_t value) break; \ } while (0) -static int isl923x_emul_read_byte(struct i2c_emul *emul, int reg, uint8_t *val, - int bytes) +static int isl923x_emul_read_byte(const struct emul *emul, int reg, + uint8_t *val, int bytes) { - struct isl923x_emul_data *data = ISL923X_DATA_FROM_I2C_EMUL(emul); + struct isl923x_emul_data *data = emul->data; switch (reg) { case ISL923X_REG_CHG_CURRENT: @@ -283,12 +278,12 @@ static int isl923x_emul_read_byte(struct i2c_emul *emul, int reg, uint8_t *val, return 0; } -uint16_t isl923x_emul_peek_reg(struct i2c_emul *i2c_emul, int reg) +uint16_t isl923x_emul_peek_reg(const struct emul *emul, int reg) { uint8_t bytes[2]; - isl923x_emul_read_byte(i2c_emul, reg, &bytes[0], 0); - isl923x_emul_read_byte(i2c_emul, reg, &bytes[1], 1); + isl923x_emul_read_byte(emul, reg, &bytes[0], 0); + isl923x_emul_read_byte(emul, reg, &bytes[1], 1); return bytes[1] << 8 | bytes[0]; } @@ -303,10 +298,10 @@ uint16_t isl923x_emul_peek_reg(struct i2c_emul *i2c_emul, int reg) (REG) |= ((VAL) << 8) & (MASK); \ } while (0) -static int isl923x_emul_write_byte(struct i2c_emul *emul, int reg, uint8_t val, - int bytes) +static int isl923x_emul_write_byte(const struct emul *emul, int reg, + uint8_t val, int bytes) { - struct isl923x_emul_data *data = ISL923X_DATA_FROM_I2C_EMUL(emul); + struct isl923x_emul_data *data = emul->data; switch (reg) { case ISL923X_REG_CHG_CURRENT: @@ -366,38 +361,42 @@ static int isl923x_emul_write_byte(struct i2c_emul *emul, int reg, uint8_t val, break; case ISL9238_REG_INPUT_VOLTAGE: WRITE_REG_16(data->input_voltage_reg, bytes, val, - REG_INPUT_VOLTAGE_MASK); + REG_INPUT_VOLTAGE_MASK); break; default: __ASSERT(false, "Attempt to write unimplemented reg 0x%02x", reg); return -EINVAL; } + return 0; } -static int isl923x_emul_finish_write(struct i2c_emul *emul, int reg, int bytes) +static int isl923x_emul_finish_write(const struct emul *emul, int reg, + int bytes) { - struct isl923x_emul_data *data = ISL923X_DATA_FROM_I2C_EMUL(emul); - struct i2c_emul *battery_i2c_emul; + struct isl923x_emul_data *data = emul->data; struct sbat_emul_bat_data *bat; int16_t current; + /* This write only selected register for I2C read message */ + if (bytes < 2) { + return 0; + } + switch (reg) { case ISL923X_REG_CHG_CURRENT: /* Write current to battery. */ - if (data->battery_ord >= 0) { - battery_i2c_emul = sbat_emul_get_ptr(data->battery_ord); - if (battery_i2c_emul != NULL) { - bat = sbat_emul_get_bat_data(battery_i2c_emul); - if (bat != NULL) { - current = REG_TO_CURRENT( - data->current_limit_reg); - if (current > 0) - bat->cur = current; - else - bat->cur = -5; - } + if (data->battery_emul != NULL) { + /* We only have a single battery */ + bat = sbat_emul_get_bat_data(data->battery_emul); + if (bat != NULL) { + current = + REG_TO_CURRENT(data->current_limit_reg); + if (current > 0) + bat->cur = current; + else + bat->cur = -5; } } break; @@ -408,40 +407,34 @@ static int isl923x_emul_finish_write(struct i2c_emul *emul, int reg, int bytes) static int emul_isl923x_init(const struct emul *emul, const struct device *parent) { - const struct isl923x_emul_cfg *cfg = emul->cfg; struct isl923x_emul_data *data = emul->data; - data->common.emul.api = &i2c_common_emul_api; - data->common.emul.addr = cfg->common.addr; - data->common.emul.parent = emul; data->common.i2c = parent; - data->common.cfg = &cfg->common; i2c_common_emul_init(&data->common); - return i2c_emul_register(parent, emul->dev_label, &data->common.emul); + return 0; } -#define INIT_ISL923X(n) \ +#define INIT_ISL923X(n) \ static struct isl923x_emul_data isl923x_emul_data_##n = { \ .common = { \ .write_byte = isl923x_emul_write_byte, \ .read_byte = isl923x_emul_read_byte, \ .finish_write = isl923x_emul_finish_write, \ }, \ - .battery_ord = COND_CODE_1( \ + .battery_emul = COND_CODE_1( \ DT_INST_NODE_HAS_PROP(n, battery), \ - (DT_DEP_ORD(DT_INST_PROP(n, battery))), \ - (-1)), \ - }; \ + (EMUL_DT_GET(DT_INST_PROP(n, battery))), \ + (NULL)), \ + }; \ static struct isl923x_emul_cfg isl923x_emul_cfg_##n = { \ .common = { \ - .i2c_label = DT_INST_BUS_LABEL(n), \ - .dev_label = DT_INST_LABEL(n), \ + .dev_label = DT_NODE_FULL_NAME(DT_DRV_INST(n)), \ .addr = DT_INST_REG_ADDR(n), \ }, \ - }; \ - EMUL_DEFINE(emul_isl923x_init, DT_DRV_INST(n), &isl923x_emul_cfg_##n, \ - &isl923x_emul_data_##n) + }; \ + EMUL_DT_INST_DEFINE(n, emul_isl923x_init, &isl923x_emul_data_##n, \ + &isl923x_emul_cfg_##n, &i2c_common_emul_api) DT_INST_FOREACH_STATUS_OKAY(INIT_ISL923X) @@ -460,3 +453,11 @@ static void emul_isl923x_reset_before(const struct ztest_unit_test *test, } ZTEST_RULE(emul_isl923x_reset, emul_isl923x_reset_before, NULL); #endif /* CONFIG_ZTEST_NEW_API */ + +DT_INST_FOREACH_STATUS_OKAY(EMUL_STUB_DEVICE); + +struct i2c_common_emul_data * +emul_isl923x_get_i2c_common_data(const struct emul *emul) +{ + return emul->data; +} |