From patchwork Tue Aug 9 21:57:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hsu X-Patchwork-Id: 73575 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp101787qga; Tue, 9 Aug 2016 14:57:57 -0700 (PDT) X-Received: by 10.66.242.201 with SMTP id ws9mr1043184pac.7.1470779877078; Tue, 09 Aug 2016 14:57:57 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ik5si44640193pac.111.2016.08.09.14.57.56; Tue, 09 Aug 2016 14:57:57 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932725AbcHIV5x (ORCPT + 27 others); Tue, 9 Aug 2016 17:57:53 -0400 Received: from mail-pf0-f178.google.com ([209.85.192.178]:34301 "EHLO mail-pf0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932702AbcHIV5t (ORCPT ); Tue, 9 Aug 2016 17:57:49 -0400 Received: by mail-pf0-f178.google.com with SMTP id p64so8791414pfb.1 for ; Tue, 09 Aug 2016 14:57:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=NSjb/oOyhC1DQAoJZm5LUjAEjh8cLnSFVVmRIwQ9QYs=; b=d3BaaBJquhWyVRtlo7TCUy8slpkhwZaqtSeMj7GLOCBVGJv/pGvKDLrHNlBWKrQSkj ZcB/wd3bYHI1j4tMXzqUjNA8zVj9u92feOFep9UmLIlnSbKJ/G3WMgn8E73lt4acDuSF sNvjdrQEEtxRyCF5OcvXrfzRBiwAZXuhQc9XL/PwtlTguNhxYdsCKNbQYLJry3iI5xku 3cyBGhrmbSMWUoZZZV3C6hbR+NpxwAHamgTWKijKGIu1pVpWIZkWGIfGAzWwe9OPWz3f RteNgThijSLXmU7koWZJACo32dqvvL3ZusBSrhh6DXAtRtUTDIRgFB6WdVamE+nEGd88 VsLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=NSjb/oOyhC1DQAoJZm5LUjAEjh8cLnSFVVmRIwQ9QYs=; b=H4WTJAzpnBHt1QpfMLexRjcslzG6jU+36oJfchZ+BEinQ9yuCLIXiLZb4KEBdrUnsS KTpEiB7tCpxZJ8kuCy+k+/llckQSeF7318BOKXuInaxK5Oek6euGHFyJbe/okV+hbh8B 7isrSO6NgMhJfFBlNwhgZ9L28THPeDTVw4bTfvemcddM06f44X0wjCfCGPtNOybhrTEV D1harTzw808U5D+z2LW+HctmsiuehOXyInRL4cJf+t+FeemEpA4CAuTL7kUZbyjvhJ/c 2o80MrvdGc6mwoAa93XEfOy3xyR3DZAbVgqUu7dqOhe4YuvyC9jnduHBo5YthR/Olakv leoA== X-Gm-Message-State: AEkooutKDItcSCJag6UCt/FEdA+qQrY3TjUD5wPKvYI7snS+gXbQkVVTIckeDiwN2/0dKR8C X-Received: by 10.98.9.194 with SMTP id 63mr1097414pfj.56.1470779868460; Tue, 09 Aug 2016 14:57:48 -0700 (PDT) Received: from localhost ([2620:0:1000:6509:d517:e407:e48a:b3c8]) by smtp.gmail.com with ESMTPSA id a5sm58235346pfc.89.2016.08.09.14.57.47 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Tue, 09 Aug 2016 14:57:48 -0700 (PDT) From: David Hsu To: thierry.reding@gmail.com Cc: gregkh@linuxfoundation.org, sspatil@google.com, linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org, davidhsu@google.com Subject: [PATCH] pwm: Unexport children before chip removal Date: Tue, 9 Aug 2016 14:57:46 -0700 Message-Id: <1470779866-74776-1-git-send-email-davidhsu@google.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Exported pwm channels aren't removed before the pwmchip and are leaked. This results in invalid sysfs files. This fix removes all exported pwm channels before chip removal. Signed-off-by: David Hsu --- drivers/pwm/core.c | 2 ++ drivers/pwm/sysfs.c | 18 ++++++++++++++++++ include/linux/pwm.h | 5 +++++ 3 files changed, 25 insertions(+) -- 2.8.0.rc3.226.g39d4020 diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index ed337a8c..869af84 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c @@ -339,6 +339,8 @@ int pwmchip_remove(struct pwm_chip *chip) unsigned int i; int ret = 0; + pwmchip_sysfs_unexport_children(chip); + mutex_lock(&pwm_lock); for (i = 0; i < chip->npwm; i++) { diff --git a/drivers/pwm/sysfs.c b/drivers/pwm/sysfs.c index cb2b376..b3ccb8f 100644 --- a/drivers/pwm/sysfs.c +++ b/drivers/pwm/sysfs.c @@ -400,6 +400,24 @@ void pwmchip_sysfs_unexport(struct pwm_chip *chip) } } +void pwmchip_sysfs_unexport_children(struct pwm_chip *chip) +{ + struct device *parent; + unsigned int i; + + parent = class_find_device(&pwm_class, NULL, chip, + pwmchip_sysfs_match); + if (!parent) + return; + + for (i = 0; i < chip->npwm; i++) { + struct pwm_device *pwm = &chip->pwms[i]; + + if (test_bit(PWMF_EXPORTED, &pwm->flags)) + pwm_unexport_child(parent, pwm); + } +} + static int __init pwm_sysfs_init(void) { return class_register(&pwm_class); diff --git a/include/linux/pwm.h b/include/linux/pwm.h index c038ae3..16a0ae0 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h @@ -530,6 +530,7 @@ static inline void pwm_remove_table(struct pwm_lookup *table, size_t num) #ifdef CONFIG_PWM_SYSFS void pwmchip_sysfs_export(struct pwm_chip *chip); void pwmchip_sysfs_unexport(struct pwm_chip *chip); +void pwmchip_sysfs_unexport_children(struct pwm_chip *chip); #else static inline void pwmchip_sysfs_export(struct pwm_chip *chip) { @@ -538,6 +539,10 @@ static inline void pwmchip_sysfs_export(struct pwm_chip *chip) static inline void pwmchip_sysfs_unexport(struct pwm_chip *chip) { } + +static inline void pwmchip_sysfs_unexport_children(struct pwm_chip *chip) +{ +} #endif /* CONFIG_PWM_SYSFS */ #endif /* __LINUX_PWM_H */