]> xenbits.xensource.com Git - people/aperard/linux-chromebook.git/commitdiff
CHROMIUM: Input: cyapa - Allow filename to be changed in update_fw
authorBenson Leung <bleung@chromium.org>
Sun, 16 Dec 2012 00:29:51 +0000 (16:29 -0800)
committerGerrit <chrome-bot@google.com>
Tue, 18 Dec 2012 07:31:21 +0000 (23:31 -0800)
Allow the name of the designated firmware to be passed as the
argument to update_fw from user space. This will allow user space
to specify which firmware to load.

Signed-off-by: Benson Leung <bleung@chromium.org>
BUG=chromium-os:36911,chromium-os:37150
TEST=Make sure you are using chromeos-touch-firmware-daisy-2.4-r2
which contains firmware 2.4 stable, but 3 trial firmwares linked
from /lib/firmware/cyapa.bin-trial[1-3]
Check by manually issuing the command from user space:
1. echo -n cyapa.bin-trial1 > /sys/bus/i2c/devices/1-0067/update_fw
2. cat /sys/bus/i2c/devices/1-0067/firmware_version
3. double check that that returns 2.7
4. echo -n cyapa.bin-trial3 > /sys/bus/i2c/devices/1-0067/update_fw
5. cat /sys/bus/i2c/devices/1-0067/firmware_version
6. double check that that returns 2.9
7. echo -n cyapa.bin > /sys/bus/i2c/devices/1-0067/update_fw
8. cat /sys/bus/i2c/devices/1-0067/firmware_version
9. Check that that returns 2.4

Change-Id: Id51b8ae6439ac822d8c77a96aee43a1c6f67cf1b
Reviewed-on: https://gerrit.chromium.org/gerrit/39839
Reviewed-by: Daniel Kurtz <djkurtz@chromium.org>
Commit-Ready: Benson Leung <bleung@chromium.org>
Tested-by: Benson Leung <bleung@chromium.org>
drivers/input/mouse/cyapa.c

index a05a4a17dcad5cc3d4960b76fb08410936c2c22a..2f0721b5ab4876e852f32eb878a99407e32f4947 100644 (file)
@@ -1196,18 +1196,17 @@ static int cyapa_check_fw(struct cyapa *cyapa, const struct firmware *fw)
        return 0;
 }
 
-static int cyapa_firmware(struct cyapa *cyapa)
+static int cyapa_firmware(struct cyapa *cyapa, const char *fw_name)
 {
        struct device *dev = &cyapa->client->dev;
        int ret;
        const struct firmware *fw;
-       const char *fw_name = CYAPA_FW_NAME;
        int i;
 
-       ret = request_firmware(&fw, CYAPA_FW_NAME, dev);
+       ret = request_firmware(&fw, fw_name, dev);
        if (ret) {
                dev_err(dev, "Could not load firmware from %s, %d\n",
-                         fw_name, ret);
+                       fw_name, ret);
                return ret;
        }
 
@@ -1342,9 +1341,17 @@ static ssize_t cyapa_update_fw_store(struct device *dev,
                                     const char *buf, size_t count)
 {
        struct cyapa *cyapa = dev_get_drvdata(dev);
+       char *fw_name;
        int ret;
 
-       ret = cyapa_firmware(cyapa);
+       /* Do not allow paths that step out of /lib/firmware  */
+       if (strstr(buf, "../") != NULL)
+               return -EINVAL;
+
+       fw_name = !strncmp(buf, "1", count) ||
+                 !strncmp(buf, "1\n", count) ? CYAPA_FW_NAME : buf;
+
+       ret = cyapa_firmware(cyapa, fw_name);
        if (ret)
                dev_err(dev, "firmware update failed, %d\n", ret);
        else