Skip to content

Commit

Permalink
platform/x86: asus-laptop: get rid of parse_arg()
Browse files Browse the repository at this point in the history
parse_arg() duplicates the funcionality of kstrtoint() so use the latter
function instead. There is no funcionality change except that in the
case of input being too big -ERANGE will be returned instead of -EINVAL
which is not bad because -ERANGE makes more sense here. The check for
!count is already done by the sysfs core so no need to duplicate it
again. Also, add some minor corrections to error handling to accommodate
the change in return values (parse_arg returned count if everything
succeeded whereas kstrtoint returns 0 in the same situation)

As a result of this patch asus-laptop.ko size is reduced by almost 1%:
add/remove: 0/1 grow/shrink: 1/6 up/down: 1/-149 (-148)
function                                     old     new   delta
__UNIQUE_ID_vermagic0                         69      70      +1
ls_switch_store                              133     117     -16
ledd_store                                   175     159     -16
display_store                                157     141     -16
ls_level_store                               193     176     -17
gps_store                                    200     178     -22
sysfs_acpi_set.isra                          148     125     -23
parse_arg.part                                39       -     -39
Total: Before=19160, After=19012, chg -0.77%

Signed-off-by: Giedrius Statkevičius <giedrius.statkevicius@gmail.com>
Signed-off-by: Darren Hart <dvhart@linux.intel.com>
  • Loading branch information
Giedrius Statkevičius authored and Darren Hart committed Sep 23, 2016
1 parent 999d437 commit 6f7e357
Showing 1 changed file with 36 additions and 41 deletions.
77 changes: 36 additions & 41 deletions drivers/platform/x86/asus-laptop.c
Original file line number Diff line number Diff line change
Expand Up @@ -932,30 +932,19 @@ static ssize_t infos_show(struct device *dev, struct device_attribute *attr,
}
static DEVICE_ATTR_RO(infos);

static int parse_arg(const char *buf, unsigned long count, int *val)
{
if (!count)
return 0;
if (count > 31)
return -EINVAL;
if (sscanf(buf, "%i", val) != 1)
return -EINVAL;
return count;
}

static ssize_t sysfs_acpi_set(struct asus_laptop *asus,
const char *buf, size_t count,
const char *method)
{
int rv, value;

rv = parse_arg(buf, count, &value);
if (rv <= 0)
rv = kstrtoint(buf, 0, &value);
if (rv < 0)
return rv;

if (write_acpi_int(asus->handle, method, value))
return -ENODEV;
return rv;
return count;
}

/*
Expand All @@ -975,15 +964,17 @@ static ssize_t ledd_store(struct device *dev, struct device_attribute *attr,
struct asus_laptop *asus = dev_get_drvdata(dev);
int rv, value;

rv = parse_arg(buf, count, &value);
if (rv > 0) {
if (write_acpi_int(asus->handle, METHOD_LEDD, value)) {
pr_warn("LED display write failed\n");
return -ENODEV;
}
asus->ledd_status = (u32) value;
rv = kstrtoint(buf, 0, &value);
if (rv < 0)
return rv;

if (write_acpi_int(asus->handle, METHOD_LEDD, value)) {
pr_warn("LED display write failed\n");
return -ENODEV;
}
return rv;

asus->ledd_status = (u32) value;
return count;
}
static DEVICE_ATTR_RW(ledd);

Expand Down Expand Up @@ -1148,10 +1139,12 @@ static ssize_t display_store(struct device *dev, struct device_attribute *attr,
struct asus_laptop *asus = dev_get_drvdata(dev);
int rv, value;

rv = parse_arg(buf, count, &value);
if (rv > 0)
asus_set_display(asus, value);
return rv;
rv = kstrtoint(buf, 0, &value);
if (rv < 0)
return rv;

asus_set_display(asus, value);
return count;
}
static DEVICE_ATTR_WO(display);

Expand Down Expand Up @@ -1190,11 +1183,12 @@ static ssize_t ls_switch_store(struct device *dev,
struct asus_laptop *asus = dev_get_drvdata(dev);
int rv, value;

rv = parse_arg(buf, count, &value);
if (rv > 0)
asus_als_switch(asus, value ? 1 : 0);
rv = kstrtoint(buf, 0, &value);
if (rv < 0)
return rv;

return rv;
asus_als_switch(asus, value ? 1 : 0);
return count;
}
static DEVICE_ATTR_RW(ls_switch);

Expand All @@ -1219,14 +1213,15 @@ static ssize_t ls_level_store(struct device *dev, struct device_attribute *attr,
struct asus_laptop *asus = dev_get_drvdata(dev);
int rv, value;

rv = parse_arg(buf, count, &value);
if (rv > 0) {
value = (0 < value) ? ((15 < value) ? 15 : value) : 0;
/* 0 <= value <= 15 */
asus_als_level(asus, value);
}
rv = kstrtoint(buf, 0, &value);
if (rv < 0)
return rv;

value = (0 < value) ? ((15 < value) ? 15 : value) : 0;
/* 0 <= value <= 15 */
asus_als_level(asus, value);

return rv;
return count;
}
static DEVICE_ATTR_RW(ls_level);

Expand Down Expand Up @@ -1301,14 +1296,14 @@ static ssize_t gps_store(struct device *dev, struct device_attribute *attr,
int rv, value;
int ret;

rv = parse_arg(buf, count, &value);
if (rv <= 0)
return -EINVAL;
rv = kstrtoint(buf, 0, &value);
if (rv < 0)
return rv;
ret = asus_gps_switch(asus, !!value);
if (ret)
return ret;
rfkill_set_sw_state(asus->gps.rfkill, !value);
return rv;
return count;
}
static DEVICE_ATTR_RW(gps);

Expand Down

0 comments on commit 6f7e357

Please sign in to comment.