| /* |
| * Copyright (c) 2019 Synopsys, Inc. All rights reserved. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #define DT_DRV_COMPAT snps_creg_gpio_mux_hsdk |
| |
| #include <errno.h> |
| #include <device.h> |
| #include <drivers/pinmux.h> |
| #include <soc.h> |
| |
| #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); |