diff options
-rw-r--r-- | drivers/platform/x86/asus-laptop.c | 77 |
1 files changed, 36 insertions, 41 deletions
diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c index 15f131146501..28551f5a2e07 100644 --- a/drivers/platform/x86/asus-laptop.c +++ b/drivers/platform/x86/asus-laptop.c | |||
@@ -932,30 +932,19 @@ static ssize_t infos_show(struct device *dev, struct device_attribute *attr, | |||
932 | } | 932 | } |
933 | static DEVICE_ATTR_RO(infos); | 933 | static DEVICE_ATTR_RO(infos); |
934 | 934 | ||
935 | static int parse_arg(const char *buf, unsigned long count, int *val) | ||
936 | { | ||
937 | if (!count) | ||
938 | return 0; | ||
939 | if (count > 31) | ||
940 | return -EINVAL; | ||
941 | if (sscanf(buf, "%i", val) != 1) | ||
942 | return -EINVAL; | ||
943 | return count; | ||
944 | } | ||
945 | |||
946 | static ssize_t sysfs_acpi_set(struct asus_laptop *asus, | 935 | static ssize_t sysfs_acpi_set(struct asus_laptop *asus, |
947 | const char *buf, size_t count, | 936 | const char *buf, size_t count, |
948 | const char *method) | 937 | const char *method) |
949 | { | 938 | { |
950 | int rv, value; | 939 | int rv, value; |
951 | 940 | ||
952 | rv = parse_arg(buf, count, &value); | 941 | rv = kstrtoint(buf, 0, &value); |
953 | if (rv <= 0) | 942 | if (rv < 0) |
954 | return rv; | 943 | return rv; |
955 | 944 | ||
956 | if (write_acpi_int(asus->handle, method, value)) | 945 | if (write_acpi_int(asus->handle, method, value)) |
957 | return -ENODEV; | 946 | return -ENODEV; |
958 | return rv; | 947 | return count; |
959 | } | 948 | } |
960 | 949 | ||
961 | /* | 950 | /* |
@@ -975,15 +964,17 @@ static ssize_t ledd_store(struct device *dev, struct device_attribute *attr, | |||
975 | struct asus_laptop *asus = dev_get_drvdata(dev); | 964 | struct asus_laptop *asus = dev_get_drvdata(dev); |
976 | int rv, value; | 965 | int rv, value; |
977 | 966 | ||
978 | rv = parse_arg(buf, count, &value); | 967 | rv = kstrtoint(buf, 0, &value); |
979 | if (rv > 0) { | 968 | if (rv < 0) |
980 | if (write_acpi_int(asus->handle, METHOD_LEDD, value)) { | 969 | return rv; |
981 | pr_warn("LED display write failed\n"); | 970 | |
982 | return -ENODEV; | 971 | if (write_acpi_int(asus->handle, METHOD_LEDD, value)) { |
983 | } | 972 | pr_warn("LED display write failed\n"); |
984 | asus->ledd_status = (u32) value; | 973 | return -ENODEV; |
985 | } | 974 | } |
986 | return rv; | 975 | |
976 | asus->ledd_status = (u32) value; | ||
977 | return count; | ||
987 | } | 978 | } |
988 | static DEVICE_ATTR_RW(ledd); | 979 | static DEVICE_ATTR_RW(ledd); |
989 | 980 | ||
@@ -1148,10 +1139,12 @@ static ssize_t display_store(struct device *dev, struct device_attribute *attr, | |||
1148 | struct asus_laptop *asus = dev_get_drvdata(dev); | 1139 | struct asus_laptop *asus = dev_get_drvdata(dev); |
1149 | int rv, value; | 1140 | int rv, value; |
1150 | 1141 | ||
1151 | rv = parse_arg(buf, count, &value); | 1142 | rv = kstrtoint(buf, 0, &value); |
1152 | if (rv > 0) | 1143 | if (rv < 0) |
1153 | asus_set_display(asus, value); | 1144 | return rv; |
1154 | return rv; | 1145 | |
1146 | asus_set_display(asus, value); | ||
1147 | return count; | ||
1155 | } | 1148 | } |
1156 | static DEVICE_ATTR_WO(display); | 1149 | static DEVICE_ATTR_WO(display); |
1157 | 1150 | ||
@@ -1190,11 +1183,12 @@ static ssize_t ls_switch_store(struct device *dev, | |||
1190 | struct asus_laptop *asus = dev_get_drvdata(dev); | 1183 | struct asus_laptop *asus = dev_get_drvdata(dev); |
1191 | int rv, value; | 1184 | int rv, value; |
1192 | 1185 | ||
1193 | rv = parse_arg(buf, count, &value); | 1186 | rv = kstrtoint(buf, 0, &value); |
1194 | if (rv > 0) | 1187 | if (rv < 0) |
1195 | asus_als_switch(asus, value ? 1 : 0); | 1188 | return rv; |
1196 | 1189 | ||
1197 | return rv; | 1190 | asus_als_switch(asus, value ? 1 : 0); |
1191 | return count; | ||
1198 | } | 1192 | } |
1199 | static DEVICE_ATTR_RW(ls_switch); | 1193 | static DEVICE_ATTR_RW(ls_switch); |
1200 | 1194 | ||
@@ -1219,14 +1213,15 @@ static ssize_t ls_level_store(struct device *dev, struct device_attribute *attr, | |||
1219 | struct asus_laptop *asus = dev_get_drvdata(dev); | 1213 | struct asus_laptop *asus = dev_get_drvdata(dev); |
1220 | int rv, value; | 1214 | int rv, value; |
1221 | 1215 | ||
1222 | rv = parse_arg(buf, count, &value); | 1216 | rv = kstrtoint(buf, 0, &value); |
1223 | if (rv > 0) { | 1217 | if (rv < 0) |
1224 | value = (0 < value) ? ((15 < value) ? 15 : value) : 0; | 1218 | return rv; |
1225 | /* 0 <= value <= 15 */ | 1219 | |
1226 | asus_als_level(asus, value); | 1220 | value = (0 < value) ? ((15 < value) ? 15 : value) : 0; |
1227 | } | 1221 | /* 0 <= value <= 15 */ |
1222 | asus_als_level(asus, value); | ||
1228 | 1223 | ||
1229 | return rv; | 1224 | return count; |
1230 | } | 1225 | } |
1231 | static DEVICE_ATTR_RW(ls_level); | 1226 | static DEVICE_ATTR_RW(ls_level); |
1232 | 1227 | ||
@@ -1301,14 +1296,14 @@ static ssize_t gps_store(struct device *dev, struct device_attribute *attr, | |||
1301 | int rv, value; | 1296 | int rv, value; |
1302 | int ret; | 1297 | int ret; |
1303 | 1298 | ||
1304 | rv = parse_arg(buf, count, &value); | 1299 | rv = kstrtoint(buf, 0, &value); |
1305 | if (rv <= 0) | 1300 | if (rv < 0) |
1306 | return -EINVAL; | 1301 | return rv; |
1307 | ret = asus_gps_switch(asus, !!value); | 1302 | ret = asus_gps_switch(asus, !!value); |
1308 | if (ret) | 1303 | if (ret) |
1309 | return ret; | 1304 | return ret; |
1310 | rfkill_set_sw_state(asus->gps.rfkill, !value); | 1305 | rfkill_set_sw_state(asus->gps.rfkill, !value); |
1311 | return rv; | 1306 | return count; |
1312 | } | 1307 | } |
1313 | static DEVICE_ATTR_RW(gps); | 1308 | static DEVICE_ATTR_RW(gps); |
1314 | 1309 | ||