diff options
| -rw-r--r-- | drivers/macintosh/via-pmu.c | 160 |
1 files changed, 91 insertions, 69 deletions
diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c index 6f308a4757ee..db379c381432 100644 --- a/drivers/macintosh/via-pmu.c +++ b/drivers/macintosh/via-pmu.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/spinlock.h> | 36 | #include <linux/spinlock.h> |
| 37 | #include <linux/pm.h> | 37 | #include <linux/pm.h> |
| 38 | #include <linux/proc_fs.h> | 38 | #include <linux/proc_fs.h> |
| 39 | #include <linux/seq_file.h> | ||
| 39 | #include <linux/init.h> | 40 | #include <linux/init.h> |
| 40 | #include <linux/interrupt.h> | 41 | #include <linux/interrupt.h> |
| 41 | #include <linux/device.h> | 42 | #include <linux/device.h> |
| @@ -186,17 +187,11 @@ static int init_pmu(void); | |||
| 186 | static void pmu_start(void); | 187 | static void pmu_start(void); |
| 187 | static irqreturn_t via_pmu_interrupt(int irq, void *arg); | 188 | static irqreturn_t via_pmu_interrupt(int irq, void *arg); |
| 188 | static irqreturn_t gpio1_interrupt(int irq, void *arg); | 189 | static irqreturn_t gpio1_interrupt(int irq, void *arg); |
| 189 | static int proc_get_info(char *page, char **start, off_t off, | 190 | static const struct file_operations pmu_info_proc_fops; |
| 190 | int count, int *eof, void *data); | 191 | static const struct file_operations pmu_irqstats_proc_fops; |
| 191 | static int proc_get_irqstats(char *page, char **start, off_t off, | ||
| 192 | int count, int *eof, void *data); | ||
| 193 | static void pmu_pass_intr(unsigned char *data, int len); | 192 | static void pmu_pass_intr(unsigned char *data, int len); |
| 194 | static int proc_get_batt(char *page, char **start, off_t off, | 193 | static const struct file_operations pmu_battery_proc_fops; |
| 195 | int count, int *eof, void *data); | 194 | static const struct file_operations pmu_options_proc_fops; |
| 196 | static int proc_read_options(char *page, char **start, off_t off, | ||
| 197 | int count, int *eof, void *data); | ||
| 198 | static int proc_write_options(struct file *file, const char __user *buffer, | ||
| 199 | unsigned long count, void *data); | ||
| 200 | 195 | ||
| 201 | #ifdef CONFIG_ADB | 196 | #ifdef CONFIG_ADB |
| 202 | struct adb_driver via_pmu_driver = { | 197 | struct adb_driver via_pmu_driver = { |
| @@ -507,19 +502,15 @@ static int __init via_pmu_dev_init(void) | |||
| 507 | for (i=0; i<pmu_battery_count; i++) { | 502 | for (i=0; i<pmu_battery_count; i++) { |
| 508 | char title[16]; | 503 | char title[16]; |
| 509 | sprintf(title, "battery_%ld", i); | 504 | sprintf(title, "battery_%ld", i); |
| 510 | proc_pmu_batt[i] = create_proc_read_entry(title, 0, proc_pmu_root, | 505 | proc_pmu_batt[i] = proc_create_data(title, 0, proc_pmu_root, |
| 511 | proc_get_batt, (void *)i); | 506 | &pmu_battery_proc_fops, (void *)i); |
| 512 | } | 507 | } |
| 513 | 508 | ||
| 514 | proc_pmu_info = create_proc_read_entry("info", 0, proc_pmu_root, | 509 | proc_pmu_info = proc_create("info", 0, proc_pmu_root, &pmu_info_proc_fops); |
| 515 | proc_get_info, NULL); | 510 | proc_pmu_irqstats = proc_create("interrupts", 0, proc_pmu_root, |
| 516 | proc_pmu_irqstats = create_proc_read_entry("interrupts", 0, proc_pmu_root, | 511 | &pmu_irqstats_proc_fops); |
| 517 | proc_get_irqstats, NULL); | 512 | proc_pmu_options = proc_create("options", 0600, proc_pmu_root, |
| 518 | proc_pmu_options = create_proc_entry("options", 0600, proc_pmu_root); | 513 | &pmu_options_proc_fops); |
| 519 | if (proc_pmu_options) { | ||
| 520 | proc_pmu_options->read_proc = proc_read_options; | ||
| 521 | proc_pmu_options->write_proc = proc_write_options; | ||
| 522 | } | ||
| 523 | } | 514 | } |
| 524 | return 0; | 515 | return 0; |
| 525 | } | 516 | } |
| @@ -799,27 +790,33 @@ query_battery_state(void) | |||
| 799 | 2, PMU_SMART_BATTERY_STATE, pmu_cur_battery+1); | 790 | 2, PMU_SMART_BATTERY_STATE, pmu_cur_battery+1); |
| 800 | } | 791 | } |
| 801 | 792 | ||
| 802 | static int | 793 | static int pmu_info_proc_show(struct seq_file *m, void *v) |
| 803 | proc_get_info(char *page, char **start, off_t off, | ||
| 804 | int count, int *eof, void *data) | ||
| 805 | { | 794 | { |
| 806 | char* p = page; | 795 | seq_printf(m, "PMU driver version : %d\n", PMU_DRIVER_VERSION); |
| 807 | 796 | seq_printf(m, "PMU firmware version : %02x\n", pmu_version); | |
| 808 | p += sprintf(p, "PMU driver version : %d\n", PMU_DRIVER_VERSION); | 797 | seq_printf(m, "AC Power : %d\n", |
| 809 | p += sprintf(p, "PMU firmware version : %02x\n", pmu_version); | ||
| 810 | p += sprintf(p, "AC Power : %d\n", | ||
| 811 | ((pmu_power_flags & PMU_PWR_AC_PRESENT) != 0) || pmu_battery_count == 0); | 798 | ((pmu_power_flags & PMU_PWR_AC_PRESENT) != 0) || pmu_battery_count == 0); |
| 812 | p += sprintf(p, "Battery count : %d\n", pmu_battery_count); | 799 | seq_printf(m, "Battery count : %d\n", pmu_battery_count); |
| 800 | |||
| 801 | return 0; | ||
| 802 | } | ||
| 813 | 803 | ||
| 814 | return p - page; | 804 | static int pmu_info_proc_open(struct inode *inode, struct file *file) |
| 805 | { | ||
| 806 | return single_open(file, pmu_info_proc_show, NULL); | ||
| 815 | } | 807 | } |
| 816 | 808 | ||
| 817 | static int | 809 | static const struct file_operations pmu_info_proc_fops = { |
| 818 | proc_get_irqstats(char *page, char **start, off_t off, | 810 | .owner = THIS_MODULE, |
| 819 | int count, int *eof, void *data) | 811 | .open = pmu_info_proc_open, |
| 812 | .read = seq_read, | ||
| 813 | .llseek = seq_lseek, | ||
| 814 | .release = single_release, | ||
| 815 | }; | ||
| 816 | |||
| 817 | static int pmu_irqstats_proc_show(struct seq_file *m, void *v) | ||
| 820 | { | 818 | { |
| 821 | int i; | 819 | int i; |
| 822 | char* p = page; | ||
| 823 | static const char *irq_names[] = { | 820 | static const char *irq_names[] = { |
| 824 | "Total CB1 triggered events", | 821 | "Total CB1 triggered events", |
| 825 | "Total GPIO1 triggered events", | 822 | "Total GPIO1 triggered events", |
| @@ -835,60 +832,76 @@ proc_get_irqstats(char *page, char **start, off_t off, | |||
| 835 | }; | 832 | }; |
| 836 | 833 | ||
| 837 | for (i=0; i<11; i++) { | 834 | for (i=0; i<11; i++) { |
| 838 | p += sprintf(p, " %2u: %10u (%s)\n", | 835 | seq_printf(m, " %2u: %10u (%s)\n", |
| 839 | i, pmu_irq_stats[i], irq_names[i]); | 836 | i, pmu_irq_stats[i], irq_names[i]); |
| 840 | } | 837 | } |
| 841 | return p - page; | 838 | return 0; |
| 842 | } | 839 | } |
| 843 | 840 | ||
| 844 | static int | 841 | static int pmu_irqstats_proc_open(struct inode *inode, struct file *file) |
| 845 | proc_get_batt(char *page, char **start, off_t off, | ||
| 846 | int count, int *eof, void *data) | ||
| 847 | { | 842 | { |
| 848 | long batnum = (long)data; | 843 | return single_open(file, pmu_irqstats_proc_show, NULL); |
| 849 | char *p = page; | 844 | } |
| 845 | |||
| 846 | static const struct file_operations pmu_irqstats_proc_fops = { | ||
| 847 | .owner = THIS_MODULE, | ||
| 848 | .open = pmu_irqstats_proc_open, | ||
| 849 | .read = seq_read, | ||
| 850 | .llseek = seq_lseek, | ||
| 851 | .release = single_release, | ||
| 852 | }; | ||
| 853 | |||
| 854 | static int pmu_battery_proc_show(struct seq_file *m, void *v) | ||
| 855 | { | ||
| 856 | long batnum = (long)m->private; | ||
| 850 | 857 | ||
| 851 | p += sprintf(p, "\n"); | 858 | seq_putc(m, '\n'); |
| 852 | p += sprintf(p, "flags : %08x\n", | 859 | seq_printf(m, "flags : %08x\n", pmu_batteries[batnum].flags); |
| 853 | pmu_batteries[batnum].flags); | 860 | seq_printf(m, "charge : %d\n", pmu_batteries[batnum].charge); |
| 854 | p += sprintf(p, "charge : %d\n", | 861 | seq_printf(m, "max_charge : %d\n", pmu_batteries[batnum].max_charge); |
| 855 | pmu_batteries[batnum].charge); | 862 | seq_printf(m, "current : %d\n", pmu_batteries[batnum].amperage); |
| 856 | p += sprintf(p, "max_charge : %d\n", | 863 | seq_printf(m, "voltage : %d\n", pmu_batteries[batnum].voltage); |
| 857 | pmu_batteries[batnum].max_charge); | 864 | seq_printf(m, "time rem. : %d\n", pmu_batteries[batnum].time_remaining); |
| 858 | p += sprintf(p, "current : %d\n", | 865 | return 0; |
| 859 | pmu_batteries[batnum].amperage); | ||
| 860 | p += sprintf(p, "voltage : %d\n", | ||
| 861 | pmu_batteries[batnum].voltage); | ||
| 862 | p += sprintf(p, "time rem. : %d\n", | ||
| 863 | pmu_batteries[batnum].time_remaining); | ||
| 864 | |||
| 865 | return p - page; | ||
| 866 | } | 866 | } |
| 867 | 867 | ||
| 868 | static int | 868 | static int pmu_battery_proc_open(struct inode *inode, struct file *file) |
| 869 | proc_read_options(char *page, char **start, off_t off, | ||
| 870 | int count, int *eof, void *data) | ||
| 871 | { | 869 | { |
| 872 | char *p = page; | 870 | return single_open(file, pmu_battery_proc_show, PDE(inode)->data); |
| 871 | } | ||
| 873 | 872 | ||
| 873 | static const struct file_operations pmu_battery_proc_fops = { | ||
| 874 | .owner = THIS_MODULE, | ||
| 875 | .open = pmu_battery_proc_open, | ||
| 876 | .read = seq_read, | ||
| 877 | .llseek = seq_lseek, | ||
| 878 | .release = single_release, | ||
| 879 | }; | ||
| 880 | |||
| 881 | static int pmu_options_proc_show(struct seq_file *m, void *v) | ||
| 882 | { | ||
| 874 | #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32) | 883 | #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32) |
| 875 | if (pmu_kind == PMU_KEYLARGO_BASED && | 884 | if (pmu_kind == PMU_KEYLARGO_BASED && |
| 876 | pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0) | 885 | pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0) |
| 877 | p += sprintf(p, "lid_wakeup=%d\n", option_lid_wakeup); | 886 | seq_printf(m, "lid_wakeup=%d\n", option_lid_wakeup); |
| 878 | #endif | 887 | #endif |
| 879 | if (pmu_kind == PMU_KEYLARGO_BASED) | 888 | if (pmu_kind == PMU_KEYLARGO_BASED) |
| 880 | p += sprintf(p, "server_mode=%d\n", option_server_mode); | 889 | seq_printf(m, "server_mode=%d\n", option_server_mode); |
| 881 | 890 | ||
| 882 | return p - page; | 891 | return 0; |
| 883 | } | 892 | } |
| 884 | 893 | ||
| 885 | static int | 894 | static int pmu_options_proc_open(struct inode *inode, struct file *file) |
| 886 | proc_write_options(struct file *file, const char __user *buffer, | 895 | { |
| 887 | unsigned long count, void *data) | 896 | return single_open(file, pmu_options_proc_show, NULL); |
| 897 | } | ||
| 898 | |||
| 899 | static ssize_t pmu_options_proc_write(struct file *file, | ||
| 900 | const char __user *buffer, size_t count, loff_t *pos) | ||
| 888 | { | 901 | { |
| 889 | char tmp[33]; | 902 | char tmp[33]; |
| 890 | char *label, *val; | 903 | char *label, *val; |
| 891 | unsigned long fcount = count; | 904 | size_t fcount = count; |
| 892 | 905 | ||
| 893 | if (!count) | 906 | if (!count) |
| 894 | return -EINVAL; | 907 | return -EINVAL; |
| @@ -927,6 +940,15 @@ proc_write_options(struct file *file, const char __user *buffer, | |||
| 927 | return fcount; | 940 | return fcount; |
| 928 | } | 941 | } |
| 929 | 942 | ||
| 943 | static const struct file_operations pmu_options_proc_fops = { | ||
| 944 | .owner = THIS_MODULE, | ||
| 945 | .open = pmu_options_proc_open, | ||
| 946 | .read = seq_read, | ||
| 947 | .llseek = seq_lseek, | ||
| 948 | .release = single_release, | ||
| 949 | .write = pmu_options_proc_write, | ||
| 950 | }; | ||
| 951 | |||
| 930 | #ifdef CONFIG_ADB | 952 | #ifdef CONFIG_ADB |
| 931 | /* Send an ADB command */ | 953 | /* Send an ADB command */ |
| 932 | static int pmu_send_request(struct adb_request *req, int sync) | 954 | static int pmu_send_request(struct adb_request *req, int sync) |
