From patchwork Mon Jun 8 08:16:48 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Corentin Chary X-Patchwork-Id: 28591 X-Patchwork-Delegate: lenb@kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n588OSU4001492 for ; Mon, 8 Jun 2009 08:24:28 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752940AbZFHIYW (ORCPT ); Mon, 8 Jun 2009 04:24:22 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753541AbZFHIYW (ORCPT ); Mon, 8 Jun 2009 04:24:22 -0400 Received: from iksaif.net ([88.191.73.63]:52388 "EHLO iksaif.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752940AbZFHIYV (ORCPT ); Mon, 8 Jun 2009 04:24:21 -0400 Received: from localhost.localdomain (cxr69-11-88-180-139-205.fbx.proxad.net [88.180.139.205]) (Authenticated sender: corentincj@iksaif.net) by iksaif.net (Postfix) with ESMTPA id 2337FC902A7; Mon, 8 Jun 2009 10:19:07 +0200 (CEST) From: Corentin Chary To: lenb@kernel.org Cc: linux-acpi@vger.kernel.org, Corentin Chary Subject: [PATCH 2/4] eeepc-laptop: Fix cpufv Date: Mon, 8 Jun 2009 10:16:48 +0200 Message-Id: <1244449010-7995-3-git-send-email-corentincj@iksaif.net> X-Mailer: git-send-email 1.6.3.1 In-Reply-To: <1244449010-7995-2-git-send-email-corentincj@iksaif.net> References: <1244449010-7995-1-git-send-email-corentincj@iksaif.net> <1244449010-7995-2-git-send-email-corentincj@iksaif.net> Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org Limit cpufv input to acceptable values. Make cpufv output more readable. According to the dsdt, the value returned by CFVG is composed by the current setting in the first byte and the number of settings (starting from 0) in the second byte. Signed-off-by: Corentin Chary --- drivers/platform/x86/eeepc-laptop.c | 58 ++++++++++++++++++++++++++++++++++- 1 files changed, 57 insertions(+), 1 deletions(-) diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index a0845b2..ae1fb7b 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c @@ -395,7 +395,63 @@ static ssize_t show_sys_acpi(int cm, char *buf) EEEPC_CREATE_DEVICE_ATTR(camera, CM_ASL_CAMERA); EEEPC_CREATE_DEVICE_ATTR(cardr, CM_ASL_CARDREADER); EEEPC_CREATE_DEVICE_ATTR(disp, CM_ASL_DISPLAYSWITCH); -EEEPC_CREATE_DEVICE_ATTR(cpufv, CM_ASL_CPUFV); + +struct eeepc_cpufv { + int num; + int cur; +}; + +static int get_cpufv(struct eeepc_cpufv *c) +{ + c->cur = get_acpi(CM_ASL_CPUFV); + c->num = (c->cur >> 8) & 0xff; + c->cur &= 0xff; + if (c->cur < 0 || c->num <= 0 || c->num > 12) + return -ENODEV; + return 0; +} + +static ssize_t show_cpufv(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct eeepc_cpufv c; + int i; + ssize_t len = 0; + + if (get_cpufv(&c)) + return sprintf(buf, "\n"); + for (i = 0; i < c.num; i++) + len += sprintf(buf + len, i == c.cur ? "[%d] " : "%d ", i); + len += sprintf(buf + len, "\n"); + return len; +} + +static ssize_t store_cpufv(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct eeepc_cpufv c; + int rv, value; + + if (get_cpufv(&c)) + return -ENODEV; + rv = parse_arg(buf, count, &value); + if (rv < 0) + return rv; + if (!rv || value < 0 || value >= c.num) + return -EINVAL; + set_acpi(CM_ASL_CPUFV, value); + return rv; +} + +static struct device_attribute dev_attr_cpufv = { + .attr = { + .name = "cpufv", + .mode = 0644 }, + .show = show_cpufv, + .store = store_cpufv +}; static struct attribute *platform_attributes[] = { &dev_attr_camera.attr,