pc873xx.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/ioport.h>
  3. #include <asm/io.h>
  4. #include "pc873xx.h"
  5. static unsigned pc873xx_probelist[] = {0x398, 0x26e, 0};
  6. static char *pc873xx_names[] = {
  7. "PC87303", "PC87306", "PC87312", "PC87332", "PC87334"
  8. };
  9. static unsigned int base, model;
  10. unsigned int __init pc873xx_get_base(void)
  11. {
  12. return base;
  13. }
  14. char *__init pc873xx_get_model(void)
  15. {
  16. return pc873xx_names[model];
  17. }
  18. static unsigned char __init pc873xx_read(unsigned int base, int reg)
  19. {
  20. outb(reg, base);
  21. return inb(base + 1);
  22. }
  23. static void __init pc873xx_write(unsigned int base, int reg, unsigned char data)
  24. {
  25. unsigned long flags;
  26. local_irq_save(flags);
  27. outb(reg, base);
  28. outb(data, base + 1);
  29. outb(data, base + 1); /* Must be written twice */
  30. local_irq_restore(flags);
  31. }
  32. int __init pc873xx_probe(void)
  33. {
  34. int val, index = 0;
  35. while ((base = pc873xx_probelist[index++])) {
  36. if (request_region(base, 2, "Super IO PC873xx") == NULL)
  37. continue;
  38. val = pc873xx_read(base, REG_SID);
  39. if ((val & 0xf0) == 0x10) {
  40. model = PC87332;
  41. break;
  42. } else if ((val & 0xf8) == 0x70) {
  43. model = PC87306;
  44. break;
  45. } else if ((val & 0xf8) == 0x50) {
  46. model = PC87334;
  47. break;
  48. } else if ((val & 0xf8) == 0x40) {
  49. model = PC87303;
  50. break;
  51. }
  52. release_region(base, 2);
  53. }
  54. return (base == 0) ? -1 : 1;
  55. }
  56. void __init pc873xx_enable_epp19(void)
  57. {
  58. unsigned char data;
  59. printk(KERN_INFO "PC873xx enabling EPP v1.9\n");
  60. data = pc873xx_read(base, REG_PCR);
  61. pc873xx_write(base, REG_PCR, (data & 0xFC) | 0x02);
  62. }
  63. void __init pc873xx_enable_ide(void)
  64. {
  65. unsigned char data;
  66. printk(KERN_INFO "PC873xx enabling IDE interrupt\n");
  67. data = pc873xx_read(base, REG_FER);
  68. pc873xx_write(base, REG_FER, data | 0x40);
  69. }