ep93xx: Use ioremap for backlight driver
authorRyan Mallon <rmallon@gmail.com>
Sun, 22 Jan 2012 09:31:32 +0000 (20:31 +1100)
committerRyan Mallon <rmallon@gmail.com>
Wed, 14 Mar 2012 00:41:10 +0000 (11:41 +1100)
The ep93xx backlight driver uses a single register within the
framebuffer's register space. Currently the backlight driver uses a
static IO mapping for the register since the memory cannot be
requested by both drivers.

Convert the static mapping to use ioremap so that we can remove the
dependency on mach/hardware.h. To do so, we need remove the
request_mem_region from both the backlight and framebuffer drivers,
since whichever driver is loaded second will fail with -EBUSY
otherwise.

A proper fix is still required, and a FIXME comment has been added to
both drivers.

Signed-off-by: Ryan Mallon <rmallon@gmail.com>
Suggested-by: Arnd Bergmann <arnd@arndb.de>
Cc: Mika Westerberg <mika.westerberg@iki.fi>
Cc: Richard Purdie <rpurdie@rpsys.net>
Cc: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: H Hartley Sweeten <hsweeten@visionengravers.com>
arch/arm/mach-ep93xx/core.c
drivers/video/backlight/ep93xx_bl.c
drivers/video/ep93xx-fb.c

index b5c1dae8327fd87ccf945913a185397142135ca5..c73e299b08a5e850fc5f4238fe442d2046309846 100644 (file)
@@ -682,9 +682,19 @@ static struct platform_device ep93xx_fb_device = {
        .resource               = ep93xx_fb_resource,
 };
 
+/* The backlight use a single register in the framebuffer's register space */
+#define EP93XX_RASTER_REG_BRIGHTNESS 0x20
+
+static struct resource ep93xx_bl_resources[] = {
+       DEFINE_RES_MEM(EP93XX_RASTER_PHYS_BASE +
+                      EP93XX_RASTER_REG_BRIGHTNESS, 0x04),
+};
+
 static struct platform_device ep93xx_bl_device = {
        .name           = "ep93xx-bl",
        .id             = -1,
+       .num_resources  = ARRAY_SIZE(ep93xx_bl_resources),
+       .resource       = ep93xx_bl_resources,
 };
 
 /**
index b62b8b9063b53beeacffa86c8259d971372e3ec9..08214e1f09583b25ace65acdb3487a0b48c9b731 100644 (file)
 #include <linux/fb.h>
 #include <linux/backlight.h>
 
-#include <mach/hardware.h>
-
-#define EP93XX_RASTER_REG(x)           (EP93XX_RASTER_BASE + (x))
-#define EP93XX_RASTER_BRIGHTNESS       EP93XX_RASTER_REG(0x20)
-
 #define EP93XX_MAX_COUNT               255
 #define EP93XX_MAX_BRIGHT              255
 #define EP93XX_DEF_BRIGHT              128
@@ -35,7 +30,7 @@ static int ep93xxbl_set(struct backlight_device *bl, int brightness)
 {
        struct ep93xxbl *ep93xxbl = bl_get_data(bl);
 
-       __raw_writel((brightness << 8) | EP93XX_MAX_COUNT, ep93xxbl->mmio);
+       writel((brightness << 8) | EP93XX_MAX_COUNT, ep93xxbl->mmio);
 
        ep93xxbl->brightness = brightness;
 
@@ -70,21 +65,29 @@ static int __init ep93xxbl_probe(struct platform_device *dev)
        struct ep93xxbl *ep93xxbl;
        struct backlight_device *bl;
        struct backlight_properties props;
+       struct resource *res;
 
        ep93xxbl = devm_kzalloc(&dev->dev, sizeof(*ep93xxbl), GFP_KERNEL);
        if (!ep93xxbl)
                return -ENOMEM;
 
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -ENXIO;
+
        /*
-        * This register is located in the range already ioremap'ed by
-        * the framebuffer driver.  A MFD driver seems a bit of overkill
-        * to handle this so use the static I/O mapping; this address
-        * is already virtual.
+        * FIXME - We don't do a request_mem_region here because we are
+        * sharing the register space with the framebuffer driver (see
+        * drivers/video/ep93xx-fb.c) and doing so will cause the second
+        * loaded driver to return -EBUSY.
         *
         * NOTE: No locking is required; the framebuffer does not touch
         * this register.
         */
-       ep93xxbl->mmio = EP93XX_RASTER_BRIGHTNESS;
+       ep93xxbl->mmio = devm_ioremap(&dev->dev, res->start,
+                                     resource_size(res));
+       if (!ep93xxbl->mmio)
+               return -ENXIO;
 
        memset(&props, 0, sizeof(struct backlight_properties));
        props.type = BACKLIGHT_RAW;
index 2e830ec52a5a91664527c32b3108a521e4c6c1c5..f8babbeee27543e9149af7319f42c60ef4808d3b 100644 (file)
@@ -519,12 +519,15 @@ static int __devinit ep93xxfb_probe(struct platform_device *pdev)
                goto failed;
        }
 
-       res = request_mem_region(res->start, resource_size(res), pdev->name);
-       if (!res) {
-               err = -EBUSY;
-               goto failed;
-       }
-
+       /*
+        * FIXME - We don't do a request_mem_region here because we are
+        * sharing the register space with the backlight driver (see
+        * drivers/video/backlight/ep93xx_bl.c) and doing so will cause
+        * the second loaded driver to return -EBUSY.
+        *
+        * NOTE: No locking is required; the backlight does not touch
+        * any of the framebuffer registers.
+        */
        fbi->res = res;
        fbi->mmio_base = ioremap(res->start, resource_size(res));
        if (!fbi->mmio_base) {
@@ -586,8 +589,6 @@ failed:
                clk_put(fbi->clk);
        if (fbi->mmio_base)
                iounmap(fbi->mmio_base);
-       if (fbi->res)
-               release_mem_region(fbi->res->start, resource_size(fbi->res));
        ep93xxfb_dealloc_videomem(info);
        if (&info->cmap)
                fb_dealloc_cmap(&info->cmap);
@@ -608,7 +609,6 @@ static int __devexit ep93xxfb_remove(struct platform_device *pdev)
        clk_disable(fbi->clk);
        clk_put(fbi->clk);
        iounmap(fbi->mmio_base);
-       release_mem_region(fbi->res->start, resource_size(fbi->res));
        ep93xxfb_dealloc_videomem(info);
        fb_dealloc_cmap(&info->cmap);