From: Vaibhav Hiremath <[email protected]>

Till now OMAPFB driver was handling back-light interface
through it's own custom SYSFS entries. Earliear there
was a discussion where we decided to add support for OMAP
back-light into Generic class driver. Also Sanjeev has submitted
patch supporting back-light class driver.

This patch addresses review comments from 'Richard Purdie', and
adds support for OMAP3EVM.

NOTE:
        I am not sure whether back-light class driver interface
        still holds this implementation, since not a single platform
        I could found in kernel tree which follows this implementation.

        Since this implementation has been suggested by 'Richard Purdie',
        and I was readily having this patch so I am submitting it for review.

        The next version of patch will be devided into 3 seperate patches
                - twl4030 related changes
                - OMAPFB related changes
                - board-omap3evm.c related changes.

TODO:
        - Need to add simillar support for other platforms and development
          boards.
        - Merge it to DSS2 and OMAP2FB

Signed-off-by: Brijesh Jadav <[email protected]>
Signed-off-by: Hardik Shah <[email protected]>
Signed-off-by: Vaibhav Hiremath <[email protected]>
---
 arch/arm/mach-omap2/board-omap3evm.c     |   37 ++++++++++++++++++++
 arch/arm/plat-omap/include/mach/omapfb.h |    4 --
 drivers/video/omap/lcd_omap3evm.c        |   27 ---------------
 drivers/video/omap/omapfb_main.c         |   54 ------------------------------
 include/linux/i2c/twl4030.h              |   14 ++++++++
 5 files changed, 51 insertions(+), 85 deletions(-)

diff --git a/arch/arm/mach-omap2/board-omap3evm.c 
b/arch/arm/mach-omap2/board-omap3evm.c
index 024d7c4..c749604 100644
--- a/arch/arm/mach-omap2/board-omap3evm.c
+++ b/arch/arm/mach-omap2/board-omap3evm.c
@@ -20,6 +20,7 @@
 #include <linux/clk.h>
 #include <linux/input.h>
 #include <linux/leds.h>
+#include <linux/backlight.h>

 #include <linux/spi/spi.h>
 #include <linux/spi/ads7846.h>
@@ -225,6 +226,41 @@ static struct omap_lcd_config omap3_evm_lcd_config 
__initdata = {
        .ctrl_name      = "internal",
 };

+#define TWL_PWMA_PWMAOFF       0x01
+
+static void omap3_set_bl_intensity(int intensity)
+{
+       unsigned char c;
+
+       if (intensity > 100)
+               return;
+
+       c = ((125 * (100 - intensity)) / 100) + 2;
+
+#if defined(CONFIG_TWL4030_CORE)
+       twl4030_i2c_write_u8(TWL4030_MODULE_LED, 0x11, TWL4030_LED_EN);
+       twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, c, TWL_PWMA_PWMAOFF);
+#endif
+
+}
+static struct generic_bl_info omap3_bl_platform_data = {
+       .name                   = "omap3-bklight",
+       .max_intensity          = 100,
+       .default_intensity      = 70,
+       .limit_mask             = 0,
+       .set_bl_intensity       = omap3_set_bl_intensity,
+       .kick_battery           = NULL,
+};
+
+static struct platform_device omap3_bklight_device = {
+       .name                   = "generic-bl",
+       .id                     = -1,
+       .dev                    = {
+               .parent         = &omap3_evm_lcd_device.dev,
+               .platform_data  = &omap3_bl_platform_data,
+       },
+};
+
 static void ads7846_dev_init(void)
 {
        if (gpio_request(OMAP3_EVM_TS_GPIO, "ADS7846 pendown") < 0)
@@ -286,6 +322,7 @@ static struct omap_board_config_kernel omap3_evm_config[] 
__initdata = {

 static struct platform_device *omap3_evm_devices[] __initdata = {
        &omap3_evm_lcd_device,
+       &omap3_bklight_device,
        &omap3evm_smc911x_device,
 };

diff --git a/arch/arm/plat-omap/include/mach/omapfb.h 
b/arch/arm/plat-omap/include/mach/omapfb.h
index b226bdf..b87466b 100644
--- a/arch/arm/plat-omap/include/mach/omapfb.h
+++ b/arch/arm/plat-omap/include/mach/omapfb.h
@@ -218,10 +218,6 @@ struct lcd_panel {
        int             (*enable)       (struct lcd_panel *panel);
        void            (*disable)      (struct lcd_panel *panel);
        unsigned long   (*get_caps)     (struct lcd_panel *panel);
-       int             (*set_bklight_level)(struct lcd_panel *panel,
-                                            unsigned int level);
-       unsigned int    (*get_bklight_level)(struct lcd_panel *panel);
-       unsigned int    (*get_bklight_max)  (struct lcd_panel *panel);
        int             (*run_test)     (struct lcd_panel *panel, int test_num);
 };

diff --git a/drivers/video/omap/lcd_omap3evm.c 
b/drivers/video/omap/lcd_omap3evm.c
index 1c3d814..23238ae 100644
--- a/drivers/video/omap/lcd_omap3evm.c
+++ b/drivers/video/omap/lcd_omap3evm.c
@@ -49,7 +49,6 @@
 #define TWL_PWMA_PWMAON                0x00
 #define TWL_PWMA_PWMAOFF       0x01

-static unsigned int bklight_level;

 static int omap3evm_panel_init(struct lcd_panel *panel,
                                struct omapfb_device *fbdev)
@@ -69,7 +68,6 @@ static int omap3evm_panel_init(struct lcd_panel *panel,
        twl4030_i2c_write_u8(TWL4030_MODULE_LED, 0x11, TWL_LED_LEDEN);
        twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, 0x01, TWL_PWMA_PWMAON);
        twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, 0x02, TWL_PWMA_PWMAOFF);
-       bklight_level = 100;

        return 0;
 }
