Merge branch 'acpi-init'
* acpi-init: clocksource: cosmetic: Drop OF 'dependency' from symbols clocksource / arm_arch_timer: Convert to ACPI probing clocksource: Add new CLKSRC_{PROBE,ACPI} config symbols clocksource / ACPI: Add probing infrastructure for ACPI-based clocksources irqchip / GIC: Convert the GIC driver to ACPI probing irqchip / ACPI: Add probing infrastructure for ACPI-based irqchips ACPI: Add early device probing infrastructure
This commit is contained in:
commit
e3ed766b49
|
@ -120,6 +120,6 @@ void __init time_init(void)
|
|||
#ifdef CONFIG_COMMON_CLK
|
||||
of_clk_init(NULL);
|
||||
#endif
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -647,7 +647,7 @@ static OMAP_SYS_32K_TIMER_INIT(4, 1, "timer_32k_ck", "ti,timer-alwon",
|
|||
void __init omap4_local_timer_init(void)
|
||||
{
|
||||
omap4_sync32k_timer_init();
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
#else
|
||||
void __init omap4_local_timer_init(void)
|
||||
|
@ -663,7 +663,7 @@ void __init omap5_realtime_timer_init(void)
|
|||
omap4_sync32k_timer_init();
|
||||
realtime_counter_init();
|
||||
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
#endif /* CONFIG_SOC_OMAP5 || CONFIG_SOC_DRA7XX */
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ static void __init rockchip_timer_init(void)
|
|||
}
|
||||
|
||||
of_clk_init(NULL);
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
||||
static void __init rockchip_dt_init(void)
|
||||
|
|
|
@ -97,7 +97,7 @@ static u32 __init r8a7779_read_mode_pins(void)
|
|||
static void __init r8a7779_init_time(void)
|
||||
{
|
||||
r8a7779_clocks_init(r8a7779_read_mode_pins());
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
||||
static const char *const r8a7779_compat_dt[] __initconst = {
|
||||
|
|
|
@ -128,7 +128,7 @@ void __init rcar_gen2_timer_init(void)
|
|||
#endif /* CONFIG_ARM_ARCH_TIMER */
|
||||
|
||||
rcar_gen2_clocks_init(mode);
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
||||
struct memory_reserve_config {
|
||||
|
|
|
@ -124,5 +124,5 @@ void __init spear13xx_timer_init(void)
|
|||
clk_put(pclk);
|
||||
|
||||
spear_setup_of_timer();
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ static void __init sun6i_timer_init(void)
|
|||
of_clk_init(NULL);
|
||||
if (IS_ENABLED(CONFIG_RESET_CONTROLLER))
|
||||
sun6i_reset_init();
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
||||
DT_MACHINE_START(SUN6I_DT, "Allwinner sun6i (A31) Family")
|
||||
|
|
|
@ -408,7 +408,7 @@ static const char * u300_board_compat[] = {
|
|||
DT_MACHINE_START(U300_DT, "U300 S335/B335 (Device Tree)")
|
||||
.map_io = u300_map_io,
|
||||
.init_irq = u300_init_irq_dt,
|
||||
.init_time = clocksource_of_init,
|
||||
.init_time = clocksource_probe,
|
||||
.init_machine = u300_init_machine_dt,
|
||||
.restart = u300_restart,
|
||||
.dt_compat = u300_board_compat,
|
||||
|
|
|
@ -44,5 +44,5 @@ void __init ux500_timer_init(void)
|
|||
|
||||
dt_fail:
|
||||
clksrc_dbx500_prcmu_init(prcmu_timer_base);
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
|
|
@ -154,7 +154,7 @@ static void __init zynq_timer_init(void)
|
|||
|
||||
zynq_clock_init();
|
||||
of_clk_init(NULL);
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
||||
static struct map_desc zynq_cortex_a9_scu_map __initdata = {
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#ifndef _ASM_ACPI_H
|
||||
#define _ASM_ACPI_H
|
||||
|
||||
#include <linux/irqchip/arm-gic-acpi.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/psci.h>
|
||||
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
#ifndef __ASM_IRQ_H
|
||||
#define __ASM_IRQ_H
|
||||
|
||||
#include <linux/irqchip/arm-gic-acpi.h>
|
||||
|
||||
#include <asm-generic/irq.h>
|
||||
|
||||
struct pt_regs;
|
||||
|
@ -10,15 +8,4 @@ struct pt_regs;
|
|||
extern void migrate_irqs(void);
|
||||
extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));
|
||||
|
||||
static inline void acpi_irq_init(void)
|
||||
{
|
||||
/*
|
||||
* Hardcode ACPI IRQ chip initialization to GICv2 for now.
|
||||
* Proper irqchip infrastructure will be implemented along with
|
||||
* incoming GICv2m|GICv3|ITS bits.
|
||||
*/
|
||||
acpi_gic_init();
|
||||
}
|
||||
#define acpi_irq_init acpi_irq_init
|
||||
|
||||
#endif
|
||||
|
|
|
@ -205,28 +205,3 @@ void __init acpi_boot_table_init(void)
|
|||
disable_acpi();
|
||||
}
|
||||
}
|
||||
|
||||
void __init acpi_gic_init(void)
|
||||
{
|
||||
struct acpi_table_header *table;
|
||||
acpi_status status;
|
||||
acpi_size tbl_size;
|
||||
int err;
|
||||
|
||||
if (acpi_disabled)
|
||||
return;
|
||||
|
||||
status = acpi_get_table_with_size(ACPI_SIG_MADT, 0, &table, &tbl_size);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
const char *msg = acpi_format_exception(status);
|
||||
|
||||
pr_err("Failed to get MADT table, %s\n", msg);
|
||||
return;
|
||||
}
|
||||
|
||||
err = gic_v2_acpi_init(table);
|
||||
if (err)
|
||||
pr_err("Failed to initialize GIC IRQ controller");
|
||||
|
||||
early_acpi_os_unmap_memory((char *)table, tbl_size);
|
||||
}
|
||||
|
|
|
@ -67,16 +67,10 @@ void __init time_init(void)
|
|||
u32 arch_timer_rate;
|
||||
|
||||
of_clk_init(NULL);
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
|
||||
tick_setup_hrtimer_broadcast();
|
||||
|
||||
/*
|
||||
* Since ACPI or FDT will only one be available in the system,
|
||||
* we can use acpi_generic_timer_init() here safely
|
||||
*/
|
||||
acpi_generic_timer_init();
|
||||
|
||||
arch_timer_rate = arch_timer_get_rate();
|
||||
if (!arch_timer_rate)
|
||||
panic("Unable to initialise architected timer.\n");
|
||||
|
|
|
@ -194,7 +194,7 @@ void __init time_init(void)
|
|||
{
|
||||
of_clk_init(NULL);
|
||||
setup_cpuinfo_clk();
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
|
|
|
@ -39,7 +39,7 @@ void __init plat_time_init(void)
|
|||
struct clk *clk;
|
||||
|
||||
of_clk_init(NULL);
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
|
||||
np = of_get_cpu_node(0, NULL);
|
||||
if (!np) {
|
||||
|
|
|
@ -75,5 +75,5 @@ void __init plat_time_init(void)
|
|||
pr_info("CPU Clock: %ldMHz\n", clk_get_rate(clk) / 1000000);
|
||||
mips_hpt_frequency = clk_get_rate(clk) / 2;
|
||||
clk_put(clk);
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
|
|
@ -324,7 +324,7 @@ void __init time_init(void)
|
|||
if (count < 2)
|
||||
panic("%d timer is found, it needs 2 timers in system\n", count);
|
||||
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
||||
CLOCKSOURCE_OF_DECLARE(nios2_timer, ALTR_TIMER_COMPATIBLE, nios2_time_init);
|
||||
|
|
|
@ -148,7 +148,7 @@ void __init time_init(void)
|
|||
local_timer_setup(0);
|
||||
setup_irq(this_cpu_ptr(&ccount_timer)->evt.irq, &timer_irqaction);
|
||||
sched_clock_register(ccount_sched_clock_read, 32, ccount_freq);
|
||||
clocksource_of_init();
|
||||
clocksource_probe();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1913,3 +1913,42 @@ int __init acpi_scan_init(void)
|
|||
mutex_unlock(&acpi_scan_lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
static struct acpi_probe_entry *ape;
|
||||
static int acpi_probe_count;
|
||||
static DEFINE_SPINLOCK(acpi_probe_lock);
|
||||
|
||||
static int __init acpi_match_madt(struct acpi_subtable_header *header,
|
||||
const unsigned long end)
|
||||
{
|
||||
if (!ape->subtable_valid || ape->subtable_valid(header, ape))
|
||||
if (!ape->probe_subtbl(header, end))
|
||||
acpi_probe_count++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init __acpi_probe_device_table(struct acpi_probe_entry *ap_head, int nr)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
spin_lock(&acpi_probe_lock);
|
||||
for (ape = ap_head; nr; ape++, nr--) {
|
||||
if (ACPI_COMPARE_NAME(ACPI_SIG_MADT, ape->id)) {
|
||||
acpi_probe_count = 0;
|
||||
acpi_table_parse_madt(ape->type, acpi_match_madt, 0);
|
||||
count += acpi_probe_count;
|
||||
} else {
|
||||
int res;
|
||||
res = acpi_table_parse(ape->id, ape->probe_table);
|
||||
if (!res)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
spin_unlock(&acpi_probe_lock);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,14 @@ menu "Clock Source drivers"
|
|||
|
||||
config CLKSRC_OF
|
||||
bool
|
||||
select CLKSRC_PROBE
|
||||
|
||||
config CLKSRC_ACPI
|
||||
bool
|
||||
select CLKSRC_PROBE
|
||||
|
||||
config CLKSRC_PROBE
|
||||
bool
|
||||
|
||||
config CLKSRC_I8253
|
||||
bool
|
||||
|
@ -123,6 +131,7 @@ config CLKSRC_STM32
|
|||
config ARM_ARCH_TIMER
|
||||
bool
|
||||
select CLKSRC_OF if OF
|
||||
select CLKSRC_ACPI if ACPI
|
||||
|
||||
config ARM_ARCH_TIMER_EVTSTREAM
|
||||
bool "Support for ARM architected timer event stream generation"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
obj-$(CONFIG_CLKSRC_OF) += clksrc-of.o
|
||||
obj-$(CONFIG_CLKSRC_PROBE) += clksrc-probe.o
|
||||
obj-$(CONFIG_ATMEL_PIT) += timer-atmel-pit.o
|
||||
obj-$(CONFIG_ATMEL_ST) += timer-atmel-st.o
|
||||
obj-$(CONFIG_ATMEL_TCB_CLKSRC) += tcb_clksrc.o
|
||||
|
|
|
@ -864,13 +864,5 @@ static int __init arch_timer_acpi_init(struct acpi_table_header *table)
|
|||
arch_timer_init();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Initialize all the generic timers presented in GTDT */
|
||||
void __init acpi_generic_timer_init(void)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
return;
|
||||
|
||||
acpi_table_parse(ACPI_SIG_GTDT, arch_timer_acpi_init);
|
||||
}
|
||||
CLOCKSOURCE_ACPI_DECLARE(arch_timer, ACPI_SIG_GTDT, arch_timer_acpi_init);
|
||||
#endif
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/clocksource.h>
|
||||
|
@ -23,7 +24,7 @@ extern struct of_device_id __clksrc_of_table[];
|
|||
static const struct of_device_id __clksrc_of_table_sentinel
|
||||
__used __section(__clksrc_of_table_end);
|
||||
|
||||
void __init clocksource_of_init(void)
|
||||
void __init clocksource_probe(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
const struct of_device_id *match;
|
||||
|
@ -38,6 +39,9 @@ void __init clocksource_of_init(void)
|
|||
init_func(np);
|
||||
clocksources++;
|
||||
}
|
||||
|
||||
clocksources += acpi_probe_device_table(clksrc);
|
||||
|
||||
if (!clocksources)
|
||||
pr_crit("%s: no matching clocksources found\n", __func__);
|
||||
}
|
|
@ -41,7 +41,6 @@
|
|||
#include <linux/irqchip.h>
|
||||
#include <linux/irqchip/chained_irq.h>
|
||||
#include <linux/irqchip/arm-gic.h>
|
||||
#include <linux/irqchip/arm-gic-acpi.h>
|
||||
|
||||
#include <asm/cputype.h>
|
||||
#include <asm/irq.h>
|
||||
|
@ -1195,7 +1194,7 @@ IRQCHIP_DECLARE(msm_qgic2, "qcom,msm-qgic2", gic_of_init);
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static phys_addr_t dist_phy_base, cpu_phy_base __initdata;
|
||||
static phys_addr_t cpu_phy_base __initdata;
|
||||
|
||||
static int __init
|
||||
gic_acpi_parse_madt_cpu(struct acpi_subtable_header *header,
|
||||
|
@ -1223,60 +1222,56 @@ gic_acpi_parse_madt_cpu(struct acpi_subtable_header *header,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
gic_acpi_parse_madt_distributor(struct acpi_subtable_header *header,
|
||||
const unsigned long end)
|
||||
/* The things you have to do to just *count* something... */
|
||||
static int __init acpi_dummy_func(struct acpi_subtable_header *header,
|
||||
const unsigned long end)
|
||||
{
|
||||
struct acpi_madt_generic_distributor *dist;
|
||||
|
||||
dist = (struct acpi_madt_generic_distributor *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(dist, end))
|
||||
return -EINVAL;
|
||||
|
||||
dist_phy_base = dist->base_address;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init
|
||||
gic_v2_acpi_init(struct acpi_table_header *table)
|
||||
static bool __init acpi_gic_redist_is_present(void)
|
||||
{
|
||||
return acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR,
|
||||
acpi_dummy_func, 0) > 0;
|
||||
}
|
||||
|
||||
static bool __init gic_validate_dist(struct acpi_subtable_header *header,
|
||||
struct acpi_probe_entry *ape)
|
||||
{
|
||||
struct acpi_madt_generic_distributor *dist;
|
||||
dist = (struct acpi_madt_generic_distributor *)header;
|
||||
|
||||
return (dist->version == ape->driver_data &&
|
||||
(dist->version != ACPI_MADT_GIC_VERSION_NONE ||
|
||||
!acpi_gic_redist_is_present()));
|
||||
}
|
||||
|
||||
#define ACPI_GICV2_DIST_MEM_SIZE (SZ_4K)
|
||||
#define ACPI_GIC_CPU_IF_MEM_SIZE (SZ_8K)
|
||||
|
||||
static int __init gic_v2_acpi_init(struct acpi_subtable_header *header,
|
||||
const unsigned long end)
|
||||
{
|
||||
struct acpi_madt_generic_distributor *dist;
|
||||
void __iomem *cpu_base, *dist_base;
|
||||
int count;
|
||||
|
||||
/* Collect CPU base addresses */
|
||||
count = acpi_parse_entries(ACPI_SIG_MADT,
|
||||
sizeof(struct acpi_table_madt),
|
||||
gic_acpi_parse_madt_cpu, table,
|
||||
ACPI_MADT_TYPE_GENERIC_INTERRUPT, 0);
|
||||
count = acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_INTERRUPT,
|
||||
gic_acpi_parse_madt_cpu, 0);
|
||||
if (count <= 0) {
|
||||
pr_err("No valid GICC entries exist\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find distributor base address. We expect one distributor entry since
|
||||
* ACPI 5.1 spec neither support multi-GIC instances nor GIC cascade.
|
||||
*/
|
||||
count = acpi_parse_entries(ACPI_SIG_MADT,
|
||||
sizeof(struct acpi_table_madt),
|
||||
gic_acpi_parse_madt_distributor, table,
|
||||
ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR, 0);
|
||||
if (count <= 0) {
|
||||
pr_err("No valid GICD entries exist\n");
|
||||
return -EINVAL;
|
||||
} else if (count > 1) {
|
||||
pr_err("More than one GICD entry detected\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
cpu_base = ioremap(cpu_phy_base, ACPI_GIC_CPU_IF_MEM_SIZE);
|
||||
if (!cpu_base) {
|
||||
pr_err("Unable to map GICC registers\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dist_base = ioremap(dist_phy_base, ACPI_GICV2_DIST_MEM_SIZE);
|
||||
dist = (struct acpi_madt_generic_distributor *)header;
|
||||
dist_base = ioremap(dist->base_address, ACPI_GICV2_DIST_MEM_SIZE);
|
||||
if (!dist_base) {
|
||||
pr_err("Unable to map GICD registers\n");
|
||||
iounmap(cpu_base);
|
||||
|
@ -1302,4 +1297,10 @@ gic_v2_acpi_init(struct acpi_table_header *table)
|
|||
acpi_irq_model = ACPI_IRQ_MODEL_GIC;
|
||||
return 0;
|
||||
}
|
||||
IRQCHIP_ACPI_DECLARE(gic_v2, ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR,
|
||||
gic_validate_dist, ACPI_MADT_GIC_VERSION_V2,
|
||||
gic_v2_acpi_init);
|
||||
IRQCHIP_ACPI_DECLARE(gic_v2_maybe, ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR,
|
||||
gic_validate_dist, ACPI_MADT_GIC_VERSION_NONE,
|
||||
gic_v2_acpi_init);
|
||||
#endif
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/acpi_irq.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/irqchip.h>
|
||||
|
@ -27,6 +27,5 @@ extern struct of_device_id __irqchip_of_table[];
|
|||
void __init irqchip_init(void)
|
||||
{
|
||||
of_irq_init(__irqchip_of_table);
|
||||
|
||||
acpi_irq_init();
|
||||
acpi_probe_device_table(irqchip);
|
||||
}
|
||||
|
|
|
@ -181,6 +181,16 @@
|
|||
#define CPUIDLE_METHOD_OF_TABLES() OF_TABLE(CONFIG_CPU_IDLE, cpuidle_method)
|
||||
#define EARLYCON_OF_TABLES() OF_TABLE(CONFIG_SERIAL_EARLYCON, earlycon)
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
#define ACPI_PROBE_TABLE(name) \
|
||||
. = ALIGN(8); \
|
||||
VMLINUX_SYMBOL(__##name##_acpi_probe_table) = .; \
|
||||
*(__##name##_acpi_probe_table) \
|
||||
VMLINUX_SYMBOL(__##name##_acpi_probe_table_end) = .;
|
||||
#else
|
||||
#define ACPI_PROBE_TABLE(name)
|
||||
#endif
|
||||
|
||||
#define KERNEL_DTB() \
|
||||
STRUCT_ALIGN(); \
|
||||
VMLINUX_SYMBOL(__dtb_start) = .; \
|
||||
|
@ -514,6 +524,8 @@
|
|||
CPUIDLE_METHOD_OF_TABLES() \
|
||||
KERNEL_DTB() \
|
||||
IRQCHIP_OF_MATCH_TABLE() \
|
||||
ACPI_PROBE_TABLE(irqchip) \
|
||||
ACPI_PROBE_TABLE(clksrc) \
|
||||
EARLYCON_TABLE() \
|
||||
EARLYCON_OF_TABLES()
|
||||
|
||||
|
|
|
@ -787,6 +787,61 @@ int acpi_dev_prop_read(struct acpi_device *adev, const char *propname,
|
|||
|
||||
struct fwnode_handle *acpi_get_next_subnode(struct device *dev,
|
||||
struct fwnode_handle *subnode);
|
||||
|
||||
struct acpi_probe_entry;
|
||||
typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *,
|
||||
struct acpi_probe_entry *);
|
||||
|
||||
#define ACPI_TABLE_ID_LEN 5
|
||||
|
||||
/**
|
||||
* struct acpi_probe_entry - boot-time probing entry
|
||||
* @id: ACPI table name
|
||||
* @type: Optional subtable type to match
|
||||
* (if @id contains subtables)
|
||||
* @subtable_valid: Optional callback to check the validity of
|
||||
* the subtable
|
||||
* @probe_table: Callback to the driver being probed when table
|
||||
* match is successful
|
||||
* @probe_subtbl: Callback to the driver being probed when table and
|
||||
* subtable match (and optional callback is successful)
|
||||
* @driver_data: Sideband data provided back to the driver
|
||||
*/
|
||||
struct acpi_probe_entry {
|
||||
__u8 id[ACPI_TABLE_ID_LEN];
|
||||
__u8 type;
|
||||
acpi_probe_entry_validate_subtbl subtable_valid;
|
||||
union {
|
||||
acpi_tbl_table_handler probe_table;
|
||||
acpi_tbl_entry_handler probe_subtbl;
|
||||
};
|
||||
kernel_ulong_t driver_data;
|
||||
};
|
||||
|
||||
#define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable, valid, data, fn) \
|
||||
static const struct acpi_probe_entry __acpi_probe_##name \
|
||||
__used __section(__##table##_acpi_probe_table) \
|
||||
= { \
|
||||
.id = table_id, \
|
||||
.type = subtable, \
|
||||
.subtable_valid = valid, \
|
||||
.probe_table = (acpi_tbl_table_handler)fn, \
|
||||
.driver_data = data, \
|
||||
}
|
||||
|
||||
#define ACPI_PROBE_TABLE(name) __##name##_acpi_probe_table
|
||||
#define ACPI_PROBE_TABLE_END(name) __##name##_acpi_probe_table_end
|
||||
|
||||
int __acpi_probe_device_table(struct acpi_probe_entry *start, int nr);
|
||||
|
||||
#define acpi_probe_device_table(t) \
|
||||
({ \
|
||||
extern struct acpi_probe_entry ACPI_PROBE_TABLE(t), \
|
||||
ACPI_PROBE_TABLE_END(t); \
|
||||
__acpi_probe_device_table(&ACPI_PROBE_TABLE(t), \
|
||||
(&ACPI_PROBE_TABLE_END(t) - \
|
||||
&ACPI_PROBE_TABLE(t))); \
|
||||
})
|
||||
#else
|
||||
static inline int acpi_dev_get_property(struct acpi_device *adev,
|
||||
const char *name, acpi_object_type type,
|
||||
|
@ -845,6 +900,17 @@ static inline struct fwnode_handle *acpi_get_next_subnode(struct device *dev,
|
|||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable, validate, data, fn) \
|
||||
static const void * __acpi_table_##name[] \
|
||||
__attribute__((unused)) \
|
||||
= { (void *) table_id, \
|
||||
(void *) subtable, \
|
||||
(void *) valid, \
|
||||
(void *) fn, \
|
||||
(void *) data }
|
||||
|
||||
#define acpi_probe_device_table(t) ({ int __r = 0; __r;})
|
||||
#endif
|
||||
|
||||
#endif /*_LINUX_ACPI_H*/
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
#ifndef _LINUX_ACPI_IRQ_H
|
||||
#define _LINUX_ACPI_IRQ_H
|
||||
|
||||
#include <linux/irq.h>
|
||||
|
||||
#ifndef acpi_irq_init
|
||||
static inline void acpi_irq_init(void) { }
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_ACPI_IRQ_H */
|
|
@ -246,16 +246,13 @@ extern int clocksource_i8253_init(void);
|
|||
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
|
||||
OF_DECLARE_1(clksrc, name, compat, fn)
|
||||
|
||||
#ifdef CONFIG_CLKSRC_OF
|
||||
extern void clocksource_of_init(void);
|
||||
#ifdef CONFIG_CLKSRC_PROBE
|
||||
extern void clocksource_probe(void);
|
||||
#else
|
||||
static inline void clocksource_of_init(void) {}
|
||||
static inline void clocksource_probe(void) {}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
void acpi_generic_timer_init(void);
|
||||
#else
|
||||
static inline void acpi_generic_timer_init(void) { }
|
||||
#endif
|
||||
#define CLOCKSOURCE_ACPI_DECLARE(name, table_id, fn) \
|
||||
ACPI_DECLARE_PROBE_ENTRY(clksrc, name, table_id, 0, NULL, 0, fn)
|
||||
|
||||
#endif /* _LINUX_CLOCKSOURCE_H */
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#ifndef _LINUX_IRQCHIP_H
|
||||
#define _LINUX_IRQCHIP_H
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
/*
|
||||
|
@ -25,6 +26,22 @@
|
|||
*/
|
||||
#define IRQCHIP_DECLARE(name, compat, fn) OF_DECLARE_2(irqchip, name, compat, fn)
|
||||
|
||||
/*
|
||||
* 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 accross 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_PROBE_ENTRY(irqchip, name, ACPI_SIG_MADT, \
|
||||
subtable, validate, data, fn)
|
||||
|
||||
#ifdef CONFIG_IRQCHIP
|
||||
void irqchip_init(void);
|
||||
#else
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2014, Linaro Ltd.
|
||||
* Author: Tomasz Nowicki <tomasz.nowicki@linaro.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef ARM_GIC_ACPI_H_
|
||||
#define ARM_GIC_ACPI_H_
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
||||
/*
|
||||
* Hard code here, we can not get memory size from MADT (but FDT does),
|
||||
* Actually no need to do that, because this size can be inferred
|
||||
* from GIC spec.
|
||||
*/
|
||||
#define ACPI_GICV2_DIST_MEM_SIZE (SZ_4K)
|
||||
#define ACPI_GIC_CPU_IF_MEM_SIZE (SZ_8K)
|
||||
|
||||
struct acpi_table_header;
|
||||
|
||||
int gic_v2_acpi_init(struct acpi_table_header *table);
|
||||
void acpi_gic_init(void);
|
||||
#else
|
||||
static inline void acpi_gic_init(void) { }
|
||||
#endif
|
||||
|
||||
#endif /* ARM_GIC_ACPI_H_ */
|
Loading…
Reference in New Issue