1/* 2 * linux/arch/arm/common/it8152.c 3 * 4 * Copyright Compulab Ltd, 2002-2007 5 * Mike Rapoport <mike@compulab.co.il> 6 * 7 * The DMA bouncing part is taken from arch/arm/mach-ixp4xx/common-pci.c 8 * (see this file for respective copyrights) 9 * 10 * Thanks to Guennadi Liakhovetski <gl@dsa-ac.de> for IRQ enumberation 11 * and demux code. 12 * 13 * This program is free software; you can redistribute it and/or modify 14 * it under the terms of the GNU General Public License version 2 as 15 * published by the Free Software Foundation. 16 */ 17 18#include <linux/sched.h> 19#include <linux/kernel.h> 20#include <linux/pci.h> 21#include <linux/ptrace.h> 22#include <linux/interrupt.h> 23#include <linux/mm.h> 24#include <linux/init.h> 25#include <linux/ioport.h> 26#include <linux/irq.h> 27#include <linux/io.h> 28#include <linux/export.h> 29 30#include <asm/mach/pci.h> 31#include <asm/hardware/it8152.h> 32 33#define MAX_SLOTS 21 34 35static void it8152_mask_irq(struct irq_data *d) 36{ 37 unsigned int irq = d->irq; 38 39 if (irq >= IT8152_LD_IRQ(0)) { 40 __raw_writel((__raw_readl(IT8152_INTC_LDCNIMR) | 41 (1 << (irq - IT8152_LD_IRQ(0)))), 42 IT8152_INTC_LDCNIMR); 43 } else if (irq >= IT8152_LP_IRQ(0)) { 44 __raw_writel((__raw_readl(IT8152_INTC_LPCNIMR) | 45 (1 << (irq - IT8152_LP_IRQ(0)))), 46 IT8152_INTC_LPCNIMR); 47 } else if (irq >= IT8152_PD_IRQ(0)) { 48 __raw_writel((__raw_readl(IT8152_INTC_PDCNIMR) | 49 (1 << (irq - IT8152_PD_IRQ(0)))), 50 IT8152_INTC_PDCNIMR); 51 } 52} 53 54static void it8152_unmask_irq(struct irq_data *d) 55{ 56 unsigned int irq = d->irq; 57 58 if (irq >= IT8152_LD_IRQ(0)) { 59 __raw_writel((__raw_readl(IT8152_INTC_LDCNIMR) & 60 ~(1 << (irq - IT8152_LD_IRQ(0)))), 61 IT8152_INTC_LDCNIMR); 62 } else if (irq >= IT8152_LP_IRQ(0)) { 63 __raw_writel((__raw_readl(IT8152_INTC_LPCNIMR) & 64 ~(1 << (irq - IT8152_LP_IRQ(0)))), 65 IT8152_INTC_LPCNIMR); 66 } else if (irq >= IT8152_PD_IRQ(0)) { 67 __raw_writel((__raw_readl(IT8152_INTC_PDCNIMR) & 68 ~(1 << (irq - IT8152_PD_IRQ(0)))), 69 IT8152_INTC_PDCNIMR); 70 } 71} 72 73static struct irq_chip it8152_irq_chip = { 74 .name = "it8152", 75 .irq_ack = it8152_mask_irq, 76 .irq_mask = it8152_mask_irq, 77 .irq_unmask = it8152_unmask_irq, 78}; 79 80void it8152_init_irq(void) 81{ 82 int irq; 83 84 __raw_writel((0xffff), IT8152_INTC_PDCNIMR); 85 __raw_writel((0), IT8152_INTC_PDCNIRR); 86 __raw_writel((0xffff), IT8152_INTC_LPCNIMR); 87 __raw_writel((0), IT8152_INTC_LPCNIRR); 88 __raw_writel((0xffff), IT8152_INTC_LDCNIMR); 89 __raw_writel((0), IT8152_INTC_LDCNIRR); 90 91 for (irq = IT8152_IRQ(0); irq <= IT8152_LAST_IRQ; irq++) { 92 irq_set_chip_and_handler(irq, &it8152_irq_chip, 93 handle_level_irq); 94 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); 95 } 96} 97 98void it8152_irq_demux(unsigned int irq, struct irq_desc *desc) 99{ 100 int bits_pd, bits_lp, bits_ld; 101 int i; 102 103 while (1) { 104 /* Read all */ 105 bits_pd = __raw_readl(IT8152_INTC_PDCNIRR); 106 bits_lp = __raw_readl(IT8152_INTC_LPCNIRR); 107 bits_ld = __raw_readl(IT8152_INTC_LDCNIRR); 108 109 /* Ack */ 110 __raw_writel((~bits_pd), IT8152_INTC_PDCNIRR); 111 __raw_writel((~bits_lp), IT8152_INTC_LPCNIRR); 112 __raw_writel((~bits_ld), IT8152_INTC_LDCNIRR); 113 114 if (!(bits_ld | bits_lp | bits_pd)) { 115 /* Re-read to guarantee, that there was a moment of 116 time, when they all three were 0. */ 117 bits_pd = __raw_readl(IT8152_INTC_PDCNIRR); 118 bits_lp = __raw_readl(IT8152_INTC_LPCNIRR); 119 bits_ld = __raw_readl(IT8152_INTC_LDCNIRR); 120 if (!(bits_ld | bits_lp | bits_pd)) 121 return; 122 } 123 124 bits_pd &= ((1 << IT8152_PD_IRQ_COUNT) - 1); 125 while (bits_pd) { 126 i = __ffs(bits_pd); 127 generic_handle_irq(IT8152_PD_IRQ(i)); 128 bits_pd &= ~(1 << i); 129 } 130 131 bits_lp &= ((1 << IT8152_LP_IRQ_COUNT) - 1); 132 while (bits_lp) { 133 i = __ffs(bits_lp); 134 generic_handle_irq(IT8152_LP_IRQ(i)); 135 bits_lp &= ~(1 << i); 136 } 137 138 bits_ld &= ((1 << IT8152_LD_IRQ_COUNT) - 1); 139 while (bits_ld) { 140 i = __ffs(bits_ld); 141 generic_handle_irq(IT8152_LD_IRQ(i)); 142 bits_ld &= ~(1 << i); 143 } 144 } 145} 146 147/* mapping for on-chip devices */ 148int __init it8152_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) 149{ 150 if ((dev->vendor == PCI_VENDOR_ID_ITE) && 151 (dev->device == PCI_DEVICE_ID_ITE_8152)) { 152 if ((dev->class >> 8) == PCI_CLASS_MULTIMEDIA_AUDIO) 153 return IT8152_AUDIO_INT; 154 if ((dev->class >> 8) == PCI_CLASS_SERIAL_USB) 155 return IT8152_USB_INT; 156 if ((dev->class >> 8) == PCI_CLASS_SYSTEM_DMA) 157 return IT8152_CDMA_INT; 158 } 159 160 return 0; 161} 162 163static unsigned long it8152_pci_dev_base_address(struct pci_bus *bus, 164 unsigned int devfn) 165{ 166 unsigned long addr = 0; 167 168 if (bus->number == 0) { 169 if (devfn < PCI_DEVFN(MAX_SLOTS, 0)) 170 addr = (devfn << 8); 171 } else 172 addr = (bus->number << 16) | (devfn << 8); 173 174 return addr; 175} 176 177static int it8152_pci_read_config(struct pci_bus *bus, 178 unsigned int devfn, int where, 179 int size, u32 *value) 180{ 181 unsigned long addr = it8152_pci_dev_base_address(bus, devfn); 182 u32 v; 183 int shift; 184 185 shift = (where & 3); 186 187 __raw_writel((addr + where), IT8152_PCI_CFG_ADDR); 188 v = (__raw_readl(IT8152_PCI_CFG_DATA) >> (8 * (shift))); 189 190 *value = v; 191 192 return PCIBIOS_SUCCESSFUL; 193} 194 195static int it8152_pci_write_config(struct pci_bus *bus, 196 unsigned int devfn, int where, 197 int size, u32 value) 198{ 199 unsigned long addr = it8152_pci_dev_base_address(bus, devfn); 200 u32 v, vtemp, mask = 0; 201 int shift; 202 203 if (size == 1) 204 mask = 0xff; 205 if (size == 2) 206 mask = 0xffff; 207 208 shift = (where & 3); 209 210 __raw_writel((addr + where), IT8152_PCI_CFG_ADDR); 211 vtemp = __raw_readl(IT8152_PCI_CFG_DATA); 212 213 if (mask) 214 vtemp &= ~(mask << (8 * shift)); 215 else 216 vtemp = 0; 217 218 v = (value << (8 * shift)); 219 __raw_writel((addr + where), IT8152_PCI_CFG_ADDR); 220 __raw_writel((v | vtemp), IT8152_PCI_CFG_DATA); 221 222 return PCIBIOS_SUCCESSFUL; 223} 224 225struct pci_ops it8152_ops = { 226 .read = it8152_pci_read_config, 227 .write = it8152_pci_write_config, 228}; 229 230static struct resource it8152_io = { 231 .name = "IT8152 PCI I/O region", 232 .flags = IORESOURCE_IO, 233}; 234 235static struct resource it8152_mem = { 236 .name = "IT8152 PCI memory region", 237 .start = 0x10000000, 238 .end = 0x13e00000, 239 .flags = IORESOURCE_MEM, 240}; 241 242/* 243 * The following functions are needed for DMA bouncing. 244 * ITE8152 chip can address up to 64MByte, so all the devices 245 * connected to ITE8152 (PCI and USB) should have limited DMA window 246 */ 247static int it8152_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size) 248{ 249 dev_dbg(dev, "%s: dma_addr %08x, size %08x\n", 250 __func__, dma_addr, size); 251 return (dma_addr + size - PHYS_OFFSET) >= SZ_64M; 252} 253 254/* 255 * Setup DMA mask to 64MB on devices connected to ITE8152. Ignore all 256 * other devices. 257 */ 258static int it8152_pci_platform_notify(struct device *dev) 259{ 260 if (dev_is_pci(dev)) { 261 if (dev->dma_mask) 262 *dev->dma_mask = (SZ_64M - 1) | PHYS_OFFSET; 263 dev->coherent_dma_mask = (SZ_64M - 1) | PHYS_OFFSET; 264 dmabounce_register_dev(dev, 2048, 4096, it8152_needs_bounce); 265 } 266 return 0; 267} 268 269static int it8152_pci_platform_notify_remove(struct device *dev) 270{ 271 if (dev_is_pci(dev)) 272 dmabounce_unregister_dev(dev); 273 274 return 0; 275} 276 277int dma_set_coherent_mask(struct device *dev, u64 mask) 278{ 279 if (mask >= PHYS_OFFSET + SZ_64M - 1) 280 return 0; 281 282 return -EIO; 283} 284 285int __init it8152_pci_setup(int nr, struct pci_sys_data *sys) 286{ 287 /* 288 * FIXME: use pci_ioremap_io to remap the IO space here and 289 * move over to the generic io.h implementation. 290 * This requires solving the same problem for PXA PCMCIA 291 * support. 292 */ 293 it8152_io.start = (unsigned long)IT8152_IO_BASE + 0x12000; 294 it8152_io.end = (unsigned long)IT8152_IO_BASE + 0x12000 + 0x100000; 295 296 sys->mem_offset = 0x10000000; 297 sys->io_offset = (unsigned long)IT8152_IO_BASE; 298 299 if (request_resource(&ioport_resource, &it8152_io)) { 300 printk(KERN_ERR "PCI: unable to allocate IO region\n"); 301 goto err0; 302 } 303 if (request_resource(&iomem_resource, &it8152_mem)) { 304 printk(KERN_ERR "PCI: unable to allocate memory region\n"); 305 goto err1; 306 } 307 308 pci_add_resource_offset(&sys->resources, &it8152_io, sys->io_offset); 309 pci_add_resource_offset(&sys->resources, &it8152_mem, sys->mem_offset); 310 311 if (platform_notify || platform_notify_remove) { 312 printk(KERN_ERR "PCI: Can't use platform_notify\n"); 313 goto err2; 314 } 315 316 platform_notify = it8152_pci_platform_notify; 317 platform_notify_remove = it8152_pci_platform_notify_remove; 318 319 return 1; 320 321err2: 322 release_resource(&it8152_io); 323err1: 324 release_resource(&it8152_mem); 325err0: 326 return -EBUSY; 327} 328 329/* ITE bridge requires setting latency timer to avoid early bus access 330 termination by PCI bus master devices 331*/ 332void pcibios_set_master(struct pci_dev *dev) 333{ 334 u8 lat; 335 336 /* no need to update on-chip OHCI controller */ 337 if ((dev->vendor == PCI_VENDOR_ID_ITE) && 338 (dev->device == PCI_DEVICE_ID_ITE_8152) && 339 ((dev->class >> 8) == PCI_CLASS_SERIAL_USB)) 340 return; 341 342 pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat); 343 if (lat < 16) 344 lat = (64 <= pcibios_max_latency) ? 64 : pcibios_max_latency; 345 else if (lat > pcibios_max_latency) 346 lat = pcibios_max_latency; 347 else 348 return; 349 printk(KERN_DEBUG "PCI: Setting latency timer of device %s to %d\n", 350 pci_name(dev), lat); 351 pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); 352} 353 354 355EXPORT_SYMBOL(dma_set_coherent_mask); 356