From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thierry Reding Subject: [PATCH v2 2/6] usb: host: xhci-tegra: Selectively program IPFS Date: Mon, 1 Apr 2019 12:40:46 +0200 Message-ID: <20190401104050.31355-3-thierry.reding@gmail.com> References: <20190401104050.31355-1-thierry.reding@gmail.com> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <20190401104050.31355-1-thierry.reding@gmail.com> Sender: linux-kernel-owner@vger.kernel.org To: Greg Kroah-Hartman , Thierry Reding Cc: Jon Hunter , linux-usb@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, Mathias Nyman List-Id: linux-tegra@vger.kernel.org From: JC Kuo Starting with Tegra186, the XUSB controller no longer has the IPFS wrapper. This commit adds a "has_ipfs" field to struct tegra_xusb_soc that can be used to declare the existence of the IPFS wrapper. For the existing chips (i.e. Tegra124 and Tegra210), the new field is set to true. A future patch adding support for Tegra186 will set it to false. Signed-off-by: JC Kuo Acked-by: Mathias Nyman Signed-off-by: Thierry Reding --- drivers/usb/host/xhci-tegra.c | 43 +++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c index efb0cad8710e..4d133bbabdda 100644 --- a/drivers/usb/host/xhci-tegra.c +++ b/drivers/usb/host/xhci-tegra.c @@ -161,6 +161,7 @@ struct tegra_xusb_soc { } ports; bool scale_ss_clock; + bool has_ipfs; }; struct tegra_xusb { @@ -637,16 +638,18 @@ static irqreturn_t tegra_xusb_mbox_thread(int irq, void *data) return IRQ_HANDLED; } -static void tegra_xusb_ipfs_config(struct tegra_xusb *tegra, - struct resource *regs) +static void tegra_xusb_config(struct tegra_xusb *tegra, + struct resource *regs) { u32 value; - value = ipfs_readl(tegra, IPFS_XUSB_HOST_CONFIGURATION_0); - value |= IPFS_EN_FPCI; - ipfs_writel(tegra, value, IPFS_XUSB_HOST_CONFIGURATION_0); + if (tegra->soc->has_ipfs) { + value = ipfs_readl(tegra, IPFS_XUSB_HOST_CONFIGURATION_0); + value |= IPFS_EN_FPCI; + ipfs_writel(tegra, value, IPFS_XUSB_HOST_CONFIGURATION_0); - usleep_range(10, 20); + usleep_range(10, 20); + } /* Program BAR0 space */ value = fpci_readl(tegra, XUSB_CFG_4); @@ -661,13 +664,15 @@ static void tegra_xusb_ipfs_config(struct tegra_xusb *tegra, value |= XUSB_IO_SPACE_EN | XUSB_MEM_SPACE_EN | XUSB_BUS_MASTER_EN; fpci_writel(tegra, value, XUSB_CFG_1); - /* Enable interrupt assertion */ - value = ipfs_readl(tegra, IPFS_XUSB_HOST_INTR_MASK_0); - value |= IPFS_IP_INT_MASK; - ipfs_writel(tegra, value, IPFS_XUSB_HOST_INTR_MASK_0); + if (tegra->soc->has_ipfs) { + /* Enable interrupt assertion */ + value = ipfs_readl(tegra, IPFS_XUSB_HOST_INTR_MASK_0); + value |= IPFS_IP_INT_MASK; + ipfs_writel(tegra, value, IPFS_XUSB_HOST_INTR_MASK_0); - /* Set hysteresis */ - ipfs_writel(tegra, 0x80, IPFS_XUSB_HOST_CLKGATE_HYSTERESIS_0); + /* Set hysteresis */ + ipfs_writel(tegra, 0x80, IPFS_XUSB_HOST_CLKGATE_HYSTERESIS_0); + } } static int tegra_xusb_clk_enable(struct tegra_xusb *tegra) @@ -1015,10 +1020,12 @@ static int tegra_xusb_probe(struct platform_device *pdev) if (IS_ERR(tegra->fpci_base)) return PTR_ERR(tegra->fpci_base); - res = platform_get_resource(pdev, IORESOURCE_MEM, 2); - tegra->ipfs_base = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(tegra->ipfs_base)) - return PTR_ERR(tegra->ipfs_base); + if (tegra->soc->has_ipfs) { + res = platform_get_resource(pdev, IORESOURCE_MEM, 2); + tegra->ipfs_base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(tegra->ipfs_base)) + return PTR_ERR(tegra->ipfs_base); + } tegra->xhci_irq = platform_get_irq(pdev, 0); if (tegra->xhci_irq < 0) @@ -1208,7 +1215,7 @@ static int tegra_xusb_probe(struct platform_device *pdev) goto disable_rpm; } - tegra_xusb_ipfs_config(tegra, regs); + tegra_xusb_config(tegra, regs); err = tegra_xusb_load_firmware(tegra); if (err < 0) { @@ -1380,6 +1387,7 @@ static const struct tegra_xusb_soc tegra124_soc = { .usb3 = { .offset = 0, .count = 2, }, }, .scale_ss_clock = true, + .has_ipfs = true, }; MODULE_FIRMWARE("nvidia/tegra124/xusb.bin"); @@ -1411,6 +1419,7 @@ static const struct tegra_xusb_soc tegra210_soc = { .usb3 = { .offset = 0, .count = 4, }, }, .scale_ss_clock = false, + .has_ipfs = true, }; MODULE_FIRMWARE("nvidia/tegra210/xusb.bin"); -- 2.21.0 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: [v2,2/6] usb: host: xhci-tegra: Selectively program IPFS From: Thierry Reding Message-Id: <20190401104050.31355-3-thierry.reding@gmail.com> Date: Mon, 1 Apr 2019 12:40:46 +0200 To: Greg Kroah-Hartman , Thierry Reding Cc: Jon Hunter , linux-usb@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, Mathias Nyman List-ID: RnJvbTogSkMgS3VvIDxqY2t1b0BudmlkaWEuY29tPgoKU3RhcnRpbmcgd2l0aCBUZWdyYTE4Niwg dGhlIFhVU0IgY29udHJvbGxlciBubyBsb25nZXIgaGFzIHRoZSBJUEZTCndyYXBwZXIuIFRoaXMg Y29tbWl0IGFkZHMgYSAiaGFzX2lwZnMiIGZpZWxkIHRvIHN0cnVjdCB0ZWdyYV94dXNiX3NvYwp0 aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgSVBGUyB3cmFw cGVyLgoKRm9yIHRoZSBleGlzdGluZyBjaGlwcyAoaS5lLiBUZWdyYTEyNCBhbmQgVGVncmEyMTAp LCB0aGUgbmV3IGZpZWxkIGlzCnNldCB0byB0cnVlLiBBIGZ1dHVyZSBwYXRjaCBhZGRpbmcgc3Vw cG9ydCBmb3IgVGVncmExODYgd2lsbCBzZXQgaXQgdG8KZmFsc2UuCgpTaWduZWQtb2ZmLWJ5OiBK QyBLdW8gPGpja3VvQG52aWRpYS5jb20+CkFja2VkLWJ5OiBNYXRoaWFzIE55bWFuIDxtYXRoaWFz Lm55bWFuQGxpbnV4LmludGVsLmNvbT4KU2lnbmVkLW9mZi1ieTogVGhpZXJyeSBSZWRpbmcgPHRy ZWRpbmdAbnZpZGlhLmNvbT4KLS0tCiBkcml2ZXJzL3VzYi9ob3N0L3hoY2ktdGVncmEuYyB8IDQz ICsrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMjYg aW5zZXJ0aW9ucygrKSwgMTcgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Iv aG9zdC94aGNpLXRlZ3JhLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktdGVncmEuYwppbmRleCBl ZmIwY2FkODcxMGUuLjRkMTMzYmJhYmRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94 aGNpLXRlZ3JhLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXRlZ3JhLmMKQEAgLTE2MSw2 ICsxNjEsNyBAQCBzdHJ1Y3QgdGVncmFfeHVzYl9zb2MgewogCX0gcG9ydHM7CiAKIAlib29sIHNj YWxlX3NzX2Nsb2NrOworCWJvb2wgaGFzX2lwZnM7CiB9OwogCiBzdHJ1Y3QgdGVncmFfeHVzYiB7 CkBAIC02MzcsMTYgKzYzOCwxOCBAQCBzdGF0aWMgaXJxcmV0dXJuX3QgdGVncmFfeHVzYl9tYm94 X3RocmVhZChpbnQgaXJxLCB2b2lkICpkYXRhKQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAot c3RhdGljIHZvaWQgdGVncmFfeHVzYl9pcGZzX2NvbmZpZyhzdHJ1Y3QgdGVncmFfeHVzYiAqdGVn cmEsCi0JCQkJICAgc3RydWN0IHJlc291cmNlICpyZWdzKQorc3RhdGljIHZvaWQgdGVncmFfeHVz Yl9jb25maWcoc3RydWN0IHRlZ3JhX3h1c2IgKnRlZ3JhLAorCQkJICAgICAgc3RydWN0IHJlc291 cmNlICpyZWdzKQogewogCXUzMiB2YWx1ZTsKIAotCXZhbHVlID0gaXBmc19yZWFkbCh0ZWdyYSwg SVBGU19YVVNCX0hPU1RfQ09ORklHVVJBVElPTl8wKTsKLQl2YWx1ZSB8PSBJUEZTX0VOX0ZQQ0k7 Ci0JaXBmc193cml0ZWwodGVncmEsIHZhbHVlLCBJUEZTX1hVU0JfSE9TVF9DT05GSUdVUkFUSU9O XzApOworCWlmICh0ZWdyYS0+c29jLT5oYXNfaXBmcykgeworCQl2YWx1ZSA9IGlwZnNfcmVhZGwo dGVncmEsIElQRlNfWFVTQl9IT1NUX0NPTkZJR1VSQVRJT05fMCk7CisJCXZhbHVlIHw9IElQRlNf RU5fRlBDSTsKKwkJaXBmc193cml0ZWwodGVncmEsIHZhbHVlLCBJUEZTX1hVU0JfSE9TVF9DT05G SUdVUkFUSU9OXzApOwogCi0JdXNsZWVwX3JhbmdlKDEwLCAyMCk7CisJCXVzbGVlcF9yYW5nZSgx MCwgMjApOworCX0KIAogCS8qIFByb2dyYW0gQkFSMCBzcGFjZSAqLwogCXZhbHVlID0gZnBjaV9y ZWFkbCh0ZWdyYSwgWFVTQl9DRkdfNCk7CkBAIC02NjEsMTMgKzY2NCwxNSBAQCBzdGF0aWMgdm9p ZCB0ZWdyYV94dXNiX2lwZnNfY29uZmlnKHN0cnVjdCB0ZWdyYV94dXNiICp0ZWdyYSwKIAl2YWx1 ZSB8PSBYVVNCX0lPX1NQQUNFX0VOIHwgWFVTQl9NRU1fU1BBQ0VfRU4gfCBYVVNCX0JVU19NQVNU RVJfRU47CiAJZnBjaV93cml0ZWwodGVncmEsIHZhbHVlLCBYVVNCX0NGR18xKTsKIAotCS8qIEVu YWJsZSBpbnRlcnJ1cHQgYXNzZXJ0aW9uICovCi0JdmFsdWUgPSBpcGZzX3JlYWRsKHRlZ3JhLCBJ UEZTX1hVU0JfSE9TVF9JTlRSX01BU0tfMCk7Ci0JdmFsdWUgfD0gSVBGU19JUF9JTlRfTUFTSzsK LQlpcGZzX3dyaXRlbCh0ZWdyYSwgdmFsdWUsIElQRlNfWFVTQl9IT1NUX0lOVFJfTUFTS18wKTsK KwlpZiAodGVncmEtPnNvYy0+aGFzX2lwZnMpIHsKKwkJLyogRW5hYmxlIGludGVycnVwdCBhc3Nl cnRpb24gKi8KKwkJdmFsdWUgPSBpcGZzX3JlYWRsKHRlZ3JhLCBJUEZTX1hVU0JfSE9TVF9JTlRS X01BU0tfMCk7CisJCXZhbHVlIHw9IElQRlNfSVBfSU5UX01BU0s7CisJCWlwZnNfd3JpdGVsKHRl Z3JhLCB2YWx1ZSwgSVBGU19YVVNCX0hPU1RfSU5UUl9NQVNLXzApOwogCi0JLyogU2V0IGh5c3Rl cmVzaXMgKi8KLQlpcGZzX3dyaXRlbCh0ZWdyYSwgMHg4MCwgSVBGU19YVVNCX0hPU1RfQ0xLR0FU RV9IWVNURVJFU0lTXzApOworCQkvKiBTZXQgaHlzdGVyZXNpcyAqLworCQlpcGZzX3dyaXRlbCh0 ZWdyYSwgMHg4MCwgSVBGU19YVVNCX0hPU1RfQ0xLR0FURV9IWVNURVJFU0lTXzApOworCX0KIH0K IAogc3RhdGljIGludCB0ZWdyYV94dXNiX2Nsa19lbmFibGUoc3RydWN0IHRlZ3JhX3h1c2IgKnRl Z3JhKQpAQCAtMTAxNSwxMCArMTAyMCwxMiBAQCBzdGF0aWMgaW50IHRlZ3JhX3h1c2JfcHJvYmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAlpZiAoSVNfRVJSKHRlZ3JhLT5mcGNpX2Jh c2UpKQogCQlyZXR1cm4gUFRSX0VSUih0ZWdyYS0+ZnBjaV9iYXNlKTsKIAotCXJlcyA9IHBsYXRm b3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7Ci0JdGVncmEtPmlwZnNf YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCWlmIChJU19F UlIodGVncmEtPmlwZnNfYmFzZSkpCi0JCXJldHVybiBQVFJfRVJSKHRlZ3JhLT5pcGZzX2Jhc2Up OworCWlmICh0ZWdyYS0+c29jLT5oYXNfaXBmcykgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVz b3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDIpOworCQl0ZWdyYS0+aXBmc19iYXNlID0gZGV2 bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJCWlmIChJU19FUlIodGVncmEt PmlwZnNfYmFzZSkpCisJCQlyZXR1cm4gUFRSX0VSUih0ZWdyYS0+aXBmc19iYXNlKTsKKwl9CiAK IAl0ZWdyYS0+eGhjaV9pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmICh0ZWdy YS0+eGhjaV9pcnEgPCAwKQpAQCAtMTIwOCw3ICsxMjE1LDcgQEAgc3RhdGljIGludCB0ZWdyYV94 dXNiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJCWdvdG8gZGlzYWJsZV9y cG07CiAJfQogCi0JdGVncmFfeHVzYl9pcGZzX2NvbmZpZyh0ZWdyYSwgcmVncyk7CisJdGVncmFf eHVzYl9jb25maWcodGVncmEsIHJlZ3MpOwogCiAJZXJyID0gdGVncmFfeHVzYl9sb2FkX2Zpcm13 YXJlKHRlZ3JhKTsKIAlpZiAoZXJyIDwgMCkgewpAQCAtMTM4MCw2ICsxMzg3LDcgQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCB0ZWdyYV94dXNiX3NvYyB0ZWdyYTEyNF9zb2MgPSB7CiAJCS51c2IzID0g eyAub2Zmc2V0ID0gMCwgLmNvdW50ID0gMiwgfSwKIAl9LAogCS5zY2FsZV9zc19jbG9jayA9IHRy dWUsCisJLmhhc19pcGZzID0gdHJ1ZSwKIH07CiBNT0RVTEVfRklSTVdBUkUoIm52aWRpYS90ZWdy YTEyNC94dXNiLmJpbiIpOwogCkBAIC0xNDExLDYgKzE0MTksNyBAQCBzdGF0aWMgY29uc3Qgc3Ry dWN0IHRlZ3JhX3h1c2Jfc29jIHRlZ3JhMjEwX3NvYyA9IHsKIAkJLnVzYjMgPSB7IC5vZmZzZXQg PSAwLCAuY291bnQgPSA0LCB9LAogCX0sCiAJLnNjYWxlX3NzX2Nsb2NrID0gZmFsc2UsCisJLmhh c19pcGZzID0gdHJ1ZSwKIH07CiBNT0RVTEVfRklSTVdBUkUoIm52aWRpYS90ZWdyYTIxMC94dXNi LmJpbiIpOwogCg==