From patchwork Fri Apr 7 13:07:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?TWljaGHFgiBLxJlwaWXFhA==?= X-Patchwork-Id: 9669485 X-Patchwork-Delegate: dvhart@infradead.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 841D960365 for ; Fri, 7 Apr 2017 13:08:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 778A7285EB for ; Fri, 7 Apr 2017 13:08:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6C94A285F4; Fri, 7 Apr 2017 13:08:03 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_HI,RCVD_IN_SORBS_SPAM autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0CBC0285EE for ; Fri, 7 Apr 2017 13:08:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753282AbdDGNHg (ORCPT ); Fri, 7 Apr 2017 09:07:36 -0400 Received: from mail-lf0-f67.google.com ([209.85.215.67]:36482 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755854AbdDGNHV (ORCPT ); Fri, 7 Apr 2017 09:07:21 -0400 Received: by mail-lf0-f67.google.com with SMTP id n78so6094829lfi.3 for ; Fri, 07 Apr 2017 06:07:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kempniu.pl; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FTOtNIR8pC9p53wjznMuQhFm6HbWWpObhwFNC8uSYqU=; b=LIuF22OJLNAiC5hwV+owP0Gwk9JSCsp8pu95cfkQLlL8QUz7JUq7zDZByDTPnS4SMo EtVhg1W2lkPhjZqZA18EVr++MZCDc86yccBOkuN3noyIBg6YmFZ4VxXnEPTm84K+qQnG ISHOhoLJGRPSRTObZQRhP2s8Y7dlLOo4YzPq8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FTOtNIR8pC9p53wjznMuQhFm6HbWWpObhwFNC8uSYqU=; b=uWtmAhJpOiTV39JXzLrq30Hr5cff14v1X/z4+BeDPfjuIhcw2OQF9YHs1yYci2Mlu1 3cXmKbJvYf6B8E+ZP9CkwQiEYQtHwXHrxd1t4bu4yGV7TrGKIJfAi3iy1qdgeQtdTLNO w/BQfBIZ+lK692v3runfablXY8O1cjO6mfa5TJ0UZzXnAiwp12pcBG37sILOJ+R8dC9r 8QOhHW1x8CdXnxhUwr4jBDxjopTyprVo+QVJ0nSE/H3wgWaJdJBHqh8gKf/ArJZh7MRN akszXZqm+ICMkS+rFxUHzMiyfYLxUxf1FQFRQDgWJ+38aAJArEBAQGg+0aNeRtLrXeoK J69A== X-Gm-Message-State: AFeK/H2b7f5Xf1Bnp1hf6oycqn1KEvOnDpMpAxftkWsYT94IEGWUxUF+R7A97twsPy3DTg== X-Received: by 10.25.39.14 with SMTP id n14mr12844593lfn.0.1491570439850; Fri, 07 Apr 2017 06:07:19 -0700 (PDT) Received: from ozzy.nask.waw.pl ([2001:a10:160:3::3]) by smtp.googlemail.com with ESMTPSA id 17sm961440ljp.58.2017.04.07.06.07.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 07 Apr 2017 06:07:19 -0700 (PDT) From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= To: Jonathan Woithe , Darren Hart , Andy Shevchenko Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/6] platform/x86: fujitsu-laptop: switch to managed LED class devices Date: Fri, 7 Apr 2017 15:07:11 +0200 Message-Id: <20170407130713.8417-5-kernel@kempniu.pl> X-Mailer: git-send-email 2.12.2 In-Reply-To: <20170407130713.8417-1-kernel@kempniu.pl> References: <20170407130713.8417-1-kernel@kempniu.pl> MIME-Version: 1.0 Sender: platform-driver-x86-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: platform-driver-x86@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Use devm_led_classdev_register() for registering LED class devices in order to simplify cleanup and remove LED-related fields with the "_registered" suffix from struct fujitsu_laptop. This also fixes a cleanup bug: with non-managed LED class devices, if e.g. two supported LEDs are detected, the first one gets registered successfully but the second one does not, acpi_fujitsu_laptop_add() will return an error, but the successfully registered LED will never get unregistered. Change the parent device for LED class devices to the FUJ02E3 ACPI device due to this being the logically correct relationship as LED class devices do not depend on any facility provided by the platform device registered by fujitsu-laptop, which was their parent until now. Each managed LED class device is automatically unregistered when the last reference to its parent device is dropped. Taking the parent change described above into account, LED class devices registered by fujitsu-laptop will be unregistered after acpi_fujitsu_laptop_remove() is called. During unregistration, LED brightness is reset to LED_OFF by LED core, so do not set the acpi_handle field of struct fujitsu_laptop to NULL inside acpi_fujitsu_laptop_remove() to prevent call_fext_func() from generating errors upon module removal. Signed-off-by: Michał Kępień --- drivers/platform/x86/fujitsu-laptop.c | 55 +++++++---------------------------- 1 file changed, 11 insertions(+), 44 deletions(-) diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index da0bd556b0bb..ce658789e748 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c @@ -153,10 +153,6 @@ struct fujitsu_laptop { spinlock_t fifo_lock; int flags_supported; int flags_state; - int logolamp_registered; - int kblamps_registered; - int radio_led_registered; - int eco_led_registered; }; static struct fujitsu_laptop *fujitsu_laptop; @@ -741,31 +737,24 @@ static struct led_classdev eco_led = { .brightness_get = eco_led_get }; -static int acpi_fujitsu_laptop_leds_register(void) +static int acpi_fujitsu_laptop_leds_register(struct acpi_device *device) { int result = 0; if (call_fext_func(FUNC_LEDS, 0x0, 0x0, 0x0) & LOGOLAMP_POWERON) { - result = led_classdev_register(&fujitsu_laptop->pf_device->dev, - &logolamp_led); - if (result == 0) { - fujitsu_laptop->logolamp_registered = 1; - } else { + result = devm_led_classdev_register(&device->dev, + &logolamp_led); + if (result) pr_err("Could not register LED handler for logo lamp, error %i\n", result); - } } if ((call_fext_func(FUNC_LEDS, 0x0, 0x0, 0x0) & KEYBOARD_LAMPS) && (call_fext_func(FUNC_BUTTONS, 0x0, 0x0, 0x0) == 0x0)) { - result = led_classdev_register(&fujitsu_laptop->pf_device->dev, - &kblamps_led); - if (result == 0) { - fujitsu_laptop->kblamps_registered = 1; - } else { + result = devm_led_classdev_register(&device->dev, &kblamps_led); + if (result) pr_err("Could not register LED handler for keyboard lamps, error %i\n", result); - } } /* @@ -775,14 +764,10 @@ static int acpi_fujitsu_laptop_leds_register(void) * that an RF LED is present. */ if (call_fext_func(FUNC_BUTTONS, 0x0, 0x0, 0x0) & BIT(24)) { - result = led_classdev_register(&fujitsu_laptop->pf_device->dev, - &radio_led); - if (result == 0) { - fujitsu_laptop->radio_led_registered = 1; - } else { + result = devm_led_classdev_register(&device->dev, &radio_led); + if (result) pr_err("Could not register LED handler for radio LED, error %i\n", result); - } } /* Support for eco led is not always signaled in bit corresponding @@ -792,14 +777,10 @@ static int acpi_fujitsu_laptop_leds_register(void) */ if ((call_fext_func(FUNC_LEDS, 0x0, 0x0, 0x0) & BIT(14)) && (call_fext_func(FUNC_LEDS, 0x2, ECO_LED, 0x0) != UNSUPPORTED_CMD)) { - result = led_classdev_register(&fujitsu_laptop->pf_device->dev, - &eco_led); - if (result == 0) { - fujitsu_laptop->eco_led_registered = 1; - } else { + result = devm_led_classdev_register(&device->dev, &eco_led); + if (result) pr_err("Could not register LED handler for eco LED, error %i\n", result); - } } return result; @@ -887,7 +868,7 @@ static int acpi_fujitsu_laptop_add(struct acpi_device *device) if (error) goto err_free_fifo; - error = acpi_fujitsu_laptop_leds_register(); + error = acpi_fujitsu_laptop_leds_register(device); if (error) goto err_remove_platform_device; @@ -905,24 +886,10 @@ static int acpi_fujitsu_laptop_remove(struct acpi_device *device) { struct fujitsu_laptop *fujitsu_laptop = acpi_driver_data(device); - if (fujitsu_laptop->logolamp_registered) - led_classdev_unregister(&logolamp_led); - - if (fujitsu_laptop->kblamps_registered) - led_classdev_unregister(&kblamps_led); - - if (fujitsu_laptop->radio_led_registered) - led_classdev_unregister(&radio_led); - - if (fujitsu_laptop->eco_led_registered) - led_classdev_unregister(&eco_led); - fujitsu_laptop_platform_remove(); kfifo_free(&fujitsu_laptop->fifo); - fujitsu_laptop->acpi_handle = NULL; - return 0; }