diff options
-rw-r--r-- | Documentation/devicetree/bindings/gpio/gpio-dsp-keystone.txt | 39 | ||||
-rw-r--r-- | drivers/gpio/gpio-syscon.c | 35 |
2 files changed, 74 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/gpio/gpio-dsp-keystone.txt b/Documentation/devicetree/bindings/gpio/gpio-dsp-keystone.txt new file mode 100644 index 000000000000..6c7e6c7302f5 --- /dev/null +++ b/Documentation/devicetree/bindings/gpio/gpio-dsp-keystone.txt | |||
@@ -0,0 +1,39 @@ | |||
1 | Keystone 2 DSP GPIO controller bindings | ||
2 | |||
3 | HOST OS userland running on ARM can send interrupts to DSP cores using | ||
4 | the DSP GPIO controller IP. It provides 28 IRQ signals per each DSP core. | ||
5 | This is one of the component used by the IPC mechanism used on Keystone SOCs. | ||
6 | |||
7 | For example TCI6638K2K SoC has 8 DSP GPIO controllers: | ||
8 | - 8 for C66x CorePacx CPUs 0-7 | ||
9 | |||
10 | Keystone 2 DSP GPIO controller has specific features: | ||
11 | - each GPIO can be configured only as output pin; | ||
12 | - setting GPIO value to 1 causes IRQ generation on target DSP core; | ||
13 | - reading pin value returns 0 - if IRQ was handled or 1 - IRQ is still | ||
14 | pending. | ||
15 | |||
16 | Required Properties: | ||
17 | - compatible: should be "ti,keystone-dsp-gpio" | ||
18 | - ti,syscon-dev: phandle/offset pair. The phandle to syscon used to | ||
19 | access device state control registers and the offset of device's specific | ||
20 | registers within device state control registers range. | ||
21 | - gpio-controller: Marks the device node as a gpio controller. | ||
22 | - #gpio-cells: Should be 2. | ||
23 | |||
24 | Please refer to gpio.txt in this directory for details of the common GPIO | ||
25 | bindings used by client devices. | ||
26 | |||
27 | Example: | ||
28 | dspgpio0: keystone_dsp_gpio@02620240 { | ||
29 | compatible = "ti,keystone-dsp-gpio"; | ||
30 | ti,syscon-dev = <&devctrl 0x240>; | ||
31 | gpio-controller; | ||
32 | #gpio-cells = <2>; | ||
33 | }; | ||
34 | |||
35 | dsp0: dsp0 { | ||
36 | compatible = "linux,rproc-user"; | ||
37 | ... | ||
38 | kick-gpio = <&dspgpio0 27>; | ||
39 | }; | ||
diff --git a/drivers/gpio/gpio-syscon.c b/drivers/gpio/gpio-syscon.c index 049391bf80ee..e82fde4b6898 100644 --- a/drivers/gpio/gpio-syscon.c +++ b/drivers/gpio/gpio-syscon.c | |||
@@ -140,11 +140,46 @@ static const struct syscon_gpio_data clps711x_mctrl_gpio = { | |||
140 | .dat_bit_offset = 0x40 * 8 + 8, | 140 | .dat_bit_offset = 0x40 * 8 + 8, |
141 | }; | 141 | }; |
142 | 142 | ||
143 | #define KEYSTONE_LOCK_BIT BIT(0) | ||
144 | |||
145 | static void keystone_gpio_set(struct gpio_chip *chip, unsigned offset, int val) | ||
146 | { | ||
147 | struct syscon_gpio_priv *priv = to_syscon_gpio(chip); | ||
148 | unsigned int offs; | ||
149 | int ret; | ||
150 | |||
151 | offs = priv->dreg_offset + priv->data->dat_bit_offset + offset; | ||
152 | |||
153 | if (!val) | ||
154 | return; | ||
155 | |||
156 | ret = regmap_update_bits( | ||
157 | priv->syscon, | ||
158 | (offs / SYSCON_REG_BITS) * SYSCON_REG_SIZE, | ||
159 | BIT(offs % SYSCON_REG_BITS) | KEYSTONE_LOCK_BIT, | ||
160 | BIT(offs % SYSCON_REG_BITS) | KEYSTONE_LOCK_BIT); | ||
161 | if (ret < 0) | ||
162 | dev_err(chip->dev, "gpio write failed ret(%d)\n", ret); | ||
163 | } | ||
164 | |||
165 | static const struct syscon_gpio_data keystone_dsp_gpio = { | ||
166 | /* ARM Keystone 2 */ | ||
167 | .compatible = NULL, | ||
168 | .flags = GPIO_SYSCON_FEAT_OUT, | ||
169 | .bit_count = 28, | ||
170 | .dat_bit_offset = 4, | ||
171 | .set = keystone_gpio_set, | ||
172 | }; | ||
173 | |||
143 | static const struct of_device_id syscon_gpio_ids[] = { | 174 | static const struct of_device_id syscon_gpio_ids[] = { |
144 | { | 175 | { |
145 | .compatible = "cirrus,clps711x-mctrl-gpio", | 176 | .compatible = "cirrus,clps711x-mctrl-gpio", |
146 | .data = &clps711x_mctrl_gpio, | 177 | .data = &clps711x_mctrl_gpio, |
147 | }, | 178 | }, |
179 | { | ||
180 | .compatible = "ti,keystone-dsp-gpio", | ||
181 | .data = &keystone_dsp_gpio, | ||
182 | }, | ||
148 | { } | 183 | { } |
149 | }; | 184 | }; |
150 | MODULE_DEVICE_TABLE(of, syscon_gpio_ids); | 185 | MODULE_DEVICE_TABLE(of, syscon_gpio_ids); |