nmi.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * SDK7786 FPGA NMI Support.
  4. *
  5. * Copyright (C) 2010 Paul Mundt
  6. */
  7. #include <linux/init.h>
  8. #include <linux/kernel.h>
  9. #include <linux/string.h>
  10. #include <mach/fpga.h>
  11. enum {
  12. NMI_MODE_MANUAL,
  13. NMI_MODE_AUX,
  14. NMI_MODE_MASKED,
  15. NMI_MODE_ANY,
  16. NMI_MODE_UNKNOWN,
  17. };
  18. /*
  19. * Default to the manual NMI switch.
  20. */
  21. static unsigned int __initdata nmi_mode = NMI_MODE_ANY;
  22. static int __init nmi_mode_setup(char *str)
  23. {
  24. if (!str)
  25. return 0;
  26. if (strcmp(str, "manual") == 0)
  27. nmi_mode = NMI_MODE_MANUAL;
  28. else if (strcmp(str, "aux") == 0)
  29. nmi_mode = NMI_MODE_AUX;
  30. else if (strcmp(str, "masked") == 0)
  31. nmi_mode = NMI_MODE_MASKED;
  32. else if (strcmp(str, "any") == 0)
  33. nmi_mode = NMI_MODE_ANY;
  34. else {
  35. nmi_mode = NMI_MODE_UNKNOWN;
  36. pr_warn("Unknown NMI mode %s\n", str);
  37. }
  38. printk("Set NMI mode to %d\n", nmi_mode);
  39. return 0;
  40. }
  41. early_param("nmi_mode", nmi_mode_setup);
  42. void __init sdk7786_nmi_init(void)
  43. {
  44. unsigned int source, mask, tmp;
  45. switch (nmi_mode) {
  46. case NMI_MODE_MANUAL:
  47. source = NMISR_MAN_NMI;
  48. mask = NMIMR_MAN_NMIM;
  49. break;
  50. case NMI_MODE_AUX:
  51. source = NMISR_AUX_NMI;
  52. mask = NMIMR_AUX_NMIM;
  53. break;
  54. case NMI_MODE_ANY:
  55. source = NMISR_MAN_NMI | NMISR_AUX_NMI;
  56. mask = NMIMR_MAN_NMIM | NMIMR_AUX_NMIM;
  57. break;
  58. case NMI_MODE_MASKED:
  59. case NMI_MODE_UNKNOWN:
  60. default:
  61. source = mask = 0;
  62. break;
  63. }
  64. /* Set the NMI source */
  65. tmp = fpga_read_reg(NMISR);
  66. tmp &= ~NMISR_MASK;
  67. tmp |= source;
  68. fpga_write_reg(tmp, NMISR);
  69. /* And the IRQ masking */
  70. fpga_write_reg(NMIMR_MASK ^ mask, NMIMR);
  71. }