From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751603AbeABPvq (ORCPT + 1 other); Tue, 2 Jan 2018 10:51:46 -0500 Received: from mail1.bemta6.messagelabs.com ([193.109.254.111]:17732 "EHLO mail1.bemta6.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751382AbeABPu4 (ORCPT ); Tue, 2 Jan 2018 10:50:56 -0500 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprMKsWRWlGSWpSXmKPExsUSt3OpsW7cKu8 ogy2T2SyaF69ns3hzfDqTRdfqnSwWl3fNYbP43HuE0WLRslZmiycLzzBZNC54z2JxeneJxZ/n t9gcuDx2zrrL7rFpVSebx7yTgR77565h93i/7yqbx87vDewenzfJBbBHsWbmJeVXJLBmTJy2m 6lgoXbFyn9X2BsYb6p0MXJxCAmsY5TY2XqWvYuRA8ipkPjZotzFyMnBK5Ap8e7tCVaQMKeAu8 TWT8wQFW4Ss97WgVSwCVhITD7xgA3EZhFQkXizYy87iC0sECnx/vkdRpDpIgLzmCRebbgLVsQ sUCfR+/stC8R4QYmTM5+wQMQlJA6+eMEMYgsJGEicXtAIFpcQsJeY/v4q2F4JAX2JxmOxEGFD ie+zvkGVmEvsuH2DdQKj4CwkU2chmbqAkWkVo0ZxalFZapGukYVeUlFmekZJbmJmjq6hgZleb mpxcWJ6ak5iUrFecn7uJkZgpDAAwQ7G82sDDzFKcjApifLmpHpHCfEl5adUZiQWZ8QXleakFh 9i1ODgEGi5ePIgkxRLXn5eqpIEb+RKoDrBotT01Iq0zBxgLMOUSnDwKInwLgJJ8xYXJOYWZ6Z DpE4x6nI8m/m6gVkIbIaUOG8GSJEASFFGaR7cCFhaucQoKyXMywh0oBBPQWpRbmYJqvwrRnEO RiVhXm2QKTyZeSVwm14BHcEEdMSf854gR5QkIqSkGhj5OCUnvKxq1FNbdHPzJTH36fMstUOYK 91WzxGWXuj97KZt+HO7js9NE2Sn8H5/aHnir162zaJu6RcyTazWTWJbt/5w3XjAgkVZTU0vrI Bdfjv/HK4zOwICbzta16k9Dzr5qIi/IPh/XE7Rs9rEiNAcY86AkHWL+FKvpzi/9H3xZgr7LIW c40osxRmJhlrMRcWJADhD790mAwAA X-Env-Sender: Adam.Thomson.Opensource@diasemi.com X-Msg-Ref: server-13.tower-193.messagelabs.com!1514908253!118664466!2 X-Originating-IP: [94.185.165.51] X-StarScan-Received: X-StarScan-Version: 9.4.45; banners=-,-,- X-VirusChecked: Checked Message-ID: <3af7db87e0e6bdfa46ef3c1c9053297f711aee5a.1514904983.git.Adam.Thomson.Opensource@diasemi.com> In-Reply-To: References: From: Adam Thomson Date: Tue, 2 Jan 2018 15:50:53 +0000 Subject: [PATCH v4 5/7] power: supply: Add 'connected_type' property and supporting code To: Heikki Krogerus , Guenter Roeck , Greg Kroah-Hartman , Sebastian Reichel , Hans de Goede , Yueyao Zhu , Rui Miguel Silva CC: , , , MIME-Version: 1.0 Content-Type: text/plain X-KSE-AttachmentFiltering-Interceptor-Info: protection disabled X-KSE-ServerInfo: sw-ex-cashub01.diasemi.com, 9 X-KSE-Antivirus-Interceptor-Info: scan successful X-KSE-Antivirus-Info: Clean, bases: 02/01/2018 11:56:00 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: This commit adds the 'connected_type' property to represent supplies which can report a number of different types of supply based on a connection event. Examples of this already exist in drivers whereby the existing 'type' property is updated, based on an event, to represent what was connected (e.g. USB_DCP, USB_ACA, ...). Current implementations however don't show all supported connectable types, so this knowledge has to be exlicitly known for each driver that supports this. The 'connected_type' property is intended to fill this void and show users all possible types supported by a driver. The property, when read, shows all available types for the driver, and the one currently chosen is highlighted/bracketed. It is expected that the 'type' property would then just show the top-level type, such as 'USB', and this would be static. Currently the 'conn_type' enum contains all of the USB variant types that exist for the 'type' enum at this time, and in addition has the PPS type. In the future this can be extended further for other types which have multiple connected types supported. The mirroring is intentional so as to not impact existing usage of the 'type' property. Signed-off-by: Adam Thomson --- drivers/power/supply/power_supply_sysfs.c | 50 +++++++++++++++++++++++++++++++ include/linux/power_supply.h | 15 ++++++++++ 2 files changed, 65 insertions(+) diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c index 5204f11..1b3b202 100644 --- a/drivers/power/supply/power_supply_sysfs.c +++ b/drivers/power/supply/power_supply_sysfs.c @@ -46,6 +46,11 @@ "USB_PD", "USB_PD_DRP", "BrickID" }; +static const char * const power_supply_conn_type_text[] = { + "Unknown", "USB_DCP", "USB_CDP", "USB_ACA", "USB_C", + "USB_PD", "USB_PD_DRP", "USB_PD_PPS", "BrickID" +}; + static const char * const power_supply_status_text[] = { "Unknown", "Charging", "Discharging", "Not charging", "Full" }; @@ -73,6 +78,46 @@ "Unknown", "System", "Device" }; +static ssize_t power_supply_show_conn_type(struct device *dev, + enum power_supply_conn_type *conn_types, + ssize_t num_conn_types, + union power_supply_propval *value, + char *buf) +{ + enum power_supply_conn_type conn_type; + ssize_t count = 0; + bool match = false; + int i; + + if ((!conn_types) || (num_conn_types <= 0)) { + dev_warn(dev, "driver has no valid connected types\n"); + return -ENODATA; + } + + for (i = 0; i < num_conn_types; ++i) { + conn_type = conn_types[i]; + + if (value->intval == conn_type) { + count += sprintf(buf + count, "[%s] ", + power_supply_conn_type_text[conn_type]); + match = true; + } else { + count += sprintf(buf + count, "%s ", + power_supply_conn_type_text[conn_type]); + } + } + + if (!match) { + dev_warn(dev, "driver reporting unsupported connected type\n"); + return -EINVAL; + } + + if (count) + buf[count - 1] = '\n'; + + return count; +} + static ssize_t power_supply_show_property(struct device *dev, struct device_attribute *attr, char *buf) { @@ -115,6 +160,10 @@ static ssize_t power_supply_show_property(struct device *dev, else if (off == POWER_SUPPLY_PROP_TYPE) return sprintf(buf, "%s\n", power_supply_type_text[value.intval]); + else if (off == POWER_SUPPLY_PROP_CONNECTED_TYPE) + return power_supply_show_conn_type(dev, psy->desc->conn_types, + psy->desc->num_conn_types, + &value, buf); else if (off == POWER_SUPPLY_PROP_SCOPE) return sprintf(buf, "%s\n", power_supply_scope_text[value.intval]); @@ -241,6 +290,7 @@ static ssize_t power_supply_store_property(struct device *dev, POWER_SUPPLY_ATTR(time_to_full_now), POWER_SUPPLY_ATTR(time_to_full_avg), POWER_SUPPLY_ATTR(type), + POWER_SUPPLY_ATTR(connected_type), POWER_SUPPLY_ATTR(scope), POWER_SUPPLY_ATTR(precharge_current), POWER_SUPPLY_ATTR(charge_term_current), diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 79e90b3..e15a629 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -145,6 +145,7 @@ enum power_supply_property { POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, POWER_SUPPLY_PROP_TIME_TO_FULL_AVG, POWER_SUPPLY_PROP_TYPE, /* use power_supply.type instead */ + POWER_SUPPLY_PROP_CONNECTED_TYPE, POWER_SUPPLY_PROP_SCOPE, POWER_SUPPLY_PROP_PRECHARGE_CURRENT, POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, @@ -170,6 +171,18 @@ enum power_supply_type { POWER_SUPPLY_TYPE_APPLE_BRICK_ID, /* Apple Charging Method */ }; +enum power_supply_conn_type { + POWER_SUPPLY_CONN_TYPE_UNKNOWN = 0, + POWER_SUPPLY_CONN_TYPE_USB_DCP, /* Dedicated Charging Port */ + POWER_SUPPLY_CONN_TYPE_USB_CDP, /* Charging Downstream Port */ + POWER_SUPPLY_CONN_TYPE_USB_ACA, /* Accessory Charger Adapters */ + POWER_SUPPLY_CONN_TYPE_USB_TYPE_C, /* Type C Port */ + POWER_SUPPLY_CONN_TYPE_USB_PD, /* Power Delivery Port */ + POWER_SUPPLY_CONN_TYPE_USB_PD_DRP, /* PD Dual Role Port */ + POWER_SUPPLY_CONN_TYPE_USB_PD_PPS, /* PD Programmable Power Supply */ + POWER_SUPPLY_CONN_TYPE_APPLE_BRICK_ID, /* Apple Charging Method */ +}; + enum power_supply_notifier_events { PSY_EVENT_PROP_CHANGED, }; @@ -196,6 +209,8 @@ struct power_supply_config { struct power_supply_desc { const char *name; enum power_supply_type type; + enum power_supply_conn_type *conn_types; + size_t num_conn_types; enum power_supply_property *properties; size_t num_properties; -- 1.9.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v4,5/7] power: supply: Add 'connected_type' property and supporting code From: "Opensource \[Adam Thomson\]" Message-Id: <3af7db87e0e6bdfa46ef3c1c9053297f711aee5a.1514904983.git.Adam.Thomson.Opensource@diasemi.com> Date: Tue, 2 Jan 2018 15:50:53 +0000 To: Heikki Krogerus , Guenter Roeck , Greg Kroah-Hartman , Sebastian Reichel , Hans de Goede , Yueyao Zhu , Rui Miguel Silva Cc: linux-usb@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, support.opensource@diasemi.com List-ID: VGhpcyBjb21taXQgYWRkcyB0aGUgJ2Nvbm5lY3RlZF90eXBlJyBwcm9wZXJ0eSB0byByZXByZXNl bnQgc3VwcGxpZXMKd2hpY2ggY2FuIHJlcG9ydCBhIG51bWJlciBvZiBkaWZmZXJlbnQgdHlwZXMg b2Ygc3VwcGx5IGJhc2VkIG9uIGEKY29ubmVjdGlvbiBldmVudC4KCkV4YW1wbGVzIG9mIHRoaXMg YWxyZWFkeSBleGlzdCBpbiBkcml2ZXJzIHdoZXJlYnkgdGhlIGV4aXN0aW5nICd0eXBlJwpwcm9w ZXJ0eSBpcyB1cGRhdGVkLCBiYXNlZCBvbiBhbiBldmVudCwgdG8gcmVwcmVzZW50IHdoYXQgd2Fz CmNvbm5lY3RlZCAoZS5nLiBVU0JfRENQLCBVU0JfQUNBLCAuLi4pLiBDdXJyZW50IGltcGxlbWVu dGF0aW9ucwpob3dldmVyIGRvbid0IHNob3cgYWxsIHN1cHBvcnRlZCBjb25uZWN0YWJsZSB0eXBl cywgc28gdGhpcyBrbm93bGVkZ2UKaGFzIHRvIGJlIGV4bGljaXRseSBrbm93biBmb3IgZWFjaCBk cml2ZXIgdGhhdCBzdXBwb3J0cyB0aGlzLgoKVGhlICdjb25uZWN0ZWRfdHlwZScgcHJvcGVydHkg aXMgaW50ZW5kZWQgdG8gZmlsbCB0aGlzIHZvaWQgYW5kIHNob3cKdXNlcnMgYWxsIHBvc3NpYmxl IHR5cGVzIHN1cHBvcnRlZCBieSBhIGRyaXZlci4gVGhlIHByb3BlcnR5LCB3aGVuCnJlYWQsIHNo b3dzIGFsbCBhdmFpbGFibGUgdHlwZXMgZm9yIHRoZSBkcml2ZXIsIGFuZCB0aGUgb25lIGN1cnJl bnRseQpjaG9zZW4gaXMgaGlnaGxpZ2h0ZWQvYnJhY2tldGVkLiBJdCBpcyBleHBlY3RlZCB0aGF0 IHRoZSAndHlwZScKcHJvcGVydHkgd291bGQgdGhlbiBqdXN0IHNob3cgdGhlIHRvcC1sZXZlbCB0 eXBlLCBzdWNoIGFzICdVU0InLCBhbmQKdGhpcyB3b3VsZCBiZSBzdGF0aWMuCgpDdXJyZW50bHkg dGhlICdjb25uX3R5cGUnIGVudW0gY29udGFpbnMgYWxsIG9mIHRoZSBVU0IgdmFyaWFudCB0eXBl cwp0aGF0IGV4aXN0IGZvciB0aGUgJ3R5cGUnIGVudW0gYXQgdGhpcyB0aW1lLCBhbmQgaW4gYWRk aXRpb24gaGFzCnRoZSBQUFMgdHlwZS4gSW4gdGhlIGZ1dHVyZSB0aGlzIGNhbiBiZSBleHRlbmRl ZCBmdXJ0aGVyIGZvciBvdGhlcgp0eXBlcyB3aGljaCBoYXZlIG11bHRpcGxlIGNvbm5lY3RlZCB0 eXBlcyBzdXBwb3J0ZWQuIFRoZSBtaXJyb3JpbmcKaXMgaW50ZW50aW9uYWwgc28gYXMgdG8gbm90 IGltcGFjdCBleGlzdGluZyB1c2FnZSBvZiB0aGUgJ3R5cGUnCnByb3BlcnR5LgoKU2lnbmVkLW9m Zi1ieTogQWRhbSBUaG9tc29uIDxBZGFtLlRob21zb24uT3BlbnNvdXJjZUBkaWFzZW1pLmNvbT4K LS0tCiBkcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHlfc3lzZnMuYyB8IDUwICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysKIGluY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5Lmgg ICAgICAgICAgICAgIHwgMTUgKysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCA2NSBpbnNlcnRp b25zKCspCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcG93ZXJfc3VwcGx5X3N5 c2ZzLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHlfc3lzZnMuYwppbmRleCA1 MjA0ZjExLi4xYjNiMjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9z dXBwbHlfc3lzZnMuYworKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHlfc3lz ZnMuYwpAQCAtNDYsNiArNDYsMTEgQEAKIAkiVVNCX1BEIiwgIlVTQl9QRF9EUlAiLCAiQnJpY2tJ RCIKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcG93ZXJfc3VwcGx5X2Nvbm5fdHlw ZV90ZXh0W10gPSB7CisJIlVua25vd24iLCAiVVNCX0RDUCIsICJVU0JfQ0RQIiwgIlVTQl9BQ0Ei LCAiVVNCX0MiLAorCSJVU0JfUEQiLCAiVVNCX1BEX0RSUCIsICJVU0JfUERfUFBTIiwgIkJyaWNr SUQiCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBvd2VyX3N1cHBseV9zdGF0dXNf dGV4dFtdID0gewogCSJVbmtub3duIiwgIkNoYXJnaW5nIiwgIkRpc2NoYXJnaW5nIiwgIk5vdCBj aGFyZ2luZyIsICJGdWxsIgogfTsKQEAgLTczLDYgKzc4LDQ2IEBACiAJIlVua25vd24iLCAiU3lz dGVtIiwgIkRldmljZSIKIH07CiAKK3N0YXRpYyBzc2l6ZV90IHBvd2VyX3N1cHBseV9zaG93X2Nv bm5fdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIGVudW0gcG93ZXJfc3VwcGx5X2Nv bm5fdHlwZSAqY29ubl90eXBlcywKKwkJCQkJICAgc3NpemVfdCBudW1fY29ubl90eXBlcywKKwkJ CQkJICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbHVlLAorCQkJCQkgICBjaGFyICpi dWYpCit7CisJZW51bSBwb3dlcl9zdXBwbHlfY29ubl90eXBlIGNvbm5fdHlwZTsKKwlzc2l6ZV90 IGNvdW50ID0gMDsKKwlib29sIG1hdGNoID0gZmFsc2U7CisJaW50IGk7CisKKwlpZiAoKCFjb25u X3R5cGVzKSB8fCAobnVtX2Nvbm5fdHlwZXMgPD0gMCkpIHsKKwkJZGV2X3dhcm4oZGV2LCAiZHJp dmVyIGhhcyBubyB2YWxpZCBjb25uZWN0ZWQgdHlwZXNcbiIpOworCQlyZXR1cm4gLUVOT0RBVEE7 CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9jb25uX3R5cGVzOyArK2kpIHsKKwkJY29ubl90 eXBlID0gY29ubl90eXBlc1tpXTsKKworCQlpZiAodmFsdWUtPmludHZhbCA9PSBjb25uX3R5cGUp IHsKKwkJCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsICJbJXNdICIsCisJCQkJCSBwb3dl cl9zdXBwbHlfY29ubl90eXBlX3RleHRbY29ubl90eXBlXSk7CisJCQltYXRjaCA9IHRydWU7CisJ CX0gZWxzZSB7CisJCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJXMgIiwKKwkJCQkJ IHBvd2VyX3N1cHBseV9jb25uX3R5cGVfdGV4dFtjb25uX3R5cGVdKTsKKwkJfQorCX0KKworCWlm ICghbWF0Y2gpIHsKKwkJZGV2X3dhcm4oZGV2LCAiZHJpdmVyIHJlcG9ydGluZyB1bnN1cHBvcnRl ZCBjb25uZWN0ZWQgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3Vu dCkKKwkJYnVmW2NvdW50IC0gMV0gPSAnXG4nOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0 aWMgc3NpemVfdCBwb3dlcl9zdXBwbHlfc2hvd19wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlICpkZXYs CiAJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCSAgY2hhciAqYnVm KSB7CkBAIC0xMTUsNiArMTYwLDEwIEBAIHN0YXRpYyBzc2l6ZV90IHBvd2VyX3N1cHBseV9zaG93 X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2UgKmRldiwKIAllbHNlIGlmIChvZmYgPT0gUE9XRVJfU1VQ UExZX1BST1BfVFlQRSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsCiAJCQkgICAgICAg cG93ZXJfc3VwcGx5X3R5cGVfdGV4dFt2YWx1ZS5pbnR2YWxdKTsKKwllbHNlIGlmIChvZmYgPT0g UE9XRVJfU1VQUExZX1BST1BfQ09OTkVDVEVEX1RZUEUpCisJCXJldHVybiBwb3dlcl9zdXBwbHlf c2hvd19jb25uX3R5cGUoZGV2LCBwc3ktPmRlc2MtPmNvbm5fdHlwZXMsCisJCQkJCQkgICBwc3kt PmRlc2MtPm51bV9jb25uX3R5cGVzLAorCQkJCQkJICAgJnZhbHVlLCBidWYpOwogCWVsc2UgaWYg KG9mZiA9PSBQT1dFUl9TVVBQTFlfUFJPUF9TQ09QRSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAi JXNcbiIsCiAJCQkgICAgICAgcG93ZXJfc3VwcGx5X3Njb3BlX3RleHRbdmFsdWUuaW50dmFsXSk7 CkBAIC0yNDEsNiArMjkwLDcgQEAgc3RhdGljIHNzaXplX3QgcG93ZXJfc3VwcGx5X3N0b3JlX3By b3BlcnR5KHN0cnVjdCBkZXZpY2UgKmRldiwKIAlQT1dFUl9TVVBQTFlfQVRUUih0aW1lX3RvX2Z1 bGxfbm93KSwKIAlQT1dFUl9TVVBQTFlfQVRUUih0aW1lX3RvX2Z1bGxfYXZnKSwKIAlQT1dFUl9T VVBQTFlfQVRUUih0eXBlKSwKKwlQT1dFUl9TVVBQTFlfQVRUUihjb25uZWN0ZWRfdHlwZSksCiAJ UE9XRVJfU1VQUExZX0FUVFIoc2NvcGUpLAogCVBPV0VSX1NVUFBMWV9BVFRSKHByZWNoYXJnZV9j dXJyZW50KSwKIAlQT1dFUl9TVVBQTFlfQVRUUihjaGFyZ2VfdGVybV9jdXJyZW50KSwKZGlmZiAt LWdpdCBhL2luY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmggYi9pbmNsdWRlL2xpbnV4L3Bvd2Vy X3N1cHBseS5oCmluZGV4IDc5ZTkwYjMuLmUxNWE2MjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlu dXgvcG93ZXJfc3VwcGx5LmgKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaApAQCAt MTQ1LDYgKzE0NSw3IEBAIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHsKIAlQT1dFUl9TVVBQ TFlfUFJPUF9USU1FX1RPX0ZVTExfTk9XLAogCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVM TF9BVkcsCiAJUE9XRVJfU1VQUExZX1BST1BfVFlQRSwgLyogdXNlIHBvd2VyX3N1cHBseS50eXBl IGluc3RlYWQgKi8KKwlQT1dFUl9TVVBQTFlfUFJPUF9DT05ORUNURURfVFlQRSwKIAlQT1dFUl9T VVBQTFlfUFJPUF9TQ09QRSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9QUkVDSEFSR0VfQ1VSUkVOVCwK IAlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVEVSTV9DVVJSRU5ULApAQCAtMTcwLDYgKzE3MSwx OCBAQCBlbnVtIHBvd2VyX3N1cHBseV90eXBlIHsKIAlQT1dFUl9TVVBQTFlfVFlQRV9BUFBMRV9C UklDS19JRCwJLyogQXBwbGUgQ2hhcmdpbmcgTWV0aG9kICovCiB9OwogCitlbnVtIHBvd2VyX3N1 cHBseV9jb25uX3R5cGUgeworCVBPV0VSX1NVUFBMWV9DT05OX1RZUEVfVU5LTk9XTiA9IDAsCisJ UE9XRVJfU1VQUExZX0NPTk5fVFlQRV9VU0JfRENQLAkJLyogRGVkaWNhdGVkIENoYXJnaW5nIFBv cnQgKi8KKwlQT1dFUl9TVVBQTFlfQ09OTl9UWVBFX1VTQl9DRFAsCQkvKiBDaGFyZ2luZyBEb3du c3RyZWFtIFBvcnQgKi8KKwlQT1dFUl9TVVBQTFlfQ09OTl9UWVBFX1VTQl9BQ0EsCQkvKiBBY2Nl c3NvcnkgQ2hhcmdlciBBZGFwdGVycyAqLworCVBPV0VSX1NVUFBMWV9DT05OX1RZUEVfVVNCX1RZ UEVfQywJLyogVHlwZSBDIFBvcnQgKi8KKwlQT1dFUl9TVVBQTFlfQ09OTl9UWVBFX1VTQl9QRCwJ CS8qIFBvd2VyIERlbGl2ZXJ5IFBvcnQgKi8KKwlQT1dFUl9TVVBQTFlfQ09OTl9UWVBFX1VTQl9Q RF9EUlAsCS8qIFBEIER1YWwgUm9sZSBQb3J0ICovCisJUE9XRVJfU1VQUExZX0NPTk5fVFlQRV9V U0JfUERfUFBTLAkvKiBQRCBQcm9ncmFtbWFibGUgUG93ZXIgU3VwcGx5ICovCisJUE9XRVJfU1VQ UExZX0NPTk5fVFlQRV9BUFBMRV9CUklDS19JRCwJLyogQXBwbGUgQ2hhcmdpbmcgTWV0aG9kICov Cit9OworCiBlbnVtIHBvd2VyX3N1cHBseV9ub3RpZmllcl9ldmVudHMgewogCVBTWV9FVkVOVF9Q Uk9QX0NIQU5HRUQsCiB9OwpAQCAtMTk2LDYgKzIwOSw4IEBAIHN0cnVjdCBwb3dlcl9zdXBwbHlf Y29uZmlnIHsKIHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyB7CiAJY29uc3QgY2hhciAqbmFtZTsK IAllbnVtIHBvd2VyX3N1cHBseV90eXBlIHR5cGU7CisJZW51bSBwb3dlcl9zdXBwbHlfY29ubl90 eXBlICpjb25uX3R5cGVzOworCXNpemVfdCBudW1fY29ubl90eXBlczsKIAllbnVtIHBvd2VyX3N1 cHBseV9wcm9wZXJ0eSAqcHJvcGVydGllczsKIAlzaXplX3QgbnVtX3Byb3BlcnRpZXM7CiAK From mboxrd@z Thu Jan 1 00:00:00 1970 From: Adam Thomson Subject: [PATCH v4 5/7] power: supply: Add 'connected_type' property and supporting code Date: Tue, 2 Jan 2018 15:50:53 +0000 Message-ID: <3af7db87e0e6bdfa46ef3c1c9053297f711aee5a.1514904983.git.Adam.Thomson.Opensource@diasemi.com> References: Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: Heikki Krogerus , Guenter Roeck , Greg Kroah-Hartman , Sebastian Reichel , Hans de Goede , Yueyao Zhu , Rui Miguel Silva Cc: linux-usb@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, support.opensource@diasemi.com List-Id: linux-pm@vger.kernel.org This commit adds the 'connected_type' property to represent supplies which can report a number of different types of supply based on a connection event. Examples of this already exist in drivers whereby the existing 'type' property is updated, based on an event, to represent what was connected (e.g. USB_DCP, USB_ACA, ...). Current implementations however don't show all supported connectable types, so this knowledge has to be exlicitly known for each driver that supports this. The 'connected_type' property is intended to fill this void and show users all possible types supported by a driver. The property, when read, shows all available types for the driver, and the one currently chosen is highlighted/bracketed. It is expected that the 'type' property would then just show the top-level type, such as 'USB', and this would be static. Currently the 'conn_type' enum contains all of the USB variant types that exist for the 'type' enum at this time, and in addition has the PPS type. In the future this can be extended further for other types which have multiple connected types supported. The mirroring is intentional so as to not impact existing usage of the 'type' property. Signed-off-by: Adam Thomson --- drivers/power/supply/power_supply_sysfs.c | 50 +++++++++++++++++++++++++++++++ include/linux/power_supply.h | 15 ++++++++++ 2 files changed, 65 insertions(+) diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c index 5204f11..1b3b202 100644 --- a/drivers/power/supply/power_supply_sysfs.c +++ b/drivers/power/supply/power_supply_sysfs.c @@ -46,6 +46,11 @@ "USB_PD", "USB_PD_DRP", "BrickID" }; +static const char * const power_supply_conn_type_text[] = { + "Unknown", "USB_DCP", "USB_CDP", "USB_ACA", "USB_C", + "USB_PD", "USB_PD_DRP", "USB_PD_PPS", "BrickID" +}; + static const char * const power_supply_status_text[] = { "Unknown", "Charging", "Discharging", "Not charging", "Full" }; @@ -73,6 +78,46 @@ "Unknown", "System", "Device" }; +static ssize_t power_supply_show_conn_type(struct device *dev, + enum power_supply_conn_type *conn_types, + ssize_t num_conn_types, + union power_supply_propval *value, + char *buf) +{ + enum power_supply_conn_type conn_type; + ssize_t count = 0; + bool match = false; + int i; + + if ((!conn_types) || (num_conn_types <= 0)) { + dev_warn(dev, "driver has no valid connected types\n"); + return -ENODATA; + } + + for (i = 0; i < num_conn_types; ++i) { + conn_type = conn_types[i]; + + if (value->intval == conn_type) { + count += sprintf(buf + count, "[%s] ", + power_supply_conn_type_text[conn_type]); + match = true; + } else { + count += sprintf(buf + count, "%s ", + power_supply_conn_type_text[conn_type]); + } + } + + if (!match) { + dev_warn(dev, "driver reporting unsupported connected type\n"); + return -EINVAL; + } + + if (count) + buf[count - 1] = '\n'; + + return count; +} + static ssize_t power_supply_show_property(struct device *dev, struct device_attribute *attr, char *buf) { @@ -115,6 +160,10 @@ static ssize_t power_supply_show_property(struct device *dev, else if (off == POWER_SUPPLY_PROP_TYPE) return sprintf(buf, "%s\n", power_supply_type_text[value.intval]); + else if (off == POWER_SUPPLY_PROP_CONNECTED_TYPE) + return power_supply_show_conn_type(dev, psy->desc->conn_types, + psy->desc->num_conn_types, + &value, buf); else if (off == POWER_SUPPLY_PROP_SCOPE) return sprintf(buf, "%s\n", power_supply_scope_text[value.intval]); @@ -241,6 +290,7 @@ static ssize_t power_supply_store_property(struct device *dev, POWER_SUPPLY_ATTR(time_to_full_now), POWER_SUPPLY_ATTR(time_to_full_avg), POWER_SUPPLY_ATTR(type), + POWER_SUPPLY_ATTR(connected_type), POWER_SUPPLY_ATTR(scope), POWER_SUPPLY_ATTR(precharge_current), POWER_SUPPLY_ATTR(charge_term_current), diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 79e90b3..e15a629 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -145,6 +145,7 @@ enum power_supply_property { POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, POWER_SUPPLY_PROP_TIME_TO_FULL_AVG, POWER_SUPPLY_PROP_TYPE, /* use power_supply.type instead */ + POWER_SUPPLY_PROP_CONNECTED_TYPE, POWER_SUPPLY_PROP_SCOPE, POWER_SUPPLY_PROP_PRECHARGE_CURRENT, POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, @@ -170,6 +171,18 @@ enum power_supply_type { POWER_SUPPLY_TYPE_APPLE_BRICK_ID, /* Apple Charging Method */ }; +enum power_supply_conn_type { + POWER_SUPPLY_CONN_TYPE_UNKNOWN = 0, + POWER_SUPPLY_CONN_TYPE_USB_DCP, /* Dedicated Charging Port */ + POWER_SUPPLY_CONN_TYPE_USB_CDP, /* Charging Downstream Port */ + POWER_SUPPLY_CONN_TYPE_USB_ACA, /* Accessory Charger Adapters */ + POWER_SUPPLY_CONN_TYPE_USB_TYPE_C, /* Type C Port */ + POWER_SUPPLY_CONN_TYPE_USB_PD, /* Power Delivery Port */ + POWER_SUPPLY_CONN_TYPE_USB_PD_DRP, /* PD Dual Role Port */ + POWER_SUPPLY_CONN_TYPE_USB_PD_PPS, /* PD Programmable Power Supply */ + POWER_SUPPLY_CONN_TYPE_APPLE_BRICK_ID, /* Apple Charging Method */ +}; + enum power_supply_notifier_events { PSY_EVENT_PROP_CHANGED, }; @@ -196,6 +209,8 @@ struct power_supply_config { struct power_supply_desc { const char *name; enum power_supply_type type; + enum power_supply_conn_type *conn_types; + size_t num_conn_types; enum power_supply_property *properties; size_t num_properties; -- 1.9.1