mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	ARM: soc: general cleanups
This is a large branch that contains a handful of different cleanups:
 
 - Fixing up the I/O space remapping on PCI on ARM. This is a series
   from Rob Herring that restructures how all pci devices allocate I/O
   space, and it's part of the work to allow multiplatform kernels.
 - A number of cleanup series for OMAP, moving and removing some
   headers, sparse irq rework and in general preparation for
   multiplatform.
 - Final removal of all non-DT boards for Tegra, it is now
   device-tree-only!
 - Removal of a stale platform, nxp4008. It's an old mobile chipset
   that is no longer in use, and was very likely never really used with
   a mainline kernel. We have not been able to find anyone interested
   in keeping it around in the kernel.
 - Removal of the legacy dmaengine driver on tegra
 
 + A handful of other things that I haven't described above.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.11 (GNU/Linux)
 
 iQIcBAABAgAGBQJQaO1fAAoJEIwa5zzehBx3IPgP/jxoO1flVGNVf0reqqyDro/w
 prZmp8cNVH9uv8xG9n9vawObrMQ8M6jCJ449fEWuAZ58EXrpIPd0kkm/MOmxp8K1
 LNs+q2aXxWpD488+b3RK55g3fksqZutTbn3y6HNuCoLG9l8yT/95KX4IIzfEP2Ch
 1TCNHdkTbf37nTBOmKN0x1kahGpWDrOkf9ysHQq+DXAGF4uwNwtR194dqz3HbDND
 hZqRq7qCLn9OwGRGNicPFoB6UcxwZ/+/+u5sX7nqPGoiPofg977mhWk1DFO15EM3
 S+A6g0dZ+XLsL+fFtOl4snSmrG5Et6qTOP0/ItQJgTG+5YdCS09ohCWJwRCBHbgj
 M5arOkyGFdVAlvX7cUux374sMe0AcqUsEmt79mYuBpIE+pBJaRUoCgDcs9FDZeUB
 U6WcE4AkxMtW7DtmVW+mF4ls9/K6cRXgWMuHCUmt1o3m3Ly9ITT7j+ntXnD9nuYk
 ndoVLR6Vxk2BzlkD0JEtg7FRAS9Wgo2DBix05qM1Qkut2iIZRhFQlqJQpNbeNdii
 /3Lg/hqpAVTZKGCd+paegHez61meyFz2PB2IiE0JKANhKHRCWTWRGgKIXkGyCiXk
 wJ2iRCOlMEpmpJgCBzfI32ER/hnW4s64iDjgksEwz6pEt7xCbhwgmwrpf0H0KsSF
 rLroHOMqyISd/Ha52Vin
 =ck1u
 -----END PGP SIGNATURE-----
Merge tag 'cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM soc general cleanups from Olof Johansson:
 "This is a large branch that contains a handful of different cleanups:
   - Fixing up the I/O space remapping on PCI on ARM.  This is a series
     from Rob Herring that restructures how all pci devices allocate I/O
     space, and it's part of the work to allow multiplatform kernels.
   - A number of cleanup series for OMAP, moving and removing some
     headers, sparse irq rework and in general preparation for
     multiplatform.
   - Final removal of all non-DT boards for Tegra, it is now
     device-tree-only!
   - Removal of a stale platform, nxp4008.  It's an old mobile chipset
     that is no longer in use, and was very likely never really used
     with a mainline kernel.  We have not been able to find anyone
     interested in keeping it around in the kernel.
   - Removal of the legacy dmaengine driver on tegra
  + A handful of other things that I haven't described above."
Fix up some conflicts with the staging tree (and because nxp4008 was
removed)
* tag 'cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (184 commits)
  ARM: OMAP2+: serial: Change MAX_HSUART_PORTS to 6
  ARM: OMAP4: twl-common: Support for additional devices on i2c1 bus
  ARM: mmp: using for_each_set_bit to simplify the code
  ARM: tegra: harmony: fix ldo7 regulator-name
  ARM: OMAP2+: Make omap4-keypad.h local
  ARM: OMAP2+: Make l4_3xxx.h local
  ARM: OMAP2+: Make l4_2xxx.h local
  ARM: OMAP2+: Make l3_3xxx.h local
  ARM: OMAP2+: Make l3_2xxx.h local
  ARM: OMAP1: Move irda.h from plat to mach
  ARM: OMAP2+: Make hdq1w.h local
  ARM: OMAP2+: Make gpmc-smsc911x.h local
  ARM: OMAP2+: Make gpmc-smc91x.h local
  ARM: OMAP1: Move flash.h from plat to mach
  ARM: OMAP2+: Make debug-devices.h local
  ARM: OMAP1: Move board-voiceblue.h from plat to mach
  ARM: OMAP1: Move board-sx1.h from plat to mach
  ARM: OMAP2+: Make omap-wakeupgen.h local
  ARM: OMAP2+: Make omap-secure.h local
  ARM: OMAP2+: Make ctrl_module_wkup_44xx.h local
  ...
			
			
This commit is contained in:
		
						commit
						61464c8357
					
				
					 623 changed files with 4617 additions and 15489 deletions
				
			
		|  | @ -1,4 +1,4 @@ | |||
| 			S3C2410 GPIO Control | ||||
| 			S3C24XX GPIO Control | ||||
| 			==================== | ||||
| 
 | ||||
| Introduction | ||||
|  | @ -12,7 +12,7 @@ Introduction | |||
|   of the s3c2410 GPIO system, please read the Samsung provided | ||||
|   data-sheet/users manual to find out the complete list. | ||||
| 
 | ||||
|   See Documentation/arm/Samsung/GPIO.txt for the core implemetation. | ||||
|   See Documentation/arm/Samsung/GPIO.txt for the core implementation. | ||||
| 
 | ||||
| 
 | ||||
| GPIOLIB | ||||
|  | @ -41,8 +41,8 @@ GPIOLIB | |||
| GPIOLIB conversion | ||||
| ------------------ | ||||
| 
 | ||||
| If you need to convert your board or driver to use gpiolib from the exiting | ||||
| s3c2410 api, then here are some notes on the process. | ||||
| If you need to convert your board or driver to use gpiolib from the phased | ||||
| out s3c2410 API, then here are some notes on the process. | ||||
| 
 | ||||
| 1) If your board is exclusively using an GPIO, say to control peripheral | ||||
|    power, then it will require to claim the gpio with gpio_request() before | ||||
|  | @ -55,7 +55,7 @@ s3c2410 api, then here are some notes on the process. | |||
|    as they have the same arguments, and can either take the pin specific | ||||
|    values, or the more generic special-function-number arguments. | ||||
| 
 | ||||
| 3) s3c2410_gpio_pullup() changs have the problem that whilst the  | ||||
| 3) s3c2410_gpio_pullup() changes have the problem that whilst the | ||||
|    s3c2410_gpio_pullup(x, 1) can be easily translated to the | ||||
|    s3c_gpio_setpull(x, S3C_GPIO_PULL_NONE), the s3c2410_gpio_pullup(x, 0) | ||||
|    are not so easy. | ||||
|  | @ -74,7 +74,7 @@ s3c2410 api, then here are some notes on the process. | |||
|    when using gpio_get_value() on an output pin (s3c2410_gpio_getpin | ||||
|    would return the value the pin is supposed to be outputting). | ||||
| 
 | ||||
| 6) s3c2410_gpio_getirq() should be directly replacable with the | ||||
| 6) s3c2410_gpio_getirq() should be directly replaceable with the | ||||
|    gpio_to_irq() call. | ||||
| 
 | ||||
| The s3c2410_gpio and gpio_ calls have always operated on the same gpio | ||||
|  | @ -105,7 +105,7 @@ PIN Numbers | |||
| ----------- | ||||
| 
 | ||||
|   Each pin has an unique number associated with it in regs-gpio.h, | ||||
|   eg S3C2410_GPA(0) or S3C2410_GPF(1). These defines are used to tell | ||||
|   e.g. S3C2410_GPA(0) or S3C2410_GPF(1). These defines are used to tell | ||||
|   the GPIO functions which pin is to be used. | ||||
| 
 | ||||
|   With the conversion to gpiolib, there is no longer a direct conversion | ||||
|  | @ -120,31 +120,27 @@ Configuring a pin | |||
|   The following function allows the configuration of a given pin to | ||||
|   be changed. | ||||
| 
 | ||||
|     void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function); | ||||
|     void s3c_gpio_cfgpin(unsigned int pin, unsigned int function); | ||||
| 
 | ||||
|   Eg: | ||||
|   e.g.: | ||||
| 
 | ||||
|      s3c2410_gpio_cfgpin(S3C2410_GPA(0), S3C2410_GPA0_ADDR0); | ||||
|      s3c2410_gpio_cfgpin(S3C2410_GPE(8), S3C2410_GPE8_SDDAT1); | ||||
|      s3c_gpio_cfgpin(S3C2410_GPA(0), S3C_GPIO_SFN(1)); | ||||
|      s3c_gpio_cfgpin(S3C2410_GPE(8), S3C_GPIO_SFN(2)); | ||||
| 
 | ||||
|    which would turn GPA(0) into the lowest Address line A0, and set | ||||
|    GPE(8) to be connected to the SDIO/MMC controller's SDDAT1 line. | ||||
| 
 | ||||
|    The s3c_gpio_cfgpin() call is a functional replacement for this call. | ||||
| 
 | ||||
| 
 | ||||
| Reading the current configuration | ||||
| --------------------------------- | ||||
| 
 | ||||
|   The current configuration of a pin can be read by using: | ||||
|   The current configuration of a pin can be read by using standard | ||||
|   gpiolib function: | ||||
| 
 | ||||
|   s3c2410_gpio_getcfg(unsigned int pin); | ||||
|   s3c_gpio_getcfg(unsigned int pin); | ||||
| 
 | ||||
|   The return value will be from the same set of values which can be | ||||
|   passed to s3c2410_gpio_cfgpin(). | ||||
| 
 | ||||
|   The s3c_gpio_getcfg() call should be a functional replacement for | ||||
|   this call. | ||||
|   passed to s3c_gpio_cfgpin(). | ||||
| 
 | ||||
| 
 | ||||
| Configuring a pull-up resistor | ||||
|  | @ -154,61 +150,33 @@ Configuring a pull-up resistor | |||
|   pull-up resistors enabled. This can be configured by the following | ||||
|   function: | ||||
| 
 | ||||
|     void s3c2410_gpio_pullup(unsigned int pin, unsigned int to); | ||||
|     void s3c_gpio_setpull(unsigned int pin, unsigned int to); | ||||
| 
 | ||||
|   Where the to value is zero to set the pull-up off, and 1 to enable | ||||
|   the specified pull-up. Any other values are currently undefined. | ||||
| 
 | ||||
|   The s3c_gpio_setpull() offers similar functionality, but with the | ||||
|   ability to encode whether the pull is up or down. Currently there | ||||
|   is no 'just on' state, so up or down must be selected. | ||||
|   Where the to value is S3C_GPIO_PULL_NONE to set the pull-up off, | ||||
|   and S3C_GPIO_PULL_UP to enable the specified pull-up. Any other | ||||
|   values are currently undefined. | ||||
| 
 | ||||
| 
 | ||||
| Getting the state of a PIN | ||||
| -------------------------- | ||||
| Getting and setting the state of a PIN | ||||
| -------------------------------------- | ||||
| 
 | ||||
|   The state of a pin can be read by using the function: | ||||
| 
 | ||||
|     unsigned int s3c2410_gpio_getpin(unsigned int pin); | ||||
| 
 | ||||
|   This will return either zero or non-zero. Do not count on this | ||||
|   function returning 1 if the pin is set. | ||||
| 
 | ||||
|   This call is now implemented by the relevant gpiolib calls, convert | ||||
|   your board or driver to use gpiolib. | ||||
| 
 | ||||
| 
 | ||||
| Setting the state of a PIN | ||||
| -------------------------- | ||||
| 
 | ||||
|   The value an pin is outputing can be modified by using the following: | ||||
| 
 | ||||
|     void s3c2410_gpio_setpin(unsigned int pin, unsigned int to); | ||||
| 
 | ||||
|   Which sets the given pin to the value. Use 0 to write 0, and 1 to | ||||
|   set the output to 1. | ||||
| 
 | ||||
|   This call is now implemented by the relevant gpiolib calls, convert | ||||
|   These calls are now implemented by the relevant gpiolib calls, convert | ||||
|   your board or driver to use gpiolib. | ||||
| 
 | ||||
| 
 | ||||
| Getting the IRQ number associated with a PIN | ||||
| -------------------------------------------- | ||||
| 
 | ||||
|   The following function can map the given pin number to an IRQ | ||||
|   A standard gpiolib function can map the given pin number to an IRQ | ||||
|   number to pass to the IRQ system. | ||||
| 
 | ||||
|    int s3c2410_gpio_getirq(unsigned int pin); | ||||
|    int gpio_to_irq(unsigned int pin); | ||||
| 
 | ||||
|   Note, not all pins have an IRQ. | ||||
| 
 | ||||
|   This call is now implemented by the relevant gpiolib calls, convert | ||||
|   your board or driver to use gpiolib. | ||||
| 
 | ||||
| 
 | ||||
| Authour | ||||
| Author | ||||
| ------- | ||||
| 
 | ||||
| 
 | ||||
| Ben Dooks, 03 October 2004 | ||||
| Copyright 2004 Ben Dooks, Simtec Electronics | ||||
|  |  | |||
|  | @ -5,14 +5,14 @@ Introduction | |||
| ------------ | ||||
| 
 | ||||
| This outlines the Samsung GPIO implementation and the architecture | ||||
| specific calls provided alongisde the drivers/gpio core. | ||||
| specific calls provided alongside the drivers/gpio core. | ||||
| 
 | ||||
| 
 | ||||
| S3C24XX (Legacy) | ||||
| ---------------- | ||||
| 
 | ||||
| See Documentation/arm/Samsung-S3C24XX/GPIO.txt for more information | ||||
| about these devices. Their implementation is being brought into line | ||||
| about these devices. Their implementation has been brought into line | ||||
| with the core samsung implementation described in this document. | ||||
| 
 | ||||
| 
 | ||||
|  | @ -29,7 +29,7 @@ GPIO numbering is synchronised between the Samsung and gpiolib system. | |||
| PIN configuration | ||||
| ----------------- | ||||
| 
 | ||||
| Pin configuration is specific to the Samsung architecutre, with each SoC | ||||
| Pin configuration is specific to the Samsung architecture, with each SoC | ||||
| registering the necessary information for the core gpio configuration | ||||
| implementation to configure pins as necessary. | ||||
| 
 | ||||
|  | @ -38,5 +38,3 @@ driver or machine to change gpio configuration. | |||
| 
 | ||||
| See arch/arm/plat-samsung/include/plat/gpio-cfg.h for more information | ||||
| on these functions. | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -51,6 +51,9 @@ ffc00000	ffefffff	DMA memory mapping region.  Memory returned | |||
| ff000000	ffbfffff	Reserved for future expansion of DMA | ||||
| 				mapping region. | ||||
| 
 | ||||
| fee00000	feffffff	Mapping of PCI I/O space. This is a static | ||||
| 				mapping within the vmalloc space. | ||||
| 
 | ||||
| VMALLOC_START	VMALLOC_END-1	vmalloc() / ioremap() space. | ||||
| 				Memory returned by vmalloc/ioremap will | ||||
| 				be dynamically placed in this region. | ||||
|  |  | |||
|  | @ -7,8 +7,12 @@ representation in the device tree should be done as under:- | |||
| Required properties: | ||||
| 
 | ||||
| - compatible : should be one of | ||||
| 	"arm,cortex-a15-pmu" | ||||
| 	"arm,cortex-a9-pmu" | ||||
| 	"arm,cortex-a8-pmu" | ||||
| 	"arm,cortex-a7-pmu" | ||||
| 	"arm,cortex-a5-pmu" | ||||
| 	"arm,arm11mpcore-pmu" | ||||
| 	"arm,arm1176-pmu" | ||||
| 	"arm,arm1136-pmu" | ||||
| - interrupts : 1 combined interrupt or 1 per core. | ||||
|  |  | |||
|  | @ -595,7 +595,6 @@ M:	Will Deacon <will.deacon@arm.com> | |||
| S:	Maintained | ||||
| F:	arch/arm/kernel/perf_event* | ||||
| F:	arch/arm/oprofile/common.c | ||||
| F:	arch/arm/kernel/pmu.c | ||||
| F:	arch/arm/include/asm/pmu.h | ||||
| F:	arch/arm/kernel/hw_breakpoint.c | ||||
| F:	arch/arm/include/asm/hw_breakpoint.h | ||||
|  |  | |||
|  | @ -279,7 +279,6 @@ config ARCH_INTEGRATOR | |||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select PLAT_VERSATILE | ||||
| 	select PLAT_VERSATILE_FPGA_IRQ | ||||
| 	select NEED_MACH_IO_H | ||||
| 	select NEED_MACH_MEMORY_H | ||||
| 	select SPARSE_IRQ | ||||
| 	select MULTI_IRQ_HANDLER | ||||
|  | @ -311,7 +310,6 @@ config ARCH_VERSATILE | |||
| 	select ICST | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select ARCH_WANT_OPTIONAL_GPIOLIB | ||||
| 	select NEED_MACH_IO_H if PCI | ||||
| 	select PLAT_VERSATILE | ||||
| 	select PLAT_VERSATILE_CLOCK | ||||
| 	select PLAT_VERSATILE_CLCD | ||||
|  | @ -406,9 +404,8 @@ config ARCH_GEMINI | |||
| 	help | ||||
| 	  Support for the Cortina Systems Gemini family SoCs | ||||
| 
 | ||||
| config ARCH_PRIMA2 | ||||
| 	bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform" | ||||
| 	select CPU_V7 | ||||
| config ARCH_SIRF | ||||
| 	bool "CSR SiRF" | ||||
| 	select NO_IOPORT | ||||
| 	select ARCH_REQUIRE_GPIOLIB | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
|  | @ -418,9 +415,8 @@ config ARCH_PRIMA2 | |||
| 	select PINCTRL | ||||
| 	select PINCTRL_SIRF | ||||
| 	select USE_OF | ||||
| 	select ZONE_DMA | ||||
| 	help | ||||
|           Support for CSR SiRFSoC ARM Cortex A9 Platform | ||||
| 	  Support for CSR SiRFprimaII/Marco/Polo platforms | ||||
| 
 | ||||
| config ARCH_EBSA110 | ||||
| 	bool "EBSA-110" | ||||
|  | @ -455,7 +451,7 @@ config ARCH_FOOTBRIDGE | |||
| 	select FOOTBRIDGE | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select HAVE_IDE | ||||
| 	select NEED_MACH_IO_H | ||||
| 	select NEED_MACH_IO_H if !MMU | ||||
| 	select NEED_MACH_MEMORY_H | ||||
| 	help | ||||
| 	  Support for systems based on the DC21285 companion chip | ||||
|  | @ -512,7 +508,6 @@ config ARCH_IOP13XX | |||
| 	select PCI | ||||
| 	select ARCH_SUPPORTS_MSI | ||||
| 	select VMSPLIT_1G | ||||
| 	select NEED_MACH_IO_H | ||||
| 	select NEED_MACH_MEMORY_H | ||||
| 	select NEED_RET_TO_USER | ||||
| 	help | ||||
|  | @ -522,7 +517,6 @@ config ARCH_IOP32X | |||
| 	bool "IOP32x-based" | ||||
| 	depends on MMU | ||||
| 	select CPU_XSCALE | ||||
| 	select NEED_MACH_IO_H | ||||
| 	select NEED_RET_TO_USER | ||||
| 	select PLAT_IOP | ||||
| 	select PCI | ||||
|  | @ -535,7 +529,6 @@ config ARCH_IOP33X | |||
| 	bool "IOP33x-based" | ||||
| 	depends on MMU | ||||
| 	select CPU_XSCALE | ||||
| 	select NEED_MACH_IO_H | ||||
| 	select NEED_RET_TO_USER | ||||
| 	select PLAT_IOP | ||||
| 	select PCI | ||||
|  | @ -575,7 +568,6 @@ config ARCH_DOVE | |||
| 	select PCI | ||||
| 	select ARCH_REQUIRE_GPIOLIB | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select NEED_MACH_IO_H | ||||
| 	select PLAT_ORION | ||||
| 	help | ||||
| 	  Support for the Marvell Dove SoC 88AP510 | ||||
|  | @ -586,7 +578,6 @@ config ARCH_KIRKWOOD | |||
| 	select PCI | ||||
| 	select ARCH_REQUIRE_GPIOLIB | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select NEED_MACH_IO_H | ||||
| 	select PLAT_ORION | ||||
| 	help | ||||
| 	  Support for the following Marvell Kirkwood series SoCs: | ||||
|  | @ -613,7 +604,6 @@ config ARCH_MV78XX0 | |||
| 	select PCI | ||||
| 	select ARCH_REQUIRE_GPIOLIB | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select NEED_MACH_IO_H | ||||
| 	select PLAT_ORION | ||||
| 	help | ||||
| 	  Support for the following Marvell MV78xx0 series SoCs: | ||||
|  | @ -626,7 +616,6 @@ config ARCH_ORION5X | |||
| 	select PCI | ||||
| 	select ARCH_REQUIRE_GPIOLIB | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select NEED_MACH_IO_H | ||||
| 	select PLAT_ORION | ||||
| 	help | ||||
| 	  Support for the following Marvell Orion 5x series SoCs: | ||||
|  | @ -651,8 +640,9 @@ config ARCH_KS8695 | |||
| 	bool "Micrel/Kendin KS8695" | ||||
| 	select CPU_ARM922T | ||||
| 	select ARCH_REQUIRE_GPIOLIB | ||||
| 	select ARCH_USES_GETTIMEOFFSET | ||||
| 	select NEED_MACH_MEMORY_H | ||||
| 	select CLKSRC_MMIO | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	help | ||||
| 	  Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based | ||||
| 	  System-on-Chip devices. | ||||
|  | @ -682,7 +672,6 @@ config ARCH_TEGRA | |||
| 	select HAVE_CLK | ||||
| 	select HAVE_SMP | ||||
| 	select MIGHT_HAVE_CACHE_L2X0 | ||||
| 	select NEED_MACH_IO_H if PCI | ||||
| 	select ARCH_HAS_CPUFREQ | ||||
| 	select USE_OF | ||||
| 	help | ||||
|  | @ -708,14 +697,6 @@ config ARCH_PICOXCELL | |||
| 	  family of Femtocell devices.  The picoxcell support requires device tree | ||||
| 	  for all boards. | ||||
| 
 | ||||
| config ARCH_PNX4008 | ||||
| 	bool "Philips Nexperia PNX4008 Mobile" | ||||
| 	select CPU_ARM926T | ||||
| 	select CLKDEV_LOOKUP | ||||
| 	select ARCH_USES_GETTIMEOFFSET | ||||
| 	help | ||||
| 	  This enables support for Philips PNX4008 mobile platform. | ||||
| 
 | ||||
