From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030243AbcBQRnu (ORCPT ); Wed, 17 Feb 2016 12:43:50 -0500 Received: from mail-bn1on0075.outbound.protection.outlook.com ([157.56.110.75]:6465 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S965426AbcBQRnn (ORCPT ); Wed, 17 Feb 2016 12:43:43 -0500 Authentication-Results: spf=fail (sender IP is 66.35.236.236) smtp.mailfrom=opensource.altera.com; ettus.com; dkim=pass (signature was verified) header.d=altera.onmicrosoft.com;ettus.com; 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 , Pantelis Antoniou , Alan Tull , Dinh Nguyen , Alan Tull Subject: [PATCH 1/1] of/overlay: of overlay callbacks Date: Wed, 17 Feb 2016 11:41:25 -0600 Message-ID: <1455730885-1514-2-git-send-email-atull@opensource.altera.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1455730885-1514-1-git-send-email-atull@opensource.altera.com> References: <1455730885-1514-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: BY2PR06CA061.namprd06.prod.outlook.com (10.141.250.179) To CY1PR03MB1519.namprd03.prod.outlook.com (25.163.17.25) X-MS-Office365-Filtering-Correlation-Id: e2012e66-2086-4ea2-14ed-08d337c1df7f X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1519;2:rP6Z7W91djQpWIhI4zBEFXZQlg9A+3VAwrryAjrtrhrA1KGqldvU94Uuqo+FfFpgEhjUmVRCi1F+wjTUNY1Ylg+7lu/EYacMAudJ0aiDT80Lj16KDbLB6hsp4WEwuUGJb+yrwV+IN3qvaW4VCOVoatbWfrFeyeRES5naOCVGPtTMCqye0gtK+aAxZZewkhcL;3:+7gVkqF7RYkx/vcC0gsl6CjSds7rHXvxu0HUqkuY+lhrE9QY/dfkx402LfHuCefJdKA/1L0WZ7FsRn0ccR4lKnITnkq54LobOhwfAsmuXow/jky+lu4KbmTFE4js72Mk;25:opCo+AXhfqTk/5VN3Kebuwy8vm+/m+8SwR+RwNx4f5Q8y+o9C14l4NuWL7dpFTmd3hIIFe6uLfsqIa0mzhG3hQbwNF8sQIL5eyNi4f2YGyRbnybOXPwc50Ob5WSU7TnAM6GEJf1q3EHlYhr97CvSJFyAvZX5iu05O6tMqEEFcdLLGnFpYFjMK+f8xyTwv/3/u8jzeyBggyuszHUy4/nIYF2Lq2r23jWx9+O8wx09Vdz0pn0n7S/pOdlJq7DoI9XCFF94ZuQxMtEnnRmkYve5yVgk2PkvE/+merzfLOF5PCAgOsnEksvja0ctyWvlU7gP;20:77n/Fq/0Vsj4VWE99Ww2USf+tich/pIyKErpOX98cx4bfm5Vi+YdKRLDLJSEsCtf9hT9wwoRClAKB633lfSNCxGGTKJdgNC1I2VBmeDPfX6y2gdX3BEwRXUgRDd/Uosz/p0LpbDMKy9xrZUYxeD0Cj5Irkh6S4SC4+KLwnS/abM= X-Microsoft-Antispam-Untrusted: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1519; 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)(8121501046)(5005006)(3002001)(10201501046);SRVR:CY1PR03MB1519;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1519;BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(13024025)(13017025)(13015025)(13018025)(13023025)(5005006)(3002001)(10201501046);SRVR:BY2PR03MB042;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB042; X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1519;4:p91WS+9YJ6CYcPZPPoqEkzOEZ3ZdKjN5+4wr/+U80POJOPt7Dy/8rxTGaagooa1BnFmDk3PdauG0b4UshoFL9MEl1QX3n+olpnW3bwbucCANjZh2YAUbDRFOt6w+CcbWabdGXoHOOtpeAOS26ZfovkbNbZ9Ef1syt8E6tVlaSmftER1an2fMAKcb5JETyvKPBXmFY3cQriwbUGiQEF9s2skilqdIGIng7HZsNCsK5viHQRJ+MszCcjXZt/Am42osy65qx783K9lHqgk2RNzqHhbF+2w85sQCwqE684LpQdvfyLrtExXpjH9yAYvxcVt37N33slRm7d0lC9ib2OMDX1bBz15GyODcdz/ijDMClUqlay+NaCsKXUSR0lgXej/v/j9fZ8i8+Y0qSDLvWkwS/eAnohy/z8XrAsKSOxDn46U= X-Forefront-PRVS: 085551F5A8 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(229853001)(53416004)(86362001)(47776003)(40100003)(50226001)(87976001)(189998001)(66066001)(19580395003)(50986999)(5003940100001)(19580405001)(76176999)(4001430100002)(5890100001)(6116002)(48376002)(3846002)(5008740100001)(92566002)(1096002)(122386002)(42186005)(586003)(2950100001)(5001770100001)(33646002)(2906002)(77096005)(107886002)(5001960100002)(5004730100002)(4326007);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR03MB1519;H:linuxheads99.altera.com;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics-untrusted: =?us-ascii?Q?1;CY1PR03MB1519;23:ZK4HGS5CP1edlWe68P/h+uMtAsbD25D9Ln6jHYzZf?= =?us-ascii?Q?KdyhTzUGh+iVDi7bm9EFVuq0h7YMpgRqO+CL437McfJ1A0x5/GDBKI/YtlaT?= =?us-ascii?Q?EkX5KQzki9nxhkoml+nH10qNXqA4zfjEq/JcOfWxRNVlRipzzZINKvmdxLiI?= =?us-ascii?Q?MaTXFr3K64aYabTq2fug987XzLQCPFuR7CR92QH/k48+HnZrNu0vtg/h1ZCU?= =?us-ascii?Q?QsLrWLYvjmlE1UWXU8UnP55pGNdsRGr+KN0mOgm55IZ0hSi/2AMx3mrC8i+X?= =?us-ascii?Q?cT+0lBh0wON0wRVPKGyeVtWPsc1tHhCbDggYUpzhlDzTUfwmT7VlFBk0mCd7?= =?us-ascii?Q?gpewkOgpio7V1H1BGJVLajauMEeZDXZvpRyP8XRPr4d8pYNlygVUhDmfgLT6?= =?us-ascii?Q?GBTwtrW7GO8ffxvu/s3eXzEmRjiSujrijLvVzJgCCa5/O8ca8t5MhDUwbWBT?= =?us-ascii?Q?4vxD9MewNTJTQwNfihTxTCWNFtC6Xos/TNVN0MujoVq2CONzMOPXDDHLuhkv?= =?us-ascii?Q?1fP75upLKGd77Kv11tGmwqosmQvZQsCgCOkufwim13TVf4KTZCD2QpZ2tf5p?= =?us-ascii?Q?UrTXYp6s6CyPrmBy9RQfC19QsvFwNvb6B/c5N6Tkbw4kYWXXix9aGh+8DDvG?= =?us-ascii?Q?2bv2g4sz0+jv9Ru8jsfGbCg7ON/kJloRH4nx/Mlk7JNf4MkUZeDs/EJNHojn?= =?us-ascii?Q?hoHbz88r+Q8zfajGYfnk4KmK40dZUdCUeTYmq2RmvxNP4ePfnyu3Kk9GyU7j?= =?us-ascii?Q?4LN0WPso5ATqBMrgZ7msihJSpXvYksRAV1fW2ku4wYE97LP4inNXFUd6dbVp?= =?us-ascii?Q?m96AQgpEEBrEia4KRanzjcMyTocoYwJX8jpv8vxdRuzfYhjdWjTddFMQRevG?= =?us-ascii?Q?N4k0cctkYqwj0s4ygfs3yMnptT67BXOIlCVNHNYbnBeTbbpE1wv0NsgeGGXA?= =?us-ascii?Q?7n1gsIpWFOf2lxw8NW4WgXhydawCjiLOgEPJkV2uKILT49XZzXaWACiUfZ36?= =?us-ascii?Q?kv4GEpMP+tSSdMGRyjHA3xw?= X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1519;5:lP/iT629ovtWq7tAyI/t/6tBOmrKuE9QB8HKcKc4PnpJnsJUoO+VkvdV1AnZ7z769zBOtZ/3B5X3MkNX59xZ9gLwCbJkQERvx3o6H/BBBYiZDdLq/wInkNIdHNMwwgYVM+BAPHeAGNNl/F3ImT/hEw==;24:MsLS+XYq20E0U2OTFaPGKIJEdQF5DHzCTxqZFMN3dSSq36qR6hgQNWMFrEFWzuRVtotcSyFe54fhytvpyE+CMSCMcvOvjZeO5S1TX/syYEI=;20:0+xrKkZefR28PfdkYqwYTIDEe3UYKzQiyR1ngkRYgyl/5fJC0y5kjdrXKO6PpTczj5RZoUhg+ykuj3sSf1XlLBWHNcmAMU7vH3q+GO/2zwrjNWhM/VuABdkBmF/SggmJJS5Br4JXz8TrDOwhqcMIr5oNcjb9KJGlpqvrT6wBEw4= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR03MB1519 X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: BN1BFFO11FD047.protection.gbl X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD047;1:6A7GL40kU5xLJQ0IID+HX93c/CdEQ1bq1DxTElNySeYEYyXGgxXNrZnfKjAQMDp6YnMkqWYcX/uFJ9KLK8o31uvODp/ivadhOwwEnEZn5E1ueu14RlLW1cYMPWEqy1rNKB9wqCEHVpMlek6RvITngAWR3aILnK602vy9xy0gsYFxev0oETfpToeIfQBSzWXRSwKbwAA2MCk0Yqo989GPmDIqZMqtt9gFxI05kEmYudw5aR6DJZZaMHhIXlW6jsKoYEOKxrUiCmkUoiJqCuGVcbyhjJm/gyKx1023wQREqvm9/wPCKa7RoJAtK/Sh17tRbqXVoLpYna3xzbmBeDQH+3fU1kHb23bJyHeRVMZB9vHD6ErsvB8o+ELft11nmUUlEr52n5305bT8UpLSTOUgORCv6j0VrgaPEQNO+antnFQ= X-Forefront-Antispam-Report: CIP:66.35.236.236;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(85426001)(3720700001)(66066001)(5003940100001)(586003)(50986999)(53416004)(106466001)(11100500001)(229853001)(21840400001)(50226001)(47776003)(5890100001)(105606002)(87936001)(2950100001)(48376002)(189998001)(92566002)(77096005)(5008740100001)(4326007)(5001770100001)(2906002)(33646002)(40100003)(107886002)(5001960100002)(16796002)(19580395003)(6806005)(86362001)(19580405001)(122386002)(1096002)(956001)(1220700001)(76176999)(6116002)(5004730100002)(4001430100002)(3846002)(7099028);DIR:OUT;SFP:1101;SCL:1;SRVR:BY2PR03MB042;H:sj-itexedge04.altera.priv.altera.com;FPR:;SPF:Fail;MLV:sfv;A:0;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB042;2:Wgiky3sczHdN54OhCnKe+n43rB7n8jQSgp2s2XOKFB4SSwUUCAiGW4TFXs2N5n6DVeefI0sNn3/7h13ccIZhRvEhPGxylht62FlFWvRZ8VYD0mpoiy/+m2d2j4vQLeOAGxFdNCFS11XKKFFtBMNB+VgV5j3bPi00EMZC5XKkHblxJJHGPNwrHdE7dn5MvpEp;3:byElRY22bMo9HpA/zAG2KrS2/XBNCIlR9lzuWJUB/Q8oUKNZdf10LOq6P66NW5CBNLoVSeJ+rtc+H1sp2SXv3tcWafjcrpgcNzSw9FlsvcS7cUJ2O9U5JsU0+eFQVn3lFjR/hIG1LLXyKYM4gjK3+bl3lsho7xlVMqENAQRx90BLaSDRyB6KES518Ok1+M9okKmvlWg8evlYHw6+ZBTM+LbtgE8EPL7n6MVAvZt0xaT27YYzhmJsgdxnF8ZWNTAT;25:GW5MjfUdJSpnz1H44fUp8nXhRlKad9QPIN9h1zz1/8zeEpNzDfJODRJEJJ+hTlmpBhw92DMd4Y8gwobUQ4epr8K6U/VXnzySKQrrP414b6MSL+gPDbxdf+8wx5A0AToOZHT3RnBwLh56rxkKLaIGrnhTXBz0fdEawAr9hkZ/FBlZrgmOOj+H/MrKepR9/xqzqeHQ+PmsRbgFR+dZo0LEXqR7yffv7qhfmptqSRyWPZnulYk/dHqquE+ggjAhhY48+ATdmwNnNlJ1+VaEua1Uwz2VyP8rAV9PARV/Ge5AsQcFka6Mcgp7tyz5CTtTUXSV;20:J6LCc3KESjzH86lW29ro4bapgBOl1IkcIj+RIkpwiTFv2sL1IoNlgUpsp0TonEk5RSQHsHKCi9u0UYw262MfxLQ3muGkogo4a7n6M76sTPMFTrBtvjk2aSKrxfZn0ENhtxbxRwm0jfOQyMrI9i4YIh0UGq0EkI6k4QWqjWOiCWc= X-DkimResult-Test: Passed X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(3001016);SRVR:BY2PR03MB042; X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB042;4:PoWIuATPatP44vs9BlQQNmX45uI25icC7G9SbcnecfiOKSFVomySDwLGhmCvQSb7c69DNq+J4Z4RASvZLnehi0E2qHvv9rhPoxXYkUPKSOoXZ7p32QiHXr8kjZbMXIYysFRNhkdNQdnIxnDac1ZNb8H7IQp1wn7eSKrNxmfhn61VxqnwzmELkwctaVmdjiW0wCkdJeOmcwaWVD9e17NZpC9ZtxdvC5DTak07mjXpgHYUutT40n/DGz0EQuGyS6WsURMNGpEGAulSsvWFiCjWo3bAoyhSoH/h+bvlr223Xy1WCYlYNxAZgXqDxJz7EnWdpSDs2KSCXntoazEq11DTxK1t/kNPCt/hhhHx5c9L6iPknVVcylNR2E0JgvW4s6FwzdQySMQgaLJv6VEsFcaxSz7Vbgz3CWcV3a+fCp/wvbAwtcUCIkhxl62ukVLgoe5/2I5Xn38Onx0MYGbrbSFmm+/JG2z8PtBWdKSObWxefaO7UdB8DZZe3/6F1aiHgOjG X-Forefront-PRVS: 085551F5A8 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR03MB042;23:GVkGO4VsJxRPBkW8CunNZ8F45nGQ6RrgtMJjhFqXK1?= =?us-ascii?Q?DcTXwqzL/rufRM13joruIYfC5RdWnoOnQPDEm6qqY3Y8YUe65hf4dsy/rsT7?= =?us-ascii?Q?3bSCH7cWIBoFnmiIicB2wmWuJyY6tDV1ZRDhuh/3qONjD37Egw3S5/r2yhbc?= =?us-ascii?Q?8tWiVfYSVH6Jq/KSycQO82zCJBLUzRaS0hfcPsoE/5jAsT0toaE1OpGGiPbc?= =?us-ascii?Q?SkCKtY0sSO1xb4cRih6gc4oBk035TUCk6zPWyd8jKu9QTxM57W5gPSnm1br2?= =?us-ascii?Q?HIH1MjUVRShn9/MJ9WbYhPzbHYv9M0hFk6BM8DQ84g8aZSW6ns3KZDALD7hV?= =?us-ascii?Q?n3t+PRtijWSW2TIwG7azjf8G6cEJy+viDDIfcN0+K9mVeYThEyfmymx841f1?= =?us-ascii?Q?wq31bjtzw5f2KLkiGxBImx06E0xg+lr8jEeILE8uyd68Zjs4Ub9MMyHI8XoU?= =?us-ascii?Q?Pmx9vk3jxlkFMZrdChxYhVrV/mHMHvH7M3vERW5MigI4to3i50Moyx+I5632?= =?us-ascii?Q?9hPHsmeI8vZDLc5BYmEgdm2lJvMlBzxCI3UXCbcb9olQA5ChBV5FOiFQkNaS?= =?us-ascii?Q?sT5y1sj4sBEfybdYld0Vm9zMQ9D6mrk/AutoRNEBFDxboxCbNP5MNFkyEzL2?= =?us-ascii?Q?bAwqge2Xkigmi4EaT8PFpYUBAWLdyw8TIiE2IhDG6mlg2/jC7ZvZlkba/ox2?= =?us-ascii?Q?4RwoLy9b8dv7Weojje8q+mIcC4PpiTpyKXzxTawN06aklW7vkms3o9g6XUs8?= =?us-ascii?Q?uEHCpGB7ndVUdjswXA+VBC1VYudCWtM7M0VuXC4LpeO2XV5N2/ZOMoJgSpRl?= =?us-ascii?Q?twAOVV8t3dOd+P6fUk7VCmRCcBGbc6gjDjjOsyPQ5GIirg3aYnBpw+oZVRL2?= =?us-ascii?Q?izcSxOIcJL0xNEYGsSS+KLXbET6+uD3rxWNjs20fbj8LnIEaH+/Q0pmPqasq?= =?us-ascii?Q?RAJsICHWH6wTSJ2P5uWYIzroQQsyoxZgO3sE3Q8jU8/AY/lWuUSyf0G3rY4r?= =?us-ascii?Q?E3gf8fuZ94/0eKTgm2ow6f219vZpoxw4dvcEXHErb8ywZOLr1EkZ0/WEf2dX?= =?us-ascii?Q?YRuIWXAioBPELyZRhhfVYB9e95J5ldyaT1+Qdt817+/H5S4FBZZaOiy+tO5F?= =?us-ascii?Q?WOPI+PgVOovIbpeeTlGvmWA4AH6Q2Lx60VWfwhPYEQ9pH1Ey4PMtMinEnENg?= =?us-ascii?Q?PRjjIVcl7lIEvCFvF9OlH044dochUV/gQBM8DXFzhv20gBjuwo7H8mH1YUut?= =?us-ascii?Q?Y4oKTqLhdxVEFy0r8eAU/GKYZvVa44ojTzJhkEt3K03DC0E1XkkfbZKy/02K?= =?us-ascii?Q?9HUW5lm/B6yGXoXYqNk6qHxkG68ZCfjAH2kW+TiBz7?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB042;5:Bj5MxQN37AulKUQ1+qouXdQcKzeWd7CO810BFzKYLb/BixQnGSPIaXgAkojhoEaEFl0+69r49UF+v86uAuF8AB9OpnCoHIw3c1wd3QqZOtQJpf4h2+xF/NskZsTT9jpOBhWfNeEqeHcAb2ebX6/qwQ==;24:P6mYfYvkD14J2e3DDRnDJTMfr28LFQHnTzLiot6E7dP1IVKHg7n+duoCgSjL9p/Lt120PwOdl77Fy2S4aKu5a3/bkokGtxB+2/FqbjgyzEQ=;20:78M9v4Gfsdc8N0Hdriy9QA6UdhUPD5C4zkochqJdBqZpFjjQjFWkvTzN0yMPWvJwRChB4PloB6X011z/oOVXcH6J0W38QT5Xgbi4LFmRc/LB3daXsf5KELf4+T0Qs0SCH8C4oWvTV/Ni2I61N6XWJ8mwTQQ7btVxBfqAP1KUSqg= X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Feb 2016 17:43:40.3647 (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.236];Helo=[sj-itexedge04.altera.priv.altera.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR03MB042 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