/*
 * Copyright (c) 2017 Intel Corporation
 * Copyright (c) 2020-2021 Vestas Wind Systems A/S
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/syscall_handler.h>
#include <zephyr/drivers/pwm.h>

static inline int z_vrfy_pwm_set_cycles(const struct device *dev,
					uint32_t channel, uint32_t period,
					uint32_t pulse, pwm_flags_t flags)
{
	Z_OOPS(Z_SYSCALL_DRIVER_PWM(dev, set_cycles));
	return z_impl_pwm_set_cycles((const struct device *)dev, channel,
					 period, pulse, flags);
}
#include <syscalls/pwm_set_cycles_mrsh.c>

static inline int z_vrfy_pwm_get_cycles_per_sec(const struct device *dev,
						uint32_t channel,
						uint64_t *cycles)
{
	Z_OOPS(Z_SYSCALL_DRIVER_PWM(dev, get_cycles_per_sec));
	Z_OOPS(Z_SYSCALL_MEMORY_WRITE(cycles, sizeof(uint64_t)));
	return z_impl_pwm_get_cycles_per_sec((const struct device *)dev,
					     channel, (uint64_t *)cycles);
}
#include <syscalls/pwm_get_cycles_per_sec_mrsh.c>

#ifdef CONFIG_PWM_CAPTURE

static inline int z_vrfy_pwm_enable_capture(const struct device *dev,
					    uint32_t channel)
{
	Z_OOPS(Z_SYSCALL_DRIVER_PWM(dev, enable_capture));
	return z_impl_pwm_enable_capture((const struct device *)dev, channel);
}
#include <syscalls/pwm_enable_capture_mrsh.c>

static inline int z_vrfy_pwm_disable_capture(const struct device *dev,
					     uint32_t channel)
{
	Z_OOPS(Z_SYSCALL_DRIVER_PWM(dev, disable_capture));
	return z_impl_pwm_disable_capture((const struct device *)dev, channel);
}
#include <syscalls/pwm_disable_capture_mrsh.c>

static inline int z_vrfy_pwm_capture_cycles(const struct device *dev,
					    uint32_t channel, pwm_flags_t flags,
					    uint32_t *period_cycles,
					    uint32_t *pulse_cycles,
					    k_timeout_t timeout)
{
	uint32_t period;
	uint32_t pulse;
	int err;

	Z_OOPS(Z_SYSCALL_DRIVER_PWM(dev, configure_capture));
	Z_OOPS(Z_SYSCALL_DRIVER_PWM(dev, enable_capture));
	Z_OOPS(Z_SYSCALL_DRIVER_PWM(dev, disable_capture));

	err = z_impl_pwm_capture_cycles((const struct device *)dev, channel,
					flags, &period, &pulse, timeout);
	if (period_cycles != NULL) {
		Z_OOPS(z_user_to_copy(period_cycles, &period,
				      sizeof(*period_cycles)));
	}

	if (pulse_cycles != NULL) {
		Z_OOPS(z_user_to_copy(pulse_cycles, &pulse,
				      sizeof(*pulse_cycles)));
	}

	return err;
}
#include <syscalls/pwm_capture_cycles_mrsh.c>

#endif /* CONFIG_PWM_CAPTURE */
