From patchwork Tue Nov 8 05:08:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eduardo Valentin X-Patchwork-Id: 9416589 X-Patchwork-Delegate: rui.zhang@intel.com 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 C7AF160720 for ; Tue, 8 Nov 2016 05:26:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B722D28B9D for ; Tue, 8 Nov 2016 05:26:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AB9D428BA3; Tue, 8 Nov 2016 05:26:34 +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.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID 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 83AA428B9D for ; Tue, 8 Nov 2016 05:26:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753239AbcKHF0Q (ORCPT ); Tue, 8 Nov 2016 00:26:16 -0500 Received: from mail-pf0-f195.google.com ([209.85.192.195]:34065 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753088AbcKHF0M (ORCPT ); Tue, 8 Nov 2016 00:26:12 -0500 Received: by mail-pf0-f195.google.com with SMTP id y68so18127031pfb.1; Mon, 07 Nov 2016 21:26:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=0Xy2OMfqB1p/UjSafo5F9cELnHPSFYXLJq18nE29PTY=; b=nbbXdNKJZny1MAq9LuYed45j2kPYH/D6aq0Iy6xJQ0gLNBz7Ks4UdT4iAFvrzK+C/f donJlY+gXC1MrwsxgfIA/D2HUr+oR3bEGH8pLUOxRK0sxLB5p8Vd3qIO65yQsGYHh0/2 HlSFTYuDnjlWrnl8s6q3B5fkkohBu4MkrETrPmkt2bFfhgDCMPsgQxaXL+9sjIH1aKQQ okJWcqN8kyeGb04CpoJxElPfBZFSBAxFwv0aR16uGElAGqRKM0k8G9YhEnLENbaU33Om 3JjLH4nOZn40Xtn0oSrC38bydMLEYMoLyuPYCeXTEFOIThNhGtlpWHgtFxEdVw42aktS a4vw== 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:in-reply-to :references; bh=0Xy2OMfqB1p/UjSafo5F9cELnHPSFYXLJq18nE29PTY=; b=hqjw37UawtBdO2ju8riSxi6dfIIwOmOqUllLyzamWhSHJdZDtK8MnfBKz/Wm5udV14 Ybv7NFOCPwBWi3c8jOVJqTWDKXigKVa3N+fmQdTNTOuL2O97QziUyVOY9+64zynn6yQO XbMzU/9HAq/BPYkkXC+jeYnPXptYnkyGOssGLWMPOwMG+HGyfi8OeeFNdkN+vkjereQ8 +bRRlklbqTYLmXuewZg4ywXI82PEAyvY4sdQECAXbKpseyz8Qx8BKidMWplTUS47iKIK sYPAGCUGaNPBfaXFiXgKBkqyUopr2WADIBslS6dL5+Mohewn60y94tlMrscrzvIFCele U8ew== X-Gm-Message-State: ABUngveAbZTbrwl0Sy0P9PFLeCCQF8aMWMXQKNGYDm0ZWiluYutT7bd46WqEsGp2v6274g== X-Received: by 10.98.58.81 with SMTP id h78mr20300242pfa.50.1478581781443; Mon, 07 Nov 2016 21:09:41 -0800 (PST) Received: from localhost ([2601:647:4401:a2f0:7256:81ff:febd:926d]) by smtp.gmail.com with ESMTPSA id 123sm44375228pfe.41.2016.11.07.21.09.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 Nov 2016 21:09:40 -0800 (PST) From: Eduardo Valentin To: Rui Zhang Cc: LKML , Linux PM , Eduardo Valentin Subject: [PATCHv2 04/49] thermal: core: use dev.groups to manage always present tz attributes Date: Mon, 7 Nov 2016 21:08:42 -0800 Message-Id: <1478581767-7009-5-git-send-email-edubezval@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1478581767-7009-1-git-send-email-edubezval@gmail.com> References: <1478581767-7009-1-git-send-email-edubezval@gmail.com> Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Thermal zones attributes are all being created using device_create_file(). This has the disadvantage of making the code complicated and sometimes we may miss the cleanup of them. This patch starts to move the thermal zone sysfs attributes to the dev.groups, so Linux device core manage them for us. For now, this patch only moves those attributes are always present regardless of thermal zone condition. This change has also the advantage of cleaning up the thermal zone parameters sysfs entries that are left unclean after device registration. Cc: Zhang Rui Cc: linux-pm@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Eduardo Valentin --- drivers/thermal/thermal_core.c | 87 +++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 53 deletions(-) diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index 3d43c29..3da4cd3 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -1047,42 +1047,47 @@ create_s32_tzp_attr(slope); create_s32_tzp_attr(offset); #undef create_s32_tzp_attr +/* + * These are thermal zone device attributes that will always be present. + * All the attributes created for tzp (create_s32_tzp_attr) also are always + * present on the sysfs interface. + */ static DEVICE_ATTR(type, 0444, type_show, NULL); static DEVICE_ATTR(temp, 0444, temp_show, NULL); -static DEVICE_ATTR(mode, 0644, mode_show, mode_store); -static DEVICE_ATTR(passive, S_IRUGO | S_IWUSR, passive_show, passive_store); static DEVICE_ATTR(policy, S_IRUGO | S_IWUSR, policy_show, policy_store); static DEVICE_ATTR(available_policies, S_IRUGO, available_policies_show, NULL); -static DEVICE_ATTR(emul_temp, S_IWUSR, NULL, emul_temp_store); static DEVICE_ATTR(sustainable_power, S_IWUSR | S_IRUGO, sustainable_power_show, sustainable_power_store); -static struct device_attribute *dev_tzp_attrs[] = { - &dev_attr_sustainable_power, - &dev_attr_k_po, - &dev_attr_k_pu, - &dev_attr_k_i, - &dev_attr_k_d, - &dev_attr_integral_cutoff, - &dev_attr_slope, - &dev_attr_offset, -}; - -static int create_tzp_attrs(struct device *dev) -{ - int i; +/* These thermal zone device attributes are created based on conditions */ +static DEVICE_ATTR(mode, 0644, mode_show, mode_store); +static DEVICE_ATTR(passive, S_IRUGO | S_IWUSR, passive_show, passive_store); +static DEVICE_ATTR(emul_temp, S_IWUSR, NULL, emul_temp_store); - for (i = 0; i < ARRAY_SIZE(dev_tzp_attrs); i++) { - int ret; - struct device_attribute *dev_attr = dev_tzp_attrs[i]; +static struct attribute *thermal_zone_dev_attrs[] = { + &dev_attr_type.attr, + &dev_attr_temp.attr, + &dev_attr_policy.attr, + &dev_attr_available_policies.attr, + &dev_attr_sustainable_power.attr, + &dev_attr_k_po.attr, + &dev_attr_k_pu.attr, + &dev_attr_k_i.attr, + &dev_attr_k_d.attr, + &dev_attr_integral_cutoff.attr, + &dev_attr_slope.attr, + &dev_attr_offset.attr, + NULL, +}; - ret = device_create_file(dev, dev_attr); - if (ret) - return ret; - } +static struct attribute_group thermal_zone_attribute_group = { + .attrs = thermal_zone_dev_attrs, +}; - return 0; -} +static const struct attribute_group *thermal_zone_attribute_groups[] = { + &thermal_zone_attribute_group, + NULL +}; /** * power_actor_get_max_power() - get the maximum power that a cdev can consume @@ -1909,6 +1914,9 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type, tz->trips = trips; tz->passive_delay = passive_delay; tz->polling_delay = polling_delay; + + /* Add nodes that are always present via .groups */ + tz->device.groups = thermal_zone_attribute_groups; /* A new thermal zone needs to be updated anyway. */ atomic_set(&tz->need_update, 1); @@ -1955,29 +1963,6 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type, goto unregister; } - result = device_create_file(&tz->device, &dev_attr_type); - if (result) - goto unregister; - - result = device_create_file(&tz->device, &dev_attr_temp); - if (result) - goto unregister; - - /* Create policy attribute */ - result = device_create_file(&tz->device, &dev_attr_policy); - if (result) - goto unregister; - - /* Create available_policies attribute */ - result = device_create_file(&tz->device, &dev_attr_available_policies); - if (result) - goto unregister; - - /* Add thermal zone params */ - result = create_tzp_attrs(&tz->device); - if (result) - goto unregister; - /* Update 'this' zone's governor information */ mutex_lock(&thermal_governor_lock); @@ -2072,12 +2057,8 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz) thermal_zone_device_set_polling(tz, 0); - device_remove_file(&tz->device, &dev_attr_type); - device_remove_file(&tz->device, &dev_attr_temp); if (tz->ops->get_mode) device_remove_file(&tz->device, &dev_attr_mode); - device_remove_file(&tz->device, &dev_attr_policy); - device_remove_file(&tz->device, &dev_attr_available_policies); remove_trip_attrs(tz); thermal_set_governor(tz, NULL);