xref: /openbmc/linux/drivers/soc/fsl/qe/gpio.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
27aa1aa6eSZhao Qiang /*
37aa1aa6eSZhao Qiang  * QUICC Engine GPIOs
47aa1aa6eSZhao Qiang  *
57aa1aa6eSZhao Qiang  * Copyright (c) MontaVista Software, Inc. 2008.
67aa1aa6eSZhao Qiang  *
77aa1aa6eSZhao Qiang  * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
87aa1aa6eSZhao Qiang  */
97aa1aa6eSZhao Qiang 
107aa1aa6eSZhao Qiang #include <linux/kernel.h>
117aa1aa6eSZhao Qiang #include <linux/init.h>
127aa1aa6eSZhao Qiang #include <linux/spinlock.h>
137aa1aa6eSZhao Qiang #include <linux/err.h>
147aa1aa6eSZhao Qiang #include <linux/io.h>
157aa1aa6eSZhao Qiang #include <linux/of.h>
16*a99cc668SArnd Bergmann #include <linux/gpio/legacy-of-mm-gpiochip.h>
1784582f9eSLinus Walleij #include <linux/gpio/consumer.h>
181e714e54SLinus Walleij #include <linux/gpio/driver.h>
197aa1aa6eSZhao Qiang #include <linux/slab.h>
207aa1aa6eSZhao Qiang #include <linux/export.h>
21c9eb6e54SAndy Shevchenko #include <linux/property.h>
22c9eb6e54SAndy Shevchenko 
237aa1aa6eSZhao Qiang #include <soc/fsl/qe/qe.h>
247aa1aa6eSZhao Qiang 
257aa1aa6eSZhao Qiang struct qe_gpio_chip {
267aa1aa6eSZhao Qiang 	struct of_mm_gpio_chip mm_gc;
277aa1aa6eSZhao Qiang 	spinlock_t lock;
287aa1aa6eSZhao Qiang 
297aa1aa6eSZhao Qiang 	/* shadowed data register to clear/set bits safely */
307aa1aa6eSZhao Qiang 	u32 cpdata;
317aa1aa6eSZhao Qiang 
327aa1aa6eSZhao Qiang 	/* saved_regs used to restore dedicated functions */
337aa1aa6eSZhao Qiang 	struct qe_pio_regs saved_regs;
347aa1aa6eSZhao Qiang };
357aa1aa6eSZhao Qiang 
qe_gpio_save_regs(struct of_mm_gpio_chip * mm_gc)367aa1aa6eSZhao Qiang static void qe_gpio_save_regs(struct of_mm_gpio_chip *mm_gc)
377aa1aa6eSZhao Qiang {
385dc6f3feSChristophe Leroy 	struct qe_gpio_chip *qe_gc =
395dc6f3feSChristophe Leroy 		container_of(mm_gc, struct qe_gpio_chip, mm_gc);
407aa1aa6eSZhao Qiang 	struct qe_pio_regs __iomem *regs = mm_gc->regs;
417aa1aa6eSZhao Qiang 
423f39f38eSChristophe Leroy 	qe_gc->cpdata = ioread32be(&regs->cpdata);
437aa1aa6eSZhao Qiang 	qe_gc->saved_regs.cpdata = qe_gc->cpdata;
443f39f38eSChristophe Leroy 	qe_gc->saved_regs.cpdir1 = ioread32be(&regs->cpdir1);
453f39f38eSChristophe Leroy 	qe_gc->saved_regs.cpdir2 = ioread32be(&regs->cpdir2);
463f39f38eSChristophe Leroy 	qe_gc->saved_regs.cppar1 = ioread32be(&regs->cppar1);
473f39f38eSChristophe Leroy 	qe_gc->saved_regs.cppar2 = ioread32be(&regs->cppar2);
483f39f38eSChristophe Leroy 	qe_gc->saved_regs.cpodr = ioread32be(&regs->cpodr);
497aa1aa6eSZhao Qiang }
507aa1aa6eSZhao Qiang 
qe_gpio_get(struct gpio_chip * gc,unsigned int gpio)517aa1aa6eSZhao Qiang static int qe_gpio_get(struct gpio_chip *gc, unsigned int gpio)
527aa1aa6eSZhao Qiang {
537aa1aa6eSZhao Qiang 	struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
547aa1aa6eSZhao Qiang 	struct qe_pio_regs __iomem *regs = mm_gc->regs;
557aa1aa6eSZhao Qiang 	u32 pin_mask = 1 << (QE_PIO_PINS - 1 - gpio);
567aa1aa6eSZhao Qiang 
573f39f38eSChristophe Leroy 	return !!(ioread32be(&regs->cpdata) & pin_mask);
587aa1aa6eSZhao Qiang }
597aa1aa6eSZhao Qiang 
qe_gpio_set(struct gpio_chip * gc,unsigned int gpio,int val)607aa1aa6eSZhao Qiang static void qe_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
617aa1aa6eSZhao Qiang {
627aa1aa6eSZhao Qiang 	struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
631e714e54SLinus Walleij 	struct qe_gpio_chip *qe_gc = gpiochip_get_data(gc);
647aa1aa6eSZhao Qiang 	struct qe_pio_regs __iomem *regs = mm_gc->regs;
657aa1aa6eSZhao Qiang 	unsigned long flags;
667aa1aa6eSZhao Qiang 	u32 pin_mask = 1 << (QE_PIO_PINS - 1 - gpio);
677aa1aa6eSZhao Qiang 
687aa1aa6eSZhao Qiang 	spin_lock_irqsave(&qe_gc->lock, flags);
697aa1aa6eSZhao Qiang 
707aa1aa6eSZhao Qiang 	if (val)
717aa1aa6eSZhao Qiang 		qe_gc->cpdata |= pin_mask;
727aa1aa6eSZhao Qiang 	else
737aa1aa6eSZhao Qiang 		qe_gc->cpdata &= ~pin_mask;
747aa1aa6eSZhao Qiang 
753f39f38eSChristophe Leroy 	iowrite32be(qe_gc->cpdata, &regs->cpdata);
767aa1aa6eSZhao Qiang 
777aa1aa6eSZhao Qiang 	spin_unlock_irqrestore(&qe_gc->lock, flags);
787aa1aa6eSZhao Qiang }
797aa1aa6eSZhao Qiang 
qe_gpio_set_multiple(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits)801c0b7df5SJoakim Tjernlund static void qe_gpio_set_multiple(struct gpio_chip *gc,
811c0b7df5SJoakim Tjernlund 				 unsigned long *mask, unsigned long *bits)
821c0b7df5SJoakim Tjernlund {
831c0b7df5SJoakim Tjernlund 	struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
841c0b7df5SJoakim Tjernlund 	struct qe_gpio_chip *qe_gc = gpiochip_get_data(gc);
851c0b7df5SJoakim Tjernlund 	struct qe_pio_regs __iomem *regs = mm_gc->regs;
861c0b7df5SJoakim Tjernlund 	unsigned long flags;
871c0b7df5SJoakim Tjernlund 	int i;
881c0b7df5SJoakim Tjernlund 
891c0b7df5SJoakim Tjernlund 	spin_lock_irqsave(&qe_gc->lock, flags);
901c0b7df5SJoakim Tjernlund 
911c0b7df5SJoakim Tjernlund 	for (i = 0; i < gc->ngpio; i++) {
921c0b7df5SJoakim Tjernlund 		if (*mask == 0)
931c0b7df5SJoakim Tjernlund 			break;
941c0b7df5SJoakim Tjernlund 		if (__test_and_clear_bit(i, mask)) {
951c0b7df5SJoakim Tjernlund 			if (test_bit(i, bits))
961c0b7df5SJoakim Tjernlund 				qe_gc->cpdata |= (1U << (QE_PIO_PINS - 1 - i));
971c0b7df5SJoakim Tjernlund 			else
981c0b7df5SJoakim Tjernlund 				qe_gc->cpdata &= ~(1U << (QE_PIO_PINS - 1 - i));
991c0b7df5SJoakim Tjernlund 		}
1001c0b7df5SJoakim Tjernlund 	}
1011c0b7df5SJoakim Tjernlund 
1023f39f38eSChristophe Leroy 	iowrite32be(qe_gc->cpdata, &regs->cpdata);
1031c0b7df5SJoakim Tjernlund 
1041c0b7df5SJoakim Tjernlund 	spin_unlock_irqrestore(&qe_gc->lock, flags);
1051c0b7df5SJoakim Tjernlund }
1061c0b7df5SJoakim Tjernlund 
qe_gpio_dir_in(struct gpio_chip * gc,unsigned int gpio)1077aa1aa6eSZhao Qiang static int qe_gpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
1087aa1aa6eSZhao Qiang {
1097aa1aa6eSZhao Qiang 	struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
1101e714e54SLinus Walleij 	struct qe_gpio_chip *qe_gc = gpiochip_get_data(gc);
1117aa1aa6eSZhao Qiang 	unsigned long flags;
1127aa1aa6eSZhao Qiang 
1137aa1aa6eSZhao Qiang 	spin_lock_irqsave(&qe_gc->lock, flags);
1147aa1aa6eSZhao Qiang 
1157aa1aa6eSZhao Qiang 	__par_io_config_pin(mm_gc->regs, gpio, QE_PIO_DIR_IN, 0, 0, 0);
1167aa1aa6eSZhao Qiang 
1177aa1aa6eSZhao Qiang 	spin_unlock_irqrestore(&qe_gc->lock, flags);
1187aa1aa6eSZhao Qiang 
1197aa1aa6eSZhao Qiang 	return 0;
1207aa1aa6eSZhao Qiang }
1217aa1aa6eSZhao Qiang 
qe_gpio_dir_out(struct gpio_chip * gc,unsigned int gpio,int val)1227aa1aa6eSZhao Qiang static int qe_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
1237aa1aa6eSZhao Qiang {
1247aa1aa6eSZhao Qiang 	struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
1251e714e54SLinus Walleij 	struct qe_gpio_chip *qe_gc = gpiochip_get_data(gc);
1267aa1aa6eSZhao Qiang 	unsigned long flags;
1277aa1aa6eSZhao Qiang 
1287aa1aa6eSZhao Qiang 	qe_gpio_set(gc, gpio, val);
1297aa1aa6eSZhao Qiang 
1307aa1aa6eSZhao Qiang 	spin_lock_irqsave(&qe_gc->lock, flags);
1317aa1aa6eSZhao Qiang 
1327aa1aa6eSZhao Qiang 	__par_io_config_pin(mm_gc->regs, gpio, QE_PIO_DIR_OUT, 0, 0, 0);
1337aa1aa6eSZhao Qiang 
1347aa1aa6eSZhao Qiang 	spin_unlock_irqrestore(&qe_gc->lock, flags);
1357aa1aa6eSZhao Qiang 
1367aa1aa6eSZhao Qiang 	return 0;
1377aa1aa6eSZhao Qiang }
1387aa1aa6eSZhao Qiang 
1397aa1aa6eSZhao Qiang struct qe_pin {
1407aa1aa6eSZhao Qiang 	/*
1417aa1aa6eSZhao Qiang 	 * The qe_gpio_chip name is unfortunate, we should change that to
1427aa1aa6eSZhao Qiang 	 * something like qe_pio_controller. Someday.
1437aa1aa6eSZhao Qiang 	 */
1447aa1aa6eSZhao Qiang 	struct qe_gpio_chip *controller;
1457aa1aa6eSZhao Qiang 	int num;
1467aa1aa6eSZhao Qiang };
1477aa1aa6eSZhao Qiang 
1487aa1aa6eSZhao Qiang /**
1497aa1aa6eSZhao Qiang  * qe_pin_request - Request a QE pin
15066310b5aSDmitry Torokhov  * @dev:	device to get the pin from
15166310b5aSDmitry Torokhov  * @index:	index of the pin in the device tree
1527aa1aa6eSZhao Qiang  * Context:	non-atomic
1537aa1aa6eSZhao Qiang  *
1547aa1aa6eSZhao Qiang  * This function return qe_pin so that you could use it with the rest of
1557aa1aa6eSZhao Qiang  * the QE Pin Multiplexing API.
1567aa1aa6eSZhao Qiang  */
qe_pin_request(struct device * dev,int index)15766310b5aSDmitry Torokhov struct qe_pin *qe_pin_request(struct device *dev, int index)
1587aa1aa6eSZhao Qiang {
1597aa1aa6eSZhao Qiang 	struct qe_pin *qe_pin;
1607aa1aa6eSZhao Qiang 	struct gpio_chip *gc;
16184582f9eSLinus Walleij 	struct gpio_desc *gpiod;
16266310b5aSDmitry Torokhov 	int gpio_num;
1637aa1aa6eSZhao Qiang 	int err;
1647aa1aa6eSZhao Qiang 
1657aa1aa6eSZhao Qiang 	qe_pin = kzalloc(sizeof(*qe_pin), GFP_KERNEL);
1667aa1aa6eSZhao Qiang 	if (!qe_pin) {
16766310b5aSDmitry Torokhov 		dev_dbg(dev, "%s: can't allocate memory\n", __func__);
1687aa1aa6eSZhao Qiang 		return ERR_PTR(-ENOMEM);
1697aa1aa6eSZhao Qiang 	}
1707aa1aa6eSZhao Qiang 
17166310b5aSDmitry Torokhov 	/*
17266310b5aSDmitry Torokhov 	 * Request gpio as nonexclusive as it was likely reserved by the
17366310b5aSDmitry Torokhov 	 * caller, and we are not planning on controlling it, we only need
17466310b5aSDmitry Torokhov 	 * the descriptor to the to the gpio chip structure.
17566310b5aSDmitry Torokhov 	 */
17666310b5aSDmitry Torokhov 	gpiod = gpiod_get_index(dev, NULL, index,
17766310b5aSDmitry Torokhov 			        GPIOD_ASIS | GPIOD_FLAGS_BIT_NONEXCLUSIVE);
17866310b5aSDmitry Torokhov 	err = PTR_ERR_OR_ZERO(gpiod);
17966310b5aSDmitry Torokhov 	if (err)
1807aa1aa6eSZhao Qiang 		goto err0;
18166310b5aSDmitry Torokhov 
18284582f9eSLinus Walleij 	gc = gpiod_to_chip(gpiod);
18366310b5aSDmitry Torokhov 	gpio_num = desc_to_gpio(gpiod);
18466310b5aSDmitry Torokhov 	/* We no longer need this descriptor */
18566310b5aSDmitry Torokhov 	gpiod_put(gpiod);
18666310b5aSDmitry Torokhov 
1875674a92cSDan Carpenter 	if (WARN_ON(!gc)) {
1885674a92cSDan Carpenter 		err = -ENODEV;
1897aa1aa6eSZhao Qiang 		goto err0;
1905674a92cSDan Carpenter 	}
19166310b5aSDmitry Torokhov 
19284582f9eSLinus Walleij 	qe_pin->controller = gpiochip_get_data(gc);
19384582f9eSLinus Walleij 	/*
19484582f9eSLinus Walleij 	 * FIXME: this gets the local offset on the gpio_chip so that the driver
19584582f9eSLinus Walleij 	 * can manipulate pin control settings through its custom API. The real
19684582f9eSLinus Walleij 	 * solution is to create a real pin control driver for this.
19784582f9eSLinus Walleij 	 */
19866310b5aSDmitry Torokhov 	qe_pin->num = gpio_num - gc->base;
1997aa1aa6eSZhao Qiang 
200c9eb6e54SAndy Shevchenko 	if (!fwnode_device_is_compatible(gc->fwnode, "fsl,mpc8323-qe-pario-bank")) {
20166310b5aSDmitry Torokhov 		dev_dbg(dev, "%s: tried to get a non-qe pin\n", __func__);
2027aa1aa6eSZhao Qiang 		err = -EINVAL;
2037aa1aa6eSZhao Qiang 		goto err0;
2047aa1aa6eSZhao Qiang 	}
2057aa1aa6eSZhao Qiang 	return qe_pin;
2067aa1aa6eSZhao Qiang err0:
2077aa1aa6eSZhao Qiang 	kfree(qe_pin);
20866310b5aSDmitry Torokhov 	dev_dbg(dev, "%s failed with status %d\n", __func__, err);
2097aa1aa6eSZhao Qiang 	return ERR_PTR(err);
2107aa1aa6eSZhao Qiang }
2117aa1aa6eSZhao Qiang EXPORT_SYMBOL(qe_pin_request);
2127aa1aa6eSZhao Qiang 
2137aa1aa6eSZhao Qiang /**
2147aa1aa6eSZhao Qiang  * qe_pin_free - Free a pin
2157aa1aa6eSZhao Qiang  * @qe_pin:	pointer to the qe_pin structure
2167aa1aa6eSZhao Qiang  * Context:	any
2177aa1aa6eSZhao Qiang  *
2187aa1aa6eSZhao Qiang  * This function frees the qe_pin structure and makes a pin available
2197aa1aa6eSZhao Qiang  * for further qe_pin_request() calls.
2207aa1aa6eSZhao Qiang  */
qe_pin_free(struct qe_pin * qe_pin)2217aa1aa6eSZhao Qiang void qe_pin_free(struct qe_pin *qe_pin)
2227aa1aa6eSZhao Qiang {
2237aa1aa6eSZhao Qiang 	kfree(qe_pin);
2247aa1aa6eSZhao Qiang }
2257aa1aa6eSZhao Qiang EXPORT_SYMBOL(qe_pin_free);
2267aa1aa6eSZhao Qiang 
2277aa1aa6eSZhao Qiang /**
2287aa1aa6eSZhao Qiang  * qe_pin_set_dedicated - Revert a pin to a dedicated peripheral function mode
2297aa1aa6eSZhao Qiang  * @qe_pin:	pointer to the qe_pin structure
2307aa1aa6eSZhao Qiang  * Context:	any
2317aa1aa6eSZhao Qiang  *
2327aa1aa6eSZhao Qiang  * This function resets a pin to a dedicated peripheral function that
2337aa1aa6eSZhao Qiang  * has been set up by the firmware.
2347aa1aa6eSZhao Qiang  */
qe_pin_set_dedicated(struct qe_pin * qe_pin)2357aa1aa6eSZhao Qiang void qe_pin_set_dedicated(struct qe_pin *qe_pin)
2367aa1aa6eSZhao Qiang {
2377aa1aa6eSZhao Qiang 	struct qe_gpio_chip *qe_gc = qe_pin->controller;
2387aa1aa6eSZhao Qiang 	struct qe_pio_regs __iomem *regs = qe_gc->mm_gc.regs;
2397aa1aa6eSZhao Qiang 	struct qe_pio_regs *sregs = &qe_gc->saved_regs;
2407aa1aa6eSZhao Qiang 	int pin = qe_pin->num;
2417aa1aa6eSZhao Qiang 	u32 mask1 = 1 << (QE_PIO_PINS - (pin + 1));
2427aa1aa6eSZhao Qiang 	u32 mask2 = 0x3 << (QE_PIO_PINS - (pin % (QE_PIO_PINS / 2) + 1) * 2);
2437aa1aa6eSZhao Qiang 	bool second_reg = pin > (QE_PIO_PINS / 2) - 1;
2447aa1aa6eSZhao Qiang 	unsigned long flags;
2457aa1aa6eSZhao Qiang 
2467aa1aa6eSZhao Qiang 	spin_lock_irqsave(&qe_gc->lock, flags);
2477aa1aa6eSZhao Qiang 
2487aa1aa6eSZhao Qiang 	if (second_reg) {
24977d7676aSRasmus Villemoes 		qe_clrsetbits_be32(&regs->cpdir2, mask2,
25077d7676aSRasmus Villemoes 				   sregs->cpdir2 & mask2);
25177d7676aSRasmus Villemoes 		qe_clrsetbits_be32(&regs->cppar2, mask2,
25277d7676aSRasmus Villemoes 				   sregs->cppar2 & mask2);
2537aa1aa6eSZhao Qiang 	} else {
25477d7676aSRasmus Villemoes 		qe_clrsetbits_be32(&regs->cpdir1, mask2,
25577d7676aSRasmus Villemoes 				   sregs->cpdir1 & mask2);
25677d7676aSRasmus Villemoes 		qe_clrsetbits_be32(&regs->cppar1, mask2,
25777d7676aSRasmus Villemoes 				   sregs->cppar1 & mask2);
2587aa1aa6eSZhao Qiang 	}
2597aa1aa6eSZhao Qiang 
2607aa1aa6eSZhao Qiang 	if (sregs->cpdata & mask1)
2617aa1aa6eSZhao Qiang 		qe_gc->cpdata |= mask1;
2627aa1aa6eSZhao Qiang 	else
2637aa1aa6eSZhao Qiang 		qe_gc->cpdata &= ~mask1;
2647aa1aa6eSZhao Qiang 
2653f39f38eSChristophe Leroy 	iowrite32be(qe_gc->cpdata, &regs->cpdata);
26677d7676aSRasmus Villemoes 	qe_clrsetbits_be32(&regs->cpodr, mask1, sregs->cpodr & mask1);
2677aa1aa6eSZhao Qiang 
2687aa1aa6eSZhao Qiang 	spin_unlock_irqrestore(&qe_gc->lock, flags);
2697aa1aa6eSZhao Qiang }
2707aa1aa6eSZhao Qiang EXPORT_SYMBOL(qe_pin_set_dedicated);
2717aa1aa6eSZhao Qiang 
2727aa1aa6eSZhao Qiang /**
2737aa1aa6eSZhao Qiang  * qe_pin_set_gpio - Set a pin to the GPIO mode
2747aa1aa6eSZhao Qiang  * @qe_pin:	pointer to the qe_pin structure
2757aa1aa6eSZhao Qiang  * Context:	any
2767aa1aa6eSZhao Qiang  *
2777aa1aa6eSZhao Qiang  * This function sets a pin to the GPIO mode.
2787aa1aa6eSZhao Qiang  */
qe_pin_set_gpio(struct qe_pin * qe_pin)2797aa1aa6eSZhao Qiang void qe_pin_set_gpio(struct qe_pin *qe_pin)
2807aa1aa6eSZhao Qiang {
2817aa1aa6eSZhao Qiang 	struct qe_gpio_chip *qe_gc = qe_pin->controller;
2827aa1aa6eSZhao Qiang 	struct qe_pio_regs __iomem *regs = qe_gc->mm_gc.regs;
2837aa1aa6eSZhao Qiang 	unsigned long flags;
2847aa1aa6eSZhao Qiang 
2857aa1aa6eSZhao Qiang 	spin_lock_irqsave(&qe_gc->lock, flags);
2867aa1aa6eSZhao Qiang 
2877aa1aa6eSZhao Qiang 	/* Let's make it input by default, GPIO API is able to change that. */
2887aa1aa6eSZhao Qiang 	__par_io_config_pin(regs, qe_pin->num, QE_PIO_DIR_IN, 0, 0, 0);
2897aa1aa6eSZhao Qiang 
2907aa1aa6eSZhao Qiang 	spin_unlock_irqrestore(&qe_gc->lock, flags);
2917aa1aa6eSZhao Qiang }
2927aa1aa6eSZhao Qiang EXPORT_SYMBOL(qe_pin_set_gpio);
2937aa1aa6eSZhao Qiang 
qe_add_gpiochips(void)2947aa1aa6eSZhao Qiang static int __init qe_add_gpiochips(void)
2957aa1aa6eSZhao Qiang {
2967aa1aa6eSZhao Qiang 	struct device_node *np;
2977aa1aa6eSZhao Qiang 
2987aa1aa6eSZhao Qiang 	for_each_compatible_node(np, NULL, "fsl,mpc8323-qe-pario-bank") {
2997aa1aa6eSZhao Qiang 		int ret;
3007aa1aa6eSZhao Qiang 		struct qe_gpio_chip *qe_gc;
3017aa1aa6eSZhao Qiang 		struct of_mm_gpio_chip *mm_gc;
3027aa1aa6eSZhao Qiang 		struct gpio_chip *gc;
3037aa1aa6eSZhao Qiang 
3047aa1aa6eSZhao Qiang 		qe_gc = kzalloc(sizeof(*qe_gc), GFP_KERNEL);
3057aa1aa6eSZhao Qiang 		if (!qe_gc) {
3067aa1aa6eSZhao Qiang 			ret = -ENOMEM;
3077aa1aa6eSZhao Qiang 			goto err;
3087aa1aa6eSZhao Qiang 		}
3097aa1aa6eSZhao Qiang 
3107aa1aa6eSZhao Qiang 		spin_lock_init(&qe_gc->lock);
3117aa1aa6eSZhao Qiang 
3127aa1aa6eSZhao Qiang 		mm_gc = &qe_gc->mm_gc;
3137aa1aa6eSZhao Qiang 		gc = &mm_gc->gc;
3147aa1aa6eSZhao Qiang 
3157aa1aa6eSZhao Qiang 		mm_gc->save_regs = qe_gpio_save_regs;
3167aa1aa6eSZhao Qiang 		gc->ngpio = QE_PIO_PINS;
3177aa1aa6eSZhao Qiang 		gc->direction_input = qe_gpio_dir_in;
3187aa1aa6eSZhao Qiang 		gc->direction_output = qe_gpio_dir_out;
3197aa1aa6eSZhao Qiang 		gc->get = qe_gpio_get;
3207aa1aa6eSZhao Qiang 		gc->set = qe_gpio_set;
3211c0b7df5SJoakim Tjernlund 		gc->set_multiple = qe_gpio_set_multiple;
3227aa1aa6eSZhao Qiang 
3231e714e54SLinus Walleij 		ret = of_mm_gpiochip_add_data(np, mm_gc, qe_gc);
3247aa1aa6eSZhao Qiang 		if (ret)
3257aa1aa6eSZhao Qiang 			goto err;
3267aa1aa6eSZhao Qiang 		continue;
3277aa1aa6eSZhao Qiang err:
32837c342cbSRob Herring 		pr_err("%pOF: registration failed with status %d\n",
32937c342cbSRob Herring 		       np, ret);
3307aa1aa6eSZhao Qiang 		kfree(qe_gc);
3317aa1aa6eSZhao Qiang 		/* try others anyway */
3327aa1aa6eSZhao Qiang 	}
3337aa1aa6eSZhao Qiang 	return 0;
3347aa1aa6eSZhao Qiang }
3357aa1aa6eSZhao Qiang arch_initcall(qe_add_gpiochips);
336