From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758287AbcLSJiI (ORCPT ); Mon, 19 Dec 2016 04:38:08 -0500 Received: from mail-sn1nam02on0055.outbound.protection.outlook.com ([104.47.36.55]:40784 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755054AbcLSJiB (ORCPT ); Mon, 19 Dec 2016 04:38:01 -0500 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none; From: Changming Huang To: , , , , , CC: , , , , Changming Huang , Rajesh Bhagat Subject: [PATCH v3 3/3] USB3/DWC3: Enable undefined length INCR burst type Date: Mon, 19 Dec 2016 17:25:54 +0800 Message-ID: <1482139554-13618-3-git-send-email-jerry.huang@nxp.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1482139554-13618-1-git-send-email-jerry.huang@nxp.com> References: <1482139554-13618-1-git-send-email-jerry.huang@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131266138727755771;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(336005)(39400400002)(39380400002)(39450400003)(39860400002)(39410400002)(39840400002)(39850400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(189998001)(92566002)(36756003)(5003940100001)(47776003)(85426001)(49486002)(50466002)(48376002)(38730400001)(2201001)(86362001)(106466001)(77096006)(33646002)(5001770100001)(105606002)(97736004)(68736007)(5660300001)(8676002)(305945005)(7416002)(2906002)(626004)(8936002)(6666003)(50226002)(356003)(8666005)(81166006)(104016004)(50986999)(4326007)(76176999)(2950100002)(81156014)(4720700003)(7059030);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR03MB2477;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11OLC009;1:azlr9EbDZY1BC7X8RyaWBZlQgWcfhZljanyJK/qD3SkESOto7oThyrKV/fLYR8aI6R0GyC70TAYf3WuJpNLyEdF6X17Bz6b5IEGAtphfjoQu1xSIPU4Z87l3sRHjENm0+8950nnFrIpBTBsDmH6L4i7r6NEeazW/tF9XiYfNpOPBGFuutASGTLPs9+kN22PZVe4SgUQ3qDwVEHWt+zryt4vri4xGAwkvZri3iwu802QKk0pdEBJzIdxpuDLHYgT2C/itozG255cpmeMkY8CL0VIyVG2G92eDTcNDY3xzospoLGLrBliro/x+19rzdWvHq1876Hf8pE2LOX89D8f1EKJKeObsQSvNLqeKLL6a7Nb6PO2rAmAWiEnsAVdF2JLZGrJG9Kvg37PiJOP2u7yQyf5N5GOabhmBJjL83I+sS0sHWOXil0g/Hsr0wz3I3Vv9hMUxxc8eJ8rPomBC8eFqMd6AtAybeO7KQoCPtHnGCdIaYM2XIUIFWuj8AI25W+vMjBYPK12z/3Oieos28Ivl65EQ342ijsefmuoALkVe2YLJVOzKVkawCedlGIGa7K4YgwddTssSf0I8EXwkQZqyiiH9/k+nB87Abf8ZsZx8aGTCmaM59dc7ZmxN1kG2xW0QPu6HLIVr3t02mBhqhm5un+Uddr5kyzCd/oV+NYdS2KMeqn3BKfxI23Pmoe7fw5Ta2fjYRxKM0MvqY4hHzxd2uWnEB9RgszAa+RnP1ghr6DVMEqDmXlLbVPyNpclTDGrg MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: bd2b1c5b-6604-4124-a50b-08d427f2b44b X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:MWHPR03MB2477; X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2477;3:8n2yg8+4sy05RY6Zg75QGWGRkUqOnrxHRyc1zHN30NRMltB3kZRobT0assc+5iXqsZf1aqi1C0rMFIuI9JpautQ24QngSHcPDjMtUd+e6FQRi9jf9k+gHOVEST1x6/XMAovjlxU1J4rvYQeIxKj3sK2TeyjPeo3FcgCiHXAq8wKxyDVTW+UrpjxumvLxvF7M2bfLpY2iaVj+QsccuzfQB+WptveevjR1v5l3qGRDsrpD5oifulF5VAbx0/ZBr3JEcflw/aF85I6NfOJvL1KYutHN+g1IXV6mJbcS+4tprTNVZU6tJYZsnRwXyWMcEZG3SEO6xKCyJQNCzO2kiV+JGM6ZmQcjBe9hZb7LtaIfczJyq9nSTLZ/Ql+CImQr6uQz;25:yiuLxxBUPL+zGm0PuMv6im38LOCJiE7m0TE+gv6D5s0ZqRqdziHWtWObzMkxrEp7OCgDgcr2rEjG0uC1v4JIuXRwQPA69y4Me6f61hIVq9wqE+g88zLzn6+EX2aZLHrc20ZwVbOumCUVLtoLw4jpaEtic4I8C+Gzf8zf06P3YYdhSt2xDjbt8kLH+XhVOvcEausMUjzcVnwMabT0+BM/+dFrGZGq61755WsdRrSwrDuTwoiLqAWAlS9/8Q32zDrEvVTyn5xoDQE0hAEqtsU65U0udgOnHBfSg+vJBhtP4ISfdspFQOPFLnauVpKJVMMukRBixcz1CpfVBnbAVWbvVEBD+TbbDHOkP6qmf2moTG4bPfunqJL6a2sqRcRsz7Za4qdcUzqb4wZIXTfI82jhc3M700eWQ+3rIpWMF24dptkLIjua9HSpmNMjdj8FAMQwb2Rb1Qh4OooWAdJcuDF/tQ== X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2477;31:aQQTTm4/pPHYEFGkQlxiTh7B0JVrO8r21kAul6chx6VKX+DjHatxKCc5C0Wi5Xbj3giISwCR0bUNOdSMU1pVpiSJhEMpGgSnNswlblpyxn4w+OoXACr4m1ajo7taHOAC4bz3ah8HF41n4pEnipuBuVU3WWek0lOnlvtKsNkS5ZUG0hmAF1yaeS2Nqj3BJDguM9D5Oe0lbjWuGwIpqqL30/pGCKHS1vxHWbLPKs9NK/43/+4g2xvjAu4oJOevH7SncmptKtRRx1UbPQEBIcGPLgCpva0H1ord9k/jHmLrEpibqTu+pFkze9vsBQviZWcu X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6095060)(601004)(2401047)(8121501046)(13018025)(13015025)(13024025)(5005006)(13023025)(13017025)(3002001)(10201501046)(6055026)(6096035)(20161123565025)(20161123563025)(20161123559025)(20161123561025)(20161123556025);SRVR:MWHPR03MB2477;BCL:0;PCL:0;RULEID:(400006);SRVR:MWHPR03MB2477; X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2477;4:h5sxCfvwOUY9vuRbCkmmkxhb8s3keDiMARh7IYOUQtX717RBShDsy06uUlqfLD2TCPqx14Z0PZQPCbJPO71t3bn8UHtWdrCRDh7hvZ9D5fIWUpQdtW/JHsM+Imk4xyJmyqReLx2Ij60V8jscCQYzFinha63RrdBIfOEj0Fa9QC1K8pPTuwn79d5BJ5HT/8EAFxbkeBIgXlQn1U3AgirleMRUNlRr9z0R/9KEG9dWW5x/kLOAX9Un0NpBL0DYkq86+6bWCaxBAW80EOo4iH7IOAhiQl5myruiOyRGvSHTbfVxZ4odffX5HMcPrmTm6MpDup4wIwR7JPTUWkjA7vO4pNQ22D8O1FsN56M32dGID+HD0eipimXwWBKz5AEN4obTFg3Q61L8V/r1+WPpebm3TixB71oawBdaBi2cadA1HwEljCIK/ZBzDO1PpXhvZ5YZuvVSyoO8tSgjEzQzw7YOX05Hc2KDsC+pMMrFAhINC2m/hpdZx7IZLeg/he1VfxYzPEbE+bh9zPwHgYw7DJYCmpaTzJkcLmtBbV4sJE7Wn/wR2kfsUqD9+QEWmA7qhZ+0jye6HRI9xHY9VyKmbDp0bypAZjmai6MkDr0lJLUC+RAue1aOixFeQBY2f8WYDLG5++y8rXohVJ/p9bMbmCvzAN2/pa0+nEVAWf1tRXHu1WERE8IRh6XGXrgBNEpya3aCc2tOFAKLMLvRLAPdQVF7Vbb7+I9NImlh+mS5PtUxCMiq02AtSEgrrkyIVfH2XdQ5 X-Forefront-PRVS: 01613DFDC8 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR03MB2477;23:CU7AAPhWNfBOx+KeSmjDBU0EoyIB67X5CikYSD9YW?= =?us-ascii?Q?TSdlpeyM711SEAprOOMRFLXz4aq3CpkOiGqEvQNYJ5whplLua66N7HMbqagR?= =?us-ascii?Q?KuuYsdP3w2OiVqbGGsjsysjM/F00m0fG6Xzx0QNykCTdLJE99DzNPVxEngIS?= =?us-ascii?Q?ZlOc7RewSf4yHSm/fnAn1aBEp+3uMHoyV4FaNmets2+kx5XbFphBHHBQq8JU?= =?us-ascii?Q?xCXyjAnvdDldzOyc28pjgG8sUa5Enz13qFm8K7k51mlVfslP8+E5YX3QCP6+?= =?us-ascii?Q?EQ1dYJfxGUCGmYy0ytx0edKrRZGFEhcxLVGUD6EOB3Qw09Phj9VAzoWm2GFu?= =?us-ascii?Q?vkkRsTJhiSyoOR0XzPtlOYS1dvCbM6Vfh9Dn9g3lDt3hgk6hZlgi9s9ifaqf?= =?us-ascii?Q?FTNPraoRs4aMwHTxmwCYIUPDA15gkRXS8WvV19ySrJLC8OxIdgbl1uMmGe0E?= =?us-ascii?Q?aaJlfY0PU1SkEn7Or6t3SWYk6QooaL1pDrs7QEy/5P4F/kFe0ffL7V6Ti6ss?= =?us-ascii?Q?UPb94HijUVgRT/sU666JeRGd4w8fOjh6AJRHbCEndejZeiISUlVvAxc/JBeV?= =?us-ascii?Q?D+SGce4ZD69v+RFbvsKH1DlEkt/U1EMAvyIxSj41NUZHw8dsmpZHZ21dpxYB?= =?us-ascii?Q?tACt/Di5TZpFMToFT5adxL3tL7xpUFiwQ5pCRPgNVHRQuoOJHpqKXhZTKadu?= =?us-ascii?Q?vOwUh8S1liuH0PBRlYK44u3a0axrr6EgvFHAFkvJvzYMfUOYXqfTbK5m/dpY?= =?us-ascii?Q?fpzPnDXYEGPiSKurSjLGtkualU5LNKXmB1UGyR8Jvi+ALPtW2AL2IfEqd3zb?= =?us-ascii?Q?2GkiBMb+R4xbcn8vjKfkWycF6ZfeFpaEtoGYGE17WqtqwXlxlRzWYvBxoraI?= =?us-ascii?Q?OZHgFD2BeLe1fFJZxyiTfpLT1Iuo+Y8ZY1LCdD74AZfLthLiQzyoQI6v1f73?= =?us-ascii?Q?AqNBbqsebI6vCMRgrqVEIlBnLVLyYeiAELOvYgjiU3IQswxu8VZReIoXXn9y?= =?us-ascii?Q?Ja8suhkBv/p5NGzTtTDDdH7QgmU+u7ydH2CtfgMhkJ+z8tBXfhobJmKkz2WK?= =?us-ascii?Q?s/rqYsGNwbRKUIqglG9cu+YKjrtn5VYAukQn6DHs2wjWja7zKjDWeW1x3vrh?= =?us-ascii?Q?p6TBuFYKfQT/cdy20OrlMVVmvA4ItjS0D642rWvtHAAZggvKjcGGFWK55bAR?= =?us-ascii?Q?lUTDZzEZc6ORyQcWi5ix49JKmUqtvyyu+qj8yZ2clLeft0nEC8DM6Hlham4H?= =?us-ascii?Q?tbtEzLmP5hsuFD4aN+hO4y1btK60suxCoZBQC6AuALIxixD9E/gOiPHqTMpU?= =?us-ascii?Q?kHAWNm2PAaJIJH+TqDSRNyhXO7CoCmINFMibvarkrds?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2477;6:0RbH19xXJIBosTb5eCEZaKqg+Ame9/D7us9cLV15zu+q30hPgXR20rgSlEaFXjgdPP3amqHLYnuXFpKaCNe5EdK30nEGV0y7JyEcJb1FzTo0SnxoB73QrZhLy5A8bnG+oLHWLXnUKAKzuRoqTlnsTOqTxk1Sthoz9MeujqrXqftbfc/oeegA1SmGrAZZ7sRwvrZCvoUkUKJmWNUB4nLrBk/pOmsM45Dwy4aYYOzZLFfVrqVWIP14m35DnFTAbmcEeYZEaIbxpe4wtfT4UJGic7Dq2qHdi9bweIdE1XNJKyMMfRCFI38hk+KAjW36Kg4NH5vH035BI1r0WK9ICv5GBDsE62aWWS+bWoJ8SnIyGCUXW1B/RSn4NJXahS+RC069vBLUy3LkTbVtTq/zKlDA2QRks26MaA2JqZR55TfMxQg+WTVewN/TxIdWKVM4TLrG;5:O00DBniwu5ghN9W1HvAYW9mBWFZc8lFDLkb8x3Jr/gpK0UetdvhSieTGeohYAkjUGnWafWOj357ZacfAtwmhbCsg6bcDlt1/fdhI/9M7N7q9CFqPBN1LJH4LTjMOeYwY8r7i+eD1RuHP1A/ZSZQS+Rg8Op34zIMRqUX8Jz7/drChKCfhTsRUBbnbLAEULaDU;24:WiKq/+QxyrJ0Xt2DaJ5ppynd6ER5M9SzG+qeWv8CGMPrsAuQiiyvKSigdEesufvEstlKBQS3WZ+vGyc5OrReUwKWoTD/tSRZVWi2VNfPFQM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2477;7:YVV4p+ksjgYRsHfawX3tYBdX8NWLUxcratESwePuQew/vZedlY1k5cSgWyQO8eHFA30AdF2oH/wgI8Ojh5bXom1RNu7tEHO1S9i+6lQRynD+A/fG5wwpk4j0NeRI+yb2h4kGj0iIICpnBZDd9hFrjVnRHpj40SyNmTmyllicWnSY1TWPj6oeCW1iHE2p4IFVa8iffvpYk3RxjET9jrmcS5hwN6FQB186gHZOYu/1uHTF9JUJdNhYbyyBmyg44wsJZ5m7UZd+lmaXV8JhQZuUEJh5NQNmBYCc+JmERvE7j1Bb/NLOtvcNOzu6GQsptL4UyBAq9Mq78u8bcL8YWS6BxRjtqfJ/YtuUkTONRAmw00OiR+pU1FAen5VbXzFmjBJE6O7ohf8gSHG1D0VQe05iIwslk9St4+yEm9Nd+5Z4LF0ANf3ZZXLlUJD0QF7pX1hoCF1OVuafP9KyAUJKrys/qQ== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Dec 2016 09:37:52.4635 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR03MB2477 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Enable the undefined length INCR burst type and set INCRx. Different platform may has the different burst size type. In order to get best performance, we need to tune the burst size to one special value, instead of the default value. Signed-off-by: Changming Huang Signed-off-by: Rajesh Bhagat --- Changes in v3: - add new property for INCR burst in usb node to reset GSBUSCFG0. Changes in v2: - split patch - create one new function to handle soc bus configuration register. drivers/usb/dwc3/core.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ drivers/usb/dwc3/core.h | 7 +++++++ 2 files changed, 58 insertions(+) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 369bab1..404d7e9 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -650,6 +650,55 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc) dwc3_writel(dwc->regs, DWC3_GCTL, reg); } +/* set global soc bus configuration registers */ +static void dwc3_set_soc_bus_cfg(struct dwc3 *dwc) +{ + struct device *dev = dwc->dev; + u32 cfg; + int ret; + + cfg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG0); + + /* Get INCR burst type, if return !NULL, not to change this type */ + ret = device_property_read_u32_array(dev, + "snps,incr-burst-type-adjustment", + dwc->incr_burst_type, 2); + if (!ret) { + /* Enable Undefined Length INCR Burst and Enable INCRx Burst */ + cfg &= ~DWC3_GSBUSCFG0_INCRBRST_MASK; + if (*dwc->incr_burst_type) + cfg |= DWC3_GSBUSCFG0_INCRBRSTENA; + switch (*(dwc->incr_burst_type + 1)) { + case 256: + cfg |= DWC3_GSBUSCFG0_INCR256BRSTENA; + break; + case 128: + cfg |= DWC3_GSBUSCFG0_INCR128BRSTENA; + break; + case 64: + cfg |= DWC3_GSBUSCFG0_INCR64BRSTENA; + break; + case 32: + cfg |= DWC3_GSBUSCFG0_INCR32BRSTENA; + break; + case 16: + cfg |= DWC3_GSBUSCFG0_INCR16BRSTENA; + break; + case 8: + cfg |= DWC3_GSBUSCFG0_INCR8BRSTENA; + break; + case 4: + cfg |= DWC3_GSBUSCFG0_INCR4BRSTENA; + break; + default: + dev_err(dev, "Invalid property\n"); + break; + } + } + + dwc3_writel(dwc->regs, DWC3_GSBUSCFG0, cfg); +} + /** * dwc3_core_init - Low-level initialization of DWC3 Core * @dwc: Pointer to our controller context structure @@ -698,6 +747,8 @@ static int dwc3_core_init(struct dwc3 *dwc) /* Adjust Frame Length */ dwc3_frame_length_adjustment(dwc); + dwc3_set_soc_bus_cfg(dwc); + usb_phy_set_suspend(dwc->usb2_phy, 0); usb_phy_set_suspend(dwc->usb3_phy, 0); ret = phy_power_on(dwc->usb2_generic_phy); diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 065aa6f..cfe389b 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -805,6 +805,7 @@ struct dwc3_scratchpad_array { * @regs: base address for our registers * @regs_size: address space size * @fladj: frame length adjustment + * @incr_burst_type: INCR burst type adjustment * @irq_gadget: peripheral controller's IRQ number * @nr_scratch: number of scratch buffers * @u1u2: only used on revisions <1.83a for workaround @@ -928,6 +929,12 @@ struct dwc3 { enum usb_phy_interface hsphy_mode; u32 fladj; + /* + * For INCR burst type. + * First field: for undefined length INCR burst type enable. + * Second field: for INCRx burst type enable + */ + u32 incr_burst_type[2]; u32 irq_gadget; u32 nr_scratch; u32 u1u2; -- 1.7.9.5 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Changming Huang Subject: [PATCH v3 3/3] USB3/DWC3: Enable undefined length INCR burst type Date: Mon, 19 Dec 2016 17:25:54 +0800 Message-ID: <1482139554-13618-3-git-send-email-jerry.huang@nxp.com> References: <1482139554-13618-1-git-send-email-jerry.huang@nxp.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <1482139554-13618-1-git-send-email-jerry.huang@nxp.com> Sender: linux-kernel-owner@vger.kernel.org To: balbi@kernel.org, mark.rutland@arm.com, catalin.marinas@arm.com, will.deacon@arm.com, robh+dt@kernel.org, linux@armlinux.org.uk Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Changming Huang , Rajesh Bhagat List-Id: devicetree@vger.kernel.org Enable the undefined length INCR burst type and set INCRx. Different platform may has the different burst size type. In order to get best performance, we need to tune the burst size to one special value, instead of the default value. Signed-off-by: Changming Huang Signed-off-by: Rajesh Bhagat --- Changes in v3: - add new property for INCR burst in usb node to reset GSBUSCFG0. Changes in v2: - split patch - create one new function to handle soc bus configuration register. drivers/usb/dwc3/core.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ drivers/usb/dwc3/core.h | 7 +++++++ 2 files changed, 58 insertions(+) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 369bab1..404d7e9 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -650,6 +650,55 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc) dwc3_writel(dwc->regs, DWC3_GCTL, reg); } +/* set global soc bus configuration registers */ +static void dwc3_set_soc_bus_cfg(struct dwc3 *dwc) +{ + struct device *dev = dwc->dev; + u32 cfg; + int ret; + + cfg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG0); + + /* Get INCR burst type, if return !NULL, not to change this type */ + ret = device_property_read_u32_array(dev, + "snps,incr-burst-type-adjustment", + dwc->incr_burst_type, 2); + if (!ret) { + /* Enable Undefined Length INCR Burst and Enable INCRx Burst */ + cfg &= ~DWC3_GSBUSCFG0_INCRBRST_MASK; + if (*dwc->incr_burst_type) + cfg |= DWC3_GSBUSCFG0_INCRBRSTENA; + switch (*(dwc->incr_burst_type + 1)) { + case 256: + cfg |= DWC3_GSBUSCFG0_INCR256BRSTENA; + break; + case 128: + cfg |= DWC3_GSBUSCFG0_INCR128BRSTENA; + break; + case 64: + cfg |= DWC3_GSBUSCFG0_INCR64BRSTENA; + break; + case 32: + cfg |= DWC3_GSBUSCFG0_INCR32BRSTENA; + break; + case 16: + cfg |= DWC3_GSBUSCFG0_INCR16BRSTENA; + break; + case 8: + cfg |= DWC3_GSBUSCFG0_INCR8BRSTENA; + break; + case 4: + cfg |= DWC3_GSBUSCFG0_INCR4BRSTENA; + break; + default: + dev_err(dev, "Invalid property\n"); + break; + } + } + + dwc3_writel(dwc->regs, DWC3_GSBUSCFG0, cfg); +} + /** * dwc3_core_init - Low-level initialization of DWC3 Core * @dwc: Pointer to our controller context structure @@ -698,6 +747,8 @@ static int dwc3_core_init(struct dwc3 *dwc) /* Adjust Frame Length */ dwc3_frame_length_adjustment(dwc); + dwc3_set_soc_bus_cfg(dwc); + usb_phy_set_suspend(dwc->usb2_phy, 0); usb_phy_set_suspend(dwc->usb3_phy, 0); ret = phy_power_on(dwc->usb2_generic_phy); diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 065aa6f..cfe389b 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -805,6 +805,7 @@ struct dwc3_scratchpad_array { * @regs: base address for our registers * @regs_size: address space size * @fladj: frame length adjustment + * @incr_burst_type: INCR burst type adjustment * @irq_gadget: peripheral controller's IRQ number * @nr_scratch: number of scratch buffers * @u1u2: only used on revisions <1.83a for workaround @@ -928,6 +929,12 @@ struct dwc3 { enum usb_phy_interface hsphy_mode; u32 fladj; + /* + * For INCR burst type. + * First field: for undefined length INCR burst type enable. + * Second field: for INCRx burst type enable + */ + u32 incr_burst_type[2]; u32 irq_gadget; u32 nr_scratch; u32 u1u2; -- 1.7.9.5 From mboxrd@z Thu Jan 1 00:00:00 1970 From: jerry.huang@nxp.com (Changming Huang) Date: Mon, 19 Dec 2016 17:25:54 +0800 Subject: [PATCH v3 3/3] USB3/DWC3: Enable undefined length INCR burst type In-Reply-To: <1482139554-13618-1-git-send-email-jerry.huang@nxp.com> References: <1482139554-13618-1-git-send-email-jerry.huang@nxp.com> Message-ID: <1482139554-13618-3-git-send-email-jerry.huang@nxp.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Enable the undefined length INCR burst type and set INCRx. Different platform may has the different burst size type. In order to get best performance, we need to tune the burst size to one special value, instead of the default value. Signed-off-by: Changming Huang Signed-off-by: Rajesh Bhagat --- Changes in v3: - add new property for INCR burst in usb node to reset GSBUSCFG0. Changes in v2: - split patch - create one new function to handle soc bus configuration register. drivers/usb/dwc3/core.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ drivers/usb/dwc3/core.h | 7 +++++++ 2 files changed, 58 insertions(+) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 369bab1..404d7e9 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -650,6 +650,55 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc) dwc3_writel(dwc->regs, DWC3_GCTL, reg); } +/* set global soc bus configuration registers */ +static void dwc3_set_soc_bus_cfg(struct dwc3 *dwc) +{ + struct device *dev = dwc->dev; + u32 cfg; + int ret; + + cfg = dwc3_readl(dwc->regs, DWC3_GSBUSCFG0); + + /* Get INCR burst type, if return !NULL, not to change this type */ + ret = device_property_read_u32_array(dev, + "snps,incr-burst-type-adjustment", + dwc->incr_burst_type, 2); + if (!ret) { + /* Enable Undefined Length INCR Burst and Enable INCRx Burst */ + cfg &= ~DWC3_GSBUSCFG0_INCRBRST_MASK; + if (*dwc->incr_burst_type) + cfg |= DWC3_GSBUSCFG0_INCRBRSTENA; + switch (*(dwc->incr_burst_type + 1)) { + case 256: + cfg |= DWC3_GSBUSCFG0_INCR256BRSTENA; + break; + case 128: + cfg |= DWC3_GSBUSCFG0_INCR128BRSTENA; + break; + case 64: + cfg |= DWC3_GSBUSCFG0_INCR64BRSTENA; + break; + case 32: + cfg |= DWC3_GSBUSCFG0_INCR32BRSTENA; + break; + case 16: + cfg |= DWC3_GSBUSCFG0_INCR16BRSTENA; + break; + case 8: + cfg |= DWC3_GSBUSCFG0_INCR8BRSTENA; + break; + case 4: + cfg |= DWC3_GSBUSCFG0_INCR4BRSTENA; + break; + default: + dev_err(dev, "Invalid property\n"); + break; + } + } + + dwc3_writel(dwc->regs, DWC3_GSBUSCFG0, cfg); +} + /** * dwc3_core_init - Low-level initialization of DWC3 Core * @dwc: Pointer to our controller context structure @@ -698,6 +747,8 @@ static int dwc3_core_init(struct dwc3 *dwc) /* Adjust Frame Length */ dwc3_frame_length_adjustment(dwc); + dwc3_set_soc_bus_cfg(dwc); + usb_phy_set_suspend(dwc->usb2_phy, 0); usb_phy_set_suspend(dwc->usb3_phy, 0); ret = phy_power_on(dwc->usb2_generic_phy); diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 065aa6f..cfe389b 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -805,6 +805,7 @@ struct dwc3_scratchpad_array { * @regs: base address for our registers * @regs_size: address space size * @fladj: frame length adjustment + * @incr_burst_type: INCR burst type adjustment * @irq_gadget: peripheral controller's IRQ number * @nr_scratch: number of scratch buffers * @u1u2: only used on revisions <1.83a for workaround @@ -928,6 +929,12 @@ struct dwc3 { enum usb_phy_interface hsphy_mode; u32 fladj; + /* + * For INCR burst type. + * First field: for undefined length INCR burst type enable. + * Second field: for INCRx burst type enable + */ + u32 incr_burst_type[2]; u32 irq_gadget; u32 nr_scratch; u32 u1u2; -- 1.7.9.5