1e66c49faSVikas Manocha /*
2*3bc599c9SPatrice Chotard  * Copyright (C) 2016, STMicroelectronics - All Rights Reserved
3*3bc599c9SPatrice Chotard  * Author(s): Vikas Manocha, <vikas.manocha@st.com> for STMicroelectronics.
4e66c49faSVikas Manocha  *
5e66c49faSVikas Manocha  * SPDX-License-Identifier:	GPL-2.0+
6e66c49faSVikas Manocha  */
7e66c49faSVikas Manocha 
8e66c49faSVikas Manocha #ifndef _STM32_GPIO_H_
9e66c49faSVikas Manocha #define _STM32_GPIO_H_
10280057bdSVikas Manocha #include <asm/gpio.h>
11e66c49faSVikas Manocha 
12e66c49faSVikas Manocha enum stm32_gpio_port {
13e66c49faSVikas Manocha 	STM32_GPIO_PORT_A = 0,
14e66c49faSVikas Manocha 	STM32_GPIO_PORT_B,
15e66c49faSVikas Manocha 	STM32_GPIO_PORT_C,
16e66c49faSVikas Manocha 	STM32_GPIO_PORT_D,
17e66c49faSVikas Manocha 	STM32_GPIO_PORT_E,
18e66c49faSVikas Manocha 	STM32_GPIO_PORT_F,
19e66c49faSVikas Manocha 	STM32_GPIO_PORT_G,
20e66c49faSVikas Manocha 	STM32_GPIO_PORT_H,
21e66c49faSVikas Manocha 	STM32_GPIO_PORT_I
22e66c49faSVikas Manocha };
23e66c49faSVikas Manocha 
24e66c49faSVikas Manocha enum stm32_gpio_pin {
25e66c49faSVikas Manocha 	STM32_GPIO_PIN_0 = 0,
26e66c49faSVikas Manocha 	STM32_GPIO_PIN_1,
27e66c49faSVikas Manocha 	STM32_GPIO_PIN_2,
28e66c49faSVikas Manocha 	STM32_GPIO_PIN_3,
29e66c49faSVikas Manocha 	STM32_GPIO_PIN_4,
30e66c49faSVikas Manocha 	STM32_GPIO_PIN_5,
31e66c49faSVikas Manocha 	STM32_GPIO_PIN_6,
32e66c49faSVikas Manocha 	STM32_GPIO_PIN_7,
33e66c49faSVikas Manocha 	STM32_GPIO_PIN_8,
34e66c49faSVikas Manocha 	STM32_GPIO_PIN_9,
35e66c49faSVikas Manocha 	STM32_GPIO_PIN_10,
36e66c49faSVikas Manocha 	STM32_GPIO_PIN_11,
37e66c49faSVikas Manocha 	STM32_GPIO_PIN_12,
38e66c49faSVikas Manocha 	STM32_GPIO_PIN_13,
39e66c49faSVikas Manocha 	STM32_GPIO_PIN_14,
40e66c49faSVikas Manocha 	STM32_GPIO_PIN_15
41e66c49faSVikas Manocha };
42e66c49faSVikas Manocha 
43e66c49faSVikas Manocha enum stm32_gpio_mode {
44e66c49faSVikas Manocha 	STM32_GPIO_MODE_IN = 0,
45e66c49faSVikas Manocha 	STM32_GPIO_MODE_OUT,
46e66c49faSVikas Manocha 	STM32_GPIO_MODE_AF,
47e66c49faSVikas Manocha 	STM32_GPIO_MODE_AN
48e66c49faSVikas Manocha };
49e66c49faSVikas Manocha 
50e66c49faSVikas Manocha enum stm32_gpio_otype {
51e66c49faSVikas Manocha 	STM32_GPIO_OTYPE_PP = 0,
52e66c49faSVikas Manocha 	STM32_GPIO_OTYPE_OD
53e66c49faSVikas Manocha };
54e66c49faSVikas Manocha 
55e66c49faSVikas Manocha enum stm32_gpio_speed {
56e66c49faSVikas Manocha 	STM32_GPIO_SPEED_2M = 0,
57e66c49faSVikas Manocha 	STM32_GPIO_SPEED_25M,
58e66c49faSVikas Manocha 	STM32_GPIO_SPEED_50M,
59e66c49faSVikas Manocha 	STM32_GPIO_SPEED_100M
60e66c49faSVikas Manocha };
61e66c49faSVikas Manocha 
62e66c49faSVikas Manocha enum stm32_gpio_pupd {
63e66c49faSVikas Manocha 	STM32_GPIO_PUPD_NO = 0,
64e66c49faSVikas Manocha 	STM32_GPIO_PUPD_UP,
65e66c49faSVikas Manocha 	STM32_GPIO_PUPD_DOWN
66e66c49faSVikas Manocha };
67e66c49faSVikas Manocha 
68e66c49faSVikas Manocha enum stm32_gpio_af {
69e66c49faSVikas Manocha 	STM32_GPIO_AF0 = 0,
70e66c49faSVikas Manocha 	STM32_GPIO_AF1,
71e66c49faSVikas Manocha 	STM32_GPIO_AF2,
72e66c49faSVikas Manocha 	STM32_GPIO_AF3,
73e66c49faSVikas Manocha 	STM32_GPIO_AF4,
74e66c49faSVikas Manocha 	STM32_GPIO_AF5,
75e66c49faSVikas Manocha 	STM32_GPIO_AF6,
76e66c49faSVikas Manocha 	STM32_GPIO_AF7,
77e66c49faSVikas Manocha 	STM32_GPIO_AF8,
78e66c49faSVikas Manocha 	STM32_GPIO_AF9,
79e66c49faSVikas Manocha 	STM32_GPIO_AF10,
80e66c49faSVikas Manocha 	STM32_GPIO_AF11,
81e66c49faSVikas Manocha 	STM32_GPIO_AF12,
82e66c49faSVikas Manocha 	STM32_GPIO_AF13,
83e66c49faSVikas Manocha 	STM32_GPIO_AF14,
84e66c49faSVikas Manocha 	STM32_GPIO_AF15
85e66c49faSVikas Manocha };
86e66c49faSVikas Manocha 
87e66c49faSVikas Manocha struct stm32_gpio_dsc {
88e66c49faSVikas Manocha 	enum stm32_gpio_port	port;
89e66c49faSVikas Manocha 	enum stm32_gpio_pin	pin;
90e66c49faSVikas Manocha };
91e66c49faSVikas Manocha 
92e66c49faSVikas Manocha struct stm32_gpio_ctl {
93e66c49faSVikas Manocha 	enum stm32_gpio_mode	mode;
94e66c49faSVikas Manocha 	enum stm32_gpio_otype	otype;
95e66c49faSVikas Manocha 	enum stm32_gpio_speed	speed;
96e66c49faSVikas Manocha 	enum stm32_gpio_pupd	pupd;
97e66c49faSVikas Manocha 	enum stm32_gpio_af	af;
98e66c49faSVikas Manocha };
99e66c49faSVikas Manocha 
10077417102SVikas Manocha struct stm32_gpio_regs {
10177417102SVikas Manocha 	u32 moder;	/* GPIO port mode */
10277417102SVikas Manocha 	u32 otyper;	/* GPIO port output type */
10377417102SVikas Manocha 	u32 ospeedr;	/* GPIO port output speed */
10477417102SVikas Manocha 	u32 pupdr;	/* GPIO port pull-up/pull-down */
10577417102SVikas Manocha 	u32 idr;	/* GPIO port input data */
10677417102SVikas Manocha 	u32 odr;	/* GPIO port output data */
10777417102SVikas Manocha 	u32 bsrr;	/* GPIO port bit set/reset */
10877417102SVikas Manocha 	u32 lckr;	/* GPIO port configuration lock */
10977417102SVikas Manocha 	u32 afr[2];	/* GPIO alternate function */
11077417102SVikas Manocha };
11177417102SVikas Manocha 
11277417102SVikas Manocha struct stm32_gpio_priv {
11377417102SVikas Manocha 	struct stm32_gpio_regs *regs;
11477417102SVikas Manocha };
11577417102SVikas Manocha 
116e66c49faSVikas Manocha static inline unsigned stm32_gpio_to_port(unsigned gpio)
117e66c49faSVikas Manocha {
118e66c49faSVikas Manocha 	return gpio / 16;
119e66c49faSVikas Manocha }
120e66c49faSVikas Manocha 
121e66c49faSVikas Manocha static inline unsigned stm32_gpio_to_pin(unsigned gpio)
122e66c49faSVikas Manocha {
123e66c49faSVikas Manocha 	return gpio % 16;
124e66c49faSVikas Manocha }
125e66c49faSVikas Manocha 
126e66c49faSVikas Manocha #endif /* _STM32_GPIO_H_ */
127