mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2026-01-27 12:47:24 +01:00
[ Upstream commit 1e3e330c07076a0582385bbea029c9cc918fa30d ] The IRQCHIP_PLATFORM_DRIVER macros can be used to convert OF irqchip drivers to platform drivers but currently reuse the OF init callback prototype that only takes OF nodes as arguments. This forces drivers to do reverse lookups of their struct devices during probe if they need them for things like dev_printk() and device managed resources. Half of the drivers doing reverse lookups also currently fail to release the additional reference taken during the lookup, while other drivers have had the reference leak plugged in various ways (e.g. using non-intuitive cleanup constructs which still confuse static checkers). Switch to using a probe callback that takes a platform device as its first argument to simplify drivers and plug the remaining (mostly benign) reference leaks. Fixes:32c6c05466("irqchip: Add Broadcom BCM2712 MSI-X interrupt controller") Fixes:70afdab904("irqchip: Add IMX MU MSI controller driver") Fixes:a6199bb514("irqchip: Add Qualcomm MPM controller driver") Signed-off-by: Johan Hovold <johan@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com> Reviewed-by: Changhuang Liang <changhuang.liang@starfivetech.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
95 lines
2.9 KiB
C
95 lines
2.9 KiB
C
/*
|
|
* Copyright (C) 2012 Thomas Petazzoni
|
|
*
|
|
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
|
*
|
|
* This file is licensed under the terms of the GNU General Public
|
|
* License version 2. This program is licensed "as is" without any
|
|
* warranty of any kind, whether express or implied.
|
|
*/
|
|
|
|
#ifndef _LINUX_IRQCHIP_H
|
|
#define _LINUX_IRQCHIP_H
|
|
|
|
#include <linux/acpi.h>
|
|
#include <linux/module.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_irq.h>
|
|
#include <linux/platform_device.h>
|
|
|
|
typedef int (*platform_irq_probe_t)(struct platform_device *, struct device_node *);
|
|
|
|
/* Undefined on purpose */
|
|
extern of_irq_init_cb_t typecheck_irq_init_cb;
|
|
extern platform_irq_probe_t typecheck_irq_probe;
|
|
|
|
#define typecheck_irq_init_cb(fn) \
|
|
(__typecheck(typecheck_irq_init_cb, &fn) ? fn : fn)
|
|
|
|
#define typecheck_irq_probe(fn) \
|
|
(__typecheck(typecheck_irq_probe, &fn) ? fn : fn)
|
|
|
|
/*
|
|
* This macro must be used by the different irqchip drivers to declare
|
|
* the association between their DT compatible string and their
|
|
* initialization function.
|
|
*
|
|
* @name: name that must be unique across all IRQCHIP_DECLARE of the
|
|
* same file.
|
|
* @compat: compatible string of the irqchip driver
|
|
* @fn: initialization function
|
|
*/
|
|
#define IRQCHIP_DECLARE(name, compat, fn) \
|
|
OF_DECLARE_2(irqchip, name, compat, typecheck_irq_init_cb(fn))
|
|
|
|
extern int platform_irqchip_probe(struct platform_device *pdev);
|
|
|
|
#define IRQCHIP_PLATFORM_DRIVER_BEGIN(drv_name) \
|
|
static const struct of_device_id drv_name##_irqchip_match_table[] = {
|
|
|
|
#define IRQCHIP_MATCH(compat, fn) { .compatible = compat, \
|
|
.data = typecheck_irq_probe(fn), },
|
|
|
|
|
|
#define IRQCHIP_PLATFORM_DRIVER_END(drv_name, ...) \
|
|
{}, \
|
|
}; \
|
|
MODULE_DEVICE_TABLE(of, drv_name##_irqchip_match_table); \
|
|
static struct platform_driver drv_name##_driver = { \
|
|
.probe = IS_ENABLED(CONFIG_IRQCHIP) ? \
|
|
platform_irqchip_probe : NULL, \
|
|
.driver = { \
|
|
.name = #drv_name, \
|
|
.owner = THIS_MODULE, \
|
|
.of_match_table = drv_name##_irqchip_match_table, \
|
|
.suppress_bind_attrs = true, \
|
|
__VA_ARGS__ \
|
|
}, \
|
|
}; \
|
|
builtin_platform_driver(drv_name##_driver)
|
|
|
|
/*
|
|
* This macro must be used by the different irqchip drivers to declare
|
|
* the association between their version and their initialization function.
|
|
*
|
|
* @name: name that must be unique across all IRQCHIP_ACPI_DECLARE of the
|
|
* same file.
|
|
* @subtable: Subtable to be identified in MADT
|
|
* @validate: Function to be called on that subtable to check its validity.
|
|
* Can be NULL.
|
|
* @data: data to be checked by the validate function.
|
|
* @fn: initialization function
|
|
*/
|
|
#define IRQCHIP_ACPI_DECLARE(name, subtable, validate, data, fn) \
|
|
ACPI_DECLARE_SUBTABLE_PROBE_ENTRY(irqchip, name, \
|
|
ACPI_SIG_MADT, subtable, \
|
|
validate, data, fn)
|
|
|
|
#ifdef CONFIG_IRQCHIP
|
|
void irqchip_init(void);
|
|
#else
|
|
static inline void irqchip_init(void) {}
|
|
#endif
|
|
|
|
#endif
|