diff options
| author | Tom Rini <trini@konsulko.com> | 2020-09-30 16:11:11 -0400 | 
|---|---|---|
| committer | Tom Rini <trini@konsulko.com> | 2020-09-30 16:11:11 -0400 | 
| commit | 097bbf1ba97b8ece930deca663f05ea444e99e45 (patch) | |
| tree | ae4db71e77556f34f9fa7023205e4284c1d72c38 /drivers/firmware/scmi/sandbox-scmi_devices.c | |
| parent | 01114adfc1e0bf3cf5e2f3da858bb2c8e9810c1c (diff) | |
| parent | c0dd177a9986b97dab42f07b3db0ed1d2fe6e540 (diff) | |
Merge branch '2020-09-30-add-new-apis' into next
- SCMI firmware support
- regmap, GPIO, reset API enhancements
Diffstat (limited to 'drivers/firmware/scmi/sandbox-scmi_devices.c')
| -rw-r--r-- | drivers/firmware/scmi/sandbox-scmi_devices.c | 113 | 
1 files changed, 113 insertions, 0 deletions
| diff --git a/drivers/firmware/scmi/sandbox-scmi_devices.c b/drivers/firmware/scmi/sandbox-scmi_devices.c new file mode 100644 index 00000000000..c69967bf693 --- /dev/null +++ b/drivers/firmware/scmi/sandbox-scmi_devices.c @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2020, Linaro Limited + */ + +#include <common.h> +#include <clk.h> +#include <dm.h> +#include <malloc.h> +#include <reset.h> +#include <asm/io.h> +#include <asm/scmi_test.h> +#include <dm/device_compat.h> + +/* + * Simulate to some extent a SCMI exchange. + * This drivers gets SCMI resources and offers API function to the + * SCMI test sequence manipulate the resources, currently clock + * and reset controllers. + */ + +#define SCMI_TEST_DEVICES_CLK_COUNT		3 +#define SCMI_TEST_DEVICES_RD_COUNT		1 + +/* + * struct sandbox_scmi_device_priv - Storage for device handles used by test + * @clk:		Array of clock instances used by tests + * @reset_clt:		Array of the reset controller instances used by tests + * @devices:		Resources exposed by sandbox_scmi_devices_ctx() + */ +struct sandbox_scmi_device_priv { +	struct clk clk[SCMI_TEST_DEVICES_CLK_COUNT]; +	struct reset_ctl reset_ctl[SCMI_TEST_DEVICES_RD_COUNT]; +	struct sandbox_scmi_devices devices; +}; + +struct sandbox_scmi_devices *sandbox_scmi_devices_ctx(struct udevice *dev) +{ +	struct sandbox_scmi_device_priv *priv = dev_get_priv(dev); + +	if (priv) +		return &priv->devices; + +	return NULL; +} + +static int sandbox_scmi_devices_remove(struct udevice *dev) +{ +	struct sandbox_scmi_devices *devices = sandbox_scmi_devices_ctx(dev); +	int ret = 0; +	size_t n; + +	for (n = 0; n < SCMI_TEST_DEVICES_RD_COUNT; n++) { +		int ret2 = reset_free(devices->reset + n); + +		if (ret2 && !ret) +			ret = ret2; +	} + +	return ret; +} + +static int sandbox_scmi_devices_probe(struct udevice *dev) +{ +	struct sandbox_scmi_device_priv *priv = dev_get_priv(dev); +	int ret; +	size_t n; + +	priv->devices = (struct sandbox_scmi_devices){ +		.clk = priv->clk, +		.clk_count = SCMI_TEST_DEVICES_CLK_COUNT, +		.reset = priv->reset_ctl, +		.reset_count = SCMI_TEST_DEVICES_RD_COUNT, +	}; + +	for (n = 0; n < SCMI_TEST_DEVICES_CLK_COUNT; n++) { +		ret = clk_get_by_index(dev, n, priv->devices.clk + n); +		if (ret) { +			dev_err(dev, "%s: Failed on clk %zu\n", __func__, n); +			return ret; +		} +	} + +	for (n = 0; n < SCMI_TEST_DEVICES_RD_COUNT; n++) { +		ret = reset_get_by_index(dev, n, priv->devices.reset + n); +		if (ret) { +			dev_err(dev, "%s: Failed on reset %zu\n", __func__, n); +			goto err_reset; +		} +	} + +	return 0; + +err_reset: +	for (; n > 0; n--) +		reset_free(priv->devices.reset + n - 1); + +	return ret; +} + +static const struct udevice_id sandbox_scmi_devices_ids[] = { +	{ .compatible = "sandbox,scmi-devices" }, +	{ } +}; + +U_BOOT_DRIVER(sandbox_scmi_devices) = { +	.name = "sandbox-scmi_devices", +	.id = UCLASS_MISC, +	.of_match = sandbox_scmi_devices_ids, +	.priv_auto_alloc_size = sizeof(struct sandbox_scmi_device_priv), +	.remove = sandbox_scmi_devices_remove, +	.probe = sandbox_scmi_devices_probe, +}; | 
