aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/misc/thinkpad_acpi.c39
-rw-r--r--drivers/misc/thinkpad_acpi.h4
2 files changed, 23 insertions, 20 deletions
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
index 19c14bbe8b29..8829d3c6b444 100644
--- a/drivers/misc/thinkpad_acpi.c
+++ b/drivers/misc/thinkpad_acpi.c
@@ -273,6 +273,17 @@ static int _sta(acpi_handle handle)
273 return status; 273 return status;
274} 274}
275 275
276static int issue_thinkpad_cmos_command(int cmos_cmd)
277{
278 if (!cmos_handle)
279 return -ENXIO;
280
281 if (!acpi_evalf(cmos_handle, NULL, NULL, "vd", cmos_cmd))
282 return -EIO;
283
284 return 0;
285}
286
276/************************************************************************* 287/*************************************************************************
277 * ACPI device model 288 * ACPI device model
278 */ 289 */
@@ -1550,14 +1561,6 @@ static int __init cmos_init(struct ibm_init_struct *iibm)
1550 return (cmos_handle)? 0 : 1; 1561 return (cmos_handle)? 0 : 1;
1551} 1562}
1552 1563
1553static int cmos_eval(int cmos_cmd)
1554{
1555 if (cmos_handle)
1556 return acpi_evalf(cmos_handle, NULL, NULL, "vd", cmos_cmd);
1557 else
1558 return 1;
1559}
1560
1561static int cmos_read(char *p) 1564static int cmos_read(char *p)
1562{ 1565{
1563 int len = 0; 1566 int len = 0;
@@ -1577,10 +1580,7 @@ static int cmos_read(char *p)
1577static int cmos_write(char *buf) 1580static int cmos_write(char *buf)
1578{ 1581{
1579 char *cmd; 1582 char *cmd;
1580 int cmos_cmd; 1583 int cmos_cmd, res;
1581
1582 if (!cmos_handle)
1583 return -EINVAL;
1584 1584
1585 while ((cmd = next_cmd(&buf))) { 1585 while ((cmd = next_cmd(&buf))) {
1586 if (sscanf(cmd, "%u", &cmos_cmd) == 1 && 1586 if (sscanf(cmd, "%u", &cmos_cmd) == 1 &&
@@ -1589,8 +1589,9 @@ static int cmos_write(char *buf)
1589 } else 1589 } else
1590 return -EINVAL; 1590 return -EINVAL;
1591 1591
1592 if (!cmos_eval(cmos_cmd)) 1592 res = issue_thinkpad_cmos_command(cmos_cmd);
1593 return -EIO; 1593 if (res)
1594 return res;
1594 } 1595 }
1595 1596
1596 return 0; 1597 return 0;
@@ -2093,7 +2094,7 @@ static int brightness_set(int value)
2093 cmos_cmd = value > current_value ? TP_CMOS_BRIGHTNESS_UP : TP_CMOS_BRIGHTNESS_DOWN; 2094 cmos_cmd = value > current_value ? TP_CMOS_BRIGHTNESS_UP : TP_CMOS_BRIGHTNESS_DOWN;
2094 inc = value > current_value ? 1 : -1; 2095 inc = value > current_value ? 1 : -1;
2095 for (i = current_value; i != value; i += inc) { 2096 for (i = current_value; i != value; i += inc) {
2096 if (!cmos_eval(cmos_cmd)) 2097 if (issue_thinkpad_cmos_command(cmos_cmd))
2097 return -EIO; 2098 return -EIO;
2098 if (!acpi_ec_write(brightness_offset, i + inc)) 2099 if (!acpi_ec_write(brightness_offset, i + inc))
2099 return -EIO; 2100 return -EIO;
@@ -2210,16 +2211,16 @@ static int volume_write(char *buf)
2210 cmos_cmd = new_level > level ? TP_CMOS_VOLUME_UP : TP_CMOS_VOLUME_DOWN; 2211 cmos_cmd = new_level > level ? TP_CMOS_VOLUME_UP : TP_CMOS_VOLUME_DOWN;
2211 inc = new_level > level ? 1 : -1; 2212 inc = new_level > level ? 1 : -1;
2212 2213
2213 if (mute && (!cmos_eval(cmos_cmd) || 2214 if (mute && (issue_thinkpad_cmos_command(cmos_cmd) ||
2214 !acpi_ec_write(volume_offset, level))) 2215 !acpi_ec_write(volume_offset, level)))
2215 return -EIO; 2216 return -EIO;
2216 2217
2217 for (i = level; i != new_level; i += inc) 2218 for (i = level; i != new_level; i += inc)
2218 if (!cmos_eval(cmos_cmd) || 2219 if (issue_thinkpad_cmos_command(cmos_cmd) ||
2219 !acpi_ec_write(volume_offset, i + inc)) 2220 !acpi_ec_write(volume_offset, i + inc))
2220 return -EIO; 2221 return -EIO;
2221 2222
2222 if (mute && (!cmos_eval(TP_CMOS_VOLUME_MUTE) || 2223 if (mute && (issue_thinkpad_cmos_command(TP_CMOS_VOLUME_MUTE) ||
2223 !acpi_ec_write(volume_offset, 2224 !acpi_ec_write(volume_offset,
2224 new_level + mute))) 2225 new_level + mute)))
2225 return -EIO; 2226 return -EIO;
@@ -2228,7 +2229,7 @@ static int volume_write(char *buf)
2228 if (new_mute != mute) { /* level doesn't change */ 2229 if (new_mute != mute) { /* level doesn't change */
2229 cmos_cmd = new_mute ? TP_CMOS_VOLUME_MUTE : TP_CMOS_VOLUME_UP; 2230 cmos_cmd = new_mute ? TP_CMOS_VOLUME_MUTE : TP_CMOS_VOLUME_UP;
2230 2231
2231 if (!cmos_eval(cmos_cmd) || 2232 if (issue_thinkpad_cmos_command(cmos_cmd) ||
2232 !acpi_ec_write(volume_offset, level + new_mute)) 2233 !acpi_ec_write(volume_offset, level + new_mute))
2233 return -EIO; 2234 return -EIO;
2234 } 2235 }
diff --git a/drivers/misc/thinkpad_acpi.h b/drivers/misc/thinkpad_acpi.h
index 3a8718a08116..fb0abb02a016 100644
--- a/drivers/misc/thinkpad_acpi.h
+++ b/drivers/misc/thinkpad_acpi.h
@@ -116,6 +116,9 @@ static void drv_acpi_handle_init(char *name,
116 drv_acpi_handle_init(#object, &object##_handle, *object##_parent, \ 116 drv_acpi_handle_init(#object, &object##_handle, *object##_parent, \
117 object##_paths, ARRAY_SIZE(object##_paths), &object##_path) 117 object##_paths, ARRAY_SIZE(object##_paths), &object##_path)
118 118
119/* ThinkPad ACPI helpers */
120static int issue_thinkpad_cmos_command(int cmos_cmd);
121
119/* procfs support */ 122/* procfs support */
120static struct proc_dir_entry *proc_dir; 123static struct proc_dir_entry *proc_dir;
121 124
@@ -275,7 +278,6 @@ static int brightness_write(char *buf);
275 * CMOS subdriver 278 * CMOS subdriver
276 */ 279 */
277 280
278static int cmos_eval(int cmos_cmd);
279static int cmos_read(char *p); 281static int cmos_read(char *p);
280static int cmos_write(char *buf); 282static int cmos_write(char *buf);
281 283