ipic.c (31d44b57c508971c083ce038d7c5ededd09cea01) ipic.c (476eb4912601a8c01e6702b9a029f476b4b131d2)
1/*
2 * arch/powerpc/sysdev/ipic.c
3 *
4 * IPIC routines implementations.
5 *
6 * Copyright 2005 Freescale Semiconductor, Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify it

--- 507 unchanged lines hidden (view full) ---

516 out_be32(base + (reg >> 2), value);
517}
518
519static inline struct ipic * ipic_from_irq(unsigned int virq)
520{
521 return primary_ipic;
522}
523
1/*
2 * arch/powerpc/sysdev/ipic.c
3 *
4 * IPIC routines implementations.
5 *
6 * Copyright 2005 Freescale Semiconductor, Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify it

--- 507 unchanged lines hidden (view full) ---

516 out_be32(base + (reg >> 2), value);
517}
518
519static inline struct ipic * ipic_from_irq(unsigned int virq)
520{
521 return primary_ipic;
522}
523
524#define ipic_irq_to_hw(virq) ((unsigned int)irq_map[virq].hwirq)
525
526static void ipic_unmask_irq(struct irq_data *d)
527{
528 struct ipic *ipic = ipic_from_irq(d->irq);
524static void ipic_unmask_irq(struct irq_data *d)
525{
526 struct ipic *ipic = ipic_from_irq(d->irq);
529 unsigned int src = ipic_irq_to_hw(d->irq);
527 unsigned int src = irqd_to_hwirq(d);
530 unsigned long flags;
531 u32 temp;
532
533 raw_spin_lock_irqsave(&ipic_lock, flags);
534
535 temp = ipic_read(ipic->regs, ipic_info[src].mask);
536 temp |= (1 << (31 - ipic_info[src].bit));
537 ipic_write(ipic->regs, ipic_info[src].mask, temp);
538
539 raw_spin_unlock_irqrestore(&ipic_lock, flags);
540}
541
542static void ipic_mask_irq(struct irq_data *d)
543{
544 struct ipic *ipic = ipic_from_irq(d->irq);
528 unsigned long flags;
529 u32 temp;
530
531 raw_spin_lock_irqsave(&ipic_lock, flags);
532
533 temp = ipic_read(ipic->regs, ipic_info[src].mask);
534 temp |= (1 << (31 - ipic_info[src].bit));
535 ipic_write(ipic->regs, ipic_info[src].mask, temp);
536
537 raw_spin_unlock_irqrestore(&ipic_lock, flags);
538}
539
540static void ipic_mask_irq(struct irq_data *d)
541{
542 struct ipic *ipic = ipic_from_irq(d->irq);
545 unsigned int src = ipic_irq_to_hw(d->irq);
543 unsigned int src = irqd_to_hwirq(d);
546 unsigned long flags;
547 u32 temp;
548
549 raw_spin_lock_irqsave(&ipic_lock, flags);
550
551 temp = ipic_read(ipic->regs, ipic_info[src].mask);
552 temp &= ~(1 << (31 - ipic_info[src].bit));
553 ipic_write(ipic->regs, ipic_info[src].mask, temp);
554
555 /* mb() can't guarantee that masking is finished. But it does finish
556 * for nearly all cases. */
557 mb();
558
559 raw_spin_unlock_irqrestore(&ipic_lock, flags);
560}
561
562static void ipic_ack_irq(struct irq_data *d)
563{
564 struct ipic *ipic = ipic_from_irq(d->irq);
544 unsigned long flags;
545 u32 temp;
546
547 raw_spin_lock_irqsave(&ipic_lock, flags);
548
549 temp = ipic_read(ipic->regs, ipic_info[src].mask);
550 temp &= ~(1 << (31 - ipic_info[src].bit));
551 ipic_write(ipic->regs, ipic_info[src].mask, temp);
552
553 /* mb() can't guarantee that masking is finished. But it does finish
554 * for nearly all cases. */
555 mb();
556
557 raw_spin_unlock_irqrestore(&ipic_lock, flags);
558}
559
560static void ipic_ack_irq(struct irq_data *d)
561{
562 struct ipic *ipic = ipic_from_irq(d->irq);
565 unsigned int src = ipic_irq_to_hw(d->irq);
563 unsigned int src = irqd_to_hwirq(d);
566 unsigned long flags;
567 u32 temp;
568
569 raw_spin_lock_irqsave(&ipic_lock, flags);
570
571 temp = 1 << (31 - ipic_info[src].bit);
572 ipic_write(ipic->regs, ipic_info[src].ack, temp);
573
574 /* mb() can't guarantee that ack is finished. But it does finish
575 * for nearly all cases. */
576 mb();
577
578 raw_spin_unlock_irqrestore(&ipic_lock, flags);
579}
580
581static void ipic_mask_irq_and_ack(struct irq_data *d)
582{
583 struct ipic *ipic = ipic_from_irq(d->irq);
564 unsigned long flags;
565 u32 temp;
566
567 raw_spin_lock_irqsave(&ipic_lock, flags);
568
569 temp = 1 << (31 - ipic_info[src].bit);
570 ipic_write(ipic->regs, ipic_info[src].ack, temp);
571
572 /* mb() can't guarantee that ack is finished. But it does finish
573 * for nearly all cases. */
574 mb();
575
576 raw_spin_unlock_irqrestore(&ipic_lock, flags);
577}
578
579static void ipic_mask_irq_and_ack(struct irq_data *d)
580{
581 struct ipic *ipic = ipic_from_irq(d->irq);
584 unsigned int src = ipic_irq_to_hw(d->irq);
582 unsigned int src = irqd_to_hwirq(d);
585 unsigned long flags;
586 u32 temp;
587
588 raw_spin_lock_irqsave(&ipic_lock, flags);
589
590 temp = ipic_read(ipic->regs, ipic_info[src].mask);
591 temp &= ~(1 << (31 - ipic_info[src].bit));
592 ipic_write(ipic->regs, ipic_info[src].mask, temp);

--- 6 unchanged lines hidden (view full) ---

599 mb();
600
601 raw_spin_unlock_irqrestore(&ipic_lock, flags);
602}
603
604static int ipic_set_irq_type(struct irq_data *d, unsigned int flow_type)
605{
606 struct ipic *ipic = ipic_from_irq(d->irq);
583 unsigned long flags;
584 u32 temp;
585
586 raw_spin_lock_irqsave(&ipic_lock, flags);
587
588 temp = ipic_read(ipic->regs, ipic_info[src].mask);
589 temp &= ~(1 << (31 - ipic_info[src].bit));
590 ipic_write(ipic->regs, ipic_info[src].mask, temp);

--- 6 unchanged lines hidden (view full) ---

597 mb();
598
599 raw_spin_unlock_irqrestore(&ipic_lock, flags);
600}
601
602static int ipic_set_irq_type(struct irq_data *d, unsigned int flow_type)
603{
604 struct ipic *ipic = ipic_from_irq(d->irq);
607 unsigned int src = ipic_irq_to_hw(d->irq);
605 unsigned int src = irqd_to_hwirq(d);
608 unsigned int vold, vnew, edibit;
609
610 if (flow_type == IRQ_TYPE_NONE)
611 flow_type = IRQ_TYPE_LEVEL_LOW;
612
613 /* ipic supports only low assertion and high-to-low change senses
614 */
615 if (!(flow_type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_EDGE_FALLING))) {

--- 172 unchanged lines hidden (view full) ---

788 primary_ipic->regs);
789
790 return ipic;
791}
792
793int ipic_set_priority(unsigned int virq, unsigned int priority)
794{
795 struct ipic *ipic = ipic_from_irq(virq);
606 unsigned int vold, vnew, edibit;
607
608 if (flow_type == IRQ_TYPE_NONE)
609 flow_type = IRQ_TYPE_LEVEL_LOW;
610
611 /* ipic supports only low assertion and high-to-low change senses
612 */
613 if (!(flow_type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_EDGE_FALLING))) {

--- 172 unchanged lines hidden (view full) ---

786 primary_ipic->regs);
787
788 return ipic;
789}
790
791int ipic_set_priority(unsigned int virq, unsigned int priority)
792{
793 struct ipic *ipic = ipic_from_irq(virq);
796 unsigned int src = ipic_irq_to_hw(virq);
794 unsigned int src = virq_to_hw(virq);
797 u32 temp;
798
799 if (priority > 7)
800 return -EINVAL;
801 if (src > 127)
802 return -EINVAL;
803 if (ipic_info[src].prio == 0)
804 return -EINVAL;

--- 11 unchanged lines hidden (view full) ---

816 ipic_write(ipic->regs, ipic_info[src].prio, temp);
817
818 return 0;
819}
820
821void ipic_set_highest_priority(unsigned int virq)
822{
823 struct ipic *ipic = ipic_from_irq(virq);
795 u32 temp;
796
797 if (priority > 7)
798 return -EINVAL;
799 if (src > 127)
800 return -EINVAL;
801 if (ipic_info[src].prio == 0)
802 return -EINVAL;

--- 11 unchanged lines hidden (view full) ---

814 ipic_write(ipic->regs, ipic_info[src].prio, temp);
815
816 return 0;
817}
818
819void ipic_set_highest_priority(unsigned int virq)
820{
821 struct ipic *ipic = ipic_from_irq(virq);
824 unsigned int src = ipic_irq_to_hw(virq);
822 unsigned int src = virq_to_hw(virq);
825 u32 temp;
826
827 temp = ipic_read(ipic->regs, IPIC_SICFR);
828
829 /* clear and set HPI */
830 temp &= 0x7f000000;
831 temp |= (src & 0x7f) << 24;
832

--- 160 unchanged lines hidden ---
823 u32 temp;
824
825 temp = ipic_read(ipic->regs, IPIC_SICFR);
826
827 /* clear and set HPI */
828 temp &= 0x7f000000;
829 temp |= (src & 0x7f) << 24;
830

--- 160 unchanged lines hidden ---