1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (c) 2020 SiFive, Inc
6 * author: Pragnesh Patel <pragnesh.patel@sifive.com>
20 static int do_pwm(struct cmd_tbl *cmdtp, int flag, int argc,
23 const char *str_cmd, *str_channel = NULL, *str_enable = NULL;
24 const char *str_pwm = NULL, *str_period = NULL, *str_duty = NULL;
27 u32 channel, pwm_enable, pwm_dev, period_ns = 0, duty_ns = 0;
48 sub_cmd = PWM_SET_INVERT;
51 sub_cmd = PWM_SET_CONFIG;
54 sub_cmd = PWM_SET_ENABLE;
57 sub_cmd = PWM_SET_DISABLE;
63 pwm_dev = simple_strtoul(str_pwm, NULL, 10);
64 ret = uclass_get_device(UCLASS_PWM, pwm_dev, &dev);
66 printf("pwm: '%s' not found\n", str_pwm);
67 return cmd_process_error(cmdtp, ret);
72 channel = simple_strtoul(str_channel, NULL, 10);
79 if (sub_cmd == PWM_SET_INVERT && argc > 0) {
81 pwm_enable = simple_strtoul(str_enable, NULL, 10);
82 ret = pwm_set_invert(dev, channel, pwm_enable);
83 } else if (sub_cmd == PWM_SET_CONFIG && argc == 2) {
87 period_ns = simple_strtoul(str_period, NULL, 10);
91 duty_ns = simple_strtoul(str_duty, NULL, 10);
94 ret = pwm_set_config(dev, channel, period_ns, duty_ns);
95 } else if (sub_cmd == PWM_SET_ENABLE) {
96 ret = pwm_set_enable(dev, channel, 1);
97 } else if (sub_cmd == PWM_SET_DISABLE) {
98 ret = pwm_set_enable(dev, channel, 0);
100 printf("PWM arguments missing\n");
101 return CMD_RET_FAILURE;
105 printf("error(%d)\n", ret);
106 return CMD_RET_FAILURE;
109 return CMD_RET_SUCCESS;
112 U_BOOT_CMD(pwm, 6, 0, do_pwm,
113 "control pwm channels",
114 "pwm <invert> <pwm_dev_num> <channel> <polarity>\n"
115 "pwm <config> <pwm_dev_num> <channel> <period_ns> <duty_ns>\n"
116 "pwm <enable/disable> <pwm_dev_num> <channel>\n"
117 "Note: All input values are in decimal");