diff options
Diffstat (limited to 'drivers/gpio/gpio-syscon.c')
-rw-r--r-- | drivers/gpio/gpio-syscon.c | 33 |
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 | ||
138 | static 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 | |||
157 | static 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 | ||
140 | static void keystone_gpio_set(struct gpio_chip *chip, unsigned offset, int val) | 167 | static 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 | }; |
180 | MODULE_DEVICE_TABLE(of, syscon_gpio_ids); | 211 | MODULE_DEVICE_TABLE(of, syscon_gpio_ids); |