diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2012-04-19 13:30:57 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2012-04-22 21:04:30 -0400 |
commit | 446f6d06fab0b49c61887ecbe8286d6aaa796637 (patch) | |
tree | 6aacba1bd15a3e85b7a4b655ab2164aa75261488 | |
parent | 3fca40c704dd013797f2c0c518f37cd2cc8e19fe (diff) |
powerpc/mpic: Properly set default triggers
This gets rid of the unused default senses array, and replaces the
incorrect use of IRQ_TYPE_NONE with the new IRQ_TYPE_DEFAULT for
the initial set_trigger() call when mapping an interrupt.
This in turn makes us read the HW state and update the irq desc
accordingly.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r-- | arch/powerpc/include/asm/mpic.h | 18 | ||||
-rw-r--r-- | arch/powerpc/sysdev/mpic.c | 42 |
2 files changed, 30 insertions, 30 deletions
diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h index c65b9294376e..c9f698a994be 100644 --- a/arch/powerpc/include/asm/mpic.h +++ b/arch/powerpc/include/asm/mpic.h | |||
@@ -275,9 +275,6 @@ struct mpic | |||
275 | unsigned int isu_mask; | 275 | unsigned int isu_mask; |
276 | /* Number of sources */ | 276 | /* Number of sources */ |
277 | unsigned int num_sources; | 277 | unsigned int num_sources; |
278 | /* default senses array */ | ||
279 | unsigned char *senses; | ||
280 | unsigned int senses_count; | ||
281 | 278 | ||
282 | /* vector numbers used for internal sources (ipi/timers) */ | 279 | /* vector numbers used for internal sources (ipi/timers) */ |
283 | unsigned int ipi_vecs[4]; | 280 | unsigned int ipi_vecs[4]; |
@@ -415,21 +412,6 @@ extern struct mpic *mpic_alloc(struct device_node *node, | |||
415 | extern void mpic_assign_isu(struct mpic *mpic, unsigned int isu_num, | 412 | extern void mpic_assign_isu(struct mpic *mpic, unsigned int isu_num, |
416 | phys_addr_t phys_addr); | 413 | phys_addr_t phys_addr); |
417 | 414 | ||
418 | /* Set default sense codes | ||
419 | * | ||
420 | * @mpic: controller | ||
421 | * @senses: array of sense codes | ||
422 | * @count: size of above array | ||
423 | * | ||
424 | * Optionally provide an array (indexed on hardware interrupt numbers | ||
425 | * for this MPIC) of default sense codes for the chip. Those are linux | ||
426 | * sense codes IRQ_TYPE_* | ||
427 | * | ||
428 | * The driver gets ownership of the pointer, don't dispose of it or | ||
429 | * anything like that. __init only. | ||
430 | */ | ||
431 | extern void mpic_set_default_senses(struct mpic *mpic, u8 *senses, int count); | ||
432 | |||
433 | 415 | ||
434 | /* Initialize the controller. After this has been called, none of the above | 416 | /* Initialize the controller. After this has been called, none of the above |
435 | * should be called again for this mpic | 417 | * should be called again for this mpic |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 665b0f806786..395af1347749 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
@@ -872,21 +872,45 @@ int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type) | |||
872 | if (src >= mpic->num_sources) | 872 | if (src >= mpic->num_sources) |
873 | return -EINVAL; | 873 | return -EINVAL; |
874 | 874 | ||
875 | vold = mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)); | ||
876 | |||
877 | /* We don't support "none" type */ | ||
875 | if (flow_type == IRQ_TYPE_NONE) | 878 | if (flow_type == IRQ_TYPE_NONE) |
876 | if (mpic->senses && src < mpic->senses_count) | 879 | flow_type = IRQ_TYPE_DEFAULT; |
877 | flow_type = mpic->senses[src]; | 880 | |
878 | if (flow_type == IRQ_TYPE_NONE) | 881 | /* Default: read HW settings */ |
879 | flow_type = IRQ_TYPE_LEVEL_LOW; | 882 | if (flow_type == IRQ_TYPE_DEFAULT) { |
883 | switch(vold & (MPIC_INFO(VECPRI_POLARITY_MASK) | | ||
884 | MPIC_INFO(VECPRI_SENSE_MASK))) { | ||
885 | case MPIC_INFO(VECPRI_SENSE_EDGE) | | ||
886 | MPIC_INFO(VECPRI_POLARITY_POSITIVE): | ||
887 | flow_type = IRQ_TYPE_EDGE_RISING; | ||
888 | break; | ||
889 | case MPIC_INFO(VECPRI_SENSE_EDGE) | | ||
890 | MPIC_INFO(VECPRI_POLARITY_NEGATIVE): | ||
891 | flow_type = IRQ_TYPE_EDGE_FALLING; | ||
892 | break; | ||
893 | case MPIC_INFO(VECPRI_SENSE_LEVEL) | | ||
894 | MPIC_INFO(VECPRI_POLARITY_POSITIVE): | ||
895 | flow_type = IRQ_TYPE_LEVEL_HIGH; | ||
896 | break; | ||
897 | case MPIC_INFO(VECPRI_SENSE_LEVEL) | | ||
898 | MPIC_INFO(VECPRI_POLARITY_NEGATIVE): | ||
899 | flow_type = IRQ_TYPE_LEVEL_LOW; | ||
900 | break; | ||
901 | } | ||
902 | } | ||
880 | 903 | ||
904 | /* Apply to irq desc */ | ||
881 | irqd_set_trigger_type(d, flow_type); | 905 | irqd_set_trigger_type(d, flow_type); |
882 | 906 | ||
907 | /* Apply to HW */ | ||
883 | if (mpic_is_ht_interrupt(mpic, src)) | 908 | if (mpic_is_ht_interrupt(mpic, src)) |
884 | vecpri = MPIC_VECPRI_POLARITY_POSITIVE | | 909 | vecpri = MPIC_VECPRI_POLARITY_POSITIVE | |
885 | MPIC_VECPRI_SENSE_EDGE; | 910 | MPIC_VECPRI_SENSE_EDGE; |
886 | else | 911 | else |
887 | vecpri = mpic_type_to_vecpri(mpic, flow_type); | 912 | vecpri = mpic_type_to_vecpri(mpic, flow_type); |
888 | 913 | ||
889 | vold = mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)); | ||
890 | vnew = vold & ~(MPIC_INFO(VECPRI_POLARITY_MASK) | | 914 | vnew = vold & ~(MPIC_INFO(VECPRI_POLARITY_MASK) | |
891 | MPIC_INFO(VECPRI_SENSE_MASK)); | 915 | MPIC_INFO(VECPRI_SENSE_MASK)); |
892 | vnew |= vecpri; | 916 | vnew |= vecpri; |
@@ -1022,7 +1046,7 @@ static int mpic_host_map(struct irq_domain *h, unsigned int virq, | |||
1022 | irq_set_chip_and_handler(virq, chip, handle_fasteoi_irq); | 1046 | irq_set_chip_and_handler(virq, chip, handle_fasteoi_irq); |
1023 | 1047 | ||
1024 | /* Set default irq type */ | 1048 | /* Set default irq type */ |
1025 | irq_set_irq_type(virq, IRQ_TYPE_NONE); | 1049 | irq_set_irq_type(virq, IRQ_TYPE_DEFAULT); |
1026 | 1050 | ||
1027 | /* If the MPIC was reset, then all vectors have already been | 1051 | /* If the MPIC was reset, then all vectors have already been |
1028 | * initialized. Otherwise, a per source lazy initialization | 1052 | * initialized. Otherwise, a per source lazy initialization |
@@ -1413,12 +1437,6 @@ void __init mpic_assign_isu(struct mpic *mpic, unsigned int isu_num, | |||
1413 | mpic->num_sources = isu_first + mpic->isu_size; | 1437 | mpic->num_sources = isu_first + mpic->isu_size; |
1414 | } | 1438 | } |
1415 | 1439 | ||
1416 | void __init mpic_set_default_senses(struct mpic *mpic, u8 *senses, int count) | ||
1417 | { | ||
1418 | mpic->senses = senses; | ||
1419 | mpic->senses_count = count; | ||
1420 | } | ||
1421 | |||
1422 | void __init mpic_init(struct mpic *mpic) | 1440 | void __init mpic_init(struct mpic *mpic) |
1423 | { | 1441 | { |
1424 | int i, cpu; | 1442 | int i, cpu; |