Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (43 commits) [POWERPC] Use little-endian bit from firmware ibm,pa-features property [POWERPC] Make sure smp_processor_id works very early in boot [POWERPC] U4 DART improvements [POWERPC] todc: add support for Time-Of-Day-Clock [POWERPC] Make lparcfg.c work when both iseries and pseries are selected [POWERPC] Fix idr locking in init_new_context [POWERPC] mpc7448hpc2 (taiga) board config file [POWERPC] Add tsi108 pci and platform device data register function [POWERPC] Add general support for mpc7448hpc2 (Taiga) platform [POWERPC] Correct the MAX_CONTEXT definition powerpc: minor cleanups for mpc86xx [POWERPC] Make sure we select CONFIG_NEW_LEDS if ADB_PMU_LED is set [POWERPC] Simplify the code defining the 64-bit CPU features [POWERPC] powerpc: kconfig warning fix [POWERPC] Consolidate some of kernel/misc*.S [POWERPC] Remove unused function call_with_mmu_off [POWERPC] update asm-powerpc/time.h [POWERPC] Clean up it_lp_queue.h [POWERPC] Skip the "copy down" of the kernel if it is already at zero. [POWERPC] Add the use of the firmware soft-reset-nmi to kdump. ...
This commit is contained in:
@@ -78,6 +78,18 @@ config ADB_PMU
|
||||
this device; you should do so if your machine is one of those
|
||||
mentioned above.
|
||||
|
||||
config ADB_PMU_LED
|
||||
bool "Support for the Power/iBook front LED"
|
||||
depends on ADB_PMU
|
||||
select NEW_LEDS
|
||||
select LEDS_CLASS
|
||||
help
|
||||
Support the front LED on Power/iBooks as a generic LED that can
|
||||
be triggered by any of the supported triggers. To get the
|
||||
behaviour of the old CONFIG_BLK_DEV_IDE_PMAC_BLINK, select this
|
||||
and the ide-disk LED trigger and configure appropriately through
|
||||
sysfs.
|
||||
|
||||
config PMAC_SMU
|
||||
bool "Support for SMU based PowerMacs"
|
||||
depends on PPC_PMAC64
|
||||
|
||||
@@ -12,6 +12,7 @@ obj-$(CONFIG_INPUT_ADBHID) += adbhid.o
|
||||
obj-$(CONFIG_ANSLCD) += ans-lcd.o
|
||||
|
||||
obj-$(CONFIG_ADB_PMU) += via-pmu.o via-pmu-event.o
|
||||
obj-$(CONFIG_ADB_PMU_LED) += via-pmu-led.o
|
||||
obj-$(CONFIG_PMAC_BACKLIGHT) += via-pmu-backlight.o
|
||||
obj-$(CONFIG_ADB_CUDA) += via-cuda.o
|
||||
obj-$(CONFIG_PMAC_APM_EMU) += apm_emu.o
|
||||
|
||||
144
drivers/macintosh/via-pmu-led.c
Normal file
144
drivers/macintosh/via-pmu-led.c
Normal file
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
* via-pmu LED class device
|
||||
*
|
||||
* Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
|
||||
* NON INFRINGEMENT. See the GNU General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/adb.h>
|
||||
#include <linux/pmu.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
static spinlock_t pmu_blink_lock;
|
||||
static struct adb_request pmu_blink_req;
|
||||
/* -1: no change, 0: request off, 1: request on */
|
||||
static int requested_change;
|
||||
static int sleeping;
|
||||
|
||||
static void pmu_req_done(struct adb_request * req)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&pmu_blink_lock, flags);
|
||||
/* if someone requested a change in the meantime
|
||||
* (we only see the last one which is fine)
|
||||
* then apply it now */
|
||||
if (requested_change != -1 && !sleeping)
|
||||
pmu_request(&pmu_blink_req, NULL, 4, 0xee, 4, 0, requested_change);
|
||||
/* reset requested change */
|
||||
requested_change = -1;
|
||||
spin_unlock_irqrestore(&pmu_blink_lock, flags);
|
||||
}
|
||||
|
||||
static void pmu_led_set(struct led_classdev *led_cdev,
|
||||
enum led_brightness brightness)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&pmu_blink_lock, flags);
|
||||
switch (brightness) {
|
||||
case LED_OFF:
|
||||
requested_change = 0;
|
||||
break;
|
||||
case LED_FULL:
|
||||
requested_change = 1;
|
||||
break;
|
||||
default:
|
||||
goto out;
|
||||
break;
|
||||
}
|
||||
/* if request isn't done, then don't do anything */
|
||||
if (pmu_blink_req.complete && !sleeping)
|
||||
pmu_request(&pmu_blink_req, NULL, 4, 0xee, 4, 0, requested_change);
|
||||
out:
|
||||
spin_unlock_irqrestore(&pmu_blink_lock, flags);
|
||||
}
|
||||
|
||||
static struct led_classdev pmu_led = {
|
||||
.name = "pmu-front-led",
|
||||
#ifdef CONFIG_BLK_DEV_IDE_PMAC_BLINK
|
||||
.default_trigger = "ide-disk",
|
||||
#endif
|
||||
.brightness_set = pmu_led_set,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int pmu_led_sleep_call(struct pmu_sleep_notifier *self, int when)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&pmu_blink_lock, flags);
|
||||
|
||||
switch (when) {
|
||||
case PBOOK_SLEEP_REQUEST:
|
||||
sleeping = 1;
|
||||
break;
|
||||
case PBOOK_WAKE:
|
||||
sleeping = 0;
|
||||
break;
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&pmu_blink_lock, flags);
|
||||
|
||||
return PBOOK_SLEEP_OK;
|
||||
}
|
||||
|
||||
static struct pmu_sleep_notifier via_pmu_led_sleep_notif = {
|
||||
.notifier_call = pmu_led_sleep_call,
|
||||
};
|
||||
#endif
|
||||
|
||||
static int __init via_pmu_led_init(void)
|
||||
{
|
||||
struct device_node *dt;
|
||||
const char *model;
|
||||
|
||||
/* only do this on keylargo based models */
|
||||
if (pmu_get_model() != PMU_KEYLARGO_BASED)
|
||||
return -ENODEV;
|
||||
|
||||
dt = of_find_node_by_path("/");
|
||||
if (dt == NULL)
|
||||
return -ENODEV;
|
||||
model = (const char *)get_property(dt, "model", NULL);
|
||||
if (model == NULL)
|
||||
return -ENODEV;
|
||||
if (strncmp(model, "PowerBook", strlen("PowerBook")) != 0 &&
|
||||
strncmp(model, "iBook", strlen("iBook")) != 0) {
|
||||
of_node_put(dt);
|
||||
/* ignore */
|
||||
return -ENODEV;
|
||||
}
|
||||
of_node_put(dt);
|
||||
|
||||
spin_lock_init(&pmu_blink_lock);
|
||||
/* no outstanding req */
|
||||
pmu_blink_req.complete = 1;
|
||||
pmu_blink_req.done = pmu_req_done;
|
||||
#ifdef CONFIG_PM
|
||||
pmu_register_sleep_notifier(&via_pmu_led_sleep_notif);
|
||||
#endif
|
||||
return led_classdev_register(NULL, &pmu_led);
|
||||
}
|
||||
|
||||
late_initcall(via_pmu_led_init);
|
||||
Reference in New Issue
Block a user