Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 131492
b: refs/heads/master
c: ef2cfc7
h: refs/heads/master
v: v3
  • Loading branch information
Pavel Machek authored and Linus Torvalds committed Feb 18, 2009
1 parent 21c1a60 commit 5cf683c
Show file tree
Hide file tree
Showing 6 changed files with 297 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3a5093ee6728c8cbe9c039e685fc1fca8f965048
refs/heads/master: ef2cfc790bf5f0ff189b01eabc0f4feb5e8524df
101 changes: 101 additions & 0 deletions trunk/Documentation/hwmon/hpfall.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/* Disk protection for HP machines.
*
* Copyright 2008 Eric Piel
* Copyright 2009 Pavel Machek <pavel@suse.cz>
*
* GPLv2.
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <signal.h>

void write_int(char *path, int i)
{
char buf[1024];
int fd = open(path, O_RDWR);
if (fd < 0) {
perror("open");
exit(1);
}
sprintf(buf, "%d", i);
if (write(fd, buf, strlen(buf)) != strlen(buf)) {
perror("write");
exit(1);
}
close(fd);
}

void set_led(int on)
{
write_int("/sys/class/leds/hp::hddprotect/brightness", on);
}

void protect(int seconds)
{
write_int("/sys/block/sda/device/unload_heads", seconds*1000);
}

int on_ac(void)
{
// /sys/class/power_supply/AC0/online
}

int lid_open(void)
{
// /proc/acpi/button/lid/LID/state
}

void ignore_me(void)
{
protect(0);
set_led(0);

}

int main(int argc, char* argv[])
{
int fd, ret;

fd = open("/dev/freefall", O_RDONLY);
if (fd < 0) {
perror("open");
return EXIT_FAILURE;
}

signal(SIGALRM, ignore_me);

for (;;) {
unsigned char count;

ret = read(fd, &count, sizeof(count));
alarm(0);
if ((ret == -1) && (errno == EINTR)) {
/* Alarm expired, time to unpark the heads */
continue;
}

if (ret != sizeof(count)) {
perror("read");
break;
}

protect(21);
set_led(1);
if (1 || on_ac() || lid_open()) {
alarm(2);
} else {
alarm(20);
}
}

close(fd);
return EXIT_SUCCESS;
}
8 changes: 8 additions & 0 deletions trunk/Documentation/hwmon/lis3lv02d
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ rate - reports the sampling rate of the accelerometer device in HZ
This driver also provides an absolute input class device, allowing
the laptop to act as a pinball machine-esque joystick.

Another feature of the driver is misc device called "freefall" that
acts similar to /dev/rtc and reacts on free-fall interrupts received
from the device. It supports blocking operations, poll/select and
fasync operation modes. You must read 1 bytes from the device. The
result is number of free-fall interrupts since the last successful
read (or 255 if number of interrupts would not fit).


Axes orientation
----------------

Expand Down
27 changes: 27 additions & 0 deletions trunk/drivers/hwmon/hp_accel.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,30 @@ static struct delayed_led_classdev hpled_led = {
.set_brightness = hpled_set,
};

static acpi_status
lis3lv02d_get_resource(struct acpi_resource *resource, void *context)
{
if (resource->type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ) {
struct acpi_resource_extended_irq *irq;
u32 *device_irq = context;

irq = &resource->data.extended_irq;
*device_irq = irq->interrupts[0];
}

return AE_OK;
}

static void lis3lv02d_enum_resources(struct acpi_device *device)
{
acpi_status status;

status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
lis3lv02d_get_resource, &adev.irq);
if (ACPI_FAILURE(status))
printk(KERN_DEBUG DRIVER_NAME ": Error getting resources\n");
}

static int lis3lv02d_add(struct acpi_device *device)
{
u8 val;
Expand Down Expand Up @@ -247,6 +271,9 @@ static int lis3lv02d_add(struct acpi_device *device)
if (ret)
return ret;

/* obtain IRQ number of our device from ACPI */
lis3lv02d_enum_resources(adev.device);

ret = lis3lv02d_init_device(&adev);
if (ret) {
flush_work(&hpled_led.work);
Expand Down
Loading

0 comments on commit 5cf683c

Please sign in to comment.