drivers: sysreset: Add sysreset op that can take arguments

Add a 'request_arg' op to struct sysreset_ops to enable sysreset drivers
to receive arguments given to the 'reset' command. Process the
request_arg() op before the usual request() op.

Reviewed-by: Casey Connolly <casey.connolly@linaro.org>
Reviewed-by: Sumit Garg <sumit.garg@oss.qualcomm.com>
Signed-off-by: Varadarajan Narayanan <varadarajan.narayanan@oss.qualcomm.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
Link: https://patch.msgid.link/20260121063920.1500293-3-varadarajan.narayanan@oss.qualcomm.com
Signed-off-by: Casey Connolly <casey.connolly@linaro.org>
This commit is contained in:
Varadarajan Narayanan
2026-01-21 12:09:17 +05:30
committed by Casey Connolly
parent f9e3f5f75c
commit fcb48b8981
3 changed files with 63 additions and 0 deletions

View File

@@ -49,6 +49,14 @@ config SYSRESET_CMD_RESET
help
Enable sysreset implementation of the reset command.
config SYSRESET_CMD_RESET_ARGS
bool "Enable reset command to take arguments"
help
Pass on the arguments received by the 'reset' command to the
sysreset driver(s). The sysreset driver(s) may make use of the
additional arguments for implementing arch/board specific
functionality.
if CMD_POWEROFF
config SYSRESET_CMD_POWEROFF

View File

@@ -32,6 +32,18 @@ int sysreset_request(struct udevice *dev, enum sysreset_t type)
return ops->request(dev, type);
}
#if IS_ENABLED(CONFIG_SYSRESET_CMD_RESET_ARGS)
int sysreset_request_arg(struct udevice *dev, int argc, char * const argv[])
{
struct sysreset_ops *ops = sysreset_get_ops(dev);
if (!ops->request_arg)
return -ENOSYS;
return ops->request_arg(dev, argc, argv);
}
#endif /* CONFIG_SYSRESET_CMD_RESET_ARGS */
int sysreset_get_status(struct udevice *dev, char *buf, int size)
{
struct sysreset_ops *ops = sysreset_get_ops(dev);
@@ -71,6 +83,26 @@ int sysreset_walk(enum sysreset_t type)
return ret;
}
#if IS_ENABLED(CONFIG_SYSRESET_CMD_RESET_ARGS)
int sysreset_walk_arg(int argc, char * const argv[])
{
struct udevice *dev;
int ret = -ENOSYS;
while (ret != -EINPROGRESS && ret != -EPROTONOSUPPORT) {
for (uclass_first_device(UCLASS_SYSRESET, &dev);
dev;
uclass_next_device(&dev)) {
ret = sysreset_request_arg(dev, argc, argv);
if (ret == -EINPROGRESS || ret == -EPROTONOSUPPORT)
break;
}
}
return ret;
}
#endif /* CONFIG_SYSRESET_CMD_RESET_ARGS */
int sysreset_get_last_walk(void)
{
struct udevice *dev;
@@ -132,6 +164,11 @@ int do_reset(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
printf("resetting ...\n");
mdelay(100);
#if IS_ENABLED(CONFIG_SYSRESET_CMD_RESET_ARGS)
if (argc > 1 && sysreset_walk_arg(argc, argv) == -EINPROGRESS)
return 0;
#endif
sysreset_walk_halt(reset_type);
return 0;

View File

@@ -43,6 +43,24 @@ struct sysreset_ops {
* (in which case this method will not actually return)
*/
int (*request)(struct udevice *dev, enum sysreset_t type);
/**
* @request_arg: Reset handler implementations that might need to process
* arguments given to the 'reset' command.
*
* Note that this function may return before the reset takes effect.
*
* @dev: Device to be used for system reset
* @argc: No. of items in @argv
* @argv: Arguments given to 'reset' command
* Return:
* -EINPROGRESS if the reset has started and will complete soon
* -EPROTONOSUPPORT if not supported by this device
* 0 if the reset has already happened
* (in which case this method will not actually return)
*/
int (*request_arg)(struct udevice *dev, int argc, char * const argv[]);
/**
* @get_status: get printable reset status information
*