From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0D41BC43381 for ; Fri, 15 Mar 2019 16:58:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D5D4F218A1 for ; Fri, 15 Mar 2019 16:58:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729804AbfCOQ6Z (ORCPT ); Fri, 15 Mar 2019 12:58:25 -0400 Received: from mga17.intel.com ([192.55.52.151]:39359 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728458AbfCOQ6V (ORCPT ); Fri, 15 Mar 2019 12:58:21 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 15 Mar 2019 09:58:20 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,482,1544515200"; d="scan'208";a="155397250" Received: from black.fi.intel.com (HELO black.fi.intel.com.) ([10.237.72.28]) by fmsmga001.fm.intel.com with ESMTP; 15 Mar 2019 09:58:18 -0700 From: Heikki Krogerus To: Hans de Goede Cc: Andy Shevchenko , linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, platform-driver-x86@vger.kernel.org Subject: [PATCH 09/12] platform/x86: intel_cht_int33fe: Link with external dependencies using fwnodes Date: Fri, 15 Mar 2019 19:57:57 +0300 Message-Id: <20190315165800.5058-10-heikki.krogerus@linux.intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190315165800.5058-1-heikki.krogerus@linux.intel.com> References: <20190315165800.5058-1-heikki.krogerus@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Supplying also external devices - the DisplayPort connector and the USB role switch - software fwnodes. After this the driver has access to all the components tied to the USB Type-C connector and can start creating software node references to actually associate them with the USB Type-C connector device. Signed-off-by: Heikki Krogerus --- drivers/platform/x86/intel_cht_int33fe.c | 102 +++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/drivers/platform/x86/intel_cht_int33fe.c b/drivers/platform/x86/intel_cht_int33fe.c index 44860c748bf5..aa71b97a22e9 100644 --- a/drivers/platform/x86/intel_cht_int33fe.c +++ b/drivers/platform/x86/intel_cht_int33fe.c @@ -33,6 +33,8 @@ enum { INT33FE_NODE_FUSB302, INT33FE_NODE_MAX17047, INT33FE_NODE_PI3USB30532, + INT33FE_NODE_DISPLAYPORT, + INT33FE_NODE_ROLE_SWITCH, INT33FE_NODE_USB_CONNECTOR, INT33FE_NODE_MAX, }; @@ -44,6 +46,7 @@ struct cht_int33fe_data { /* Contain a list-head must be per device */ struct device_connection connections[4]; + struct fwnode_handle *dp; struct fwnode_handle *node[INT33FE_NODE_MAX]; }; @@ -144,8 +147,81 @@ static const struct property_entry *props[] = { [INT33FE_NODE_FUSB302] = fusb302_props, [INT33FE_NODE_MAX17047] = NULL, [INT33FE_NODE_PI3USB30532] = NULL, + [INT33FE_NODE_DISPLAYPORT] = NULL, + [INT33FE_NODE_ROLE_SWITCH] = NULL, }; +static const char *dp_acpi_node_name = "DD02"; +static const char *mux_platfrom_dev_name = "intel_xhci_usb_sw"; +static const char *mux_name = "intel_xhci_usb_sw-role-switch"; + +static int cht_int33fe_setup_dp(struct cht_int33fe_data *data) +{ + struct fwnode_handle *fwnode = data->node[INT33FE_NODE_DISPLAYPORT]; + struct pci_dev *pdev; + + /* First let's find the GPU PCI device */ + pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, NULL); + if (!pdev || (pdev->vendor != PCI_VENDOR_ID_INTEL)) + return -ENODEV; + + /* Then the DP child device node */ + data->dp = device_get_named_child_node(&pdev->dev, dp_acpi_node_name); + pci_dev_put(pdev); + if (!data->dp) + return -ENODEV; + + fwnode->secondary = ERR_PTR(-ENODEV); + data->dp->secondary = fwnode; + + return 0; +} + +static int role_switch_match(struct device *dev, void *name) +{ + return !strcmp(dev_name(dev), name); +} + +static int cht_int33fe_setup_mux(struct cht_int33fe_data *data) +{ + struct fwnode_handle *fwnode = data->node[INT33FE_NODE_ROLE_SWITCH]; + struct pci_dev *pdev; + struct device *dev; + struct device *p; + + /* First let's find xHCI PCI device */ + pdev = pci_get_class(PCI_CLASS_SERIAL_USB_XHCI, NULL); + if (!pdev || (pdev->vendor != PCI_VENDOR_ID_INTEL)) + return -ENODEV; + + /* Then the child platform device */ + p = device_find_child(&pdev->dev, (void *)mux_platfrom_dev_name, + role_switch_match); + pci_dev_put(pdev); + if (!p) + return -EPROBE_DEFER; + + /* Finally the mux device */ + dev = device_find_child(p, (void *)mux_name, role_switch_match); + put_device(p); + if (!dev) + return -EPROBE_DEFER; + + /* If there already is a node for the mux, using that one. */ + if (dev->fwnode) { + fwnode_handle_get(dev->fwnode); + fwnode_remove_software_node(fwnode); + data->node[INT33FE_NODE_ROLE_SWITCH] = dev->fwnode; + } else { + /* The node can be tied to the lifetime of the device. */ + dev->fwnode = fwnode_handle_get(dev->fwnode); + } + + put_device(dev); + + return 0; +} + static void cht_int33fe_remove_nodes(struct cht_int33fe_data *data) { int i; @@ -154,6 +230,12 @@ static void cht_int33fe_remove_nodes(struct cht_int33fe_data *data) fwnode_remove_software_node(data->node[i]); data->node[i] = NULL; } + + if (data->dp) { + data->dp->secondary = NULL; + fwnode_handle_put(data->dp); + data->dp = NULL; + } } static int cht_int33fe_add_nodes(struct cht_int33fe_data *data) @@ -180,6 +262,26 @@ static int cht_int33fe_add_nodes(struct cht_int33fe_data *data) } data->node[INT33FE_NODE_USB_CONNECTOR] = fwnode; + /* The devices that are not created in this driver need extra steps. */ + + /* + * There is no ACPI device node for the USB role mux, so we need to find + * the mux device and assign our node directly to it. That means we + * depend on the mux driver. This function will return -PROBE_DEFER + * until the mux device is registered. + */ + ret = cht_int33fe_setup_mux(data); + if (ret) + goto err_remove_nodes; + + /* + * The DP connector does have ACPI device node. In this case we can just + * find that ACPI node and assing our node as the secondary node to it. + */ + ret = cht_int33fe_setup_dp(data); + if (ret) + goto err_remove_nodes; + return 0; err_remove_nodes: -- 2.20.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: [09/12] platform/x86: intel_cht_int33fe: Link with external dependencies using fwnodes From: Heikki Krogerus Message-Id: <20190315165800.5058-10-heikki.krogerus@linux.intel.com> Date: Fri, 15 Mar 2019 19:57:57 +0300 To: Hans de Goede Cc: Andy Shevchenko , linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, platform-driver-x86@vger.kernel.org List-ID: U3VwcGx5aW5nIGFsc28gZXh0ZXJuYWwgZGV2aWNlcyAtIHRoZSBEaXNwbGF5UG9ydCBjb25uZWN0 b3IKYW5kIHRoZSBVU0Igcm9sZSBzd2l0Y2ggLSBzb2Z0d2FyZSBmd25vZGVzLiBBZnRlciB0aGlz IHRoZQpkcml2ZXIgaGFzIGFjY2VzcyB0byBhbGwgdGhlIGNvbXBvbmVudHMgdGllZCB0byB0aGUg VVNCClR5cGUtQyBjb25uZWN0b3IgYW5kIGNhbiBzdGFydCBjcmVhdGluZyBzb2Z0d2FyZSBub2Rl CnJlZmVyZW5jZXMgdG8gYWN0dWFsbHkgYXNzb2NpYXRlIHRoZW0gd2l0aCB0aGUgVVNCIFR5cGUt Qwpjb25uZWN0b3IgZGV2aWNlLgoKU2lnbmVkLW9mZi1ieTogSGVpa2tpIEtyb2dlcnVzIDxoZWlr a2kua3JvZ2VydXNAbGludXguaW50ZWwuY29tPgotLS0KIGRyaXZlcnMvcGxhdGZvcm0veDg2L2lu dGVsX2NodF9pbnQzM2ZlLmMgfCAxMDIgKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBj aGFuZ2VkLCAxMDIgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0v eDg2L2ludGVsX2NodF9pbnQzM2ZlLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9jaHRf aW50MzNmZS5jCmluZGV4IDQ0ODYwYzc0OGJmNS4uYWE3MWI5N2EyMmU5IDEwMDY0NAotLS0gYS9k cml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9jaHRfaW50MzNmZS5jCisrKyBiL2RyaXZlcnMvcGxh dGZvcm0veDg2L2ludGVsX2NodF9pbnQzM2ZlLmMKQEAgLTMzLDYgKzMzLDggQEAgZW51bSB7CiAJ SU5UMzNGRV9OT0RFX0ZVU0IzMDIsCiAJSU5UMzNGRV9OT0RFX01BWDE3MDQ3LAogCUlOVDMzRkVf Tk9ERV9QSTNVU0IzMDUzMiwKKwlJTlQzM0ZFX05PREVfRElTUExBWVBPUlQsCisJSU5UMzNGRV9O T0RFX1JPTEVfU1dJVENILAogCUlOVDMzRkVfTk9ERV9VU0JfQ09OTkVDVE9SLAogCUlOVDMzRkVf Tk9ERV9NQVgsCiB9OwpAQCAtNDQsNiArNDYsNyBAQCBzdHJ1Y3QgY2h0X2ludDMzZmVfZGF0YSB7 CiAJLyogQ29udGFpbiBhIGxpc3QtaGVhZCBtdXN0IGJlIHBlciBkZXZpY2UgKi8KIAlzdHJ1Y3Qg ZGV2aWNlX2Nvbm5lY3Rpb24gY29ubmVjdGlvbnNbNF07CiAKKwlzdHJ1Y3QgZndub2RlX2hhbmRs ZSAqZHA7CiAJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKm5vZGVbSU5UMzNGRV9OT0RFX01BWF07CiB9 OwogCkBAIC0xNDQsOCArMTQ3LDgxIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvcGVydHlfZW50 cnkgKnByb3BzW10gPSB7CiAJW0lOVDMzRkVfTk9ERV9GVVNCMzAyXQkJPSBmdXNiMzAyX3Byb3Bz LAogCVtJTlQzM0ZFX05PREVfTUFYMTcwNDddCQk9IE5VTEwsCiAJW0lOVDMzRkVfTk9ERV9QSTNV U0IzMDUzMl0JPSBOVUxMLAorCVtJTlQzM0ZFX05PREVfRElTUExBWVBPUlRdCT0gTlVMTCwKKwlb SU5UMzNGRV9OT0RFX1JPTEVfU1dJVENIXQk9IE5VTEwsCiB9OwogCitzdGF0aWMgY29uc3QgY2hh ciAqZHBfYWNwaV9ub2RlX25hbWUgPSAiREQwMiI7CitzdGF0aWMgY29uc3QgY2hhciAqbXV4X3Bs YXRmcm9tX2Rldl9uYW1lID0gImludGVsX3hoY2lfdXNiX3N3IjsKK3N0YXRpYyBjb25zdCBjaGFy ICptdXhfbmFtZSA9ICJpbnRlbF94aGNpX3VzYl9zdy1yb2xlLXN3aXRjaCI7CisKK3N0YXRpYyBp bnQgY2h0X2ludDMzZmVfc2V0dXBfZHAoc3RydWN0IGNodF9pbnQzM2ZlX2RhdGEgKmRhdGEpCit7 CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSA9IGRhdGEtPm5vZGVbSU5UMzNGRV9OT0RF X0RJU1BMQVlQT1JUXTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCS8qIEZpcnN0IGxldCdz IGZpbmQgdGhlIEdQVSBQQ0kgZGV2aWNlICovCisJcGRldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NM QVNTX0RJU1BMQVlfVkdBIDw8IDgsIE5VTEwpOworCWlmICghcGRldiB8fCAocGRldi0+dmVuZG9y ICE9IFBDSV9WRU5ET1JfSURfSU5URUwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFRoZW4g dGhlIERQIGNoaWxkIGRldmljZSBub2RlICovCisJZGF0YS0+ZHAgPSBkZXZpY2VfZ2V0X25hbWVk X2NoaWxkX25vZGUoJnBkZXYtPmRldiwgZHBfYWNwaV9ub2RlX25hbWUpOworCXBjaV9kZXZfcHV0 KHBkZXYpOworCWlmICghZGF0YS0+ZHApCisJCXJldHVybiAtRU5PREVWOworCisJZndub2RlLT5z ZWNvbmRhcnkgPSBFUlJfUFRSKC1FTk9ERVYpOworCWRhdGEtPmRwLT5zZWNvbmRhcnkgPSBmd25v ZGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2xlX3N3aXRjaF9tYXRjaChzdHJ1 Y3QgZGV2aWNlICpkZXYsIHZvaWQgKm5hbWUpCit7CisJcmV0dXJuICFzdHJjbXAoZGV2X25hbWUo ZGV2KSwgbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgY2h0X2ludDMzZmVfc2V0dXBfbXV4KHN0cnVj dCBjaHRfaW50MzNmZV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25v ZGUgPSBkYXRhLT5ub2RlW0lOVDMzRkVfTk9ERV9ST0xFX1NXSVRDSF07CisJc3RydWN0IHBjaV9k ZXYgKnBkZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBkZXZpY2UgKnA7CisKKwkv KiBGaXJzdCBsZXQncyBmaW5kIHhIQ0kgUENJIGRldmljZSAqLworCXBkZXYgPSBwY2lfZ2V0X2Ns YXNzKFBDSV9DTEFTU19TRVJJQUxfVVNCX1hIQ0ksIE5VTEwpOworCWlmICghcGRldiB8fCAocGRl di0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfSU5URUwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwor CS8qIFRoZW4gdGhlIGNoaWxkIHBsYXRmb3JtIGRldmljZSAqLworCXAgPSBkZXZpY2VfZmluZF9j aGlsZCgmcGRldi0+ZGV2LCAodm9pZCAqKW11eF9wbGF0ZnJvbV9kZXZfbmFtZSwKKwkJCSAgICAg IHJvbGVfc3dpdGNoX21hdGNoKTsKKwlwY2lfZGV2X3B1dChwZGV2KTsKKwlpZiAoIXApCisJCXJl dHVybiAtRVBST0JFX0RFRkVSOworCisJLyogRmluYWxseSB0aGUgbXV4IGRldmljZSAqLworCWRl diA9IGRldmljZV9maW5kX2NoaWxkKHAsICh2b2lkICopbXV4X25hbWUsIHJvbGVfc3dpdGNoX21h dGNoKTsKKwlwdXRfZGV2aWNlKHApOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVQUk9CRV9ERUZF UjsKKworCS8qIElmIHRoZXJlIGFscmVhZHkgaXMgYSBub2RlIGZvciB0aGUgbXV4LCB1c2luZyB0 aGF0IG9uZS4gKi8KKwlpZiAoZGV2LT5md25vZGUpIHsKKwkJZndub2RlX2hhbmRsZV9nZXQoZGV2 LT5md25vZGUpOworCQlmd25vZGVfcmVtb3ZlX3NvZnR3YXJlX25vZGUoZndub2RlKTsKKwkJZGF0 YS0+bm9kZVtJTlQzM0ZFX05PREVfUk9MRV9TV0lUQ0hdID0gZGV2LT5md25vZGU7CisJfSBlbHNl IHsKKwkJLyogVGhlIG5vZGUgY2FuIGJlIHRpZWQgdG8gdGhlIGxpZmV0aW1lIG9mIHRoZSBkZXZp Y2UuICovCisJCWRldi0+Zndub2RlID0gZndub2RlX2hhbmRsZV9nZXQoZGV2LT5md25vZGUpOwor CX0KKworCXB1dF9kZXZpY2UoZGV2KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBj aHRfaW50MzNmZV9yZW1vdmVfbm9kZXMoc3RydWN0IGNodF9pbnQzM2ZlX2RhdGEgKmRhdGEpCiB7 CiAJaW50IGk7CkBAIC0xNTQsNiArMjMwLDEyIEBAIHN0YXRpYyB2b2lkIGNodF9pbnQzM2ZlX3Jl bW92ZV9ub2RlcyhzdHJ1Y3QgY2h0X2ludDMzZmVfZGF0YSAqZGF0YSkKIAkJZndub2RlX3JlbW92 ZV9zb2Z0d2FyZV9ub2RlKGRhdGEtPm5vZGVbaV0pOwogCQlkYXRhLT5ub2RlW2ldID0gTlVMTDsK IAl9CisKKwlpZiAoZGF0YS0+ZHApIHsKKwkJZGF0YS0+ZHAtPnNlY29uZGFyeSA9IE5VTEw7CisJ CWZ3bm9kZV9oYW5kbGVfcHV0KGRhdGEtPmRwKTsKKwkJZGF0YS0+ZHAgPSBOVUxMOworCX0KIH0K IAogc3RhdGljIGludCBjaHRfaW50MzNmZV9hZGRfbm9kZXMoc3RydWN0IGNodF9pbnQzM2ZlX2Rh dGEgKmRhdGEpCkBAIC0xODAsNiArMjYyLDI2IEBAIHN0YXRpYyBpbnQgY2h0X2ludDMzZmVfYWRk X25vZGVzKHN0cnVjdCBjaHRfaW50MzNmZV9kYXRhICpkYXRhKQogCX0KIAlkYXRhLT5ub2RlW0lO VDMzRkVfTk9ERV9VU0JfQ09OTkVDVE9SXSA9IGZ3bm9kZTsKIAorCS8qIFRoZSBkZXZpY2VzIHRo YXQgYXJlIG5vdCBjcmVhdGVkIGluIHRoaXMgZHJpdmVyIG5lZWQgZXh0cmEgc3RlcHMuICovCisK KwkvKgorCSAqIFRoZXJlIGlzIG5vIEFDUEkgZGV2aWNlIG5vZGUgZm9yIHRoZSBVU0Igcm9sZSBt dXgsIHNvIHdlIG5lZWQgdG8gZmluZAorCSAqIHRoZSBtdXggZGV2aWNlIGFuZCBhc3NpZ24gb3Vy IG5vZGUgZGlyZWN0bHkgdG8gaXQuIFRoYXQgbWVhbnMgd2UKKwkgKiBkZXBlbmQgb24gdGhlIG11 eCBkcml2ZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLVBST0JFX0RFRkVSCisJICogdW50 aWwgdGhlIG11eCBkZXZpY2UgaXMgcmVnaXN0ZXJlZC4KKwkgKi8KKwlyZXQgPSBjaHRfaW50MzNm ZV9zZXR1cF9tdXgoZGF0YSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmVtb3ZlX25vZGVzOwor CisJLyoKKwkgKiBUaGUgRFAgY29ubmVjdG9yIGRvZXMgaGF2ZSBBQ1BJIGRldmljZSBub2RlLiBJ biB0aGlzIGNhc2Ugd2UgY2FuIGp1c3QKKwkgKiBmaW5kIHRoYXQgQUNQSSBub2RlIGFuZCBhc3Np bmcgb3VyIG5vZGUgYXMgdGhlIHNlY29uZGFyeSBub2RlIHRvIGl0LgorCSAqLworCXJldCA9IGNo dF9pbnQzM2ZlX3NldHVwX2RwKGRhdGEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JlbW92ZV9u b2RlczsKKwogCXJldHVybiAwOwogCiBlcnJfcmVtb3ZlX25vZGVzOgo=