1*cb703792SJia Wang /* SPDX-License-Identifier: GPL-2.0 */ 2*cb703792SJia Wang /* 3*cb703792SJia Wang * Copyright (C) 2026 UltraRISC Technology (Shanghai) Co., Ltd. 4*cb703792SJia Wang * 5*cb703792SJia Wang * Author: Jia Wang <wangjia@ultrarisc.com> 6*cb703792SJia Wang */ 7*cb703792SJia Wang 8*cb703792SJia Wang #ifndef __PINCTRL_ULTRARISC_H__ 9*cb703792SJia Wang #define __PINCTRL_ULTRARISC_H__ 10*cb703792SJia Wang 11*cb703792SJia Wang #include <linux/io.h> 12*cb703792SJia Wang #include <linux/pinctrl/pinctrl.h> 13*cb703792SJia Wang #include <linux/spinlock.h> 14*cb703792SJia Wang 15*cb703792SJia Wang struct platform_device; 16*cb703792SJia Wang 17*cb703792SJia Wang #define UR_FUNC_DEFAULT 0U 18*cb703792SJia Wang #define UR_FUNC_0 1U 19*cb703792SJia Wang #define UR_FUNC_1 0x10000U 20*cb703792SJia Wang 21*cb703792SJia Wang #define UR_MAX_PINS_PER_PORT 16 22*cb703792SJia Wang 23*cb703792SJia Wang #define UR_BIAS_MASK 0x0000000F 24*cb703792SJia Wang #define UR_PULL_MASK 0x0C 25*cb703792SJia Wang #define UR_PULL_DIS 0 26*cb703792SJia Wang #define UR_PULL_UP 1 27*cb703792SJia Wang #define UR_PULL_DOWN 2 28*cb703792SJia Wang #define UR_DRIVE_MASK 0x03 29*cb703792SJia Wang 30*cb703792SJia Wang struct ur_port_desc { 31*cb703792SJia Wang u32 pin_base; 32*cb703792SJia Wang u32 npins; 33*cb703792SJia Wang u32 func_offset; 34*cb703792SJia Wang u32 conf_offset; 35*cb703792SJia Wang u32 supported_modes; 36*cb703792SJia Wang bool supports_gpio; 37*cb703792SJia Wang }; 38*cb703792SJia Wang 39*cb703792SJia Wang struct ur_func_route { 40*cb703792SJia Wang const char *function; 41*cb703792SJia Wang u32 mode; 42*cb703792SJia Wang u64 valid_pins; 43*cb703792SJia Wang }; 44*cb703792SJia Wang 45*cb703792SJia Wang struct ur_pinctrl_data { 46*cb703792SJia Wang const struct pinctrl_pin_desc *pins; 47*cb703792SJia Wang u32 npins; 48*cb703792SJia Wang const struct ur_func_route *routes; 49*cb703792SJia Wang u32 num_routes; 50*cb703792SJia Wang }; 51*cb703792SJia Wang 52*cb703792SJia Wang struct ur_pinctrl { 53*cb703792SJia Wang struct device *dev; 54*cb703792SJia Wang struct pinctrl_dev *pctl_dev; 55*cb703792SJia Wang const struct ur_pinctrl_data *data; 56*cb703792SJia Wang void __iomem *base; 57*cb703792SJia Wang raw_spinlock_t lock; /* Protects mux and conf registers */ 58*cb703792SJia Wang }; 59*cb703792SJia Wang 60*cb703792SJia Wang int ur_pinctrl_probe(struct platform_device *pdev, 61*cb703792SJia Wang const struct ur_pinctrl_data *data); 62*cb703792SJia Wang 63*cb703792SJia Wang #endif 64