diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/acpi.h | 4 | ||||
| -rw-r--r-- | include/linux/cpuhotplug.h | 1 | ||||
| -rw-r--r-- | include/linux/gpio/driver.h | 42 | ||||
| -rw-r--r-- | include/linux/irq.h | 35 | 
4 files changed, 49 insertions, 33 deletions
| diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 4f82a5bc6d98..76520f379313 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -105,6 +105,7 @@ enum acpi_irq_model_id {  	ACPI_IRQ_MODEL_IOSAPIC,  	ACPI_IRQ_MODEL_PLATFORM,  	ACPI_IRQ_MODEL_GIC, +	ACPI_IRQ_MODEL_LPIC,  	ACPI_IRQ_MODEL_COUNT  }; @@ -356,7 +357,8 @@ int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);  int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi);  void acpi_set_irq_model(enum acpi_irq_model_id model, -			struct fwnode_handle *fwnode); +			struct fwnode_handle *(*)(u32)); +void acpi_set_gsi_to_irq_fallback(u32 (*)(u32));  struct irq_domain *acpi_irq_create_hierarchy(unsigned int flags,  					     unsigned int size, diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index 19f0dbfdd7fe..de662f3a6cee 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -151,6 +151,7 @@ enum cpuhp_state {  	CPUHP_AP_IRQ_BCM2836_STARTING,  	CPUHP_AP_IRQ_MIPS_GIC_STARTING,  	CPUHP_AP_IRQ_RISCV_STARTING, +	CPUHP_AP_IRQ_LOONGARCH_STARTING,  	CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING,  	CPUHP_AP_ARM_MVEBU_COHERENCY,  	CPUHP_AP_MICROCODE_LOADER, diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h index b1e0f1f8ee2e..ad5b92b74ccf 100644 --- a/include/linux/gpio/driver.h +++ b/include/linux/gpio/driver.h @@ -12,6 +12,8 @@  #include <linux/property.h>  #include <linux/types.h> +#include <asm/msi.h> +  struct gpio_desc;  struct of_phandle_args;  struct device_node; @@ -23,6 +25,13 @@ enum gpio_lookup_flags;  struct gpio_chip; +union gpio_irq_fwspec { +	struct irq_fwspec	fwspec; +#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN +	msi_alloc_info_t	msiinfo; +#endif +}; +  #define GPIO_LINE_DIRECTION_IN	1  #define GPIO_LINE_DIRECTION_OUT	0 @@ -103,9 +112,10 @@ struct gpio_irq_chip {  	 * variant named &gpiochip_populate_parent_fwspec_fourcell is also  	 * available.  	 */ -	void *(*populate_parent_alloc_arg)(struct gpio_chip *gc, -				       unsigned int parent_hwirq, -				       unsigned int parent_type); +	int (*populate_parent_alloc_arg)(struct gpio_chip *gc, +					 union gpio_irq_fwspec *fwspec, +					 unsigned int parent_hwirq, +					 unsigned int parent_type);  	/**  	 * @child_offset_to_irq: @@ -646,28 +656,14 @@ struct bgpio_pdata {  #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY -void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *gc, +int gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *gc, +					    union gpio_irq_fwspec *gfwspec, +					    unsigned int parent_hwirq, +					    unsigned int parent_type); +int gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *gc, +					     union gpio_irq_fwspec *gfwspec,  					     unsigned int parent_hwirq,  					     unsigned int parent_type); -void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *gc, -					      unsigned int parent_hwirq, -					      unsigned int parent_type); - -#else - -static inline void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *gc, -						    unsigned int parent_hwirq, -						    unsigned int parent_type) -{ -	return NULL; -} - -static inline void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *gc, -						     unsigned int parent_hwirq, -						     unsigned int parent_type) -{ -	return NULL; -}  #endif /* CONFIG_IRQ_DOMAIN_HIERARCHY */ diff --git a/include/linux/irq.h b/include/linux/irq.h index 505308253d23..c3eb89606c2b 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -151,7 +151,9 @@ struct irq_common_data {  #endif  	void			*handler_data;  	struct msi_desc		*msi_desc; +#ifdef CONFIG_SMP  	cpumask_var_t		affinity; +#endif  #ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK  	cpumask_var_t		effective_affinity;  #endif @@ -879,21 +881,34 @@ static inline int irq_data_get_node(struct irq_data *d)  	return irq_common_data_get_node(d->common);  } -static inline struct cpumask *irq_get_affinity_mask(int irq) +static inline +const struct cpumask *irq_data_get_affinity_mask(struct irq_data *d)  { -	struct irq_data *d = irq_get_irq_data(irq); +#ifdef CONFIG_SMP +	return d->common->affinity; +#else +	return cpumask_of(0); +#endif +} -	return d ? d->common->affinity : NULL; +static inline void irq_data_update_affinity(struct irq_data *d, +					    const struct cpumask *m) +{ +#ifdef CONFIG_SMP +	cpumask_copy(d->common->affinity, m); +#endif  } -static inline struct cpumask *irq_data_get_affinity_mask(struct irq_data *d) +static inline const struct cpumask *irq_get_affinity_mask(int irq)  { -	return d->common->affinity; +	struct irq_data *d = irq_get_irq_data(irq); + +	return d ? irq_data_get_affinity_mask(d) : NULL;  }  #ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK  static inline -struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d) +const struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d)  {  	return d->common->effective_affinity;  } @@ -908,13 +923,14 @@ static inline void irq_data_update_effective_affinity(struct irq_data *d,  {  }  static inline -struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d) +const struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d)  { -	return d->common->affinity; +	return irq_data_get_affinity_mask(d);  }  #endif -static inline struct cpumask *irq_get_effective_affinity_mask(unsigned int irq) +static inline +const struct cpumask *irq_get_effective_affinity_mask(unsigned int irq)  {  	struct irq_data *d = irq_get_irq_data(irq); @@ -1121,6 +1137,7 @@ int irq_gc_set_wake(struct irq_data *d, unsigned int on);  /* Setup functions for irq_chip_generic */  int irq_map_generic_chip(struct irq_domain *d, unsigned int virq,  			 irq_hw_number_t hw_irq); +void irq_unmap_generic_chip(struct irq_domain *d, unsigned int virq);  struct irq_chip_generic *  irq_alloc_generic_chip(const char *name, int nr_ct, unsigned int irq_base,  		       void __iomem *reg_base, irq_flow_handler_t handler); |