driver: gpio: Add pin_configure api for creg_gpio driver

Update pin_configure api for creg_gpio driver

Signed-off-by: Siyuan Cheng <siyuanc@synopsys.com>
This commit is contained in:
Siyuan Cheng 2023-01-02 00:25:43 +08:00 committed by Christopher Friedt
parent d1c0f18e50
commit 59130b11dc
1 changed files with 44 additions and 7 deletions

View File

@ -39,13 +39,6 @@ struct creg_gpio_config {
uint8_t on_val;
};
static int pin_config(const struct device *dev,
gpio_pin_t pin,
gpio_flags_t flags)
{
return -ENOTSUP;
}
static int port_get(const struct device *dev,
gpio_port_value_t *value)
{
@ -119,6 +112,50 @@ static int pin_interrupt_configure(const struct device *dev,
return -ENOTSUP;
}
static int pin_config(const struct device *dev,
gpio_pin_t pin,
gpio_flags_t flags)
{
const struct creg_gpio_config *cfg = dev->config;
uint32_t io_flags;
bool pin_is_output;
/* Check for invalid pin number */
if (pin >= cfg->ngpios) {
return -EINVAL;
}
/* Does not support disconnected pin, and
* not supporting both input/output at same time.
*/
io_flags = flags & (GPIO_INPUT | GPIO_OUTPUT);
if ((io_flags == GPIO_DISCONNECTED)
|| (io_flags == (GPIO_INPUT | GPIO_OUTPUT))) {
return -ENOTSUP;
}
/* No open-drain support */
if ((flags & GPIO_SINGLE_ENDED) != 0U) {
return -ENOTSUP;
}
/* Does not support pull-up/pull-down */
if ((flags & (GPIO_PULL_UP | GPIO_PULL_DOWN)) != 0U) {
return -ENOTSUP;
}
pin_is_output = (flags & GPIO_OUTPUT) != 0U;
if (pin_is_output) {
if ((flags & GPIO_OUTPUT_INIT_HIGH) != 0U) {
return port_set_bits(dev, BIT(pin));
} else if ((flags & GPIO_OUTPUT_INIT_LOW) != 0U) {
return port_clear_bits(dev, BIT(pin));
}
}
return -ENOTSUP;
}
/**
* @brief Initialization function of creg_gpio
*