diff options
| -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; |
