1145519Sdarrenr// SPDX-License-Identifier: GPL-2.0
2145510Sdarrenr/*
322514Sdarrenr * Intel PMC command
453024Sguido *
522514Sdarrenr * Copyright 2019 Google LLC
680486Sdarrenr */
7145510Sdarrenr
822514Sdarrenr#include <common.h>
931183Speter#include <command.h>
1031183Speter#include <dm.h>
11255332Scy#include <power/acpi_pmc.h>
1222514Sdarrenr
1322514Sdarrenrstatic int get_pmc_dev(struct udevice **devp)
1422514Sdarrenr{
1522514Sdarrenr	struct udevice *dev;
1622514Sdarrenr	int ret;
1722514Sdarrenr
1822514Sdarrenr	ret = uclass_first_device_err(UCLASS_ACPI_PMC, &dev);
1922514Sdarrenr	if (ret) {
2022514Sdarrenr		printf("Could not find device (err=%d)\n", ret);
2122514Sdarrenr		return ret;
2222514Sdarrenr	}
2322514Sdarrenr	ret = pmc_init(dev);
2422514Sdarrenr	if (ret) {
2522514Sdarrenr		printf("Could not init device (err=%d)\n", ret);
2622514Sdarrenr		return ret;
2722514Sdarrenr	}
2822514Sdarrenr	*devp = dev;
2922514Sdarrenr
3022514Sdarrenr	return 0;
3122514Sdarrenr}
3222514Sdarrenr
3322514Sdarrenrstatic int do_pmc_init(struct cmd_tbl *cmdtp, int flag, int argc,
3422514Sdarrenr		       char *const argv[])
3522514Sdarrenr{
3622514Sdarrenr	struct udevice *dev;
3722514Sdarrenr	int ret;
3822514Sdarrenr
3922514Sdarrenr	ret = get_pmc_dev(&dev);
4022514Sdarrenr	if (ret)
4122514Sdarrenr		return CMD_RET_FAILURE;
4222514Sdarrenr
4322514Sdarrenr	return 0;
4422514Sdarrenr}
4522514Sdarrenr
4622514Sdarrenrstatic int do_pmc_info(struct cmd_tbl *cmdtp, int flag, int argc,
4722514Sdarrenr		       char *const argv[])
4831183Speter{
4922514Sdarrenr	struct udevice *dev;
5022514Sdarrenr	int ret;
5124583Sdarrenr
5222514Sdarrenr	ret = get_pmc_dev(&dev);
5322514Sdarrenr	if (ret)
5422514Sdarrenr		return CMD_RET_FAILURE;
5522514Sdarrenr	pmc_dump_info(dev);
5622514Sdarrenr
5722514Sdarrenr	return 0;
5822514Sdarrenr}
5922514Sdarrenr
6022514Sdarrenrstatic struct cmd_tbl cmd_pmc_sub[] = {
6122514Sdarrenr	U_BOOT_CMD_MKENT(init, 0, 1, do_pmc_init, "", ""),
6222514Sdarrenr	U_BOOT_CMD_MKENT(info, 0, 1, do_pmc_info, "", ""),
6322514Sdarrenr};
6422514Sdarrenr
6522514Sdarrenrstatic int do_pmc(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
6622514Sdarrenr{
6722514Sdarrenr	const struct cmd_tbl *cp;
6822514Sdarrenr
69255332Scy	if (argc < 2) /* no subcommand */
70255332Scy		return cmd_usage(cmdtp);
71255332Scy
7222514Sdarrenr	cp = find_cmd_tbl(argv[1], &cmd_pmc_sub[0], ARRAY_SIZE(cmd_pmc_sub));
7322514Sdarrenr	if (!cp)
7422514Sdarrenr		return CMD_RET_USAGE;
7522514Sdarrenr
7622514Sdarrenr	return cp->cmd(cmdtp, flag, argc, argv);
7722514Sdarrenr}
7822514Sdarrenr
7922514SdarrenrU_BOOT_CMD(
8022514Sdarrenr	pmc, 2, 1, do_pmc, "Power-management controller info",
8122514Sdarrenr	"info - read state and show info about the PMC\n"
8222514Sdarrenr	"pmc init - read state from the PMC\n"
8322514Sdarrenr	);
8422514Sdarrenr