diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/irq/chip.c | 11 | ||||
-rw-r--r-- | kernel/irq/irqdomain.c | 45 |
2 files changed, 45 insertions, 11 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 086d5a34b5a0..0aefc2e69cf5 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -1278,6 +1278,17 @@ void irq_chip_mask_parent(struct irq_data *data) | |||
1278 | EXPORT_SYMBOL_GPL(irq_chip_mask_parent); | 1278 | EXPORT_SYMBOL_GPL(irq_chip_mask_parent); |
1279 | 1279 | ||
1280 | /** | 1280 | /** |
1281 | * irq_chip_mask_ack_parent - Mask and acknowledge the parent interrupt | ||
1282 | * @data: Pointer to interrupt specific data | ||
1283 | */ | ||
1284 | void irq_chip_mask_ack_parent(struct irq_data *data) | ||
1285 | { | ||
1286 | data = data->parent_data; | ||
1287 | data->chip->irq_mask_ack(data); | ||
1288 | } | ||
1289 | EXPORT_SYMBOL_GPL(irq_chip_mask_ack_parent); | ||
1290 | |||
1291 | /** | ||
1281 | * irq_chip_unmask_parent - Unmask the parent interrupt | 1292 | * irq_chip_unmask_parent - Unmask the parent interrupt |
1282 | * @data: Pointer to interrupt specific data | 1293 | * @data: Pointer to interrupt specific data |
1283 | */ | 1294 | */ |
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index 8b0be4bd6565..56a30d542b8e 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c | |||
@@ -729,16 +729,17 @@ static int irq_domain_translate(struct irq_domain *d, | |||
729 | return 0; | 729 | return 0; |
730 | } | 730 | } |
731 | 731 | ||
732 | static void of_phandle_args_to_fwspec(struct of_phandle_args *irq_data, | 732 | static void of_phandle_args_to_fwspec(struct device_node *np, const u32 *args, |
733 | unsigned int count, | ||
733 | struct irq_fwspec *fwspec) | 734 | struct irq_fwspec *fwspec) |
734 | { | 735 | { |
735 | int i; | 736 | int i; |
736 | 737 | ||
737 | fwspec->fwnode = irq_data->np ? &irq_data->np->fwnode : NULL; | 738 | fwspec->fwnode = np ? &np->fwnode : NULL; |
738 | fwspec->param_count = irq_data->args_count; | 739 | fwspec->param_count = count; |
739 | 740 | ||
740 | for (i = 0; i < irq_data->args_count; i++) | 741 | for (i = 0; i < count; i++) |
741 | fwspec->param[i] = irq_data->args[i]; | 742 | fwspec->param[i] = args[i]; |
742 | } | 743 | } |
743 | 744 | ||
744 | unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec) | 745 | unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec) |
@@ -836,7 +837,9 @@ unsigned int irq_create_of_mapping(struct of_phandle_args *irq_data) | |||
836 | { | 837 | { |
837 | struct irq_fwspec fwspec; | 838 | struct irq_fwspec fwspec; |
838 | 839 | ||
839 | of_phandle_args_to_fwspec(irq_data, &fwspec); | 840 | of_phandle_args_to_fwspec(irq_data->np, irq_data->args, |
841 | irq_data->args_count, &fwspec); | ||
842 | |||
840 | return irq_create_fwspec_mapping(&fwspec); | 843 | return irq_create_fwspec_mapping(&fwspec); |
841 | } | 844 | } |
842 | EXPORT_SYMBOL_GPL(irq_create_of_mapping); | 845 | EXPORT_SYMBOL_GPL(irq_create_of_mapping); |
@@ -928,11 +931,10 @@ int irq_domain_xlate_twocell(struct irq_domain *d, struct device_node *ctrlr, | |||
928 | const u32 *intspec, unsigned int intsize, | 931 | const u32 *intspec, unsigned int intsize, |
929 | irq_hw_number_t *out_hwirq, unsigned int *out_type) | 932 | irq_hw_number_t *out_hwirq, unsigned int *out_type) |
930 | { | 933 | { |
931 | if (WARN_ON(intsize < 2)) | 934 | struct irq_fwspec fwspec; |
932 | return -EINVAL; | 935 | |
933 | *out_hwirq = intspec[0]; | 936 | of_phandle_args_to_fwspec(ctrlr, intspec, intsize, &fwspec); |
934 | *out_type = intspec[1] & IRQ_TYPE_SENSE_MASK; | 937 | return irq_domain_translate_twocell(d, &fwspec, out_hwirq, out_type); |
935 | return 0; | ||
936 | } | 938 | } |
937 | EXPORT_SYMBOL_GPL(irq_domain_xlate_twocell); | 939 | EXPORT_SYMBOL_GPL(irq_domain_xlate_twocell); |
938 | 940 | ||
@@ -968,6 +970,27 @@ const struct irq_domain_ops irq_domain_simple_ops = { | |||
968 | }; | 970 | }; |
969 | EXPORT_SYMBOL_GPL(irq_domain_simple_ops); | 971 | EXPORT_SYMBOL_GPL(irq_domain_simple_ops); |
970 | 972 | ||
973 | /** | ||
974 | * irq_domain_translate_twocell() - Generic translate for direct two cell | ||
975 | * bindings | ||
976 | * | ||
977 | * Device Tree IRQ specifier translation function which works with two cell | ||
978 | * bindings where the cell values map directly to the hwirq number | ||
979 | * and linux irq flags. | ||
980 | */ | ||
981 | int irq_domain_translate_twocell(struct irq_domain *d, | ||
982 | struct irq_fwspec *fwspec, | ||
983 | unsigned long *out_hwirq, | ||
984 | unsigned int *out_type) | ||
985 | { | ||
986 | if (WARN_ON(fwspec->param_count < 2)) | ||
987 | return -EINVAL; | ||
988 | *out_hwirq = fwspec->param[0]; | ||
989 | *out_type = fwspec->param[1] & IRQ_TYPE_SENSE_MASK; | ||
990 | return 0; | ||
991 | } | ||
992 | EXPORT_SYMBOL_GPL(irq_domain_translate_twocell); | ||
993 | |||
971 | int irq_domain_alloc_descs(int virq, unsigned int cnt, irq_hw_number_t hwirq, | 994 | int irq_domain_alloc_descs(int virq, unsigned int cnt, irq_hw_number_t hwirq, |
972 | int node, const struct irq_affinity_desc *affinity) | 995 | int node, const struct irq_affinity_desc *affinity) |
973 | { | 996 | { |