diff options
author | Nicolas Royer <nroyer@baylibre.com> | 2020-09-27 17:38:46 +0200 |
---|---|---|
committer | nicola-mazzucato-arm <42373140+nicola-mazzucato-arm@users.noreply.github.com> | 2020-10-15 17:45:38 +0100 |
commit | 0e88b081024ac6b9dc1ef0560521d77ac5d6bec3 (patch) | |
tree | e5d1e4c5e7b0af9e7df3d6bf96d7cbb040773191 | |
parent | 482732a38c153d98d4fd2360fefcae99e745e2f1 (diff) |
rcar/module: add rcar mock_pmic module and config data
Change-Id: I5c9e5c41af22725d70bf57fd84b83138b07d61f7
Signed-off-by: Tsutomu Muroya <tsutomu.muroya.jy@bp.renesas.com>
Signed-off-by: Nicolas Royer <nroyer@baylibre.com>
8 files changed, 383 insertions, 0 deletions
diff --git a/product/rcar/module/rcar_mock_pmic/include/mod_rcar_mock_pmic.h b/product/rcar/module/rcar_mock_pmic/include/mod_rcar_mock_pmic.h new file mode 100644 index 00000000..62ef4881 --- /dev/null +++ b/product/rcar/module/rcar_mock_pmic/include/mod_rcar_mock_pmic.h @@ -0,0 +1,71 @@ +/* + * Renesas SCP/MCP Software + * Copyright (c) 2020, Renesas Electronics Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MOD_RCAR_MOCK_PMIC_H +#define MOD_RCAR_MOCK_PMIC_H + +#include <fwk_module_idx.h> + +#include <stdbool.h> +#include <stdint.h> + +/*! + * \ingroup GroupRCARModule + * \defgroup GroupRCARMockPmic Mock Power Supply Driver + * \{ + */ + +/*! + * \defgroup GroupRCARMockPmicConfig Configuration + * \{ + */ + +/*! + * \brief Element configuration. + */ +struct mod_rcar_mock_pmic_device_config { + /*! Default state of the mock device's supply (enabled or disabled) */ + bool default_enabled; + + /*! Default voltage, in millivolts (mV), of the device's supply */ + uint64_t default_voltage; +}; + +/*! + * \} + */ + +/*! + * \defgroup GroupRCARMockPmicIds Identifiers + * \{ + */ + +/*! + * \brief API indices. + */ +enum mod_rcar_mock_pmic_api_idx { + /*! API index for PSU driver API */ + MOD_RCAR_MOCK_PMIC_API_IDX_PSU_DRIVER, + + /*! Number of defined APIs */ + MOD_RCAR_MOCK_PMIC_API_COUNT +}; + +/*! Driver API identifier */ +static const fwk_id_t mod_rcar_mock_pmic_api_id_psu_driver = FWK_ID_API_INIT( + FWK_MODULE_IDX_RCAR_MOCK_PMIC, + MOD_RCAR_MOCK_PMIC_API_IDX_PSU_DRIVER); + +/*! + * \} + */ + +/*! + * \} + */ + +#endif /* MOD_RCAR_MOCK_PMIC_H */ diff --git a/product/rcar/module/rcar_mock_pmic/src/Makefile b/product/rcar/module/rcar_mock_pmic/src/Makefile new file mode 100644 index 00000000..36e5b9ff --- /dev/null +++ b/product/rcar/module/rcar_mock_pmic/src/Makefile @@ -0,0 +1,13 @@ +# +# Renesas SCP/MCP Software +# Copyright (c) 2020, Renesas Electronics Corporation. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +BS_LIB_NAME := rcar_mock_pmic +BS_LIB_SOURCES := \ + mod_rcar_mock_pmic_module.c \ + mod_rcar_mock_pmic_driver_api.c + +include $(BS_DIR)/lib.mk diff --git a/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_driver_api.c b/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_driver_api.c new file mode 100644 index 00000000..e95909e5 --- /dev/null +++ b/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_driver_api.c @@ -0,0 +1,89 @@ +/* + * Renesas SCP/MCP Software + * Copyright (c) 2020, Renesas Electronics Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <mod_rcar_mock_pmic_private.h> + +#include <fwk_id.h> + +#include <stdbool.h> +#include <stddef.h> +#include <stdint.h> + +static int api_set_enabled(fwk_id_t device_id, bool enable) +{ + struct mod_rcar_mock_pmic_device_ctx *ctx; + + ctx = __mod_rcar_mock_pmic_get_valid_device_ctx(device_id); + if (ctx == NULL) + return FWK_E_PARAM; + + ctx->enabled = enable; + + return FWK_SUCCESS; +} + +static int api_get_enabled(fwk_id_t device_id, bool *enabled) +{ + struct mod_rcar_mock_pmic_device_ctx *ctx; + + ctx = __mod_rcar_mock_pmic_get_valid_device_ctx(device_id); + if (ctx == NULL) + return FWK_E_PARAM; + + *enabled = ctx->enabled; + + return FWK_SUCCESS; +} + +static int api_set_voltage(fwk_id_t device_id, uint64_t voltage) +{ + struct mod_rcar_mock_pmic_device_ctx *ctx; + uint8_t val; + + ctx = __mod_rcar_mock_pmic_get_valid_device_ctx(device_id); + if (ctx == NULL) { + return FWK_E_PARAM; + } + + if (voltage < BD9571MWV_MIN_MV * 1000 || voltage > BD9571MWV_MAX_MV * 1000) + return -1; + + val = DIV_ROUND(voltage, BD9571MWV_STEP_MV * 1000); + val &= REG_DATA_DVFS_SetVID_MASK; + +#if 0 + int ret; + /* Not supported because I2C used in kernel */ + ret = rcar_iic_dvfs_send(SLAVE_ADDR_PMIC, REG_ADDR_DVFS_SetVID, val); + if (ret) { + return ret; + } +#endif + + ctx->voltage = voltage; + return FWK_SUCCESS; +} + +static int api_get_voltage(fwk_id_t device_id, uint64_t *voltage) +{ + struct mod_rcar_mock_pmic_device_ctx *ctx; + + ctx = __mod_rcar_mock_pmic_get_valid_device_ctx(device_id); + if (ctx == NULL) + return FWK_E_PARAM; + + *voltage = ctx->voltage; + + return FWK_SUCCESS; +} + +const struct mod_rcar_pmic_driver_api __mod_rcar_mock_pmic_driver_api = { + .set_enabled = api_set_enabled, + .get_enabled = api_get_enabled, + .set_voltage = api_set_voltage, + .get_voltage = api_get_voltage, +}; diff --git a/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_driver_api_private.h b/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_driver_api_private.h new file mode 100644 index 00000000..5033e389 --- /dev/null +++ b/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_driver_api_private.h @@ -0,0 +1,28 @@ +/* + * Renesas SCP/MCP Software + * Copyright (c) 2020, Renesas Electronics Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MOD_RCAR_MOCK_PMIC_DRIVER_API_PRIVATE_H +#define MOD_RCAR_MOCK_PMIC_DRIVER_API_PRIVATE_H + +#include <mod_rcar_pmic.h> + +extern const struct mod_rcar_pmic_driver_api __mod_rcar_mock_pmic_driver_api; + +/* Default limits measured in millivolts and milliamps */ +#define BD9571MWV_MIN_MV 750 +#define BD9571MWV_MAX_MV 1030 +#define BD9571MWV_STEP_MV 10 + +/* Define Register */ +#define REG_DATA_DVFS_SetVID_MASK (0x7EU) +#define REG_ADDR_DVFS_SetVID (0x54U) +#define SLAVE_ADDR_PMIC (0x30U) +#define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) + +extern int32_t rcar_iic_dvfs_send(uint8_t slave, uint8_t regr, uint8_t data); + +#endif /* MOD_RCAR_MOCK_PMIC_DRIVER_API_PRIVATE_H */ diff --git a/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_module.c b/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_module.c new file mode 100644 index 00000000..bec36621 --- /dev/null +++ b/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_module.c @@ -0,0 +1,83 @@ +/* + * Renesas SCP/MCP Software + * Copyright (c) 2020, Renesas Electronics Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <mod_rcar_mock_pmic_private.h> + +#include <mod_rcar_mock_pmic.h> + +#include <fwk_assert.h> +#include <fwk_macros.h> +#include <fwk_mm.h> +#include <fwk_module.h> +#include <fwk_module_idx.h> + +static struct mod_rcar_mock_pmic_device_ctx (*device_ctx)[]; + +static struct mod_rcar_mock_pmic_device_ctx *get_device_ctx(fwk_id_t device_id) +{ + return &(*device_ctx)[fwk_id_get_element_idx(device_id)]; +} + +static int mock_psu_init( + fwk_id_t module_id, + unsigned int element_count, + const void *data) +{ + device_ctx = fwk_mm_calloc(element_count, sizeof((*device_ctx)[0])); + if (device_ctx == NULL) + return FWK_E_NOMEM; + + return FWK_SUCCESS; +} + +static int mock_psu_element_init( + fwk_id_t device_id, + unsigned int sub_element_count, + const void *data) +{ + struct mod_rcar_mock_pmic_device_ctx *ctx; + const struct mod_rcar_mock_pmic_device_config *config = data; + + assert(sub_element_count == 0); + + ctx = get_device_ctx(device_id); + ctx->enabled = config->default_enabled; + ctx->voltage = config->default_voltage; + + return FWK_SUCCESS; +} + +static int mock_psu_process_bind_request( + fwk_id_t source_id, + fwk_id_t target_id, + fwk_id_t api_id, + const void **api) +{ + /* Only accept binds to the elements */ + if (!fwk_id_is_type(target_id, FWK_ID_TYPE_ELEMENT)) + return FWK_E_PARAM; + + *api = &__mod_rcar_mock_pmic_driver_api; + + return FWK_SUCCESS; +} + +struct mod_rcar_mock_pmic_device_ctx *__mod_rcar_mock_pmic_get_valid_device_ctx( + fwk_id_t device_id) +{ + return get_device_ctx(device_id); +} + +/* Module description */ +const struct fwk_module module_rcar_mock_pmic = { + .name = "MOCK_PSU", + .type = FWK_MODULE_TYPE_DRIVER, + .api_count = MOD_RCAR_MOCK_PMIC_API_COUNT, + .init = mock_psu_init, + .element_init = mock_psu_element_init, + .process_bind_request = mock_psu_process_bind_request, +}; diff --git a/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_module_private.h b/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_module_private.h new file mode 100644 index 00000000..ebc6d3cf --- /dev/null +++ b/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_module_private.h @@ -0,0 +1,23 @@ +/* + * Renesas SCP/MCP Software + * Copyright (c) 2020, Renesas Electronics Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MOD_RCAR_MOCK_PMIC_MODULE_PRIVATE_H +#define MOD_RCAR_MOCK_PMIC_MODULE_PRIVATE_H + +#include <fwk_id.h> + +#include <stdbool.h> + +struct mod_rcar_mock_pmic_device_ctx { + bool enabled; /* Current enabled state */ + uint64_t voltage; /* Current voltage (in mV) */ +}; + +struct mod_rcar_mock_pmic_device_ctx *__mod_rcar_mock_pmic_get_valid_device_ctx( + fwk_id_t device_id); + +#endif /* MOD_RCAR_MOCK_PMIC_MODULE_PRIVATE_H */ diff --git a/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_private.h b/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_private.h new file mode 100644 index 00000000..49c982d4 --- /dev/null +++ b/product/rcar/module/rcar_mock_pmic/src/mod_rcar_mock_pmic_private.h @@ -0,0 +1,19 @@ +/* + * Renesas SCP/MCP Software + * Copyright (c) 2020, Renesas Electronics Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MOD_RCAR_MOCK_PMIC_PRIVATE_H +#define MOD_RCAR_MOCK_PMIC_PRIVATE_H + +#include <mod_rcar_mock_pmic_driver_api_private.h> +#include <mod_rcar_mock_pmic_module_private.h> + +#include <mod_rcar_mock_pmic.h> + +#include <stdbool.h> +#include <stdint.h> + +#endif /* MOD_RCAR_MOCK_PMIC_PRIVATE_H */ diff --git a/product/rcar/scp_ramfw/config_rcar_mock_pmic.c b/product/rcar/scp_ramfw/config_rcar_mock_pmic.c new file mode 100644 index 00000000..5fe98881 --- /dev/null +++ b/product/rcar/scp_ramfw/config_rcar_mock_pmic.c @@ -0,0 +1,57 @@ +/* + * Renesas SCP/MCP Software + * Copyright (c) 2020, Renesas Electronics Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <mod_rcar_mock_pmic.h> + +#include <fwk_element.h> +#include <fwk_module.h> + +static const struct fwk_element element_table[] = { + { + .name = "CPU_GROUP_LITTLE", + .data = + &(const struct mod_rcar_mock_pmic_device_config){ + .default_enabled = true, + .default_voltage = 820000, + }, + }, + { + .name = "CPU_GROUP_BIG", + .data = + &(const struct mod_rcar_mock_pmic_device_config){ + .default_enabled = true, + .default_voltage = 830000, + }, + }, + { + .name = "GPU", + .data = + &(const struct mod_rcar_mock_pmic_device_config){ + .default_enabled = true, + .default_voltage = 100, + }, + }, + { + .name = "VPU", + .data = + &(const struct mod_rcar_mock_pmic_device_config){ + .default_enabled = true, + .default_voltage = 100, + }, + }, + { 0 } +}; + +static const struct fwk_element *get_element_table(fwk_id_t module_id) +{ + return element_table; +} + +struct fwk_module_config config_rcar_mock_pmic = { + .elements = FWK_MODULE_DYNAMIC_ELEMENTS(get_element_table), + .data = NULL, +}; |