summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/bus/fsl-mc/fsl-mc-bus.c47
-rw-r--r--drivers/bus/fsl-mc/fsl-mc-msi.c2
-rw-r--r--drivers/soc/fsl/qe/gpio.c67
-rw-r--r--drivers/usb/host/fhci-hcd.c2
-rw-r--r--include/soc/fsl/qe/qe.h6
5 files changed, 60 insertions, 64 deletions
diff --git a/drivers/bus/fsl-mc/fsl-mc-bus.c b/drivers/bus/fsl-mc/fsl-mc-bus.c
index 66a4fa73c5b8..5878eafd8d44 100644
--- a/drivers/bus/fsl-mc/fsl-mc-bus.c
+++ b/drivers/bus/fsl-mc/fsl-mc-bus.c
@@ -797,6 +797,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 +842,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;
}
/*
@@ -1264,35 +1265,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);
diff --git a/drivers/bus/fsl-mc/fsl-mc-msi.c b/drivers/bus/fsl-mc/fsl-mc-msi.c
index be38b43803de..7d760bfa63c1 100644
--- a/drivers/bus/fsl-mc/fsl-mc-msi.c
+++ b/drivers/bus/fsl-mc/fsl-mc-msi.c
@@ -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,
diff --git a/drivers/soc/fsl/qe/gpio.c b/drivers/soc/fsl/qe/gpio.c
index 5cd59cfbf22f..1b5a1b134596 100644
--- a/drivers/soc/fsl/qe/gpio.c
+++ b/drivers/soc/fsl/qe/gpio.c
@@ -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(&regs->cpdata);
- qe_gc->saved_regs.cpdata = qe_gc->cpdata;
- qe_gc->saved_regs.cpdir1 = ioread32be(&regs->cpdir1);
- qe_gc->saved_regs.cpdir2 = ioread32be(&regs->cpdir2);
- qe_gc->saved_regs.cppar1 = ioread32be(&regs->cppar1);
- qe_gc->saved_regs.cppar2 = ioread32be(&regs->cppar2);
- qe_gc->saved_regs.cpodr = ioread32be(&regs->cpodr);
+ qe_gc->saved_cpdata = qe_gc->cpdata;
+ qe_gc->saved_cpdir1 = ioread32be(&regs->cpdir1);
+ qe_gc->saved_cpdir2 = ioread32be(&regs->cpdir2);
+ qe_gc->saved_cppar1 = ioread32be(&regs->cppar1);
+ qe_gc->saved_cppar2 = ioread32be(&regs->cppar2);
+ qe_gc->saved_cpodr = ioread32be(&regs->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(&regs->cpdir2, mask2,
- sregs->cpdir2 & mask2);
- qe_clrsetbits_be32(&regs->cppar2, mask2,
- sregs->cppar2 & mask2);
+ qe_clrsetbits_be32(&regs->cpdir2, mask2, qe_gc->saved_cpdir2 & mask2);
+ qe_clrsetbits_be32(&regs->cppar2, mask2, qe_gc->saved_cppar2 & mask2);
} else {
- qe_clrsetbits_be32(&regs->cpdir1, mask2,
- sregs->cpdir1 & mask2);
- qe_clrsetbits_be32(&regs->cppar1, mask2,
- sregs->cppar1 & mask2);
+ qe_clrsetbits_be32(&regs->cpdir1, mask2, qe_gc->saved_cpdir1 & mask2);
+ qe_clrsetbits_be32(&regs->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, &regs->cpdata);
- qe_clrsetbits_be32(&regs->cpodr, mask1, sregs->cpodr & mask1);
+ qe_clrsetbits_be32(&regs->cpodr, mask1, qe_gc->saved_cpodr & mask1);
spin_unlock_irqrestore(&qe_gc->lock, flags);
}
EXPORT_SYMBOL(qe_pin_set_dedicated);
diff --git a/drivers/usb/host/fhci-hcd.c b/drivers/usb/host/fhci-hcd.c
index 71e785f445a3..d572f0c1dffa 100644
--- a/drivers/usb/host/fhci-hcd.c
+++ b/drivers/usb/host/fhci-hcd.c
@@ -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);
diff --git a/include/soc/fsl/qe/qe.h b/include/soc/fsl/qe/qe.h
index 8f967d15e479..7f0e4165c3b0 100644
--- a/include/soc/fsl/qe/qe.h
+++ b/include/soc/fsl/qe/qe.h
@@ -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);
}