Skip to content

Commit aa7e37f

Browse files
dramforeverBartosz Golaszewski
authored andcommitted
gpio: spacemit-k1: Use PDR for pin direction, not SDR/CDR
On the SpacemiT GPIO controller, the direction control register PDR is readable and writable [1]. Therefore, implement direction control by using PDR as dirout, and don't mark it as unreadable. The original implementation, using SDR as dirout and CDR as dirin, is not actually a supported configuration by gpio-mmio. The hardware supports changing the direction of some pins atomically by writing a value with the corresponding bits set to SDR (set as output) or to CDR (set as input). However, gpio-mmio does not actually handle this. Using only PDR as dirout to match the expectations of gpio-mmio. This also allows us to avoid clobbering potentially important GPIO direction configurations set by pre-Linux boot stages. Found while trying to add PCIe support to OrangePi RV2, where the regulator (controlled by GPIO 116) turns off on boot while some other GPIO pin in the same bank is touched, which is not desirable. Link: https://developer.spacemit.com/documentation?token=Rn9Kw3iFHirAMgkIpTAcV2Arnkf#18.4-gpio # [1] Fixes: d005532 ("gpio: spacemit: add support for K1 SoC") Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn> Reviewed-by: Troy Mitchell <troy.mitchell@linux.spacemit.com> Link: https://patch.msgid.link/20260127-gpio-spacemit-k1-pdr-v1-1-bb868a517dbc@iscas.ac.cn Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
1 parent 4c4ff6e commit aa7e37f

1 file changed

Lines changed: 3 additions & 6 deletions

File tree

drivers/gpio/gpio-spacemit-k1.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ static int spacemit_gpio_add_bank(struct spacemit_gpio *sg,
199199
struct gpio_chip *gc = &gb->chip.gc;
200200
struct device *dev = sg->dev;
201201
struct gpio_irq_chip *girq;
202-
void __iomem *dat, *set, *clr, *dirin, *dirout;
202+
void __iomem *dat, *set, *clr, *dirout;
203203
int ret;
204204

205205
gb->base = regs + sg->data->bank_offsets[index];
@@ -208,8 +208,7 @@ static int spacemit_gpio_add_bank(struct spacemit_gpio *sg,
208208
dat = gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GPLR];
209209
set = gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GPSR];
210210
clr = gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GPCR];
211-
dirin = gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GCDR];
212-
dirout = gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GSDR];
211+
dirout = gb->base + to_spacemit_gpio_regs(gb)[SPACEMIT_GPDR];
213212

214213
config = (struct gpio_generic_chip_config) {
215214
.dev = dev,
@@ -218,9 +217,7 @@ static int spacemit_gpio_add_bank(struct spacemit_gpio *sg,
218217
.set = set,
219218
.clr = clr,
220219
.dirout = dirout,
221-
.dirin = dirin,
222-
.flags = GPIO_GENERIC_UNREADABLE_REG_SET |
223-
GPIO_GENERIC_UNREADABLE_REG_DIR,
220+
.flags = GPIO_GENERIC_UNREADABLE_REG_SET,
224221
};
225222

226223
/* This registers 32 GPIO lines per bank */

0 commit comments

Comments
 (0)