From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030971AbbKDURP (ORCPT ); Wed, 4 Nov 2015 15:17:15 -0500 Received: from mail-bn1bon0094.outbound.protection.outlook.com ([157.56.111.94]:59121 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1030260AbbKDURL (ORCPT ); Wed, 4 Nov 2015 15:17:11 -0500 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linutronix.de; dkim=none (message not signed) header.d=none;linutronix.de; dmarc=bestguesspass action=none header.from=xilinx.com; From: Soren Brinkmann To: Thomas Gleixner , Lars-Peter Clausen CC: Linus Walleij , Alexandre Courbot , Michal Simek , Grygorii Strashko , , , , Soren Brinkmann Subject: [PATCH v2 1/2] genirq: Add irq_pm_(get|put) callbacks to the irqchip Date: Wed, 4 Nov 2015 12:15:59 -0800 Message-ID: <1446668160-17522-2-git-send-email-soren.brinkmann@xilinx.com> X-Mailer: git-send-email 2.6.2.3.ga463a5b In-Reply-To: <1446668160-17522-1-git-send-email-soren.brinkmann@xilinx.com> References: <1446668160-17522-1-git-send-email-soren.brinkmann@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.0.0.1202-21920.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD027;1:zA887uQqcIg5mOwdgyDTQlZHS1a/KjRZKMOwT8EY89z6nZZJlxoRw+FONDeVyDfwKvKC/p1MEki2lgOcdVe1INDYf58u8IZpg1EGMtLqUs9+3juL3rYUAmJi4Gk42q7eeozw8vvNZW+CC+Z0GJMphTTqoswJZVFPeqgoCFTwE4ITHBwEZZR5ya+6vIG3mq7TSCHIUJqq7JhLCILYpZi2B7ZQ6J++LnrgapVzWVvqFaSJ5WII/b7hlOA5Uo4+tCKjlK9RiUi44KlWt5l+cIfd5Xg/En715a/FLN0tD2n8TR51WNj7+XeSsDXN3MAKacYE3a2WLFNY88IgyJ8EUiKhaOC87+1DMwfCneS81qLmZjlBhxLCqbTZ+g1V+8kEUKMh X-Forefront-Antispam-Report: CIP:149.199.60.83;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(438002)(189002)(199003)(11100500001)(63266004)(77096005)(57986006)(76506005)(86362001)(50226001)(5007970100001)(4001430100002)(6806005)(50986999)(76176999)(5003940100001)(5008740100001)(5001920100001)(47776003)(16796002)(50466002)(106466001)(36756003)(48376002)(81156007)(229853001)(5001770100001)(19580395003)(19580405001)(87936001)(92566002)(36386004)(107886002)(5001960100002)(33646002)(2950100001)(189998001)(107986001);DIR:OUT;SFP:1101;SCL:1;SRVR:BN1AFFO11HUB011;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;PTR:unknown-60-83.xilinx.com;MX:1;A:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11HUB011;2:/1Rapn/XR7OygzkH7knLC/ho1U8TjcfUkERDV4mLfP2AY/wVjx51G3cqI3SDkwTdIUbDcDdfhbgvDTDgFSnjQBuyiSfXQqtq4Fc6IE8Mdg3OJYHRGwus2xYwSUXWavjHPi5AzgeGq3GBGNc6ikaDAQa+hZzWMiS7X89LpHwOPDE=;3:HT7tK9gfEpiKiIfRlvWyPZ8wseKlYS8VvgtDnlRCT9SvWefnHSzEWHvqglwHCntQya4jb4VA9V/n/BtHv6/R4UsLnIW5PCO8EZb+XZXsj/NAaSmV3RzacenbeHEy9jtiSbdDowahvwKD5J3PLEM1jmMjTOByQ3QAw9VeIQs+6NYLyC3/rMlnoRuYnv/WIzMKrl15NpoNXahZQgM1j4rvBRSBKIcnY/X4t2FfYM9sq3ap4HEFpPoopMifeb+UYkRSeAkrtBbkqWUzzRqDU72EMw==;25:4f9cBG7v/TJrGNxTvepaJrfSIk9WiE/RMuONLEVUHk1dRGjwOyLI5nk2UU+3N35nK4G1f+MSZgKiPV2nesXF9xI9/J+99Ta1sOnSOLgtuBfdEkAHmpWVCH77p5bTpC37G+DK9AiYpskGu3Sm04nH9RmcfIXQhn+QyW2d+vZGXKHSfzuXXtD78mlfggNGs2U6xroh0Xv3sy00kmMh93giecFTM954W+4k7QpVOXOOBGtgFhxLhpyDNNshJO9QghQW X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(8251501001);SRVR:BN1AFFO11HUB011; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11HUB011;20:wfIqSisdQq+Z6mZW+fh/r56dI8xGGLuQRBsRpX6OeRmwkCuA7Ax4PF48Z7t5N4zjTg7zD9rPW6C5ywjkzIJbJjUCr5jGZkLjjzr9mSH50Tj+KvgHiSc+Tt+jZH69+sP/PFvtmq50nZE3TaeuIkROiwO3Bw95ujDKt6kOdGYm4be7UplsTxP8CEjoerln1rg8rk34qNpA5vIFeeyd63OwsicaUV+MTtEt6JIqWpjcF0e/vz4z1CKdio5lQzoZ1SbWatJ6AwRk8uL1+OZ1amvx2jK0sBvdZPc/mUTomxLGhN6vd7PAWZGrQnLtKW8ZshaMYHn9CGaFx7bAulbiJPNhMUl4jpGCbsBIyS5ynXvtvdpuCfpAenkKM0uJPiUFJEy0grAgswGVjm9azQPuDG3LpYt17vBpjRZfqaGpiAmbtaZBo+bHV2vloHi6V3kqXBKkKyeyLqgWWLNYWPg2FEkcB7ZV4DrfqUrAKNWbXfeU1TPzxuC5xAHeDEeGVENtc7p6;4:KGVkokfuAF4NwyBUpoX+PQuPSvWxru+gFbfXtBG1ey44MzcIvigRu1dfyx8lQmSQR9zxPE7N1cNkSrCCBuOFY/hAhZHhrCdLseXDkkfMgRfgSz/7+QXPS276xm57ocbcEo1RSF+mGsrko3EiSuWTPSbZJX9ESOTzul0oflgI8EHz023zGDKYQ5skGPiqy7tPvD7M0EPf4D42io882OnNpjo5vcztHRsgV6ge5pcTaBFUbSmjA+VQLosHek2drlC38Xwmq9VrhGkU3XUoCweKYEJzV0MTJPyweD0rEy9yUt/xb6dG76ZmHPB/PLezJGjeo6usOPf2n1bB04OVHlFYYq0FKBvdCFq2gKLY1a7K8g6X8Qm1T3gUfplrqjBqD/JV X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(10201501046)(3002001);SRVR:BN1AFFO11HUB011;BCL:0;PCL:0;RULEID:;SRVR:BN1AFFO11HUB011; X-Forefront-PRVS: 0750463DC9 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN1AFFO11HUB011;23:fGeIp7xLY5Z/WWCOL4O6E62L1bQYs2D8abtA7bE?= =?us-ascii?Q?oZNSJsBJOrbwhu66LXNbp5PxVbQbXoEWzW8AVDbWcQbvrk3z2lnolrvDEiWS?= =?us-ascii?Q?p7w+5ODd3IqaKmdPSEgYcKlSkAtS5ev5ymxq+C9NBetqHyysynPeKiI/1Vzo?= =?us-ascii?Q?qDVm2UMdDPwcDzEcmxGlehQmviPq5DGbL2JKG+mPOhF1KbXJsvFlyXni5Kwc?= =?us-ascii?Q?5gc4/i3EF/lSKAQipRRvDUCh+LsMnUf/qzAyqfmp1g5FKvymqLwwWN/tsOyV?= =?us-ascii?Q?eDCro3f3UBJMOvHQId/jaw51BwBnXog5Sa31X+RDN9xGRbrgBM02lM75Vlrv?= =?us-ascii?Q?yJEqpxcePwIbUBNeAkvXu/EVKZHpeqE+jWvsNG9mfokPdNhA+rP8AkBmLkI1?= =?us-ascii?Q?evqERVRNxl6JDVSv6cFsGNIDiearTs9hFJdgUIFUIpWIPep4u4gHvNlTXZ8D?= =?us-ascii?Q?dY45I3+cd/k/Ty7ImnHTAzf71YRyLFeT26P/a+kvAsl1EyidJ77JtFXLLbLV?= =?us-ascii?Q?9cHio2/PTLRsBnTzXGhkbBMztiFvxfororTeLnK+yUA0xo2ab7n1kDV/pp00?= =?us-ascii?Q?cwoQuNSzn49iRKrqpitbxM0Qc7SLs/i7gRiLOeXS81d1eM+/3YZpSvVHv58i?= =?us-ascii?Q?iu5+jLmkBeBsuBrwnXJtoQTDGNQOtZsmomEIu9cKx+OmN++Tlg/+FFVUQ8KN?= =?us-ascii?Q?Xfy1NAN8eU8TIUlrBWMVrrjmWSW9Hmi741QehOYRh8Ys7nf88maM9+MQgKdO?= =?us-ascii?Q?6WknBwsmjX/C/MSdQEoXbqqh+At2lHrEzlJLi+yUJG1CE/AN0IuERnQvYQr4?= =?us-ascii?Q?HqguWItLKODSIxyW3hkrrC9azHl756HBqe+mu6bhSyIDpKazA5ybom77Kqtj?= =?us-ascii?Q?NahC08RgUTRRzH8eun1p81fgo315f8d5YJqKCElmpbj5stzaeZWLLe42A88h?= =?us-ascii?Q?pA7A/0pqVZZq1W3c1Ry/t7WC/am+XNgg1jevxhwlEL2UYu7rri6wou6eaMQ0?= =?us-ascii?Q?g9jXl6q93HVkFlz4RNDXn/ablijs1JUDbAV1yo2fzo0yRieCTNZEm9McXxOM?= =?us-ascii?Q?96RtGNhZgzVxPLVeakr2xG+LIcpHjvnLIG8+rfSDn/30XvAmpQI4UZ3oG78b?= =?us-ascii?Q?LjhKPqsBhDig=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11HUB011;5:ol6qe4vj2DHbp9tPOwMxBdKuq3suZ56tf5d8TZIInj7pTz1FA+z4iLkjvJlHvHqYbCxpcwyW3ti8FxaqVPmN6/YydEOFvMETpNI4OyaB7oUWoYrmr/H2XJpYXDV28CxbXUWD69+SKBONeXiMHeFJbQ==;24:IfVe5hlbXpgpw//O0eYBv+A5Rvt9ATBi3mkZsKqFU1vRCcdTaIpnFfWtdulBgUiQUsq/xR5drGdgRSZ6r5tQVJ/Cgsap07v9nZL/5vRiyUk= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Nov 2015 20:17:09.5015 (UTC) X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN1AFFO11HUB011 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add two new IRQ chip callbacks for power management purposes. These callbacks are supposed to bring the HW into a state that allows it to generate interrupts. The callbacks are called in request_irq and free_irq, respectively, from normal context. Cc: Thomas Gleixner Suggested-by: Lars-Peter Clausen Signed-off-by: Soren Brinkmann --- v2: - report errors up the callchain - add error handling (needed some refactoring of the existing error handling in request_threaded_irq) --- include/linux/irq.h | 4 ++++ kernel/irq/internals.h | 14 ++++++++++++++ kernel/irq/manage.c | 20 ++++++++++++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/include/linux/irq.h b/include/linux/irq.h index 3c1c96786248..279f6b7118c8 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -341,6 +341,8 @@ static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) * @irq_get_irqchip_state: return the internal state of an interrupt * @irq_set_irqchip_state: set the internal state of a interrupt * @irq_set_vcpu_affinity: optional to target a vCPU in a virtual machine + * @irq_pm_get: optional to bring the HW in a state that enables IRQ generation + * @irq_pm_put: undo any effects of @irq_pm_get * @flags: chip specific flags */ struct irq_chip { @@ -384,6 +386,8 @@ struct irq_chip { int (*irq_set_irqchip_state)(struct irq_data *data, enum irqchip_irq_state which, bool state); int (*irq_set_vcpu_affinity)(struct irq_data *data, void *vcpu_info); + int (*irq_pm_get)(struct irq_data *data); + void (*irq_pm_put)(struct irq_data *data); unsigned long flags; }; diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index 05c2188271b8..8a5842431d6c 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h @@ -112,6 +112,20 @@ extern void irq_set_thread_affinity(struct irq_desc *desc); extern int irq_do_set_affinity(struct irq_data *data, const struct cpumask *dest, bool force); +static inline int chip_pm_get(struct irq_desc *desc) +{ + if (unlikely(desc->irq_data.chip->irq_pm_get)) + return desc->irq_data.chip->irq_pm_get(&desc->irq_data); + + return 0; +} + +static inline void chip_pm_put(struct irq_desc *desc) +{ + if (unlikely(desc->irq_data.chip->irq_pm_put)) + desc->irq_data.chip->irq_pm_put(&desc->irq_data); +} + /* Inline functions for support of irq chips on slow busses */ static inline void chip_bus_lock(struct irq_desc *desc) { diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 0eebaeef317b..0f6dee35afaa 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1556,6 +1556,7 @@ void free_irq(unsigned int irq, void *dev_id) chip_bus_lock(desc); kfree(__free_irq(irq, dev_id)); chip_bus_sync_unlock(desc); + chip_pm_put(desc); } EXPORT_SYMBOL(free_irq); @@ -1647,14 +1648,16 @@ int request_threaded_irq(unsigned int irq, irq_handler_t handler, action->name = devname; action->dev_id = dev_id; + retval = chip_pm_get(desc); + if (retval < 0) + goto err_pm_get; + chip_bus_lock(desc); retval = __setup_irq(irq, desc, action); chip_bus_sync_unlock(desc); - if (retval) { - kfree(action->secondary); - kfree(action); - } + if (retval) + goto err_setup_irq; #ifdef CONFIG_DEBUG_SHIRQ_FIXME if (!retval && (irqflags & IRQF_SHARED)) { @@ -1675,6 +1678,15 @@ int request_threaded_irq(unsigned int irq, irq_handler_t handler, enable_irq(irq); } #endif + + return 0; + +err_setup_irq: + chip_pm_put(desc); +err_pm_get: + kfree(action->secondary); + kfree(action); + return retval; } EXPORT_SYMBOL(request_threaded_irq); -- 2.6.2.3.ga463a5b