mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-02 09:46:37 +03:00
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:
committed by
Casey Connolly
parent
f9e3f5f75c
commit
fcb48b8981
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user