]> Git Repo - J-u-boot.git/blob - drivers/gpio/msm_gpio.c
Merge tag 'xilinx-for-v2024.04-rc1-v2' of https://source.denx.de/u-boot/custodians...
[J-u-boot.git] / drivers / gpio / msm_gpio.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Qualcomm GPIO driver
4  *
5  * (C) Copyright 2015 Mateusz Kulikowski <[email protected]>
6  */
7
8 #include <common.h>
9 #include <dm.h>
10 #include <errno.h>
11 #include <asm/global_data.h>
12 #include <asm/gpio.h>
13 #include <asm/io.h>
14 #include <mach/gpio.h>
15
16 DECLARE_GLOBAL_DATA_PTR;
17
18 /* OE */
19 #define GPIO_OE_DISABLE  (0x0 << 9)
20 #define GPIO_OE_ENABLE   (0x1 << 9)
21 #define GPIO_OE_MASK     (0x1 << 9)
22
23 /* GPIO_IN_OUT register shifts. */
24 #define GPIO_IN          0
25 #define GPIO_OUT         1
26
27 struct msm_gpio_bank {
28         phys_addr_t base;
29         const struct msm_pin_data *pin_data;
30 };
31
32 #define GPIO_CONFIG_REG(dev, x) \
33         (qcom_pin_offset(((struct msm_gpio_bank *)dev_get_priv(dev))->pin_data->pin_offsets, x))
34
35 #define GPIO_IN_OUT_REG(dev, x) \
36         (GPIO_CONFIG_REG(dev, x) + 0x4)
37
38 static int msm_gpio_direction_input(struct udevice *dev, unsigned int gpio)
39 {
40         struct msm_gpio_bank *priv = dev_get_priv(dev);
41
42         /* Disable OE bit */
43         clrsetbits_le32(priv->base + GPIO_CONFIG_REG(dev, gpio),
44                         GPIO_OE_MASK, GPIO_OE_DISABLE);
45
46         return 0;
47 }
48
49 static int msm_gpio_set_value(struct udevice *dev, unsigned int gpio, int value)
50 {
51         struct msm_gpio_bank *priv = dev_get_priv(dev);
52
53         value = !!value;
54         /* set value */
55         writel(value << GPIO_OUT, priv->base + GPIO_IN_OUT_REG(dev, gpio));
56
57         return 0;
58 }
59
60 static int msm_gpio_direction_output(struct udevice *dev, unsigned int gpio,
61                                      int value)
62 {
63         struct msm_gpio_bank *priv = dev_get_priv(dev);
64
65         value = !!value;
66         /* set value */
67         writel(value << GPIO_OUT, priv->base + GPIO_IN_OUT_REG(dev, gpio));
68         /* switch direction */
69         clrsetbits_le32(priv->base + GPIO_CONFIG_REG(dev, gpio),
70                         GPIO_OE_MASK, GPIO_OE_ENABLE);
71
72         return 0;
73 }
74
75 static int msm_gpio_get_value(struct udevice *dev, unsigned int gpio)
76 {
77         struct msm_gpio_bank *priv = dev_get_priv(dev);
78
79         return !!(readl(priv->base + GPIO_IN_OUT_REG(dev, gpio)) >> GPIO_IN);
80 }
81
82 static int msm_gpio_get_function(struct udevice *dev, unsigned int gpio)
83 {
84         struct msm_gpio_bank *priv = dev_get_priv(dev);
85
86         if (readl(priv->base + GPIO_CONFIG_REG(dev, gpio)) & GPIO_OE_ENABLE)
87                 return GPIOF_OUTPUT;
88
89         return GPIOF_INPUT;
90 }
91
92 static const struct dm_gpio_ops gpio_msm_ops = {
93         .direction_input        = msm_gpio_direction_input,
94         .direction_output       = msm_gpio_direction_output,
95         .get_value              = msm_gpio_get_value,
96         .set_value              = msm_gpio_set_value,
97         .get_function           = msm_gpio_get_function,
98 };
99
100 static int msm_gpio_probe(struct udevice *dev)
101 {
102         struct msm_gpio_bank *priv = dev_get_priv(dev);
103
104         priv->base = dev_read_addr(dev);
105         priv->pin_data = (struct msm_pin_data *)dev_get_driver_data(dev);
106
107         return priv->base == FDT_ADDR_T_NONE ? -EINVAL : 0;
108 }
109
110 static int msm_gpio_of_to_plat(struct udevice *dev)
111 {
112         struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
113         const struct msm_pin_data *pin_data = (struct msm_pin_data *)dev_get_driver_data(dev);
114
115         /* Get the pin count from the pinctrl driver */
116         uc_priv->gpio_count = pin_data->pin_count;
117         uc_priv->bank_name = fdt_getprop(gd->fdt_blob, dev_of_offset(dev),
118                                          "gpio-bank-name", NULL);
119         if (uc_priv->bank_name == NULL)
120                 uc_priv->bank_name = "soc";
121
122         return 0;
123 }
124
125 U_BOOT_DRIVER(gpio_msm) = {
126         .name   = "gpio_msm",
127         .id     = UCLASS_GPIO,
128         .of_to_plat = msm_gpio_of_to_plat,
129         .probe  = msm_gpio_probe,
130         .ops    = &gpio_msm_ops,
131         .flags  = DM_UC_FLAG_SEQ_ALIAS,
132         .priv_auto      = sizeof(struct msm_gpio_bank),
133 };
This page took 0.033568 seconds and 4 git commands to generate.