From patchwork Wed May 4 06:02:18 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eduardo Valentin X-Patchwork-Id: 9010641 X-Patchwork-Delegate: rui.zhang@intel.com Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 5AD679F1C1 for ; Wed, 4 May 2016 06:10:45 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6F26020373 for ; Wed, 4 May 2016 06:10:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 68CC3202B8 for ; Wed, 4 May 2016 06:10:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757023AbcEDGDA (ORCPT ); Wed, 4 May 2016 02:03:00 -0400 Received: from mail-pa0-f49.google.com ([209.85.220.49]:35128 "EHLO mail-pa0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757007AbcEDGC6 (ORCPT ); Wed, 4 May 2016 02:02:58 -0400 Received: by mail-pa0-f49.google.com with SMTP id iv1so20102171pac.2; Tue, 03 May 2016 23:02:58 -0700 (PDT) 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=88Uo5VytEHtYd13NEOmJSS7D5jRQUxTLKx4pSWbpVTo=; b=i993C341rT7RSd5xHjpN/t8+vTvRU+MBP0/nJoAH+ijqka1yA2+9nGehM8UI/235Tj 2KCU9vt0J1S6oNTTZOhOyMFjYzNyHRqAaUdrlLEd4rK4ZoX7C/IcZ2a0GcnSBMUqBeFK ILS3pVMaBNEJg/orxB8HrGzuKArX04jLZtBEDZvs9IjktMHcDFg0V3gWURbPpDtXsm35 2wmMp23hslw+E8/JzRW0StDK1u+mfHe1aHsGFeKwDoOoI7lYqjoAUcw21eOwynHY7xuA dRfllNXmGInHvhBLyYJzGsM5b+3C23spCz/AUcTtBXQ0dI7kb5B2z9mCT1BPRbS9EIjh ULMA== 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=88Uo5VytEHtYd13NEOmJSS7D5jRQUxTLKx4pSWbpVTo=; b=Sb/ApHfQYYBTJfJx7jNquQ8OcTNCNg7ILSWPV5D920A9QvzHGlbX3L8WnOYEDRaekN mrNs+oSR0zmiogYRJUZJlcorDAqfzR0ga9GJzzirNS5M2DEf/X1cvMqfcrMdz/VIB9yr KSikDu2metRbYbn3S6puWBzRltG+l1ZxMHWrl7/8S6Vp3oMwvRyQblihpN3R1UpMRo2J NbG2rgLUKXgJhme7MvIVq5RdxHRadvTYNl3SVxEaLTPLZj16PCTSoF9k87M2rQs7iF2W uOqh7Y2OBAkYL12OdVL4946Dcygdwn/GRgskZO3j6nC3EwvxeSEdY5B1IGg08j99Fyzq ZE/g== X-Gm-Message-State: AOPr4FW06eNyiYCjb8n+5CEQT9pqarKXvSGyAcW1jk2AcrC6Seh5O4vdJAZGqvGWOYgbhw== X-Received: by 10.66.138.16 with SMTP id qm16mr9609699pab.28.1462341778064; Tue, 03 May 2016 23:02:58 -0700 (PDT) Received: from localhost ([2601:647:4203:c8e0:7256:81ff:febd:926d]) by smtp.gmail.com with ESMTPSA id 1sm2651669pah.7.2016.05.03.23.02.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2016 23:02:57 -0700 (PDT) From: Eduardo Valentin To: Rui Zhang Cc: Linux PM , LKML , Eduardo Valentin Subject: [PATCH 04/31] thermal: core: use dev.groups to manage always present tz attributes Date: Tue, 3 May 2016 23:02:18 -0700 Message-Id: <1462341765-13268-5-git-send-email-edubezval@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1462341765-13268-1-git-send-email-edubezval@gmail.com> References: <1462341765-13268-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-Spam-Status: No, score=-8.9 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.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 | 86 ++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 53 deletions(-) diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index 2227264..0a7d918 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -989,42 +989,46 @@ 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, +}; - 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 @@ -1846,6 +1850,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); @@ -1892,29 +1899,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); @@ -2009,12 +1993,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);