2015-12-17 09:29:22 +00:00
|
|
|
From 94e975060ece510ef20c619d3a022cbf1978c2ef Mon Sep 17 00:00:00 2001
|
2015-10-26 09:01:05 +00:00
|
|
|
From: Phil Elwell <phil@raspberrypi.org>
|
|
|
|
Date: Tue, 6 Oct 2015 10:16:58 +0100
|
2015-12-17 09:29:22 +00:00
|
|
|
Subject: [PATCH 198/222] bcm2835-gpiomem: Fix for ARCH_BCM2835 builds
|
2015-10-26 09:01:05 +00:00
|
|
|
|
|
|
|
Build on ARCH_BCM2835, and fail to probe if no IO resource.
|
|
|
|
|
|
|
|
See: https://github.com/raspberrypi/linux/issues/1154
|
|
|
|
---
|
|
|
|
drivers/char/broadcom/bcm2835-gpiomem.c | 25 ++++++++++---------------
|
|
|
|
1 file changed, 10 insertions(+), 15 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/char/broadcom/bcm2835-gpiomem.c
|
|
|
|
+++ b/drivers/char/broadcom/bcm2835-gpiomem.c
|
|
|
|
@@ -143,7 +143,6 @@ static int bcm2835_gpiomem_probe(struct
|
|
|
|
int err;
|
|
|
|
void *ptr_err;
|
|
|
|
struct device *dev = &pdev->dev;
|
|
|
|
- struct device_node *node = dev->of_node;
|
|
|
|
struct resource *ioresource;
|
|
|
|
|
|
|
|
/* Allocate buffers and instance data */
|
|
|
|
@@ -157,6 +156,15 @@ static int bcm2835_gpiomem_probe(struct
|
|
|
|
|
|
|
|
inst->dev = dev;
|
|
|
|
|
|
|
|
+ ioresource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
|
+ if (ioresource) {
|
|
|
|
+ inst->gpio_regs_phys = ioresource->start;
|
|
|
|
+ } else {
|
|
|
|
+ dev_err(inst->dev, "failed to get IO resource");
|
|
|
|
+ err = -ENOENT;
|
|
|
|
+ goto failed_get_resource;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
/* Create character device entries */
|
|
|
|
|
|
|
|
err = alloc_chrdev_region(&bcm2835_gpiomem_devid,
|
|
|
|
@@ -187,20 +195,6 @@ static int bcm2835_gpiomem_probe(struct
|
|
|
|
if (IS_ERR(ptr_err))
|
|
|
|
goto failed_device_create;
|
|
|
|
|
|
|
|
- /* Get address from device tree if available (*_resource() correctly
|
|
|
|
- converts the bus address in device tree to a physical address),
|
|
|
|
- or use hardcoded offset + BCM2708_PERI_BASE if not.
|
|
|
|
- (In spite of its name 2708 actually seems to have the correct
|
|
|
|
- mach-dependent value on 2709 etc, as it is defined in
|
|
|
|
- mach-bcm270x/platform.h) */
|
|
|
|
-
|
|
|
|
- if (node) {
|
|
|
|
- ioresource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
|
- inst->gpio_regs_phys = ioresource->start;
|
|
|
|
- } else {
|
|
|
|
- inst->gpio_regs_phys = GPIO_BASE;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
dev_info(inst->dev, "Initialised: Registers at 0x%08lx",
|
|
|
|
inst->gpio_regs_phys);
|
|
|
|
|
|
|
|
@@ -214,6 +208,7 @@ failed_class_create:
|
|
|
|
failed_cdev_add:
|
|
|
|
unregister_chrdev_region(bcm2835_gpiomem_devid, 1);
|
|
|
|
failed_alloc_chrdev:
|
|
|
|
+failed_get_resource:
|
|
|
|
kfree(inst);
|
|
|
|
failed_inst_alloc:
|
|
|
|
dev_err(inst->dev, "could not load bcm2835_gpiomem");
|