mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
FSL SOC Changes for 7.4
Freescale QUICC Engine: - Fix sparse warnings in GPIO - Drop GPIOD_FLAGS_BIT_NONEXCLUSIVE Freescale CPM1 Timeslot Assigner: - Fix clock leak in tsa_of_parse_tdms() Data Path I/O: - Free the IRQ before releasing the I/O object - Fix cleanup on IRQ registration failure Freescale Management Complex: - Annotate fsl_mc_io.portal_virt_addr with __counted_by_ptr - Drop the fwnode links of the dpmacs nodes - Register the object drivers after misc_class exists - Set dma_mask for the DPRC devices - Fix repeated word 'for' in comment -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQTH/wu6mIr0ZW+Vui/dkHAmvKvPUwUCasixSQAKCRDdkHAmvKvP U36hAP9gZyTjp74b82uGFk3EmyViEc6iw/KLftHhhAdhxU5bqwEA8GeEIAvUGW2Y NikRLKJNyuN/eb8LcMYAYXlGRV/yewQ= =zedV -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEo6/YBQwIrVS28WGKmmx57+YAGNkFAmrOSXMACgkQmmx57+YA GNnGiQ//VqQogkRie9tmV4wO1682671AKcPUJVWL5INuL4ZEZm45PU2WG6OFnTBY t16LS3ACjFWF4930uM/meGM40qEMIxjn8QBzfzYHypUyjAii2RPt6r1RwgFkQObb vPwu7tmmLTjHboLWGmjJImTWCOSm1mRhX3jJ/ZR6NzeaEGM16lbc1DsNnIYMla1/ 06xzmgRZUZ4snTmvetTc1i+kDph5nlDC7OmyYE2umt3Qc8qhV4gysXtVx8R9c187 wal7pxwtq1Auuv5rTW3G8amFOOUDPX3l+0JorP23dOusnBST61V6WQC28RYzfSOw WBkFehix/97zVAE+lxWVigwIelOoVLCKmWCpy3iEHB0vimIq2PtJ6wIXw3ArjkEP mO44flpAe5dO4+VeZiihfX5g/0ozdPSk2Ndknol9ePdsoHaKNR0PhkFAJrr4/Fz6 nFNCDaxdYto/Vt4pEvbdCzXNwjSCP4/fqtbiSj8oek0TJGx8jKQ+98yK17S/O3zS 3Ar/JIVpCw0RToqdPJ+rBVnMvN2WoX8UW9+BwPQxuSdVNsqQPWSLKx7UzYsRRjbF tzAlsNGK2bUzzIiWQlgZ/XNNCoJqyDTP0Oiu32A6BURYvVAS1ctg3oxZBYcMHgW/ IggcUw1W6WxLeLGvtp7OaUdjV9CsgEfpIGJ8VkE/0xE3RBZc/kU= =AvUU -----END PGP SIGNATURE----- Merge tag 'soc_fsl-7.4-1' of https://git.kernel.org/pub/scm/linux/kernel/git/chleroy/linux into soc/drivers FSL SOC Changes for 7.4 Freescale QUICC Engine: - Fix sparse warnings in GPIO - Drop GPIOD_FLAGS_BIT_NONEXCLUSIVE Freescale CPM1 Timeslot Assigner: - Fix clock leak in tsa_of_parse_tdms() Data Path I/O: - Free the IRQ before releasing the I/O object - Fix cleanup on IRQ registration failure Freescale Management Complex: - Annotate fsl_mc_io.portal_virt_addr with __counted_by_ptr - Drop the fwnode links of the dpmacs nodes - Register the object drivers after misc_class exists - Set dma_mask for the DPRC devices - Fix repeated word 'for' in comment * tag 'soc_fsl-7.4-1' of https://git.kernel.org/pub/scm/linux/kernel/git/chleroy/linux: soc: fsl: dpio: Free the IRQ before releasing the I/O object soc: fsl: dpio: Fix cleanup on IRQ registration failure bus: fsl-mc: Annotate fsl_mc_io.portal_virt_addr with __counted_by_ptr bus: fsl-mc: drop the fwnode links of the dpmacs nodes soc: fsl: cpm1: tsa: Fix clock leak in tsa_of_parse_tdms() soc: fsl: qe: drop GPIOD_FLAGS_BIT_NONEXCLUSIVE bus: fsl-mc: register the object drivers after misc_class exists bus: fsl-mc: set dma_mask for the DPRC devices bus: fsl-mc: fix repeated word 'for' in comment soc: fsl: qe: Fix sparse warnings in GPIO Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
3e71e98068
|
|
@ -11,6 +11,7 @@
|
|||
#define pr_fmt(fmt) "fsl-mc: " fmt
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/fwnode.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/ioport.h>
|
||||
|
|
@ -797,6 +798,10 @@ int fsl_mc_device_add(struct fsl_mc_obj_desc *obj_desc,
|
|||
}
|
||||
dev_set_name(&mc_dev->dev, "%s.%d", obj_desc->type, obj_desc->id);
|
||||
|
||||
mc_dev->dma_mask = FSL_MC_DEFAULT_DMA_MASK;
|
||||
mc_dev->dev.dma_mask = &mc_dev->dma_mask;
|
||||
mc_dev->dev.coherent_dma_mask = mc_dev->dma_mask;
|
||||
|
||||
if (strcmp(obj_desc->type, "dprc") == 0) {
|
||||
struct fsl_mc_io *mc_io2;
|
||||
|
||||
|
|
@ -838,9 +843,6 @@ int fsl_mc_device_add(struct fsl_mc_obj_desc *obj_desc,
|
|||
* parent's ICID.
|
||||
*/
|
||||
mc_dev->icid = parent_mc_dev->icid;
|
||||
mc_dev->dma_mask = FSL_MC_DEFAULT_DMA_MASK;
|
||||
mc_dev->dev.dma_mask = &mc_dev->dma_mask;
|
||||
mc_dev->dev.coherent_dma_mask = mc_dev->dma_mask;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1032,6 +1034,20 @@ static int fsl_mc_firmware_check(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void fsl_mc_purge_dpmac_fwnode_links(struct device *dev)
|
||||
{
|
||||
struct device_node *dpmacs, *child;
|
||||
|
||||
dpmacs = of_get_child_by_name(dev->of_node, "dpmacs");
|
||||
if (!dpmacs)
|
||||
return;
|
||||
|
||||
for_each_child_of_node(dpmacs, child)
|
||||
fwnode_links_purge(of_fwnode_handle(child));
|
||||
|
||||
of_node_put(dpmacs);
|
||||
}
|
||||
|
||||
/*
|
||||
* fsl_mc_bus_probe - callback invoked when the root MC bus is being
|
||||
* added
|
||||
|
|
@ -1133,6 +1149,8 @@ static int fsl_mc_bus_probe(struct platform_device *pdev)
|
|||
&mc->num_translation_ranges);
|
||||
if (error < 0)
|
||||
goto error_cleanup_mc_io;
|
||||
|
||||
fsl_mc_purge_dpmac_fwnode_links(&pdev->dev);
|
||||
}
|
||||
|
||||
error = dprc_get_container_id(mc_io, 0, &container_id);
|
||||
|
|
@ -1264,35 +1282,43 @@ static int __init fsl_mc_bus_driver_init(void)
|
|||
error = bus_register(&fsl_mc_bus_type);
|
||||
if (error < 0) {
|
||||
pr_err("bus type registration failed: %d\n", error);
|
||||
goto error_cleanup_cache;
|
||||
return error;
|
||||
}
|
||||
|
||||
error = platform_driver_register(&fsl_mc_bus_driver);
|
||||
if (error < 0) {
|
||||
pr_err("platform_driver_register() failed: %d\n", error);
|
||||
error = bus_register_notifier(&platform_bus_type, &fsl_mc_nb);
|
||||
if (error < 0)
|
||||
goto error_cleanup_bus;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error_cleanup_bus:
|
||||
bus_unregister(&fsl_mc_bus_type);
|
||||
return error;
|
||||
}
|
||||
postcore_initcall(fsl_mc_bus_driver_init);
|
||||
|
||||
static int __init fsl_mc_bus_drivers_init(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = dprc_driver_init();
|
||||
if (error < 0)
|
||||
goto error_cleanup_driver;
|
||||
return error;
|
||||
|
||||
error = fsl_mc_allocator_driver_init();
|
||||
if (error < 0)
|
||||
goto error_cleanup_dprc_driver;
|
||||
|
||||
return bus_register_notifier(&platform_bus_type, &fsl_mc_nb);
|
||||
error = platform_driver_register(&fsl_mc_bus_driver);
|
||||
if (error < 0) {
|
||||
pr_err("platform_driver_register() failed: %d\n", error);
|
||||
goto error_cleanup_dprc_driver;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error_cleanup_dprc_driver:
|
||||
dprc_driver_exit();
|
||||
|
||||
error_cleanup_driver:
|
||||
platform_driver_unregister(&fsl_mc_bus_driver);
|
||||
|
||||
error_cleanup_bus:
|
||||
bus_unregister(&fsl_mc_bus_type);
|
||||
|
||||
error_cleanup_cache:
|
||||
return error;
|
||||
}
|
||||
postcore_initcall(fsl_mc_bus_driver_init);
|
||||
subsys_initcall_sync(fsl_mc_bus_drivers_init);
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ static void fsl_mc_write_msi_msg(struct msi_desc *msi_desc, struct msi_msg *msg)
|
|||
}
|
||||
} else {
|
||||
/*
|
||||
* IRQ is for for a child device of mc_bus_dev
|
||||
* IRQ is for a child device of mc_bus_dev
|
||||
*/
|
||||
error = dprc_set_obj_irq(mc_bus_dev->mc_io,
|
||||
MC_CMD_FLAG_INTR_DIS | MC_CMD_FLAG_PRI,
|
||||
|
|
|
|||
|
|
@ -88,6 +88,7 @@ static void unregister_dpio_irq_handlers(struct fsl_mc_device *dpio_dev)
|
|||
|
||||
/* clear the affinity hint */
|
||||
irq_set_affinity_hint(irq->virq, NULL);
|
||||
devm_free_irq(&dpio_dev->dev, irq->virq, &dpio_dev->dev);
|
||||
}
|
||||
|
||||
static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)
|
||||
|
|
@ -244,9 +245,9 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)
|
|||
|
||||
return 0;
|
||||
|
||||
err_dpaa2_io_create:
|
||||
unregister_dpio_irq_handlers(dpio_dev);
|
||||
err_register_dpio_irq:
|
||||
dpaa2_io_down(priv->io);
|
||||
err_dpaa2_io_create:
|
||||
fsl_mc_free_irqs(dpio_dev);
|
||||
err_allocate_irqs:
|
||||
dpio_disable(dpio_dev->mc_io, 0, dpio_dev->mc_handle);
|
||||
|
|
@ -276,10 +277,10 @@ static void dpaa2_dpio_remove(struct fsl_mc_device *dpio_dev)
|
|||
priv = dev_get_drvdata(dev);
|
||||
cpu = dpaa2_io_get_cpu(priv->io);
|
||||
|
||||
dpaa2_io_down(priv->io);
|
||||
|
||||
dpio_teardown_irqs(dpio_dev);
|
||||
|
||||
dpaa2_io_down(priv->io);
|
||||
|
||||
cpumask_set_cpu(cpu, cpus_unused_mask);
|
||||
|
||||
err = dpio_open(dpio_dev->mc_io, 0, dpio_dev->obj_desc.id,
|
||||
|
|
|
|||
|
|
@ -32,8 +32,13 @@ struct qe_gpio_chip {
|
|||
/* shadowed data register to clear/set bits safely */
|
||||
u32 cpdata;
|
||||
|
||||
/* saved_regs used to restore dedicated functions */
|
||||
struct qe_pio_regs saved_regs;
|
||||
/* saved regs used to restore dedicated functions */
|
||||
u32 saved_cpodr;
|
||||
u32 saved_cpdata;
|
||||
u32 saved_cpdir1;
|
||||
u32 saved_cpdir2;
|
||||
u32 saved_cppar1;
|
||||
u32 saved_cppar2;
|
||||
};
|
||||
|
||||
static void qe_gpio_save_regs(struct qe_gpio_chip *qe_gc)
|
||||
|
|
@ -41,12 +46,12 @@ static void qe_gpio_save_regs(struct qe_gpio_chip *qe_gc)
|
|||
struct qe_pio_regs __iomem *regs = qe_gc->regs;
|
||||
|
||||
qe_gc->cpdata = ioread32be(®s->cpdata);
|
||||
qe_gc->saved_regs.cpdata = qe_gc->cpdata;
|
||||
qe_gc->saved_regs.cpdir1 = ioread32be(®s->cpdir1);
|
||||
qe_gc->saved_regs.cpdir2 = ioread32be(®s->cpdir2);
|
||||
qe_gc->saved_regs.cppar1 = ioread32be(®s->cppar1);
|
||||
qe_gc->saved_regs.cppar2 = ioread32be(®s->cppar2);
|
||||
qe_gc->saved_regs.cpodr = ioread32be(®s->cpodr);
|
||||
qe_gc->saved_cpdata = qe_gc->cpdata;
|
||||
qe_gc->saved_cpdir1 = ioread32be(®s->cpdir1);
|
||||
qe_gc->saved_cpdir2 = ioread32be(®s->cpdir2);
|
||||
qe_gc->saved_cppar1 = ioread32be(®s->cppar1);
|
||||
qe_gc->saved_cppar2 = ioread32be(®s->cppar2);
|
||||
qe_gc->saved_cpodr = ioread32be(®s->cpodr);
|
||||
}
|
||||
|
||||
static int qe_gpio_get(struct gpio_chip *gc, unsigned int gpio)
|
||||
|
|
@ -196,18 +201,17 @@ struct qe_pin {
|
|||
/**
|
||||
* qe_pin_request - Request a QE pin
|
||||
* @dev: device to get the pin from
|
||||
* @index: index of the pin in the device tree
|
||||
* @gpiod: GPIO descriptor associated with this pin
|
||||
* Context: non-atomic
|
||||
*
|
||||
* This function return qe_pin so that you could use it with the rest of
|
||||
* the QE Pin Multiplexing API.
|
||||
*/
|
||||
struct qe_pin *qe_pin_request(struct device *dev, int index)
|
||||
struct qe_pin *qe_pin_request(struct device *dev, struct gpio_desc *gpiod)
|
||||
{
|
||||
struct gpio_device *gdev;
|
||||
struct qe_pin *qe_pin;
|
||||
struct gpio_chip *gc;
|
||||
struct gpio_desc *gpiod;
|
||||
int gpio_num;
|
||||
int err;
|
||||
|
||||
qe_pin = kzalloc_obj(*qe_pin);
|
||||
|
|
@ -216,34 +220,20 @@ struct qe_pin *qe_pin_request(struct device *dev, int index)
|
|||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
/*
|
||||
* Request gpio as nonexclusive as it was likely reserved by the
|
||||
* caller, and we are not planning on controlling it, we only need
|
||||
* the descriptor to the to the gpio chip structure.
|
||||
*/
|
||||
gpiod = gpiod_get_index(dev, NULL, index,
|
||||
GPIOD_ASIS | GPIOD_FLAGS_BIT_NONEXCLUSIVE);
|
||||
err = PTR_ERR_OR_ZERO(gpiod);
|
||||
if (err)
|
||||
goto err0;
|
||||
|
||||
gc = gpiod_to_chip(gpiod);
|
||||
gpio_num = desc_to_gpio(gpiod);
|
||||
/* We no longer need this descriptor */
|
||||
gpiod_put(gpiod);
|
||||
|
||||
if (WARN_ON(!gc)) {
|
||||
gdev = gpiod_to_gpio_device(gpiod);
|
||||
if (WARN_ON(!gdev)) {
|
||||
err = -ENODEV;
|
||||
goto err0;
|
||||
}
|
||||
|
||||
gc = gpio_device_get_chip(gdev);
|
||||
qe_pin->controller = gpiochip_get_data(gc);
|
||||
/*
|
||||
* FIXME: this gets the local offset on the gpio_chip so that the driver
|
||||
* can manipulate pin control settings through its custom API. The real
|
||||
* solution is to create a real pin control driver for this.
|
||||
*/
|
||||
qe_pin->num = gpio_num - gc->base;
|
||||
qe_pin->num = desc_to_gpio(gpiod) - gc->base;
|
||||
|
||||
if (!fwnode_device_is_compatible(gc->fwnode, "fsl,mpc8323-qe-pario-bank")) {
|
||||
dev_dbg(dev, "%s: tried to get a non-qe pin\n", __func__);
|
||||
|
|
@ -284,7 +274,6 @@ void qe_pin_set_dedicated(struct qe_pin *qe_pin)
|
|||
{
|
||||
struct qe_gpio_chip *qe_gc = qe_pin->controller;
|
||||
struct qe_pio_regs __iomem *regs = qe_gc->regs;
|
||||
struct qe_pio_regs *sregs = &qe_gc->saved_regs;
|
||||
int pin = qe_pin->num;
|
||||
u32 mask1 = 1 << (QE_PIO_PINS - (pin + 1));
|
||||
u32 mask2 = 0x3 << (QE_PIO_PINS - (pin % (QE_PIO_PINS / 2) + 1) * 2);
|
||||
|
|
@ -294,24 +283,20 @@ void qe_pin_set_dedicated(struct qe_pin *qe_pin)
|
|||
spin_lock_irqsave(&qe_gc->lock, flags);
|
||||
|
||||
if (second_reg) {
|
||||
qe_clrsetbits_be32(®s->cpdir2, mask2,
|
||||
sregs->cpdir2 & mask2);
|
||||
qe_clrsetbits_be32(®s->cppar2, mask2,
|
||||
sregs->cppar2 & mask2);
|
||||
qe_clrsetbits_be32(®s->cpdir2, mask2, qe_gc->saved_cpdir2 & mask2);
|
||||
qe_clrsetbits_be32(®s->cppar2, mask2, qe_gc->saved_cppar2 & mask2);
|
||||
} else {
|
||||
qe_clrsetbits_be32(®s->cpdir1, mask2,
|
||||
sregs->cpdir1 & mask2);
|
||||
qe_clrsetbits_be32(®s->cppar1, mask2,
|
||||
sregs->cppar1 & mask2);
|
||||
qe_clrsetbits_be32(®s->cpdir1, mask2, qe_gc->saved_cpdir1 & mask2);
|
||||
qe_clrsetbits_be32(®s->cppar1, mask2, qe_gc->saved_cppar1 & mask2);
|
||||
}
|
||||
|
||||
if (sregs->cpdata & mask1)
|
||||
if (qe_gc->saved_cpdata & mask1)
|
||||
qe_gc->cpdata |= mask1;
|
||||
else
|
||||
qe_gc->cpdata &= ~mask1;
|
||||
|
||||
iowrite32be(qe_gc->cpdata, ®s->cpdata);
|
||||
qe_clrsetbits_be32(®s->cpodr, mask1, sregs->cpodr & mask1);
|
||||
qe_clrsetbits_be32(®s->cpodr, mask1, qe_gc->saved_cpodr & mask1);
|
||||
spin_unlock_irqrestore(&qe_gc->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(qe_pin_set_dedicated);
|
||||
|
|
|
|||
|
|
@ -865,12 +865,12 @@ static int tsa_of_parse_tdms(struct tsa *tsa, struct device_node *np)
|
|||
clk_put(tsa->tdm[i].l1rclk_clk);
|
||||
}
|
||||
if (tsa->tdm[i].l1tsync_clk) {
|
||||
clk_disable_unprepare(tsa->tdm[i].l1rsync_clk);
|
||||
clk_put(tsa->tdm[i].l1rsync_clk);
|
||||
clk_disable_unprepare(tsa->tdm[i].l1tsync_clk);
|
||||
clk_put(tsa->tdm[i].l1tsync_clk);
|
||||
}
|
||||
if (tsa->tdm[i].l1tclk_clk) {
|
||||
clk_disable_unprepare(tsa->tdm[i].l1rclk_clk);
|
||||
clk_put(tsa->tdm[i].l1rclk_clk);
|
||||
clk_disable_unprepare(tsa->tdm[i].l1tclk_clk);
|
||||
clk_put(tsa->tdm[i].l1tclk_clk);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
|
@ -1039,12 +1039,12 @@ static void tsa_remove(struct platform_device *pdev)
|
|||
clk_put(tsa->tdm[i].l1rclk_clk);
|
||||
}
|
||||
if (tsa->tdm[i].l1tsync_clk) {
|
||||
clk_disable_unprepare(tsa->tdm[i].l1rsync_clk);
|
||||
clk_put(tsa->tdm[i].l1rsync_clk);
|
||||
clk_disable_unprepare(tsa->tdm[i].l1tsync_clk);
|
||||
clk_put(tsa->tdm[i].l1tsync_clk);
|
||||
}
|
||||
if (tsa->tdm[i].l1tclk_clk) {
|
||||
clk_disable_unprepare(tsa->tdm[i].l1rclk_clk);
|
||||
clk_put(tsa->tdm[i].l1rclk_clk);
|
||||
clk_disable_unprepare(tsa->tdm[i].l1tclk_clk);
|
||||
clk_put(tsa->tdm[i].l1tclk_clk);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -643,7 +643,7 @@ static int of_fhci_probe(struct platform_device *ofdev)
|
|||
}
|
||||
|
||||
for (j = 0; j < NUM_PINS; j++) {
|
||||
fhci->pins[j] = qe_pin_request(dev, j);
|
||||
fhci->pins[j] = qe_pin_request(dev, fhci->gpiods[j]);
|
||||
if (IS_ERR(fhci->pins[j])) {
|
||||
ret = PTR_ERR(fhci->pins[j]);
|
||||
dev_err(dev, "can't get pin %d: %d\n", j, ret);
|
||||
|
|
|
|||
|
|
@ -336,7 +336,7 @@ struct fsl_mc_io {
|
|||
u16 flags;
|
||||
u32 portal_size;
|
||||
phys_addr_t portal_phys_addr;
|
||||
void __iomem *portal_virt_addr;
|
||||
void __iomem *portal_virt_addr __counted_by_ptr(portal_size);
|
||||
struct fsl_mc_device *dpmcp_dev;
|
||||
union {
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/types.h>
|
||||
|
||||
struct device;
|
||||
struct gpio_desc;
|
||||
|
||||
#define QE_NUM_OF_SNUM 256 /* There are 256 serial number in QE */
|
||||
#define QE_NUM_OF_BRGS 16
|
||||
|
|
@ -193,12 +194,13 @@ static inline int par_io_data_set(u8 port, u8 pin, u8 val) { return -ENOSYS; }
|
|||
*/
|
||||
struct qe_pin;
|
||||
#ifdef CONFIG_QE_GPIO
|
||||
extern struct qe_pin *qe_pin_request(struct device *dev, int index);
|
||||
extern struct qe_pin *qe_pin_request(struct device *dev, struct gpio_desc *gpiod);
|
||||
extern void qe_pin_free(struct qe_pin *qe_pin);
|
||||
extern void qe_pin_set_gpio(struct qe_pin *qe_pin);
|
||||
extern void qe_pin_set_dedicated(struct qe_pin *pin);
|
||||
#else
|
||||
static inline struct qe_pin *qe_pin_request(struct device *dev, int index)
|
||||
static inline struct qe_pin *
|
||||
qe_pin_request(struct device *dev, struct gpio_desc *gpiod)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user