| config ARCH_PXA | ||||
| 	bool "PXA2xx/PXA3xx-based" | ||||
| 	depends on MMU | ||||
|  | @ -911,7 +892,6 @@ config ARCH_SHARK | |||
| 	select PCI | ||||
| 	select ARCH_USES_GETTIMEOFFSET | ||||
| 	select NEED_MACH_MEMORY_H | ||||
| 	select NEED_MACH_IO_H | ||||
| 	help | ||||
| 	  Support for the StrongARM based Digital DNARD machine, also known | ||||
| 	  as "Shark" (<http://www.shark-linux.de/shark.html>). | ||||
|  | @ -930,6 +910,7 @@ config ARCH_U300 | |||
| 	select COMMON_CLK | ||||
| 	select GENERIC_GPIO | ||||
| 	select ARCH_REQUIRE_GPIOLIB | ||||
| 	select SPARSE_IRQ | ||||
| 	help | ||||
| 	  Support for ST-Ericsson U300 series mobile platforms. | ||||
| 
 | ||||
|  | @ -1117,6 +1098,8 @@ source "arch/arm/mach-exynos/Kconfig" | |||
| 
 | ||||
| source "arch/arm/mach-shmobile/Kconfig" | ||||
| 
 | ||||
| source "arch/arm/mach-prima2/Kconfig" | ||||
| 
 | ||||
| source "arch/arm/mach-tegra/Kconfig" | ||||
| 
 | ||||
| source "arch/arm/mach-u300/Kconfig" | ||||
|  | @ -1178,12 +1161,6 @@ config XSCALE_PMU | |||
| 	depends on CPU_XSCALE | ||||
| 	default y | ||||
| 
 | ||||
| config CPU_HAS_PMU | ||||
| 	depends on (CPU_V6 || CPU_V6K || CPU_V7 || XSCALE_PMU) && \ | ||||
| 		   (!ARCH_OMAP3 || OMAP3_EMU) | ||||
| 	default y | ||||
| 	bool | ||||
| 
 | ||||
| config MULTI_IRQ_HANDLER | ||||
| 	bool | ||||
| 	help | ||||
|  | @ -1756,7 +1733,7 @@ config HIGHPTE | |||
| 
 | ||||
| config HW_PERF_EVENTS | ||||
| 	bool "Enable hardware performance counter support for perf events" | ||||
| 	depends on PERF_EVENTS && CPU_HAS_PMU | ||||
| 	depends on PERF_EVENTS | ||||
| 	default y | ||||
| 	help | ||||
| 	  Enable hardware performance counter support for perf events. If | ||||
|  |  | |||
|  | @ -167,7 +167,6 @@ machine-$(CONFIG_ARCH_OMAP1)		:= omap1 | |||
| machine-$(CONFIG_ARCH_OMAP2PLUS)	:= omap2 | ||||
| machine-$(CONFIG_ARCH_ORION5X)		:= orion5x | ||||
| machine-$(CONFIG_ARCH_PICOXCELL)	:= picoxcell | ||||
| machine-$(CONFIG_ARCH_PNX4008)		:= pnx4008 | ||||
| machine-$(CONFIG_ARCH_PRIMA2)		:= prima2 | ||||
| machine-$(CONFIG_ARCH_PXA)		:= pxa | ||||
| machine-$(CONFIG_ARCH_REALVIEW)		:= realview | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ | |||
| 			i2c@1001d000 { | ||||
| 				clock-frequency = <400000>; | ||||
| 				status = "okay"; | ||||
| 				at24@4c { | ||||
| 				at24@52 { | ||||
| 					compatible = "at,24c32"; | ||||
| 					pagesize = <32>; | ||||
| 					reg = <0x52>; | ||||
|  |  | |||
|  | @ -275,6 +275,160 @@ | |||
| 	i2c@7000d000 { | ||||
| 		status = "okay"; | ||||
| 		clock-frequency = <400000>; | ||||
| 
 | ||||
| 		pmic: tps6586x@34 { | ||||
| 			compatible = "ti,tps6586x"; | ||||
| 			reg = <0x34>; | ||||
| 			interrupts = <0 86 0x4>; | ||||
| 
 | ||||
| 			ti,system-power-controller; | ||||
| 
 | ||||
| 			#gpio-cells = <2>; | ||||
| 			gpio-controller; | ||||
| 
 | ||||
| 			sys-supply = <&vdd_5v0_reg>; | ||||
| 			vin-sm0-supply = <&sys_reg>; | ||||
| 			vin-sm1-supply = <&sys_reg>; | ||||
| 			vin-sm2-supply = <&sys_reg>; | ||||
| 			vinldo01-supply = <&sm2_reg>; | ||||
| 			vinldo23-supply = <&sm2_reg>; | ||||
| 			vinldo4-supply = <&sm2_reg>; | ||||
| 			vinldo678-supply = <&sm2_reg>; | ||||
| 			vinldo9-supply = <&sm2_reg>; | ||||
| 
 | ||||
| 			regulators { | ||||
| 				#address-cells = <1>; | ||||
| 				#size-cells = <0>; | ||||
| 
 | ||||
| 				sys_reg: regulator@0 { | ||||
| 					reg = <0>; | ||||
| 					regulator-compatible = "sys"; | ||||
| 					regulator-name = "vdd_sys"; | ||||
| 					regulator-always-on; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@1 { | ||||
| 					reg = <1>; | ||||
| 					regulator-compatible = "sm0"; | ||||
| 					regulator-name = "vdd_sm0,vdd_core"; | ||||
| 					regulator-min-microvolt = <1200000>; | ||||
| 					regulator-max-microvolt = <1200000>; | ||||
| 					regulator-always-on; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@2 { | ||||
| 					reg = <2>; | ||||
| 					regulator-compatible = "sm1"; | ||||
| 					regulator-name = "vdd_sm1,vdd_cpu"; | ||||
| 					regulator-min-microvolt = <1000000>; | ||||
| 					regulator-max-microvolt = <1000000>; | ||||
| 					regulator-always-on; | ||||
| 				}; | ||||
| 
 | ||||
| 				sm2_reg: regulator@3 { | ||||
| 					reg = <3>; | ||||
| 					regulator-compatible = "sm2"; | ||||
| 					regulator-name = "vdd_sm2,vin_ldo*"; | ||||
| 					regulator-min-microvolt = <3700000>; | ||||
| 					regulator-max-microvolt = <3700000>; | ||||
| 					regulator-always-on; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@4 { | ||||
| 					reg = <4>; | ||||
| 					regulator-compatible = "ldo0"; | ||||
| 					regulator-name = "vdd_ldo0,vddio_pex_clk"; | ||||
| 					regulator-min-microvolt = <3300000>; | ||||
| 					regulator-max-microvolt = <3300000>; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@5 { | ||||
| 					reg = <5>; | ||||
| 					regulator-compatible = "ldo1"; | ||||
| 					regulator-name = "vdd_ldo1,avdd_pll*"; | ||||
| 					regulator-min-microvolt = <1100000>; | ||||
| 					regulator-max-microvolt = <1100000>; | ||||
| 					regulator-always-on; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@6 { | ||||
| 					reg = <6>; | ||||
| 					regulator-compatible = "ldo2"; | ||||
| 					regulator-name = "vdd_ldo2,vdd_rtc"; | ||||
| 					regulator-min-microvolt = <1200000>; | ||||
| 					regulator-max-microvolt = <1200000>; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@7 { | ||||
| 					reg = <7>; | ||||
| 					regulator-compatible = "ldo3"; | ||||
| 					regulator-name = "vdd_ldo3,avdd_usb*"; | ||||
| 					regulator-min-microvolt = <3300000>; | ||||
| 					regulator-max-microvolt = <3300000>; | ||||
| 					regulator-always-on; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@8 { | ||||
| 					reg = <8>; | ||||
| 					regulator-compatible = "ldo4"; | ||||
| 					regulator-name = "vdd_ldo4,avdd_osc,vddio_sys"; | ||||
| 					regulator-min-microvolt = <1800000>; | ||||
| 					regulator-max-microvolt = <1800000>; | ||||
| 					regulator-always-on; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@9 { | ||||
| 					reg = <9>; | ||||
| 					regulator-compatible = "ldo5"; | ||||
| 					regulator-name = "vdd_ldo5,vcore_mmc"; | ||||
| 					regulator-min-microvolt = <2850000>; | ||||
| 					regulator-max-microvolt = <2850000>; | ||||
| 					regulator-always-on; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@10 { | ||||
| 					reg = <10>; | ||||
| 					regulator-compatible = "ldo6"; | ||||
| 					regulator-name = "vdd_ldo6,avdd_vdac"; | ||||
| 					regulator-min-microvolt = <1800000>; | ||||
| 					regulator-max-microvolt = <1800000>; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@11 { | ||||
| 					reg = <11>; | ||||
| 					regulator-compatible = "ldo7"; | ||||
| 					regulator-name = "vdd_ldo7,avdd_hdmi"; | ||||
| 					regulator-min-microvolt = <3300000>; | ||||
| 					regulator-max-microvolt = <3300000>; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@12 { | ||||
| 					reg = <12>; | ||||
| 					regulator-compatible = "ldo8"; | ||||
| 					regulator-name = "vdd_ldo8,avdd_hdmi_pll"; | ||||
| 					regulator-min-microvolt = <1800000>; | ||||
| 					regulator-max-microvolt = <1800000>; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@13 { | ||||
| 					reg = <13>; | ||||
| 					regulator-compatible = "ldo9"; | ||||
| 					regulator-name = "vdd_ldo9,avdd_2v85,vdd_ddr_rx"; | ||||
| 					regulator-min-microvolt = <2850000>; | ||||
| 					regulator-max-microvolt = <2850000>; | ||||
| 					regulator-always-on; | ||||
| 				}; | ||||
| 
 | ||||
| 				regulator@14 { | ||||
| 					reg = <14>; | ||||
| 					regulator-compatible = "ldo_rtc"; | ||||
| 					regulator-name = "vdd_rtc_out,vdd_cell"; | ||||
| 					regulator-min-microvolt = <3300000>; | ||||
| 					regulator-max-microvolt = <3300000>; | ||||
| 					regulator-always-on; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 	pmc { | ||||
|  | @ -310,6 +464,72 @@ | |||
| 		bus-width = <8>; | ||||
| 	}; | ||||
| 
 | ||||
| 	regulators { | ||||
| 		compatible = "simple-bus"; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 
 | ||||
| 		vdd_5v0_reg: regulator@0 { | ||||
| 			compatible = "regulator-fixed"; | ||||
| 			reg = <0>; | ||||
| 			regulator-name = "vdd_5v0"; | ||||
| 			regulator-min-microvolt = <5000000>; | ||||
| 			regulator-max-microvolt = <5000000>; | ||||
| 			regulator-always-on; | ||||
| 		}; | ||||
| 
 | ||||
| 		regulator@1 { | ||||
| 			compatible = "regulator-fixed"; | ||||
| 			reg = <1>; | ||||
| 			regulator-name = "vdd_1v5"; | ||||
| 			regulator-min-microvolt = <1500000>; | ||||
| 			regulator-max-microvolt = <1500000>; | ||||
| 			gpio = <&pmic 0 0>; | ||||
| 		}; | ||||
| 
 | ||||
| 		regulator@2 { | ||||
| 			compatible = "regulator-fixed"; | ||||
| 			reg = <2>; | ||||
| 			regulator-name = "vdd_1v2"; | ||||
| 			regulator-min-microvolt = <1200000>; | ||||
| 			regulator-max-microvolt = <1200000>; | ||||
| 			gpio = <&pmic 1 0>; | ||||
| 			enable-active-high; | ||||
| 		}; | ||||
| 
 | ||||
| 		regulator@3 { | ||||
| 			compatible = "regulator-fixed"; | ||||
| 			reg = <3>; | ||||
| 			regulator-name = "vdd_1v05"; | ||||
| 			regulator-min-microvolt = <1050000>; | ||||
| 			regulator-max-microvolt = <1050000>; | ||||
| 			gpio = <&pmic 2 0>; | ||||
| 			enable-active-high; | ||||
| 			/* Hack until board-harmony-pcie.c is removed */ | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| 
 | ||||
| 		regulator@4 { | ||||
| 			compatible = "regulator-fixed"; | ||||
| 			reg = <4>; | ||||
| 			regulator-name = "vdd_pnl"; | ||||
| 			regulator-min-microvolt = <2800000>; | ||||
| 			regulator-max-microvolt = <2800000>; | ||||
| 			gpio = <&gpio 22 0>; /* gpio PC6 */ | ||||
| 			enable-active-high; | ||||
| 		}; | ||||
| 
 | ||||
| 		regulator@5 { | ||||
| 			compatible = "regulator-fixed"; | ||||
| 			reg = <5>; | ||||
| 			regulator-name = "vdd_bl"; | ||||
| 			regulator-min-microvolt = <2800000>; | ||||
| 			regulator-max-microvolt = <2800000>; | ||||
| 			gpio = <&gpio 176 0>; /* gpio PW0 */ | ||||
| 			enable-active-high; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 	sound { | ||||
| 		compatible = "nvidia,tegra-audio-wm8903-harmony", | ||||
| 			     "nvidia,tegra-audio-wm8903"; | ||||
|  |  | |||
|  | @ -1,472 +0,0 @@ | |||
| CONFIG_EXPERIMENTAL=y | ||||
| CONFIG_SYSVIPC=y | ||||
| CONFIG_POSIX_MQUEUE=y | ||||
| CONFIG_BSD_PROCESS_ACCT=y | ||||
| CONFIG_AUDIT=y | ||||
| CONFIG_LOG_BUF_SHIFT=14 | ||||
| CONFIG_BLK_DEV_INITRD=y | ||||
| CONFIG_EXPERT=y | ||||
| CONFIG_SLAB=y | ||||
| CONFIG_MODULES=y | ||||
| CONFIG_MODULE_UNLOAD=y | ||||
| CONFIG_MODULE_FORCE_UNLOAD=y | ||||
| CONFIG_MODVERSIONS=y | ||||
| CONFIG_MODULE_SRCVERSION_ALL=y | ||||
| CONFIG_ARCH_PNX4008=y | ||||
| CONFIG_PREEMPT=y | ||||
| CONFIG_ZBOOT_ROM_TEXT=0x0 | ||||
| CONFIG_ZBOOT_ROM_BSS=0x0 | ||||
| CONFIG_CMDLINE="mem=64M console=ttyS0,115200" | ||||
| CONFIG_FPE_NWFPE=y | ||||
| CONFIG_BINFMT_AOUT=m | ||||
| CONFIG_BINFMT_MISC=m | ||||
| CONFIG_PM=y | ||||
| CONFIG_PACKET=y | ||||
| CONFIG_UNIX=y | ||||
| CONFIG_INET=y | ||||
| CONFIG_IP_MULTICAST=y | ||||
| CONFIG_IP_ADVANCED_ROUTER=y | ||||
| CONFIG_IP_MULTIPLE_TABLES=y | ||||
| CONFIG_IP_ROUTE_MULTIPATH=y | ||||
| CONFIG_IP_ROUTE_VERBOSE=y | ||||
| CONFIG_IP_PNP=y | ||||
| CONFIG_IP_PNP_DHCP=y | ||||
| CONFIG_IP_PNP_BOOTP=y | ||||
| CONFIG_IP_MROUTE=y | ||||
| CONFIG_IP_PIMSM_V1=y | ||||
| CONFIG_IP_PIMSM_V2=y | ||||
| CONFIG_SYN_COOKIES=y | ||||
| CONFIG_INET_AH=m | ||||
| CONFIG_INET_ESP=m | ||||
| CONFIG_INET_IPCOMP=m | ||||
| CONFIG_IPV6_PRIVACY=y | ||||
| CONFIG_INET6_AH=m | ||||
| CONFIG_INET6_ESP=m | ||||
| CONFIG_INET6_IPCOMP=m | ||||
| CONFIG_IPV6_TUNNEL=m | ||||
| CONFIG_NETFILTER=y | ||||
| CONFIG_IP_VS=m | ||||
| CONFIG_IP_VS_PROTO_TCP=y | ||||
| CONFIG_IP_VS_PROTO_UDP=y | ||||
| CONFIG_IP_VS_PROTO_ESP=y | ||||
| CONFIG_IP_VS_PROTO_AH=y | ||||
| CONFIG_IP_VS_RR=m | ||||
| CONFIG_IP_VS_WRR=m | ||||
| CONFIG_IP_VS_LC=m | ||||
| CONFIG_IP_VS_WLC=m | ||||
| CONFIG_IP_VS_LBLC=m | ||||
| CONFIG_IP_VS_LBLCR=m | ||||
| CONFIG_IP_VS_DH=m | ||||
| CONFIG_IP_VS_SH=m | ||||
| CONFIG_IP_VS_SED=m | ||||
| CONFIG_IP_VS_NQ=m | ||||
| CONFIG_IP_VS_FTP=m | ||||
| CONFIG_IP_NF_QUEUE=m | ||||
| CONFIG_IP6_NF_QUEUE=m | ||||
| CONFIG_DECNET_NF_GRABULATOR=m | ||||
| CONFIG_BRIDGE_NF_EBTABLES=m | ||||
| CONFIG_BRIDGE_EBT_BROUTE=m | ||||
| CONFIG_BRIDGE_EBT_T_FILTER=m | ||||
| CONFIG_BRIDGE_EBT_T_NAT=m | ||||
| CONFIG_BRIDGE_EBT_802_3=m | ||||
| CONFIG_BRIDGE_EBT_AMONG=m | ||||
| CONFIG_BRIDGE_EBT_ARP=m | ||||
| CONFIG_BRIDGE_EBT_IP=m | ||||
| CONFIG_BRIDGE_EBT_LIMIT=m | ||||
| CONFIG_BRIDGE_EBT_MARK=m | ||||
| CONFIG_BRIDGE_EBT_PKTTYPE=m | ||||
| CONFIG_BRIDGE_EBT_STP=m | ||||
| CONFIG_BRIDGE_EBT_VLAN=m | ||||
| CONFIG_BRIDGE_EBT_ARPREPLY=m | ||||
| CONFIG_BRIDGE_EBT_DNAT=m | ||||
| CONFIG_BRIDGE_EBT_MARK_T=m | ||||
| CONFIG_BRIDGE_EBT_REDIRECT=m | ||||
| CONFIG_BRIDGE_EBT_SNAT=m | ||||
| CONFIG_BRIDGE_EBT_LOG=m | ||||
| CONFIG_IP_SCTP=m | ||||
| CONFIG_ATM=y | ||||
| CONFIG_ATM_CLIP=y | ||||
| CONFIG_ATM_LANE=m | ||||
| CONFIG_ATM_MPOA=m | ||||
| CONFIG_ATM_BR2684=m | ||||
| CONFIG_BRIDGE=m | ||||
| CONFIG_VLAN_8021Q=m | ||||
| CONFIG_DECNET=m | ||||
| CONFIG_LLC2=m | ||||
| CONFIG_IPX=m | ||||
| CONFIG_ATALK=m | ||||
| CONFIG_DEV_APPLETALK=m | ||||
| CONFIG_IPDDP=m | ||||
| CONFIG_IPDDP_ENCAP=y | ||||
| CONFIG_IPDDP_DECAP=y | ||||
| CONFIG_X25=m | ||||
| CONFIG_LAPB=m | ||||
| CONFIG_ECONET=m | ||||
| CONFIG_ECONET_AUNUDP=y | ||||
| CONFIG_ECONET_NATIVE=y | ||||
| CONFIG_WAN_ROUTER=m | ||||
| CONFIG_NET_SCHED=y | ||||
| CONFIG_NET_SCH_CBQ=m | ||||
| CONFIG_NET_SCH_HTB=m | ||||
| CONFIG_NET_SCH_HFSC=m | ||||
| CONFIG_NET_SCH_ATM=m | ||||
| CONFIG_NET_SCH_PRIO=m | ||||
| CONFIG_NET_SCH_RED=m | ||||
| CONFIG_NET_SCH_SFQ=m | ||||
| CONFIG_NET_SCH_TEQL=m | ||||
| CONFIG_NET_SCH_TBF=m | ||||
| CONFIG_NET_SCH_GRED=m | ||||
| CONFIG_NET_SCH_DSMARK=m | ||||
| CONFIG_NET_SCH_NETEM=m | ||||
| CONFIG_NET_CLS_TCINDEX=m | ||||
| CONFIG_NET_CLS_ROUTE4=m | ||||
| CONFIG_NET_CLS_FW=m | ||||
| CONFIG_NET_CLS_U32=m | ||||
| CONFIG_NET_CLS_RSVP=m | ||||
| CONFIG_NET_CLS_RSVP6=m | ||||
| CONFIG_NET_PKTGEN=m | ||||
| CONFIG_MTD=y | ||||
| CONFIG_MTD_CONCAT=y | ||||
| CONFIG_MTD_PARTITIONS=y | ||||
| CONFIG_MTD_REDBOOT_PARTS=y | ||||
| CONFIG_MTD_CHAR=y | ||||
| CONFIG_MTD_BLOCK=y | ||||
| CONFIG_MTD_SLRAM=m | ||||
| CONFIG_MTD_PHRAM=m | ||||
| CONFIG_MTD_MTDRAM=m | ||||
| CONFIG_MTD_DOC2000=m | ||||
| CONFIG_MTD_DOC2001=m | ||||
| CONFIG_MTD_DOC2001PLUS=m | ||||
| CONFIG_MTD_NAND=y | ||||
| CONFIG_MTD_NAND_NANDSIM=m | ||||
| CONFIG_BLK_DEV_LOOP=y | ||||
| CONFIG_BLK_DEV_CRYPTOLOOP=y | ||||
| CONFIG_BLK_DEV_NBD=y | ||||
| CONFIG_BLK_DEV_RAM=y | ||||
| CONFIG_BLK_DEV_RAM_SIZE=8192 | ||||
| CONFIG_CDROM_PKTCDVD=m | ||||
| CONFIG_EEPROM_LEGACY=m | ||||
| CONFIG_SCSI=m | ||||
| CONFIG_BLK_DEV_SD=m | ||||
| CONFIG_CHR_DEV_ST=m | ||||
| CONFIG_CHR_DEV_OSST=m | ||||
| CONFIG_BLK_DEV_SR=m | ||||
| CONFIG_CHR_DEV_SG=m | ||||
| CONFIG_CHR_DEV_SCH=m | ||||
| CONFIG_SCSI_MULTI_LUN=y | ||||
| CONFIG_SCSI_CONSTANTS=y | ||||
| CONFIG_SCSI_LOGGING=y | ||||
| CONFIG_SCSI_SPI_ATTRS=m | ||||
| CONFIG_SCSI_FC_ATTRS=m | ||||
| CONFIG_SCSI_DEBUG=m | ||||
| CONFIG_NETDEVICES=y | ||||
| CONFIG_DUMMY=m | ||||
| CONFIG_BONDING=m | ||||
| CONFIG_EQUALIZER=m | ||||
| CONFIG_TUN=m | ||||
| CONFIG_NET_ETHERNET=y | ||||
| CONFIG_USB_CATC=m | ||||
| CONFIG_USB_KAWETH=m | ||||
| CONFIG_USB_PEGASUS=m | ||||
| CONFIG_USB_RTL8150=m | ||||
| CONFIG_USB_USBNET=m | ||||
| # CONFIG_USB_NET_CDC_SUBSET is not set | ||||
| CONFIG_WAN=y | ||||
| CONFIG_HDLC=m | ||||
| CONFIG_HDLC_RAW=m | ||||
| CONFIG_HDLC_RAW_ETH=m | ||||
| CONFIG_HDLC_CISCO=m | ||||
| CONFIG_HDLC_FR=m | ||||
| CONFIG_HDLC_PPP=m | ||||
| CONFIG_HDLC_X25=m | ||||
| CONFIG_DLCI=m | ||||
| CONFIG_WAN_ROUTER_DRIVERS=m | ||||
| CONFIG_LAPBETHER=m | ||||
| CONFIG_X25_ASY=m | ||||
| CONFIG_ATM_TCP=m | ||||
| CONFIG_PPP=m | ||||
| CONFIG_PPP_MULTILINK=y | ||||
| CONFIG_PPP_FILTER=y | ||||
| CONFIG_PPP_ASYNC=m | ||||
| CONFIG_PPP_SYNC_TTY=m | ||||
| CONFIG_PPP_DEFLATE=m | ||||
| CONFIG_PPP_BSDCOMP=m | ||||
| CONFIG_PPP_MPPE=m | ||||
| CONFIG_PPPOE=m | ||||
| CONFIG_PPPOATM=m | ||||
| CONFIG_SLIP=m | ||||
| CONFIG_SLIP_COMPRESSED=y | ||||
| CONFIG_SLIP_SMART=y | ||||
| CONFIG_SLIP_MODE_SLIP6=y | ||||
| CONFIG_NETCONSOLE=m | ||||
| # CONFIG_INPUT_MOUSEDEV is not set | ||||
| CONFIG_INPUT_JOYDEV=m | ||||
| CONFIG_INPUT_EVDEV=m | ||||
| CONFIG_INPUT_EVBUG=m | ||||
| CONFIG_KEYBOARD_LKKBD=m | ||||
| CONFIG_KEYBOARD_NEWTON=m | ||||
| CONFIG_KEYBOARD_SUNKBD=m | ||||
| CONFIG_KEYBOARD_XTKBD=m | ||||
| CONFIG_MOUSE_PS2=m | ||||
| CONFIG_MOUSE_SERIAL=m | ||||
| CONFIG_MOUSE_VSXXXAA=m | ||||
| CONFIG_INPUT_JOYSTICK=y | ||||
| CONFIG_JOYSTICK_ANALOG=m | ||||
| CONFIG_JOYSTICK_A3D=m | ||||
| CONFIG_JOYSTICK_ADI=m | ||||
| CONFIG_JOYSTICK_COBRA=m | ||||
| CONFIG_JOYSTICK_GF2K=m | ||||
| CONFIG_JOYSTICK_GRIP=m | ||||
| CONFIG_JOYSTICK_GRIP_MP=m | ||||
| CONFIG_JOYSTICK_GUILLEMOT=m | ||||
| CONFIG_JOYSTICK_INTERACT=m | ||||
| CONFIG_JOYSTICK_SIDEWINDER=m | ||||
| CONFIG_JOYSTICK_TMDC=m | ||||
| CONFIG_JOYSTICK_IFORCE=m | ||||
| CONFIG_JOYSTICK_IFORCE_USB=y | ||||
| CONFIG_JOYSTICK_IFORCE_232=y | ||||
| CONFIG_JOYSTICK_WARRIOR=m | ||||
| CONFIG_JOYSTICK_MAGELLAN=m | ||||
| CONFIG_JOYSTICK_SPACEORB=m | ||||
| CONFIG_JOYSTICK_SPACEBALL=m | ||||
| CONFIG_JOYSTICK_STINGER=m | ||||
| CONFIG_JOYSTICK_JOYDUMP=m | ||||
| CONFIG_INPUT_TOUCHSCREEN=y | ||||
| CONFIG_TOUCHSCREEN_GUNZE=m | ||||
| CONFIG_INPUT_MISC=y | ||||
| CONFIG_INPUT_UINPUT=m | ||||
| CONFIG_SERIO_SERPORT=m | ||||
| CONFIG_SERIO_RAW=m | ||||
| CONFIG_GAMEPORT_NS558=m | ||||
| CONFIG_GAMEPORT_L4=m | ||||
| CONFIG_SERIAL_8250=y | ||||
| CONFIG_SERIAL_8250_CONSOLE=y | ||||
| CONFIG_SERIAL_8250_EXTENDED=y | ||||
| CONFIG_SERIAL_8250_MANY_PORTS=y | ||||
| CONFIG_SERIAL_8250_SHARE_IRQ=y | ||||
| CONFIG_SERIAL_8250_RSA=y | ||||
| CONFIG_HW_RANDOM=y | ||||
| CONFIG_I2C=y | ||||
| CONFIG_I2C_CHARDEV=y | ||||
| CONFIG_SPI=y | ||||
| CONFIG_SPI_BITBANG=y | ||||
| # CONFIG_HWMON is not set | ||||
| CONFIG_WATCHDOG=y | ||||
| CONFIG_SOFT_WATCHDOG=m | ||||
| CONFIG_USBPCWATCHDOG=m | ||||
| # CONFIG_VGA_CONSOLE is not set | ||||
| CONFIG_SOUND=m | ||||
| CONFIG_SND=m | ||||
| CONFIG_SND_SEQUENCER=m | ||||
| CONFIG_SND_SEQ_DUMMY=m | ||||
| CONFIG_SND_MIXER_OSS=m | ||||
| CONFIG_SND_PCM_OSS=m | ||||
| CONFIG_SND_SEQUENCER_OSS=y | ||||
| CONFIG_SND_DUMMY=m | ||||
| CONFIG_SND_VIRMIDI=m | ||||
| CONFIG_SND_MTPAV=m | ||||
| CONFIG_SND_SERIAL_U16550=m | ||||
| CONFIG_SND_MPU401=m | ||||
| CONFIG_SND_USB_AUDIO=m | ||||
| CONFIG_SOUND_PRIME=m | ||||
| CONFIG_USB_HID=m | ||||
| CONFIG_USB_HIDDEV=y | ||||
| CONFIG_USB_KBD=m | ||||
| CONFIG_USB_MOUSE=m | ||||
| CONFIG_USB=y | ||||
| CONFIG_USB_DEVICEFS=y | ||||
| CONFIG_USB_MON=y | ||||
| CONFIG_USB_SL811_HCD=m | ||||
| CONFIG_USB_ACM=m | ||||
| CONFIG_USB_PRINTER=m | ||||
| CONFIG_USB_STORAGE=m | ||||
| CONFIG_USB_STORAGE_DATAFAB=m | ||||
| CONFIG_USB_STORAGE_FREECOM=m | ||||
| CONFIG_USB_STORAGE_USBAT=m | ||||
| CONFIG_USB_STORAGE_SDDR09=m | ||||
| CONFIG_USB_STORAGE_SDDR55=m | ||||
| CONFIG_USB_STORAGE_JUMPSHOT=m | ||||
| CONFIG_USB_MDC800=m | ||||
| CONFIG_USB_MICROTEK=m | ||||
| CONFIG_USB_SERIAL=m | ||||
| CONFIG_USB_SERIAL_GENERIC=y | ||||
| CONFIG_USB_SERIAL_BELKIN=m | ||||
| CONFIG_USB_SERIAL_WHITEHEAT=m | ||||
| CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | ||||
| CONFIG_USB_SERIAL_CYPRESS_M8=m | ||||
| CONFIG_USB_SERIAL_EMPEG=m | ||||
| CONFIG_USB_SERIAL_FTDI_SIO=m | ||||
| CONFIG_USB_SERIAL_VISOR=m | ||||
| CONFIG_USB_SERIAL_IPAQ=m | ||||
| CONFIG_USB_SERIAL_IR=m | ||||
| CONFIG_USB_SERIAL_EDGEPORT=m | ||||
| CONFIG_USB_SERIAL_EDGEPORT_TI=m | ||||
| CONFIG_USB_SERIAL_IPW=m | ||||
| CONFIG_USB_SERIAL_KEYSPAN_PDA=m | ||||
| CONFIG_USB_SERIAL_KEYSPAN=m | ||||
| CONFIG_USB_SERIAL_KLSI=m | ||||
| CONFIG_USB_SERIAL_KOBIL_SCT=m | ||||
| CONFIG_USB_SERIAL_MCT_U232=m | ||||
| CONFIG_USB_SERIAL_PL2303=m | ||||
| CONFIG_USB_SERIAL_SAFE=m | ||||
| CONFIG_USB_SERIAL_CYBERJACK=m | ||||
| CONFIG_USB_SERIAL_XIRCOM=m | ||||
| CONFIG_USB_SERIAL_OMNINET=m | ||||
| CONFIG_USB_RIO500=m | ||||
| CONFIG_USB_LEGOTOWER=m | ||||
| CONFIG_USB_LCD=m | ||||
| CONFIG_USB_LED=m | ||||
| CONFIG_USB_CYTHERM=m | ||||
| CONFIG_USB_TEST=m | ||||
| CONFIG_USB_ATM=m | ||||
| CONFIG_USB_SPEEDTOUCH=m | ||||
| CONFIG_USB_GADGET=m | ||||
| CONFIG_USB_GADGET_DUMMY_HCD=y | ||||
| CONFIG_USB_ZERO=m | ||||
| CONFIG_USB_ETH=m | ||||
| CONFIG_USB_GADGETFS=m | ||||
| CONFIG_USB_FILE_STORAGE=m | ||||
| CONFIG_USB_G_SERIAL=m | ||||
| CONFIG_MMC=m | ||||
| CONFIG_EXT2_FS=y | ||||
| CONFIG_EXT2_FS_XATTR=y | ||||
| CONFIG_EXT2_FS_POSIX_ACL=y | ||||
| CONFIG_EXT2_FS_SECURITY=y | ||||
| CONFIG_EXT3_FS=m | ||||
| CONFIG_EXT3_FS_POSIX_ACL=y | ||||
| CONFIG_EXT3_FS_SECURITY=y | ||||
| CONFIG_REISERFS_FS=m | ||||
| CONFIG_REISERFS_FS_XATTR=y | ||||
| CONFIG_REISERFS_FS_POSIX_ACL=y | ||||
| CONFIG_REISERFS_FS_SECURITY=y | ||||
| CONFIG_JFS_FS=m | ||||
| CONFIG_JFS_POSIX_ACL=y | ||||
| CONFIG_JFS_STATISTICS=y | ||||
| CONFIG_XFS_FS=m | ||||
| CONFIG_XFS_QUOTA=y | ||||
| CONFIG_XFS_POSIX_ACL=y | ||||
| CONFIG_XFS_RT=y | ||||
| CONFIG_INOTIFY=y | ||||
| CONFIG_QUOTA=y | ||||
| CONFIG_QFMT_V1=m | ||||
| CONFIG_QFMT_V2=m | ||||
| CONFIG_AUTOFS_FS=m | ||||
| CONFIG_AUTOFS4_FS=m | ||||
| CONFIG_ISO9660_FS=m | ||||
| CONFIG_JOLIET=y | ||||
| CONFIG_ZISOFS=y | ||||
| CONFIG_UDF_FS=m | ||||
| CONFIG_MSDOS_FS=m | ||||
| CONFIG_VFAT_FS=m | ||||
| CONFIG_NTFS_FS=m | ||||
| CONFIG_TMPFS=y | ||||
| CONFIG_ADFS_FS=m | ||||
| CONFIG_AFFS_FS=m | ||||
| CONFIG_HFS_FS=m | ||||
| CONFIG_HFSPLUS_FS=m | ||||
| CONFIG_BEFS_FS=m | ||||
| CONFIG_BFS_FS=m | ||||
| CONFIG_EFS_FS=m | ||||
| CONFIG_JFFS2_FS=m | ||||
| CONFIG_CRAMFS=y | ||||
| CONFIG_VXFS_FS=m | ||||
| CONFIG_MINIX_FS=m | ||||
| CONFIG_HPFS_FS=m | ||||
| CONFIG_QNX4FS_FS=m | ||||
| CONFIG_ROMFS_FS=m | ||||
| CONFIG_SYSV_FS=m | ||||
| CONFIG_UFS_FS=m | ||||
| CONFIG_NFS_FS=y | ||||
| CONFIG_NFS_V3=y | ||||
| CONFIG_NFS_V4=y | ||||
| CONFIG_ROOT_NFS=y | ||||
| CONFIG_NFSD=m | ||||
| CONFIG_NFSD_V4=y | ||||
| CONFIG_RPCSEC_GSS_SPKM3=m | ||||
| CONFIG_SMB_FS=m | ||||
| CONFIG_CIFS=m | ||||
| CONFIG_NCP_FS=m | ||||
| CONFIG_NCPFS_PACKET_SIGNING=y | ||||
| CONFIG_NCPFS_IOCTL_LOCKING=y | ||||
| CONFIG_NCPFS_STRONG=y | ||||
| CONFIG_NCPFS_NFS_NS=y | ||||
| CONFIG_NCPFS_OS2_NS=y | ||||
| CONFIG_NCPFS_NLS=y | ||||
| CONFIG_NCPFS_EXTRAS=y | ||||
| CONFIG_CODA_FS=m | ||||
| CONFIG_AFS_FS=m | ||||
| CONFIG_PARTITION_ADVANCED=y | ||||
| CONFIG_ACORN_PARTITION=y | ||||
| CONFIG_ACORN_PARTITION_ICS=y | ||||
| CONFIG_ACORN_PARTITION_RISCIX=y | ||||
| CONFIG_OSF_PARTITION=y | ||||
| CONFIG_AMIGA_PARTITION=y | ||||
| CONFIG_ATARI_PARTITION=y | ||||
| CONFIG_MAC_PARTITION=y | ||||
| CONFIG_BSD_DISKLABEL=y | ||||
| CONFIG_MINIX_SUBPARTITION=y | ||||
| CONFIG_SOLARIS_X86_PARTITION=y | ||||
| CONFIG_UNIXWARE_DISKLABEL=y | ||||
| CONFIG_LDM_PARTITION=y | ||||
| CONFIG_SGI_PARTITION=y | ||||
| CONFIG_ULTRIX_PARTITION=y | ||||
| CONFIG_SUN_PARTITION=y | ||||
| CONFIG_NLS_DEFAULT="cp437" | ||||
| CONFIG_NLS_CODEPAGE_437=m | ||||
| CONFIG_NLS_CODEPAGE_737=m | ||||
| CONFIG_NLS_CODEPAGE_775=m | ||||
| CONFIG_NLS_CODEPAGE_850=m | ||||
| CONFIG_NLS_CODEPAGE_852=m | ||||
| CONFIG_NLS_CODEPAGE_855=m | ||||
| CONFIG_NLS_CODEPAGE_857=m | ||||
| CONFIG_NLS_CODEPAGE_860=m | ||||
| CONFIG_NLS_CODEPAGE_861=m | ||||
| CONFIG_NLS_CODEPAGE_862=m | ||||
| CONFIG_NLS_CODEPAGE_863=m | ||||
| CONFIG_NLS_CODEPAGE_864=m | ||||
| CONFIG_NLS_CODEPAGE_865=m | ||||
| CONFIG_NLS_CODEPAGE_866=m | ||||
| CONFIG_NLS_CODEPAGE_869=m | ||||
| CONFIG_NLS_CODEPAGE_936=m | ||||
| CONFIG_NLS_CODEPAGE_950=m | ||||
| CONFIG_NLS_CODEPAGE_932=m | ||||
| CONFIG_NLS_CODEPAGE_949=m | ||||
| CONFIG_NLS_CODEPAGE_874=m | ||||
| CONFIG_NLS_ISO8859_8=m | ||||
| CONFIG_NLS_CODEPAGE_1250=m | ||||
| CONFIG_NLS_CODEPAGE_1251=m | ||||
| CONFIG_NLS_ASCII=m | ||||
| CONFIG_NLS_ISO8859_1=m | ||||
| CONFIG_NLS_ISO8859_2=m | ||||
| CONFIG_NLS_ISO8859_3=m | ||||
| CONFIG_NLS_ISO8859_4=m | ||||
| CONFIG_NLS_ISO8859_5=m | ||||
| CONFIG_NLS_ISO8859_6=m | ||||
| CONFIG_NLS_ISO8859_7=m | ||||
| CONFIG_NLS_ISO8859_9=m | ||||
| CONFIG_NLS_ISO8859_13=m | ||||
| CONFIG_NLS_ISO8859_14=m | ||||
| CONFIG_NLS_ISO8859_15=m | ||||
| CONFIG_NLS_KOI8_R=m | ||||
| CONFIG_NLS_KOI8_U=m | ||||
| CONFIG_MAGIC_SYSRQ=y | ||||
| CONFIG_DEBUG_KERNEL=y | ||||
| CONFIG_DEBUG_MUTEXES=y | ||||
| # CONFIG_DEBUG_BUGVERBOSE is not set | ||||
| CONFIG_SECURITY=y | ||||
| CONFIG_CRYPTO_NULL=m | ||||
| CONFIG_CRYPTO_TEST=m | ||||
| CONFIG_CRYPTO_HMAC=y | ||||
| CONFIG_CRYPTO_MD4=m | ||||
| CONFIG_CRYPTO_MICHAEL_MIC=m | ||||
| CONFIG_CRYPTO_SHA256=m | ||||
| CONFIG_CRYPTO_SHA512=m | ||||
| CONFIG_CRYPTO_WP512=m | ||||
| CONFIG_CRYPTO_ANUBIS=m | ||||
| CONFIG_CRYPTO_BLOWFISH=m | ||||
| CONFIG_CRYPTO_CAST6=m | ||||
| CONFIG_CRYPTO_KHAZAD=m | ||||
| CONFIG_CRYPTO_SERPENT=m | ||||
| CONFIG_CRYPTO_TEA=m | ||||
| CONFIG_CRYPTO_TWOFISH=m | ||||
| CONFIG_CRC16=m | ||||
|  | @ -1,4 +1,6 @@ | |||
| CONFIG_EXPERIMENTAL=y | ||||
| CONFIG_NO_HZ=y | ||||
| CONFIG_HIGH_RES_TIMERS=y | ||||
| CONFIG_RELAY=y | ||||
| CONFIG_BLK_DEV_INITRD=y | ||||
| CONFIG_KALLSYMS_ALL=y | ||||
|  | @ -8,9 +10,7 @@ CONFIG_MODULE_UNLOAD=y | |||
| CONFIG_PARTITION_ADVANCED=y | ||||
| CONFIG_BSD_DISKLABEL=y | ||||
| CONFIG_SOLARIS_X86_PARTITION=y | ||||
| CONFIG_ARCH_PRIMA2=y | ||||
| CONFIG_NO_HZ=y | ||||
| CONFIG_HIGH_RES_TIMERS=y | ||||
| CONFIG_ARCH_SIRF=y | ||||
| CONFIG_PREEMPT=y | ||||
| CONFIG_AEABI=y | ||||
| CONFIG_KEXEC=y | ||||
|  | @ -36,7 +36,6 @@ CONFIG_SPI=y | |||
| CONFIG_SPI_SIRF=y | ||||
| CONFIG_SPI_SPIDEV=y | ||||
| # CONFIG_HWMON is not set | ||||
| # CONFIG_HID_SUPPORT is not set | ||||
| CONFIG_USB_GADGET=y | ||||
| CONFIG_USB_FILE_STORAGE=m | ||||
| CONFIG_USB_MASS_STORAGE=m | ||||
|  |  | |||
|  | @ -145,6 +145,8 @@ CONFIG_MMC_SDHCI_TEGRA=y | |||
| CONFIG_RTC_CLASS=y | ||||
| CONFIG_RTC_DRV_EM3027=y | ||||
| CONFIG_RTC_DRV_TEGRA=y | ||||
| CONFIG_DMADEVICES=y | ||||
| CONFIG_TEGRA20_APB_DMA=y | ||||
| CONFIG_STAGING=y | ||||
| CONFIG_SENSORS_ISL29018=y | ||||
| CONFIG_SENSORS_ISL29028=y | ||||
|  |  | |||
|  | @ -217,18 +217,8 @@ extern int iop3xx_get_init_atu(void); | |||
| #define IOP3XX_PCI_LOWER_MEM_PA	0x80000000 | ||||
| #define IOP3XX_PCI_MEM_WINDOW_SIZE	0x08000000 | ||||
| 
 | ||||
| #define IOP3XX_PCI_IO_WINDOW_SIZE	0x00010000 | ||||
| #define IOP3XX_PCI_LOWER_IO_PA		0x90000000 | ||||
| #define IOP3XX_PCI_LOWER_IO_VA		0xfe000000 | ||||
| #define IOP3XX_PCI_LOWER_IO_BA		0x90000000 | ||||
| #define IOP3XX_PCI_UPPER_IO_PA		(IOP3XX_PCI_LOWER_IO_PA +\ | ||||
| 					IOP3XX_PCI_IO_WINDOW_SIZE - 1) | ||||
| #define IOP3XX_PCI_UPPER_IO_VA		(IOP3XX_PCI_LOWER_IO_VA +\ | ||||
| 					IOP3XX_PCI_IO_WINDOW_SIZE - 1) | ||||
| #define IOP3XX_PCI_IO_PHYS_TO_VIRT(addr) (((u32) (addr) -\ | ||||
| 					IOP3XX_PCI_LOWER_IO_PA) +\ | ||||
| 					IOP3XX_PCI_LOWER_IO_VA) | ||||
| 
 | ||||
| #define IOP3XX_PCI_LOWER_IO_BA		0x00000000 | ||||
| 
 | ||||
| #ifndef __ASSEMBLY__ | ||||
| 
 | ||||
|  |  | |||
|  | @ -113,11 +113,19 @@ static inline void __iomem *__typesafe_io(unsigned long addr) | |||
| #define __iowmb()		do { } while (0) | ||||
| #endif | ||||
| 
 | ||||
| /* PCI fixed i/o mapping */ | ||||
| #define PCI_IO_VIRT_BASE	0xfee00000 | ||||
| 
 | ||||
| extern int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr); | ||||
| 
 | ||||
| /*
 | ||||
|  * Now, pick up the machine-defined IO definitions | ||||
|  */ | ||||
| #ifdef CONFIG_NEED_MACH_IO_H | ||||
| #include <mach/io.h> | ||||
| #elif defined(CONFIG_PCI) | ||||
| #define IO_SPACE_LIMIT	((resource_size_t)0xfffff) | ||||
| #define __io(a)		__typesafe_io(PCI_IO_VIRT_BASE + ((a) & IO_SPACE_LIMIT)) | ||||
| #else | ||||
| #define __io(a)		__typesafe_io((a) & IO_SPACE_LIMIT) | ||||
| #endif | ||||
|  |  | |||
|  | @ -9,6 +9,9 @@ | |||
|  * | ||||
|  *  Page table mapping constructs and function prototypes | ||||
|  */ | ||||
| #ifndef __ASM_MACH_MAP_H | ||||
| #define __ASM_MACH_MAP_H | ||||
| 
 | ||||
| #include <asm/io.h> | ||||
| 
 | ||||
| struct map_desc { | ||||
|  | @ -34,6 +37,8 @@ struct map_desc { | |||
| 
 | ||||
| #ifdef CONFIG_MMU | ||||
| extern void iotable_init(struct map_desc *, int); | ||||
| extern void vm_reserve_area_early(unsigned long addr, unsigned long size, | ||||
| 				  void *caller); | ||||
| 
 | ||||
| struct mem_type; | ||||
| extern const struct mem_type *get_mem_type(unsigned int type); | ||||
|  | @ -44,4 +49,7 @@ extern int ioremap_page(unsigned long virt, unsigned long phys, | |||
| 			const struct mem_type *mtype); | ||||
| #else | ||||
| #define iotable_init(map,num)	do { } while (0) | ||||
| #define vm_reserve_area_early(a,s,c)	do { } while (0) | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -11,6 +11,8 @@ | |||
| #ifndef __ASM_MACH_PCI_H | ||||
| #define __ASM_MACH_PCI_H | ||||
| 
 | ||||
| #include <linux/ioport.h> | ||||
| 
 | ||||
| struct pci_sys_data; | ||||
| struct pci_ops; | ||||
| struct pci_bus; | ||||
|  | @ -42,6 +44,8 @@ struct pci_sys_data { | |||
| 	unsigned long	io_offset;	/* bus->cpu IO mapping offset		*/ | ||||
| 	struct pci_bus	*bus;		/* PCI bus				*/ | ||||
| 	struct list_head resources;	/* root bus resources (apertures)       */ | ||||
| 	struct resource io_res; | ||||
| 	char		io_res_name[12]; | ||||
| 					/* Bridge swizzling			*/ | ||||
| 	u8		(*swizzle)(struct pci_dev *, u8 *); | ||||
| 					/* IRQ mapping				*/ | ||||
|  | @ -54,6 +58,15 @@ struct pci_sys_data { | |||
|  */ | ||||
| void pci_common_init(struct hw_pci *); | ||||
| 
 | ||||
| /*
 | ||||
|  * Setup early fixed I/O mapping. | ||||
|  */ | ||||
| #if defined(CONFIG_PCI) | ||||
| extern void pci_map_io_early(unsigned long pfn); | ||||
| #else | ||||
| static inline void pci_map_io_early(unsigned long pfn) {} | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * PCI controllers | ||||
|  */ | ||||
|  |  | |||
|  | @ -12,6 +12,13 @@ | |||
| #ifndef __ARM_PERF_EVENT_H__ | ||||
| #define __ARM_PERF_EVENT_H__ | ||||
| 
 | ||||
| /* Nothing to see here... */ | ||||
| /*
 | ||||
|  * The ARMv7 CPU PMU supports up to 32 event counters. | ||||
|  */ | ||||
| #define ARMPMU_MAX_HWEVENTS		32 | ||||
| 
 | ||||
| #define HW_OP_UNSUPPORTED		0xFFFF | ||||
| #define C(_x)				PERF_COUNT_HW_CACHE_##_x | ||||
| #define CACHE_OP_UNSUPPORTED		0xFFFF | ||||
| 
 | ||||
| #endif /* __ARM_PERF_EVENT_H__ */ | ||||
|  |  | |||
|  | @ -15,15 +15,6 @@ | |||
| #include <linux/interrupt.h> | ||||
| #include <linux/perf_event.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * Types of PMUs that can be accessed directly and require mutual | ||||
|  * exclusion between profiling tools. | ||||
|  */ | ||||
| enum arm_pmu_type { | ||||
| 	ARM_PMU_DEVICE_CPU	= 0, | ||||
| 	ARM_NUM_PMU_DEVICES, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * struct arm_pmu_platdata - ARM PMU platform data | ||||
|  * | ||||
|  | @ -31,54 +22,24 @@ enum arm_pmu_type { | |||
|  *	interrupt and passed the address of the low level handler, | ||||
|  *	and can be used to implement any platform specific handling | ||||
|  *	before or after calling it. | ||||
|  * @enable_irq: an optional handler which will be called after | ||||
|  *	request_irq and be used to handle some platform specific | ||||
|  *	irq enablement | ||||
|  * @disable_irq: an optional handler which will be called before | ||||
|  *	free_irq and be used to handle some platform specific | ||||
|  *	irq disablement | ||||
|  * @runtime_resume: an optional handler which will be called by the | ||||
|  *	runtime PM framework following a call to pm_runtime_get(). | ||||
|  *	Note that if pm_runtime_get() is called more than once in | ||||
|  *	succession this handler will only be called once. | ||||
|  * @runtime_suspend: an optional handler which will be called by the | ||||
|  *	runtime PM framework following a call to pm_runtime_put(). | ||||
|  *	Note that if pm_runtime_get() is called more than once in | ||||
|  *	succession this handler will only be called following the | ||||
|  *	final call to pm_runtime_put() that actually disables the | ||||
|  *	hardware. | ||||
|  */ | ||||
| struct arm_pmu_platdata { | ||||
| 	irqreturn_t (*handle_irq)(int irq, void *dev, | ||||
| 				  irq_handler_t pmu_handler); | ||||
| 	void (*enable_irq)(int irq); | ||||
| 	void (*disable_irq)(int irq); | ||||
| 	int (*runtime_resume)(struct device *dev); | ||||
| 	int (*runtime_suspend)(struct device *dev); | ||||
| }; | ||||
| 
 | ||||
| #ifdef CONFIG_CPU_HAS_PMU | ||||
| 
 | ||||
| /**
 | ||||
|  * reserve_pmu() - reserve the hardware performance counters | ||||
|  * | ||||
|  * Reserve the hardware performance counters in the system for exclusive use. | ||||
|  * Returns 0 on success or -EBUSY if the lock is already held. | ||||
|  */ | ||||
| extern int | ||||
| reserve_pmu(enum arm_pmu_type type); | ||||
| 
 | ||||
| /**
 | ||||
|  * release_pmu() - Relinquish control of the performance counters | ||||
|  * | ||||
|  * Release the performance counters and allow someone else to use them. | ||||
|  */ | ||||
| extern void | ||||
| release_pmu(enum arm_pmu_type type); | ||||
| 
 | ||||
| #else /* CONFIG_CPU_HAS_PMU */ | ||||
| 
 | ||||
| #include <linux/err.h> | ||||
| 
 | ||||
| static inline int | ||||
| reserve_pmu(enum arm_pmu_type type) | ||||
| { | ||||
| 	return -ENODEV; | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| release_pmu(enum arm_pmu_type type)	{ } | ||||
| 
 | ||||
| #endif /* CONFIG_CPU_HAS_PMU */ | ||||
| 
 | ||||
| #ifdef CONFIG_HW_PERF_EVENTS | ||||
| 
 | ||||
| /* The events for a given PMU register set. */ | ||||
|  | @ -103,7 +64,6 @@ struct pmu_hw_events { | |||
| 
 | ||||
| struct arm_pmu { | ||||
| 	struct pmu	pmu; | ||||
| 	enum arm_pmu_type type; | ||||
| 	cpumask_t	active_irqs; | ||||
| 	char		*name; | ||||
| 	irqreturn_t	(*handle_irq)(int irq_num, void *dev); | ||||
|  | @ -118,6 +78,8 @@ struct arm_pmu { | |||
| 	void		(*start)(void); | ||||
| 	void		(*stop)(void); | ||||
| 	void		(*reset)(void *); | ||||
| 	int		(*request_irq)(irq_handler_t handler); | ||||
| 	void		(*free_irq)(void); | ||||
| 	int		(*map_event)(struct perf_event *event); | ||||
| 	int		num_events; | ||||
| 	atomic_t	active_events; | ||||
|  | @ -129,7 +91,9 @@ struct arm_pmu { | |||
| 
 | ||||
| #define to_arm_pmu(p) (container_of(p, struct arm_pmu, pmu)) | ||||
| 
 | ||||
| int __init armpmu_register(struct arm_pmu *armpmu, char *name, int type); | ||||
| extern const struct dev_pm_ops armpmu_dev_pm_ops; | ||||
| 
 | ||||
| int armpmu_register(struct arm_pmu *armpmu, char *name, int type); | ||||
| 
 | ||||
| u64 armpmu_event_update(struct perf_event *event, | ||||
| 			struct hw_perf_event *hwc, | ||||
|  | @ -139,6 +103,13 @@ int armpmu_event_set_period(struct perf_event *event, | |||
| 			    struct hw_perf_event *hwc, | ||||
| 			    int idx); | ||||
| 
 | ||||
| int armpmu_map_event(struct perf_event *event, | ||||
| 		     const unsigned (*event_map)[PERF_COUNT_HW_MAX], | ||||
| 		     const unsigned (*cache_map)[PERF_COUNT_HW_CACHE_MAX] | ||||
| 						[PERF_COUNT_HW_CACHE_OP_MAX] | ||||
| 						[PERF_COUNT_HW_CACHE_RESULT_MAX], | ||||
| 		     u32 raw_event_mask); | ||||
| 
 | ||||
| #endif /* CONFIG_HW_PERF_EVENTS */ | ||||
| 
 | ||||
| #endif /* __ARM_PMU_H__ */ | ||||
|  |  | |||
|  | @ -69,8 +69,7 @@ obj-$(CONFIG_CPU_XSC3)		+= xscale-cp0.o | |||
| obj-$(CONFIG_CPU_MOHAWK)	+= xscale-cp0.o | ||||
| obj-$(CONFIG_CPU_PJ4)		+= pj4-cp0.o | ||||
| obj-$(CONFIG_IWMMXT)		+= iwmmxt.o | ||||
| obj-$(CONFIG_CPU_HAS_PMU)	+= pmu.o | ||||
| obj-$(CONFIG_HW_PERF_EVENTS)	+= perf_event.o | ||||
| obj-$(CONFIG_HW_PERF_EVENTS)	+= perf_event.o perf_event_cpu.o | ||||
| AFLAGS_iwmmxt.o			:= -Wa,-mcpu=iwmmxt | ||||
| obj-$(CONFIG_ARM_CPU_TOPOLOGY)  += topology.o | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ | |||
| #include <linux/io.h> | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/map.h> | ||||
| #include <asm/mach/pci.h> | ||||
| 
 | ||||
| static int debug_pci; | ||||
|  | @ -414,6 +415,38 @@ static int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | |||
| 	return irq; | ||||
| } | ||||
| 
 | ||||
| static int __init pcibios_init_resources(int busnr, struct pci_sys_data *sys) | ||||
| { | ||||
| 	int ret; | ||||
| 	struct pci_host_bridge_window *window; | ||||
| 
 | ||||
| 	if (list_empty(&sys->resources)) { | ||||
| 		pci_add_resource_offset(&sys->resources, | ||||
| 			 &iomem_resource, sys->mem_offset); | ||||
| 	} | ||||
| 
 | ||||
| 	list_for_each_entry(window, &sys->resources, list) { | ||||
| 		if (resource_type(window->res) == IORESOURCE_IO) | ||||
| 			return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	sys->io_res.start = (busnr * SZ_64K) ?  : pcibios_min_io; | ||||
| 	sys->io_res.end = (busnr + 1) * SZ_64K - 1; | ||||
| 	sys->io_res.flags = IORESOURCE_IO; | ||||
| 	sys->io_res.name = sys->io_res_name; | ||||
| 	sprintf(sys->io_res_name, "PCI%d I/O", busnr); | ||||
| 
 | ||||
| 	ret = request_resource(&ioport_resource, &sys->io_res); | ||||
| 	if (ret) { | ||||
| 		pr_err("PCI: unable to allocate I/O port region (%d)\n", ret); | ||||
| 		return ret; | ||||
| 	} | ||||
| 	pci_add_resource_offset(&sys->resources, &sys->io_res, | ||||
| 				sys->io_offset); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void __init pcibios_init_hw(struct hw_pci *hw, struct list_head *head) | ||||
| { | ||||
| 	struct pci_sys_data *sys = NULL; | ||||
|  | @ -436,11 +469,10 @@ static void __init pcibios_init_hw(struct hw_pci *hw, struct list_head *head) | |||
| 		ret = hw->setup(nr, sys); | ||||
| 
 | ||||
| 		if (ret > 0) { | ||||
| 			if (list_empty(&sys->resources)) { | ||||
| 				pci_add_resource_offset(&sys->resources, | ||||
| 					 &ioport_resource, sys->io_offset); | ||||
| 				pci_add_resource_offset(&sys->resources, | ||||
| 					 &iomem_resource, sys->mem_offset); | ||||
| 			ret = pcibios_init_resources(nr, sys); | ||||
| 			if (ret)  { | ||||
| 				kfree(sys); | ||||
| 				break; | ||||
| 			} | ||||
| 
 | ||||
| 			if (hw->scan) | ||||
|  | @ -618,3 +650,15 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void __init pci_map_io_early(unsigned long pfn) | ||||
| { | ||||
| 	struct map_desc pci_io_desc = { | ||||
| 		.virtual	= PCI_IO_VIRT_BASE, | ||||
| 		.type		= MT_DEVICE, | ||||
| 		.length		= SZ_64K, | ||||
| 	}; | ||||
| 
 | ||||
| 	pci_io_desc.pfn = pfn; | ||||
| 	iotable_init(&pci_io_desc, 1); | ||||
| } | ||||
|  |  | |||
|  | @ -12,68 +12,15 @@ | |||
|  */ | ||||
| #define pr_fmt(fmt) "hw perfevents: " fmt | ||||
| 
 | ||||
| #include <linux/bitmap.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/export.h> | ||||
| #include <linux/perf_event.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/spinlock.h> | ||||
| #include <linux/pm_runtime.h> | ||||
| #include <linux/uaccess.h> | ||||
| 
 | ||||
| #include <asm/cputype.h> | ||||
| #include <asm/irq.h> | ||||
| #include <asm/irq_regs.h> | ||||
| #include <asm/pmu.h> | ||||
| #include <asm/stacktrace.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * ARMv6 supports a maximum of 3 events, starting from index 0. If we add | ||||
|  * another platform that supports more, we need to increase this to be the | ||||
|  * largest of all platforms. | ||||
|  * | ||||
|  * ARMv7 supports up to 32 events: | ||||
|  *  cycle counter CCNT + 31 events counters CNT0..30. | ||||
|  *  Cortex-A8 has 1+4 counters, Cortex-A9 has 1+6 counters. | ||||
|  */ | ||||
| #define ARMPMU_MAX_HWEVENTS		32 | ||||
| 
 | ||||
| static DEFINE_PER_CPU(struct perf_event * [ARMPMU_MAX_HWEVENTS], hw_events); | ||||
| static DEFINE_PER_CPU(unsigned long [BITS_TO_LONGS(ARMPMU_MAX_HWEVENTS)], used_mask); | ||||
| static DEFINE_PER_CPU(struct pmu_hw_events, cpu_hw_events); | ||||
| 
 | ||||
| #define to_arm_pmu(p) (container_of(p, struct arm_pmu, pmu)) | ||||
| 
 | ||||
| /* Set at runtime when we know what CPU type we are. */ | ||||
| static struct arm_pmu *cpu_pmu; | ||||
| 
 | ||||
| const char *perf_pmu_name(void) | ||||
| { | ||||
| 	if (!cpu_pmu) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	return cpu_pmu->pmu.name; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(perf_pmu_name); | ||||
| 
 | ||||
| int perf_num_counters(void) | ||||
| { | ||||
| 	int max_events = 0; | ||||
| 
 | ||||
| 	if (cpu_pmu != NULL) | ||||
| 		max_events = cpu_pmu->num_events; | ||||
| 
 | ||||
| 	return max_events; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(perf_num_counters); | ||||
| 
 | ||||
| #define HW_OP_UNSUPPORTED		0xFFFF | ||||
| 
 | ||||
| #define C(_x) \ | ||||
| 	PERF_COUNT_HW_CACHE_##_x | ||||
| 
 | ||||
| #define CACHE_OP_UNSUPPORTED		0xFFFF | ||||
| 
 | ||||
| static int | ||||
| armpmu_map_cache_event(const unsigned (*cache_map) | ||||
| 				      [PERF_COUNT_HW_CACHE_MAX] | ||||
|  | @ -104,7 +51,7 @@ armpmu_map_cache_event(const unsigned (*cache_map) | |||
| } | ||||
| 
 | ||||
| static int | ||||
| armpmu_map_event(const unsigned (*event_map)[PERF_COUNT_HW_MAX], u64 config) | ||||
| armpmu_map_hw_event(const unsigned (*event_map)[PERF_COUNT_HW_MAX], u64 config) | ||||
| { | ||||
| 	int mapping = (*event_map)[config]; | ||||
| 	return mapping == HW_OP_UNSUPPORTED ? -ENOENT : mapping; | ||||
|  | @ -116,19 +63,20 @@ armpmu_map_raw_event(u32 raw_event_mask, u64 config) | |||
| 	return (int)(config & raw_event_mask); | ||||
| } | ||||
| 
 | ||||
| static int map_cpu_event(struct perf_event *event, | ||||
| 			 const unsigned (*event_map)[PERF_COUNT_HW_MAX], | ||||
| 			 const unsigned (*cache_map) | ||||
| 					[PERF_COUNT_HW_CACHE_MAX] | ||||
| 					[PERF_COUNT_HW_CACHE_OP_MAX] | ||||
| 					[PERF_COUNT_HW_CACHE_RESULT_MAX], | ||||
| 			 u32 raw_event_mask) | ||||
| int | ||||
| armpmu_map_event(struct perf_event *event, | ||||
| 		 const unsigned (*event_map)[PERF_COUNT_HW_MAX], | ||||
| 		 const unsigned (*cache_map) | ||||
| 				[PERF_COUNT_HW_CACHE_MAX] | ||||
| 				[PERF_COUNT_HW_CACHE_OP_MAX] | ||||
| 				[PERF_COUNT_HW_CACHE_RESULT_MAX], | ||||
| 		 u32 raw_event_mask) | ||||
| { | ||||
| 	u64 config = event->attr.config; | ||||
| 
 | ||||
| 	switch (event->attr.type) { | ||||
| 	case PERF_TYPE_HARDWARE: | ||||
| 		return armpmu_map_event(event_map, config); | ||||
| 		return armpmu_map_hw_event(event_map, config); | ||||
| 	case PERF_TYPE_HW_CACHE: | ||||
| 		return armpmu_map_cache_event(cache_map, config); | ||||
| 	case PERF_TYPE_RAW: | ||||
|  | @ -222,7 +170,6 @@ armpmu_stop(struct perf_event *event, int flags) | |||
| 	 */ | ||||
| 	if (!(hwc->state & PERF_HES_STOPPED)) { | ||||
| 		armpmu->disable(hwc, hwc->idx); | ||||
| 		barrier(); /* why? */ | ||||
| 		armpmu_event_update(event, hwc, hwc->idx); | ||||
| 		hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE; | ||||
| 	} | ||||
|  | @ -350,99 +297,41 @@ validate_group(struct perf_event *event) | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static irqreturn_t armpmu_platform_irq(int irq, void *dev) | ||||
| static irqreturn_t armpmu_dispatch_irq(int irq, void *dev) | ||||
| { | ||||
| 	struct arm_pmu *armpmu = (struct arm_pmu *) dev; | ||||
| 	struct platform_device *plat_device = armpmu->plat_device; | ||||
| 	struct arm_pmu_platdata *plat = dev_get_platdata(&plat_device->dev); | ||||
| 
 | ||||
| 	return plat->handle_irq(irq, dev, armpmu->handle_irq); | ||||
| 	if (plat && plat->handle_irq) | ||||
| 		return plat->handle_irq(irq, dev, armpmu->handle_irq); | ||||
| 	else | ||||
| 		return armpmu->handle_irq(irq, dev); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| armpmu_release_hardware(struct arm_pmu *armpmu) | ||||
| { | ||||
| 	int i, irq, irqs; | ||||
| 	struct platform_device *pmu_device = armpmu->plat_device; | ||||
| 	struct arm_pmu_platdata *plat = | ||||
| 		dev_get_platdata(&pmu_device->dev); | ||||
| 
 | ||||
| 	irqs = min(pmu_device->num_resources, num_possible_cpus()); | ||||
| 
 | ||||
| 	for (i = 0; i < irqs; ++i) { | ||||
| 		if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs)) | ||||
| 			continue; | ||||
| 		irq = platform_get_irq(pmu_device, i); | ||||
| 		if (irq >= 0) { | ||||
| 			if (plat && plat->disable_irq) | ||||
| 				plat->disable_irq(irq); | ||||
| 			free_irq(irq, armpmu); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	release_pmu(armpmu->type); | ||||
| 	armpmu->free_irq(); | ||||
| 	pm_runtime_put_sync(&armpmu->plat_device->dev); | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| armpmu_reserve_hardware(struct arm_pmu *armpmu) | ||||
| { | ||||
| 	struct arm_pmu_platdata *plat; | ||||
| 	irq_handler_t handle_irq; | ||||
| 	int i, err, irq, irqs; | ||||
| 	int err; | ||||
| 	struct platform_device *pmu_device = armpmu->plat_device; | ||||
| 
 | ||||
| 	if (!pmu_device) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	err = reserve_pmu(armpmu->type); | ||||
| 	pm_runtime_get_sync(&pmu_device->dev); | ||||
| 	err = armpmu->request_irq(armpmu_dispatch_irq); | ||||
| 	if (err) { | ||||
| 		pr_warning("unable to reserve pmu\n"); | ||||
| 		armpmu_release_hardware(armpmu); | ||||
| 		return err; | ||||
| 	} | ||||
| 
 | ||||
| 	plat = dev_get_platdata(&pmu_device->dev); | ||||
| 	if (plat && plat->handle_irq) | ||||
| 		handle_irq = armpmu_platform_irq; | ||||
| 	else | ||||
| 		handle_irq = armpmu->handle_irq; | ||||
| 
 | ||||
| 	irqs = min(pmu_device->num_resources, num_possible_cpus()); | ||||
| 	if (irqs < 1) { | ||||
| 		pr_err("no irqs for PMUs defined\n"); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	for (i = 0; i < irqs; ++i) { | ||||
| 		err = 0; | ||||
| 		irq = platform_get_irq(pmu_device, i); | ||||
| 		if (irq < 0) | ||||
| 			continue; | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * If we have a single PMU interrupt that we can't shift, | ||||
| 		 * assume that we're running on a uniprocessor machine and | ||||
| 		 * continue. Otherwise, continue without this interrupt. | ||||
| 		 */ | ||||
| 		if (irq_set_affinity(irq, cpumask_of(i)) && irqs > 1) { | ||||
| 			pr_warning("unable to set irq affinity (irq=%d, cpu=%u)\n", | ||||
| 				    irq, i); | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		err = request_irq(irq, handle_irq, | ||||
| 				  IRQF_DISABLED | IRQF_NOBALANCING, | ||||
| 				  "arm-pmu", armpmu); | ||||
| 		if (err) { | ||||
| 			pr_err("unable to request IRQ%d for ARM PMU counters\n", | ||||
| 				irq); | ||||
| 			armpmu_release_hardware(armpmu); | ||||
| 			return err; | ||||
| 		} else if (plat && plat->enable_irq) | ||||
| 			plat->enable_irq(irq); | ||||
| 
 | ||||
| 		cpumask_set_cpu(i, &armpmu->active_irqs); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  | @ -581,6 +470,32 @@ static void armpmu_disable(struct pmu *pmu) | |||
| 	armpmu->stop(); | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_PM_RUNTIME | ||||
| static int armpmu_runtime_resume(struct device *dev) | ||||
| { | ||||
| 	struct arm_pmu_platdata *plat = dev_get_platdata(dev); | ||||
| 
 | ||||
| 	if (plat && plat->runtime_resume) | ||||
| 		return plat->runtime_resume(dev); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int armpmu_runtime_suspend(struct device *dev) | ||||
| { | ||||
| 	struct arm_pmu_platdata *plat = dev_get_platdata(dev); | ||||
| 
 | ||||
| 	if (plat && plat->runtime_suspend) | ||||
| 		return plat->runtime_suspend(dev); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| const struct dev_pm_ops armpmu_dev_pm_ops = { | ||||
| 	SET_RUNTIME_PM_OPS(armpmu_runtime_suspend, armpmu_runtime_resume, NULL) | ||||
| }; | ||||
| 
 | ||||
| static void __init armpmu_init(struct arm_pmu *armpmu) | ||||
| { | ||||
| 	atomic_set(&armpmu->active_events, 0); | ||||
|  | @ -598,174 +513,14 @@ static void __init armpmu_init(struct arm_pmu *armpmu) | |||
| 	}; | ||||
| } | ||||
| 
 | ||||
| int __init armpmu_register(struct arm_pmu *armpmu, char *name, int type) | ||||
| int armpmu_register(struct arm_pmu *armpmu, char *name, int type) | ||||
| { | ||||
| 	armpmu_init(armpmu); | ||||
| 	pr_info("enabled with %s PMU driver, %d counters available\n", | ||||
| 			armpmu->name, armpmu->num_events); | ||||
| 	return perf_pmu_register(&armpmu->pmu, name, type); | ||||
| } | ||||
| 
 | ||||
| /* Include the PMU-specific implementations. */ | ||||
| #include "perf_event_xscale.c" | ||||
| #include "perf_event_v6.c" | ||||
| #include "perf_event_v7.c" | ||||
| 
 | ||||
| /*
 | ||||
|  * Ensure the PMU has sane values out of reset. | ||||
|  * This requires SMP to be available, so exists as a separate initcall. | ||||
|  */ | ||||
| static int __init | ||||
| cpu_pmu_reset(void) | ||||
| { | ||||
| 	if (cpu_pmu && cpu_pmu->reset) | ||||
| 		return on_each_cpu(cpu_pmu->reset, NULL, 1); | ||||
| 	return 0; | ||||
| } | ||||
| arch_initcall(cpu_pmu_reset); | ||||
| 
 | ||||
| /*
 | ||||
|  * PMU platform driver and devicetree bindings. | ||||
|  */ | ||||
| static struct of_device_id armpmu_of_device_ids[] = { | ||||
| 	{.compatible = "arm,cortex-a9-pmu"}, | ||||
| 	{.compatible = "arm,cortex-a8-pmu"}, | ||||
| 	{.compatible = "arm,arm1136-pmu"}, | ||||
| 	{.compatible = "arm,arm1176-pmu"}, | ||||
| 	{}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device_id armpmu_plat_device_ids[] = { | ||||
| 	{.name = "arm-pmu"}, | ||||
| 	{}, | ||||
| }; | ||||
| 
 | ||||
| static int __devinit armpmu_device_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	if (!cpu_pmu) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	cpu_pmu->plat_device = pdev; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct platform_driver armpmu_driver = { | ||||
| 	.driver		= { | ||||
| 		.name	= "arm-pmu", | ||||
| 		.of_match_table = armpmu_of_device_ids, | ||||
| 	}, | ||||
| 	.probe		= armpmu_device_probe, | ||||
| 	.id_table	= armpmu_plat_device_ids, | ||||
| }; | ||||
| 
 | ||||
| static int __init register_pmu_driver(void) | ||||
| { | ||||
| 	return platform_driver_register(&armpmu_driver); | ||||
| } | ||||
| device_initcall(register_pmu_driver); | ||||
| 
 | ||||
| static struct pmu_hw_events *armpmu_get_cpu_events(void) | ||||
| { | ||||
| 	return &__get_cpu_var(cpu_hw_events); | ||||
| } | ||||
| 
 | ||||
| static void __init cpu_pmu_init(struct arm_pmu *armpmu) | ||||
| { | ||||
| 	int cpu; | ||||
| 	for_each_possible_cpu(cpu) { | ||||
| 		struct pmu_hw_events *events = &per_cpu(cpu_hw_events, cpu); | ||||
| 		events->events = per_cpu(hw_events, cpu); | ||||
| 		events->used_mask = per_cpu(used_mask, cpu); | ||||
| 		raw_spin_lock_init(&events->pmu_lock); | ||||
| 	} | ||||
| 	armpmu->get_hw_events = armpmu_get_cpu_events; | ||||
| 	armpmu->type = ARM_PMU_DEVICE_CPU; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * PMU hardware loses all context when a CPU goes offline. | ||||
|  * When a CPU is hotplugged back in, since some hardware registers are | ||||
|  * UNKNOWN at reset, the PMU must be explicitly reset to avoid reading | ||||
|  * junk values out of them. | ||||
|  */ | ||||
| static int __cpuinit pmu_cpu_notify(struct notifier_block *b, | ||||
| 					unsigned long action, void *hcpu) | ||||
| { | ||||
| 	if ((action & ~CPU_TASKS_FROZEN) != CPU_STARTING) | ||||
| 		return NOTIFY_DONE; | ||||
| 
 | ||||
| 	if (cpu_pmu && cpu_pmu->reset) | ||||
| 		cpu_pmu->reset(NULL); | ||||
| 
 | ||||
| 	return NOTIFY_OK; | ||||
| } | ||||
| 
 | ||||
| static struct notifier_block __cpuinitdata pmu_cpu_notifier = { | ||||
| 	.notifier_call = pmu_cpu_notify, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * CPU PMU identification and registration. | ||||
|  */ | ||||
| static int __init | ||||
| init_hw_perf_events(void) | ||||
| { | ||||
| 	unsigned long cpuid = read_cpuid_id(); | ||||
| 	unsigned long implementor = (cpuid & 0xFF000000) >> 24; | ||||
| 	unsigned long part_number = (cpuid & 0xFFF0); | ||||
| 
 | ||||
| 	/* ARM Ltd CPUs. */ | ||||
| 	if (0x41 == implementor) { | ||||
| 		switch (part_number) { | ||||
| 		case 0xB360:	/* ARM1136 */ | ||||
| 		case 0xB560:	/* ARM1156 */ | ||||
| 		case 0xB760:	/* ARM1176 */ | ||||
| 			cpu_pmu = armv6pmu_init(); | ||||
| 			break; | ||||
| 		case 0xB020:	/* ARM11mpcore */ | ||||
| 			cpu_pmu = armv6mpcore_pmu_init(); | ||||
| 			break; | ||||
| 		case 0xC080:	/* Cortex-A8 */ | ||||
| 			cpu_pmu = armv7_a8_pmu_init(); | ||||
| 			break; | ||||
| 		case 0xC090:	/* Cortex-A9 */ | ||||
| 			cpu_pmu = armv7_a9_pmu_init(); | ||||
| 			break; | ||||
| 		case 0xC050:	/* Cortex-A5 */ | ||||
| 			cpu_pmu = armv7_a5_pmu_init(); | ||||
| 			break; | ||||
| 		case 0xC0F0:	/* Cortex-A15 */ | ||||
| 			cpu_pmu = armv7_a15_pmu_init(); | ||||
| 			break; | ||||
| 		case 0xC070:	/* Cortex-A7 */ | ||||
| 			cpu_pmu = armv7_a7_pmu_init(); | ||||
| 			break; | ||||
| 		} | ||||
| 	/* Intel CPUs [xscale]. */ | ||||
| 	} else if (0x69 == implementor) { | ||||
| 		part_number = (cpuid >> 13) & 0x7; | ||||
| 		switch (part_number) { | ||||
| 		case 1: | ||||
| 			cpu_pmu = xscale1pmu_init(); | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			cpu_pmu = xscale2pmu_init(); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (cpu_pmu) { | ||||
| 		pr_info("enabled with %s PMU driver, %d counters available\n", | ||||
| 			cpu_pmu->name, cpu_pmu->num_events); | ||||
| 		cpu_pmu_init(cpu_pmu); | ||||
| 		register_cpu_notifier(&pmu_cpu_notifier); | ||||
| 		armpmu_register(cpu_pmu, cpu_pmu->name, PERF_TYPE_RAW); | ||||
| 	} else { | ||||
| 		pr_info("no hardware support available\n"); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| early_initcall(init_hw_perf_events); | ||||
| 
 | ||||
| /*
 | ||||
|  * Callchain handling code. | ||||
|  */ | ||||
|  |  | |||
							
								
								
									
										295
									
								
								arch/arm/kernel/perf_event_cpu.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								arch/arm/kernel/perf_event_cpu.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,295 @@ | |||
| /*
 | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License version 2 as | ||||
|  * published by the Free Software Foundation. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
|  * | ||||
|  * Copyright (C) 2012 ARM Limited | ||||
|  * | ||||
|  * Author: Will Deacon <will.deacon@arm.com> | ||||
|  */ | ||||
| #define pr_fmt(fmt) "CPU PMU: " fmt | ||||
| 
 | ||||
| #include <linux/bitmap.h> | ||||
| #include <linux/export.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/spinlock.h> | ||||
| 
 | ||||
| #include <asm/cputype.h> | ||||
| #include <asm/irq_regs.h> | ||||
| #include <asm/pmu.h> | ||||
| 
 | ||||
| /* Set at runtime when we know what CPU type we are. */ | ||||
| static struct arm_pmu *cpu_pmu; | ||||
| 
 | ||||
| static DEFINE_PER_CPU(struct perf_event * [ARMPMU_MAX_HWEVENTS], hw_events); | ||||
| static DEFINE_PER_CPU(unsigned long [BITS_TO_LONGS(ARMPMU_MAX_HWEVENTS)], used_mask); | ||||
| static DEFINE_PER_CPU(struct pmu_hw_events, cpu_hw_events); | ||||
| 
 | ||||
| /*
 | ||||
|  * Despite the names, these two functions are CPU-specific and are used | ||||
|  * by the OProfile/perf code. | ||||
|  */ | ||||
| const char *perf_pmu_name(void) | ||||
| { | ||||
| 	if (!cpu_pmu) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	return cpu_pmu->pmu.name; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(perf_pmu_name); | ||||
| 
 | ||||
| int perf_num_counters(void) | ||||
| { | ||||
| 	int max_events = 0; | ||||
| 
 | ||||
| 	if (cpu_pmu != NULL) | ||||
| 		max_events = cpu_pmu->num_events; | ||||
| 
 | ||||
| 	return max_events; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(perf_num_counters); | ||||
| 
 | ||||
| /* Include the PMU-specific implementations. */ | ||||
| #include "perf_event_xscale.c" | ||||
| #include "perf_event_v6.c" | ||||
| #include "perf_event_v7.c" | ||||
| 
 | ||||
| static struct pmu_hw_events *cpu_pmu_get_cpu_events(void) | ||||
| { | ||||
| 	return &__get_cpu_var(cpu_hw_events); | ||||
| } | ||||
| 
 | ||||
| static void cpu_pmu_free_irq(void) | ||||
| { | ||||
| 	int i, irq, irqs; | ||||
| 	struct platform_device *pmu_device = cpu_pmu->plat_device; | ||||
| 
 | ||||
| 	irqs = min(pmu_device->num_resources, num_possible_cpus()); | ||||
| 
 | ||||
| 	for (i = 0; i < irqs; ++i) { | ||||
| 		if (!cpumask_test_and_clear_cpu(i, &cpu_pmu->active_irqs)) | ||||
| 			continue; | ||||
| 		irq = platform_get_irq(pmu_device, i); | ||||
| 		if (irq >= 0) | ||||
| 			free_irq(irq, cpu_pmu); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static int cpu_pmu_request_irq(irq_handler_t handler) | ||||
| { | ||||
| 	int i, err, irq, irqs; | ||||
| 	struct platform_device *pmu_device = cpu_pmu->plat_device; | ||||
| 
 | ||||
| 	if (!pmu_device) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	irqs = min(pmu_device->num_resources, num_possible_cpus()); | ||||
| 	if (irqs < 1) { | ||||
| 		pr_err("no irqs for PMUs defined\n"); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	for (i = 0; i < irqs; ++i) { | ||||
| 		err = 0; | ||||
| 		irq = platform_get_irq(pmu_device, i); | ||||
| 		if (irq < 0) | ||||
| 			continue; | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * If we have a single PMU interrupt that we can't shift, | ||||
| 		 * assume that we're running on a uniprocessor machine and | ||||
| 		 * continue. Otherwise, continue without this interrupt. | ||||
| 		 */ | ||||
| 		if (irq_set_affinity(irq, cpumask_of(i)) && irqs > 1) { | ||||
| 			pr_warning("unable to set irq affinity (irq=%d, cpu=%u)\n", | ||||
| 				    irq, i); | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		err = request_irq(irq, handler, IRQF_NOBALANCING, "arm-pmu", | ||||
| 				  cpu_pmu); | ||||
| 		if (err) { | ||||
| 			pr_err("unable to request IRQ%d for ARM PMU counters\n", | ||||
| 				irq); | ||||
| 			return err; | ||||
| 		} | ||||
| 
 | ||||
| 		cpumask_set_cpu(i, &cpu_pmu->active_irqs); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void __devinit cpu_pmu_init(struct arm_pmu *cpu_pmu) | ||||
| { | ||||
| 	int cpu; | ||||
| 	for_each_possible_cpu(cpu) { | ||||
| 		struct pmu_hw_events *events = &per_cpu(cpu_hw_events, cpu); | ||||
| 		events->events = per_cpu(hw_events, cpu); | ||||
| 		events->used_mask = per_cpu(used_mask, cpu); | ||||
| 		raw_spin_lock_init(&events->pmu_lock); | ||||
| 	} | ||||
| 
 | ||||
| 	cpu_pmu->get_hw_events	= cpu_pmu_get_cpu_events; | ||||
| 	cpu_pmu->request_irq	= cpu_pmu_request_irq; | ||||
| 	cpu_pmu->free_irq	= cpu_pmu_free_irq; | ||||
| 
 | ||||
| 	/* Ensure the PMU has sane values out of reset. */ | ||||
| 	if (cpu_pmu && cpu_pmu->reset) | ||||
| 		on_each_cpu(cpu_pmu->reset, NULL, 1); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * PMU hardware loses all context when a CPU goes offline. | ||||
|  * When a CPU is hotplugged back in, since some hardware registers are | ||||
|  * UNKNOWN at reset, the PMU must be explicitly reset to avoid reading | ||||
|  * junk values out of them. | ||||
|  */ | ||||
| static int __cpuinit cpu_pmu_notify(struct notifier_block *b, | ||||
| 				    unsigned long action, void *hcpu) | ||||
| { | ||||
| 	if ((action & ~CPU_TASKS_FROZEN) != CPU_STARTING) | ||||
| 		return NOTIFY_DONE; | ||||
| 
 | ||||
| 	if (cpu_pmu && cpu_pmu->reset) | ||||
| 		cpu_pmu->reset(NULL); | ||||
| 
 | ||||
| 	return NOTIFY_OK; | ||||
| } | ||||
| 
 | ||||
| static struct notifier_block __cpuinitdata cpu_pmu_hotplug_notifier = { | ||||
| 	.notifier_call = cpu_pmu_notify, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * PMU platform driver and devicetree bindings. | ||||
|  */ | ||||
| static struct of_device_id __devinitdata cpu_pmu_of_device_ids[] = { | ||||
| 	{.compatible = "arm,cortex-a15-pmu",	.data = armv7_a15_pmu_init}, | ||||
| 	{.compatible = "arm,cortex-a9-pmu",	.data = armv7_a9_pmu_init}, | ||||
| 	{.compatible = "arm,cortex-a8-pmu",	.data = armv7_a8_pmu_init}, | ||||
| 	{.compatible = "arm,cortex-a7-pmu",	.data = armv7_a7_pmu_init}, | ||||
| 	{.compatible = "arm,cortex-a5-pmu",	.data = armv7_a5_pmu_init}, | ||||
| 	{.compatible = "arm,arm11mpcore-pmu",	.data = armv6mpcore_pmu_init}, | ||||
| 	{.compatible = "arm,arm1176-pmu",	.data = armv6pmu_init}, | ||||
| 	{.compatible = "arm,arm1136-pmu",	.data = armv6pmu_init}, | ||||
| 	{}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device_id __devinitdata cpu_pmu_plat_device_ids[] = { | ||||
| 	{.name = "arm-pmu"}, | ||||
| 	{}, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * CPU PMU identification and probing. | ||||
|  */ | ||||
| static struct arm_pmu *__devinit probe_current_pmu(void) | ||||
| { | ||||
| 	struct arm_pmu *pmu = NULL; | ||||
| 	int cpu = get_cpu(); | ||||
| 	unsigned long cpuid = read_cpuid_id(); | ||||
| 	unsigned long implementor = (cpuid & 0xFF000000) >> 24; | ||||
| 	unsigned long part_number = (cpuid & 0xFFF0); | ||||
| 
 | ||||
| 	pr_info("probing PMU on CPU %d\n", cpu); | ||||
| 
 | ||||
| 	/* ARM Ltd CPUs. */ | ||||
| 	if (0x41 == implementor) { | ||||
| 		switch (part_number) { | ||||
| 		case 0xB360:	/* ARM1136 */ | ||||
| 		case 0xB560:	/* ARM1156 */ | ||||
| 		case 0xB760:	/* ARM1176 */ | ||||
| 			pmu = armv6pmu_init(); | ||||
| 			break; | ||||
| 		case 0xB020:	/* ARM11mpcore */ | ||||
| 			pmu = armv6mpcore_pmu_init(); | ||||
| 			break; | ||||
| 		case 0xC080:	/* Cortex-A8 */ | ||||
| 			pmu = armv7_a8_pmu_init(); | ||||
| 			break; | ||||
| 		case 0xC090:	/* Cortex-A9 */ | ||||
| 			pmu = armv7_a9_pmu_init(); | ||||
| 			break; | ||||
| 		case 0xC050:	/* Cortex-A5 */ | ||||
| 			pmu = armv7_a5_pmu_init(); | ||||
| 			break; | ||||
| 		case 0xC0F0:	/* Cortex-A15 */ | ||||
| 			pmu = armv7_a15_pmu_init(); | ||||
| 			break; | ||||
| 		case 0xC070:	/* Cortex-A7 */ | ||||
| 			pmu = armv7_a7_pmu_init(); | ||||
| 			break; | ||||
| 		} | ||||
| 	/* Intel CPUs [xscale]. */ | ||||
| 	} else if (0x69 == implementor) { | ||||
| 		part_number = (cpuid >> 13) & 0x7; | ||||
| 		switch (part_number) { | ||||
| 		case 1: | ||||
| 			pmu = xscale1pmu_init(); | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			pmu = xscale2pmu_init(); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	put_cpu(); | ||||
| 	return pmu; | ||||
| } | ||||
| 
 | ||||
| static int __devinit cpu_pmu_device_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	const struct of_device_id *of_id; | ||||
| 	struct arm_pmu *(*init_fn)(void); | ||||
| 	struct device_node *node = pdev->dev.of_node; | ||||
| 
 | ||||
| 	if (cpu_pmu) { | ||||
| 		pr_info("attempt to register multiple PMU devices!"); | ||||
| 		return -ENOSPC; | ||||
| 	} | ||||
| 
 | ||||
| 	if (node && (of_id = of_match_node(cpu_pmu_of_device_ids, pdev->dev.of_node))) { | ||||
| 		init_fn = of_id->data; | ||||
| 		cpu_pmu = init_fn(); | ||||
| 	} else { | ||||
| 		cpu_pmu = probe_current_pmu(); | ||||
| 	} | ||||
| 
 | ||||
| 	if (!cpu_pmu) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	cpu_pmu->plat_device = pdev; | ||||
| 	cpu_pmu_init(cpu_pmu); | ||||
| 	register_cpu_notifier(&cpu_pmu_hotplug_notifier); | ||||
| 	armpmu_register(cpu_pmu, cpu_pmu->name, PERF_TYPE_RAW); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct platform_driver cpu_pmu_driver = { | ||||
| 	.driver		= { | ||||
| 		.name	= "arm-pmu", | ||||
| 		.pm	= &armpmu_dev_pm_ops, | ||||
| 		.of_match_table = cpu_pmu_of_device_ids, | ||||
| 	}, | ||||
| 	.probe		= cpu_pmu_device_probe, | ||||
| 	.id_table	= cpu_pmu_plat_device_ids, | ||||
| }; | ||||
| 
 | ||||
| static int __init register_pmu_driver(void) | ||||
| { | ||||
| 	return platform_driver_register(&cpu_pmu_driver); | ||||
| } | ||||
| device_initcall(register_pmu_driver); | ||||
|  | @ -645,7 +645,7 @@ armv6mpcore_pmu_disable_event(struct hw_perf_event *hwc, | |||
| 
 | ||||
| static int armv6_map_event(struct perf_event *event) | ||||
| { | ||||
| 	return map_cpu_event(event, &armv6_perf_map, | ||||
| 	return armpmu_map_event(event, &armv6_perf_map, | ||||
| 				&armv6_perf_cache_map, 0xFF); | ||||
| } | ||||
| 
 | ||||
|  | @ -664,7 +664,7 @@ static struct arm_pmu armv6pmu = { | |||
| 	.max_period		= (1LLU << 32) - 1, | ||||
| }; | ||||
| 
 | ||||
| static struct arm_pmu *__init armv6pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv6pmu_init(void) | ||||
| { | ||||
| 	return &armv6pmu; | ||||
| } | ||||
|  | @ -679,7 +679,7 @@ static struct arm_pmu *__init armv6pmu_init(void) | |||
| 
 | ||||
| static int armv6mpcore_map_event(struct perf_event *event) | ||||
| { | ||||
| 	return map_cpu_event(event, &armv6mpcore_perf_map, | ||||
| 	return armpmu_map_event(event, &armv6mpcore_perf_map, | ||||
| 				&armv6mpcore_perf_cache_map, 0xFF); | ||||
| } | ||||
| 
 | ||||
|  | @ -698,17 +698,17 @@ static struct arm_pmu armv6mpcore_pmu = { | |||
| 	.max_period		= (1LLU << 32) - 1, | ||||
| }; | ||||
| 
 | ||||
| static struct arm_pmu *__init armv6mpcore_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv6mpcore_pmu_init(void) | ||||
| { | ||||
| 	return &armv6mpcore_pmu; | ||||
| } | ||||
| #else | ||||
| static struct arm_pmu *__init armv6pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv6pmu_init(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init armv6mpcore_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv6mpcore_pmu_init(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
|  |  | |||
|  | @ -1204,31 +1204,31 @@ static void armv7pmu_reset(void *info) | |||
| 
 | ||||
| static int armv7_a8_map_event(struct perf_event *event) | ||||
| { | ||||
| 	return map_cpu_event(event, &armv7_a8_perf_map, | ||||
| 	return armpmu_map_event(event, &armv7_a8_perf_map, | ||||
| 				&armv7_a8_perf_cache_map, 0xFF); | ||||
| } | ||||
| 
 | ||||
| static int armv7_a9_map_event(struct perf_event *event) | ||||
| { | ||||
| 	return map_cpu_event(event, &armv7_a9_perf_map, | ||||
| 	return armpmu_map_event(event, &armv7_a9_perf_map, | ||||
| 				&armv7_a9_perf_cache_map, 0xFF); | ||||
| } | ||||
| 
 | ||||
| static int armv7_a5_map_event(struct perf_event *event) | ||||
| { | ||||
| 	return map_cpu_event(event, &armv7_a5_perf_map, | ||||
| 	return armpmu_map_event(event, &armv7_a5_perf_map, | ||||
| 				&armv7_a5_perf_cache_map, 0xFF); | ||||
| } | ||||
| 
 | ||||
| static int armv7_a15_map_event(struct perf_event *event) | ||||
| { | ||||
| 	return map_cpu_event(event, &armv7_a15_perf_map, | ||||
| 	return armpmu_map_event(event, &armv7_a15_perf_map, | ||||
| 				&armv7_a15_perf_cache_map, 0xFF); | ||||
| } | ||||
| 
 | ||||
| static int armv7_a7_map_event(struct perf_event *event) | ||||
| { | ||||
| 	return map_cpu_event(event, &armv7_a7_perf_map, | ||||
| 	return armpmu_map_event(event, &armv7_a7_perf_map, | ||||
| 				&armv7_a7_perf_cache_map, 0xFF); | ||||
| } | ||||
| 
 | ||||
|  | @ -1245,7 +1245,7 @@ static struct arm_pmu armv7pmu = { | |||
| 	.max_period		= (1LLU << 32) - 1, | ||||
| }; | ||||
| 
 | ||||
| static u32 __init armv7_read_num_pmnc_events(void) | ||||
| static u32 __devinit armv7_read_num_pmnc_events(void) | ||||
| { | ||||
| 	u32 nb_cnt; | ||||
| 
 | ||||
|  | @ -1256,7 +1256,7 @@ static u32 __init armv7_read_num_pmnc_events(void) | |||
| 	return nb_cnt + 1; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init armv7_a8_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv7_a8_pmu_init(void) | ||||
| { | ||||
| 	armv7pmu.name		= "ARMv7 Cortex-A8"; | ||||
| 	armv7pmu.map_event	= armv7_a8_map_event; | ||||
|  | @ -1264,7 +1264,7 @@ static struct arm_pmu *__init armv7_a8_pmu_init(void) | |||
| 	return &armv7pmu; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init armv7_a9_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv7_a9_pmu_init(void) | ||||
| { | ||||
| 	armv7pmu.name		= "ARMv7 Cortex-A9"; | ||||
| 	armv7pmu.map_event	= armv7_a9_map_event; | ||||
|  | @ -1272,7 +1272,7 @@ static struct arm_pmu *__init armv7_a9_pmu_init(void) | |||
| 	return &armv7pmu; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init armv7_a5_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv7_a5_pmu_init(void) | ||||
| { | ||||
| 	armv7pmu.name		= "ARMv7 Cortex-A5"; | ||||
| 	armv7pmu.map_event	= armv7_a5_map_event; | ||||
|  | @ -1280,7 +1280,7 @@ static struct arm_pmu *__init armv7_a5_pmu_init(void) | |||
| 	return &armv7pmu; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init armv7_a15_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv7_a15_pmu_init(void) | ||||
| { | ||||
| 	armv7pmu.name		= "ARMv7 Cortex-A15"; | ||||
| 	armv7pmu.map_event	= armv7_a15_map_event; | ||||
|  | @ -1289,7 +1289,7 @@ static struct arm_pmu *__init armv7_a15_pmu_init(void) | |||
| 	return &armv7pmu; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init armv7_a7_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv7_a7_pmu_init(void) | ||||
| { | ||||
| 	armv7pmu.name		= "ARMv7 Cortex-A7"; | ||||
| 	armv7pmu.map_event	= armv7_a7_map_event; | ||||
|  | @ -1298,27 +1298,27 @@ static struct arm_pmu *__init armv7_a7_pmu_init(void) | |||
| 	return &armv7pmu; | ||||
| } | ||||
| #else | ||||
| static struct arm_pmu *__init armv7_a8_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv7_a8_pmu_init(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init armv7_a9_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv7_a9_pmu_init(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init armv7_a5_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv7_a5_pmu_init(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init armv7_a15_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv7_a15_pmu_init(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init armv7_a7_pmu_init(void) | ||||
| static struct arm_pmu *__devinit armv7_a7_pmu_init(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
|  |  | |||
|  | @ -430,7 +430,7 @@ xscale1pmu_write_counter(int counter, u32 val) | |||
| 
 | ||||
| static int xscale_map_event(struct perf_event *event) | ||||
| { | ||||
| 	return map_cpu_event(event, &xscale_perf_map, | ||||
| 	return armpmu_map_event(event, &xscale_perf_map, | ||||
| 				&xscale_perf_cache_map, 0xFF); | ||||
| } | ||||
| 
 | ||||
|  | @ -449,7 +449,7 @@ static struct arm_pmu xscale1pmu = { | |||
| 	.max_period	= (1LLU << 32) - 1, | ||||
| }; | ||||
| 
 | ||||
| static struct arm_pmu *__init xscale1pmu_init(void) | ||||
| static struct arm_pmu *__devinit xscale1pmu_init(void) | ||||
| { | ||||
| 	return &xscale1pmu; | ||||
| } | ||||
|  | @ -816,17 +816,17 @@ static struct arm_pmu xscale2pmu = { | |||
| 	.max_period	= (1LLU << 32) - 1, | ||||
| }; | ||||
| 
 | ||||
| static struct arm_pmu *__init xscale2pmu_init(void) | ||||
| static struct arm_pmu *__devinit xscale2pmu_init(void) | ||||
| { | ||||
| 	return &xscale2pmu; | ||||
| } | ||||
| #else | ||||
| static struct arm_pmu *__init xscale1pmu_init(void) | ||||
| static struct arm_pmu *__devinit xscale1pmu_init(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| static struct arm_pmu *__init xscale2pmu_init(void) | ||||
| static struct arm_pmu *__devinit xscale2pmu_init(void) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
|  |  | |||
|  | @ -1,36 +0,0 @@ | |||
| /*
 | ||||
|  *  linux/arch/arm/kernel/pmu.c | ||||
|  * | ||||
|  *  Copyright (C) 2009 picoChip Designs Ltd, Jamie Iles | ||||
|  *  Copyright (C) 2010 ARM Ltd, Will Deacon | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License version 2 as | ||||
|  * published by the Free Software Foundation. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/err.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/module.h> | ||||
| 
 | ||||
| #include <asm/pmu.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * PMU locking to ensure mutual exclusion between different subsystems. | ||||
|  */ | ||||
| static unsigned long pmu_lock[BITS_TO_LONGS(ARM_NUM_PMU_DEVICES)]; | ||||
| 
 | ||||
| int | ||||
| reserve_pmu(enum arm_pmu_type type) | ||||
| { | ||||
| 	return test_and_set_bit_lock(type, pmu_lock) ? -EBUSY : 0; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(reserve_pmu); | ||||
| 
 | ||||
| void | ||||
| release_pmu(enum arm_pmu_type type) | ||||
| { | ||||
| 	clear_bit_unlock(type, pmu_lock); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(release_pmu); | ||||
|  | @ -47,7 +47,7 @@ static void at91x40_idle(void) | |||
| 	 * Disable the processor clock.  The processor will be automatically | ||||
| 	 * re-enabled by an interrupt or by a reset. | ||||
| 	 */ | ||||
| 	__raw_writel(AT91_PS_CR_CPU, AT91_PS_CR); | ||||
| 	__raw_writel(AT91_PS_CR_CPU, AT91_IO_P2V(AT91_PS_CR)); | ||||
| 	cpu_do_idle(); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -29,10 +29,10 @@ | |||
| #include <mach/at91_tc.h> | ||||
| 
 | ||||
| #define at91_tc_read(field) \ | ||||
| 	__raw_readl(AT91_TC + field) | ||||
| 	__raw_readl(AT91_IO_P2V(AT91_TC) + field) | ||||
| 
 | ||||
| #define at91_tc_write(field, value) \ | ||||
| 	__raw_writel(value, AT91_TC + field); | ||||
| 	__raw_writel(value, AT91_IO_P2V(AT91_TC) + field); | ||||
| 
 | ||||
| /*
 | ||||
|  *	3 counter/timer units present. | ||||
|  |  | |||
|  | @ -67,13 +67,13 @@ | |||
|  * to 0xFEF78000 .. 0xFF000000.  (544Kb) | ||||
|  */ | ||||
| #define AT91_IO_PHYS_BASE	0xFFF78000 | ||||
| #define AT91_IO_VIRT_BASE	(0xFF000000 - AT91_IO_SIZE) | ||||
| #define AT91_IO_VIRT_BASE	IOMEM(0xFF000000 - AT91_IO_SIZE) | ||||
| #else | ||||
| /*
 | ||||
|  * Identity mapping for the non MMU case. | ||||
|  */ | ||||
| #define AT91_IO_PHYS_BASE	AT91_BASE_SYS | ||||
| #define AT91_IO_VIRT_BASE	AT91_IO_PHYS_BASE | ||||
| #define AT91_IO_VIRT_BASE	IOMEM(AT91_IO_PHYS_BASE) | ||||
| #endif | ||||
| 
 | ||||
| #define AT91_IO_SIZE		(0xFFFFFFFF - AT91_IO_PHYS_BASE + 1) | ||||
|  |  | |||
|  | @ -94,7 +94,7 @@ static const u32 uarts_sam9x5[] = { | |||
| 	0, | ||||
| }; | ||||
| 
 | ||||
| static inline const u32* decomp_soc_detect(u32 dbgu_base) | ||||
| static inline const u32* decomp_soc_detect(void __iomem *dbgu_base) | ||||
| { | ||||
| 	u32 cidr, socid; | ||||
| 
 | ||||
|  | @ -142,10 +142,10 @@ static inline void arch_decomp_setup(void) | |||
| 	int i = 0; | ||||
| 	const u32* usarts; | ||||
| 
 | ||||
| 	usarts = decomp_soc_detect(AT91_BASE_DBGU0); | ||||
| 	usarts = decomp_soc_detect((void __iomem *)AT91_BASE_DBGU0); | ||||
| 
 | ||||
| 	if (!usarts) | ||||
| 		usarts = decomp_soc_detect(AT91_BASE_DBGU1); | ||||
| 		usarts = decomp_soc_detect((void __iomem *)AT91_BASE_DBGU1); | ||||
| 	if (!usarts) { | ||||
| 		at91_uart = NULL; | ||||
| 		return; | ||||
|  |  | |||
|  | @ -73,7 +73,7 @@ void __init at91_init_sram(int bank, unsigned long base, unsigned int length) | |||
| { | ||||
| 	struct map_desc *desc = &sram_desc[bank]; | ||||
| 
 | ||||
| 	desc->virtual = AT91_IO_VIRT_BASE - length; | ||||
| 	desc->virtual = (unsigned long)AT91_IO_VIRT_BASE - length; | ||||
| 	if (bank > 0) | ||||
| 		desc->virtual -= sram_desc[bank - 1].length; | ||||
| 
 | ||||
|  | @ -88,7 +88,7 @@ void __init at91_init_sram(int bank, unsigned long base, unsigned int length) | |||
| } | ||||
| 
 | ||||
| static struct map_desc at91_io_desc __initdata = { | ||||
| 	.virtual	= AT91_VA_BASE_SYS, | ||||
| 	.virtual	= (unsigned long)AT91_VA_BASE_SYS, | ||||
| 	.pfn		= __phys_to_pfn(AT91_BASE_SYS), | ||||
| 	.length		= SZ_16K, | ||||
| 	.type		= MT_DEVICE, | ||||
|  |  | |||
|  | @ -29,7 +29,6 @@ | |||
| #include <asm/setup.h> | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/mach/time.h> | ||||
| #include <asm/pmu.h> | ||||
| 
 | ||||
| #include <asm/mach/arch.h> | ||||
| #include <mach/dma.h> | ||||
|  | @ -38,7 +37,7 @@ | |||
| #include <mach/csp/chipcHw_def.h> | ||||
| #include <mach/csp/chipcHw_inline.h> | ||||
| 
 | ||||
| #include <cfg_global.h> | ||||
| #include <mach/cfg_global.h> | ||||
| 
 | ||||
| #include "core.h" | ||||
| 
 | ||||
|  | @ -116,7 +115,7 @@ static struct resource pmu_resource = { | |||
| 
 | ||||
| static struct platform_device pmu_device = { | ||||
| 	.name		= "arm-pmu", | ||||
| 	.id		= ARM_PMU_DEVICE_CPU, | ||||
| 	.id		= -1, | ||||
| 	.resource	= &pmu_resource, | ||||
| 	.num_resources	= 1, | ||||
| }; | ||||
|  |  | |||
|  | @ -43,11 +43,10 @@ | |||
| #include <asm/mach/time.h> | ||||
| #include <asm/mach/map.h> | ||||
| 
 | ||||
| #include <cfg_global.h> | ||||
| #include <mach/cfg_global.h> | ||||
| 
 | ||||
| #include "clock.h" | ||||
| 
 | ||||
| #include <csp/secHw.h> | ||||
| #include <mach/csp/secHw_def.h> | ||||
| #include <mach/csp/chipcHw_inline.h> | ||||
| #include <mach/csp/tmrHw_reg.h> | ||||
|  |  | |||
|  | @ -26,15 +26,15 @@ | |||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #include <csp/errno.h> | ||||
| #include <csp/stdint.h> | ||||
| #include <csp/module.h> | ||||
| #include <linux/errno.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/export.h> | ||||
| 
 | ||||
| #include <mach/csp/chipcHw_def.h> | ||||
| #include <mach/csp/chipcHw_inline.h> | ||||
| 
 | ||||
| #include <csp/reg.h> | ||||
| #include <csp/delay.h> | ||||
| #include <mach/csp/reg.h> | ||||
| #include <linux/delay.h> | ||||
| 
 | ||||
| /* ---- Private Constants and Types --------------------------------------- */ | ||||
| 
 | ||||
|  | @ -61,21 +61,21 @@ static int chipcHw_divide(int num, int denom) | |||
| /****************************************************************************/ | ||||
| chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock	/*  [ IN ] Configurable clock */ | ||||
|     ) { | ||||
| 	volatile uint32_t *pPLLReg = (uint32_t *) 0x0; | ||||
| 	volatile uint32_t *pClockCtrl = (uint32_t *) 0x0; | ||||
| 	volatile uint32_t *pDependentClock = (uint32_t *) 0x0; | ||||
| 	uint32_t __iomem *pPLLReg = NULL; | ||||
| 	uint32_t __iomem *pClockCtrl = NULL; | ||||
| 	uint32_t __iomem *pDependentClock = NULL; | ||||
| 	uint32_t vcoFreqPll1Hz = 0;	/* Effective VCO frequency for PLL1 in Hz */ | ||||
| 	uint32_t vcoFreqPll2Hz = 0;	/* Effective VCO frequency for PLL2 in Hz */ | ||||
| 	uint32_t dependentClockType = 0; | ||||
| 	uint32_t vcoHz = 0; | ||||
| 
 | ||||
| 	/* Get VCO frequencies */ | ||||
| 	if ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) { | ||||
| 	if ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) { | ||||
| 		uint64_t adjustFreq = 0; | ||||
| 
 | ||||
| 		vcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz * | ||||
| 		    chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) * | ||||
| 		    ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 		    ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 		     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT); | ||||
| 
 | ||||
| 		/* Adjusted frequency due to chipcHw_REG_PLL_DIVIDER_NDIV_f_SS */ | ||||
|  | @ -86,13 +86,13 @@ chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock	/*  [ IN ] Configur | |||
| 	} else { | ||||
| 		vcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz * | ||||
| 		    chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) * | ||||
| 		    ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 		    ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 		     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT); | ||||
| 	} | ||||
| 	vcoFreqPll2Hz = | ||||
| 	    chipcHw_XTAL_FREQ_Hz * | ||||
| 		 chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) * | ||||
| 	    ((pChipcHw->PLLPreDivider2 & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 	    ((readl(&pChipcHw->PLLPreDivider2) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 	     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT); | ||||
| 
 | ||||
| 	switch (clock) { | ||||
|  | @ -187,51 +187,51 @@ chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock	/*  [ IN ] Configur | |||
| 
 | ||||
| 	if (pPLLReg) { | ||||
| 		/* Obtain PLL clock frequency */ | ||||
| 		if (*pPLLReg & chipcHw_REG_PLL_CLOCK_BYPASS_SELECT) { | ||||
| 		if (readl(pPLLReg) & chipcHw_REG_PLL_CLOCK_BYPASS_SELECT) { | ||||
| 			/* Return crystal clock frequency when bypassed */ | ||||
| 			return chipcHw_XTAL_FREQ_Hz; | ||||
| 		} else if (clock == chipcHw_CLOCK_DDR) { | ||||
| 			/* DDR frequency is configured in PLLDivider register */ | ||||
| 			return chipcHw_divide (vcoHz, (((pChipcHw->PLLDivider & 0xFF000000) >> 24) ? ((pChipcHw->PLLDivider & 0xFF000000) >> 24) : 256)); | ||||
| 			return chipcHw_divide (vcoHz, (((readl(&pChipcHw->PLLDivider) & 0xFF000000) >> 24) ? ((readl(&pChipcHw->PLLDivider) & 0xFF000000) >> 24) : 256)); | ||||
| 		} else { | ||||
| 			/* From chip revision number B0, LCD clock is internally divided by 2 */ | ||||
| 			if ((pPLLReg == &pChipcHw->LCDClock) && (chipcHw_getChipRevisionNumber() != chipcHw_REV_NUMBER_A0)) { | ||||
| 				vcoHz >>= 1; | ||||
| 			} | ||||
| 			/* Obtain PLL clock frequency using VCO dividers */ | ||||
| 			return chipcHw_divide(vcoHz, ((*pPLLReg & chipcHw_REG_PLL_CLOCK_MDIV_MASK) ? (*pPLLReg & chipcHw_REG_PLL_CLOCK_MDIV_MASK) : 256)); | ||||
| 			return chipcHw_divide(vcoHz, ((readl(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) ?  (readl(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) : 256)); | ||||
| 		} | ||||
| 	} else if (pClockCtrl) { | ||||
| 		/* Obtain divider clock frequency */ | ||||
| 		uint32_t div; | ||||
| 		uint32_t freq = 0; | ||||
| 
 | ||||
| 		if (*pClockCtrl & chipcHw_REG_DIV_CLOCK_BYPASS_SELECT) { | ||||
| 		if (readl(pClockCtrl) & chipcHw_REG_DIV_CLOCK_BYPASS_SELECT) { | ||||
| 			/* Return crystal clock frequency when bypassed */ | ||||
| 			return chipcHw_XTAL_FREQ_Hz; | ||||
| 		} else if (pDependentClock) { | ||||
| 			/* Identify the dependent clock frequency */ | ||||
| 			switch (dependentClockType) { | ||||
| 			case PLL_CLOCK: | ||||
| 				if (*pDependentClock & chipcHw_REG_PLL_CLOCK_BYPASS_SELECT) { | ||||
| 				if (readl(pDependentClock) & chipcHw_REG_PLL_CLOCK_BYPASS_SELECT) { | ||||
| 					/* Use crystal clock frequency when dependent PLL clock is bypassed */ | ||||
| 					freq = chipcHw_XTAL_FREQ_Hz; | ||||
| 				} else { | ||||
| 					/* Obtain PLL clock frequency using VCO dividers */ | ||||
| 					div = *pDependentClock & chipcHw_REG_PLL_CLOCK_MDIV_MASK; | ||||
| 					div = readl(pDependentClock) & chipcHw_REG_PLL_CLOCK_MDIV_MASK; | ||||
| 					freq = div ? chipcHw_divide(vcoHz, div) : 0; | ||||
| 				} | ||||
| 				break; | ||||
| 			case NON_PLL_CLOCK: | ||||
| 				if (pDependentClock == (uint32_t *) &pChipcHw->ACLKClock) { | ||||
| 				if (pDependentClock == &pChipcHw->ACLKClock) { | ||||
| 					freq = chipcHw_getClockFrequency (chipcHw_CLOCK_BUS); | ||||
| 				} else { | ||||
| 					if (*pDependentClock & chipcHw_REG_DIV_CLOCK_BYPASS_SELECT) { | ||||
| 					if (readl(pDependentClock) & chipcHw_REG_DIV_CLOCK_BYPASS_SELECT) { | ||||
| 						/* Use crystal clock frequency when dependent divider clock is bypassed */ | ||||
| 						freq = chipcHw_XTAL_FREQ_Hz; | ||||
| 					} else { | ||||
| 						/* Obtain divider clock frequency using XTAL dividers */ | ||||
| 						div = *pDependentClock & chipcHw_REG_DIV_CLOCK_DIV_MASK; | ||||
| 						div = readl(pDependentClock) & chipcHw_REG_DIV_CLOCK_DIV_MASK; | ||||
| 						freq = chipcHw_divide (chipcHw_XTAL_FREQ_Hz, (div ? div : 256)); | ||||
| 					} | ||||
| 				} | ||||
|  | @ -242,7 +242,7 @@ chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock	/*  [ IN ] Configur | |||
| 			freq = chipcHw_XTAL_FREQ_Hz; | ||||
| 		} | ||||
| 
 | ||||
| 		div = *pClockCtrl & chipcHw_REG_DIV_CLOCK_DIV_MASK; | ||||
| 		div = readl(pClockCtrl) & chipcHw_REG_DIV_CLOCK_DIV_MASK; | ||||
| 		return chipcHw_divide(freq, (div ? div : 256)); | ||||
| 	} | ||||
| 	return 0; | ||||
|  | @ -261,9 +261,9 @@ chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock	/*  [ IN ] Configur | |||
| chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,	/*  [ IN ] Configurable clock */ | ||||
| 				       uint32_t freq	/*  [ IN ] Clock frequency in Hz */ | ||||
|     ) { | ||||
| 	volatile uint32_t *pPLLReg = (uint32_t *) 0x0; | ||||
| 	volatile uint32_t *pClockCtrl = (uint32_t *) 0x0; | ||||
| 	volatile uint32_t *pDependentClock = (uint32_t *) 0x0; | ||||
| 	uint32_t __iomem *pPLLReg = NULL; | ||||
| 	uint32_t __iomem *pClockCtrl = NULL; | ||||
| 	uint32_t __iomem *pDependentClock = NULL; | ||||
| 	uint32_t vcoFreqPll1Hz = 0;	/* Effective VCO frequency for PLL1 in Hz */ | ||||
| 	uint32_t desVcoFreqPll1Hz = 0;	/* Desired VCO frequency for PLL1 in Hz */ | ||||
| 	uint32_t vcoFreqPll2Hz = 0;	/* Effective VCO frequency for PLL2 in Hz */ | ||||
|  | @ -272,12 +272,12 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,	/*  [ IN ] Configu | |||
| 	uint32_t desVcoHz = 0; | ||||
| 
 | ||||
| 	/* Get VCO frequencies */ | ||||
| 	if ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) { | ||||
| 	if ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) { | ||||
| 		uint64_t adjustFreq = 0; | ||||
| 
 | ||||
| 		vcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz * | ||||
| 		    chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) * | ||||
| 		    ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 		    ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 		     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT); | ||||
| 
 | ||||
| 		/* Adjusted frequency due to chipcHw_REG_PLL_DIVIDER_NDIV_f_SS */ | ||||
|  | @ -289,16 +289,16 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,	/*  [ IN ] Configu | |||
| 		/* Desired VCO frequency */ | ||||
| 		desVcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz * | ||||
| 		    chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) * | ||||
| 		    (((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 		    (((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 		      chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT) + 1); | ||||
| 	} else { | ||||
| 		vcoFreqPll1Hz = desVcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz * | ||||
| 		    chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) * | ||||
| 		    ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 		    ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 		     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT); | ||||
| 	} | ||||
| 	vcoFreqPll2Hz = chipcHw_XTAL_FREQ_Hz * chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) * | ||||
| 	    ((pChipcHw->PLLPreDivider2 & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 	    ((readl(&pChipcHw->PLLPreDivider2) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >> | ||||
| 	     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT); | ||||
| 
 | ||||
| 	switch (clock) { | ||||
|  | @ -307,8 +307,7 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,	/*  [ IN ] Configu | |||
| 		{ | ||||
| 			REG_LOCAL_IRQ_SAVE; | ||||
| 			/* Dvide DDR_phy by two to obtain DDR_ctrl clock */ | ||||
| 			pChipcHw->DDRClock = (pChipcHw->DDRClock & ~chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK) | ((((freq / 2) / chipcHw_getClockFrequency(chipcHw_CLOCK_BUS)) - 1) | ||||
| 				<< chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT); | ||||
| 			writel((readl(&pChipcHw->DDRClock) & ~chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK) | ((((freq / 2) / chipcHw_getClockFrequency(chipcHw_CLOCK_BUS)) - 1) << chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT), &pChipcHw->DDRClock); | ||||
| 			REG_LOCAL_IRQ_RESTORE; | ||||
| 		} | ||||
| 		pPLLReg = &pChipcHw->DDRClock; | ||||
|  | @ -329,8 +328,7 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,	/*  [ IN ] Configu | |||
| 		/* Configure the VPM:BUS ratio settings */ | ||||
| 		{ | ||||
| 			REG_LOCAL_IRQ_SAVE; | ||||
| 			pChipcHw->VPMClock = (pChipcHw->VPMClock & ~chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK) | ((chipcHw_divide (freq, chipcHw_getClockFrequency(chipcHw_CLOCK_BUS)) - 1) | ||||
| 				<< chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT); | ||||
| 			writel((readl(&pChipcHw->VPMClock) & ~chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK) | ((chipcHw_divide (freq, chipcHw_getClockFrequency(chipcHw_CLOCK_BUS)) - 1) << chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT), &pChipcHw->VPMClock); | ||||
| 			REG_LOCAL_IRQ_RESTORE; | ||||
| 		} | ||||
| 		pPLLReg = &pChipcHw->VPMClock; | ||||
|  | @ -428,9 +426,9 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,	/*  [ IN ] Configu | |||
| 		/* For DDR settings use only the PLL divider clock */ | ||||
| 		if (pPLLReg == &pChipcHw->DDRClock) { | ||||
| 			/* Set M1DIV for PLL1, which controls the DDR clock */ | ||||
| 			reg32_write(&pChipcHw->PLLDivider, (pChipcHw->PLLDivider & 0x00FFFFFF) | ((chipcHw_REG_PLL_DIVIDER_MDIV (desVcoHz, freq)) << 24)); | ||||
| 			reg32_write(&pChipcHw->PLLDivider, (readl(&pChipcHw->PLLDivider) & 0x00FFFFFF) | ((chipcHw_REG_PLL_DIVIDER_MDIV (desVcoHz, freq)) << 24)); | ||||
| 			/* Calculate expected frequency */ | ||||
| 			freq = chipcHw_divide(vcoHz, (((pChipcHw->PLLDivider & 0xFF000000) >> 24) ? ((pChipcHw->PLLDivider & 0xFF000000) >> 24) : 256)); | ||||
| 			freq = chipcHw_divide(vcoHz, (((readl(&pChipcHw->PLLDivider) & 0xFF000000) >> 24) ? ((readl(&pChipcHw->PLLDivider) & 0xFF000000) >> 24) : 256)); | ||||
| 		} else { | ||||
| 			/* From chip revision number B0, LCD clock is internally divided by 2 */ | ||||
| 			if ((pPLLReg == &pChipcHw->LCDClock) && (chipcHw_getChipRevisionNumber() != chipcHw_REV_NUMBER_A0)) { | ||||
|  | @ -441,7 +439,7 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,	/*  [ IN ] Configu | |||
| 			reg32_modify_and(pPLLReg, ~(chipcHw_REG_PLL_CLOCK_MDIV_MASK)); | ||||
| 			reg32_modify_or(pPLLReg, chipcHw_REG_PLL_DIVIDER_MDIV(desVcoHz, freq)); | ||||
| 			/* Calculate expected frequency */ | ||||
| 			freq = chipcHw_divide(vcoHz, ((*(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) ? (*(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) : 256)); | ||||
| 			freq = chipcHw_divide(vcoHz, ((readl(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) ? (readl(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) : 256)); | ||||
| 		} | ||||
| 		/* Wait for for atleast 200ns as per the protocol to change frequency */ | ||||
| 		udelay(1); | ||||
|  | @ -460,16 +458,16 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,	/*  [ IN ] Configu | |||
| 		if (pDependentClock) { | ||||
| 			switch (dependentClockType) { | ||||
| 			case PLL_CLOCK: | ||||
| 				divider = chipcHw_divide(chipcHw_divide (desVcoHz, (*pDependentClock & chipcHw_REG_PLL_CLOCK_MDIV_MASK)), freq); | ||||
| 				divider = chipcHw_divide(chipcHw_divide (desVcoHz, (readl(pDependentClock) & chipcHw_REG_PLL_CLOCK_MDIV_MASK)), freq); | ||||
| 				break; | ||||
| 			case NON_PLL_CLOCK: | ||||
| 				{ | ||||
| 					uint32_t sourceClock = 0; | ||||
| 
 | ||||
| 					if (pDependentClock == (uint32_t *) &pChipcHw->ACLKClock) { | ||||
| 					if (pDependentClock == &pChipcHw->ACLKClock) { | ||||
| 						sourceClock = chipcHw_getClockFrequency (chipcHw_CLOCK_BUS); | ||||
| 					} else { | ||||
| 						uint32_t div = *pDependentClock & chipcHw_REG_DIV_CLOCK_DIV_MASK; | ||||
| 						uint32_t div = readl(pDependentClock) & chipcHw_REG_DIV_CLOCK_DIV_MASK; | ||||
| 						sourceClock = chipcHw_divide (chipcHw_XTAL_FREQ_Hz, ((div) ? div : 256)); | ||||
| 					} | ||||
| 					divider = chipcHw_divide(sourceClock, freq); | ||||
|  | @ -483,7 +481,7 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,	/*  [ IN ] Configu | |||
| 		if (divider) { | ||||
| 			REG_LOCAL_IRQ_SAVE; | ||||
| 			/* Set the divider to obtain the required frequency */ | ||||
| 			*pClockCtrl = (*pClockCtrl & (~chipcHw_REG_DIV_CLOCK_DIV_MASK)) | (((divider > 256) ? chipcHw_REG_DIV_CLOCK_DIV_256 : divider) & chipcHw_REG_DIV_CLOCK_DIV_MASK); | ||||
| 			writel((readl(pClockCtrl) & (~chipcHw_REG_DIV_CLOCK_DIV_MASK)) | (((divider > 256) ? chipcHw_REG_DIV_CLOCK_DIV_256 : divider) & chipcHw_REG_DIV_CLOCK_DIV_MASK), pClockCtrl); | ||||
| 			REG_LOCAL_IRQ_RESTORE; | ||||
| 			return freq; | ||||
| 		} | ||||
|  | @ -515,25 +513,26 @@ static int vpmPhaseAlignA0(void) | |||
| 	int count = 0; | ||||
| 
 | ||||
| 	for (iter = 0; (iter < MAX_PHASE_ALIGN_ATTEMPTS) && (adjustCount < MAX_PHASE_ADJUST_COUNT); iter++) { | ||||
| 		phaseControl = (pChipcHw->VPMClock & chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK) >> chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT; | ||||
| 		phaseControl = (readl(&pChipcHw->VPMClock) & chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK) >> chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT; | ||||
| 		phaseValue = 0; | ||||
| 		prevPhaseComp = 0; | ||||
| 
 | ||||
| 		/* Step 1: Look for falling PH_COMP transition */ | ||||
| 
 | ||||
| 		/* Read the contents of VPM Clock resgister */ | ||||
| 		phaseValue = pChipcHw->VPMClock; | ||||
| 		phaseValue = readl(&pChipcHw->VPMClock); | ||||
| 		do { | ||||
| 			/* Store previous value of phase comparator */ | ||||
| 			prevPhaseComp = phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP; | ||||
| 			/* Change the value of PH_CTRL. */ | ||||
| 			reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			reg32_write(&pChipcHw->VPMClock, | ||||
| 			(readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			/* Wait atleast 20 ns */ | ||||
| 			udelay(1); | ||||
| 			/* Toggle the LOAD_CH after phase control is written. */ | ||||
| 			pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE; | ||||
| 			writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock); | ||||
| 			/* Read the contents of  VPM Clock resgister. */ | ||||
| 			phaseValue = pChipcHw->VPMClock; | ||||
| 			phaseValue = readl(&pChipcHw->VPMClock); | ||||
| 
 | ||||
| 			if ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0x0) { | ||||
| 				phaseControl = (0x3F & (phaseControl - 1)); | ||||
|  | @ -557,12 +556,13 @@ static int vpmPhaseAlignA0(void) | |||
| 
 | ||||
| 		for (count = 0; (count < 5) && ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0); count++) { | ||||
| 			phaseControl = (0x3F & (phaseControl + 1)); | ||||
| 			reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			reg32_write(&pChipcHw->VPMClock, | ||||
| 			(readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			/* Wait atleast 20 ns */ | ||||
| 			udelay(1); | ||||
| 			/* Toggle the LOAD_CH after phase control is written. */ | ||||
| 			pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE; | ||||
| 			phaseValue = pChipcHw->VPMClock; | ||||
| 			writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock); | ||||
| 			phaseValue = readl(&pChipcHw->VPMClock); | ||||
| 			/* Count number of adjustment made */ | ||||
| 			adjustCount++; | ||||
| 		} | ||||
|  | @ -581,12 +581,13 @@ static int vpmPhaseAlignA0(void) | |||
| 
 | ||||
| 		for (count = 0; (count < 3) && ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0); count++) { | ||||
| 			phaseControl = (0x3F & (phaseControl - 1)); | ||||
| 			reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			reg32_write(&pChipcHw->VPMClock, | ||||
| 			(readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			/* Wait atleast 20 ns */ | ||||
| 			udelay(1); | ||||
| 			/* Toggle the LOAD_CH after phase control is written. */ | ||||
| 			pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE; | ||||
| 			phaseValue = pChipcHw->VPMClock; | ||||
| 			writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock); | ||||
| 			phaseValue = readl(&pChipcHw->VPMClock); | ||||
| 			/* Count number of adjustment made */ | ||||
| 			adjustCount++; | ||||
| 		} | ||||
|  | @ -605,12 +606,13 @@ static int vpmPhaseAlignA0(void) | |||
| 
 | ||||
| 		for (count = 0; (count < 5); count++) { | ||||
| 			phaseControl = (0x3F & (phaseControl - 1)); | ||||
| 			reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			reg32_write(&pChipcHw->VPMClock, | ||||
| 			(readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			/* Wait atleast 20 ns */ | ||||
| 			udelay(1); | ||||
| 			/* Toggle the LOAD_CH after phase control is written. */ | ||||
| 			pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE; | ||||
| 			phaseValue = pChipcHw->VPMClock; | ||||
| 			writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock); | ||||
| 			phaseValue = readl(&pChipcHw->VPMClock); | ||||
| 			/* Count number of adjustment made */ | ||||
| 			adjustCount++; | ||||
| 		} | ||||
|  | @ -631,14 +633,14 @@ static int vpmPhaseAlignA0(void) | |||
| 			/* Store previous value of phase comparator */ | ||||
| 			prevPhaseComp = phaseValue; | ||||
| 			/* Change the value of PH_CTRL. */ | ||||
| 			reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			reg32_write(&pChipcHw->VPMClock, | ||||
| 			(readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			/* Wait atleast 20 ns */ | ||||
| 			udelay(1); | ||||
| 			/* Toggle the LOAD_CH after phase control is written. */ | ||||
| 			pChipcHw->VPMClock ^= | ||||
| 			    chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE; | ||||
| 			writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock); | ||||
| 			/* Read the contents of  VPM Clock resgister. */ | ||||
| 			phaseValue = pChipcHw->VPMClock; | ||||
| 			phaseValue = readl(&pChipcHw->VPMClock); | ||||
| 
 | ||||
| 			if ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0x0) { | ||||
| 				phaseControl = (0x3F & (phaseControl - 1)); | ||||
|  | @ -661,13 +663,13 @@ static int vpmPhaseAlignA0(void) | |||
| 	} | ||||
| 
 | ||||
| 	/* For VPM Phase should be perfectly aligned. */ | ||||
| 	phaseControl = (((pChipcHw->VPMClock >> chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT) - 1) & 0x3F); | ||||
| 	phaseControl = (((readl(&pChipcHw->VPMClock) >> chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT) - 1) & 0x3F); | ||||
| 	{ | ||||
| 		REG_LOCAL_IRQ_SAVE; | ||||
| 
 | ||||
| 		pChipcHw->VPMClock = (pChipcHw->VPMClock & ~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT); | ||||
| 		writel((readl(&pChipcHw->VPMClock) & ~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT), &pChipcHw->VPMClock); | ||||
| 		/* Load new phase value */ | ||||
| 		pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE; | ||||
| 		writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock); | ||||
| 
 | ||||
| 		REG_LOCAL_IRQ_RESTORE; | ||||
| 	} | ||||
|  | @ -697,7 +699,7 @@ int chipcHw_vpmPhaseAlign(void) | |||
| 		int adjustCount = 0; | ||||
| 
 | ||||
| 		/* Disable VPM access */ | ||||
| 		pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE; | ||||
| 		writel(readl(&pChipcHw->Spare1) & ~chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE, &pChipcHw->Spare1); | ||||
| 		/* Disable HW VPM phase alignment  */ | ||||
| 		chipcHw_vpmHwPhaseAlignDisable(); | ||||
| 		/* Enable SW VPM phase alignment  */ | ||||
|  | @ -715,23 +717,24 @@ int chipcHw_vpmPhaseAlign(void) | |||
| 				phaseControl--; | ||||
| 			} else { | ||||
| 				/* Enable VPM access */ | ||||
| 				pChipcHw->Spare1 |= chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE; | ||||
| 				writel(readl(&pChipcHw->Spare1) | chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE, &pChipcHw->Spare1); | ||||
| 				/* Return adjust count */ | ||||
| 				return adjustCount; | ||||
| 			} | ||||
| 			/* Change the value of PH_CTRL. */ | ||||
| 			reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			reg32_write(&pChipcHw->VPMClock, | ||||
| 			(readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT)); | ||||
| 			/* Wait atleast 20 ns */ | ||||
| 			udelay(1); | ||||
| 			/* Toggle the LOAD_CH after phase control is written. */ | ||||
| 			pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE; | ||||
| 			writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock); | ||||
| 			/* Count adjustment */ | ||||
| 			adjustCount++; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Disable VPM access */ | ||||
| 	pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE; | ||||
| 	writel(readl(&pChipcHw->Spare1) & ~chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE, &pChipcHw->Spare1); | ||||
| 	return -1; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -26,15 +26,15 @@ | |||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #include <csp/errno.h> | ||||
| #include <csp/stdint.h> | ||||
| #include <csp/module.h> | ||||
| #include <linux/errno.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/export.h> | ||||
| 
 | ||||
| #include <mach/csp/chipcHw_def.h> | ||||
| #include <mach/csp/chipcHw_inline.h> | ||||
| 
 | ||||
| #include <csp/reg.h> | ||||
| #include <csp/delay.h> | ||||
| #include <mach/csp/reg.h> | ||||
| #include <linux/delay.h> | ||||
| /* ---- Private Constants and Types --------------------------------------- */ | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -73,9 +73,9 @@ void chipcHw_pll2Enable(uint32_t vcoFreqHz) | |||
| 
 | ||||
| 	{ | ||||
| 		REG_LOCAL_IRQ_SAVE; | ||||
| 		pChipcHw->PLLConfig2 = | ||||
| 		    chipcHw_REG_PLL_CONFIG_D_RESET | | ||||
| 		    chipcHw_REG_PLL_CONFIG_A_RESET; | ||||
| 		writel(chipcHw_REG_PLL_CONFIG_D_RESET | | ||||
| 		       chipcHw_REG_PLL_CONFIG_A_RESET, | ||||
| 			&pChipcHw->PLLConfig2); | ||||
| 
 | ||||
| 		pllPreDivider2 = chipcHw_REG_PLL_PREDIVIDER_POWER_DOWN | | ||||
| 		    chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER | | ||||
|  | @ -87,28 +87,30 @@ void chipcHw_pll2Enable(uint32_t vcoFreqHz) | |||
| 		     chipcHw_REG_PLL_PREDIVIDER_P2_SHIFT); | ||||
| 
 | ||||
| 		/* Enable CHIPC registers to control the PLL */ | ||||
| 		pChipcHw->PLLStatus |= chipcHw_REG_PLL_STATUS_CONTROL_ENABLE; | ||||
| 		writel(readl(&pChipcHw->PLLStatus) | chipcHw_REG_PLL_STATUS_CONTROL_ENABLE, &pChipcHw->PLLStatus); | ||||
| 
 | ||||
| 		/* Set pre divider to get desired VCO frequency */ | ||||
| 		pChipcHw->PLLPreDivider2 = pllPreDivider2; | ||||
| 		writel(pllPreDivider2, &pChipcHw->PLLPreDivider2); | ||||
| 		/* Set NDIV Frac */ | ||||
| 		pChipcHw->PLLDivider2 = chipcHw_REG_PLL_DIVIDER_NDIV_f; | ||||
| 		writel(chipcHw_REG_PLL_DIVIDER_NDIV_f, &pChipcHw->PLLDivider2); | ||||
| 
 | ||||
| 		/* This has to be removed once the default values are fixed for PLL2. */ | ||||
| 		pChipcHw->PLLControl12 = 0x38000700; | ||||
| 		pChipcHw->PLLControl22 = 0x00000015; | ||||
| 		writel(0x38000700, &pChipcHw->PLLControl12); | ||||
| 		writel(0x00000015, &pChipcHw->PLLControl22); | ||||
| 
 | ||||
| 		/* Reset PLL2 */ | ||||
| 		if (vcoFreqHz > chipcHw_REG_PLL_CONFIG_VCO_SPLIT_FREQ) { | ||||
| 			pChipcHw->PLLConfig2 = chipcHw_REG_PLL_CONFIG_D_RESET | | ||||
| 			writel(chipcHw_REG_PLL_CONFIG_D_RESET | | ||||
| 			    chipcHw_REG_PLL_CONFIG_A_RESET | | ||||
| 			    chipcHw_REG_PLL_CONFIG_VCO_1601_3200 | | ||||
| 			    chipcHw_REG_PLL_CONFIG_POWER_DOWN; | ||||
| 			    chipcHw_REG_PLL_CONFIG_POWER_DOWN, | ||||
| 			    &pChipcHw->PLLConfig2); | ||||
| 		} else { | ||||
| 			pChipcHw->PLLConfig2 = chipcHw_REG_PLL_CONFIG_D_RESET | | ||||
| 			writel(chipcHw_REG_PLL_CONFIG_D_RESET | | ||||
| 			    chipcHw_REG_PLL_CONFIG_A_RESET | | ||||
| 			    chipcHw_REG_PLL_CONFIG_VCO_800_1600 | | ||||
| 			    chipcHw_REG_PLL_CONFIG_POWER_DOWN; | ||||
| 			    chipcHw_REG_PLL_CONFIG_POWER_DOWN, | ||||
| 			    &pChipcHw->PLLConfig2); | ||||
| 		} | ||||
| 		REG_LOCAL_IRQ_RESTORE; | ||||
| 	} | ||||
|  | @ -119,22 +121,25 @@ void chipcHw_pll2Enable(uint32_t vcoFreqHz) | |||
| 	{ | ||||
| 		REG_LOCAL_IRQ_SAVE; | ||||
| 		/* Remove analog reset and Power on the PLL */ | ||||
| 		pChipcHw->PLLConfig2 &= | ||||
| 		writel(readl(&pChipcHw->PLLConfig2) & | ||||
| 		    ~(chipcHw_REG_PLL_CONFIG_A_RESET | | ||||
| 		      chipcHw_REG_PLL_CONFIG_POWER_DOWN); | ||||
| 		      chipcHw_REG_PLL_CONFIG_POWER_DOWN), | ||||
| 		      &pChipcHw->PLLConfig2); | ||||
| 
 | ||||
| 		REG_LOCAL_IRQ_RESTORE; | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	/* Wait until PLL is locked */ | ||||
| 	while (!(pChipcHw->PLLStatus2 & chipcHw_REG_PLL_STATUS_LOCKED)) | ||||
| 	while (!(readl(&pChipcHw->PLLStatus2) & chipcHw_REG_PLL_STATUS_LOCKED)) | ||||
| 		; | ||||
| 
 | ||||
| 	{ | ||||
| 		REG_LOCAL_IRQ_SAVE; | ||||
| 		/* Remove digital reset */ | ||||
| 		pChipcHw->PLLConfig2 &= ~chipcHw_REG_PLL_CONFIG_D_RESET; | ||||
| 		writel(readl(&pChipcHw->PLLConfig2) & | ||||
| 			~chipcHw_REG_PLL_CONFIG_D_RESET, | ||||
| 			&pChipcHw->PLLConfig2); | ||||
| 
 | ||||
| 		REG_LOCAL_IRQ_RESTORE; | ||||
| 	} | ||||
|  | @ -157,9 +162,9 @@ void chipcHw_pll1Enable(uint32_t vcoFreqHz, chipcHw_SPREAD_SPECTRUM_e ssSupport) | |||
| 	{ | ||||
| 		REG_LOCAL_IRQ_SAVE; | ||||
| 
 | ||||
| 		pChipcHw->PLLConfig = | ||||
| 		    chipcHw_REG_PLL_CONFIG_D_RESET | | ||||
| 		    chipcHw_REG_PLL_CONFIG_A_RESET; | ||||
| 		writel(chipcHw_REG_PLL_CONFIG_D_RESET | | ||||
| 		    chipcHw_REG_PLL_CONFIG_A_RESET, | ||||
| 		    &pChipcHw->PLLConfig); | ||||
| 		/* Setting VCO frequency */ | ||||
| 		if (ssSupport == chipcHw_SPREAD_SPECTRUM_ALLOW) { | ||||
| 			pllPreDivider = | ||||
|  | @ -182,30 +187,22 @@ void chipcHw_pll1Enable(uint32_t vcoFreqHz, chipcHw_SPREAD_SPECTRUM_e ssSupport) | |||
| 		} | ||||
| 
 | ||||
| 		/* Enable CHIPC registers to control the PLL */ | ||||
| 		pChipcHw->PLLStatus |= chipcHw_REG_PLL_STATUS_CONTROL_ENABLE; | ||||
| 		writel(readl(&pChipcHw->PLLStatus) | chipcHw_REG_PLL_STATUS_CONTROL_ENABLE, &pChipcHw->PLLStatus); | ||||
| 
 | ||||
| 		/* Set pre divider to get desired VCO frequency */ | ||||
| 		pChipcHw->PLLPreDivider = pllPreDivider; | ||||
| 		writel(pllPreDivider, &pChipcHw->PLLPreDivider); | ||||
| 		/* Set NDIV Frac */ | ||||
| 		if (ssSupport == chipcHw_SPREAD_SPECTRUM_ALLOW) { | ||||
| 			pChipcHw->PLLDivider = chipcHw_REG_PLL_DIVIDER_M1DIV | | ||||
| 			    chipcHw_REG_PLL_DIVIDER_NDIV_f_SS; | ||||
| 			writel(chipcHw_REG_PLL_DIVIDER_M1DIV | chipcHw_REG_PLL_DIVIDER_NDIV_f_SS, &pChipcHw->PLLDivider); | ||||
| 		} else { | ||||
| 			pChipcHw->PLLDivider = chipcHw_REG_PLL_DIVIDER_M1DIV | | ||||
| 			    chipcHw_REG_PLL_DIVIDER_NDIV_f; | ||||
| 			writel(chipcHw_REG_PLL_DIVIDER_M1DIV | chipcHw_REG_PLL_DIVIDER_NDIV_f, &pChipcHw->PLLDivider); | ||||
| 		} | ||||
| 
 | ||||
| 		/* Reset PLL1 */ | ||||
| 		if (vcoFreqHz > chipcHw_REG_PLL_CONFIG_VCO_SPLIT_FREQ) { | ||||
| 			pChipcHw->PLLConfig = chipcHw_REG_PLL_CONFIG_D_RESET | | ||||
| 			    chipcHw_REG_PLL_CONFIG_A_RESET | | ||||
| 			    chipcHw_REG_PLL_CONFIG_VCO_1601_3200 | | ||||
| 			    chipcHw_REG_PLL_CONFIG_POWER_DOWN; | ||||
| 			writel(chipcHw_REG_PLL_CONFIG_D_RESET | chipcHw_REG_PLL_CONFIG_A_RESET | chipcHw_REG_PLL_CONFIG_VCO_1601_3200 | chipcHw_REG_PLL_CONFIG_POWER_DOWN, &pChipcHw->PLLConfig); | ||||
| 		} else { | ||||
| 			pChipcHw->PLLConfig = chipcHw_REG_PLL_CONFIG_D_RESET | | ||||
| 			    chipcHw_REG_PLL_CONFIG_A_RESET | | ||||
| 			    chipcHw_REG_PLL_CONFIG_VCO_800_1600 | | ||||
| 			    chipcHw_REG_PLL_CONFIG_POWER_DOWN; | ||||
| 			writel(chipcHw_REG_PLL_CONFIG_D_RESET | chipcHw_REG_PLL_CONFIG_A_RESET | chipcHw_REG_PLL_CONFIG_VCO_800_1600 | chipcHw_REG_PLL_CONFIG_POWER_DOWN, &pChipcHw->PLLConfig); | ||||
| 		} | ||||
| 
 | ||||
| 		REG_LOCAL_IRQ_RESTORE; | ||||
|  | @ -216,22 +213,19 @@ void chipcHw_pll1Enable(uint32_t vcoFreqHz, chipcHw_SPREAD_SPECTRUM_e ssSupport) | |||
| 		{ | ||||
| 			REG_LOCAL_IRQ_SAVE; | ||||
| 			/* Remove analog reset and Power on the PLL */ | ||||
| 			pChipcHw->PLLConfig &= | ||||
| 			    ~(chipcHw_REG_PLL_CONFIG_A_RESET | | ||||
| 			      chipcHw_REG_PLL_CONFIG_POWER_DOWN); | ||||
| 			writel(readl(&pChipcHw->PLLConfig) & ~(chipcHw_REG_PLL_CONFIG_A_RESET | chipcHw_REG_PLL_CONFIG_POWER_DOWN), &pChipcHw->PLLConfig); | ||||
| 			REG_LOCAL_IRQ_RESTORE; | ||||
| 		} | ||||
| 
 | ||||
| 		/* Wait until PLL is locked */ | ||||
| 		while (!(pChipcHw->PLLStatus & chipcHw_REG_PLL_STATUS_LOCKED) | ||||
| 		       || !(pChipcHw-> | ||||
| 			    PLLStatus2 & chipcHw_REG_PLL_STATUS_LOCKED)) | ||||
| 		while (!(readl(&pChipcHw->PLLStatus) & chipcHw_REG_PLL_STATUS_LOCKED) | ||||
| 		       || !(readl(&pChipcHw->PLLStatus2) & chipcHw_REG_PLL_STATUS_LOCKED)) | ||||
| 			; | ||||
| 
 | ||||
| 		/* Remove digital reset */ | ||||
| 		{ | ||||
| 			REG_LOCAL_IRQ_SAVE; | ||||
| 			pChipcHw->PLLConfig &= ~chipcHw_REG_PLL_CONFIG_D_RESET; | ||||
| 			writel(readl(&pChipcHw->PLLConfig) & ~chipcHw_REG_PLL_CONFIG_D_RESET, &pChipcHw->PLLConfig); | ||||
| 			REG_LOCAL_IRQ_RESTORE; | ||||
| 		} | ||||
| 	} | ||||
|  | @ -267,11 +261,7 @@ void chipcHw_Init(chipcHw_INIT_PARAM_t *initParam	/*  [ IN ] Misc chip initializ | |||
| 	chipcHw_clearStickyBits(chipcHw_REG_STICKY_CHIP_SOFT_RESET); | ||||
| 
 | ||||
| 	/* Before configuring the ARM clock, atleast we need to make sure BUS clock maintains the proper ratio with ARM clock */ | ||||
| 	pChipcHw->ACLKClock = | ||||
| 	    (pChipcHw-> | ||||
| 	     ACLKClock & ~chipcHw_REG_ACLKClock_CLK_DIV_MASK) | (initParam-> | ||||
| 								 armBusRatio & | ||||
| 								 chipcHw_REG_ACLKClock_CLK_DIV_MASK); | ||||
| 	writel((readl(&pChipcHw->ACLKClock) & ~chipcHw_REG_ACLKClock_CLK_DIV_MASK) | (initParam-> armBusRatio & chipcHw_REG_ACLKClock_CLK_DIV_MASK), &pChipcHw->ACLKClock); | ||||
| 
 | ||||
| 	/* Set various core component frequencies. The order in which this is done is important for some. */ | ||||
| 	/* The RTBUS (DDR PHY) is derived from the BUS, and the BUS from the ARM, and VPM needs to know BUS */ | ||||
|  |  | |||
|  | @ -13,11 +13,11 @@ | |||
| *****************************************************************************/ | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| #include <csp/stdint.h> | ||||
| #include <linux/types.h> | ||||
| #include <mach/csp/chipcHw_def.h> | ||||
| #include <mach/csp/chipcHw_inline.h> | ||||
| #include <csp/intcHw.h> | ||||
| #include <csp/cache.h> | ||||
| #include <mach/csp/intcHw_reg.h> | ||||
| #include <asm/cacheflush.h> | ||||
| 
 | ||||
| /* ---- Private Constants and Types --------------------------------------- */ | ||||
| /* ---- Private Variables ------------------------------------------------- */ | ||||
|  | @ -50,17 +50,18 @@ void chipcHw_reset(uint32_t mask) | |||
| 			chipcHw_softReset(chipcHw_REG_SOFT_RESET_CHIP_SOFT); | ||||
| 		} | ||||
| 		/* Bypass the PLL clocks before reboot */ | ||||
| 		pChipcHw->UARTClock |= chipcHw_REG_PLL_CLOCK_BYPASS_SELECT; | ||||
| 		pChipcHw->SPIClock |= chipcHw_REG_PLL_CLOCK_BYPASS_SELECT; | ||||
| 		writel(readl(&pChipcHw->UARTClock) | chipcHw_REG_PLL_CLOCK_BYPASS_SELECT, | ||||
| 			&pChipcHw->UARTClock); | ||||
| 		writel(readl(&pChipcHw->SPIClock) | chipcHw_REG_PLL_CLOCK_BYPASS_SELECT, | ||||
| 			&pChipcHw->SPIClock); | ||||
| 
 | ||||
| 		/* Copy the chipcHw_warmReset_run_from_aram function into ARAM */ | ||||
| 		do { | ||||
| 			((uint32_t *) MM_IO_BASE_ARAM)[i] = | ||||
| 			    ((uint32_t *) &chipcHw_reset_run_from_aram)[i]; | ||||
| 			writel(((uint32_t *) &chipcHw_reset_run_from_aram)[i], ((uint32_t __iomem *) MM_IO_BASE_ARAM) + i); | ||||
| 			i++; | ||||
| 		} while (((uint32_t *) MM_IO_BASE_ARAM)[i - 1] != 0xe1a0f00f);	/* 0xe1a0f00f == asm ("mov r15, r15"); */ | ||||
| 		} while (readl(((uint32_t __iomem*) MM_IO_BASE_ARAM) + i - 1) != 0xe1a0f00f);	/* 0xe1a0f00f == asm ("mov r15, r15"); */ | ||||
| 
 | ||||
| 		CSP_CACHE_FLUSH_ALL; | ||||
| 		flush_cache_all(); | ||||
| 
 | ||||
| 		/* run the function from ARAM */ | ||||
| 		runFunc(); | ||||
|  |  | |||
|  | @ -25,11 +25,11 @@ | |||
| /****************************************************************************/ | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| #include <csp/stdint.h> | ||||
| #include <csp/string.h> | ||||
| #include <stddef.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/string.h> | ||||
| #include <linux/stddef.h> | ||||
| 
 | ||||
| #include <csp/dmacHw.h> | ||||
| #include <mach/csp/dmacHw.h> | ||||
| #include <mach/csp/dmacHw_reg.h> | ||||
| #include <mach/csp/dmacHw_priv.h> | ||||
| #include <mach/csp/chipcHw_inline.h> | ||||
|  | @ -55,33 +55,32 @@ static uint32_t GetFifoSize(dmacHw_HANDLE_t handle	/*   [ IN ] DMA Channel handl | |||
|     ) { | ||||
| 	uint32_t val = 0; | ||||
| 	dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle); | ||||
| 	dmacHw_MISC_t *pMiscReg = | ||||
| 	    (dmacHw_MISC_t *) dmacHw_REG_MISC_BASE(pCblk->module); | ||||
| 	dmacHw_MISC_t __iomem *pMiscReg = (void __iomem *)dmacHw_REG_MISC_BASE(pCblk->module); | ||||
| 
 | ||||
| 	switch (pCblk->channel) { | ||||
| 	case 0: | ||||
| 		val = (pMiscReg->CompParm2.lo & 0x70000000) >> 28; | ||||
| 		val = (readl(&pMiscReg->CompParm2.lo) & 0x70000000) >> 28; | ||||
| 		break; | ||||
| 	case 1: | ||||
| 		val = (pMiscReg->CompParm3.hi & 0x70000000) >> 28; | ||||
| 		val = (readl(&pMiscReg->CompParm3.hi) & 0x70000000) >> 28; | ||||
| 		break; | ||||
| 	case 2: | ||||
| 		val = (pMiscReg->CompParm3.lo & 0x70000000) >> 28; | ||||
| 		val = (readl(&pMiscReg->CompParm3.lo) & 0x70000000) >> 28; | ||||
| 		break; | ||||
| 	case 3: | ||||
| 		val = (pMiscReg->CompParm4.hi & 0x70000000) >> 28; | ||||
| 		val = (readl(&pMiscReg->CompParm4.hi) & 0x70000000) >> 28; | ||||
| 		break; | ||||
| 	case 4: | ||||
| 		val = (pMiscReg->CompParm4.lo & 0x70000000) >> 28; | ||||
| 		val = (readl(&pMiscReg->CompParm4.lo) & 0x70000000) >> 28; | ||||
| 		break; | ||||
| 	case 5: | ||||
| 		val = (pMiscReg->CompParm5.hi & 0x70000000) >> 28; | ||||
| 		val = (readl(&pMiscReg->CompParm5.hi) & 0x70000000) >> 28; | ||||
| 		break; | ||||
| 	case 6: | ||||
| 		val = (pMiscReg->CompParm5.lo & 0x70000000) >> 28; | ||||
| 		val = (readl(&pMiscReg->CompParm5.lo) & 0x70000000) >> 28; | ||||
| 		break; | ||||
| 	case 7: | ||||
| 		val = (pMiscReg->CompParm6.hi & 0x70000000) >> 28; | ||||
| 		val = (readl(&pMiscReg->CompParm6.hi) & 0x70000000) >> 28; | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -26,10 +26,10 @@ | |||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #include <csp/stdint.h> | ||||
| #include <stddef.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/stddef.h> | ||||
| 
 | ||||
| #include <csp/dmacHw.h> | ||||
| #include <mach/csp/dmacHw.h> | ||||
| #include <mach/csp/dmacHw_reg.h> | ||||
| #include <mach/csp/dmacHw_priv.h> | ||||
| 
 | ||||
|  |  | |||
|  | @ -26,10 +26,10 @@ | |||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #include <csp/errno.h> | ||||
| #include <csp/stdint.h> | ||||
| #include <linux/errno.h> | ||||
| #include <linux/types.h> | ||||
| 
 | ||||
| #include <csp/tmrHw.h> | ||||
| #include <mach/csp/tmrHw.h> | ||||
| #include <mach/csp/tmrHw_reg.h> | ||||
| 
 | ||||
| #define tmrHw_ASSERT(a)                     if (!(a)) *(char *)0 = 0 | ||||
|  |  | |||
|  | @ -1,13 +0,0 @@ | |||
| #ifndef _CFG_GLOBAL_H_ | ||||
| #define _CFG_GLOBAL_H_ | ||||
| 
 | ||||
| #include <cfg_global_defines.h> | ||||
| 
 | ||||
| #define CFG_GLOBAL_CHIP                         BCM11107 | ||||
| #define CFG_GLOBAL_CHIP_FAMILY                  CFG_GLOBAL_CHIP_FAMILY_BCMRING | ||||
| #define CFG_GLOBAL_CHIP_REV                     0xB0 | ||||
| #define CFG_GLOBAL_RAM_SIZE                     0x10000000 | ||||
| #define CFG_GLOBAL_RAM_BASE                     0x00000000 | ||||
| #define CFG_GLOBAL_RAM_RESERVED_SIZE            0x000000 | ||||
| 
 | ||||
| #endif /* _CFG_GLOBAL_H_ */ | ||||
|  | @ -1,35 +0,0 @@ | |||
| /*****************************************************************************
 | ||||
| * Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved. | ||||
| * | ||||
| * Unless you and Broadcom execute a separate written software license | ||||
| * agreement governing use of this software, this software is licensed to you | ||||
| * under the terms of the GNU General Public License version 2, available at | ||||
| * http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
 | ||||
| * | ||||
| * Notwithstanding the above, under no circumstances may you combine this | ||||
| * software in any way with any other Broadcom software provided under a | ||||
| * license other than the GPL, without Broadcom's express prior written | ||||
| * consent. | ||||
| *****************************************************************************/ | ||||
| 
 | ||||
| #ifndef CSP_CACHE_H | ||||
| #define CSP_CACHE_H | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #include <csp/stdint.h> | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
| 
 | ||||
| #if defined(__KERNEL__) && !defined(STANDALONE) | ||||
| #include <asm/cacheflush.h> | ||||
| 
 | ||||
| #define CSP_CACHE_FLUSH_ALL      flush_cache_all() | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| #define CSP_CACHE_FLUSH_ALL | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #endif /* CSP_CACHE_H */ | ||||
|  | @ -1,36 +0,0 @@ | |||
| /*****************************************************************************
 | ||||
| * Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved. | ||||
| * | ||||
| * Unless you and Broadcom execute a separate written software license | ||||
| * agreement governing use of this software, this software is licensed to you | ||||
| * under the terms of the GNU General Public License version 2, available at | ||||
| * http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
 | ||||
| * | ||||
| * Notwithstanding the above, under no circumstances may you combine this | ||||
| * software in any way with any other Broadcom software provided under a | ||||
| * license other than the GPL, without Broadcom's express prior written | ||||
| * consent. | ||||
| *****************************************************************************/ | ||||
| 
 | ||||
| 
 | ||||
| #ifndef CSP_DELAY_H | ||||
| #define CSP_DELAY_H | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| /* Some CSP routines require use of the following delay routines. Use the OS */ | ||||
| /* version if available, otherwise use a CSP specific definition. */ | ||||
| /* void udelay(unsigned long usecs); */ | ||||
| /* void mdelay(unsigned long msecs); */ | ||||
| 
 | ||||
| #if defined(__KERNEL__) && !defined(STANDALONE) | ||||
|    #include <linux/delay.h> | ||||
| #else | ||||
|    #include <mach/csp/delay.h> | ||||
| #endif | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
| /* ---- Public Variable Externs ------------------------------------------ */ | ||||
| /* ---- Public Function Prototypes --------------------------------------- */ | ||||
| 
 | ||||
| #endif /*  CSP_DELAY_H */ | ||||
|  | @ -1,32 +0,0 @@ | |||
| /*****************************************************************************
 | ||||
| * Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved. | ||||
| * | ||||
| * Unless you and Broadcom execute a separate written software license | ||||
| * agreement governing use of this software, this software is licensed to you | ||||
| * under the terms of the GNU General Public License version 2, available at | ||||
| * http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
 | ||||
| * | ||||
| * Notwithstanding the above, under no circumstances may you combine this | ||||
| * software in any way with any other Broadcom software provided under a | ||||
| * license other than the GPL, without Broadcom's express prior written | ||||
| * consent. | ||||
| *****************************************************************************/ | ||||
| 
 | ||||
| #ifndef CSP_ERRNO_H | ||||
| #define CSP_ERRNO_H | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #if   defined(__KERNEL__) | ||||
| #include <linux/errno.h> | ||||
| #elif defined(CSP_SIMULATION) | ||||
| #include <asm-generic/errno.h> | ||||
| #else | ||||
| #include <errno.h> | ||||
| #endif | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
| /* ---- Public Variable Externs ------------------------------------------ */ | ||||
| /* ---- Public Function Prototypes --------------------------------------- */ | ||||
| 
 | ||||
| #endif /* CSP_ERRNO_H */ | ||||
|  | @ -1,40 +0,0 @@ | |||
| /*****************************************************************************
 | ||||
| * Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved. | ||||
| * | ||||
| * Unless you and Broadcom execute a separate written software license | ||||
| * agreement governing use of this software, this software is licensed to you | ||||
| * under the terms of the GNU General Public License version 2, available at | ||||
| * http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
 | ||||
| * | ||||
| * Notwithstanding the above, under no circumstances may you combine this | ||||
| * software in any way with any other Broadcom software provided under a | ||||
| * license other than the GPL, without Broadcom's express prior written | ||||
| * consent. | ||||
| *****************************************************************************/ | ||||
| 
 | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
| /**
 | ||||
| *  @file    intcHw.h | ||||
| * | ||||
| *  @brief   generic interrupt controller API | ||||
| * | ||||
| *  @note | ||||
| *     None | ||||
| */ | ||||
| /****************************************************************************/ | ||||
| 
 | ||||
| #ifndef _INTCHW_H | ||||
| #define _INTCHW_H | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| #include <mach/csp/intcHw_reg.h> | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
| /* ---- Public Variable Externs ------------------------------------------ */ | ||||
| /* ---- Public Function Prototypes --------------------------------------- */ | ||||
| static inline void intcHw_irq_disable(void *basep, uint32_t mask); | ||||
| static inline void intcHw_irq_enable(void *basep, uint32_t mask); | ||||
| 
 | ||||
| #endif /* _INTCHW_H */ | ||||
| 
 | ||||
|  | @ -1,32 +0,0 @@ | |||
| /*****************************************************************************
 | ||||
| * Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved. | ||||
| * | ||||
| * Unless you and Broadcom execute a separate written software license | ||||
| * agreement governing use of this software, this software is licensed to you | ||||
| * under the terms of the GNU General Public License version 2, available at | ||||
| * http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
 | ||||
| * | ||||
| * Notwithstanding the above, under no circumstances may you combine this | ||||
| * software in any way with any other Broadcom software provided under a | ||||
| * license other than the GPL, without Broadcom's express prior written | ||||
| * consent. | ||||
| *****************************************************************************/ | ||||
| 
 | ||||
| 
 | ||||
| #ifndef CSP_MODULE_H | ||||
| #define CSP_MODULE_H | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #ifdef __KERNEL__ | ||||
|     #include <linux/module.h> | ||||
| #else | ||||
|     #define EXPORT_SYMBOL(symbol) | ||||
| #endif | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
| /* ---- Public Variable Externs ------------------------------------------ */ | ||||
| /* ---- Public Function Prototypes --------------------------------------- */ | ||||
| 
 | ||||
| 
 | ||||
| #endif /* CSP_MODULE_H */ | ||||
|  | @ -1,65 +0,0 @@ | |||
| /*****************************************************************************
 | ||||
| * Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved. | ||||
| * | ||||
| * Unless you and Broadcom execute a separate written software license | ||||
| * agreement governing use of this software, this software is licensed to you | ||||
| * under the terms of the GNU General Public License version 2, available at | ||||
| * http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
 | ||||
| * | ||||
| * Notwithstanding the above, under no circumstances may you combine this | ||||
| * software in any way with any other Broadcom software provided under a | ||||
| * license other than the GPL, without Broadcom's express prior written | ||||
| * consent. | ||||
| *****************************************************************************/ | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
| /**
 | ||||
| *  @file    secHw.h | ||||
| * | ||||
| *  @brief   Definitions for accessing low level security features | ||||
| * | ||||
| */ | ||||
| /****************************************************************************/ | ||||
| #ifndef SECHW_H | ||||
| #define SECHW_H | ||||
| 
 | ||||
| typedef void (*secHw_FUNC_t) (void); | ||||
| 
 | ||||
| typedef enum { | ||||
| 	secHw_MODE_SECURE = 0x0,	/* Switches processor into secure mode */ | ||||
| 	secHw_MODE_NONSECURE = 0x1	/* Switches processor into non-secure mode */ | ||||
| } secHw_MODE; | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
| /**
 | ||||
| *  @brief   Requesting to execute the function in secure mode | ||||
| * | ||||
| *  This function requests the given function to run in secure mode | ||||
| * | ||||
| */ | ||||
| /****************************************************************************/ | ||||
| void secHw_RunSecure(secHw_FUNC_t	/* Function to run in secure mode */ | ||||
|     ); | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
| /**
 | ||||
| *  @brief   Sets the  mode | ||||
| * | ||||
| *  his function sets the processor mode (secure/non-secure) | ||||
| * | ||||
| */ | ||||
| /****************************************************************************/ | ||||
| void secHw_SetMode(secHw_MODE	/* Processor mode */ | ||||
|     ); | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
| /**
 | ||||
| *  @brief   Get the current mode | ||||
| * | ||||
| *  This function retieves the processor mode (secure/non-secure) | ||||
| * | ||||
| */ | ||||
| /****************************************************************************/ | ||||
| void secHw_GetMode(secHw_MODE *); | ||||
| 
 | ||||
| #endif /* SECHW_H */ | ||||
|  | @ -1,30 +0,0 @@ | |||
| /*****************************************************************************
 | ||||
| * Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved. | ||||
| * | ||||
| * Unless you and Broadcom execute a separate written software license | ||||
| * agreement governing use of this software, this software is licensed to you | ||||
| * under the terms of the GNU General Public License version 2, available at | ||||
| * http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
 | ||||
| * | ||||
| * Notwithstanding the above, under no circumstances may you combine this | ||||
| * software in any way with any other Broadcom software provided under a | ||||
| * license other than the GPL, without Broadcom's express prior written | ||||
| * consent. | ||||
| *****************************************************************************/ | ||||
| 
 | ||||
| #ifndef CSP_STDINT_H | ||||
| #define CSP_STDINT_H | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #ifdef __KERNEL__ | ||||
| #include <linux/types.h> | ||||
| #else | ||||
| #include <stdint.h> | ||||
| #endif | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
| /* ---- Public Variable Externs ------------------------------------------ */ | ||||
| /* ---- Public Function Prototypes --------------------------------------- */ | ||||
| 
 | ||||
| #endif /* CSP_STDINT_H */ | ||||
|  | @ -1,34 +0,0 @@ | |||
| /*****************************************************************************
 | ||||
| * Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved. | ||||
| * | ||||
| * Unless you and Broadcom execute a separate written software license | ||||
| * agreement governing use of this software, this software is licensed to you | ||||
| * under the terms of the GNU General Public License version 2, available at | ||||
| * http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
 | ||||
| * | ||||
| * Notwithstanding the above, under no circumstances may you combine this | ||||
| * software in any way with any other Broadcom software provided under a | ||||
| * license other than the GPL, without Broadcom's express prior written | ||||
| * consent. | ||||
| *****************************************************************************/ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifndef CSP_STRING_H | ||||
| #define CSP_STRING_H | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #ifdef __KERNEL__ | ||||
|    #include <linux/string.h> | ||||
| #else | ||||
|    #include <string.h> | ||||
| #endif | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
| /* ---- Public Variable Externs ------------------------------------------ */ | ||||
| /* ---- Public Function Prototypes --------------------------------------- */ | ||||
| 
 | ||||
| 
 | ||||
| #endif /* CSP_STRING_H */ | ||||
| 
 | ||||
|  | @ -38,3 +38,14 @@ | |||
| 
 | ||||
| #define IMAGE_HEADER_SIZE_CHECKSUM    4 | ||||
| #endif | ||||
| #ifndef _CFG_GLOBAL_H_ | ||||
| #define _CFG_GLOBAL_H_ | ||||
| 
 | ||||
| #define CFG_GLOBAL_CHIP                         BCM11107 | ||||
| #define CFG_GLOBAL_CHIP_FAMILY                  CFG_GLOBAL_CHIP_FAMILY_BCMRING | ||||
| #define CFG_GLOBAL_CHIP_REV                     0xB0 | ||||
| #define CFG_GLOBAL_RAM_SIZE                     0x10000000 | ||||
| #define CFG_GLOBAL_RAM_BASE                     0x00000000 | ||||
| #define CFG_GLOBAL_RAM_RESERVED_SIZE            0x000000 | ||||
| 
 | ||||
| #endif /* _CFG_GLOBAL_H_ */ | ||||
|  | @ -17,7 +17,7 @@ | |||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| #include <mach/csp/cap.h> | ||||
| #include <cfg_global.h> | ||||
| #include <mach/cfg_global.h> | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
| #define CAP_CONFIG0_VPM_DIS          0x00000001 | ||||
|  |  | |||
|  | @ -17,9 +17,9 @@ | |||
| 
 | ||||
| /* ---- Include Files ----------------------------------------------------- */ | ||||
| 
 | ||||
| #include <csp/stdint.h> | ||||
| #include <csp/errno.h> | ||||
| #include <csp/reg.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/errno.h> | ||||
| #include <mach/csp/reg.h> | ||||
| #include <mach/csp/chipcHw_reg.h> | ||||
| 
 | ||||
| /* ---- Public Constants and Types ---------------------------------------- */ | ||||
|  |  | |||
|  | @ -17,8 +17,8 @@ | |||
| 
 | ||||
| /* ---- Include Files ----------------------------------------------------- */ | ||||
| 
 | ||||
| #include <csp/errno.h> | ||||
| #include <csp/reg.h> | ||||
| #include <linux/errno.h> | ||||
| #include <mach/csp/reg.h> | ||||
| #include <mach/csp/chipcHw_reg.h> | ||||
| #include <mach/csp/chipcHw_def.h> | ||||
| 
 | ||||
|  | @ -47,7 +47,7 @@ static inline void chipcHw_setClock(chipcHw_CLOCK_e clock, | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_getChipId(void) | ||||
| { | ||||
| 	return pChipcHw->ChipId; | ||||
| 	return readl(&pChipcHw->ChipId); | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -59,15 +59,16 @@ static inline uint32_t chipcHw_getChipId(void) | |||
| /****************************************************************************/ | ||||
| static inline void chipcHw_enableSpreadSpectrum(void) | ||||
| { | ||||
| 	if ((pChipcHw-> | ||||
| 	     PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != | ||||
| 	if ((readl(&pChipcHw-> | ||||
| 	     PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != | ||||
| 	    chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) { | ||||
| 		ddrcReg_PHY_ADDR_CTL_REGP->ssCfg = | ||||
| 		    (0xFFFF << ddrcReg_PHY_ADDR_SS_CFG_NDIV_AMPLITUDE_SHIFT) | | ||||
| 		writel((0xFFFF << ddrcReg_PHY_ADDR_SS_CFG_NDIV_AMPLITUDE_SHIFT) | | ||||
| 		    (ddrcReg_PHY_ADDR_SS_CFG_MIN_CYCLE_PER_TICK << | ||||
| 		     ddrcReg_PHY_ADDR_SS_CFG_CYCLE_PER_TICK_SHIFT); | ||||
| 		ddrcReg_PHY_ADDR_CTL_REGP->ssCtl |= | ||||
| 		    ddrcReg_PHY_ADDR_SS_CTRL_ENABLE; | ||||
| 		     ddrcReg_PHY_ADDR_SS_CFG_CYCLE_PER_TICK_SHIFT), | ||||
| 		     &ddrcReg_PHY_ADDR_CTL_REGP->ssCfg); | ||||
| 		writel(readl(&ddrcReg_PHY_ADDR_CTL_REGP->ssCtl) | | ||||
| 		    ddrcReg_PHY_ADDR_SS_CTRL_ENABLE, | ||||
| 		    &ddrcReg_PHY_ADDR_CTL_REGP->ssCtl); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -93,8 +94,8 @@ static inline void chipcHw_disableSpreadSpectrum(void) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_getChipProductId(void) | ||||
| { | ||||
| 	return (pChipcHw-> | ||||
| 		 ChipId & chipcHw_REG_CHIPID_BASE_MASK) >> | ||||
| 	return (readl(&pChipcHw-> | ||||
| 		 ChipId) & chipcHw_REG_CHIPID_BASE_MASK) >> | ||||
| 		chipcHw_REG_CHIPID_BASE_SHIFT; | ||||
| } | ||||
| 
 | ||||
|  | @ -109,7 +110,7 @@ static inline uint32_t chipcHw_getChipProductId(void) | |||
| /****************************************************************************/ | ||||
| static inline chipcHw_REV_NUMBER_e chipcHw_getChipRevisionNumber(void) | ||||
| { | ||||
| 	return pChipcHw->ChipId & chipcHw_REG_CHIPID_REV_MASK; | ||||
| 	return readl(&pChipcHw->ChipId) & chipcHw_REG_CHIPID_REV_MASK; | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -156,7 +157,7 @@ static inline void chipcHw_busInterfaceClockDisable(uint32_t mask) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_getBusInterfaceClockStatus(void) | ||||
| { | ||||
| 	return pChipcHw->BusIntfClock; | ||||
| 	return readl(&pChipcHw->BusIntfClock); | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -215,8 +216,9 @@ static inline void chipcHw_softResetDisable(uint64_t mask) | |||
| 
 | ||||
| 	/* Deassert module soft reset */ | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	pChipcHw->SoftReset1 ^= ctrl1; | ||||
| 	pChipcHw->SoftReset2 ^= (ctrl2 & (~chipcHw_REG_SOFT_RESET_UNHOLD_MASK)); | ||||
| 	writel(readl(&pChipcHw->SoftReset1) ^ ctrl1, &pChipcHw->SoftReset1); | ||||
| 	writel(readl(&pChipcHw->SoftReset2) ^ (ctrl2 & | ||||
| 		(~chipcHw_REG_SOFT_RESET_UNHOLD_MASK)), &pChipcHw->SoftReset2); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
|  | @ -227,9 +229,10 @@ static inline void chipcHw_softResetEnable(uint64_t mask) | |||
| 	uint32_t unhold = 0; | ||||
| 
 | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	pChipcHw->SoftReset1 |= ctrl1; | ||||
| 	writel(readl(&pChipcHw->SoftReset1) | ctrl1, &pChipcHw->SoftReset1); | ||||
| 	/* Mask out unhold request bits */ | ||||
| 	pChipcHw->SoftReset2 |= (ctrl2 & (~chipcHw_REG_SOFT_RESET_UNHOLD_MASK)); | ||||
| 	writel(readl(&pChipcHw->SoftReset2) | (ctrl2 & | ||||
| 		(~chipcHw_REG_SOFT_RESET_UNHOLD_MASK)), &pChipcHw->SoftReset2); | ||||
| 
 | ||||
| 	/* Process unhold requests */ | ||||
| 	if (ctrl2 & chipcHw_REG_SOFT_RESET_VPM_GLOBAL_UNHOLD) { | ||||
|  | @ -246,7 +249,7 @@ static inline void chipcHw_softResetEnable(uint64_t mask) | |||
| 
 | ||||
| 	if (unhold) { | ||||
| 		/* Make sure unhold request is effective */ | ||||
| 		pChipcHw->SoftReset1 &= ~unhold; | ||||
| 		writel(readl(&pChipcHw->SoftReset1) & ~unhold, &pChipcHw->SoftReset1); | ||||
| 	} | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
|  | @ -307,7 +310,7 @@ static inline void chipcHw_setOTPOption(uint64_t mask) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_getStickyBits(void) | ||||
| { | ||||
| 	return pChipcHw->Sticky; | ||||
| 	return readl(&pChipcHw->Sticky); | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -328,7 +331,7 @@ static inline void chipcHw_setStickyBits(uint32_t mask) | |||
| 		bits |= chipcHw_REG_STICKY_POR_BROM; | ||||
| 	} else { | ||||
| 		uint32_t sticky; | ||||
| 		sticky = pChipcHw->Sticky; | ||||
| 		sticky = readl(pChipcHw->Sticky); | ||||
| 
 | ||||
| 		if ((mask & chipcHw_REG_STICKY_BOOT_DONE) | ||||
| 		    && (sticky & chipcHw_REG_STICKY_BOOT_DONE) == 0) { | ||||
|  | @ -355,7 +358,7 @@ static inline void chipcHw_setStickyBits(uint32_t mask) | |||
| 			bits |= chipcHw_REG_STICKY_GENERAL_5; | ||||
| 		} | ||||
| 	} | ||||
| 	pChipcHw->Sticky = bits; | ||||
| 	writel(bits, pChipcHw->Sticky); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
|  | @ -377,7 +380,7 @@ static inline void chipcHw_clearStickyBits(uint32_t mask) | |||
| 	    (chipcHw_REG_STICKY_BOOT_DONE | chipcHw_REG_STICKY_GENERAL_1 | | ||||
| 	     chipcHw_REG_STICKY_GENERAL_2 | chipcHw_REG_STICKY_GENERAL_3 | | ||||
| 	     chipcHw_REG_STICKY_GENERAL_4 | chipcHw_REG_STICKY_GENERAL_5)) { | ||||
| 		uint32_t sticky = pChipcHw->Sticky; | ||||
| 		uint32_t sticky = readl(&pChipcHw->Sticky); | ||||
| 
 | ||||
| 		if ((mask & chipcHw_REG_STICKY_BOOT_DONE) | ||||
| 		    && (sticky & chipcHw_REG_STICKY_BOOT_DONE)) { | ||||
|  | @ -410,7 +413,7 @@ static inline void chipcHw_clearStickyBits(uint32_t mask) | |||
| 			mask &= ~chipcHw_REG_STICKY_GENERAL_5; | ||||
| 		} | ||||
| 	} | ||||
| 	pChipcHw->Sticky = bits | mask; | ||||
| 	writel(bits | mask, &pChipcHw->Sticky); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
|  | @ -426,7 +429,7 @@ static inline void chipcHw_clearStickyBits(uint32_t mask) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_getSoftStraps(void) | ||||
| { | ||||
| 	return pChipcHw->SoftStraps; | ||||
| 	return readl(&pChipcHw->SoftStraps); | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -456,7 +459,7 @@ static inline void chipcHw_setSoftStraps(uint32_t strapOptions) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_getPinStraps(void) | ||||
| { | ||||
| 	return pChipcHw->PinStraps; | ||||
| 	return readl(&pChipcHw->PinStraps); | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -671,9 +674,9 @@ static inline void chipcHw_selectGE3(void) | |||
| /****************************************************************************/ | ||||
| static inline chipcHw_GPIO_FUNCTION_e chipcHw_getGpioPinFunction(int pin) | ||||
| { | ||||
| 	return (*((uint32_t *) chipcHw_REG_GPIO_MUX(pin)) & | ||||
| 	return (readl(chipcHw_REG_GPIO_MUX(pin))) & | ||||
| 		(chipcHw_REG_GPIO_MUX_MASK << | ||||
| 		 chipcHw_REG_GPIO_MUX_POSITION(pin))) >> | ||||
| 		 chipcHw_REG_GPIO_MUX_POSITION(pin)) >> | ||||
| 	    chipcHw_REG_GPIO_MUX_POSITION(pin); | ||||
| } | ||||
| 
 | ||||
|  | @ -841,8 +844,8 @@ static inline void chipcHw_setUsbDevice(void) | |||
| static inline void chipcHw_setClock(chipcHw_CLOCK_e clock, | ||||
| 				    chipcHw_OPTYPE_e type, int mode) | ||||
| { | ||||
| 	volatile uint32_t *pPLLReg = (uint32_t *) 0x0; | ||||
| 	volatile uint32_t *pClockCtrl = (uint32_t *) 0x0; | ||||
| 	uint32_t __iomem *pPLLReg = NULL; | ||||
| 	uint32_t __iomem *pClockCtrl = NULL; | ||||
| 
 | ||||
| 	switch (clock) { | ||||
| 	case chipcHw_CLOCK_DDR: | ||||
|  | @ -1071,7 +1074,7 @@ static inline void chipcHw_bypassClockDisable(chipcHw_CLOCK_e clock) | |||
| /****************************************************************************/ | ||||
| static inline int chipcHw_isSoftwareStrapsEnable(void) | ||||
| { | ||||
| 	return pChipcHw->SoftStraps & 0x00000001; | ||||
| 	return readl(&pChipcHw->SoftStraps) & 0x00000001; | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -1138,7 +1141,7 @@ static inline void chipcHw_pll2TestDisable(void) | |||
| /****************************************************************************/ | ||||
| static inline int chipcHw_isPllTestEnable(void) | ||||
| { | ||||
| 	return pChipcHw->PLLConfig & chipcHw_REG_PLL_CONFIG_TEST_ENABLE; | ||||
| 	return readl(&pChipcHw->PLLConfig) & chipcHw_REG_PLL_CONFIG_TEST_ENABLE; | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -1147,7 +1150,7 @@ static inline int chipcHw_isPllTestEnable(void) | |||
| /****************************************************************************/ | ||||
| static inline int chipcHw_isPll2TestEnable(void) | ||||
| { | ||||
| 	return pChipcHw->PLLConfig2 & chipcHw_REG_PLL_CONFIG_TEST_ENABLE; | ||||
| 	return readl(&pChipcHw->PLLConfig2) & chipcHw_REG_PLL_CONFIG_TEST_ENABLE; | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -1183,8 +1186,8 @@ static inline void chipcHw_pll2TestSelect(uint32_t val) | |||
| /****************************************************************************/ | ||||
| static inline uint8_t chipcHw_getPllTestSelected(void) | ||||
| { | ||||
| 	return (uint8_t) ((pChipcHw-> | ||||
| 			   PLLConfig & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK) | ||||
| 	return (uint8_t) ((readl(&pChipcHw-> | ||||
| 			   PLLConfig) & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK) | ||||
| 			  >> chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT); | ||||
| } | ||||
| 
 | ||||
|  | @ -1194,8 +1197,8 @@ static inline uint8_t chipcHw_getPllTestSelected(void) | |||
| /****************************************************************************/ | ||||
| static inline uint8_t chipcHw_getPll2TestSelected(void) | ||||
| { | ||||
| 	return (uint8_t) ((pChipcHw-> | ||||
| 			   PLLConfig2 & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK) | ||||
| 	return (uint8_t) ((readl(&pChipcHw-> | ||||
| 			   PLLConfig2) & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK) | ||||
| 			  >> chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT); | ||||
| } | ||||
| 
 | ||||
|  | @ -1208,7 +1211,8 @@ static inline uint8_t chipcHw_getPll2TestSelected(void) | |||
| static inline void chipcHw_pll1Disable(void) | ||||
| { | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	pChipcHw->PLLConfig |= chipcHw_REG_PLL_CONFIG_POWER_DOWN; | ||||
| 	writel(readl(&pChipcHw->PLLConfig) | chipcHw_REG_PLL_CONFIG_POWER_DOWN, | ||||
| 		&pChipcHw->PLLConfig); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
|  | @ -1221,7 +1225,8 @@ static inline void chipcHw_pll1Disable(void) | |||
| static inline void chipcHw_pll2Disable(void) | ||||
| { | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	pChipcHw->PLLConfig2 |= chipcHw_REG_PLL_CONFIG_POWER_DOWN; | ||||
| 	writel(readl(&pChipcHw->PLLConfig2) | chipcHw_REG_PLL_CONFIG_POWER_DOWN, | ||||
| 		&pChipcHw->PLLConfig2); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
|  | @ -1233,7 +1238,8 @@ static inline void chipcHw_pll2Disable(void) | |||
| static inline void chipcHw_ddrPhaseAlignInterruptEnable(void) | ||||
| { | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	pChipcHw->Spare1 |= chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE; | ||||
| 	writel(readl(&pChipcHw->Spare1) | chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE, | ||||
| 		&pChipcHw->Spare1); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
|  | @ -1245,7 +1251,8 @@ static inline void chipcHw_ddrPhaseAlignInterruptEnable(void) | |||
| static inline void chipcHw_ddrPhaseAlignInterruptDisable(void) | ||||
| { | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE; | ||||
| 	writel(readl(&pChipcHw->Spare1) & ~chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE, | ||||
| 		&pChipcHw->Spare1); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
|  | @ -1333,7 +1340,8 @@ static inline void chipcHw_ddrHwPhaseAlignDisable(void) | |||
| static inline void chipcHw_vpmSwPhaseAlignEnable(void) | ||||
| { | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	pChipcHw->VPMPhaseCtrl1 |= chipcHw_REG_VPM_SW_PHASE_CTRL_ENABLE; | ||||
| 	writel(readl(&pChipcHw->VPMPhaseCtrl1) | chipcHw_REG_VPM_SW_PHASE_CTRL_ENABLE, | ||||
| 			&pChipcHw->VPMPhaseCtrl1); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
|  | @ -1372,7 +1380,8 @@ static inline void chipcHw_vpmHwPhaseAlignEnable(void) | |||
| static inline void chipcHw_vpmHwPhaseAlignDisable(void) | ||||
| { | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	pChipcHw->VPMPhaseCtrl1 &= ~chipcHw_REG_VPM_HW_PHASE_CTRL_ENABLE; | ||||
| 	writel(readl(&pChipcHw->VPMPhaseCtrl1) & ~chipcHw_REG_VPM_HW_PHASE_CTRL_ENABLE, | ||||
| 		&pChipcHw->VPMPhaseCtrl1); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
|  | @ -1474,8 +1483,8 @@ chipcHw_setVpmHwPhaseAlignMargin(chipcHw_VPM_HW_PHASE_MARGIN_e margin) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_isDdrHwPhaseAligned(void) | ||||
| { | ||||
| 	return (pChipcHw-> | ||||
| 		PhaseAlignStatus & chipcHw_REG_DDR_PHASE_ALIGNED) ? 1 : 0; | ||||
| 	return (readl(&pChipcHw-> | ||||
| 		PhaseAlignStatus) & chipcHw_REG_DDR_PHASE_ALIGNED) ? 1 : 0; | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -1488,8 +1497,8 @@ static inline uint32_t chipcHw_isDdrHwPhaseAligned(void) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_isVpmHwPhaseAligned(void) | ||||
| { | ||||
| 	return (pChipcHw-> | ||||
| 		PhaseAlignStatus & chipcHw_REG_VPM_PHASE_ALIGNED) ? 1 : 0; | ||||
| 	return (readl(&pChipcHw-> | ||||
| 		PhaseAlignStatus) & chipcHw_REG_VPM_PHASE_ALIGNED) ? 1 : 0; | ||||
| } | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
|  | @ -1500,8 +1509,8 @@ static inline uint32_t chipcHw_isVpmHwPhaseAligned(void) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_getDdrHwPhaseAlignStatus(void) | ||||
| { | ||||
| 	return (pChipcHw-> | ||||
| 		PhaseAlignStatus & chipcHw_REG_DDR_PHASE_STATUS_MASK) >> | ||||
| 	return (readl(&pChipcHw-> | ||||
| 		PhaseAlignStatus) & chipcHw_REG_DDR_PHASE_STATUS_MASK) >> | ||||
| 	    chipcHw_REG_DDR_PHASE_STATUS_SHIFT; | ||||
| } | ||||
| 
 | ||||
|  | @ -1513,8 +1522,8 @@ static inline uint32_t chipcHw_getDdrHwPhaseAlignStatus(void) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_getVpmHwPhaseAlignStatus(void) | ||||
| { | ||||
| 	return (pChipcHw-> | ||||
| 		PhaseAlignStatus & chipcHw_REG_VPM_PHASE_STATUS_MASK) >> | ||||
| 	return (readl(&pChipcHw-> | ||||
| 		PhaseAlignStatus) & chipcHw_REG_VPM_PHASE_STATUS_MASK) >> | ||||
| 	    chipcHw_REG_VPM_PHASE_STATUS_SHIFT; | ||||
| } | ||||
| 
 | ||||
|  | @ -1526,8 +1535,8 @@ static inline uint32_t chipcHw_getVpmHwPhaseAlignStatus(void) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_getDdrPhaseControl(void) | ||||
| { | ||||
| 	return (pChipcHw-> | ||||
| 		PhaseAlignStatus & chipcHw_REG_DDR_PHASE_CTRL_MASK) >> | ||||
| 	return (readl(&pChipcHw-> | ||||
| 		PhaseAlignStatus) & chipcHw_REG_DDR_PHASE_CTRL_MASK) >> | ||||
| 	    chipcHw_REG_DDR_PHASE_CTRL_SHIFT; | ||||
| } | ||||
| 
 | ||||
|  | @ -1539,8 +1548,8 @@ static inline uint32_t chipcHw_getDdrPhaseControl(void) | |||
| /****************************************************************************/ | ||||
| static inline uint32_t chipcHw_getVpmPhaseControl(void) | ||||
| { | ||||
| 	return (pChipcHw-> | ||||
| 		PhaseAlignStatus & chipcHw_REG_VPM_PHASE_CTRL_MASK) >> | ||||
| 	return (readl(&pChipcHw-> | ||||
| 		PhaseAlignStatus) & chipcHw_REG_VPM_PHASE_CTRL_MASK) >> | ||||
| 	    chipcHw_REG_VPM_PHASE_CTRL_SHIFT; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ | |||
| #define CHIPCHW_REG_H | ||||
| 
 | ||||
| #include <mach/csp/mm_io.h> | ||||
| #include <csp/reg.h> | ||||
| #include <mach/csp/reg.h> | ||||
| #include <mach/csp/ddrcReg.h> | ||||
| 
 | ||||
| #define chipcHw_BASE_ADDRESS    MM_IO_BASE_CHIPC | ||||
|  | @ -131,8 +131,8 @@ typedef struct { | |||
| 	uint32_t MiscInput_0_15;	/* Input type for MISC 0 - 16 */ | ||||
| } chipcHw_REG_t; | ||||
| 
 | ||||
| #define pChipcHw  ((volatile chipcHw_REG_t *) chipcHw_BASE_ADDRESS) | ||||
| #define pChipcPhysical  ((volatile chipcHw_REG_t *) MM_ADDR_IO_CHIPC) | ||||
| #define pChipcHw  ((chipcHw_REG_t __iomem *) chipcHw_BASE_ADDRESS) | ||||
| #define pChipcPhysical  (MM_ADDR_IO_CHIPC) | ||||
| 
 | ||||
| #define chipcHw_REG_CHIPID_BASE_MASK                    0xFFFFF000 | ||||
| #define chipcHw_REG_CHIPID_BASE_SHIFT                   12 | ||||
|  |  | |||
|  | @ -30,8 +30,8 @@ extern "C" { | |||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #include <csp/reg.h> | ||||
| #include <csp/stdint.h> | ||||
| #include <mach/csp/reg.h> | ||||
| #include <linux/types.h> | ||||
| 
 | ||||
| #include <mach/csp/mm_io.h> | ||||
| 
 | ||||
|  | @ -416,7 +416,7 @@ extern "C" { | |||
| 	} ddrcReg_PHY_ADDR_CTL_REG_t; | ||||
| 
 | ||||
| #define ddrcReg_PHY_ADDR_CTL_REG_OFFSET                 0x0400 | ||||
| #define ddrcReg_PHY_ADDR_CTL_REGP                       ((volatile ddrcReg_PHY_ADDR_CTL_REG_t *) (MM_IO_BASE_DDRC + ddrcReg_PHY_ADDR_CTL_REG_OFFSET)) | ||||
| #define ddrcReg_PHY_ADDR_CTL_REGP                       ((volatile ddrcReg_PHY_ADDR_CTL_REG_t __iomem*) (MM_IO_BASE_DDRC + ddrcReg_PHY_ADDR_CTL_REG_OFFSET)) | ||||
| 
 | ||||
| /* @todo These SS definitions are duplicates of ones below */ | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,9 +23,9 @@ | |||
| #ifndef _DMACHW_H | ||||
| #define _DMACHW_H | ||||
| 
 | ||||
| #include <stddef.h> | ||||
| #include <linux/stddef.h> | ||||
| 
 | ||||
| #include <csp/stdint.h> | ||||
| #include <linux/types.h> | ||||
| #include <mach/csp/dmacHw_reg.h> | ||||
| 
 | ||||
| /* Define DMA Channel ID using DMA controller number (m) and channel number (c).
 | ||||
|  | @ -24,7 +24,7 @@ | |||
| #ifndef _DMACHW_PRIV_H | ||||
| #define _DMACHW_PRIV_H | ||||
| 
 | ||||
| #include <csp/stdint.h> | ||||
| #include <linux/types.h> | ||||
| 
 | ||||
| /* Data type for DMA Link List Item */ | ||||
| typedef struct { | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ | |||
| #ifndef _DMACHW_REG_H | ||||
| #define _DMACHW_REG_H | ||||
| 
 | ||||
| #include <csp/stdint.h> | ||||
| #include <linux/types.h> | ||||
| #include <mach/csp/mm_io.h> | ||||
| 
 | ||||
| /* Data type for 64 bit little endian register */ | ||||
|  | @ -121,75 +121,75 @@ typedef struct { | |||
| } dmacHw_MISC_t; | ||||
| 
 | ||||
| /* Base registers */ | ||||
| #define dmacHw_0_MODULE_BASE_ADDR        (char *) MM_IO_BASE_DMA0	/* DMAC 0 module's base address */ | ||||
| #define dmacHw_1_MODULE_BASE_ADDR        (char *) MM_IO_BASE_DMA1	/* DMAC 1 module's base address */ | ||||
| #define dmacHw_0_MODULE_BASE_ADDR        (char __iomem*) MM_IO_BASE_DMA0	/* DMAC 0 module's base address */ | ||||
| #define dmacHw_1_MODULE_BASE_ADDR        (char __iomem*) MM_IO_BASE_DMA1	/* DMAC 1 module's base address */ | ||||
| 
 | ||||
| extern uint32_t dmaChannelCount_0; | ||||
| extern uint32_t dmaChannelCount_1; | ||||
| 
 | ||||
| /* Define channel specific registers */ | ||||
| #define dmacHw_CHAN_BASE(module, chan)          ((dmacHw_CH_REG_t *) ((char *)((module) ? dmacHw_1_MODULE_BASE_ADDR : dmacHw_0_MODULE_BASE_ADDR) + ((chan) * sizeof(dmacHw_CH_REG_t)))) | ||||
| #define dmacHw_CHAN_BASE(module, chan)          ((dmacHw_CH_REG_t __iomem*) ((char __iomem*)((module) ? dmacHw_1_MODULE_BASE_ADDR : dmacHw_0_MODULE_BASE_ADDR) + ((chan) * sizeof(dmacHw_CH_REG_t)))) | ||||
| 
 | ||||
| /* Raw interrupt status registers */ | ||||
| #define dmacHw_REG_INT_RAW_BASE(module)         ((char *)dmacHw_CHAN_BASE((module), ((module) ? dmaChannelCount_1 : dmaChannelCount_0))) | ||||
| #define dmacHw_REG_INT_RAW_TRAN(module)         (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawTfr.lo) | ||||
| #define dmacHw_REG_INT_RAW_BLOCK(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawBlock.lo) | ||||
| #define dmacHw_REG_INT_RAW_STRAN(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawSrcTran.lo) | ||||
| #define dmacHw_REG_INT_RAW_DTRAN(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawDstTran.lo) | ||||
| #define dmacHw_REG_INT_RAW_ERROR(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawErr.lo) | ||||
| #define dmacHw_REG_INT_RAW_BASE(module)         ((char __iomem *)dmacHw_CHAN_BASE((module), ((module) ? dmaChannelCount_1 : dmaChannelCount_0))) | ||||
| #define dmacHw_REG_INT_RAW_TRAN(module)         (((dmacHw_INT_RAW_t __iomem *) dmacHw_REG_INT_RAW_BASE((module)))->RawTfr.lo) | ||||
| #define dmacHw_REG_INT_RAW_BLOCK(module)        (((dmacHw_INT_RAW_t __iomem *) dmacHw_REG_INT_RAW_BASE((module)))->RawBlock.lo) | ||||
| #define dmacHw_REG_INT_RAW_STRAN(module)        (((dmacHw_INT_RAW_t __iomem *) dmacHw_REG_INT_RAW_BASE((module)))->RawSrcTran.lo) | ||||
| #define dmacHw_REG_INT_RAW_DTRAN(module)        (((dmacHw_INT_RAW_t __iomem *) dmacHw_REG_INT_RAW_BASE((module)))->RawDstTran.lo) | ||||
| #define dmacHw_REG_INT_RAW_ERROR(module)        (((dmacHw_INT_RAW_t __iomem *) dmacHw_REG_INT_RAW_BASE((module)))->RawErr.lo) | ||||
| 
 | ||||
| /* Interrupt status registers */ | ||||
| #define dmacHw_REG_INT_STAT_BASE(module)        ((char *)(dmacHw_REG_INT_RAW_BASE((module)) + sizeof(dmacHw_INT_RAW_t))) | ||||
| #define dmacHw_REG_INT_STAT_TRAN(module)        (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusTfr.lo) | ||||
| #define dmacHw_REG_INT_STAT_BLOCK(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusBlock.lo) | ||||
| #define dmacHw_REG_INT_STAT_STRAN(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusSrcTran.lo) | ||||
| #define dmacHw_REG_INT_STAT_DTRAN(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusDstTran.lo) | ||||
| #define dmacHw_REG_INT_STAT_ERROR(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusErr.lo) | ||||
| #define dmacHw_REG_INT_STAT_BASE(module)        ((char __iomem*)(dmacHw_REG_INT_RAW_BASE((module)) + sizeof(dmacHw_INT_RAW_t))) | ||||
| #define dmacHw_REG_INT_STAT_TRAN(module)        (((dmacHw_INT_STATUS_t __iomem *) dmacHw_REG_INT_STAT_BASE((module)))->StatusTfr.lo) | ||||
| #define dmacHw_REG_INT_STAT_BLOCK(module)       (((dmacHw_INT_STATUS_t __iomem *) dmacHw_REG_INT_STAT_BASE((module)))->StatusBlock.lo) | ||||
| #define dmacHw_REG_INT_STAT_STRAN(module)       (((dmacHw_INT_STATUS_t __iomem *) dmacHw_REG_INT_STAT_BASE((module)))->StatusSrcTran.lo) | ||||
| #define dmacHw_REG_INT_STAT_DTRAN(module)       (((dmacHw_INT_STATUS_t __iomem *) dmacHw_REG_INT_STAT_BASE((module)))->StatusDstTran.lo) | ||||
| #define dmacHw_REG_INT_STAT_ERROR(module)       (((dmacHw_INT_STATUS_t __iomem *) dmacHw_REG_INT_STAT_BASE((module)))->StatusErr.lo) | ||||
| 
 | ||||
| /* Interrupt status registers */ | ||||
| #define dmacHw_REG_INT_MASK_BASE(module)        ((char *)(dmacHw_REG_INT_STAT_BASE((module)) + sizeof(dmacHw_INT_STATUS_t))) | ||||
| #define dmacHw_REG_INT_MASK_TRAN(module)        (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskTfr.lo) | ||||
| #define dmacHw_REG_INT_MASK_BLOCK(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskBlock.lo) | ||||
| #define dmacHw_REG_INT_MASK_STRAN(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskSrcTran.lo) | ||||
| #define dmacHw_REG_INT_MASK_DTRAN(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskDstTran.lo) | ||||
| #define dmacHw_REG_INT_MASK_ERROR(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskErr.lo) | ||||
| #define dmacHw_REG_INT_MASK_BASE(module)        ((char __iomem*)(dmacHw_REG_INT_STAT_BASE((module)) + sizeof(dmacHw_INT_STATUS_t))) | ||||
| #define dmacHw_REG_INT_MASK_TRAN(module)        (((dmacHw_INT_MASK_t __iomem *) dmacHw_REG_INT_MASK_BASE((module)))->MaskTfr.lo) | ||||
| #define dmacHw_REG_INT_MASK_BLOCK(module)       (((dmacHw_INT_MASK_t __iomem *) dmacHw_REG_INT_MASK_BASE((module)))->MaskBlock.lo) | ||||
| #define dmacHw_REG_INT_MASK_STRAN(module)       (((dmacHw_INT_MASK_t __iomem *) dmacHw_REG_INT_MASK_BASE((module)))->MaskSrcTran.lo) | ||||
| #define dmacHw_REG_INT_MASK_DTRAN(module)       (((dmacHw_INT_MASK_t __iomem *) dmacHw_REG_INT_MASK_BASE((module)))->MaskDstTran.lo) | ||||
| #define dmacHw_REG_INT_MASK_ERROR(module)       (((dmacHw_INT_MASK_t __iomem *) dmacHw_REG_INT_MASK_BASE((module)))->MaskErr.lo) | ||||
| 
 | ||||
| /* Interrupt clear registers */ | ||||
| #define dmacHw_REG_INT_CLEAR_BASE(module)       ((char *)(dmacHw_REG_INT_MASK_BASE((module)) + sizeof(dmacHw_INT_MASK_t))) | ||||
| #define dmacHw_REG_INT_CLEAR_TRAN(module)       (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearTfr.lo) | ||||
| #define dmacHw_REG_INT_CLEAR_BLOCK(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearBlock.lo) | ||||
| #define dmacHw_REG_INT_CLEAR_STRAN(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearSrcTran.lo) | ||||
| #define dmacHw_REG_INT_CLEAR_DTRAN(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearDstTran.lo) | ||||
| #define dmacHw_REG_INT_CLEAR_ERROR(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearErr.lo) | ||||
| #define dmacHw_REG_INT_STATUS(module)           (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->StatusInt.lo) | ||||
| #define dmacHw_REG_INT_CLEAR_BASE(module)       ((char __iomem*)(dmacHw_REG_INT_MASK_BASE((module)) + sizeof(dmacHw_INT_MASK_t))) | ||||
| #define dmacHw_REG_INT_CLEAR_TRAN(module)       (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearTfr.lo) | ||||
| #define dmacHw_REG_INT_CLEAR_BLOCK(module)      (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearBlock.lo) | ||||
| #define dmacHw_REG_INT_CLEAR_STRAN(module)      (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearSrcTran.lo) | ||||
| #define dmacHw_REG_INT_CLEAR_DTRAN(module)      (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearDstTran.lo) | ||||
| #define dmacHw_REG_INT_CLEAR_ERROR(module)      (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearErr.lo) | ||||
| #define dmacHw_REG_INT_STATUS(module)           (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->StatusInt.lo) | ||||
| 
 | ||||
| /* Software handshaking registers */ | ||||
| #define dmacHw_REG_SW_HS_BASE(module)           ((char *)(dmacHw_REG_INT_CLEAR_BASE((module)) + sizeof(dmacHw_INT_CLEAR_t))) | ||||
| #define dmacHw_REG_SW_HS_SRC_REQ(module)        (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->ReqSrcReg.lo) | ||||
| #define dmacHw_REG_SW_HS_DST_REQ(module)        (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->ReqDstReg.lo) | ||||
| #define dmacHw_REG_SW_HS_SRC_SGL_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->SglReqSrcReg.lo) | ||||
| #define dmacHw_REG_SW_HS_DST_SGL_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->SglReqDstReg.lo) | ||||
| #define dmacHw_REG_SW_HS_SRC_LST_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->LstSrcReg.lo) | ||||
| #define dmacHw_REG_SW_HS_DST_LST_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->LstDstReg.lo) | ||||
| #define dmacHw_REG_SW_HS_BASE(module)           ((char __iomem*)(dmacHw_REG_INT_CLEAR_BASE((module)) + sizeof(dmacHw_INT_CLEAR_t))) | ||||
| #define dmacHw_REG_SW_HS_SRC_REQ(module)        (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->ReqSrcReg.lo) | ||||
| #define dmacHw_REG_SW_HS_DST_REQ(module)        (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->ReqDstReg.lo) | ||||
| #define dmacHw_REG_SW_HS_SRC_SGL_REQ(module)    (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->SglReqSrcReg.lo) | ||||
| #define dmacHw_REG_SW_HS_DST_SGL_REQ(module)    (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->SglReqDstReg.lo) | ||||
| #define dmacHw_REG_SW_HS_SRC_LST_REQ(module)    (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->LstSrcReg.lo) | ||||
| #define dmacHw_REG_SW_HS_DST_LST_REQ(module)    (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->LstDstReg.lo) | ||||
| 
 | ||||
| /* Miscellaneous registers */ | ||||
| #define dmacHw_REG_MISC_BASE(module)            ((char *)(dmacHw_REG_SW_HS_BASE((module)) + sizeof(dmacHw_SW_HANDSHAKE_t))) | ||||
| #define dmacHw_REG_MISC_CFG(module)             (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->DmaCfgReg.lo) | ||||
| #define dmacHw_REG_MISC_CH_ENABLE(module)       (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->ChEnReg.lo) | ||||
| #define dmacHw_REG_MISC_ID(module)              (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->DmaIdReg.lo) | ||||
| #define dmacHw_REG_MISC_TEST(module)            (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->DmaTestReg.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM1_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm1.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM1_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm1.hi) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM2_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm2.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM2_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm2.hi) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM3_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm3.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM3_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm3.hi) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM4_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm4.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM4_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm4.hi) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM5_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm5.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM5_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm5.hi) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM6_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm6.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM6_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm6.hi) | ||||
| #define dmacHw_REG_MISC_BASE(module)            ((char __iomem*)(dmacHw_REG_SW_HS_BASE((module)) + sizeof(dmacHw_SW_HANDSHAKE_t))) | ||||
| #define dmacHw_REG_MISC_CFG(module)             (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->DmaCfgReg.lo) | ||||
| #define dmacHw_REG_MISC_CH_ENABLE(module)       (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->ChEnReg.lo) | ||||
| #define dmacHw_REG_MISC_ID(module)              (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->DmaIdReg.lo) | ||||
| #define dmacHw_REG_MISC_TEST(module)            (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->DmaTestReg.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM1_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm1.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM1_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm1.hi) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM2_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm2.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM2_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm2.hi) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM3_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm3.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM3_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm3.hi) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM4_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm4.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM4_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm4.hi) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM5_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm5.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM5_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm5.hi) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM6_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm6.lo) | ||||
| #define dmacHw_REG_MISC_COMP_PARAM6_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm6.hi) | ||||
| 
 | ||||
| /* Channel control registers */ | ||||
| #define dmacHw_REG_SAR(module, chan)            (dmacHw_CHAN_BASE((module), (chan))->ChannelSar.lo) | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ | |||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #include <cfg_global.h> | ||||
| #include <mach/cfg_global.h> | ||||
| #include <mach/csp/cap_inline.h> | ||||
| 
 | ||||
| #if defined(__KERNEL__) | ||||
|  |  | |||
|  | @ -27,8 +27,8 @@ | |||
| #define _INTCHW_REG_H | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| #include <csp/stdint.h> | ||||
| #include <csp/reg.h> | ||||
| #include <linux/types.h> | ||||
| #include <mach/csp/reg.h> | ||||
| #include <mach/csp/mm_io.h> | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
|  | @ -37,9 +37,9 @@ | |||
| #define INTCHW_NUM_INTC           3 | ||||
| 
 | ||||
| /* Defines for interrupt controllers. This simplifies and cleans up the function calls. */ | ||||
| #define INTCHW_INTC0    ((void *)MM_IO_BASE_INTC0) | ||||
| #define INTCHW_INTC1    ((void *)MM_IO_BASE_INTC1) | ||||
| #define INTCHW_SINTC    ((void *)MM_IO_BASE_SINTC) | ||||
| #define INTCHW_INTC0    (MM_IO_BASE_INTC0) | ||||
| #define INTCHW_INTC1    (MM_IO_BASE_INTC1) | ||||
| #define INTCHW_SINTC    (MM_IO_BASE_SINTC) | ||||
| 
 | ||||
| /* INTC0 - interrupt controller 0 */ | ||||
| #define INTCHW_INTC0_PIF_BITNUM           31	/* Peripheral interface interrupt */ | ||||
|  | @ -232,15 +232,15 @@ | |||
| /* ---- Public Variable Externs ------------------------------------------ */ | ||||
| /* ---- Public Function Prototypes --------------------------------------- */ | ||||
| /* Clear one or more IRQ interrupts. */ | ||||
| static inline void intcHw_irq_disable(void *basep, uint32_t mask) | ||||
| static inline void intcHw_irq_disable(void __iomem *basep, uint32_t mask) | ||||
| { | ||||
| 	__REG32(basep + INTCHW_INTENCLEAR) = mask; | ||||
| 	writel(mask, basep + INTCHW_INTENCLEAR); | ||||
| } | ||||
| 
 | ||||
| /* Enables one or more IRQ interrupts. */ | ||||
| static inline void intcHw_irq_enable(void *basep, uint32_t mask) | ||||
| static inline void intcHw_irq_enable(void __iomem *basep, uint32_t mask) | ||||
| { | ||||
| 	__REG32(basep + INTCHW_INTENABLE) = mask; | ||||
| 	writel(mask, basep + INTCHW_INTENABLE); | ||||
| } | ||||
| 
 | ||||
| #endif /* _INTCHW_REG_H */ | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ | |||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #if !defined(CSP_SIMULATION) | ||||
| #include <cfg_global.h> | ||||
| #include <mach/cfg_global.h> | ||||
| #endif | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ | |||
| #include <mach/csp/mm_addr.h> | ||||
| 
 | ||||
| #if !defined(CSP_SIMULATION) | ||||
| #include <cfg_global.h> | ||||
| #include <mach/cfg_global.h> | ||||
| #endif | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
|  | @ -49,7 +49,7 @@ | |||
| #ifdef __ASSEMBLY__ | ||||
| #define MM_IO_PHYS_TO_VIRT(phys)       (0xF0000000 | (((phys) >> 4) & 0x0F000000) | ((phys) & 0xFFFFFF)) | ||||
| #else | ||||
| #define MM_IO_PHYS_TO_VIRT(phys)       (((phys) == MM_ADDR_IO_VPM_EXTMEM_RSVD) ? 0xF0000000 : \ | ||||
| #define MM_IO_PHYS_TO_VIRT(phys)       (void __iomem *)(((phys) == MM_ADDR_IO_VPM_EXTMEM_RSVD) ? 0xF0000000 : \ | ||||
| 			(0xF0000000 | (((phys) >> 4) & 0x0F000000) | ((phys) & 0xFFFFFF))) | ||||
| #endif | ||||
| #endif | ||||
|  | @ -60,8 +60,8 @@ | |||
| #ifdef __ASSEMBLY__ | ||||
| #define MM_IO_VIRT_TO_PHYS(virt)       ((((virt) & 0x0F000000) << 4) | ((virt) & 0xFFFFFF)) | ||||
| #else | ||||
| #define MM_IO_VIRT_TO_PHYS(virt)       (((virt) == 0xF0000000) ? MM_ADDR_IO_VPM_EXTMEM_RSVD : \ | ||||
| 			((((virt) & 0x0F000000) << 4) | ((virt) & 0xFFFFFF))) | ||||
| #define MM_IO_VIRT_TO_PHYS(virt)       (((unsigned long)(virt) == 0xF0000000) ? MM_ADDR_IO_VPM_EXTMEM_RSVD : \ | ||||
| 			((((unsigned long)(virt) & 0x0F000000) << 4) | ((unsigned long)(virt) & 0xFFFFFF))) | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,13 +25,14 @@ | |||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| 
 | ||||
| #include <csp/stdint.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/io.h> | ||||
| 
 | ||||
| /* ---- Public Constants and Types --------------------------------------- */ | ||||
| 
 | ||||
| #define __REG32(x)      (*((volatile uint32_t *)(x))) | ||||
| #define __REG16(x)      (*((volatile uint16_t *)(x))) | ||||
| #define __REG8(x)       (*((volatile uint8_t *) (x))) | ||||
| #define __REG32(x)      (*((volatile uint32_t __iomem *)(x))) | ||||
| #define __REG16(x)      (*((volatile uint16_t __iomem *)(x))) | ||||
| #define __REG8(x)       (*((volatile uint8_t __iomem *) (x))) | ||||
| 
 | ||||
| /* Macros used to define a sequence of reserved registers. The start / end */ | ||||
| /* are byte offsets in the particular register definition, with the "end" */ | ||||
|  | @ -84,31 +85,31 @@ | |||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| static inline void reg32_modify_and(volatile uint32_t *reg, uint32_t value) | ||||
| static inline void reg32_modify_and(volatile uint32_t __iomem *reg, uint32_t value) | ||||
| { | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	*reg &= value; | ||||
| 	__raw_writel(__raw_readl(reg) & value, reg); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
| static inline void reg32_modify_or(volatile uint32_t *reg, uint32_t value) | ||||
| static inline void reg32_modify_or(volatile uint32_t __iomem *reg, uint32_t value) | ||||
| { | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	*reg |= value; | ||||
| 	__raw_writel(__raw_readl(reg) | value, reg); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
| static inline void reg32_modify_mask(volatile uint32_t *reg, uint32_t mask, | ||||
| static inline void reg32_modify_mask(volatile uint32_t __iomem *reg, uint32_t mask, | ||||
| 				     uint32_t value) | ||||
| { | ||||
| 	REG_LOCAL_IRQ_SAVE; | ||||
| 	*reg = (*reg & mask) | value; | ||||
| 	__raw_writel((__raw_readl(reg) & mask) | value, reg); | ||||
| 	REG_LOCAL_IRQ_RESTORE; | ||||
| } | ||||
| 
 | ||||
| static inline void reg32_write(volatile uint32_t *reg, uint32_t value) | ||||
| static inline void reg32_write(volatile uint32_t __iomem *reg, uint32_t value) | ||||
| { | ||||
| 	*reg = value; | ||||
| 	__raw_writel(value, reg); | ||||
| } | ||||
| 
 | ||||
| #endif /* CSP_REG_H */ | ||||
|  | @ -34,7 +34,7 @@ | |||
| /****************************************************************************/ | ||||
| static inline void secHw_setSecure(uint32_t mask	/*  mask of type secHw_BLK_MASK_XXXXXX */ | ||||
|     ) { | ||||
| 	secHw_REGS_t *regp = (secHw_REGS_t *) MM_IO_BASE_TZPC; | ||||
| 	secHw_REGS_t __iomem *regp = MM_IO_BASE_TZPC; | ||||
| 
 | ||||
| 	if (mask & 0x0000FFFF) { | ||||
| 		regp->reg[secHw_IDX_LS].setSecure = mask & 0x0000FFFF; | ||||
|  | @ -53,13 +53,13 @@ static inline void secHw_setSecure(uint32_t mask	/*  mask of type secHw_BLK_MASK | |||
| /****************************************************************************/ | ||||
| static inline void secHw_setUnsecure(uint32_t mask	/*  mask of type secHw_BLK_MASK_XXXXXX */ | ||||
|     ) { | ||||
| 	secHw_REGS_t *regp = (secHw_REGS_t *) MM_IO_BASE_TZPC; | ||||
| 	secHw_REGS_t __iomem *regp = MM_IO_BASE_TZPC; | ||||
| 
 | ||||
| 	if (mask & 0x0000FFFF) { | ||||
| 		regp->reg[secHw_IDX_LS].setUnsecure = mask & 0x0000FFFF; | ||||
| 		writel(mask & 0x0000FFFF, ®p->reg[secHw_IDX_LS].setUnsecure); | ||||
| 	} | ||||
| 	if (mask & 0xFFFF0000) { | ||||
| 		regp->reg[secHw_IDX_MS].setUnsecure = mask >> 16; | ||||
| 		writel(mask >> 16, ®p->reg[secHw_IDX_MS].setUnsecure); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -71,7 +71,7 @@ static inline void secHw_setUnsecure(uint32_t mask	/*  mask of type secHw_BLK_MA | |||
| /****************************************************************************/ | ||||
| static inline uint32_t secHw_getStatus(void) | ||||
| { | ||||
| 	secHw_REGS_t *regp = (secHw_REGS_t *) MM_IO_BASE_TZPC; | ||||
| 	secHw_REGS_t __iomem *regp = MM_IO_BASE_TZPC; | ||||
| 
 | ||||
| 	return (regp->reg[1].status << 16) + regp->reg[0].status; | ||||
| } | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ | |||
| #ifndef _TMRHW_H | ||||
| #define _TMRHW_H | ||||
| 
 | ||||
| #include <csp/stdint.h> | ||||
| #include <linux/types.h> | ||||
| 
 | ||||
| typedef uint32_t tmrHw_ID_t;	/* Timer ID */ | ||||
| typedef uint32_t tmrHw_COUNT_t;	/* Timer count */ | ||||
|  | @ -27,7 +27,7 @@ | |||
| 
 | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/semaphore.h> | ||||
| #include <csp/dmacHw.h> | ||||
| #include <mach/csp/dmacHw.h> | ||||
| #include <mach/timer.h> | ||||
| 
 | ||||
| /* ---- Constants and Types ---------------------------------------------- */ | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ | |||
| #define __ASM_ARCH_HARDWARE_H | ||||
| 
 | ||||
| #include <asm/sizes.h> | ||||
| #include <cfg_global.h> | ||||
| #include <mach/cfg_global.h> | ||||
| #include <mach/csp/mm_io.h> | ||||
| 
 | ||||
| /* Hardware addresses of major areas.
 | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ | |||
| #define __ASM_ARCH_REG_NAND_H | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| #include <csp/reg.h> | ||||
| #include <mach/csp/reg.h> | ||||
| #include <mach/reg_umi.h> | ||||
| 
 | ||||
| /* ---- Constants and Types ---------------------------------------------- */ | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ | |||
| #define __ASM_ARCH_REG_UMI_H | ||||
| 
 | ||||
| /* ---- Include Files ---------------------------------------------------- */ | ||||
| #include <csp/reg.h> | ||||
| #include <mach/csp/reg.h> | ||||
| #include <mach/csp/mm_io.h> | ||||
| 
 | ||||
| /* ---- Constants and Types ---------------------------------------------- */ | ||||
|  | @ -233,5 +233,5 @@ | |||
| #define REG_UMI_BCH_ERR_LOC_WORD              0x00000018 | ||||
| /* location within a page (512 byte) */ | ||||
| #define REG_UMI_BCH_ERR_LOC_PAGE              0x00001FE0 | ||||
| #define REG_UMI_BCH_ERR_LOC_ADDR(index)     (__REG32(HW_UMI_BASE + 0x64 + (index / 2)*4) >> ((index % 2) * 16)) | ||||
| #define REG_UMI_BCH_ERR_LOC_ADDR(index)     (readl(HW_UMI_BASE + 0x64 + (index / 2)*4) >> ((index % 2) * 16)) | ||||
| #endif | ||||
|  |  | |||
|  | @ -20,12 +20,12 @@ | |||
| #include <mach/hardware.h> | ||||
| #include <mach/csp/mm_io.h> | ||||
| 
 | ||||
| #define IO_DESC(va, sz) { .virtual = va, \ | ||||
| #define IO_DESC(va, sz) { .virtual = (unsigned long)va, \ | ||||
| 	.pfn = __phys_to_pfn(HW_IO_VIRT_TO_PHYS(va)), \ | ||||
| 	.length = sz, \ | ||||
| 	.type = MT_DEVICE } | ||||
| 
 | ||||
| #define MEM_DESC(va, sz) { .virtual = va, \ | ||||
| #define MEM_DESC(va, sz) { .virtual = (unsigned long)va, \ | ||||
| 	.pfn = __phys_to_pfn(HW_IO_VIRT_TO_PHYS(va)), \ | ||||
| 	.length = sz, \ | ||||
| 	.type = MT_MEMORY } | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ | |||
| 
 | ||||
| #include <linux/types.h> | ||||
| #include <linux/module.h> | ||||
| #include <csp/tmrHw.h> | ||||
| #include <mach/csp/tmrHw.h> | ||||
| 
 | ||||
| #include <mach/timer.h> | ||||
| /* The core.c file initializes timers 1 and 3 as a linux clocksource. */ | ||||
|  |  | |||
|  | @ -49,16 +49,6 @@ static struct map_desc dove_io_desc[] __initdata = { | |||
| 		.pfn		= __phys_to_pfn(DOVE_NB_REGS_PHYS_BASE), | ||||
| 		.length		= DOVE_NB_REGS_SIZE, | ||||
| 		.type		= MT_DEVICE, | ||||
| 	}, { | ||||
| 		.virtual	= DOVE_PCIE0_IO_VIRT_BASE, | ||||
| 		.pfn		= __phys_to_pfn(DOVE_PCIE0_IO_PHYS_BASE), | ||||
| 		.length		= DOVE_PCIE0_IO_SIZE, | ||||
| 		.type		= MT_DEVICE, | ||||
| 	}, { | ||||
| 		.virtual	= DOVE_PCIE1_IO_VIRT_BASE, | ||||
| 		.pfn		= __phys_to_pfn(DOVE_PCIE1_IO_PHYS_BASE), | ||||
| 		.length		= DOVE_PCIE1_IO_SIZE, | ||||
| 		.type		= MT_DEVICE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -50,14 +50,12 @@ | |||
| #define DOVE_NB_REGS_SIZE		SZ_8M | ||||
| 
 | ||||
| #define DOVE_PCIE0_IO_PHYS_BASE		0xf2000000 | ||||
| #define DOVE_PCIE0_IO_VIRT_BASE		0xfee00000 | ||||
| #define DOVE_PCIE0_IO_BUS_BASE		0x00000000 | ||||
| #define DOVE_PCIE0_IO_SIZE		SZ_1M | ||||
| #define DOVE_PCIE0_IO_SIZE		SZ_64K | ||||
| 
 | ||||
| #define DOVE_PCIE1_IO_PHYS_BASE		0xf2100000 | ||||
| #define DOVE_PCIE1_IO_VIRT_BASE		0xfef00000 | ||||
| #define DOVE_PCIE1_IO_BUS_BASE		0x00100000 | ||||
| #define DOVE_PCIE1_IO_SIZE		SZ_1M | ||||
| #define DOVE_PCIE1_IO_BUS_BASE		0x00010000 | ||||
| #define DOVE_PCIE1_IO_SIZE		SZ_64K | ||||
| 
 | ||||
| /*
 | ||||
|  * Dove Core Registers Map | ||||
|  |  | |||
|  | @ -1,19 +0,0 @@ | |||
| /*
 | ||||
|  * arch/arm/mach-dove/include/mach/io.h | ||||
|  * | ||||
|  * This file is licensed under the terms of the GNU General Public | ||||
|  * License version 2.  This program is licensed "as is" without any | ||||
|  * warranty of any kind, whether express or implied. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef __ASM_ARCH_IO_H | ||||
| #define __ASM_ARCH_IO_H | ||||
| 
 | ||||
| #include "dove.h" | ||||
| 
 | ||||
| #define IO_SPACE_LIMIT		0xffffffff | ||||
| 
 | ||||
| #define __io(a)  	((void __iomem *)(((a) - DOVE_PCIE0_IO_BUS_BASE) + \ | ||||
| 						 DOVE_PCIE0_IO_VIRT_BASE)) | ||||
| 
 | ||||
| #endif | ||||
|  | @ -26,9 +26,8 @@ struct pcie_port { | |||
| 	u8			root_bus_nr; | ||||
| 	void __iomem		*base; | ||||
| 	spinlock_t		conf_lock; | ||||
| 	char			io_space_name[16]; | ||||
| 	char			mem_space_name[16]; | ||||
| 	struct resource		res[2]; | ||||
| 	struct resource		res; | ||||
| }; | ||||
| 
 | ||||
| static struct pcie_port pcie_port[2]; | ||||
|  | @ -53,24 +52,10 @@ static int __init dove_pcie_setup(int nr, struct pci_sys_data *sys) | |||
| 
 | ||||
| 	orion_pcie_setup(pp->base); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * IORESOURCE_IO | ||||
| 	 */ | ||||
| 	snprintf(pp->io_space_name, sizeof(pp->io_space_name), | ||||
| 		 "PCIe %d I/O", pp->index); | ||||
| 	pp->io_space_name[sizeof(pp->io_space_name) - 1] = 0; | ||||
| 	pp->res[0].name = pp->io_space_name; | ||||
| 	if (pp->index == 0) { | ||||
| 		pp->res[0].start = DOVE_PCIE0_IO_PHYS_BASE; | ||||
| 		pp->res[0].end = pp->res[0].start + DOVE_PCIE0_IO_SIZE - 1; | ||||
| 	} else { | ||||
| 		pp->res[0].start = DOVE_PCIE1_IO_PHYS_BASE; | ||||
| 		pp->res[0].end = pp->res[0].start + DOVE_PCIE1_IO_SIZE - 1; | ||||
| 	} | ||||
| 	pp->res[0].flags = IORESOURCE_IO; | ||||
| 	if (request_resource(&ioport_resource, &pp->res[0])) | ||||
| 		panic("Request PCIe IO resource failed\n"); | ||||
| 	pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset); | ||||
| 	if (pp->index == 0) | ||||
| 		pci_ioremap_io(sys->busnr * SZ_64K, DOVE_PCIE0_IO_PHYS_BASE); | ||||
| 	else | ||||
| 		pci_ioremap_io(sys->busnr * SZ_64K, DOVE_PCIE1_IO_PHYS_BASE); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * IORESOURCE_MEM | ||||
|  | @ -78,18 +63,18 @@ static int __init dove_pcie_setup(int nr, struct pci_sys_data *sys) | |||
| 	snprintf(pp->mem_space_name, sizeof(pp->mem_space_name), | ||||
| 		 "PCIe %d MEM", pp->index); | ||||
| 	pp->mem_space_name[sizeof(pp->mem_space_name) - 1] = 0; | ||||
| 	pp->res[1].name = pp->mem_space_name; | ||||
| 	pp->res.name = pp->mem_space_name; | ||||
| 	if (pp->index == 0) { | ||||
| 		pp->res[1].start = DOVE_PCIE0_MEM_PHYS_BASE; | ||||
| 		pp->res[1].end = pp->res[1].start + DOVE_PCIE0_MEM_SIZE - 1; | ||||
| 		pp->res.start = DOVE_PCIE0_MEM_PHYS_BASE; | ||||
| 		pp->res.end = pp->res.start + DOVE_PCIE0_MEM_SIZE - 1; | ||||
| 	} else { | ||||
| 		pp->res[1].start = DOVE_PCIE1_MEM_PHYS_BASE; | ||||
| 		pp->res[1].end = pp->res[1].start + DOVE_PCIE1_MEM_SIZE - 1; | ||||
| 		pp->res.start = DOVE_PCIE1_MEM_PHYS_BASE; | ||||
| 		pp->res.end = pp->res.start + DOVE_PCIE1_MEM_SIZE - 1; | ||||
| 	} | ||||
| 	pp->res[1].flags = IORESOURCE_MEM; | ||||
| 	if (request_resource(&iomem_resource, &pp->res[1])) | ||||
| 	pp->res.flags = IORESOURCE_MEM; | ||||
| 	if (request_resource(&iomem_resource, &pp->res)) | ||||
| 		panic("Request PCIe Memory resource failed\n"); | ||||
| 	pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset); | ||||
| 	pci_add_resource_offset(&sys->resources, &pp->res, sys->mem_offset); | ||||
| 
 | ||||
| 	return 1; | ||||
| } | ||||
|  | @ -210,7 +195,7 @@ static void __init add_pcie_port(int index, unsigned long base) | |||
| 		pp->root_bus_nr = -1; | ||||
| 		pp->base = (void __iomem *)base; | ||||
| 		spin_lock_init(&pp->conf_lock); | ||||
| 		memset(pp->res, 0, sizeof(pp->res)); | ||||
| 		memset(&pp->res, 0, sizeof(pp->res)); | ||||
| 	} else { | ||||
| 		printk(KERN_INFO "link down, ignoring\n"); | ||||
| 	} | ||||
|  |  | |||
|  | @ -74,22 +74,22 @@ static struct map_desc ebsa110_io_desc[] __initdata = { | |||
| 	 * sparse external-decode ISAIO space | ||||
| 	 */ | ||||
| 	{	/* IRQ_STAT/IRQ_MCLR */ | ||||
| 		.virtual	= IRQ_STAT, | ||||
| 		.virtual	= (unsigned long)IRQ_STAT, | ||||
| 		.pfn		= __phys_to_pfn(TRICK4_PHYS), | ||||
| 		.length		= TRICK4_SIZE, | ||||
| 		.type		= MT_DEVICE | ||||
| 	}, {	/* IRQ_MASK/IRQ_MSET */ | ||||
| 		.virtual	= IRQ_MASK, | ||||
| 		.virtual	= (unsigned long)IRQ_MASK, | ||||
| 		.pfn		= __phys_to_pfn(TRICK3_PHYS), | ||||
| 		.length		= TRICK3_SIZE, | ||||
| 		.type		= MT_DEVICE | ||||
| 	}, {	/* SOFT_BASE */ | ||||
| 		.virtual	= SOFT_BASE, | ||||
| 		.virtual	= (unsigned long)SOFT_BASE, | ||||
| 		.pfn		= __phys_to_pfn(TRICK1_PHYS), | ||||
| 		.length		= TRICK1_SIZE, | ||||
| 		.type		= MT_DEVICE | ||||
| 	}, {	/* PIT_BASE */ | ||||
| 		.virtual	= PIT_BASE, | ||||
| 		.virtual	= (unsigned long)PIT_BASE, | ||||
| 		.pfn		= __phys_to_pfn(TRICK0_PHYS), | ||||
| 		.length		= TRICK0_SIZE, | ||||
| 		.type		= MT_DEVICE | ||||
|  |  | |||
|  | @ -31,11 +31,11 @@ | |||
| #define TRICK7_PHYS		0xf3c00000 | ||||
| 
 | ||||
| /* Virtual addresses */ | ||||
| #define PIT_BASE		0xfc000000	/* trick 0 */ | ||||
| #define SOFT_BASE		0xfd000000	/* trick 1 */ | ||||
| #define IRQ_MASK		0xfe000000	/* trick 3 - read */ | ||||
| #define IRQ_MSET		0xfe000000	/* trick 3 - write */ | ||||
| #define IRQ_STAT		0xff000000	/* trick 4 - read */ | ||||
| #define IRQ_MCLR		0xff000000	/* trick 4 - write */ | ||||
| #define PIT_BASE		IOMEM(0xfc000000)	/* trick 0 */ | ||||
| #define SOFT_BASE		IOMEM(0xfd000000)	/* trick 1 */ | ||||
| #define IRQ_MASK		IOMEM(0xfe000000)	/* trick 3 - read */ | ||||
| #define IRQ_MSET		IOMEM(0xfe000000)	/* trick 3 - write */ | ||||
| #define IRQ_STAT		IOMEM(0xff000000)	/* trick 4 - read */ | ||||
| #define IRQ_MCLR		IOMEM(0xff000000)	/* trick 4 - write */ | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -166,11 +166,6 @@ static int exynos5_clk_ip_gen_ctrl(struct clk *clk, int enable) | |||
| 	return s5p_gatectrl(EXYNOS5_CLKGATE_IP_GEN, clk, enable); | ||||
| } | ||||
| 
 | ||||
| static int exynos5_clk_ip_gps_ctrl(struct clk *clk, int enable) | ||||
| { | ||||
| 	return s5p_gatectrl(EXYNOS5_CLKGATE_IP_GPS, clk, enable); | ||||
| } | ||||
| 
 | ||||
| static int exynos5_clk_ip_mfc_ctrl(struct clk *clk, int enable) | ||||
| { | ||||
| 	return s5p_gatectrl(EXYNOS5_CLKGATE_IP_MFC, clk, enable); | ||||
|  | @ -671,10 +666,6 @@ static struct clk exynos5_init_clocks_off[] = { | |||
| 		.name		= "usbotg", | ||||
| 		.enable		= exynos5_clk_ip_fsys_ctrl, | ||||
| 		.ctrlbit	= (1 << 7), | ||||
| 	}, { | ||||
| 		.name		= "gps", | ||||
| 		.enable		= exynos5_clk_ip_gps_ctrl, | ||||
| 		.ctrlbit	= ((1 << 3) | (1 << 2) | (1 << 0)), | ||||
| 	}, { | ||||
| 		.name		= "nfcon", | ||||
| 		.enable		= exynos5_clk_ip_fsys_ctrl, | ||||
|  |  | |||
|  | @ -131,7 +131,6 @@ | |||
| #define EXYNOS5_PA_SYSMMU_JPEG		0x11F20000 | ||||
| #define EXYNOS5_PA_SYSMMU_IOP		0x12360000 | ||||
| #define EXYNOS5_PA_SYSMMU_RTIC		0x12370000 | ||||
| #define EXYNOS5_PA_SYSMMU_GPS		0x12630000 | ||||
| #define EXYNOS5_PA_SYSMMU_ISP		0x13260000 | ||||
| #define EXYNOS5_PA_SYSMMU_DRC		0x12370000 | ||||
| #define EXYNOS5_PA_SYSMMU_SCALERC	0x13280000 | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ | |||
| #include <linux/init.h> | ||||
| #include <linux/io.h> | ||||
| #include <linux/spinlock.h> | ||||
|   | ||||
| 
 | ||||
| #include <asm/pgtable.h> | ||||
| #include <asm/page.h> | ||||
| #include <asm/irq.h> | ||||
|  | @ -26,6 +26,7 @@ | |||
| 
 | ||||
| #include <asm/mach/irq.h> | ||||
| #include <asm/mach/map.h> | ||||
| #include <asm/mach/pci.h> | ||||
| 
 | ||||
| #include "common.h" | ||||
| 
 | ||||
|  | @ -175,11 +176,6 @@ static struct map_desc ebsa285_host_io_desc[] __initdata = { | |||
| 		.pfn		= __phys_to_pfn(DC21285_PCI_IACK), | ||||
| 		.length		= PCIIACK_SIZE, | ||||
| 		.type		= MT_DEVICE, | ||||
| 	}, { | ||||
| 		.virtual	= PCIO_BASE, | ||||
| 		.pfn		= __phys_to_pfn(DC21285_PCI_IO), | ||||
| 		.length		= PCIO_SIZE, | ||||
| 		.type		= MT_DEVICE, | ||||
| 	}, | ||||
| #endif | ||||
| }; | ||||
|  | @ -196,8 +192,10 @@ void __init footbridge_map_io(void) | |||
| 	 * Now, work out what we've got to map in addition on this | ||||
| 	 * platform. | ||||
| 	 */ | ||||
| 	if (footbridge_cfn_mode()) | ||||
| 	if (footbridge_cfn_mode()) { | ||||
| 		iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc)); | ||||
| 		pci_map_io_early(__phys_to_pfn(DC21285_PCI_IO)); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void footbridge_restart(char mode, const char *cmd) | ||||
|  |  | |||
|  | @ -276,8 +276,8 @@ int __init dc21285_setup(int nr, struct pci_sys_data *sys) | |||
| 
 | ||||
| 	sys->mem_offset  = DC21285_PCI_MEM; | ||||
| 
 | ||||
| 	pci_add_resource_offset(&sys->resources, | ||||
| 				&ioport_resource, sys->io_offset); | ||||
| 	pci_ioremap_io(0, DC21285_PCI_IO); | ||||
| 
 | ||||
| 	pci_add_resource_offset(&sys->resources, &res[0], sys->mem_offset); | ||||
| 	pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset); | ||||
| 
 | ||||
|  | @ -298,7 +298,7 @@ void __init dc21285_preinit(void) | |||
| 	mem_size = (unsigned int)high_memory - PAGE_OFFSET; | ||||
| 	for (mem_mask = 0x00100000; mem_mask < 0x10000000; mem_mask <<= 1) | ||||
| 		if (mem_mask >= mem_size) | ||||
| 			break;		 | ||||
| 			break; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * These registers need to be set up whether we're the | ||||
|  | @ -350,14 +350,6 @@ void __init dc21285_preinit(void) | |||
| 			    "PCI data parity", NULL); | ||||
| 
 | ||||
| 	if (cfn_mode) { | ||||
| 		static struct resource csrio; | ||||
| 
 | ||||
| 		csrio.flags  = IORESOURCE_IO; | ||||
| 		csrio.name   = "Footbridge"; | ||||
| 
 | ||||
| 		allocate_resource(&ioport_resource, &csrio, 128, | ||||
| 				  0xff00, 0xffff, 128, NULL, NULL); | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * Map our SDRAM at a known address in PCI space, just in case | ||||
| 		 * the firmware had other ideas.  Using a nonzero base is | ||||
|  | @ -365,7 +357,7 @@ void __init dc21285_preinit(void) | |||
| 		 * in the range 0x000a0000 to 0x000c0000. (eg, S3 cards). | ||||
| 		 */ | ||||
| 		*CSR_PCICSRBASE       = 0xf4000000; | ||||
| 		*CSR_PCICSRIOBASE     = csrio.start; | ||||
| 		*CSR_PCICSRIOBASE     = 0; | ||||
| 		*CSR_PCISDRAMBASE     = __virt_to_bus(PAGE_OFFSET); | ||||
| 		*CSR_PCIROMBASE       = 0; | ||||
| 		*CSR_PCICMD = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | | ||||
|  |  | |||
|  | @ -17,7 +17,8 @@ | |||
| 	/* For NetWinder debugging */ | ||||
| 		.macro	addruart, rp, rv, tmp | ||||
| 		mov	\rp, #0x000003f8 | ||||
| 		orr	\rv, \rp, #0xff000000	@ virtual
 | ||||
| 		orr	\rv, \rp, #0xfe000000	@ virtual
 | ||||
| 		orr	\rv, \rv, #0x00e00000	@ virtual
 | ||||
| 		orr	\rp, \rp, #0x7c000000	@ physical
 | ||||
| 		.endm | ||||
| 
 | ||||
|  |  | |||
|  | @ -14,18 +14,10 @@ | |||
| #ifndef __ASM_ARM_ARCH_IO_H | ||||
| #define __ASM_ARM_ARCH_IO_H | ||||
| 
 | ||||
| #ifdef CONFIG_MMU | ||||
| #define MMU_IO(a, b)	(a) | ||||
| #else | ||||
| #define MMU_IO(a, b)	(b) | ||||
| #endif | ||||
| 
 | ||||
| #define PCIO_SIZE       0x00100000 | ||||
| #define PCIO_BASE       MMU_IO(0xff000000, 0x7c000000) | ||||
| 
 | ||||
| /*
 | ||||
|  * Translation of various region addresses to virtual addresses | ||||
|  * Translation of various i/o addresses to host addresses for !CONFIG_MMU | ||||
|  */ | ||||
| #define PCIO_BASE       0x7c000000 | ||||
| #define __io(a)			((void __iomem *)(PCIO_BASE + (a))) | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ imx5-pm-$(CONFIG_PM) += pm-imx5.o | |||
| obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clk-imx51-imx53.o ehci-imx5.o $(imx5-pm-y) cpu_op-mx51.o | ||||
| 
 | ||||
| obj-$(CONFIG_COMMON_CLK) += clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o \
 | ||||
| 			    clk-pfd.o clk-busy.o | ||||
| 			    clk-pfd.o clk-busy.o clk.o | ||||
| 
 | ||||
| # Support for CMOS sensor interface
 | ||||
| obj-$(CONFIG_MX1_VIDEO) += mx1-camera-fiq.o mx1-camera-fiq-ksym.o | ||||
|  |  | |||
|  | @ -23,7 +23,6 @@ | |||
| #include <linux/clk-provider.h> | ||||
| #include <linux/io.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/clkdev.h> | ||||
| #include <linux/err.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
|  |  | |||
|  | @ -39,10 +39,10 @@ static const char *ssi_ext2_com_sels[] = { "ssi_ext2_podf", "ssi2_root_gate", }; | |||
| static const char *emi_slow_sel[] = { "main_bus", "ahb", }; | ||||
| static const char *usb_phy_sel_str[] = { "osc", "usb_phy_podf", }; | ||||
| static const char *mx51_ipu_di0_sel[] = { "di_pred", "osc", "ckih1", "tve_di", }; | ||||
| static const char *mx53_ipu_di0_sel[] = { "di_pred", "osc", "ckih1", "di_pll4_podf", "dummy", "ldb_di0", }; | ||||
| static const char *mx53_ipu_di0_sel[] = { "di_pred", "osc", "ckih1", "di_pll4_podf", "dummy", "ldb_di0_gate", }; | ||||
| static const char *mx53_ldb_di0_sel[] = { "pll3_sw", "pll4_sw", }; | ||||
| static const char *mx51_ipu_di1_sel[] = { "di_pred", "osc", "ckih1", "tve_di", "ipp_di1", }; | ||||
| static const char *mx53_ipu_di1_sel[] = { "di_pred", "osc", "ckih1", "tve_di", "ipp_di1", "ldb_di1", }; | ||||
| static const char *mx53_ipu_di1_sel[] = { "di_pred", "osc", "ckih1", "tve_di", "ipp_di1", "ldb_di1_gate", }; | ||||
| static const char *mx53_ldb_di1_sel[] = { "pll3_sw", "pll4_sw", }; | ||||
| static const char *mx51_tve_ext_sel[] = { "osc", "ckih1", }; | ||||
| static const char *mx53_tve_ext_sel[] = { "pll4_sw", "ckih1", }; | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ | |||
| #include <linux/err.h> | ||||
| #include <mach/common.h> | ||||
| #include <mach/hardware.h> | ||||
| #include <mach/clock.h> | ||||
| 
 | ||||
| #include "clk.h" | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -29,8 +29,53 @@ static unsigned long clk_pllv1_recalc_rate(struct clk_hw *hw, | |||
| 		unsigned long parent_rate) | ||||
| { | ||||
| 	struct clk_pllv1 *pll = to_clk_pllv1(hw); | ||||
| 	long long ll; | ||||
| 	int mfn_abs; | ||||
| 	unsigned int mfi, mfn, mfd, pd; | ||||
| 	u32 reg; | ||||
| 	unsigned long rate; | ||||
| 
 | ||||
| 	return mxc_decode_pll(readl(pll->base), parent_rate); | ||||
| 	reg = readl(pll->base); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Get the resulting clock rate from a PLL register value and the input | ||||
| 	 * frequency. PLLs with this register layout can be found on i.MX1, | ||||
| 	 * i.MX21, i.MX27 and i,MX31 | ||||
| 	 * | ||||
| 	 *                  mfi + mfn / (mfd + 1) | ||||
| 	 *  f = 2 * f_ref * -------------------- | ||||
| 	 *                        pd + 1 | ||||
| 	 */ | ||||
| 
 | ||||
| 	mfi = (reg >> 10) & 0xf; | ||||
| 	mfn = reg & 0x3ff; | ||||
| 	mfd = (reg >> 16) & 0x3ff; | ||||
| 	pd =  (reg >> 26) & 0xf; | ||||
| 
 | ||||
| 	mfi = mfi <= 5 ? 5 : mfi; | ||||
| 
 | ||||
| 	mfn_abs = mfn; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * On all i.MXs except i.MX1 and i.MX21 mfn is a 10bit | ||||
| 	 * 2's complements number | ||||
| 	 */ | ||||
| 	if (!cpu_is_mx1() && !cpu_is_mx21() && mfn >= 0x200) | ||||
| 		mfn_abs = 0x400 - mfn; | ||||
| 
 | ||||
| 	rate = parent_rate * 2; | ||||
| 	rate /= pd + 1; | ||||
| 
 | ||||
| 	ll = (unsigned long long)rate * mfn_abs; | ||||
| 
 | ||||
| 	do_div(ll, mfd + 1); | ||||
| 
 | ||||
| 	if (!cpu_is_mx1() && !cpu_is_mx21() && mfn >= 0x200) | ||||
| 		ll = -ll; | ||||
| 
 | ||||
| 	ll = (rate * mfi) + ll; | ||||
| 
 | ||||
| 	return ll; | ||||
| } | ||||
| 
 | ||||
| struct clk_ops clk_pllv1_ops = { | ||||
|  |  | |||
							
								
								
									
										3
									
								
								arch/arm/mach-imx/clk.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								arch/arm/mach-imx/clk.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| #include <linux/spinlock.h> | ||||
| 
 | ||||
| DEFINE_SPINLOCK(imx_ccm_lock); | ||||
|  | @ -3,7 +3,8 @@ | |||
| 
 | ||||
| #include <linux/spinlock.h> | ||||
| #include <linux/clk-provider.h> | ||||
| #include <mach/clock.h> | ||||
| 
 | ||||
| extern spinlock_t imx_ccm_lock; | ||||
| 
 | ||||
| struct clk *imx_clk_pllv1(const char *name, const char *parent, | ||||
| 		void __iomem *base); | ||||
|  |  | |||
|  | @ -36,7 +36,6 @@ | |||
| #include <asm/mach/map.h> | ||||
| #include <asm/mach/time.h> | ||||
| 
 | ||||
| #include <mach/clock.h> | ||||
| #include <mach/common.h> | ||||
| #include <mach/hardware.h> | ||||
| #include <mach/iomux-mx3.h> | ||||
|  | @ -259,13 +258,13 @@ static void __init kzm_board_init(void) | |||
|  */ | ||||
| static struct map_desc kzm_io_desc[] __initdata = { | ||||
| 	{ | ||||
| 		.virtual	= MX31_CS4_BASE_ADDR_VIRT, | ||||
| 		.virtual	= (unsigned long)MX31_CS4_BASE_ADDR_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(MX31_CS4_BASE_ADDR), | ||||
| 		.length		= MX31_CS4_SIZE, | ||||
| 		.type		= MT_DEVICE | ||||
| 	}, | ||||
| 	{ | ||||
| 		.virtual	= MX31_CS5_BASE_ADDR_VIRT, | ||||
| 		.virtual	= (unsigned long)MX31_CS5_BASE_ADDR_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(MX31_CS5_BASE_ADDR), | ||||
| 		.length		= MX31_CS5_SIZE, | ||||
| 		.type		= MT_DEVICE | ||||
|  |  | |||
|  | @ -540,7 +540,7 @@ static void __init mxc_init_audio(void) | |||
|  */ | ||||
| static struct map_desc mx31ads_io_desc[] __initdata = { | ||||
| 	{ | ||||
| 		.virtual	= MX31_CS4_BASE_ADDR_VIRT, | ||||
| 		.virtual	= (unsigned long)MX31_CS4_BASE_ADDR_VIRT, | ||||
| 		.pfn		= __phys_to_pfn(MX31_CS4_BASE_ADDR), | ||||
| 		.length		= CS4_CS8900_MMIO_START, | ||||
| 		.type		= MT_DEVICE | ||||
|  |  | |||
|  | @ -207,7 +207,7 @@ static struct platform_device physmap_flash_device = { | |||
|  */ | ||||
| static struct map_desc mx31lite_io_desc[] __initdata = { | ||||
| 	{ | ||||
| 		.virtual = MX31_CS4_BASE_ADDR_VIRT, | ||||
| 		.virtual = (unsigned long)MX31_CS4_BASE_ADDR_VIRT, | ||||
| 		.pfn = __phys_to_pfn(MX31_CS4_BASE_ADDR), | ||||
| 		.length = MX31_CS4_SIZE, | ||||
| 		.type = MT_DEVICE | ||||
|  |  | |||
|  | @ -95,8 +95,8 @@ arch_initcall(integrator_init); | |||
|  *  UART0  7    6 | ||||
|  *  UART1  5    4 | ||||
|  */ | ||||
| #define SC_CTRLC	IO_ADDRESS(INTEGRATOR_SC_CTRLC) | ||||
| #define SC_CTRLS	IO_ADDRESS(INTEGRATOR_SC_CTRLS) | ||||
| #define SC_CTRLC	__io_address(INTEGRATOR_SC_CTRLC) | ||||
| #define SC_CTRLS	__io_address(INTEGRATOR_SC_CTRLS) | ||||
| 
 | ||||
| static void integrator_uart_set_mctrl(struct amba_device *dev, void __iomem *base, unsigned int mctrl) | ||||
| { | ||||
|  |  | |||
|  | @ -25,10 +25,10 @@ | |||
| 
 | ||||
| static struct cpufreq_driver integrator_driver; | ||||
| 
 | ||||
| #define CM_ID  	IO_ADDRESS(INTEGRATOR_HDR_ID) | ||||
| #define CM_OSC	IO_ADDRESS(INTEGRATOR_HDR_OSC) | ||||
| #define CM_STAT IO_ADDRESS(INTEGRATOR_HDR_STAT) | ||||
| #define CM_LOCK IO_ADDRESS(INTEGRATOR_HDR_LOCK) | ||||
| #define CM_ID  	__io_address(INTEGRATOR_HDR_ID) | ||||
| #define CM_OSC	__io_address(INTEGRATOR_HDR_OSC) | ||||
| #define CM_STAT __io_address(INTEGRATOR_HDR_STAT) | ||||
| #define CM_LOCK __io_address(INTEGRATOR_HDR_LOCK) | ||||
| 
 | ||||
| static const struct icst_params lclk_params = { | ||||
| 	.ref		= 24000000, | ||||
|  |  | |||
|  | @ -1,33 +0,0 @@ | |||
| /*
 | ||||
|  *  arch/arm/mach-integrator/include/mach/io.h | ||||
|  * | ||||
|  *  Copyright (C) 1999 ARM Limited | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
|  */ | ||||
| #ifndef __ASM_ARM_ARCH_IO_H | ||||
| #define __ASM_ARM_ARCH_IO_H | ||||
| 
 | ||||
| /*
 | ||||
|  * WARNING: this has to mirror definitions in platform.h | ||||
|  */ | ||||
| #define PCI_MEMORY_VADDR        0xe8000000 | ||||
| #define PCI_CONFIG_VADDR        0xec000000 | ||||
| #define PCI_V3_VADDR            0xed000000 | ||||
| #define PCI_IO_VADDR            0xee000000 | ||||
| 
 | ||||
| #define __io(a)			((void __iomem *)(PCI_IO_VADDR + (a))) | ||||
| 
 | ||||
| #endif | ||||
|  | @ -324,6 +324,10 @@ | |||
|  */ | ||||
| #define PHYS_PCI_V3_BASE                0x62000000 | ||||
| 
 | ||||
| #define PCI_MEMORY_VADDR		0xe8000000 | ||||
| #define PCI_CONFIG_VADDR		0xec000000 | ||||
| #define PCI_V3_VADDR			0xed000000 | ||||
| 
 | ||||
| /* ------------------------------------------------------------------------
 | ||||
|  *  Integrator Interrupt Controllers | ||||
|  * ------------------------------------------------------------------------ | ||||
|  |  | |||
|  | @ -50,6 +50,7 @@ | |||
| #include <asm/mach/arch.h> | ||||
| #include <asm/mach/irq.h> | ||||
| #include <asm/mach/map.h> | ||||
| #include <asm/mach/pci.h> | ||||
| #include <asm/mach/time.h> | ||||
| 
 | ||||
| #include <plat/fpga-irq.h> | ||||
|  | @ -73,7 +74,7 @@ | |||
|  * e8000000	40000000	PCI memory		PHYS_PCI_MEM_BASE	(max 512M) | ||||
|  * ec000000	61000000	PCI config space	PHYS_PCI_CONFIG_BASE	(max 16M) | ||||
|  * ed000000	62000000	PCI V3 regs		PHYS_PCI_V3_BASE	(max 64k) | ||||
|  * ee000000	60000000	PCI IO			PHYS_PCI_IO_BASE	(max 16M) | ||||
|  * fee00000	60000000	PCI IO			PHYS_PCI_IO_BASE	(max 16M) | ||||
|  * ef000000			Cache flush | ||||
|  * f1000000	10000000	Core module registers | ||||
|  * f1100000	11000000	System controller registers | ||||
|  | @ -133,25 +134,20 @@ static struct map_desc ap_io_desc[] __initdata = { | |||
| 		.length		= SZ_4K, | ||||
| 		.type		= MT_DEVICE | ||||
| 	}, { | ||||
| 		.virtual	= PCI_MEMORY_VADDR, | ||||
| 		.virtual	= (unsigned long)PCI_MEMORY_VADDR, | ||||
| 		.pfn		= __phys_to_pfn(PHYS_PCI_MEM_BASE), | ||||
| 		.length		= SZ_16M, | ||||
| 		.type		= MT_DEVICE | ||||
| 	}, { | ||||
| 		.virtual	= PCI_CONFIG_VADDR, | ||||
| 		.virtual	= (unsigned long)PCI_CONFIG_VADDR, | ||||
| 		.pfn		= __phys_to_pfn(PHYS_PCI_CONFIG_BASE), | ||||
| 		.length		= SZ_16M, | ||||
| 		.type		= MT_DEVICE | ||||
| 	}, { | ||||
| 		.virtual	= PCI_V3_VADDR, | ||||
| 		.virtual	= (unsigned long)PCI_V3_VADDR, | ||||
| 		.pfn		= __phys_to_pfn(PHYS_PCI_V3_BASE), | ||||
| 		.length		= SZ_64K, | ||||
| 		.type		= MT_DEVICE | ||||
| 	}, { | ||||
| 		.virtual	= PCI_IO_VADDR, | ||||
| 		.pfn		= __phys_to_pfn(PHYS_PCI_IO_BASE), | ||||
| 		.length		= SZ_64K, | ||||
| 		.type		= MT_DEVICE | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
|  | @ -159,6 +155,7 @@ static void __init ap_map_io(void) | |||
| { | ||||
| 	iotable_init(ap_io_desc, ARRAY_SIZE(ap_io_desc)); | ||||
| 	vga_base = PCI_MEMORY_VADDR; | ||||
| 	pci_map_io_early(__phys_to_pfn(PHYS_PCI_IO_BASE)); | ||||
| } | ||||
| 
 | ||||
| #define INTEGRATOR_SC_VALID_INT	0x003fffff | ||||
|  | @ -317,9 +314,9 @@ static void __init ap_init(void) | |||
| /*
 | ||||
|  * Where is the timer (VA)? | ||||
|  */ | ||||
| #define TIMER0_VA_BASE IO_ADDRESS(INTEGRATOR_TIMER0_BASE) | ||||
| #define TIMER1_VA_BASE IO_ADDRESS(INTEGRATOR_TIMER1_BASE) | ||||
| #define TIMER2_VA_BASE IO_ADDRESS(INTEGRATOR_TIMER2_BASE) | ||||
| #define TIMER0_VA_BASE __io_address(INTEGRATOR_TIMER0_BASE) | ||||
| #define TIMER1_VA_BASE __io_address(INTEGRATOR_TIMER1_BASE) | ||||
| #define TIMER2_VA_BASE __io_address(INTEGRATOR_TIMER2_BASE) | ||||
| 
 | ||||
| static unsigned long timer_reload; | ||||
| 
 | ||||
|  |  | |||
|  | @ -59,7 +59,7 @@ | |||
| 
 | ||||
| #define INTCP_ETH_SIZE			0x10 | ||||
| 
 | ||||
| #define INTCP_VA_CTRL_BASE		IO_ADDRESS(INTEGRATOR_CP_CTL_BASE) | ||||
| #define INTCP_VA_CTRL_BASE		__io_address(INTEGRATOR_CP_CTL_BASE) | ||||
| #define INTCP_FLASHPROG			0x04 | ||||
| #define CINTEGRATOR_FLASHPROG_FLVPPEN	(1 << 0) | ||||
| #define CINTEGRATOR_FLASHPROG_FLWREN	(1 << 1) | ||||
|  | @ -265,8 +265,8 @@ static struct platform_device *intcp_devs[] __initdata = { | |||
|  */ | ||||
| static unsigned int mmc_status(struct device *dev) | ||||
| { | ||||
| 	unsigned int status = readl(IO_ADDRESS(0xca000000 + 4)); | ||||
| 	writel(8, IO_ADDRESS(INTEGRATOR_CP_CTL_BASE + 8)); | ||||
| 	unsigned int status = readl(__io_address(0xca000000 + 4)); | ||||
| 	writel(8, __io_address(INTEGRATOR_CP_CTL_BASE + 8)); | ||||
| 
 | ||||
| 	return status & 8; | ||||
| } | ||||
|  |  | |||
|  | @ -41,61 +41,61 @@ | |||
| /*
 | ||||
|  * The V3 PCI interface chip in Integrator provides several windows from | ||||
|  * local bus memory into the PCI memory areas.   Unfortunately, there | ||||
|  * are not really enough windows for our usage, therefore we reuse  | ||||
|  * are not really enough windows for our usage, therefore we reuse | ||||
|  * one of the windows for access to PCI configuration space.  The | ||||
|  * memory map is as follows: | ||||
|  *  | ||||
|  * | ||||
|  * Local Bus Memory         Usage | ||||
|  *  | ||||
|  * | ||||
|  * 40000000 - 4FFFFFFF      PCI memory.  256M non-prefetchable | ||||
|  * 50000000 - 5FFFFFFF      PCI memory.  256M prefetchable | ||||
|  * 60000000 - 60FFFFFF      PCI IO.  16M | ||||
|  * 61000000 - 61FFFFFF      PCI Configuration. 16M | ||||
|  *  | ||||
|  * | ||||
|  * There are three V3 windows, each described by a pair of V3 registers. | ||||
|  * These are LB_BASE0/LB_MAP0, LB_BASE1/LB_MAP1 and LB_BASE2/LB_MAP2. | ||||
|  * Base0 and Base1 can be used for any type of PCI memory access.   Base2 | ||||
|  * can be used either for PCI I/O or for I20 accesses.  By default, uHAL | ||||
|  * uses this only for PCI IO space. | ||||
|  *  | ||||
|  * | ||||
|  * Normally these spaces are mapped using the following base registers: | ||||
|  *  | ||||
|  * | ||||
|  * Usage Local Bus Memory         Base/Map registers used | ||||
|  *  | ||||
|  * | ||||
|  * Mem   40000000 - 4FFFFFFF      LB_BASE0/LB_MAP0 | ||||
|  * Mem   50000000 - 5FFFFFFF      LB_BASE1/LB_MAP1 | ||||
|  * IO    60000000 - 60FFFFFF      LB_BASE2/LB_MAP2 | ||||
|  * Cfg   61000000 - 61FFFFFF | ||||
|  *  | ||||
|  * | ||||
|  * This means that I20 and PCI configuration space accesses will fail. | ||||
|  * When PCI configuration accesses are needed (via the uHAL PCI  | ||||
|  * When PCI configuration accesses are needed (via the uHAL PCI | ||||
|  * configuration space primitives) we must remap the spaces as follows: | ||||
|  *  | ||||
|  * | ||||
|  * Usage Local Bus Memory         Base/Map registers used | ||||
|  *  | ||||
|  * | ||||
|  * Mem   40000000 - 4FFFFFFF      LB_BASE0/LB_MAP0 | ||||
|  * Mem   50000000 - 5FFFFFFF      LB_BASE0/LB_MAP0 | ||||
|  * IO    60000000 - 60FFFFFF      LB_BASE2/LB_MAP2 | ||||
|  * Cfg   61000000 - 61FFFFFF      LB_BASE1/LB_MAP1 | ||||
|  *  | ||||
|  * | ||||
|  * To make this work, the code depends on overlapping windows working. | ||||
|  * The V3 chip translates an address by checking its range within  | ||||
|  * The V3 chip translates an address by checking its range within | ||||
|  * each of the BASE/MAP pairs in turn (in ascending register number | ||||
|  * order).  It will use the first matching pair.   So, for example, | ||||
|  * if the same address is mapped by both LB_BASE0/LB_MAP0 and | ||||
|  * LB_BASE1/LB_MAP1, the V3 will use the translation from  | ||||
|  * LB_BASE1/LB_MAP1, the V3 will use the translation from | ||||
|  * LB_BASE0/LB_MAP0. | ||||
|  *  | ||||
|  * | ||||
|  * To allow PCI Configuration space access, the code enlarges the | ||||
|  * window mapped by LB_BASE0/LB_MAP0 from 256M to 512M.  This occludes | ||||
|  * the windows currently mapped by LB_BASE1/LB_MAP1 so that it can | ||||
|  * be remapped for use by configuration cycles. | ||||
|  *  | ||||
|  * At the end of the PCI Configuration space accesses,  | ||||
|  * | ||||
|  * At the end of the PCI Configuration space accesses, | ||||
|  * LB_BASE1/LB_MAP1 is reset to map PCI Memory.  Finally the window | ||||
|  * mapped by LB_BASE0/LB_MAP0 is reduced in size from 512M to 256M to | ||||
|  * reveal the now restored LB_BASE1/LB_MAP1 window. | ||||
|  *  | ||||
|  * | ||||
|  * NOTE: We do not set up I2O mapping.  I suspect that this is only | ||||
|  * for an intelligent (target) device.  Using I2O disables most of | ||||
|  * the mappings into PCI memory. | ||||
|  | @ -127,8 +127,8 @@ | |||
|  * | ||||
|  * returns:	configuration address to play on the PCI bus | ||||
|  * | ||||
|  * To generate the appropriate PCI configuration cycles in the PCI  | ||||
|  * configuration address space, you present the V3 with the following pattern  | ||||
|  * To generate the appropriate PCI configuration cycles in the PCI | ||||
|  * configuration address space, you present the V3 with the following pattern | ||||
|  * (which is very nearly a type 1 (except that the lower two bits are 00 and | ||||
|  * not 01).   In order for this mapping to work you need to set up one of | ||||
|  * the local to PCI aperatures to 16Mbytes in length translating to | ||||
|  | @ -138,7 +138,7 @@ | |||
|  * | ||||
|  * Type 0: | ||||
|  * | ||||
|  *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1  | ||||
|  *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1 | ||||
|  *  3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0 | ||||
|  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|  * | | |D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|0| | ||||
|  | @ -150,7 +150,7 @@ | |||
|  * | ||||
|  * Type 1: | ||||
|  * | ||||
|  *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1  | ||||
|  *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1 | ||||
|  *  3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0 | ||||
|  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|  * | | | | | | | | | | |B|B|B|B|B|B|B|B|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|1| | ||||
|  | @ -161,7 +161,7 @@ | |||
|  *	15:11	Device number (5 bits) | ||||
|  *	10:8	function number | ||||
|  *	 7:2	register number | ||||
|  *   | ||||
|  * | ||||
|  */ | ||||
| static DEFINE_RAW_SPINLOCK(v3_lock); | ||||
| 
 | ||||
|  | @ -181,7 +181,7 @@ static DEFINE_RAW_SPINLOCK(v3_lock); | |||
| #undef V3_LB_BASE_PREFETCH | ||||
| #define V3_LB_BASE_PREFETCH 0 | ||||
| 
 | ||||
| static unsigned long v3_open_config_window(struct pci_bus *bus, | ||||
| static void __iomem *v3_open_config_window(struct pci_bus *bus, | ||||
| 					   unsigned int devfn, int offset) | ||||
| { | ||||
| 	unsigned int address, mapaddress, busnr; | ||||
|  | @ -280,7 +280,7 @@ static void v3_close_config_window(void) | |||
| static int v3_read_config(struct pci_bus *bus, unsigned int devfn, int where, | ||||
| 			  int size, u32 *val) | ||||
| { | ||||
| 	unsigned long addr; | ||||
| 	void __iomem *addr; | ||||
| 	unsigned long flags; | ||||
| 	u32 v; | ||||
| 
 | ||||
|  | @ -311,7 +311,7 @@ static int v3_read_config(struct pci_bus *bus, unsigned int devfn, int where, | |||
| static int v3_write_config(struct pci_bus *bus, unsigned int devfn, int where, | ||||
| 			   int size, u32 val) | ||||
| { | ||||
| 	unsigned long addr; | ||||
| 	void __iomem *addr; | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	raw_spin_lock_irqsave(&v3_lock, flags); | ||||
|  | @ -374,12 +374,9 @@ static int __init pci_v3_setup_resources(struct pci_sys_data *sys) | |||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * the IO resource for this bus | ||||
| 	 * the mem resource for this bus | ||||
| 	 * the prefetch mem resource for this bus | ||||
| 	 */ | ||||
| 	pci_add_resource_offset(&sys->resources, | ||||
| 				&ioport_resource, sys->io_offset); | ||||
| 	pci_add_resource_offset(&sys->resources, &non_mem, sys->mem_offset); | ||||
| 	pci_add_resource_offset(&sys->resources, &pre_mem, sys->mem_offset); | ||||
| 
 | ||||
|  | @ -391,9 +388,9 @@ static int __init pci_v3_setup_resources(struct pci_sys_data *sys) | |||
|  * means I can't get additional information on the reason for the pm2fb | ||||
|  * problems.  I suppose I'll just have to mind-meld with the machine. ;) | ||||
|  */ | ||||
| #define SC_PCI     IO_ADDRESS(INTEGRATOR_SC_PCIENABLE) | ||||
| #define SC_LBFADDR IO_ADDRESS(INTEGRATOR_SC_BASE + 0x20) | ||||
| #define SC_LBFCODE IO_ADDRESS(INTEGRATOR_SC_BASE + 0x24) | ||||
| #define SC_PCI     __io_address(INTEGRATOR_SC_PCIENABLE) | ||||
| #define SC_LBFADDR __io_address(INTEGRATOR_SC_BASE + 0x20) | ||||
| #define SC_LBFCODE __io_address(INTEGRATOR_SC_BASE + 0x24) | ||||
| 
 | ||||
| static int | ||||
| v3_pci_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | ||||
|  | @ -498,7 +495,6 @@ void __init pci_v3_preinit(void) | |||
| 	unsigned int temp; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	pcibios_min_io = 0x6000; | ||||
| 	pcibios_min_mem = 0x00100000; | ||||
| 
 | ||||
| 	/*
 | ||||
|  |  | |||
|  | @ -1,28 +0,0 @@ | |||
| /*
 | ||||
|  * iop13xx custom ioremap implementation | ||||
|  * Copyright (c) 2005-2006, Intel Corporation. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms and conditions of the GNU General Public License, | ||||
|  * version 2, as published by the Free Software Foundation. | ||||
|  * | ||||
|  * This program is distributed in the hope it will be useful, but WITHOUT | ||||
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | ||||
|  * more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along with | ||||
|  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | ||||
|  * Place - Suite 330, Boston, MA 02111-1307 USA. | ||||
|  * | ||||
|  */ | ||||
| #ifndef __ASM_ARM_ARCH_IO_H | ||||
| #define __ASM_ARM_ARCH_IO_H | ||||
| 
 | ||||
| #define IO_SPACE_LIMIT 0xffffffff | ||||
| 
 | ||||
| #define __io(a) __iop13xx_io(a) | ||||
| 
 | ||||
| extern void __iomem * __iop13xx_io(unsigned long io_addr); | ||||
| 
 | ||||
| #endif | ||||
|  | @ -69,21 +69,11 @@ extern unsigned long get_iop_tick_rate(void); | |||
|  * 0x8000.0000 + 928M	0x2.8000.0000   (ioremap)	PCIE outbound memory window | ||||
|  * | ||||
|  * IO MAP | ||||
|  * 0x1000 + 64K	0x0.fffb.1000	0xfec6.1000	PCIX outbound i/o window | ||||
|  * 0x1000 + 64K	0x0.fffd.1000	0xfed7.1000	PCIE outbound i/o window | ||||
|  * 0x00000 + 64K	0x0.fffb.0000	0xfee0.0000	PCIX outbound i/o window | ||||
|  * 0x10000 + 64K	0x0.fffd.0000	0xfee1.0000	PCIE outbound i/o window | ||||
|  */ | ||||
| #define IOP13XX_PCIX_IO_WINDOW_SIZE   0x10000UL | ||||
| #define IOP13XX_PCIX_LOWER_IO_PA      0xfffb0000UL | ||||
| #define IOP13XX_PCIX_LOWER_IO_VA      0xfec60000UL | ||||
| #define IOP13XX_PCIX_LOWER_IO_BA      0x0UL /* OIOTVR */ | ||||
| #define IOP13XX_PCIX_IO_BUS_OFFSET    0x1000UL | ||||
| #define IOP13XX_PCIX_UPPER_IO_PA      (IOP13XX_PCIX_LOWER_IO_PA +\ | ||||
| 				       IOP13XX_PCIX_IO_WINDOW_SIZE - 1) | ||||
| #define IOP13XX_PCIX_UPPER_IO_VA      (IOP13XX_PCIX_LOWER_IO_VA +\ | ||||
| 				       IOP13XX_PCIX_IO_WINDOW_SIZE - 1) | ||||
| #define IOP13XX_PCIX_IO_PHYS_TO_VIRT(addr) (u32) ((u32) addr -\ | ||||
| 					   (IOP13XX_PCIX_LOWER_IO_PA\ | ||||
| 					   - IOP13XX_PCIX_LOWER_IO_VA)) | ||||
| 
 | ||||
| #define IOP13XX_PCIX_MEM_PHYS_OFFSET  0x100000000ULL | ||||
| #define IOP13XX_PCIX_MEM_WINDOW_SIZE  0x3a000000UL | ||||
|  | @ -103,20 +93,8 @@ extern unsigned long get_iop_tick_rate(void); | |||
| 					IOP13XX_PCIX_LOWER_MEM_BA) | ||||
| 
 | ||||
| /* PCI-E ranges */ | ||||
| #define IOP13XX_PCIE_IO_WINDOW_SIZE   	 0x10000UL | ||||
| #define IOP13XX_PCIE_LOWER_IO_PA      	 0xfffd0000UL | ||||
| #define IOP13XX_PCIE_LOWER_IO_VA      	 0xfed70000UL | ||||
| #define IOP13XX_PCIE_LOWER_IO_BA      	 0x0UL  /* OIOTVR */ | ||||
| #define IOP13XX_PCIE_IO_BUS_OFFSET	 0x1000UL | ||||
| #define IOP13XX_PCIE_UPPER_IO_PA      	 (IOP13XX_PCIE_LOWER_IO_PA +\ | ||||
| 					 IOP13XX_PCIE_IO_WINDOW_SIZE - 1) | ||||
| #define IOP13XX_PCIE_UPPER_IO_VA      	 (IOP13XX_PCIE_LOWER_IO_VA +\ | ||||
| 					 IOP13XX_PCIE_IO_WINDOW_SIZE - 1) | ||||
| #define IOP13XX_PCIE_UPPER_IO_BA      	 (IOP13XX_PCIE_LOWER_IO_BA +\ | ||||
| 					 IOP13XX_PCIE_IO_WINDOW_SIZE - 1) | ||||
| #define IOP13XX_PCIE_IO_PHYS_TO_VIRT(addr) (u32) ((u32) addr -\ | ||||
| 					   (IOP13XX_PCIE_LOWER_IO_PA\ | ||||
| 					   - IOP13XX_PCIE_LOWER_IO_VA)) | ||||
| #define IOP13XX_PCIE_LOWER_IO_BA	 0x10000UL  /* OIOTVR */ | ||||
| 
 | ||||
| #define IOP13XX_PCIE_MEM_PHYS_OFFSET  	 0x200000000ULL | ||||
| #define IOP13XX_PCIE_MEM_WINDOW_SIZE  	 0x3a000000UL | ||||
|  | @ -148,18 +126,16 @@ extern unsigned long get_iop_tick_rate(void); | |||
|  * IOP13XX chipset registers | ||||
|  */ | ||||
| #define IOP13XX_PMMR_PHYS_MEM_BASE	   0xffd80000UL  /* PMMR phys. address */ | ||||
| #define IOP13XX_PMMR_VIRT_MEM_BASE	   0xfee80000UL  /* PMMR phys. address */ | ||||
| #define IOP13XX_PMMR_VIRT_MEM_BASE	   (void __iomem *)(0xfee80000UL)  /* PMMR phys. address */ | ||||
| #define IOP13XX_PMMR_MEM_WINDOW_SIZE	   0x80000 | ||||
| #define IOP13XX_PMMR_UPPER_MEM_VA	   (IOP13XX_PMMR_VIRT_MEM_BASE +\ | ||||
| 					   IOP13XX_PMMR_MEM_WINDOW_SIZE - 1) | ||||
| #define IOP13XX_PMMR_UPPER_MEM_PA	   (IOP13XX_PMMR_PHYS_MEM_BASE +\ | ||||
| 					   IOP13XX_PMMR_MEM_WINDOW_SIZE - 1) | ||||
| #define IOP13XX_PMMR_VIRT_TO_PHYS(addr)   (u32) ((u32) addr +\ | ||||
| 					   (IOP13XX_PMMR_PHYS_MEM_BASE\ | ||||
| 					   - IOP13XX_PMMR_VIRT_MEM_BASE)) | ||||
| #define IOP13XX_PMMR_PHYS_TO_VIRT(addr)   (u32) ((u32) addr -\ | ||||
| 					   (IOP13XX_PMMR_PHYS_MEM_BASE\ | ||||
| 					   - IOP13XX_PMMR_VIRT_MEM_BASE)) | ||||
| #define IOP13XX_PMMR_VIRT_TO_PHYS(addr)   (((addr) - IOP13XX_PMMR_VIRT_MEM_BASE)\ | ||||
| 					   + IOP13XX_PMMR_PHYS_MEM_BASE) | ||||
| #define IOP13XX_PMMR_PHYS_TO_VIRT(addr)   (((addr) - IOP13XX_PMMR_PHYS_MEM_BASE)\ | ||||
| 					   + IOP13XX_PMMR_VIRT_MEM_BASE) | ||||
| #define IOP13XX_REG_ADDR32(reg)     	   (IOP13XX_PMMR_VIRT_MEM_BASE + (reg)) | ||||
| #define IOP13XX_REG_ADDR16(reg)     	   (IOP13XX_PMMR_VIRT_MEM_BASE + (reg)) | ||||
| #define IOP13XX_REG_ADDR8(reg)      	   (IOP13XX_PMMR_VIRT_MEM_BASE + (reg)) | ||||
|  | @ -169,10 +145,10 @@ extern unsigned long get_iop_tick_rate(void); | |||
| #define IOP13XX_PMMR_SIZE		   0x00080000 | ||||
| 
 | ||||
| /*=================== Defines for Platform Devices =====================*/ | ||||
| #define IOP13XX_UART0_PHYS  (IOP13XX_PMMR_PHYS_MEM_BASE | 0x00002300) | ||||
| #define IOP13XX_UART1_PHYS  (IOP13XX_PMMR_PHYS_MEM_BASE | 0x00002340) | ||||
| #define IOP13XX_UART0_VIRT  (IOP13XX_PMMR_VIRT_MEM_BASE | 0x00002300) | ||||
| #define IOP13XX_UART1_VIRT  (IOP13XX_PMMR_VIRT_MEM_BASE | 0x00002340) | ||||
| #define IOP13XX_UART0_PHYS  (IOP13XX_PMMR_PHYS_MEM_BASE + 0x00002300) | ||||
| #define IOP13XX_UART1_PHYS  (IOP13XX_PMMR_PHYS_MEM_BASE + 0x00002340) | ||||
| #define IOP13XX_UART0_VIRT  (IOP13XX_PMMR_VIRT_MEM_BASE + 0x00002300) | ||||
| #define IOP13XX_UART1_VIRT  (IOP13XX_PMMR_VIRT_MEM_BASE + 0x00002340) | ||||
| 
 | ||||
| #define IOP13XX_I2C0_PHYS   (IOP13XX_PMMR_PHYS_MEM_BASE | 0x00002500) | ||||
| #define IOP13XX_I2C1_PHYS   (IOP13XX_PMMR_PHYS_MEM_BASE | 0x00002520) | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Linus Torvalds
						Linus Torvalds