| .. | .. |
|---|
| 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) |
|---|