From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751955AbdGHFv6 (ORCPT ); Sat, 8 Jul 2017 01:51:58 -0400 Received: from mail-by2nam01on0077.outbound.protection.outlook.com ([104.47.34.77]:31227 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750923AbdGHFvw (ORCPT ); Sat, 8 Jul 2017 01:51:52 -0400 Authentication-Results: spf=softfail (sender IP is 192.88.158.2) smtp.mailfrom=gmail.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=gmail.com; Date: Sat, 8 Jul 2017 13:51:15 +0800 From: Peter Chen To: "Rafael J. Wysocki" CC: Peter Chen , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: Re: [PATCH v16 2/7] power: add power sequence library Message-ID: <20170708055115.GA25873@b29397-desktop> References: <1498027328-25078-1-git-send-email-peter.chen@nxp.com> <2629938.X3D3UTyHBr@aspire.rjw.lan> <20170707080107.GC21909@b29397-desktop> <2042394.b4eZkzrJ5f@aspire.rjw.lan> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <2042394.b4eZkzrJ5f@aspire.rjw.lan> User-Agent: Mutt/1.5.24 (2015-08-30) X-EOPAttributedMessage: 0 X-Matching-Connectors: 131439667108981258;(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)(39860400002)(39400400002)(39840400002)(39380400002)(39410400002)(39450400003)(39850400002)(2980300002)(24454002)(52314003)(377454003)(189002)(199003)(9170700003)(229853002)(4001350100001)(38730400002)(110136004)(8676002)(83322999)(97756001)(2906002)(189998001)(50466002)(81166006)(77096006)(356003)(104016004)(81442002)(6916009)(23726003)(6666003)(2950100002)(76482006)(73392002)(33716001)(1076002)(46406003)(54356999)(53936002)(50986999)(82202002)(76176999)(87572001)(498600001)(33656002)(55016002)(305945005)(106466001)(105596002)(86362001)(93886004)(54906002)(5660300001)(5890100001)(8656002)(4326008)(83506001)(6260500002)(9686003)(47776003)(7416002)(7406005)(6246003)(73972006)(626005)(39060400002)(8936002)(53546010)(18370500001);DIR:OUT;SFP:1101;SCL:1;SRVR:DM2PR0301MB0607;H:az84smr01.freescale.net;FPR:;SPF:SoftFail;MLV:ovrnspm;MX:1;A:1;PTR:InfoDomainNonexistent;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD011;1:2N0x5YJT58CWAS8nYGe8DW9FWdTJVkZxKke3iN5mLNGbx2WDQeSzo8XNCXDWU2Gt+08LqiMh9NFzG0EPbh//2TSn3dgRfrJIEmUAWoXVTyAR+Yb4LzuRX/iN9Au0i6jNvuOhjbI0PLtxrX5lOqv39bPZhvNN45fZHxHN4sEIH/vnkwkbgSpFA1S0MaynzBplPpzJ+Ip3lY5StrczwnWW4Dz0qWNBSQOC71Bj4bUKBOZWjYf2sKnVekdl+g2wNbgVoNBveahROZVOI+WSXoFonMVwxoEN8RxeFO3agC4Y9dHJ6nyXGmOXmOrIjHP3Takc2sbTMFjXVsq2sAxc0ledWgK7bJP1bA5jBsF3jA0ALwpjN/bvsCcZeIigos7z8PmMVeLJIRwcEEFaecVDUZqoEoxto5SEDiHnV/34iYj+lO/71vN8Qs7NK24mU8amd8gdtuXIJEjLtT4TkY6H2+AeJAIgQxfhIQZpYgmEqhp6BUDOEufrvT2mI9B3MRgiCcQ89elcvzpBm3MAMulMZ1GTHSPyrqaFiQ6dwNeWKm6tonenNkycUOe3XFv5lkKl72Ljt8Ss2VbxGLlRbhOJto5Ao5Pje+6GQZs3IppOO6eqW1zTLf3anXK0DAPMFoDlP/OdoFIqk/iCq5oyDehGUGSgK0diyKcQ4D/BV3UHIJn7IL6VN6a1TYzi84YOymfQ+HxgMWzfp6MdHG202G1w7RW2JQwwVoXF14JSEMYUrwJYmesBak4c51IyjQRjhMz7d0ckN0jxCcH+bHd/b0jErpFpXEfEZoCkgXzjUoaI0RGyhCHkMg7OQFwxc3swRsouKy8ARI1HjAQrWe7vW1Y7Ran/RNy3OkjIh/c3FV01vz/e+6QyI4EJGj0WmQryzBkR9uE9N66GKNTpVUArPk5Ksm60vfWw7+vzTipAZ/Mk/ZVcBaM= X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ae13d1fe-cb0d-4252-c8a9-08d4c5c56de1 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(2017052603031)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:DM2PR0301MB0607; X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0607;3:Mqs3c7ZFbFkNdduyIcJ9VxNK249P6Af6HVup3JzOqBO8uQliUWqP0Fn5WZtH5ZF3JONt5+cRdRUxldbb6bkRbzvPvlOGNUyOsYHrVGSo2jj62dTxMenovXiYHb1X2xocf+J+Nug+bV9J6hAQyE/et39K/xzwafvzhti+b/uhiuHJmO1GET5S3nE+XiCPatCpGX4qtkP44GtX9+9CB/YFRYcgqo4GCxaaieo7ywVA4VWF/EKQH4eeqIw+vx8VCh28V/lJ+EuDWcczvoRRq6yn4fmPXabhzAaIb4WHpEnIsyB05U6UTuwz4fC640nDgXhUlY6pLvCPfkHFMhsbVRdn0zQ5GXj6iYm57UF1YV2MB1Q0XqxW/tTTLoJf9WJ7Q40KADtFK0y4wtRFcT/9gvcwfjtsfp8I55vQ3aCrchhDU3iUtYgyAXllaUSIE4eG+uNKfAGsZGEtSNTU4RH9Y1p46XOuyKqTg0ZqveV0JulUUUqybskXA3GBcdtZR5Js/5yjGTLUfiv1Ab1ixhLNO2OzSdfFZvHck6hmvpZTZ+3z6mXw2L5rw9EGLDoFFBBImlOHVsLWyDa/54kYpHW0WSBhHMuiDsDEcINIPZ7GUgfQ8Jmt7jjWkCoRs2cyNdtSGSm2UnQTsHZSTHIEG1fjdeMw4/3hNy9I12A7rOvhUYT7oPjJrfFyP9Joic6SqSw/wp+AqokLXpUvL4zZmbOKuQ1CYz7z2EhXbshvIizIbshCZ1Vr0M+28pU+mR5DAIRRiaG6XxtRbmqVw1HGnaiGm/KMoHFU6W3dQ2GS8h36X/nbcHLYmk2vR5JZeGMHo7Tkl9BR4x4f7kH+sbUDTT3/JF+TmXFcZAqqGwDAgsvK7RL74NMasOGC2hMskEOAiS2lg+ya X-MS-TrafficTypeDiagnostic: DM2PR0301MB0607: X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0607;25:bQ5rrERfWPosKyF50lMor2nGgRBDUMDOX1DpWBJ4RK5EAMNhhnuWjgyt9nqiGs27mngx5aIjiRA0WfkW6DKDGJg5/zmj2vWSBBP9X+R0Z5gOdJjPMWQn4lFx9Wfcc+gGBzSlb5XnTfKHVzll4W5yLrSlmGglJIkX8eSUZzIpMZFtkODPMQzfv/8T0N3oJi7Q/3xTZsUSCay557FrCefo94RrTmQKiph2IFduTMA0GRhFXMAPYymM9XRhS/v2+CKARfz0mtzRdLSfA3wiswubwf93Enxn5YPqxXmp3d/Bc6WpVFz+ORbUCQFgfSu+Vn+efQlcBK94ZpNFdZxPwLJhXTReK0DKFdU74czNnTfVi+/frgH9ufvFaBC0FtusGpCAsA2bMGLDFDUERSP4v5rFsBvynNhFZtwkuzFfRWU5GH2Rg9pGihEB8W1WLJgNfTPBnrQeeeAypXQm4ikFt2TLsHdWGjrMdt+kn2P2pCMpX/iZi4YMNMavH0H0YlE+9O22lV3q8AFH2456kdJkxmOBZXVeYwLjB0VacbtnL3aM6umji2eptZZthHIs/iqsOumTc8lHP8PoZzcWXLSMrDU/nWRU4hkT6dkAcs93LLoNnhOvcNElaY34D/YvbnOlInL7Pz6jSyGHVuo5lFCeOsfq2QPyDx3B3eeYzV+EOPCK0q6E8giVOCrpB0VaezlghEYCfc14PfLaPefHRqJtyG5iVWECl2o+Ywz3x8FQ3AicY3YrV0rj61Hbh+Uhn/le2o136vHgA4V5Ke1DxpeBRboqfhmZD5byulyZMaimlhFayfycrjV25ijMVlx8D8Hs76CrQ5KguI1ha5CI52oCw3QTJaO1N4z2hidLc1S07we+GtRp33kUqF1Q8nvv9U5WD8d3xMEHMHHFGlkXNCejUYB/zIxMe3CCu3HcX9ZzOocdRYs= X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0607;31:HVdBeMZrhbbb/Z4G5SkM11afIxO1up2AT0+W1xLX2cYCfJUBFkg61MhHz9qj0ubBbAufkKFjhBM5Jpd876n6ec4gDmjst3b2JYREKfgwa7OPanJs4DSZNaA9Wo6nPeQwqyUTvNn9+rBW9S/63cSKMoeuezbtQp7fuaUMpTYOc4mCJYFqTtxCoYj/h8Ufdn3l93TxHAbzGrofIYRX6RZaZIPwCGbQN/9Xy9riQwth886p/T5nlsufQiiTd8ntjfYHkyvDJWGiwJa2aF1G4mMlvUB5wAmGYfWfc4i3V2XLniKW9D/Lx/1HzWMt3NTOct72LpbdhGmlK5jJlwAuEeTIDP/H+AHwKA+ycWdPOmgNO16LkZgx+YLvCmu1CDomjmCi2ubd4W0nwzhLm/a2gmtsejQ4wErj6t34IcGQNZkjN6CqCNG520wFb4yNNUIjqSP3tkhuJGknWBhFJ/R5zv9KMVkxYV+iLKGDgRg4axFipl1KjgqV89zF8AhKmxNv28Qoe3n/lUx+2Rsn7YXA6lqiEXB2/n2nwxHtkTn222JkdZCD9mF5Lt7CPQfLnoqVrYMa7W6mKrSXHroxZSO7j/IdQ1HjPf++aenxoak0/qmY/19tgdjLz23FJFzhSVuQx9+bSV1OstGf0vzsArfmye7/YsXm3drAC6jy6WY9P891b0JBP7jt3ZLzY1cisN7lbYVeP2JB70KlXr47hR7lbLstzg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(236129657087228)(48057245064654)(148574349560750)(167848164394848)(228905959029699)(247924648384137); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(601004)(2401047)(13018025)(8121501046)(2017060910074)(5005006)(13016025)(93006095)(93001095)(100000703101)(100105400095)(3002001)(10201501046)(6055026)(6096035)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(20161123563025)(20161123565025)(20161123559100)(20161123556025)(20161123561025)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:DM2PR0301MB0607;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:DM2PR0301MB0607; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM2PR0301MB0607;4:7gK9ff7kadEgqCUOWI3V9cpa6chDorvhPpjN5HBT?= =?us-ascii?Q?FTwBfHzY3C1OOfZvDRcmP1qBc3ynN6lVb9Iv+QOZr5z8xkdB6kUAsrk15srH?= =?us-ascii?Q?2t/Zsms1Btsj33ucBdlXo5mjCjkfg64ivR4X0+JZxBBD9g+lV4Lkk2HvfPFX?= =?us-ascii?Q?jGyZi8KyJmoOs42SiOIXiWGKGxpOCW7zyQ1aLQVkb4RIPu1h2GxDqdHNsLro?= =?us-ascii?Q?3NbLHXoVrmm+KSfew2gSSIkXSZafDSI291fPFQzSE+TfzdPsn7VJOTxb1wIt?= =?us-ascii?Q?j42irhUa+f0naDuVXznqDmIZzpTC+wcxnjP81+2qgA+uG4m0sTinoG1Cxvxq?= =?us-ascii?Q?FgQ2O3aqOJXw9/uV8HZq6i+tou2uSJGlWKfls/a7J5FiJCXByAvr4w1uIOHg?= =?us-ascii?Q?Fec0dCslVGIAYKGl+rLhE0S976oVfESRprtaHoGqJ/0LQKKJu938Saj5D5I9?= =?us-ascii?Q?uqYmQTZuodtiu6RuJT6E620INUcD9oNIJAtoApqDYOMPDsDJ6gYxJTwdhsDj?= =?us-ascii?Q?mO4F8EGGhqCIMRZ1Zn4zE2zKH6c7YuYV1r1ubofeCFXJeoluCfHpM7XxY2Eq?= =?us-ascii?Q?1pPiQQKzgldtQlCBfpRXg/it3qeu1VyBuk9dcOlaSbZFeBcsEaBljlYrwrg2?= =?us-ascii?Q?dwqDNfOzUTzm5Hmi18hTG9MY3N4VUi9C4ZfW9O3+nuWTcmxnrWoh8pWhM1M4?= =?us-ascii?Q?wbbtRSHRlB0JiKQW/ocaDufFMBngqJND4TRn7xlJnl82+6rjPyKsO9Sm8xrX?= =?us-ascii?Q?GdzOtI49cNL16hFBzqymuXZxam/XKL3WyWg1lfFUpHATB20Y+IvxGuS2Kmsw?= =?us-ascii?Q?84brMrdSk0F9gaFjPNurEmi5dOKtkLZS6AOrER1mbw5xyqtJaMqtEK82dwDr?= =?us-ascii?Q?ksF5yZ8MlNu9Iy951wGd0Qlshd4y+extw2xvR9xrra4B3hDFrdBV0XY2VgSd?= =?us-ascii?Q?fh7UU7c3rvI6tK0jbeFRvXyyMn01P9AFk+FDSnCC3pJEwtTdmfvuCxj17Hjz?= =?us-ascii?Q?3UWTtyaj73YBuqjYYttZ3DgFApoi0XmF9INK9XllQg8ZcLII1FjAL4Xt6OHL?= =?us-ascii?Q?rqZly/+iV38Fxbyt3eAMqODogdaiZ8soO8WJGBshjOdRBt+2QgdezoN+9dGO?= =?us-ascii?Q?q962TzqZ2gv9z3+w6riu96PPjZMBEs/oCy31zBi9OujZPdESGvTvxuyoFw4P?= =?us-ascii?Q?c9K6kiB97ueFDNu7kveNQczZ2PLwgItEaEUFGXVw9/HpSVWGEsggUWgUdH8D?= =?us-ascii?Q?5e86SXM7LFPWX+ez++hvTmAQnrEMg/8d2Y20272ThXuVYhsS81QwvecnSEyL?= =?us-ascii?Q?BVyeg/uiO3sGu+7idVNNTvO3tMvVpDTwV2qzk4uIpNkdaPG7W7Vk97tfJNU8?= =?us-ascii?Q?eKi8gXLj3Dgt1rA7NMvpBm/KR7V2sMtnryR2F9GR4lKNjCnvW/IaAnulLZX3?= =?us-ascii?Q?JQrbKJtoqm5oNhFAz8GL26cQORWgAw6IwTBbmLohGcnJsxYUx+tl?= X-Forefront-PRVS: 0362BF9FDB X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM2PR0301MB0607;23:zAz0yQa19EJMzq0YlUjII+vEmcC/CIhC6vdJeB+?= =?us-ascii?Q?V3/lxmCa5VYzYTiRtmUclKe6BxIn/MCGNF+pCZQw4kEHehy1uFWQvrQJeOrb?= =?us-ascii?Q?2szIkTnKa25x0oh7XMFDw5JTRjnlNoQNfZu/oUXiR1IlE29HH7B7OJEEzFzU?= =?us-ascii?Q?IVEUKaMKGj4XsP6sF1wTdQoRlVBroKkLVEip0/BdfFFnBZjDYDu9Nn1VXzYz?= =?us-ascii?Q?hoWnVV99KadOH42SjbSM2oiAdnkcafXIF2zNQtVC5zkPJzgb0GnHulsxeYFn?= =?us-ascii?Q?DpaJonY21XZ/U7F9+YGBKVo8t2w7nGPm1FSL9uwNOVsckNFgl+T5htc4qjWA?= =?us-ascii?Q?/m7/I3EXJ87CA2RcOU71E4fejbHCWicosozEXWqtOMJq+XU9WZR0WcA/Wv7q?= =?us-ascii?Q?qPpgRwBGqUnqQzP25PR9ZBmwhnrJQ5gGFvZST4wGPvJzkAHP3Tt1quYpOfqm?= =?us-ascii?Q?syfUcYrgh94uwvgLkcz1E3P6Pos3DU2i88R8bnNWzh1PJepIT6TdVlTxqPNo?= =?us-ascii?Q?y4aHYyP0Ac3pdPIBtRzFlsgLwbLE904V6z/mWpxvcKztpQkF7ltX2KwlFQqm?= =?us-ascii?Q?d1vMdSVJoQeAMfaxHver8qXLnq1EDyr3Vs8fhW/homnygC6ze77wcUUceyLP?= =?us-ascii?Q?9QIp9GuIkKjgTwXHDh4VT/pAR5Y+gWWj0IE9glSqaRbeFP4OJjvxo+CmtjRm?= =?us-ascii?Q?YHzRQKOUKB6q7H7srSfMx3c7z0SIOV+WQj00drYPNDwWvqFa21p3KuwhbGGg?= =?us-ascii?Q?WrzC8gRKeDZU8r0KFu00l+GmPCN19Yo+xtdwKf5X1FOvIeHh4rXndIfWMLiK?= =?us-ascii?Q?Wu3Lvb/kL5/UQ15dZP0eLZEt4zfKwwCgn//EMxDvL8Jb9ahet7SoaMKd/U5G?= =?us-ascii?Q?igfx35vzdHSmY+j8PpH6AscllOlXWIjOpHkdY4XH3ay5KZT7ja3whn5Y8avq?= =?us-ascii?Q?zUCmpmy2YmsksTvkHi6ImXuXMNmR8/l1QnH9RZ/002CWgdgQCnrubN7BY0Za?= =?us-ascii?Q?OvjkTBc+S1yn/dqe5z1mi+4VaBA//HNE8dAsWHcWEsc0Ln5F/NqRyrpSQcq1?= =?us-ascii?Q?6fHMdW7dV4rHkY7yWYPT0qx1L9PUym+2vXBk0jY6UtyemawM0lrIElzgHQJh?= =?us-ascii?Q?VdsQwcL/kjKypU9ZaNIaKMVlYMFuG1TE46j6EYkLVOS9TfTa3KzjepUqYxLw?= =?us-ascii?Q?2z4RE5EGM9eU5x3uVOjYu6tXeBJ3sdXjy7uqO56E9DRxx8IFjZCij55wGbqO?= =?us-ascii?Q?Zku/dkYW/7B+YlmC6RRkaf561mvYiKuC0/y32OE8tvmUrcoHFdZNrCKqTxR+?= =?us-ascii?Q?UyJ+UVHxE2gF8yAjJuN/Kc8cYCfQx8AeKKfgMZVlzDK7EQUHDS1Q2g4BkIal?= =?us-ascii?Q?BBDX+8qn6xeKOt4oXtAiGUJbt71FSjcCy9BINq2vpZ7E+AOfVdSA8V3PJFKC?= =?us-ascii?Q?/ppA8N8dZxFLGaBFpnznfJifi4QvbaJfCgt3VbMC+JdFGIwT+zDkn0fYjP69?= =?us-ascii?Q?qgUeB+NZD3Gx2tLYmYI6GuEAOhY3+pVykAZFz42qDRYfj3ZCF0Ic4k/GU7xF?= =?us-ascii?Q?QWQXKb+nDfKuNivj7h6Z/TiqgNvi1WDNGKOL+4D1M/qgrjDobO1lR617bSf/?= =?us-ascii?Q?1OMPgwJb7q+Fpj6Fc4sd9NOL9yAlGU+82dE2Fz8tBsExkHin55oHuYyDkQul?= =?us-ascii?Q?ZxjPurOQobAElV3GMO1CfKIvO6q9/qf7KNCAJ1PTJ6Jd7IdaJ7E4LWysHpkJ?= =?us-ascii?Q?o/zs9y8q1?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM2PR0301MB0607;6:DpBeHhlEnki5/seVTpbs1u6SwrsNmCRRm2RfjSUt?= =?us-ascii?Q?b023SwY/Z/EMWiRk2lqDTOOkJxtm7nFvMgWI+MRdMzsgyrM8JWjDcezvW20u?= =?us-ascii?Q?ETb6qJoZcEDTeT7BuyQjyUhHzcEzk/paoFXgma337PrCJFuYmKSfLHi36t7v?= =?us-ascii?Q?NCb5S7w7vLvVHBK18+wcfVPlaJjA0FGqlRYxNKsmpgKOuLyToKtjZ2O8I/C0?= =?us-ascii?Q?+W9T7l6begGTUP+YlGjGivQxXzhP0QvSxfZjGZwBuBhhdNnJ0dPrBjRnqaJc?= =?us-ascii?Q?zNGmN32G7+tB8iEb7PP6zlRCr/kNLD2aBuixuF/huyXQaRJf6lm/Ut9xunwH?= =?us-ascii?Q?XxsWRFwweoa9jOh4ZFzGu64D2jDvt6+E5o0H/OlSMzFtDyFvdaqir/58XXNr?= =?us-ascii?Q?JfKfyyayjDkcJwsxEPuTFYxNdm2f6j3eEBZvazo2q2QD76kphX4PBs5455TC?= =?us-ascii?Q?j+GhWjdoWG+n4oDfv3lwC3MHa3eXEDRpfmPLHKFTmaffJG2odXTgLiDmWNQ4?= =?us-ascii?Q?on5jQNretP0GLTrINUaHdo2QqDmeyrQDAmLTZ2eziIvT8vizamy/QAUmFxTc?= =?us-ascii?Q?mEbVD8tyEUbPfMXsyG+EBZVfe4pBL2SX0TpC/gajgNrD6r8EgPzFcmwIXiac?= =?us-ascii?Q?611vFDD6YXq1NfUuiNkomwTL62cxiN7gAdxHtVHZI9lay23n0Hz3KJ9Puc4i?= =?us-ascii?Q?qJfErCX8tz8b4hsXdvWIzRXHo/2ZlFq8V89/yZrNP6KoWbCjp4eZqGFNP3eO?= =?us-ascii?Q?kyqljVTliS+DOemA61gDDtyq2rnaP5YH+PKtGH9jGNwZyPigLLxlyxwzYBLy?= =?us-ascii?Q?qDuJxHu9MDq6A8lJ/esNiON3tnRH7CnUGgPFyaxCRV+370Luv7ubIhraUW5w?= =?us-ascii?Q?Tqr6P/I7qVyrSB5ZLlIIXGQNT5yJR6Gr/Fn/uG44FGoRW9jZD8R8iySOis6c?= =?us-ascii?Q?mqt4+6FvoNKaEm4pNyAu9Lr4o7Y1WMICdA9uNCR1YQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0607;5:oSLyVMTY6t+7YZKUyNIYxDnt/9WgOqpHCtBoWFssrCXLRAxzpliElj9IA9c5RKh5rSsHekNZbUH8DEVy0aeAYtrWJJmJ1C/6NSokTHJK+rLPYo+v1fnjQG7+EUMi4dFJi93nOUIVFlnLCxGeVAsORYHIYLU3O3d1Jik3aHdodKTnjXx24bxus3nxr66tth7qrsQXAzR7GZgYUGbIexnED1417Du+xZrIdzCyksnUkbjjEnQOcuuWtnA21uiKV0Ha0Wdt66ix5UAmMWfGf/KaP18YuWPIMzcwEfgMOY6DIruwEmUCDc+aX4rG9oxVDchkp/3MUu9mscCoXQNeqO2k42UFmd/fpYDMN47F7RHuaQMRFa3fPffWWh7RYAAuGIEUZI96VOJZPx8WrQXQ9TCL4f2xH54K3kzm6LUVoAuWuAmuEVmQJz8WBBdXy15K54iySNflV28aD3HW1wpzKrFX057aUSZUPKRue9zSNWK09tjmROVSvMIIOq4V8XrE886lc2cz1+nLIH6b1A/PQR2rYw==;24:ZEO6z5N2GgDgsG3OWechHz8FUlBMr6bUeDS2F03Y0ie4dGb5qcNZEWpqw1baoBxP8dsTP30IIDjdUwdsgkGYxVP4CXTT9FGiV5DSjUyS3qU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0607;7:5/0KN4cHr/VML75NUbIejnwkw9AuiVSHC6Rf6zXo3J2eNUh//VtpnvOF9ZHoL+RAwPjpbPaSAVcHlR3dbC4UTwfECGDEopdhPNO5sSXp+rDSEfa8BLTQTi2t+3vaqbJ8x11GtuhjVBhcCL1eKI2SLPvykTPw+9tyFdM9QKcbAGtr1o5dRHquCzACBdVdXt9xxZKj6r8LD3t7LH/xkD95dQ2HRZjvLbj46sQ/jUG4jler0QaNinW3yCybxH33oVPbzcp69TyXiLeSN6RjkaWUKjmZUsuFfCke2ccmd7zKWVVC8WbAN/+cj1cwtxhwtptjzy4YSdF3FSasppoIsvKdRqqj0dxv48zGBCkE/d0SByt+tnDfnGgmk3yspdctfdRNu4jBZtFMx+8Br2Ubd01ogeGv2lgpq2SaGKwKQ8sLgTk8gUVhJLYNOcb7RTJcyRNFQ19WlAqkBsKWRW/Lr/y8ZekZb7xbNMz6TaKZw/ZF/zUeyMwWWEiuygnJPQzfTrZQM9jZwdR6hSfzMlAWtMmZwyOvhAap7Hcc3x5/6NFjRfiEHtlbkfEweJEIUsHBuoendFxWM20CML/NY9mNEm91H9TOusXezLELUAXLomE5Pu+4T/cjBqqXskzqQMWCwpD+Zt5QG3/n06PabDGxaEfFDc9z2MfamWSS6zeEu/XpKIbax31thFz/dmc/goVbTvo14nFb0aYh7me9cfJzsyt4qdSjHONg8JCkdhzBjGdE7lRoSRScZzXn8FeVzA18c7nKmC9qBmWUN4VtUgDOCLFU4q86QZZdD/DhfYQOZROxqp8= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jul 2017 05:51:50.4769 (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: DM2PR0301MB0607 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jul 07, 2017 at 03:03:06PM +0200, Rafael J. Wysocki wrote: > On Friday, July 07, 2017 04:01:07 PM Peter Chen wrote: > > On Fri, Jul 07, 2017 at 03:13:48AM +0200, Rafael J. Wysocki wrote: > > > > > > > > - Can I write new code for it or I need to depend on something? > > > > > > There is nothing this code needs to depend on AFAICS, but there are existing > > > solutions in this problem space (ACPI power management, genpd), so it needs to > > > be careful enough about possible overlaps etc. > > > > > > > I find there is already "power state" concept at documentation. > > > > Documentation/ABI/testing/sysfs-devices-power_state > > > > > > This is ACPI-specific and only in sysfs directories representing ACPI device > > > objects (which aren't physical devices). > > > > > > Anyway, since ACPI covers the problem space you are working in already, > > > your code has to be mutually exclusive with it. > > > > > > > - If I can write the new code for it, except the problems I want > > > > to fix, are there any other use cases I need to consider? > > > > > > I would start simple and focus on the particular problem at hand, that is > > > devices with two power states ("on" and "off") where the "on" state > > > depends on a number of clocks and/or GPIOs. Still, I'd also avoid making > > > design choices that might prevent it from being extended in the future > > > if need be. > > > > > > One major problem I can see is how to "attach" the power states framework > > > to a particular device (once we have discovered that it should be used with > > > that device). > > > > > > For bus types that don't do power management of their own you could follow > > > ACPI (and genpd) and provide a PM domain for this purpose, but bus types > > > doing their own PM (like USB) will probably need to be treated differently. > > > In those cases the bus type code will have to know that it should call some > > > helpers to switch power states of devices. > > > > > > > After thinking more, using a power state framework is seems too heavy > > for this use case. This use case is just do some clock and gpio > > operations before device is created, and do some put operations > > after device is deleted. We just need some helpers in one structure > > (called "power sequence" or "power state") for this purpose. > > > > For the use case, the clock and gpio operation can be done after device > > is created, the power domain is more suitable. > > There is a problem with PM domains that they only provide hooks for runtime PM > and system suspend/resume (including hibernation) and not for generic > "power up" and "power down" operations that may need to be carried out at > probe time before the runtime PM framework can be used (and analogously > at remove time). > > I would consider starting with the patch below or similar. > > Then you can define something like POWER_STATE_SEQUENCE type for your > case and basically use almost what you have already with it, except that > struct pwrsec_generic will now become struct power_state_sequence and > struct power_state_info will be embedded in it instead of struct pwrsec. > > The major comceptual difference is that ->power_up and ->power_down are > now available at the level of the device that needs the power sequence and > pm_device_power_up/down() can be used wherever necessary (in the code, > in a bus type, in a controller driver or even in the driver for this particular > device). Rafeal, thanks for your patch. The biggest problem for my use case is the device is still not created. How can I call pm_device_power_up(dev)? Peter > > Most likely you will need a PM domain in addition to that, but mostly to avoid > code duplication. > > And in the future other types of power state definitions may be hooked up > to that, including ACPI etc. > > > Signed-off-by: Rafael J. Wysocki > --- > drivers/base/power/common.c | 35 +++++++++++++++++++++++++++++++++++ > include/linux/pm.h | 33 +++++++++++++++++++++++++++++++++ > 2 files changed, 68 insertions(+) > > Index: linux-pm/include/linux/pm.h > =================================================================== > --- linux-pm.orig/include/linux/pm.h > +++ linux-pm/include/linux/pm.h > @@ -550,6 +550,30 @@ struct pm_subsys_data { > #endif > }; > > +enum power_state_type { > + POWER_STATE_GENERIC = 0, > +}; > + > +/** > + * struct power_state_info - information related to device power states. > + * > + * @type: Power states definition type. > + * @power_up: Device power up method. > + * @power_down: Device power down method. > + * > + * @power_up is expected to put the device into a power state in which it can > + * be operated by software (it doesn't have to be the full power state in > + * principle as long as the device will respond to all software accesses in > + * this state) and @power_down is expected to put the device into the lowest > + * power state the device can be put into given all of the applicable > + * constraints and limitations (it may not mean completely off). > + */ > +struct power_state_info { > + enum power_state_type type; > + int (*power_up)(struct device *dev); > + int (*power_down)(struct device *dev); > +}; > + > struct dev_pm_info { > pm_message_t power_state; > unsigned int can_wakeup:1; > @@ -600,6 +624,7 @@ struct dev_pm_info { > unsigned long active_jiffies; > unsigned long suspended_jiffies; > unsigned long accounting_timestamp; > + struct power_state_info *state; > #endif > struct pm_subsys_data *subsys_data; /* Owned by the subsystem. */ > void (*set_latency_tolerance)(struct device *, s32); > @@ -610,6 +635,14 @@ extern void update_pm_runtime_accounting > extern int dev_pm_get_subsys_data(struct device *dev); > extern void dev_pm_put_subsys_data(struct device *dev); > > +#ifdef CONFIG_PM > +extern int pm_device_power_up(struct device *dev); > +extern int pm_device_power_down(struct device *dev); > +#else > +static inline int pm_device_power_up(struct device *dev) { return 0; } > +static inline int pm_device_power_down(struct device *dev) { return 0; } > +#endif /* CONFIG_PM */ > + > /** > * struct dev_pm_domain - power management domain representation. > * > Index: linux-pm/drivers/base/power/common.c > =================================================================== > --- linux-pm.orig/drivers/base/power/common.c > +++ linux-pm/drivers/base/power/common.c > @@ -152,3 +152,38 @@ void dev_pm_domain_set(struct device *de > device_pm_check_callbacks(dev); > } > EXPORT_SYMBOL_GPL(dev_pm_domain_set); > + > +/** > + * pm_device_power_up - Power up a device using the power states framework. > + * @dev: Device to power up. > + * > + * Put the device into a power state in which it will respond to all software > + * accesses (that may not mean maximum power) using the callback provided > + * through the device power state framework, if present. > + */ > +int pm_device_power_up(struct device *dev) > +{ > + if (dev->power.state && dev->power.state->power_up) > + return dev->power.state->power_up(dev); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(pm_device_power_up); > + > +/** > + * pm_device_power_down - Power down a device using the power states framework. > + * @dev: Device to power down. > + * > + * Put the device into the lowest power state it can be put into given the > + * applicable constraints and limitations (that may not mean maximum power) > + * using the callback provided through the device power state framework, if > + * present. > + */ > +int pm_device_power_down(struct device *dev) > +{ > + if (dev->power.state && dev->power.state->power_down) > + return dev->power.state->power_down(dev); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(pm_device_power_down); > -- Best Regards, Peter Chen