text: /*
   * 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, device_pm_control_nop, NULL, NULL,
  		PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
  		&pinmux_hsdk_driver_api);
  