| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 1 | /* | 
 | 2 |  *	I/O routines for Titan | 
 | 3 |  */ | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 4 | #include <linux/pci.h> | 
 | 5 | #include <asm/machvec.h> | 
 | 6 | #include <asm/addrspace.h> | 
 | 7 | #include <asm/titan.h> | 
 | 8 | #include <asm/io.h> | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 9 |  | 
| Paul Mundt | 373e68b | 2006-09-27 15:41:24 +0900 | [diff] [blame] | 10 | static inline unsigned int port2adr(unsigned int port) | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 11 | { | 
 | 12 |         maybebadio((unsigned long)port); | 
| Paul Mundt | 373e68b | 2006-09-27 15:41:24 +0900 | [diff] [blame] | 13 |         return port; | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 14 | } | 
 | 15 |  | 
 | 16 | u8 titan_inb(unsigned long port) | 
 | 17 | { | 
 | 18 |         if (PXSEG(port)) | 
 | 19 |                 return ctrl_inb(port); | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 20 |         else if (is_pci_ioaddr(port)) | 
 | 21 |                 return ctrl_inb(pci_ioaddr(port)); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 22 |         return ctrl_inw(port2adr(port)) & 0xff; | 
 | 23 | } | 
 | 24 |  | 
 | 25 | u8 titan_inb_p(unsigned long port) | 
 | 26 | { | 
 | 27 |         u8 v; | 
 | 28 |  | 
 | 29 |         if (PXSEG(port)) | 
 | 30 |                 v = ctrl_inb(port); | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 31 |         else if (is_pci_ioaddr(port)) | 
 | 32 |                 v = ctrl_inb(pci_ioaddr(port)); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 33 |         else | 
 | 34 |                 v = ctrl_inw(port2adr(port)) & 0xff; | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 35 |         ctrl_delay(); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 36 |         return v; | 
 | 37 | } | 
 | 38 |  | 
 | 39 | u16 titan_inw(unsigned long port) | 
 | 40 | { | 
 | 41 |         if (PXSEG(port)) | 
 | 42 |                 return ctrl_inw(port); | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 43 |         else if (is_pci_ioaddr(port)) | 
 | 44 |                 return ctrl_inw(pci_ioaddr(port)); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 45 |         else if (port >= 0x2000) | 
 | 46 |                 return ctrl_inw(port2adr(port)); | 
 | 47 |         else | 
 | 48 |                 maybebadio(port); | 
 | 49 |         return 0; | 
 | 50 | } | 
 | 51 |  | 
 | 52 | u32 titan_inl(unsigned long port) | 
 | 53 | { | 
 | 54 |         if (PXSEG(port)) | 
 | 55 |                 return ctrl_inl(port); | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 56 |         else if (is_pci_ioaddr(port)) | 
 | 57 |                 return ctrl_inl(pci_ioaddr(port)); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 58 |         else if (port >= 0x2000) | 
 | 59 |                 return ctrl_inw(port2adr(port)); | 
 | 60 |         else | 
 | 61 |                 maybebadio(port); | 
 | 62 |         return 0; | 
 | 63 | } | 
 | 64 |  | 
 | 65 | void titan_outb(u8 value, unsigned long port) | 
 | 66 | { | 
 | 67 |         if (PXSEG(port)) | 
 | 68 |                 ctrl_outb(value, port); | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 69 |         else if (is_pci_ioaddr(port)) | 
 | 70 |                 ctrl_outb(value, pci_ioaddr(port)); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 71 |         else | 
 | 72 |                 ctrl_outw(value, port2adr(port)); | 
 | 73 | } | 
 | 74 |  | 
 | 75 | void titan_outb_p(u8 value, unsigned long port) | 
 | 76 | { | 
 | 77 |         if (PXSEG(port)) | 
 | 78 |                 ctrl_outb(value, port); | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 79 |         else if (is_pci_ioaddr(port)) | 
 | 80 |                 ctrl_outb(value, pci_ioaddr(port)); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 81 |         else | 
 | 82 |                 ctrl_outw(value, port2adr(port)); | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 83 |         ctrl_delay(); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 84 | } | 
 | 85 |  | 
 | 86 | void titan_outw(u16 value, unsigned long port) | 
 | 87 | { | 
 | 88 |         if (PXSEG(port)) | 
 | 89 |                 ctrl_outw(value, port); | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 90 |         else if (is_pci_ioaddr(port)) | 
 | 91 |                 ctrl_outw(value, pci_ioaddr(port)); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 92 |         else if (port >= 0x2000) | 
 | 93 |                 ctrl_outw(value, port2adr(port)); | 
 | 94 |         else | 
 | 95 |                 maybebadio(port); | 
 | 96 | } | 
 | 97 |  | 
 | 98 | void titan_outl(u32 value, unsigned long port) | 
 | 99 | { | 
 | 100 |         if (PXSEG(port)) | 
 | 101 |                 ctrl_outl(value, port); | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 102 |         else if (is_pci_ioaddr(port)) | 
 | 103 |                 ctrl_outl(value, pci_ioaddr(port)); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 104 |         else | 
 | 105 |                 maybebadio(port); | 
 | 106 | } | 
 | 107 |  | 
 | 108 | void titan_insl(unsigned long port, void *dst, unsigned long count) | 
 | 109 | { | 
 | 110 |         maybebadio(port); | 
 | 111 | } | 
 | 112 |  | 
 | 113 | void titan_outsl(unsigned long port, const void *src, unsigned long count) | 
 | 114 | { | 
 | 115 |         maybebadio(port); | 
 | 116 | } | 
 | 117 |  | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 118 | void __iomem *titan_ioport_map(unsigned long port, unsigned int size) | 
 | 119 | { | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 120 | 	if (PXSEG(port) || is_pci_memaddr(port)) | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 121 | 		return (void __iomem *)port; | 
| Paul Mundt | 959f85f | 2006-09-27 16:43:28 +0900 | [diff] [blame] | 122 | 	else if (is_pci_ioaddr(port)) | 
 | 123 | 		return (void __iomem *)pci_ioaddr(port); | 
| Jamie Lenehan | a09749d | 2006-09-27 15:05:39 +0900 | [diff] [blame] | 124 |  | 
 | 125 | 	return (void __iomem *)port2adr(port); | 
 | 126 | } |