xref: /linux/drivers/pinctrl/ultrarisc/pinctrl-ultrarisc.h (revision 3d5e48944e824bddc20d7b874e784f7b279636fe)
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