mirror of
				https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
				synced 2025-10-31 08:08:51 +01:00 
			
		
		
		
	Fixed MTP to work with TWRP
This commit is contained in:
		
						commit
						f6dfaef42e
					
				
					 50820 changed files with 20846062 additions and 0 deletions
				
			
		
							
								
								
									
										77
									
								
								arch/sh/drivers/pci/fixups-cayman.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								arch/sh/drivers/pci/fixups-cayman.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,77 @@ | |||
| #include <linux/kernel.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/pci.h> | ||||
| #include <linux/types.h> | ||||
| #include <cpu/irq.h> | ||||
| #include "pci-sh5.h" | ||||
| 
 | ||||
| int __init pcibios_map_platform_irq(const struct pci_dev *dev, u8 slot, u8 pin) | ||||
| { | ||||
| 	int result = -1; | ||||
| 
 | ||||
| 	/* The complication here is that the PCI IRQ lines from the Cayman's 2
 | ||||
| 	   5V slots get into the CPU via a different path from the IRQ lines | ||||
| 	   from the 3 3.3V slots.  Thus, we have to detect whether the card's | ||||
| 	   interrupts go via the 5V or 3.3V path, i.e. the 'bridge swizzling' | ||||
| 	   at the point where we cross from 5V to 3.3V is not the normal case. | ||||
| 
 | ||||
| 	   The added complication is that we don't know that the 5V slots are | ||||
| 	   always bus 2, because a card containing a PCI-PCI bridge may be | ||||
| 	   plugged into a 3.3V slot, and this changes the bus numbering. | ||||
| 
 | ||||
| 	   Also, the Cayman has an intermediate PCI bus that goes a custom | ||||
| 	   expansion board header (and to the secondary bridge).  This bus has | ||||
| 	   never been used in practice. | ||||
| 
 | ||||
| 	   The 1ary onboard PCI-PCI bridge is device 3 on bus 0 | ||||
| 	   The 2ary onboard PCI-PCI bridge is device 0 on the 2ary bus of | ||||
| 	   the 1ary bridge. | ||||
| 	   */ | ||||
| 
 | ||||
| 	struct slot_pin { | ||||
| 		int slot; | ||||
| 		int pin; | ||||
| 	} path[4]; | ||||
| 	int i=0; | ||||
| 
 | ||||
| 	while (dev->bus->number > 0) { | ||||
| 
 | ||||
| 		slot = path[i].slot = PCI_SLOT(dev->devfn); | ||||
| 		pin = path[i].pin = pci_swizzle_interrupt_pin(dev, pin); | ||||
| 		dev = dev->bus->self; | ||||
| 		i++; | ||||
| 		if (i > 3) panic("PCI path to root bus too long!\n"); | ||||
| 	} | ||||
| 
 | ||||
| 	slot = PCI_SLOT(dev->devfn); | ||||
| 	/* This is the slot on bus 0 through which the device is eventually
 | ||||
| 	   reachable. */ | ||||
| 
 | ||||
| 	/* Now work back up. */ | ||||
| 	if ((slot < 3) || (i == 0)) { | ||||
| 		/* Bus 0 (incl. PCI-PCI bridge itself) : perform the final
 | ||||
| 		   swizzle now. */ | ||||
| 		result = IRQ_INTA + pci_swizzle_interrupt_pin(dev, pin) - 1; | ||||
| 	} else { | ||||
| 		i--; | ||||
| 		slot = path[i].slot; | ||||
| 		pin  = path[i].pin; | ||||
| 		if (slot > 0) { | ||||
| 			panic("PCI expansion bus device found - not handled!\n"); | ||||
| 		} else { | ||||
| 			if (i > 0) { | ||||
| 				/* 5V slots */ | ||||
| 				i--; | ||||
| 				slot = path[i].slot; | ||||
| 				pin  = path[i].pin; | ||||
| 				/* 'pin' was swizzled earlier wrt slot, don't do it again. */ | ||||
| 				result = IRQ_P2INTA + (pin - 1); | ||||
| 			} else { | ||||
| 				/* IRQ for 2ary PCI-PCI bridge : unused */ | ||||
| 				result = -1; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return result; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 awab228
						awab228