Subject: [PATCH] [acpi video] Add device proc interface - Add these files: - info (ro) - EDID (ro) - state (rw) - brightness (rw) Should be compatible with the legacy interface.. Signed-off-by: Patrick Mochel --- drivers/acpi/drivers/video/dev-proc.c | 166 +++++++++++++++++++++++++++++++++ 1 files changed, 165 insertions(+), 1 deletions(-) applies-to: 259218663e48b1d6263f0d303d01b8df9d88b8fd 72723f17185a98eebd96b50a01944358cf76c6bf diff --git a/drivers/acpi/drivers/video/dev-proc.c b/drivers/acpi/drivers/video/dev-proc.c index 710d731..9a93059 100644 --- a/drivers/acpi/drivers/video/dev-proc.c +++ b/drivers/acpi/drivers/video/dev-proc.c @@ -13,4 +13,168 @@ #include #include "video.h" -acpi_driver_proc_none(video); + +static int read_info(struct seq_file * seq, void * offset) +{ + struct acpi_dev * ad = seq->private; + struct acpi_video_dev * vd = dev_get_drvdata(&ad->dev); + + seq_printf(seq, "device_id: %#04x\n", vd->v_id.v_device_id); + seq_printf(seq, "type: %s\n", video_dev_string(vd)); + seq_printf(seq, "known by bios: %s\n", + vd->v_id.v_bios_detect ? "yes" : "no"); + + return 0; +} + +static int open_info(struct inode * inode, struct file * file) +{ + return single_open(file, read_info, PDE(inode)->data); +} + + +static int read_state(struct seq_file * seq, void * offset) +{ + struct acpi_dev * ad = seq->private; + struct acpi_video_dev * vd = dev_get_drvdata(&ad->dev); + u32 output_state, graphics_state; + int ret = 0; + + if (vd->v_hotkey) { + ret = video_dev_get_state(vd, &output_state, &graphics_state); + if (!ret) { + seq_printf(seq, "state: %#02x\n", output_state); + seq_printf(seq, "query: %#02x\n", graphics_state); + } + } else { + seq_printf(seq, "state: \n"); + seq_printf(seq, "query: \n"); + } + return ret; +} + +static ssize_t write_state(struct file *file, const char __user * buffer, + size_t count, loff_t * ppos) +{ + struct seq_file * m = file->private_data; + struct acpi_dev * ad = m->private; + struct acpi_video_dev * vd = dev_get_drvdata(&ad->dev); + + unsigned long state; + char str[12] = ""; + char * end; + int ret; + + if (count < 1 || count >= sizeof(str)) + return -EINVAL; + + if (copy_from_user(str, buffer, count)) + return -EFAULT; + + state = strtoul(str, &end, 0); + if (*end != '\0') + return -EINVAL; + + /* + * Mask off invalid values + */ + state &= 0xc0000001; + + ret = video_dev_set_state(vd, state); + + return ret == 0 ? count : ret; +} + +static int open_state(struct inode * inode, struct file * file) +{ + return single_open(file, read_state, PDE(inode)->data); +} + + +static int read_EDID(struct seq_file * seq, void * offset) +{ + struct acpi_dev * ad = seq->private; + struct acpi_video_dev * vd = dev_get_drvdata(&ad->dev); + char * buffer; + size_t len; + int ret; + int i; + + ret = video_dev_edid(vd, &buffer, &len); + if (ret) + return ret; + + for (i = 0; i < len; i++) + seq_putc(seq, buffer[i]); + + kfree(buffer); + return 0; +} + +static int open_EDID(struct inode * inode, struct file * file) +{ + return single_open(file, read_EDID, PDE(inode)->data); +} + + +static int read_brightness(struct seq_file * seq, void * offset) +{ + struct acpi_dev * ad = seq->private; + struct acpi_video_dev * vd = dev_get_drvdata(&ad->dev); + int i; + + if (vd->v_br) { + seq_printf(seq, "levels: "); + for (i = 0; i < vd->v_br_num; i++) + seq_printf(seq, " %d", vd->v_br_levels[i]); + seq_printf(seq, "\n"); + seq_printf(seq, "current: %d\n", vd->v_br_current); + } else + seq_printf(seq, "query: \n"); + return 0; +} + +static ssize_t write_brightness(struct file *file, const char __user * buffer, + size_t count, loff_t * ppos) +{ + struct seq_file * m = file->private_data; + struct acpi_dev * ad = m->private; + struct acpi_video_dev * vd = dev_get_drvdata(&ad->dev); + + unsigned long level; + char str[12] = ""; + char * end; + int ret; + + if (!vd->v_lcd) + return -EIO; + + if (count < 1 || count >= sizeof(str)) + return -EINVAL; + + if (copy_from_user(str, buffer, count)) + return -EFAULT; + + level = strtoul(str, &end, 0); + if (*end != '\0') + return -EINVAL; + + ret = video_dev_set_lcd(vd, level); + + return ret == 0 ? count : ret; +} + +static int open_brightness(struct inode * inode, struct file * file) +{ + return single_open(file, read_brightness, PDE(inode)->data); +} + + +static struct acpi_proc_file video_files[] = { + proc_file_ro(info), + proc_file_ro(EDID), + proc_file_rw(state), + proc_file_rw(brightness), +}; + +acpi_driver_proc(video); --- 0.99.9.GIT