Lines Matching +full:keystone +full:- +full:gpio
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * SYSCON GPIO driver
9 #include <linux/gpio/driver.h>
21 /* SYSCON driver is designed to use 32-bit wide registers */
26 * struct syscon_gpio_data - Configuration for the device.
33 * @dat_bit_offset: Offset (in bits) to the first GPIO bit.
35 * GPIO direction (Used with GPIO_SYSCON_FEAT_DIR flag).
64 offs = priv->dreg_offset + priv->data->dat_bit_offset + offset; in syscon_gpio_get()
66 ret = regmap_read(priv->syscon, in syscon_gpio_get()
79 offs = priv->dreg_offset + priv->data->dat_bit_offset + offset; in syscon_gpio_set()
81 regmap_update_bits(priv->syscon, in syscon_gpio_set()
91 if (priv->data->flags & GPIO_SYSCON_FEAT_DIR) { in syscon_gpio_dir_in()
94 offs = priv->dir_reg_offset + in syscon_gpio_dir_in()
95 priv->data->dir_bit_offset + offset; in syscon_gpio_dir_in()
97 regmap_update_bits(priv->syscon, in syscon_gpio_dir_in()
109 if (priv->data->flags & GPIO_SYSCON_FEAT_DIR) { in syscon_gpio_dir_out()
112 offs = priv->dir_reg_offset + in syscon_gpio_dir_out()
113 priv->data->dir_bit_offset + offset; in syscon_gpio_dir_out()
115 regmap_update_bits(priv->syscon, in syscon_gpio_dir_out()
121 chip->set(chip, offset, val); in syscon_gpio_dir_out()
127 /* ARM CLPS711X SYSFLG1 Bits 8-10 */
128 .compatible = "cirrus,ep7209-syscon1",
143 offs = priv->dreg_offset + priv->data->dat_bit_offset + offset; in rockchip_gpio_set()
146 ret = regmap_write(priv->syscon, in rockchip_gpio_set()
150 dev_err(chip->parent, "gpio write failed ret(%d)\n", ret); in rockchip_gpio_set()
169 offs = priv->dreg_offset + priv->data->dat_bit_offset + offset; in keystone_gpio_set()
175 priv->syscon, in keystone_gpio_set()
180 dev_err(chip->parent, "gpio write failed ret(%d)\n", ret); in keystone_gpio_set()
184 /* ARM Keystone 2 */
194 .compatible = "cirrus,ep7209-mctrl-gpio",
198 .compatible = "ti,keystone-dsp-gpio",
202 .compatible = "rockchip,rk3328-grf-gpio",
211 struct device *dev = &pdev->dev; in syscon_gpio_probe()
213 struct device_node *np = dev->of_node; in syscon_gpio_probe()
218 return -ENOMEM; in syscon_gpio_probe()
220 priv->data = of_device_get_match_data(dev); in syscon_gpio_probe()
222 if (priv->data->compatible) { in syscon_gpio_probe()
223 priv->syscon = syscon_regmap_lookup_by_compatible( in syscon_gpio_probe()
224 priv->data->compatible); in syscon_gpio_probe()
225 if (IS_ERR(priv->syscon)) in syscon_gpio_probe()
226 return PTR_ERR(priv->syscon); in syscon_gpio_probe()
228 priv->syscon = in syscon_gpio_probe()
229 syscon_regmap_lookup_by_phandle(np, "gpio,syscon-dev"); in syscon_gpio_probe()
230 if (IS_ERR(priv->syscon) && np->parent) in syscon_gpio_probe()
231 priv->syscon = syscon_node_to_regmap(np->parent); in syscon_gpio_probe()
232 if (IS_ERR(priv->syscon)) in syscon_gpio_probe()
233 return PTR_ERR(priv->syscon); in syscon_gpio_probe()
235 ret = of_property_read_u32_index(np, "gpio,syscon-dev", 1, in syscon_gpio_probe()
236 &priv->dreg_offset); in syscon_gpio_probe()
240 priv->dreg_offset <<= 3; in syscon_gpio_probe()
242 ret = of_property_read_u32_index(np, "gpio,syscon-dev", 2, in syscon_gpio_probe()
243 &priv->dir_reg_offset); in syscon_gpio_probe()
247 priv->dir_reg_offset <<= 3; in syscon_gpio_probe()
250 priv->chip.parent = dev; in syscon_gpio_probe()
251 priv->chip.owner = THIS_MODULE; in syscon_gpio_probe()
252 priv->chip.label = dev_name(dev); in syscon_gpio_probe()
253 priv->chip.base = -1; in syscon_gpio_probe()
254 priv->chip.ngpio = priv->data->bit_count; in syscon_gpio_probe()
255 priv->chip.get = syscon_gpio_get; in syscon_gpio_probe()
256 if (priv->data->flags & GPIO_SYSCON_FEAT_IN) in syscon_gpio_probe()
257 priv->chip.direction_input = syscon_gpio_dir_in; in syscon_gpio_probe()
258 if (priv->data->flags & GPIO_SYSCON_FEAT_OUT) { in syscon_gpio_probe()
259 priv->chip.set = priv->data->set ? : syscon_gpio_set; in syscon_gpio_probe()
260 priv->chip.direction_output = syscon_gpio_dir_out; in syscon_gpio_probe()
265 return devm_gpiochip_add_data(&pdev->dev, &priv->chip, priv); in syscon_gpio_probe()
270 .name = "gpio-syscon",
278 MODULE_DESCRIPTION("SYSCON GPIO driver");