/*
 * Copyright (c) 2015 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * Public APIs for Pinmux drivers
 */

#ifndef ZEPHYR_INCLUDE_DRIVERS_PINMUX_H_
#define ZEPHYR_INCLUDE_DRIVERS_PINMUX_H_

/**
 * @brief Pinmux Interface
 * @defgroup pinmux_interface Pinmux Interface
 * @ingroup io_interfaces
 * @{
 */

#include <zephyr/types.h>
#include <device.h>

#ifdef __cplusplus
extern "C" {
#endif

#define PINMUX_FUNC_A		0
#define PINMUX_FUNC_B		1
#define PINMUX_FUNC_C		2
#define PINMUX_FUNC_D		3
#define PINMUX_FUNC_E		4
#define PINMUX_FUNC_F		5
#define PINMUX_FUNC_G		6
#define PINMUX_FUNC_H		7
#define PINMUX_FUNC_I		8
#define PINMUX_FUNC_J		9
#define PINMUX_FUNC_K		10
#define PINMUX_FUNC_L		11
#define PINMUX_FUNC_M		12
#define PINMUX_FUNC_N		13
#define PINMUX_FUNC_O		14
#define PINMUX_FUNC_P		15

#define PINMUX_PULLUP_ENABLE	(0x1)
#define PINMUX_PULLUP_DISABLE	(0x0)

#define PINMUX_INPUT_ENABLED	(0x1)
#define PINMUX_OUTPUT_ENABLED	(0x0)

/**
 * @typedef pmux_set
 * @brief Callback API upon setting a PIN's function
 * See pinmux_pin_set() for argument description
 */
typedef int (*pmux_set)(const struct device *dev, uint32_t pin, uint32_t func);
/**
 * @typedef pmux_get
 * @brief Callback API upon getting a PIN's function
 * See pinmux_pin_get() for argument description
 */
typedef int (*pmux_get)(const struct device *dev, uint32_t pin,
			uint32_t *func);
/**
 * @typedef pmux_pullup
 * @brief Callback API upon setting a PIN's pullup
 * See pinmix_pin_pullup() for argument description
 */
typedef int (*pmux_pullup)(const struct device *dev, uint32_t pin,
			   uint8_t func);
/**
 * @typedef pmux_input
 * @brief Callback API upon setting a PIN's input function
 * See pinmux_input() for argument description
 */
typedef int (*pmux_input)(const struct device *dev, uint32_t pin,
			  uint8_t func);

__subsystem struct pinmux_driver_api {
	pmux_set set;
	pmux_get get;
	pmux_pullup pullup;
	pmux_input input;
};

static inline int pinmux_pin_set(const struct device *dev, uint32_t pin,
				 uint32_t func)
{
	const struct pinmux_driver_api *api =
		(const struct pinmux_driver_api *)dev->api;

	return api->set(dev, pin, func);
}

static inline int pinmux_pin_get(const struct device *dev, uint32_t pin,
				 uint32_t *func)
{
	const struct pinmux_driver_api *api =
		(const struct pinmux_driver_api *)dev->api;

	return api->get(dev, pin, func);
}

static inline int pinmux_pin_pullup(const struct device *dev, uint32_t pin,
				    uint8_t func)
{
	const struct pinmux_driver_api *api =
		(const struct pinmux_driver_api *)dev->api;

	return api->pullup(dev, pin, func);
}

static inline int pinmux_pin_input_enable(const struct device *dev,
					  uint32_t pin,
					  uint8_t func)
{
	const struct pinmux_driver_api *api =
		(const struct pinmux_driver_api *)dev->api;

	return api->input(dev, pin, func);
}

#ifdef __cplusplus
}
#endif

/**
 *
 * @}
 */

#endif /* ZEPHYR_INCLUDE_DRIVERS_PINMUX_H_ */
