[s3c24xx] glamo: The cell can rely on being a child of the core. Use it for
[openwrt/svn-archive/archive.git] / target / linux / s3c24xx / files-2.6.30 / drivers / mfd / glamo / glamo-fb.c
index 3d13dd26ceb0cb47fcb0d6cdd73a45d78893ebec..7bb2201f612099deda63ca2da26024e3d4b3fb9e 100644 (file)
 #include "glamo-regs.h"
 #include "glamo-core.h"
 
-#ifndef DEBUG
-#define GLAMO_LOG(...)
-#else
-#define GLAMO_LOG(...) \
-do { \
-       printk(KERN_DEBUG "in %s:%s:%d", __FILE__, __func__, __LINE__); \
-       printk(KERN_DEBUG __VA_ARGS__); \
-} while (0);
-#endif
-
 static void glamofb_program_mode(struct glamofb_handle* glamo);
 
 struct glamofb_handle {
+       struct glamo_core *core;
        struct fb_info *fb;
        struct device *dev;
        struct resource *reg;
@@ -72,7 +63,7 @@ struct glamofb_handle {
 };
 
 static void glamo_output_enable(struct glamofb_handle *gfb) {
-               struct glamo_core *gcore = gfb->mach_info->core;
+       struct glamo_core *gcore = gfb->core;
 
        if (gfb->output_enabled)
                return;
@@ -89,7 +80,7 @@ static void glamo_output_enable(struct glamofb_handle *gfb) {
 }
 
 static void glamo_output_disable(struct glamofb_handle *gfb) {
-       struct glamo_core *gcore = gfb->mach_info->core;
+       struct glamo_core *gcore = gfb->core;
 
        if (!gfb->output_enabled)
                return;
@@ -158,8 +149,8 @@ static int glamofb_run_script(struct glamofb_handle *glamo,
 {
        int i;
 
-       if (glamo->mach_info->core->suspending) {
-               dev_err(&glamo->mach_info->core->pdev->dev,
+       if (glamo->core->suspending) {
+               dev_err(&glamo->core->pdev->dev,
                                "IGNORING glamofb_run_script while "
                                                                 "suspended\n");
                return -EBUSY;
@@ -184,8 +175,8 @@ static int glamofb_check_var(struct fb_var_screeninfo *var,
 {
        struct glamofb_handle *glamo = info->par;
 
-       if (glamo->mach_info->core->suspending) {
-               dev_err(&glamo->mach_info->core->pdev->dev,
+       if (glamo->core->suspending) {
+               dev_err(&glamo->core->pdev->dev,
                                "IGNORING glamofb_check_var while "
                                                                 "suspended\n");
                return -EBUSY;
@@ -272,8 +263,8 @@ static void __rotate_lcd(struct glamofb_handle *glamo, __u32 rotation)
 {
        int glamo_rot;
 
-       if (glamo->mach_info->core->suspending) {
-               dev_err(&glamo->mach_info->core->pdev->dev,
+       if (glamo->core->suspending) {
+               dev_err(&glamo->core->pdev->dev,
                                "IGNORING rotate_lcd while "
                                                                 "suspended\n");
                return;
@@ -308,7 +299,7 @@ static void __rotate_lcd(struct glamofb_handle *glamo, __u32 rotation)
 static void glamofb_program_mode(struct glamofb_handle* gfb) {
        int sync, bp, disp, fp, total;
        unsigned long flags;
-       struct glamo_core *gcore = gfb->mach_info->core;
+       struct glamo_core *gcore = gfb->core;
        struct fb_var_screeninfo *var = &gfb->fb->var;
 
        dev_dbg(&gcore->pdev->dev,
@@ -413,8 +404,8 @@ static int glamofb_set_par(struct fb_info *info)
        struct fb_var_screeninfo *var = &info->var;
        struct fb_videomode *mode;
 
-       if (glamo->mach_info->core->suspending) {
-               dev_err(&glamo->mach_info->core->pdev->dev,
+       if (glamo->core->suspending) {
+               dev_err(&glamo->core->pdev->dev,
                                "IGNORING glamofb_set_par while "
                                                                 "suspended\n");
                return -EBUSY;
@@ -493,8 +484,8 @@ static int glamofb_setcolreg(unsigned regno,
        struct glamofb_handle *glamo = info->par;
        unsigned int val;
 
-       if (glamo->mach_info->core->suspending) {
-               dev_err(&glamo->mach_info->core->pdev->dev,
+       if (glamo->core->suspending) {
+               dev_err(&glamo->core->pdev->dev,
                                "IGNORING glamofb_set_par while "
                                                                 "suspended\n");
                return -EBUSY;
@@ -525,7 +516,7 @@ static int glamofb_setcolreg(unsigned regno,
 static int glamofb_ioctl(struct fb_info *info, unsigned int cmd,
                          unsigned long arg) {
        struct glamofb_handle *gfb = (struct glamofb_handle*)info->par;
-       struct glamo_core *gcore = gfb->mach_info->core;
+       struct glamo_core *gcore = gfb->core;
        int retval = -ENOTTY;
 
        switch (cmd) {
@@ -687,8 +678,8 @@ int glamofb_cmd_mode(struct glamofb_handle *gfb, int on)
 {
        int timeout = 2000000;
 
-       if (gfb->mach_info->core->suspending) {
-               dev_err(&gfb->mach_info->core->pdev->dev,
+       if (gfb->core->suspending) {
+               dev_err(&gfb->core->pdev->dev,
                                "IGNORING glamofb_cmd_mode while "
                                                                 "suspended\n");
                return -EBUSY;
@@ -699,7 +690,7 @@ int glamofb_cmd_mode(struct glamofb_handle *gfb, int on)
                dev_dbg(gfb->dev, "%s: waiting for cmdq empty: ",
                        __func__);
                while ((!glamofb_cmdq_empty(gfb)) && (timeout--))
-                       yield();
+                       cpu_relax();
                if (timeout < 0) {
                        printk(KERN_ERR"*************"
                                       "glamofb cmd_queue never got empty"
@@ -718,7 +709,7 @@ int glamofb_cmd_mode(struct glamofb_handle *gfb, int on)
                timeout = 2000000;
                while ((!reg_read(gfb, GLAMO_REG_LCD_STATUS2) & (1 << 12)) &&
                      (timeout--))
-                       /* yield() */;
+                       cpu_relax();
                if (timeout < 0) {
                        printk(KERN_ERR"*************"
                                       "glamofb lcd never idle"
@@ -751,8 +742,8 @@ int glamofb_cmd_write(struct glamofb_handle *gfb, u_int16_t val)
 {
        int timeout = 200000;
 
-       if (gfb->mach_info->core->suspending) {
-               dev_err(&gfb->mach_info->core->pdev->dev,
+       if (gfb->core->suspending) {
+               dev_err(&gfb->core->pdev->dev,
                                "IGNORING glamofb_cmd_write while "
                                                                 "suspended\n");
                return -EBUSY;
@@ -807,15 +798,21 @@ static int __init glamofb_probe(struct platform_device *pdev)
        int rc = -EIO;
        struct fb_info *fbinfo;
        struct glamofb_handle *glamofb;
-       struct glamo_fb_platform_data *mach_info = pdev->dev.platform_data;
+       struct glamo_core *core = dev_get_drvdata(pdev->dev.parent);
+       struct glamo_fb_platform_data *mach_info;
 
        printk(KERN_INFO "SMEDIA Glamo frame buffer driver (C) 2007 "
                "Openmoko, Inc.\n");
 
+       if (!core->pdata || !core->pdata->fb_data)
+               return -ENOENT;
+
+
        fbinfo = framebuffer_alloc(sizeof(struct glamofb_handle), &pdev->dev);
        if (!fbinfo)
                return -ENOMEM;
 
+
        glamofb = fbinfo->par;
        glamofb->fb = fbinfo;
        glamofb->dev = &pdev->dev;
@@ -876,7 +873,9 @@ static int __init glamofb_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, glamofb);
 
-       glamofb->mach_info = pdev->dev.platform_data;
+       mach_info = core->pdata->fb_data;
+       glamofb->core = core;
+       glamofb->mach_info = mach_info;
 
        fbinfo->fix.visual = FB_VISUAL_TRUECOLOR;
        fbinfo->fix.type = FB_TYPE_PACKED_PIXELS;
@@ -901,8 +900,8 @@ static int __init glamofb_probe(struct platform_device *pdev)
        fbinfo->var.accel_flags = 0;
        fbinfo->var.vmode = FB_VMODE_NONINTERLACED;
 
-       glamo_engine_enable(mach_info->core, GLAMO_ENGINE_LCD);
-       glamo_engine_reset(mach_info->core, GLAMO_ENGINE_LCD);
+       glamo_engine_enable(core, GLAMO_ENGINE_LCD);
+       glamo_engine_reset(core, GLAMO_ENGINE_LCD);
        glamofb->output_enabled = 1;
        glamofb->mode_set = 1;
 
@@ -971,13 +970,12 @@ static int glamofb_suspend(struct device *dev)
 static int glamofb_resume(struct device *dev)
 {
        struct glamofb_handle *gfb = dev_get_drvdata(dev);
-       struct glamo_fb_platform_data *mach_info = dev->platform_data;
 
        /* OK let's allow framebuffer ops again */
        /* gfb->fb->screen_base = ioremap(gfb->fb_res->start,
                                       resource_size(gfb->fb_res)); */
-       glamo_engine_enable(mach_info->core, GLAMO_ENGINE_LCD);
-       glamo_engine_reset(mach_info->core, GLAMO_ENGINE_LCD);
+       glamo_engine_enable(gfb->core, GLAMO_ENGINE_LCD);
+       glamo_engine_reset(gfb->core, GLAMO_ENGINE_LCD);
 
        glamofb_init_regs(gfb);
 #ifdef CONFIG_MFD_GLAMO_HWACCEL