From patchwork Fri Jul 26 13:51:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sudeep Holla X-Patchwork-Id: 169840 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp89817ilk; Fri, 26 Jul 2019 06:52:21 -0700 (PDT) X-Google-Smtp-Source: APXvYqzil0RjgydEpjI8ZmKgGxB28YjfUhE/IXJqtA6tZdBmLzx9z+iIrePG+NxOsw6M13V9FLIE X-Received: by 2002:a63:4c46:: with SMTP id m6mr93905528pgl.59.1564149140790; Fri, 26 Jul 2019 06:52:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564149140; cv=none; d=google.com; s=arc-20160816; b=xloVtsCRh+TNdpOXPUJFdag96L0kefM07X0ldD7CcyEPj9g8T4oZvheuMx4YlQ51dF E5Vl8PWeTud3Ql3wCKeVw9U40oaEw3nMDkqYOB6ODbmv2R1hw4WRN3dweBpfB2p97CVV IjfYWH/vb+3bFQ2Cah3t2bjcA40RwI/D5kMwEBWlJLlMmeEDJB7IxGlzovCpyW1hwHk3 b/hfenhTwY2oijAoBiFsl2A+2KegevyNYVnwF0amOuhh1Zxduay9UhtXVTNSqrhjn8fU oDcfCTF+MyQdqFZYPKAu+xki6dqubOfJluH0dY8+Vd4oVlEXSHP67ytUeSpqGq3T3FAk W5RQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=nvPeo/DVlgTqCGk4STR6hKQttPWZZNn1pWF366wmRxM=; b=rSMtJ2qhPd+M/1EF0ttZnojQMQgOWbune7Tt268y3X4UhWQDRXSA8/4JASD8JuBLWF voCRf1RvOrqGWrllvEi0T5QSl4e9TZPD1AivOPix1b3ETDyQYe1AdJbLmcCg3fH4709u OC3luePzFhdvpScx06HibtCXzffVeqXrDbdLCpmRJ3PTmFIVc6U/xociak1eeFQEkXqP 68pjCoKGUAzdO1DSDc9WpGyYhlEo7Fq9ie6iOkuCw8mmQ1kWbDKHHK+Ey5d5WCLZyDCr pIsZKSnDLqMXexPJdN2enUAVKikqyIVCGKtUjO4//ROajkBfiiJSu3Pj221O8nKZJjHp TGOw== ARC-Authentication-Results: i=1; mx.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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j187si20848394pge.591.2019.07.26.06.52.20; Fri, 26 Jul 2019 06:52:20 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388753AbfGZNwT (ORCPT + 29 others); Fri, 26 Jul 2019 09:52:19 -0400 Received: from foss.arm.com ([217.140.110.172]:44528 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387962AbfGZNv7 (ORCPT ); Fri, 26 Jul 2019 09:51:59 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A800015A2; Fri, 26 Jul 2019 06:51:58 -0700 (PDT) Received: from usa.arm.com (e107155-lin.cambridge.arm.com [10.1.196.42]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 6ECD53F694; Fri, 26 Jul 2019 06:51:57 -0700 (PDT) From: Sudeep Holla To: linux-arm-kernel@lists.infradead.org Cc: Sudeep Holla , Peng Fan , linux-kernel@vger.kernel.org, Bo Zhang , Jim Quinlan , Volodymyr Babchuk , Gaku Inami , Etienne Carriere Subject: [PATCH v2 08/10] firmware: arm_scmi: Add asynchronous sensor read if it supports Date: Fri, 26 Jul 2019 14:51:36 +0100 Message-Id: <20190726135138.9858-9-sudeep.holla@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190726135138.9858-1-sudeep.holla@arm.com> References: <20190726135138.9858-1-sudeep.holla@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SENSOR_DESCRIPTION_GET provides attributes to indicate if the sensor supports asynchronous read. We can read that flag and use asynchronous reads for any sensors with that attribute set. Let's use the new scmi_do_xfer_with_response to support asynchronous sensor reads. Signed-off-by: Sudeep Holla --- drivers/firmware/arm_scmi/sensors.c | 30 +++++++++++++++++++++-------- include/linux/scmi_protocol.h | 2 ++ 2 files changed, 24 insertions(+), 8 deletions(-) -- 2.17.1 diff --git a/drivers/firmware/arm_scmi/sensors.c b/drivers/firmware/arm_scmi/sensors.c index 1b5757c77a35..7570308a16a0 100644 --- a/drivers/firmware/arm_scmi/sensors.c +++ b/drivers/firmware/arm_scmi/sensors.c @@ -136,9 +136,10 @@ static int scmi_sensor_description_get(const struct scmi_handle *handle, } for (cnt = 0; cnt < num_returned; cnt++) { - u32 attrh; + u32 attrh, attrl; struct scmi_sensor_info *s; + attrl = le32_to_cpu(buf->desc[cnt].attributes_low); attrh = le32_to_cpu(buf->desc[cnt].attributes_high); s = &si->sensors[desc_index + cnt]; s->id = le32_to_cpu(buf->desc[cnt].id); @@ -147,6 +148,8 @@ static int scmi_sensor_description_get(const struct scmi_handle *handle, /* Sign extend to a full s8 */ if (s->scale & SENSOR_SCALE_SIGN) s->scale |= SENSOR_SCALE_EXTEND; + s->async = SUPPORTS_ASYNC_READ(attrl); + s->num_trip_points = NUM_TRIP_POINTS(attrl); strlcpy(s->name, buf->desc[cnt].name, SCMI_MAX_STR_SIZE); } @@ -214,8 +217,11 @@ static int scmi_sensor_reading_get(const struct scmi_handle *handle, u32 sensor_id, u64 *value) { int ret; + __le32 *pval; struct scmi_xfer *t; struct scmi_msg_sensor_reading_get *sensor; + struct sensors_info *si = handle->sensor_priv; + struct scmi_sensor_info *s = si->sensors + sensor_id; ret = scmi_xfer_get_init(handle, SENSOR_READING_GET, SCMI_PROTOCOL_SENSOR, sizeof(*sensor), @@ -223,16 +229,24 @@ static int scmi_sensor_reading_get(const struct scmi_handle *handle, if (ret) return ret; + pval = t->rx.buf; sensor = t->tx.buf; sensor->id = cpu_to_le32(sensor_id); - sensor->flags = cpu_to_le32(0); - - ret = scmi_do_xfer(handle, t); - if (!ret) { - __le32 *pval = t->rx.buf; - *value = le32_to_cpu(*pval); - *value |= (u64)le32_to_cpu(*(pval + 1)) << 32; + if (s->async) { + sensor->flags = cpu_to_le32(SENSOR_READ_ASYNC); + ret = scmi_do_xfer_with_response(handle, t); + if (!ret) { + *value = le32_to_cpu(*(pval + 1)); + *value |= (u64)le32_to_cpu(*(pval + 2)) << 32; + } + } else { + sensor->flags = cpu_to_le32(0); + ret = scmi_do_xfer(handle, t); + if (!ret) { + *value = le32_to_cpu(*pval); + *value |= (u64)le32_to_cpu(*(pval + 1)) << 32; + } } scmi_xfer_put(handle, t); diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h index 2ace5af210ad..ae7381413f1f 100644 --- a/include/linux/scmi_protocol.h +++ b/include/linux/scmi_protocol.h @@ -145,6 +145,8 @@ struct scmi_sensor_info { u32 id; u8 type; s8 scale; + u8 num_trip_points; + bool async; char name[SCMI_MAX_STR_SIZE]; };