From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964804AbcBPSkE (ORCPT ); Tue, 16 Feb 2016 13:40:04 -0500 Received: from mail-bl2on0064.outbound.protection.outlook.com ([65.55.169.64]:17376 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755174AbcBPSjr (ORCPT ); Tue, 16 Feb 2016 13:39:47 -0500 Authentication-Results: spf=fail (sender IP is 66.35.236.227) smtp.mailfrom=opensource.altera.com; vger.kernel.org; dkim=pass (signature was verified) header.d=altera.onmicrosoft.com;vger.kernel.org; dmarc=none action=none header.from=opensource.altera.com; Authentication-Results: konsulko.com; dkim=none (message not signed) header.d=none;konsulko.com; dmarc=none action=none header.from=opensource.altera.com; From: Alan Tull To: Pantelis Antoniou , Rob Herring CC: Frank Rowand , Grant Likely , , , Moritz Fischer , Alan Tull , Dinh Nguyen , Alan Tull Subject: [PATCH] of/overlay: of overlay callbacks Date: Tue, 16 Feb 2016 12:37:41 -0600 Message-ID: <1455647861-31973-2-git-send-email-atull@opensource.altera.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1455647861-31973-1-git-send-email-atull@opensource.altera.com> References: <1455647861-31973-1-git-send-email-atull@opensource.altera.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [64.129.157.38] X-ClientProxiedBy: BY2PR1001CA0074.namprd10.prod.outlook.com (25.164.163.42) To BLUPR03MB1505.namprd03.prod.outlook.com (25.163.81.23) X-MS-Office365-Filtering-Correlation-Id: aee5ffc6-197b-4727-5b0c-08d337008a68 X-Microsoft-Exchange-Diagnostics-untrusted: 1;BLUPR03MB1505;2:0uEOMnWrEPPNAf9hmfckBnAmB44M90fmdMaiJyzB+rkEK8FW1/aeF07Kftlw4X3oCXml0U9MQjB9m6XpTj+5TPYL/KgPKotzdTcPNWR/ygK/1Dp2FxFG4pJViMd8YGNAhuw4ckxPaOB0vg5YqDqLCd8MX6qzTIZ697sSGQ8Jz3n2yj69zNEJbH/IAmtrU0ge;3:9DYuGmcPp8hb1XjEzJPUz/Qp82Cg5u72x/3lNGDc0Pb0ckS6SmLvl9kpQkHyr87bi+6Fpx/2JAO0bZHd83DIVf15eHevv8buSCi7Lg4oT+JDisFwzngZDy+ON12ir0O8;25:I3wTb58PeOeMlG+/TQaLGd+OJr1/Pbay3+hvV7VWzWx17cvIbQJRCMqIo+mvzw+eqecyhFBvjjIZTb0p/UMvKun+v+FGNt/JcryAJV48tRFGs2qXl9aQO3xSYVUrq/rQuKPXC+aBGBnnwbBb1h5MVWtOSPIc07PA0vPZLBfUxg2to12ACwL/Ea2MtZV5wAzr2IJSgRggdipzhOqKPHNTdpr9qzFLF2GeW1MPzlDZXu8yk+DiiRfE8dP5trPQdF6ckZ+edYydqg4n/KNUP3XkSymVRk4kwQ14DpWVcgcOGeqFYbV9O50POJBbl+WjnxXw;20:POUjRZ0YItfDvMTproF0GoKW4qjiXsU1G/DdjIF5UVeOC6MFqqRJcU8kEbAcO9b4+6/dQ0zn7WAWwcWk1sSUwM4wGZTT+PXj1m1zdEAQeagtQtMWqptUnAlOYri00IiTof42LNHbc3HnSn5s4CqrCVKRiQMuI0PJxcF9cgaWs2k= X-Microsoft-Antispam-Untrusted: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB1505; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(80048183373757);UriScan:(80048183373757); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001);SRVR:BLUPR03MB1505;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB1505;BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(13018025)(13017025)(13015025)(13023025)(13024025)(8121501046)(3002001)(10201501046);SRVR:BN1PR03MB040;BCL:0;PCL:0;RULEID:;SRVR:BN1PR03MB040; X-Microsoft-Exchange-Diagnostics-untrusted: 1;BLUPR03MB1505;4:SGt1YaapWkfnMAgVCoG33KfrkqMO9FWxe6g2mDHiAT2dVkPcOlZw5fMo4HGT2QPBS9km4B8gPtQ8d6fHAKqj00iwzhG5YhnJwqIovTAJcx9CfGWSHv+Zj/E/NF3QLP9P9+2fkW87exojxfcG3qj+MndIJqrR00yTHk3sXo+BJE1bNuqJfTgcojCFvGlkY5hI/fwThKEwDR/MsGYh9D8RbhA1lBZXDUK2JLySDfkWn/lBjHn/RH3JWvzACHbKH/Elzv0P6PC8XpUSw5NNIFNYttz5HMDn+PWzHxO3z/bSqvbjgDXRTmfOTWmBlMcEAznQ6rTvYMaDwsLMfNGCkmPFYWqaYx8DQ1z7N8BKTuD6DH+gPZ10dUFxvWSlhNt5R3P6joQXqr2tRkUwCgZMRiiEGekzsq7MD9LejmrjugOw1mY= X-Forefront-PRVS: 0854128AF0 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(5890100001)(33646002)(92566002)(1096002)(4001430100002)(50226001)(586003)(42186005)(53416004)(2950100001)(5008740100001)(5001770100001)(76176999)(19580395003)(50466002)(77096005)(189998001)(4326007)(48376002)(5001960100002)(107886002)(19580405001)(87976001)(5004730100002)(66066001)(86362001)(229853001)(6116002)(3846002)(50986999)(2906002)(122386002)(40100003)(47776003);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR03MB1505;H:linuxheads99.altera.com;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics-untrusted: =?us-ascii?Q?1;BLUPR03MB1505;23:rMsRWUMopqrS0ogeWrdkRFFlkayQcUmHGIxdOoytB?= =?us-ascii?Q?uOzq5llGc7UpUwlwDTTqpFwB3kEo3gkRPCHDMO4rJivx2Il0Z1P7w2Yp2wWg?= =?us-ascii?Q?NZ7tTFCgjX7XOOcddosWeR/nx+WX/KIWVwW0vMEq2K5D43BYMMd6dNja3a7t?= =?us-ascii?Q?kL4H2JbFGKzlnNqdnTi8P/94xree7DkgupyKGVaAsEBAjr7ympjSOuxaeDed?= =?us-ascii?Q?o0QYv/tyP9jC2UVMxIhPtte45RmsjvO0TVuhdp9HSO1Qi+4xmqrT2KwI++pL?= =?us-ascii?Q?lHNu6+gu51o8iCbO6o0rMTNCm+KVC0sfl202qmNLSb/K/fInYWD0zthKVQuS?= =?us-ascii?Q?bZswoBlPxeViP2VCvNpvXL6ccoC6Up/qWJgKEGctkjYkbsEsV1v1JQRFHWaU?= =?us-ascii?Q?oi4UxWc+IrSK7C5/wYP9ONj+hV3wqo0aZmp3d8zo+dVbuLrqt+TQDasVUO2/?= =?us-ascii?Q?ybuXl+QxIL5Kmf8ss6fg9dBRoK/VWCUa4gshEL3umPn10SZOpvl3N46CKIbx?= =?us-ascii?Q?PMGfK1GpOhgEG3FdS7Z8Yt416+elBs+qA7wSvJ6Bij46ajU1x0lBTl1GUtVk?= =?us-ascii?Q?P40QDp9gjCltTJihCxigtgCADUrEXPxdDB83O3jk+DTJVVvYQOIKZkxJZP0s?= =?us-ascii?Q?lFhNmsW2pUueBnsg37AFd4C5X1O5GzbBG+g9tw/xfHZxbYjtNd8gv0NuNGzc?= =?us-ascii?Q?8TEGerIotN4WJPArxqJs5cuHc/t5YYTy79RO9NqpPCI400GH7F+vxHCL4Otu?= =?us-ascii?Q?sUURFcEiZgQF1CJlb5YMd6oyf/VvCa2dxIilHJL3cm7WaBfNCK5X8VGasoTq?= =?us-ascii?Q?MgkIRwkMMEVs1JY0Qg+eNFP3Vx+u9fbKCiByFAhBCeDdg4FnJUpgOC5D4kFU?= =?us-ascii?Q?xxjIdmwiOszq8Zey4wRr4AGz8xpzp4LQnvJZkVYLMr74Q4NFVDT0x1KxuBjN?= =?us-ascii?Q?ON6Rh1qnqvGWLiyZV6kHrpM0efLTw0NPqrIDzarWpTKPvhfmL24NaIIvWWdu?= =?us-ascii?Q?nQqGDQ//4PNCgGoE5Kz989d?= X-Microsoft-Exchange-Diagnostics-untrusted: 1;BLUPR03MB1505;5:KmIoQKeQssmF/xhxVj/NQPKYbKXQ0tb9eypIdUaItaTMA12A7zeDmVLxEg7Nu+kBEi/OlXRJeQ55Z+NS8vBw01lb/y3S/YlXvOV3zKhIHZpyT90/PMlCZRX7MgmS0ENzcXtF4CEF97A43IzUloZnMA==;24:YBUpUfTaZlvxaL7nXl9Oh/DVQKw+Zx//fe/gJCOp4C0R66LHgssKp/c5IR6sd/qYNZY+HaHRUv6ZE7QbjmEulcSWAz24SD+4Cz5L0Mmn76k=;20:90qLZug9XZLp7lwYVWPJl6y4kCoa69xK2FM99UqQkCYBt/vjlqOCzy3xd+Ef+6lJKjcs66cXAZoG1IY00Hd+sFy1b4ho4YWZl6Bpb2a1rcoS+sgrJOm8gdYfrYGiHAcFCAL7FWMqG90sBb0b2/LwApDn4iYB+bsQkOInmrC0cdo= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR03MB1505 X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: BN1BFFO11FD033.protection.gbl X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD033;1:pkEPuHxI1g1UwgSAZIJcpcarRNZ/mFgB/JZqLlmEOmKykpBBvJh77WahZwvGHPe4zHpTXYXEjQ7grhH9WUmzqJBNb1rt2HBq+HiQ0hlQckWX45FJC84KyIa2ZinG3h5uqOFSdF1uQfTTXvh2Oy6+HgBtci7n3k+85rAOHlSixAdr8jwAxp+BIbILO3a/N6LfRSE4eBSzwHLoLRCeQJSuPHEkqxQSm3dr792g3FWmYB1gU08kHkC8l7LVztnEpP/zM0FgGZjUpPoDIsQdm8NOA0xKPdGsrRmsgmOZWdw/QaiALhfh2CjEvlDX3eJpd57YFF1IZHCguWGzMyyW77KiN/XKwCreqtcFoIbn5tY9pR+plGHdLgZxqmFbozSN0G8vykB+SNrFkz8lpN+DlfRx99efAUFasD5YgENt/lrQaIs= X-Forefront-Antispam-Report: CIP:66.35.236.227;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(2906002)(53416004)(47776003)(229853001)(66066001)(5004730100002)(107886002)(106466001)(4326007)(105606002)(86362001)(92566002)(50226001)(5001960100002)(5001770100001)(16796002)(76176999)(1220700001)(77096005)(50986999)(1096002)(122386002)(189998001)(40100003)(19580405001)(48376002)(956001)(3846002)(3720700001)(4001430100002)(5008740100001)(586003)(87936001)(5890100001)(6806005)(11100500001)(2950100001)(6116002)(50466002)(33646002)(19580395003)(7099028);DIR:OUT;SFP:1101;SCL:1;SRVR:BN1PR03MB040;H:sj-itexedge03.altera.priv.altera.com;FPR:;SPF:Fail;MLV:sfv;A:0;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1PR03MB040;2:sq/2T6ztIafV5RRQDu9YzpOotdtFyq54Bk+Gdmfal7/vlhq0BOQ6forVP3GuYgP0CJbhx2ZRCIVXfjyAzR2Y4ntHi5FRew2iCEDny00HS6BH22Zqpnioa2kIO6Nxbva8i20qJ77kPLklHBLnJGKXCw4G/Pfly/SlzTR+Sc5sMwDZBHc4b0fr8AC8Vw2AIxqk;3:Umjcbb7VXGdCVO0Cv0/n8g2eO18PxDrc8cN/9QuJoxzJ0IbZmQxGwH6UHN0sSrl58NwA7vbtELCH2013qiJfAv/2ylZ9HyTLoZdgHxFCiNkZivZ6r7mp2dVKLMTzQkDvA+CF8VpL8he6v5x/qPP9dSiQ6b79plBlAUEqjiknWw0kiGCkgOXcX/EUEB4JKUw1GPVjM8olILZl4OfeAqAPKFqwzJYELzqItSLXUHEuvWHxiUqyEoHmhSrgHrZ4Y+cx;25:alPyyxWts0XLrS7fV1T2PSyAHntHcW+EDH51LJKUpp4TlSZIbZMfBb/VerK1hp1Z9bJFXQWAA0JZjcTPngiSW/g22GwhaKtzltzptQSaPkaQgZJz2WxkzxjGykxkXRR2wW0eatRRaCQ5RVLzDrES7rX4Qvo6ilsGQBBPNLdRSSBpH60u/a3OK9SEbHkOJvU8b/QotI5bGv5NFkJ5LBQkkT7u2uoq7TclhQxAQ0q3F+JdM3fv968NCQRjZzZqyDvXqvDAQeDlEh4dR+1TUEO9tEb82HWIGXSvHfqYPBDOaCra8IqmzEopMRd2Eno59QXZ;20:X6V5yx7AvQ3o62dlGuR7y9AO5NBaMlozPo5/rrqG3RBep4B/ck8u67Lft+4ExYsDU9llvSQ5Xh4oGByqRrHEfTeIunbVsJElhNT18lUMQ8+vPSJD8DGee8A0FqdmVpHqkNCxah5+srKtoL43mIwTJ5zvoVl2Q+FEr9+do1odpu0= X-DkimResult-Test: Passed X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(3001016);SRVR:BN1PR03MB040; X-Microsoft-Exchange-Diagnostics: 1;BN1PR03MB040;4:Hi3QJANyomXcY5hBl0UQvMJpAYbrvQAi5IZSI+OzazGXBX5/hWa87afNg7pzHgECQs37/ipysgFtZDKpdrALrT/GyWyEyTI+JJCnIHRWh97IwsEvZmSNeeSVV18nKBL0WVdlB6nR1dEaZbcco24z0w9vvb83/uJRu6dsQYU7Vkmniw2N4triOInxxPkESkXucIMmRip9/rKC0aL6/wRDX+vW5TAC9qfBJN7Xoq2OthdB4irg/Xu588pENmeuyskr6gSOZP82T4AYcggjE3X+DibUZGzjiLgAtH07RjSI3dO0pXPIP8xAzhYgFCScY8DHhtwUSUoTEqiNBwwX9at+maft6cfv92uvvk0ucNvqf6nJiMkwxP2dzB1lOJ6AJqEcm6rrEWG+qfp/8Rt15yZCdfAIIdvYEIY4huLZxbyOApr5xcxvH9mOUY39/eOOxWIH6MsrxJrse+mThgVECV/FVbZy71Lr5/MA9tBOpjUJbKrNQMfzTCzP9/6D5nJGSJ7t X-Forefront-PRVS: 0854128AF0 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN1PR03MB040;23:WhPtstWjcbl+afIPY+3yXIvjqIPMkPkkEKgSHtu3PG?= =?us-ascii?Q?E2Gx7OCb0PtgMoCKgXMHjIwoYRBOlrzbMm6QD9MZMR/w7GLtgN4ZtvREI2bC?= =?us-ascii?Q?/oFsYdYVfHrcnvqTFjUe34iR41ky2c2jP9AiyXnnxSRuXIbLCWrB1bONAErp?= =?us-ascii?Q?9E7ih7WjTDP2+95C45QJSVpCFAbwX3XFKmFMsmIhm6hJH2eEMl8rb/1gO98m?= =?us-ascii?Q?03ft7T9IJQdP/tTmk/GZwCqu5AQxMmQ40lTbwgmjCBFYvxbDRNTNDmhsl8/v?= =?us-ascii?Q?jLHehgKn2Jw72u7PtoDEXoAsaFLi8ggy7aHiteKSKHVtM50SSKvpg2nGcBHS?= =?us-ascii?Q?X6dnA0mQPgBs2Lm7lGE0bXox0R18NWA+BRMj58pdvk08s3io+Na4wdDR1Yr4?= =?us-ascii?Q?J315R6JcD3tCfFR6foCRaPiKV5/Dh8xjifTtDNJ1aXA0vbR7J16EM25Bb5bW?= =?us-ascii?Q?XBcMgU1mqWSJ5sXnaTgsDO14zVS3lGOpR/i5yRzhm4gkxhaCg0hipftiAWYx?= =?us-ascii?Q?c1iuy0xqdHeZbFj0qJKqcoFiDDsga9sX0JhiF+9UlSKlEawhL7B3E/xOqBhw?= =?us-ascii?Q?OME4hfSyx7zfIip98nV+JuXvxHicC4cUyAl+GDkhoHqC5Q0cOr8/Qx0KhzwR?= =?us-ascii?Q?gJbqWD9mdQx8CCrIlthjQhUs9wbBiSWNuWlvv1eqCQqTeLN91Gtuxq7whwsJ?= =?us-ascii?Q?M7Ha7sOqQObI0kirQj+HQ4YTgL2y+rqxhfjJTwR3maR7ILYbgFNtMuGI64nW?= =?us-ascii?Q?ULzWey0KWl1vCimVRT3cOZ5QTMCcxxBSpz3sV9ANOqIfS82cAMRKzyWSeFON?= =?us-ascii?Q?1BCnA1TdaXybdJabiEjyGWPuy2MMN1CNeyHKJiVmNITjK3WWBymVnqvuODUq?= =?us-ascii?Q?1tDDTjOhf6xYC77rc0+EZtY7ch6lD3P6cXl90sAeYalyNDMM3NXz3lwOjBuz?= =?us-ascii?Q?UI0P9vqMrSkinoo7JPhx4RMZpVZ44y51u8Di/rtwCwqTooFhNOWC3kcuc7Gs?= =?us-ascii?Q?+moNqz2plCbcC5t32LWMnGf2G4VqtZV3iM6oIxnZcwRalcS98x6gPSOgG+nU?= =?us-ascii?Q?KA/KxFx0mUvLVcb1RCn6wfFblRRD0yrpBU6EuOum48w4OEdMp7dFIpc1l58k?= =?us-ascii?Q?JzgOZbjjYJmztfSpt70+/1QW8qyJLtCIK9rW/VR2tX4uVg12638Ag9czM5dh?= =?us-ascii?Q?L1FTN2TaWLD1gbZ4G2aHJ856tHhIDgZai2sLctiUwA6y1zU9pHorGg/dO3SP?= =?us-ascii?Q?mrGQMHtCfdUMLcc9lHPEiL0cQW6itMpvx2BznP?= X-Microsoft-Exchange-Diagnostics: 1;BN1PR03MB040;5:wM1D7AK25ikISqAFp6h1atSPDAhgAyAcnxJ9p2L7600IlDKgUIkTxWqbBZuz83Z8Fu85ugNgCE5bLSHh+dL3oHmCXrVRhEpX1LCC8VNlQZneG8R6ztK5Ei9pyoiHHfuCdGxycdAFfgv1ISb7SNpFow==;24:gymx8Xwppex1CnC3i+1q35ayELvr6rpcyved2xeKGa/hQwodm5XbDKy7bRxrO0VxgzRNmyHH49XKwaOIkId0UIHlqLdWuyzExRBKl9jE4pY=;20:MEd5/gupKTZE61jSJZQcxWrZ1iKakjCmLEOXwRHdj5uUe9Xu5urrBZjkv1VysoNqRCXT5RgMW4n7T21slKOwgN16qP8rKTSpY9QuwAv7isnce7SnLKMeRMiWW4xK3Sfp/Art2K2bCQUkltL//fSrr86mjyvlu2I9ijelvHpk9tQ= X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2016 18:39:44.7406 (UTC) X-MS-Exchange-CrossTenant-Id: fbd72e03-d4a5-4110-adce-614d51f2077a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fbd72e03-d4a5-4110-adce-614d51f2077a;Ip=[66.35.236.227];Helo=[sj-itexedge03.altera.priv.altera.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN1PR03MB040 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add overlay callback functionality. When DT overlays are being added, some drivers/subsystems will want to know about the changes before they go into the live tree. Similarly there is a need for post-remove callbacks. Each handler is registered with a of_device_id. When an overlay target matches a handler's id, the handler gets called. The following 4 cases are handled: pre-apply, post-apply, pre-remove, and post-remove. Signed-off-by: Alan Tull --- drivers/of/overlay.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++- include/linux/of.h | 31 +++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c index 8225081..ee88e4e 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c @@ -20,9 +20,13 @@ #include #include #include +#include #include "of_private.h" +static DEFINE_SPINLOCK(of_overlay_handler_lock); +static LIST_HEAD(of_overlay_handler_list); + /** * struct of_overlay_info - Holds a single overlay info * @target: target of the overlay operation @@ -56,6 +60,80 @@ struct of_overlay { static int of_overlay_apply_one(struct of_overlay *ov, struct device_node *target, const struct device_node *overlay); +/* + * Send overlay callbacks to handlers that match. This call is blocking. In + * the case OF_OVERLAY_PRE_APPLY, return error for the first handler that fails. + * Otherwise, notify all the matching handlers and return success. + */ +static int send_overlay_callbacks(struct of_overlay *ov, int type) +{ + int i, ret; + + spin_lock(&of_overlay_handler_lock); + + for (i = 0; i < ov->count; i++) { + struct of_overlay_info *ovinfo = &ov->ovinfo_tab[i]; + struct of_overlay_handler *handler; + int (*callback)(struct of_overlay_msg *msg); + struct of_overlay_msg msg_data; + + msg_data.target = ovinfo->target; + msg_data.overlay = ovinfo->overlay; + + list_for_each_entry(handler, &of_overlay_handler_list, node) { + msg_data.priv = handler->priv; + switch (type) { + case OF_OVERLAY_PRE_APPLY: + callback = handler->pre_apply_callback; + break; + case OF_OVERLAY_POST_APPLY: + callback = handler->post_apply_callback; + break; + case OF_OVERLAY_PRE_REMOVE: + callback = handler->pre_remove_callback; + break; + case OF_OVERLAY_POST_REMOVE: + callback = handler->post_remove_callback; + break; + default: + continue; + }; + if (!callback) + continue; + if (of_match_node(handler->of_match, ovinfo->target)) { + ret = callback(&msg_data); + if ((ret < 0) && (type == OF_OVERLAY_PRE_APPLY)) { + spin_unlock(&of_overlay_handler_lock); + return ret; + } + continue; + } + } + } + + spin_unlock(&of_overlay_handler_lock); + + return 0; +} + +int of_overlay_handler_register(struct of_overlay_handler *handler) +{ + spin_lock(&of_overlay_handler_lock); + list_add_tail(&handler->node, &of_overlay_handler_list); + spin_unlock(&of_overlay_handler_lock); + + return 0; +} +EXPORT_SYMBOL_GPL(of_overlay_handler_register); + +void of_overlay_handler_unregister(struct of_overlay_handler *handler) +{ + spin_lock(&of_overlay_handler_lock); + list_del(&handler->node); + spin_unlock(&of_overlay_handler_lock); +} +EXPORT_SYMBOL_GPL(of_overlay_handler_unregister); + static int of_overlay_apply_single_property(struct of_overlay *ov, struct device_node *target, struct property *prop) { @@ -370,6 +448,13 @@ int of_overlay_create(struct device_node *tree) goto err_free_idr; } + err = send_overlay_callbacks(ov, OF_OVERLAY_PRE_APPLY); + if (err < 0) { + pr_err("%s: Pre apply handler failed (err=%d)\n", + __func__, err); + goto err_free_idr; + } + /* apply the overlay */ err = of_overlay_apply(ov); if (err) { @@ -389,6 +474,8 @@ int of_overlay_create(struct device_node *tree) /* add to the tail of the overlay list */ list_add_tail(&ov->node, &ov_list); + send_overlay_callbacks(ov, OF_OVERLAY_POST_APPLY); + mutex_unlock(&of_mutex); return id; @@ -509,9 +596,10 @@ int of_overlay_destroy(int id) goto out; } - + send_overlay_callbacks(ov, OF_OVERLAY_PRE_REMOVE); list_del(&ov->node); __of_changeset_revert(&ov->cset); + send_overlay_callbacks(ov, OF_OVERLAY_POST_REMOVE); of_free_overlay_info(ov); idr_remove(&ov_idr, id); of_changeset_destroy(&ov->cset); diff --git a/include/linux/of.h b/include/linux/of.h index dc6e396..def9481 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -101,9 +101,33 @@ static inline int of_node_is_attached(struct device_node *node) return node && node->kobj.state_in_sysfs; } +/* Callback types */ +#define OF_OVERLAY_PRE_APPLY (0) +#define OF_OVERLAY_POST_APPLY (1) +#define OF_OVERLAY_PRE_REMOVE (2) +#define OF_OVERLAY_POST_REMOVE (3) + +struct of_overlay_msg { + struct device_node *overlay; + struct device_node *target; + void *priv; +}; + +struct of_overlay_handler { + int (*pre_apply_callback)(struct of_overlay_msg *msg); + int (*post_apply_callback)(struct of_overlay_msg *msg); + int (*pre_remove_callback)(struct of_overlay_msg *msg); + int (*post_remove_callback)(struct of_overlay_msg *msg); + const struct of_device_id *of_match; + struct list_head node; + void *priv; +}; + #ifdef CONFIG_OF_DYNAMIC extern struct device_node *of_node_get(struct device_node *node); extern void of_node_put(struct device_node *node); +extern int of_overlay_handler_register(struct of_overlay_handler *handler); +extern void of_overlay_handler_unregister(struct of_overlay_handler *handler); #else /* CONFIG_OF_DYNAMIC */ /* Dummy ref counting routines - to be implemented later */ static inline struct device_node *of_node_get(struct device_node *node) @@ -111,6 +135,13 @@ static inline struct device_node *of_node_get(struct device_node *node) return node; } static inline void of_node_put(struct device_node *node) { } +static int of_overlay_handler_register(struct of_overlay_handler *handler) +{ + return -EINVAL; +} +static void of_overlay_handler_unregister(struct of_overlay_handler *handler) +{ +} #endif /* !CONFIG_OF_DYNAMIC */ /* Pointer for first entry in chain of all nodes. */ -- 1.7.9.5