|
@@ -25,24 +25,30 @@
|
|
|
#define CORGI_DEFAULT_INTENSITY 0x1f
|
|
|
#define CORGI_LIMIT_MASK 0x0b
|
|
|
|
|
|
-static int corgibl_powermode = FB_BLANK_UNBLANK;
|
|
|
-static int current_intensity = 0;
|
|
|
-static int corgibl_limit = 0;
|
|
|
+static int corgibl_intensity;
|
|
|
static void (*corgibl_mach_set_intensity)(int intensity);
|
|
|
static spinlock_t bl_lock = SPIN_LOCK_UNLOCKED;
|
|
|
static struct backlight_properties corgibl_data;
|
|
|
+static struct backlight_device *corgi_backlight_device;
|
|
|
+
|
|
|
+static unsigned long corgibl_flags;
|
|
|
+#define CORGIBL_SUSPENDED 0x01
|
|
|
+#define CORGIBL_BATTLOW 0x02
|
|
|
|
|
|
-static void corgibl_send_intensity(int intensity)
|
|
|
+static int corgibl_send_intensity(struct backlight_device *bd)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
void (*corgi_kick_batt)(void);
|
|
|
+ int intensity = bd->props->brightness;
|
|
|
|
|
|
- if (corgibl_powermode != FB_BLANK_UNBLANK) {
|
|
|
+ if (bd->props->power != FB_BLANK_UNBLANK)
|
|
|
+ intensity = 0;
|
|
|
+ if (bd->props->fb_blank != FB_BLANK_UNBLANK)
|
|
|
intensity = 0;
|
|
|
- } else {
|
|
|
- if (corgibl_limit)
|
|
|
- intensity &= CORGI_LIMIT_MASK;
|
|
|
- }
|
|
|
+ if (corgibl_flags & CORGIBL_SUSPENDED)
|
|
|
+ intensity = 0;
|
|
|
+ if (corgibl_flags & CORGIBL_BATTLOW)
|
|
|
+ intensity &= CORGI_LIMIT_MASK;
|
|
|
|
|
|
spin_lock_irqsave(&bl_lock, flags);
|
|
|
|
|
@@ -50,45 +56,29 @@ static void corgibl_send_intensity(int intensity)
|
|
|
|
|
|
spin_unlock_irqrestore(&bl_lock, flags);
|
|
|
|
|
|
+ corgibl_intensity = intensity;
|
|
|
+
|
|
|
corgi_kick_batt = symbol_get(sharpsl_battery_kick);
|
|
|
if (corgi_kick_batt) {
|
|
|
corgi_kick_batt();
|
|
|
symbol_put(sharpsl_battery_kick);
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-static void corgibl_blank(int blank)
|
|
|
-{
|
|
|
- switch(blank) {
|
|
|
-
|
|
|
- case FB_BLANK_NORMAL:
|
|
|
- case FB_BLANK_VSYNC_SUSPEND:
|
|
|
- case FB_BLANK_HSYNC_SUSPEND:
|
|
|
- case FB_BLANK_POWERDOWN:
|
|
|
- if (corgibl_powermode == FB_BLANK_UNBLANK) {
|
|
|
- corgibl_send_intensity(0);
|
|
|
- corgibl_powermode = blank;
|
|
|
- }
|
|
|
- break;
|
|
|
- case FB_BLANK_UNBLANK:
|
|
|
- if (corgibl_powermode != FB_BLANK_UNBLANK) {
|
|
|
- corgibl_powermode = blank;
|
|
|
- corgibl_send_intensity(current_intensity);
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
|
static int corgibl_suspend(struct platform_device *dev, pm_message_t state)
|
|
|
{
|
|
|
- corgibl_blank(FB_BLANK_POWERDOWN);
|
|
|
+ corgibl_flags |= CORGIBL_SUSPENDED;
|
|
|
+ corgibl_send_intensity(corgi_backlight_device);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
static int corgibl_resume(struct platform_device *dev)
|
|
|
{
|
|
|
- corgibl_blank(FB_BLANK_UNBLANK);
|
|
|
+ corgibl_flags &= ~CORGIBL_SUSPENDED;
|
|
|
+ corgibl_send_intensity(corgi_backlight_device);
|
|
|
return 0;
|
|
|
}
|
|
|
#else
|
|
@@ -96,54 +86,38 @@ static int corgibl_resume(struct platform_device *dev)
|
|
|
#define corgibl_resume NULL
|
|
|
#endif
|
|
|
|
|
|
-
|
|
|
-static int corgibl_set_power(struct backlight_device *bd, int state)
|
|
|
-{
|
|
|
- corgibl_blank(state);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int corgibl_get_power(struct backlight_device *bd)
|
|
|
+static int corgibl_get_intensity(struct backlight_device *bd)
|
|
|
{
|
|
|
- return corgibl_powermode;
|
|
|
+ return corgibl_intensity;
|
|
|
}
|
|
|
|
|
|
-static int corgibl_set_intensity(struct backlight_device *bd, int intensity)
|
|
|
+static int corgibl_set_intensity(struct backlight_device *bd)
|
|
|
{
|
|
|
- if (intensity > corgibl_data.max_brightness)
|
|
|
- intensity = corgibl_data.max_brightness;
|
|
|
- corgibl_send_intensity(intensity);
|
|
|
- current_intensity=intensity;
|
|
|
+ corgibl_send_intensity(corgi_backlight_device);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int corgibl_get_intensity(struct backlight_device *bd)
|
|
|
-{
|
|
|
- return current_intensity;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Called when the battery is low to limit the backlight intensity.
|
|
|
* If limit==0 clear any limit, otherwise limit the intensity
|
|
|
*/
|
|
|
void corgibl_limit_intensity(int limit)
|
|
|
{
|
|
|
- corgibl_limit = (limit ? 1 : 0);
|
|
|
- corgibl_send_intensity(current_intensity);
|
|
|
+ if (limit)
|
|
|
+ corgibl_flags |= CORGIBL_BATTLOW;
|
|
|
+ else
|
|
|
+ corgibl_flags &= ~CORGIBL_BATTLOW;
|
|
|
+ corgibl_send_intensity(corgi_backlight_device);
|
|
|
}
|
|
|
EXPORT_SYMBOL(corgibl_limit_intensity);
|
|
|
|
|
|
|
|
|
static struct backlight_properties corgibl_data = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .get_power = corgibl_get_power,
|
|
|
- .set_power = corgibl_set_power,
|
|
|
+ .owner = THIS_MODULE,
|
|
|
.get_brightness = corgibl_get_intensity,
|
|
|
- .set_brightness = corgibl_set_intensity,
|
|
|
+ .update_status = corgibl_set_intensity,
|
|
|
};
|
|
|
|
|
|
-static struct backlight_device *corgi_backlight_device;
|
|
|
-
|
|
|
static int __init corgibl_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct corgibl_machinfo *machinfo = pdev->dev.platform_data;
|
|
@@ -156,8 +130,9 @@ static int __init corgibl_probe(struct platform_device *pdev)
|
|
|
if (IS_ERR (corgi_backlight_device))
|
|
|
return PTR_ERR (corgi_backlight_device);
|
|
|
|
|
|
- corgibl_set_intensity(NULL, CORGI_DEFAULT_INTENSITY);
|
|
|
- corgibl_limit_intensity(0);
|
|
|
+ corgibl_data.power = FB_BLANK_UNBLANK;
|
|
|
+ corgibl_data.brightness = CORGI_DEFAULT_INTENSITY;
|
|
|
+ corgibl_send_intensity(corgi_backlight_device);
|
|
|
|
|
|
printk("Corgi Backlight Driver Initialized.\n");
|
|
|
return 0;
|
|
@@ -167,8 +142,6 @@ static int corgibl_remove(struct platform_device *dev)
|
|
|
{
|
|
|
backlight_device_unregister(corgi_backlight_device);
|
|
|
|
|
|
- corgibl_set_intensity(NULL, 0);
|
|
|
-
|
|
|
printk("Corgi Backlight Driver Unloaded\n");
|
|
|
return 0;
|
|
|
}
|