/* * Copyright (c) 2019 Synopsys, Inc. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 */ #define DT_DRV_COMPAT snps_creg_gpio_mux_hsdk #include #include #include #include #define creg_gpio_mux_reg (*(volatile uint32_t *)DT_INST_REG_ADDR(0)) void _arc_sync(void) { __asm__ volatile("sync"); } static int pinmux_hsdk_set(const struct device *dev, uint32_t pin, uint32_t func) { if (func >= HSDK_PINMUX_FUNS || pin >= HSDK_PINMUX_SELS) return -EINVAL; creg_gpio_mux_reg &= ~(0x07U << (pin * 3)); creg_gpio_mux_reg |= (func << (pin * 3)); _arc_sync(); return 0; } static int pinmux_hsdk_get(const struct device *dev, uint32_t pin, uint32_t *func) { if (pin >= HSDK_PINMUX_SELS || func == NULL) return -EINVAL; *func = (creg_gpio_mux_reg >> (pin * 3)) & 0x07U; return 0; } static int pinmux_hsdk_pullup(const struct device *dev, uint32_t pin, uint8_t func) { return -ENOTSUP; } static int pinmux_hsdk_input(const struct device *dev, uint32_t pin, uint8_t func) { return -ENOTSUP; } static int pinmux_hsdk_init(const struct device *dev) { ARG_UNUSED(dev); return 0; } static const struct pinmux_driver_api pinmux_hsdk_driver_api = { .set = pinmux_hsdk_set, .get = pinmux_hsdk_get, .pullup = pinmux_hsdk_pullup, .input = pinmux_hsdk_input, }; DEVICE_DT_INST_DEFINE(0, &pinmux_hsdk_init, NULL, NULL, NULL, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &pinmux_hsdk_driver_api);