Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0094f2cdcfb6f2132b2ea3b4e85e0f6899c8595b
Commit:     0094f2cdcfb6f2132b2ea3b4e85e0f6899c8595b
Parent:     7ac5dde99eb9fefdb526973c600075b7c5703a86
Author:     Benjamin Herrenschmidt <[EMAIL PROTECTED]>
AuthorDate: Thu Dec 20 15:00:21 2007 +1100
Committer:  Paul Mackerras <[EMAIL PROTECTED]>
CommitDate: Fri Dec 21 22:14:07 2007 +1100

    [POWERPC] Fix for via-pmu based backlight control
    
    This fixes a few issues with via-pmu based backlight control.
    
    First, it fixes a sign problem with the setup of the backlight
    curve since the `range' value there -can- (and will) go negative.
    
    Then, it reworks the interaction between this and the via-pmu sleep
    code to properly restore backlight on wakeup from sleep.
    
    Signed-off-by: Benjamin Herrenschmidt <[EMAIL PROTECTED]>
    Signed-off-by: Paul Mackerras <[EMAIL PROTECTED]>
---
 drivers/macintosh/via-pmu-backlight.c |   48 ++++++++++++++++++++-------------
 drivers/macintosh/via-pmu.c           |   26 +++++++----------
 include/linux/pmu.h                   |    2 +
 3 files changed, 42 insertions(+), 34 deletions(-)

diff --git a/drivers/macintosh/via-pmu-backlight.c 
b/drivers/macintosh/via-pmu-backlight.c
index 7e27071..741a2e3 100644
--- a/drivers/macintosh/via-pmu-backlight.c
+++ b/drivers/macintosh/via-pmu-backlight.c
@@ -22,7 +22,7 @@ static u8 bl_curve[FB_BACKLIGHT_LEVELS];
 
 static void pmu_backlight_init_curve(u8 off, u8 min, u8 max)
 {
-       unsigned int i, flat, count, range = (max - min);
+       int i, flat, count, range = (max - min);
 
        bl_curve[0] = off;
 
@@ -68,17 +68,11 @@ static int pmu_backlight_get_level_brightness(int level)
        return pmulevel;
 }
 
-static int pmu_backlight_update_status(struct backlight_device *bd)
+static int __pmu_backlight_update_status(struct backlight_device *bd)
 {
        struct adb_request req;
-       unsigned long flags;
        int level = bd->props.brightness;
 
-       spin_lock_irqsave(&pmu_backlight_lock, flags);
-
-       /* Don't update brightness when sleeping */
-       if (sleeping)
-               goto out;
 
        if (bd->props.power != FB_BLANK_UNBLANK ||
            bd->props.fb_blank != FB_BLANK_UNBLANK)
@@ -99,12 +93,23 @@ static int pmu_backlight_update_status(struct 
backlight_device *bd)
                pmu_wait_complete(&req);
        }
 
-out:
-       spin_unlock_irqrestore(&pmu_backlight_lock, flags);
-
        return 0;
 }
 
+static int pmu_backlight_update_status(struct backlight_device *bd)
+{
+       unsigned long flags;
+       int rc = 0;
+
+       spin_lock_irqsave(&pmu_backlight_lock, flags);
+       /* Don't update brightness when sleeping */
+       if (!sleeping)
+               rc = __pmu_backlight_update_status(bd);
+       spin_unlock_irqrestore(&pmu_backlight_lock, flags);
+       return rc;
+}
+
+
 static int pmu_backlight_get_brightness(struct backlight_device *bd)
 {
        return bd->props.brightness;
@@ -123,6 +128,16 @@ void pmu_backlight_set_sleep(int sleep)
 
        spin_lock_irqsave(&pmu_backlight_lock, flags);
        sleeping = sleep;
+       if (pmac_backlight) {
+               if (sleep) {
+                       struct adb_request req;
+
+                       pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
+                                   PMU_POW_BACKLIGHT | PMU_POW_OFF);
+                       pmu_wait_complete(&req);
+               } else
+                       __pmu_backlight_update_status(pmac_backlight);
+       }
        spin_unlock_irqrestore(&pmu_backlight_lock, flags);
 }
 #endif /* CONFIG_PM */
@@ -148,8 +163,8 @@ void __init pmu_backlight_init()
 
        bd = backlight_device_register(name, NULL, NULL, &pmu_backlight_data);
        if (IS_ERR(bd)) {
-               printk("pmubl: Backlight registration failed\n");
-               goto error;
+               printk(KERN_ERR "PMU Backlight registration failed\n");
+               return;
        }
        bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1;
        pmu_backlight_init_curve(0x7F, 0x46, 0x0E);
@@ -171,10 +186,5 @@ void __init pmu_backlight_init()
        bd->props.power = FB_BLANK_UNBLANK;
        backlight_update_status(bd);
 
-       printk("pmubl: Backlight initialized (%s)\n", name);
-
-       return;
-
-error:
-       return;
+       printk(KERN_INFO "PMU Backlight initialized (%s)\n", name);
 }
diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c
index 7e77ac7..82ec12e 100644
--- a/drivers/macintosh/via-pmu.c
+++ b/drivers/macintosh/via-pmu.c
@@ -1748,8 +1748,6 @@ restore_via_state(void)
        out_8(&via[IER], IER_SET | SR_INT | CB1_INT);
 }
 
-extern void pmu_backlight_set_sleep(int sleep);
-
 #define        GRACKLE_PM      (1<<7)
 #define GRACKLE_DOZE   (1<<5)
 #define        GRACKLE_NAP     (1<<4)
@@ -2160,11 +2158,6 @@ pmu_release(struct inode *inode, struct file *file)
 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
 static void pmac_suspend_disable_irqs(void)
 {
-#ifdef CONFIG_PMAC_BACKLIGHT
-       /* Tell backlight code not to muck around with the chip anymore */
-       pmu_backlight_set_sleep(1);
-#endif
-
        /* Call platform functions marked "on sleep" */
        pmac_pfunc_i2c_suspend();
        pmac_pfunc_base_suspend();
@@ -2208,11 +2201,6 @@ static int powerbook_sleep(suspend_state_t state)
 
        mdelay(100);
 
-#ifdef CONFIG_PMAC_BACKLIGHT
-       /* Tell backlight code it can use the chip again */
-       pmu_backlight_set_sleep(0);
-#endif
-
        return 0;
 }
 
@@ -2457,10 +2445,15 @@ static int pmu_sys_suspend(struct sys_device *sysdev, 
pm_message_t state)
        if (state.event != PM_EVENT_SUSPEND || pmu_sys_suspended)
                return 0;
 
-       /* Suspend PMU event interrupts */
+       /* Suspend PMU event interrupts */\
        pmu_suspend();
-
        pmu_sys_suspended = 1;
+
+#ifdef CONFIG_PMAC_BACKLIGHT
+       /* Tell backlight code not to muck around with the chip anymore */
+       pmu_backlight_set_sleep(1);
+#endif
+
        return 0;
 }
 
@@ -2475,9 +2468,12 @@ static int pmu_sys_resume(struct sys_device *sysdev)
        pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
        pmu_wait_complete(&req);
 
+#ifdef CONFIG_PMAC_BACKLIGHT
+       /* Tell backlight code it can use the chip again */
+       pmu_backlight_set_sleep(0);
+#endif
        /* Resume PMU event interrupts */
        pmu_resume();
-
        pmu_sys_suspended = 0;
 
        return 0;
diff --git a/include/linux/pmu.h b/include/linux/pmu.h
index 177ae48..4c5f653 100644
--- a/include/linux/pmu.h
+++ b/include/linux/pmu.h
@@ -159,6 +159,8 @@ extern void pmu_unlock(void);
 extern int pmu_present(void);
 extern int pmu_get_model(void);
 
+extern void pmu_backlight_set_sleep(int sleep);
+
 #define PMU_MAX_BATTERIES      2
 
 /* values for pmu_power_flags */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to