From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753300AbdEIArS (ORCPT ); Mon, 8 May 2017 20:47:18 -0400 Received: from mail-dm3nam03on0079.outbound.protection.outlook.com ([104.47.41.79]:59373 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751597AbdEIArQ (ORCPT ); Mon, 8 May 2017 20:47:16 -0400 Authentication-Results: spf=softfail (sender IP is 192.88.158.2) smtp.mailfrom=gmail.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=fail action=none header.from=gmail.com; Date: Tue, 9 May 2017 08:47:09 +0800 From: Peter Chen To: Andrey Smirnov CC: Peter Chen , , Greg Kroah-Hartman , , Subject: Re: [PATCH] usb: chipidea: imx: Do not access CLKONOFF on i.MX51 Message-ID: <20170509004709.GB17969@b29397-desktop> References: <20170508141501.21887-1-andrew.smirnov@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20170508141501.21887-1-andrew.smirnov@gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-EOPAttributedMessage: 0 X-Matching-Connectors: 131387644344614751;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.158.2;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(336005)(39410400002)(39450400003)(39840400002)(39860400002)(39400400002)(39850400002)(39380400002)(2980300002)(199003)(24454002)(189002)(9170700003)(76482006)(82202002)(73392002)(97756001)(6636002)(5660300001)(23726003)(83322999)(1076002)(356003)(54356999)(106466001)(105596002)(2950100002)(305945005)(4001350100001)(87572001)(104016004)(6916009)(2906002)(76176999)(50986999)(97736004)(47776003)(189998001)(33716001)(83506001)(54906002)(46406003)(8676002)(8656002)(81156014)(55016002)(39060400002)(81166006)(498600001)(50466002)(33656002)(77096006)(229853002)(6260500002)(38730400002)(6246003)(8936002)(4326008)(73972006)(81442002)(110136004)(86362001)(9686003)(53936002)(18370500001);DIR:OUT;SFP:1101;SCL:1;SRVR:BN1PR03MB170;H:az84smr01.freescale.net;FPR:;SPF:SoftFail;MLV:ovrnspm;A:1;MX:1;PTR:InfoDomainNonexistent;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD026;1:d3JLZXPtHJLpVpIHzv4wl1tuaSOH+iT0MXRoA3JIhXQAkxi3x9/HVEAfEa3b3XdE5FitrwbD8r09ooeoCpr4/7FqshOaPHHB/RTUTgMI8901GHP3sSzsLTLON8D4tMAUUcFWbO1zFpZ8nuAFsXIhEMQUmcelatuMvr7drxX/FAibgkU46CpnGgkgUt8UFUxbJZ6B6zDc5csK0UR3qN7v4MfwWgGono5MQsdUU6mw+oIReHlQaAPERSX+QtXpTLtOwApwzoy+PEh1Fiz57hR0J5woDSDkcJtKSQBkG88QOhMxfHWynTJPCRULReo/Svl7cnWeS4CuFoRCMGOLI95p4PcNNHX60PC5MjKQD6GEJjlNaN/1jvsd9HTgUHhTV9gBqRJnBT0Br8QNU8T5Q6bTN9+eNeNOibyXkXm/k0gKqyjDSi5Q5rW7lb+Yrpea70O25JlNsPOzP3y87+Ie32Q5qURbwp7SeDzWxJyy4DVqH/XVhOdAuAMbD10UlRvgZU6+M1DCCgwKz1oIZFyOL/WyuXaxMdB9SQtILfPjUUDt4VMJLBWZ31xc/CuKXDTnj+IIpdv+4Nm5LKLRYlSCkjaQTeaOWQo1AVQZaDmR+FoNACw= X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 86836dcc-9b08-46ca-ddfe-08d49674ef7d X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201703131430075)(201703131517081);SRVR:BN1PR03MB170; X-Microsoft-Exchange-Diagnostics: 1;BN1PR03MB170;3:VOz3L2GI+5f5WIxxy9vLvdejXGLIGz6EoR4H0rwj3nZOfHEGJGVJXwsTAmc+5o8cLwsMkpmM49zP/KER9cOD4ntcpe1v6drs9rKz0SrEJrBOCutyVye6Dbdtzwa161SFqhzeLmzP3y3feFYQfeHvJBvBnaydtMlTZaKj2QTixuJAhO6z6/9zgBfy8vwPREa2IxncmqCrtYx+aqjiTveQBSjTXFOU3WaNOle5A42ddlfHM+dya9iYKWhQd5IlCo8rrf7x+XsO0t9KNtrtghvVPBfC3Ti1iCfcm/blejM8RT36LkKN8Y9Y8v9JDvvq+eA8Zt4cUK8k2tRoAUDR5o5Ri37DWr/FCZachwdg3Wu9RKZRoa5ZvpYJcdOgrBExEHp1u1fcULa7cpmTVW+47On8Ousko7lJnTvl+0MwBdAkI7w1HvzLiBFqqUa1hCZ/qyEc;25:SGdcQZbzPvJOags3g+eODcosiFS8clDIcsw6ulrAKf27AzGuTpIZ0hycz67nKLo+VwqFrNCp+q4LSLk0cvU2TpZMNa3EDcY2BceLxDB9YlosGgtalvuBGJkvWp2fQVvpGhSar59RmeDuslwpGT0SxVr63BvBDDL7YjT8q2ez17VI43F9ALfksTlQh67t7xgmv1rSojtHGevINBionsmE2WljA6zKncwDJbiEaAil4g4lWTxf1njHjMz/G7iQ7pC9ocd5MToL4Dlftslc98Hb4oispQPinzo41S9x3yXkhCquZDhG+cOfye/nPf4OOiOiP+SDi2vhHYIjZioOcDrHSzIYmLEr8RCb1oAGS9dal+bLEhj3JtUIJFFFIiKgwgGS0B/7kl6zDypf7MmKFyZUWS45IMVbgwgUJq7vUn3v7ua7rXQJYkN2/0yPt1v6MgEzX2VtvDfglRNmHrplc8BxuA== X-Microsoft-Exchange-Diagnostics: 1;BN1PR03MB170;31:9IFTHvMs1ezmnjoZA6CmKEqSNHLad207JZPyVBGLNGXLGxeivlDqiJP4cJl1z+1hr7X7DQf0uW5IZGFEiMEtIifqt27a4wQsvtlUeespSLSvVVXEcvyPlLHJf3yBy3pqjgewtbDGnFZxFmSNTOESSF1TX4qFV//++hbXolKKTGwr+oHyncDEr1KHNs+iWrDzJibv1ZCQ/x8+eSWfnF0lkA4CXoHtLC8fSAjNMTPIjVhr7NXeZ49y7HsWVvPRcqt1zzZu8+nzgXPSpSkG8Z/OLA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(9452136761055); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6095135)(601004)(2401047)(13024025)(13018025)(13023025)(5005006)(13015025)(8121501046)(13017025)(10201501046)(3002001)(93006095)(93001095)(6055026)(6096035)(201703131430075)(201703131448075)(201703131433075)(201703161259150)(201703151042153)(20161123559100)(20161123565025)(20161123563025)(20161123556025)(20161123561025);SRVR:BN1PR03MB170;BCL:0;PCL:0;RULEID:(400006);SRVR:BN1PR03MB170; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN1PR03MB170;4:w5f43MCoXVboOru9zkvPh8bCfi9rdd/SgyuBdTD3rkh?= =?us-ascii?Q?GuEJXOjaZQb09oSlPBw+mNQhspFV3cV3zjDM2PUeNgai5NOSe3yUNkUnp8vv?= =?us-ascii?Q?XIuLb5ysvTLCEAH/g1ZoyWQDs/DCsasobgxZNWixW73gXBT3h1wcO/moMXMA?= =?us-ascii?Q?pMJHVfOb2QEE2NJ+BtcNf7klyUK9p6qIMEOwnL47AXnj3MHC163CAxrQm7Gm?= =?us-ascii?Q?sXICLXjmfxmv4aiTQ/Zr3N1dSBGaQ9UxFsX2RFrr0I4T8uLBHhw5YEM4BSkZ?= =?us-ascii?Q?bQrTZZImGaB5HetGCyxuwESQzAqmXU6wJDN9FG/8SzUj+S8fvcVCCZhtOWgC?= =?us-ascii?Q?nbtHn59BtYSX7O2qmSfSA72SwIRNgWzlfviVxF0OStJ4OSzIetU4/TLAZ1Yr?= =?us-ascii?Q?Tl6w/5+UCVxptcgAWtmB9XKatiOwc/dICTkElG5TrzLbbnVY8Jj/m/YhDYb6?= =?us-ascii?Q?r/4O3XvwxysiBsJnkjLp6p7blJnp3nlt3ejPJ5y03oKuf5hARjUzLC4JlsQV?= =?us-ascii?Q?g0MqsY+r6lCm5SbORv8IaRFCE1bxb74ZC0sQa1ZyisuLeEBy6J0c2dcl05+H?= =?us-ascii?Q?S9Fkki770A7FjFuIUA3EgHhiLrFp9SuwsYRVg1TCViAmFTF/xPFKRE/c+NWj?= =?us-ascii?Q?q3Gd8RLQzvGIupP25TOULSVSDJntrszRqaqfMreMnRykPWGPn5MiqJgtCGAy?= =?us-ascii?Q?5NHKy0xDfsn7v5hAKxwP08bbVxtvKJVlbiaWl6Tj6k+j32DUj2DisbabC58x?= =?us-ascii?Q?MD6jigEoc1bwAr/VuQy3F8T1Z6JGn/FjNa/6zlt8wcsPUMZl+c3wG6zWe9mo?= =?us-ascii?Q?RrTkfQoT1kmm3dR4kgY4HQBVr0Y/3XTT6WRWO3BMH7QX9Cyl7DBJELNwa/dF?= =?us-ascii?Q?FGBeGBbwPRo9F70vCXa8hBCltXNJ3PH0ODZilu11/xovlTrIdd/75p9PhDX9?= =?us-ascii?Q?So7+3WArtfFW5C61OkgWEwNSJvXXHx7FGOgVtmw=3D=3D?= X-Forefront-PRVS: 0302D4F392 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN1PR03MB170;23:A7OZPnve183OUSek/f4WS+pOQN3hp3Dj7PODmBM5Ss?= =?us-ascii?Q?YTyCsTedCDul39O2WuV/Ov9xjQAWt/jKsCycEIqOstXd8Ok34xdNwRmV+zpF?= =?us-ascii?Q?brE3pUQgztzDitRiREh9vCB3l3S421kHNbPwBVzsts+WY1IaBEDA+j9Uok12?= =?us-ascii?Q?mdKjBzJ+bXur/e6PGkswCdRTWXVOxF/y8KW1PMMYXi8NVQRMEvTUCsox6HtL?= =?us-ascii?Q?51PRXA2rBUAqN87CBuCDe8NvrfC0YUUIdlV6nQm8nUG37Rk7qsbSH7AqmVsj?= =?us-ascii?Q?UPgqET9zK7Ys/mSz3mnN1z3xYHicZmbQvDCUSX2PWUrm/rukPReWfd1QAPv1?= =?us-ascii?Q?50Vs/d1bv4z5ug90kaSeI7nLTA4Ue9xTS+NSMfeqWPHQIT2Fxg1nZN4ArlMn?= =?us-ascii?Q?f9syvtUL7/s7r/ivRatfbxZIrqh/wazPdnrE1fXnjRJkyLJm0LcXp98/SsQ8?= =?us-ascii?Q?0K23nSoME33eUqOm1D/QK3f5h25gylrzX2OS8lsrHBj+/4pjuOyQEhLwM2db?= =?us-ascii?Q?4jUnR5/uvBO2S8Tqav6JRrIQ9rtlSN0hJWMlLpbt+sDKP62mzlSg03h9/i+5?= =?us-ascii?Q?GCb6E7/CTSX0uX08zuKr2hanZu1P4PDpMPQV1aw0CrB+eYRivgCcErFD8DKx?= =?us-ascii?Q?89jBdhEL5JDLnKrns1kK/CcEDvpCfFtfR/iLUUVf8PNvFGiTkl+SZXX2fFZc?= =?us-ascii?Q?Kc3R3n1Juk1KCX8dndWs3a3oZmB/BjSbxFyAbQZHhSZbx7Y/S5wsnhPJ1y4p?= =?us-ascii?Q?XiDgIvgVG93KR3BdE6kIsst88sSkUdVDcrKqOPGeudXkLyN/XeiheXPRGn8A?= =?us-ascii?Q?P/0R29UhGHONzIZWe4B449AD4NRCcOCKAo05K0n6j4z9o5HkIg3Efs/bPfQS?= =?us-ascii?Q?18PTLChjmlhGXcO2FDpgO75A+2E4zMQG6eQ4yMetESoURMJWzpTSiAfcRLIS?= =?us-ascii?Q?2kT1MjerLGicnOQkQf5gh5V1ArfFhk2Iq43qGyh/hGruK/8agA00CRHsW5Uh?= =?us-ascii?Q?yrNI39Pugk2ktGnwNe60iaC1bKJCOVOoP/jac8Nu/buwk8/5zhlvOBPFAaoz?= =?us-ascii?Q?/K+VxS98V71uo2/WtR9/savColxXaDE82aClFp/JRgi80mrNS5sEkNY6nznU?= =?us-ascii?Q?OpMROrAOrRG5sv5Hz2Xusz0flPRrgSuH58yLOUGoBSbfbihfUL2bY5JLWf62?= =?us-ascii?Q?5iZEsMMznZcy0UjJTOQY4z9mrBvtUwpt03eZMF0Pzo4o1K8LIzCFkNLgrAvH?= =?us-ascii?Q?s5tgS8/XYr7YZlnTCSPe0Nq4rR6XmvbmvuLVI1Ss/vs6yqGpnMB7W5Zv5txw?= =?us-ascii?Q?mjW6xGqhC6iRwtBT+c9Y4qJaghCpdqHkmZTOTRDj4UDkr7/0gbkEQwRwnLjf?= =?us-ascii?Q?InWoV8x9rW2KlvIhKnzE9X0hpHXCgPxPUcei9aVTcEN9pwi9LQaPOltcAmup?= =?us-ascii?Q?6oBvTirDBlkuIMUrecqJnnhFmHrf+D3jETNG7yALQe/CMRR7xu/nesAtyDfj?= =?us-ascii?Q?vKuPuSGCU8m2srwrkT5MQOVDjEh9W81+JpSfUeWHF80ldR0SNXKys2rEPdly?= =?us-ascii?Q?nlqnSHUmW0CIfN27SlTObqGeidXHwFSR+o2HLbXEnvxb08No0PSyl4HuHu?= X-Microsoft-Exchange-Diagnostics: 1;BN1PR03MB170;6:0TFd8uc2nyLRqSB6apJzCkEWK9SWlD2yoKMLwC7XHoYIzmc5IDwoXYLlAljOZ5XMxEtUMwBVNzq1FZ5zcETZhjhxBq2KwkQGbY/CDrStBK9MTBdfdXkCPbtLhI1UhMCCuSrVaVLooalWDOG/W1sOWPgEl+G1128XWjlhK3tRPfIbdjB7lL73j75YPPQr/VZT5DEgLEtIyzw0UCoohgsvq+4NiZxv3JwvEscWbvWczY+KK/1zm5VSDDxkDttBazytCsvokDP+Q4kpuHJTe/Npz6oa7100TGfoYtJQ40ky7LpWbLe/AH/ROiyaxhlWoWsAaoNkQKHMlmH4fthz8pFZVhtYndlqzB252yEFcp4jdJc7Vcgt9uC15d7y/eRiAURYLhqUPnyuk2t1ybbQjKYEl6SIeLZHaV0tpKQoSbtEmFeFo2yNfV0eJ5Q3EoyvMUZoXkyBDqaUbV3Fv28pHypo3rDjBB/vwxjitH/2g3jfnQQdeQlz/Wz9JxzLbo2d967M;5:kSbyeqDsHhA/YUOP05wv/nysO5Q2aZvCIYKZJH30vFVIjXwVDghiQwog3wo6KfnVUXYDOJ/BvQQf/7mhsc/vEaUOauE3M+HqXia8aNHKsM0c4wkkD78e7N1ejdqB5kFLpoCpwcTx8N9WD+l9TF8Ifoj8hjLy2XTlSsQ4gJ72WUMLYS2OEWaYipjqsBM6elu7;24:sDAoo6SZVd5zQyUcavzg0xmDTnEMYHr1Ez5ls7onaDiMnjlrEo3ybIQ7bUgN/Ogm9QNEX5GHDbNfYS627F3F1zodiqe+/KhykURRqkw3+nI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN1PR03MB170;7:j/Elf21pIbBYlTD5rYLjUlB0jsTTKDdyUWhR8ImmkeEy6lRVl7vDf8xGUJjBR0hd2sWDCWCs+A/W/Fg//3boHXORFNoaDV4MvQRJxFTPUCbjrMmPw9nPGPIOufN9Ht/8xZypJO8/GSXo7MKqK00fdOwykfIe8s7abZHcvsI6QXJa+ysPkrCic0sTJslsApryMdfKo4j8j4s1jzf4Gtgn8E8D4OxX7Z/mAhgvGBYxKLddJqX9Aw1Vqx7T0sAe+w1TVCDsqDA7S1Gj6bSzfMbVBVKqhnypg/EKxxWHvYnNZxVVv2XMGTwMYNNOzOfV0hIHTWO2NObyNLEw9dX9t7XYng== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 May 2017 00:47:14.2274 (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.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN1PR03MB170 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, May 08, 2017 at 07:15:01AM -0700, Andrey Smirnov wrote: > Unlike i.MX53, i.MX51's USBOH3 register file does not implemenent > registers past offset 0x018, which includes > MX53_USB_CLKONOFF_CTRL_OFFSET and trying to access that register on > said platform results in external abort. > > Fix it by enabling CLKONOFF accessing codepath only for i.MX53. > > Fixes 3be3251db0887f721f9c110e1966900922fc4ff4 > ("usb: chipidea: imx: Disable internal 60Mhz clock with ULPI PHY") > > Cc: cphealy@gmail.com > Cc: Greg Kroah-Hartman > Cc: linux-usb@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Signed-off-by: Andrey Smirnov > --- > drivers/usb/chipidea/usbmisc_imx.c | 44 +++++++++++++++++++++++++++++--------- > 1 file changed, 34 insertions(+), 10 deletions(-) > > diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c > index e77a4ed..fc21f92 100644 > --- a/drivers/usb/chipidea/usbmisc_imx.c > +++ b/drivers/usb/chipidea/usbmisc_imx.c > @@ -195,7 +195,7 @@ static int usbmisc_imx27_init(struct imx_usbmisc_data *data) > return 0; > } > > -static int usbmisc_imx53_init(struct imx_usbmisc_data *data) > +static int usbmisc_imx5x_init(struct imx_usbmisc_data *data, bool has_clkonoff) > { > struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); > void __iomem *reg = NULL; > @@ -242,10 +242,15 @@ static int usbmisc_imx53_init(struct imx_usbmisc_data *data) > val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN > | MX53_USB_UHx_CTRL_ULPI_INT_EN; > writel(val, reg); > - /* Disable internal 60Mhz clock */ > - reg = usbmisc->base + MX53_USB_CLKONOFF_CTRL_OFFSET; > - val = readl(reg) | MX53_USB_CLKONOFF_CTRL_H2_INT60CKOFF; > - writel(val, reg); > + if (has_clkonoff) { > + /* Disable internal 60Mhz clock */ > + reg = usbmisc->base + > + MX53_USB_CLKONOFF_CTRL_OFFSET; > + val = readl(reg) | > + MX53_USB_CLKONOFF_CTRL_H2_INT60CKOFF; > + writel(val, reg); > + } > + > } > if (data->disable_oc) { > reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET; > @@ -267,10 +272,15 @@ static int usbmisc_imx53_init(struct imx_usbmisc_data *data) > val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN > | MX53_USB_UHx_CTRL_ULPI_INT_EN; > writel(val, reg); > - /* Disable internal 60Mhz clock */ > - reg = usbmisc->base + MX53_USB_CLKONOFF_CTRL_OFFSET; > - val = readl(reg) | MX53_USB_CLKONOFF_CTRL_H3_INT60CKOFF; > - writel(val, reg); > + > + if (has_clkonoff) { > + /* Disable internal 60Mhz clock */ > + reg = usbmisc->base + > + MX53_USB_CLKONOFF_CTRL_OFFSET; > + val = readl(reg) | > + MX53_USB_CLKONOFF_CTRL_H3_INT60CKOFF; > + writel(val, reg); > + } > } > if (data->disable_oc) { > reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET; > @@ -285,6 +295,16 @@ static int usbmisc_imx53_init(struct imx_usbmisc_data *data) > return 0; > } > > +static int usbmisc_imx51_init(struct imx_usbmisc_data *data) > +{ > + return usbmisc_imx5x_init(data, false); > +} > + > +static int usbmisc_imx53_init(struct imx_usbmisc_data *data) > +{ > + return usbmisc_imx5x_init(data, true); > +} > + > static int usbmisc_imx6q_set_wakeup > (struct imx_usbmisc_data *data, bool enabled) > { > @@ -456,6 +476,10 @@ static const struct usbmisc_ops imx27_usbmisc_ops = { > .init = usbmisc_imx27_init, > }; > > +static const struct usbmisc_ops imx51_usbmisc_ops = { > + .init = usbmisc_imx51_init, > +}; > + > static const struct usbmisc_ops imx53_usbmisc_ops = { > .init = usbmisc_imx53_init, > }; > @@ -536,7 +560,7 @@ static const struct of_device_id usbmisc_imx_dt_ids[] = { > }, > { > .compatible = "fsl,imx51-usbmisc", > - .data = &imx53_usbmisc_ops, > + .data = &imx51_usbmisc_ops, > }, > { > .compatible = "fsl,imx53-usbmisc", Thanks for fixing it. I prefer using is_imx53_usbmisc stands for if it is imx53 usbmisc at usbmisc_imx53_init to fix it, you can prefer to: drivers/usb/phy/phy-mxs-usb.c. -- Best Regards, Peter Chen