.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * arch/powerpc/sysdev/ipic.c |
---|
3 | 4 | * |
---|
4 | 5 | * IPIC routines implementations. |
---|
5 | 6 | * |
---|
6 | 7 | * Copyright 2005 Freescale Semiconductor, Inc. |
---|
7 | | - * |
---|
8 | | - * This program is free software; you can redistribute it and/or modify it |
---|
9 | | - * under the terms of the GNU General Public License as published by the |
---|
10 | | - * Free Software Foundation; either version 2 of the License, or (at your |
---|
11 | | - * option) any later version. |
---|
12 | 8 | */ |
---|
13 | 9 | #include <linux/kernel.h> |
---|
14 | 10 | #include <linux/init.h> |
---|
.. | .. |
---|
771 | 767 | return ipic; |
---|
772 | 768 | } |
---|
773 | 769 | |
---|
774 | | -int ipic_set_priority(unsigned int virq, unsigned int priority) |
---|
775 | | -{ |
---|
776 | | - struct ipic *ipic = ipic_from_irq(virq); |
---|
777 | | - unsigned int src = virq_to_hw(virq); |
---|
778 | | - u32 temp; |
---|
779 | | - |
---|
780 | | - if (priority > 7) |
---|
781 | | - return -EINVAL; |
---|
782 | | - if (src > 127) |
---|
783 | | - return -EINVAL; |
---|
784 | | - if (ipic_info[src].prio == 0) |
---|
785 | | - return -EINVAL; |
---|
786 | | - |
---|
787 | | - temp = ipic_read(ipic->regs, ipic_info[src].prio); |
---|
788 | | - |
---|
789 | | - if (priority < 4) { |
---|
790 | | - temp &= ~(0x7 << (20 + (3 - priority) * 3)); |
---|
791 | | - temp |= ipic_info[src].prio_mask << (20 + (3 - priority) * 3); |
---|
792 | | - } else { |
---|
793 | | - temp &= ~(0x7 << (4 + (7 - priority) * 3)); |
---|
794 | | - temp |= ipic_info[src].prio_mask << (4 + (7 - priority) * 3); |
---|
795 | | - } |
---|
796 | | - |
---|
797 | | - ipic_write(ipic->regs, ipic_info[src].prio, temp); |
---|
798 | | - |
---|
799 | | - return 0; |
---|
800 | | -} |
---|
801 | | - |
---|
802 | | -void ipic_set_highest_priority(unsigned int virq) |
---|
803 | | -{ |
---|
804 | | - struct ipic *ipic = ipic_from_irq(virq); |
---|
805 | | - unsigned int src = virq_to_hw(virq); |
---|
806 | | - u32 temp; |
---|
807 | | - |
---|
808 | | - temp = ipic_read(ipic->regs, IPIC_SICFR); |
---|
809 | | - |
---|
810 | | - /* clear and set HPI */ |
---|
811 | | - temp &= 0x7f000000; |
---|
812 | | - temp |= (src & 0x7f) << 24; |
---|
813 | | - |
---|
814 | | - ipic_write(ipic->regs, IPIC_SICFR, temp); |
---|
815 | | -} |
---|
816 | | - |
---|
817 | 770 | void ipic_set_default_priority(void) |
---|
818 | 771 | { |
---|
819 | 772 | ipic_write(primary_ipic->regs, IPIC_SIPRR_A, IPIC_PRIORITY_DEFAULT); |
---|
.. | .. |
---|
824 | 777 | ipic_write(primary_ipic->regs, IPIC_SMPRR_B, IPIC_PRIORITY_DEFAULT); |
---|
825 | 778 | } |
---|
826 | 779 | |
---|
827 | | -void ipic_enable_mcp(enum ipic_mcp_irq mcp_irq) |
---|
828 | | -{ |
---|
829 | | - struct ipic *ipic = primary_ipic; |
---|
830 | | - u32 temp; |
---|
831 | | - |
---|
832 | | - temp = ipic_read(ipic->regs, IPIC_SERMR); |
---|
833 | | - temp |= (1 << (31 - mcp_irq)); |
---|
834 | | - ipic_write(ipic->regs, IPIC_SERMR, temp); |
---|
835 | | -} |
---|
836 | | - |
---|
837 | | -void ipic_disable_mcp(enum ipic_mcp_irq mcp_irq) |
---|
838 | | -{ |
---|
839 | | - struct ipic *ipic = primary_ipic; |
---|
840 | | - u32 temp; |
---|
841 | | - |
---|
842 | | - temp = ipic_read(ipic->regs, IPIC_SERMR); |
---|
843 | | - temp &= (1 << (31 - mcp_irq)); |
---|
844 | | - ipic_write(ipic->regs, IPIC_SERMR, temp); |
---|
845 | | -} |
---|
846 | | - |
---|
847 | 780 | u32 ipic_get_mcp_status(void) |
---|
848 | 781 | { |
---|
849 | | - return ipic_read(primary_ipic->regs, IPIC_SERSR); |
---|
| 782 | + return primary_ipic ? ipic_read(primary_ipic->regs, IPIC_SERSR) : 0; |
---|
850 | 783 | } |
---|
851 | 784 | |
---|
852 | 785 | void ipic_clear_mcp_status(u32 mask) |
---|