aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-syscon.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpio/gpio-syscon.c')
-rw-r--r--drivers/gpio/gpio-syscon.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/drivers/gpio/gpio-syscon.c b/drivers/gpio/gpio-syscon.c
index 8b0a69c5ba88..87c18a544513 100644
--- a/drivers/gpio/gpio-syscon.c
+++ b/drivers/gpio/gpio-syscon.c
@@ -10,7 +10,7 @@
10 */ 10 */
11 11
12#include <linux/err.h> 12#include <linux/err.h>
13#include <linux/gpio.h> 13#include <linux/gpio/driver.h>
14#include <linux/module.h> 14#include <linux/module.h>
15#include <linux/of.h> 15#include <linux/of.h>
16#include <linux/of_device.h> 16#include <linux/of_device.h>
@@ -135,6 +135,33 @@ static const struct syscon_gpio_data clps711x_mctrl_gpio = {
135 .dat_bit_offset = 0x40 * 8 + 8, 135 .dat_bit_offset = 0x40 * 8 + 8,
136}; 136};
137 137
138static void rockchip_gpio_set(struct gpio_chip *chip, unsigned int offset,
139 int val)
140{
141 struct syscon_gpio_priv *priv = gpiochip_get_data(chip);
142 unsigned int offs;
143 u8 bit;
144 u32 data;
145 int ret;
146
147 offs = priv->dreg_offset + priv->data->dat_bit_offset + offset;
148 bit = offs % SYSCON_REG_BITS;
149 data = (val ? BIT(bit) : 0) | BIT(bit + 16);
150 ret = regmap_write(priv->syscon,
151 (offs / SYSCON_REG_BITS) * SYSCON_REG_SIZE,
152 data);
153 if (ret < 0)
154 dev_err(chip->parent, "gpio write failed ret(%d)\n", ret);
155}
156
157static const struct syscon_gpio_data rockchip_rk3328_gpio_mute = {
158 /* RK3328 GPIO_MUTE is an output only pin at GRF_SOC_CON10[1] */
159 .flags = GPIO_SYSCON_FEAT_OUT,
160 .bit_count = 1,
161 .dat_bit_offset = 0x0428 * 8 + 1,
162 .set = rockchip_gpio_set,
163};
164
138#define KEYSTONE_LOCK_BIT BIT(0) 165#define KEYSTONE_LOCK_BIT BIT(0)
139 166
140static void keystone_gpio_set(struct gpio_chip *chip, unsigned offset, int val) 167static void keystone_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
@@ -175,6 +202,10 @@ static const struct of_device_id syscon_gpio_ids[] = {
175 .compatible = "ti,keystone-dsp-gpio", 202 .compatible = "ti,keystone-dsp-gpio",
176 .data = &keystone_dsp_gpio, 203 .data = &keystone_dsp_gpio,
177 }, 204 },
205 {
206 .compatible = "rockchip,rk3328-grf-gpio",
207 .data = &rockchip_rk3328_gpio_mute,
208 },
178 { } 209 { }
179}; 210};
180MODULE_DEVICE_TABLE(of, syscon_gpio_ids); 211MODULE_DEVICE_TABLE(of, syscon_gpio_ids);