@@ -94,28 +92,6 @@ static unsigned long omap3evm_panel_get_caps(struct 
lcd_panel *panel)
        return 0;
 }

-static int omap3evm_bklight_setlevel(struct lcd_panel *panel,
-                                               unsigned int level)
-{
-       u8 c;
-       if ((level >= 0) && (level <= 100)) {
-               c = (125 * (100 - level)) / 100 + 2;
-               twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, c, TWL_PWMA_PWMAOFF);
-               bklight_level = level;
-       }
-       return 0;
-}
-
-static unsigned int omap3evm_bklight_getlevel(struct lcd_panel *panel)
-{
-       return bklight_level;
-}
-
-static unsigned int omap3evm_bklight_getmaxlevel(struct lcd_panel *panel)
-{
-       return 100;
-}
-
 struct lcd_panel omap3evm_panel = {
        .name           = "omap3evm",
        .config         = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC |
@@ -139,9 +115,6 @@ struct lcd_panel omap3evm_panel = {
        .enable         = omap3evm_panel_enable,
        .disable        = omap3evm_panel_disable,
        .get_caps       = omap3evm_panel_get_caps,
-       .set_bklight_level      = omap3evm_bklight_setlevel,
-       .get_bklight_level      = omap3evm_bklight_getlevel,
-       .get_bklight_max        = omap3evm_bklight_getmaxlevel,
 };

 static int omap3evm_panel_probe(struct platform_device *pdev)
diff --git a/drivers/video/omap/omapfb_main.c b/drivers/video/omap/omapfb_main.c
index 3bb4247..2d1dcfb 100644
--- a/drivers/video/omap/omapfb_main.c
+++ b/drivers/video/omap/omapfb_main.c
@@ -1345,65 +1345,11 @@ static ssize_t omapfb_show_panel_name(struct device 
*dev,
        return snprintf(buf, PAGE_SIZE, "%s\n", fbdev->panel->name);
 }

-static ssize_t omapfb_show_bklight_level(struct device *dev,
-                                        struct device_attribute *attr,
-                                        char *buf)
-{
-       struct omapfb_device *fbdev = (struct omapfb_device *)dev->driver_data;
-       int r;
-
-       if (fbdev->panel->get_bklight_level) {
-               r = snprintf(buf, PAGE_SIZE, "%d\n",
-                            fbdev->panel->get_bklight_level(fbdev->panel));
-       } else
-               r = -ENODEV;
-       return r;
-}
-
-static ssize_t omapfb_store_bklight_level(struct device *dev,
-                                         struct device_attribute *attr,
-                                         const char *buf, size_t size)
-{
-       struct omapfb_device *fbdev = (struct omapfb_device *)dev->driver_data;
-       int r;
-
-       if (fbdev->panel->set_bklight_level) {
-               unsigned int level;
-
-               if (sscanf(buf, "%10d", &level) == 1) {
-                       r = fbdev->panel->set_bklight_level(fbdev->panel,
-                                                           level);
-               } else
-                       r = -EINVAL;
-       } else
-               r = -ENODEV;
-       return r ? r : size;
-}
-
-static ssize_t omapfb_show_bklight_max(struct device *dev,
-                                      struct device_attribute *attr, char *buf)
-{
-       struct omapfb_device *fbdev = (struct omapfb_device *)dev->driver_data;
-       int r;
-
-       if (fbdev->panel->get_bklight_level) {
-               r = snprintf(buf, PAGE_SIZE, "%d\n",
-                            fbdev->panel->get_bklight_max(fbdev->panel));
-       } else
-               r = -ENODEV;
-       return r;
-}
-
 static struct device_attribute dev_attr_panel_name =
        __ATTR(name, 0444, omapfb_show_panel_name, NULL);
-static DEVICE_ATTR(backlight_level, 0664,
-                  omapfb_show_bklight_level, omapfb_store_bklight_level);
-static DEVICE_ATTR(backlight_max, 0444, omapfb_show_bklight_max, NULL);

 static struct attribute *panel_attrs[] = {
        &dev_attr_panel_name.attr,
-       &dev_attr_backlight_level.attr,
-       &dev_attr_backlight_max.attr,
        NULL,
 };

diff --git a/include/linux/i2c/twl4030.h b/include/linux/i2c/twl4030.h
index c89d33b..48063ba 100644
--- a/include/linux/i2c/twl4030.h
+++ b/include/linux/i2c/twl4030.h
@@ -84,6 +84,20 @@ int twl4030_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned 
num_bytes);
 /*----------------------------------------------------------------------*/

 /*
+ * LED Module register offsets (use TWL4030_MODULE_LED)
+ */
+#define TWL4030_LED_EN                 0x0
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * PWMA/B register offsets (use TWL4030_MODULE_PWMA/TWL4030_MODULE_PWMB)
+ */
+#define TWL4030_LED_PWMON              0x0
+#define TWL4030_LED_PWMOFF             0x1
+
+
+/*
  * NOTE:  at up to 1024 registers, this is a big chip.
  *
  * Avoid putting register declarations in this file, instead of into
--
1.5.6

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to