/* * Copyright (c) 2020 ITE Corporation. All Rights Reserved. * * SPDX-License-Identifier: Apache-2.0 */ /** * @brief PINMUX driver for the IT8xxx2 */ #include #include #include #include #define DT_DRV_COMPAT ite_it8xxx2_pinmux #define PIN_REG_OFFSET 8 struct pinmux_it8xxx2_config { uintptr_t base; }; #define DEV_CFG(dev) \ ((const struct pinmux_it8xxx2_config * const) \ (dev)->config) static int pinmux_it8xxx2_set(const struct device *dev, uint32_t pin, uint32_t func) { const struct pinmux_it8xxx2_config *config = DEV_CFG(dev); uint32_t reg; uint8_t val; int g, i; if (func > IT8XXX2_PINMUX_IOF1 || pin >= IT8XXX2_PINMUX_PINS) { return -EINVAL; } g = pin / PIN_REG_OFFSET; i = pin % PIN_REG_OFFSET; reg = config->base + g; val = sys_read8(reg); if (func == IT8XXX2_PINMUX_IOF1) { sys_write8((val | IT8XXX2_PINMUX_IOF1 << i), reg); } else { sys_write8((val & ~(IT8XXX2_PINMUX_IOF1 << i)), reg); } return 0; } static int pinmux_it8xxx2_get(const struct device *dev, uint32_t pin, uint32_t *func) { const struct pinmux_it8xxx2_config *config = DEV_CFG(dev); uint32_t reg; uint8_t val; int g, i; if (pin >= IT8XXX2_PINMUX_PINS || func == NULL) { return -EINVAL; } g = pin / PIN_REG_OFFSET; i = pin % PIN_REG_OFFSET; reg = config->base + g; val = sys_read8(reg); *func = (val & (IT8XXX2_PINMUX_IOF1 << pin)) ? IT8XXX2_PINMUX_IOF1 : IT8XXX2_PINMUX_IOF0; return 0; } static int pinmux_it8xxx2_pullup(const struct device *dev, uint32_t pin, uint8_t func) { return -ENOTSUP; } static int pinmux_it8xxx2_input(const struct device *dev, uint32_t pin, uint8_t func) { return -ENOTSUP; } static int pinmux_it8xxx2_init(const struct device *dev) { return 0; } static const struct pinmux_driver_api pinmux_it8xxx2_driver_api = { .set = pinmux_it8xxx2_set, .get = pinmux_it8xxx2_get, .pullup = pinmux_it8xxx2_pullup, .input = pinmux_it8xxx2_input, }; static const struct pinmux_it8xxx2_config pinmux_it8xxx2_0_config = { .base = DT_INST_REG_ADDR(0), }; DEVICE_DT_INST_DEFINE(0, &pinmux_it8xxx2_init, device_pm_control_nop, NULL, &pinmux_it8xxx2_0_config, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &pinmux_it8xxx2_driver_api);