mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 23:23:03 +00:00
Merge branch 'next/cleanup' into next/multiplatform
* next/cleanup: (358 commits) 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 ARM: OMAP2+: Make ctrl_module_pad_wkup_44xx.h local ARM: OMAP2+: Make ctrl_module_pad_core_44xx.h local ARM: OMAP2+: Make ctrl_module_core_44xx.h local ...
This commit is contained in:
commit
b74aae9a20
@ -17,3 +17,12 @@ Description:
|
||||
device, like 'tty1'.
|
||||
The file supports poll() to detect virtual
|
||||
console switches.
|
||||
|
||||
What: /sys/class/tty/ttyS0/uartclk
|
||||
Date: Sep 2012
|
||||
Contact: Tomas Hlavacek <tmshlvck@gmail.com>
|
||||
Description:
|
||||
Shows the current uartclk value associated with the
|
||||
UART port in serial_core, that is bound to TTY like ttyS0.
|
||||
uartclk = 16 * baud_base
|
||||
|
||||
|
@ -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.
|
||||
|
@ -8,7 +8,8 @@ Required properties:
|
||||
- gpio-controller: mark the device as a GPIO controller
|
||||
- regulators: list of regulators provided by this controller, must have
|
||||
property "regulator-compatible" to match their hardware counterparts:
|
||||
sm[0-2], ldo[0-9] and ldo_rtc
|
||||
sys, sm[0-2], ldo[0-9] and ldo_rtc
|
||||
- sys-supply: The input supply for SYS.
|
||||
- vin-sm0-supply: The input supply for the SM0.
|
||||
- vin-sm1-supply: The input supply for the SM1.
|
||||
- vin-sm2-supply: The input supply for the SM2.
|
||||
@ -20,6 +21,9 @@ Required properties:
|
||||
|
||||
Each regulator is defined using the standard binding for regulators.
|
||||
|
||||
Note: LDO5 and LDO_RTC is supplied by SYS regulator internally and driver
|
||||
take care of making proper parent child relationship.
|
||||
|
||||
Example:
|
||||
|
||||
pmu: tps6586x@34 {
|
||||
@ -30,6 +34,7 @@ Example:
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
|
||||
sys-supply = <&some_reg>;
|
||||
vin-sm0-supply = <&some_reg>;
|
||||
vin-sm1-supply = <&some_reg>;
|
||||
vin-sm2-supply = <&some_reg>;
|
||||
@ -43,8 +48,16 @@ Example:
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
sm0_reg: regulator@0 {
|
||||
sys_reg: regulator@0 {
|
||||
reg = <0>;
|
||||
regulator-compatible = "sys";
|
||||
regulator-name = "vdd_sys";
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
sm0_reg: regulator@1 {
|
||||
reg = <1>;
|
||||
regulator-compatible = "sm0";
|
||||
regulator-min-microvolt = < 725000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
@ -52,8 +65,8 @@ Example:
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
sm1_reg: regulator@1 {
|
||||
reg = <1>;
|
||||
sm1_reg: regulator@2 {
|
||||
reg = <2>;
|
||||
regulator-compatible = "sm1";
|
||||
regulator-min-microvolt = < 725000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
@ -61,8 +74,8 @@ Example:
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
sm2_reg: regulator@2 {
|
||||
reg = <2>;
|
||||
sm2_reg: regulator@3 {
|
||||
reg = <3>;
|
||||
regulator-compatible = "sm2";
|
||||
regulator-min-microvolt = <3000000>;
|
||||
regulator-max-microvolt = <4550000>;
|
||||
@ -70,72 +83,72 @@ Example:
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo0_reg: regulator@3 {
|
||||
reg = <3>;
|
||||
ldo0_reg: regulator@4 {
|
||||
reg = <4>;
|
||||
regulator-compatible = "ldo0";
|
||||
regulator-name = "PCIE CLK";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
ldo1_reg: regulator@4 {
|
||||
reg = <4>;
|
||||
ldo1_reg: regulator@5 {
|
||||
reg = <5>;
|
||||
regulator-compatible = "ldo1";
|
||||
regulator-min-microvolt = < 725000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
};
|
||||
|
||||
ldo2_reg: regulator@5 {
|
||||
reg = <5>;
|
||||
ldo2_reg: regulator@6 {
|
||||
reg = <6>;
|
||||
regulator-compatible = "ldo2";
|
||||
regulator-min-microvolt = < 725000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
};
|
||||
|
||||
ldo3_reg: regulator@6 {
|
||||
reg = <6>;
|
||||
ldo3_reg: regulator@7 {
|
||||
reg = <7>;
|
||||
regulator-compatible = "ldo3";
|
||||
regulator-min-microvolt = <1250000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
ldo4_reg: regulator@7 {
|
||||
reg = <7>;
|
||||
ldo4_reg: regulator@8 {
|
||||
reg = <8>;
|
||||
regulator-compatible = "ldo4";
|
||||
regulator-min-microvolt = <1700000>;
|
||||
regulator-max-microvolt = <2475000>;
|
||||
};
|
||||
|
||||
ldo5_reg: regulator@8 {
|
||||
reg = <8>;
|
||||
ldo5_reg: regulator@9 {
|
||||
reg = <9>;
|
||||
regulator-compatible = "ldo5";
|
||||
regulator-min-microvolt = <1250000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
ldo6_reg: regulator@9 {
|
||||
reg = <9>;
|
||||
ldo6_reg: regulator@10 {
|
||||
reg = <10>;
|
||||
regulator-compatible = "ldo6";
|
||||
regulator-min-microvolt = <1250000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
ldo7_reg: regulator@10 {
|
||||
reg = <10>;
|
||||
ldo7_reg: regulator@11 {
|
||||
reg = <11>;
|
||||
regulator-compatible = "ldo7";
|
||||
regulator-min-microvolt = <1250000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
ldo8_reg: regulator@11 {
|
||||
reg = <11>;
|
||||
ldo8_reg: regulator@12 {
|
||||
reg = <12>;
|
||||
regulator-compatible = "ldo8";
|
||||
regulator-min-microvolt = <1250000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
ldo9_reg: regulator@12 {
|
||||
reg = <12>;
|
||||
ldo9_reg: regulator@13 {
|
||||
reg = <13>;
|
||||
regulator-compatible = "ldo9";
|
||||
regulator-min-microvolt = <1250000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
|
@ -0,0 +1,14 @@
|
||||
* NXP LPC32xx SoC High Speed UART
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "nxp,lpc3220-hsuart"
|
||||
- reg: Should contain registers location and length
|
||||
- interrupts: Should contain interrupt
|
||||
|
||||
Example:
|
||||
|
||||
uart1: serial@40014000 {
|
||||
compatible = "nxp,lpc3220-hsuart";
|
||||
reg = <0x40014000 0x1000>;
|
||||
interrupts = <26 0>;
|
||||
};
|
@ -25,6 +25,8 @@ Optional properties:
|
||||
accesses to the UART (e.g. TI davinci).
|
||||
- used-by-rtas : set to indicate that the port is in use by the OpenFirmware
|
||||
RTAS and should not be registered.
|
||||
- no-loopback-test: set to indicate that the port does not implements loopback
|
||||
test mode
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -2,8 +2,6 @@
|
||||
- this file.
|
||||
README.cycladesZ
|
||||
- info on Cyclades-Z firmware loading.
|
||||
computone.txt
|
||||
- info on Computone Intelliport II/Plus Multiport Serial Driver.
|
||||
digiepca.txt
|
||||
- info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards.
|
||||
hayes-esp.txt
|
||||
|
@ -1,520 +0,0 @@
|
||||
NOTE: This is an unmaintained driver. It is not guaranteed to work due to
|
||||
changes made in the tty layer in 2.6. If you wish to take over maintenance of
|
||||
this driver, contact Michael Warfield <mhw@wittsend.com>.
|
||||
|
||||
Changelog:
|
||||
----------
|
||||
11-01-2001: Original Document
|
||||
|
||||
10-29-2004: Minor misspelling & format fix, update status of driver.
|
||||
James Nelson <james4765@gmail.com>
|
||||
|
||||
Computone Intelliport II/Plus Multiport Serial Driver
|
||||
-----------------------------------------------------
|
||||
|
||||
Release Notes For Linux Kernel 2.2 and higher.
|
||||
These notes are for the drivers which have already been integrated into the
|
||||
kernel and have been tested on Linux kernels 2.0, 2.2, 2.3, and 2.4.
|
||||
|
||||
Version: 1.2.14
|
||||
Date: 11/01/2001
|
||||
Historical Author: Andrew Manison <amanison@america.net>
|
||||
Primary Author: Doug McNash
|
||||
|
||||
This file assumes that you are using the Computone drivers which are
|
||||
integrated into the kernel sources. For updating the drivers or installing
|
||||
drivers into kernels which do not already have Computone drivers, please
|
||||
refer to the instructions in the README.computone file in the driver patch.
|
||||
|
||||
|
||||
1. INTRODUCTION
|
||||
|
||||
This driver supports the entire family of Intelliport II/Plus controllers
|
||||
with the exception of the MicroChannel controllers. It does not support
|
||||
products previous to the Intelliport II.
|
||||
|
||||
This driver was developed on the v2.0.x Linux tree and has been tested up
|
||||
to v2.4.14; it will probably not work with earlier v1.X kernels,.
|
||||
|
||||
|
||||
2. QUICK INSTALLATION
|
||||
|
||||
Hardware - If you have an ISA card, find a free interrupt and io port.
|
||||
List those in use with `cat /proc/interrupts` and
|
||||
`cat /proc/ioports`. Set the card dip switches to a free
|
||||
address. You may need to configure your BIOS to reserve an
|
||||
irq for an ISA card. PCI and EISA parameters are set
|
||||
automagically. Insert card into computer with the power off
|
||||
before or after drivers installation.
|
||||
|
||||
Note the hardware address from the Computone ISA cards installed into
|
||||
the system. These are required for editing ip2.c or editing
|
||||
/etc/modprobe.d/*.conf, or for specification on the modprobe
|
||||
command line.
|
||||
|
||||
Note that the /etc/modules.conf should be used for older (pre-2.6)
|
||||
kernels.
|
||||
|
||||
Software -
|
||||
|
||||
Module installation:
|
||||
|
||||
a) Determine free irq/address to use if any (configure BIOS if need be)
|
||||
b) Run "make config" or "make menuconfig" or "make xconfig"
|
||||
Select (m) module for CONFIG_COMPUTONE under character
|
||||
devices. CONFIG_PCI and CONFIG_MODULES also may need to be set.
|
||||
c) Set address on ISA cards then:
|
||||
edit /usr/src/linux/drivers/char/ip2.c if needed
|
||||
or
|
||||
edit config file in /etc/modprobe.d/ if needed (module).
|
||||
or both to match this setting.
|
||||
d) Run "make modules"
|
||||
e) Run "make modules_install"
|
||||
f) Run "/sbin/depmod -a"
|
||||
g) install driver using `modprobe ip2 <options>` (options listed below)
|
||||
h) run ip2mkdev (either the script below or the binary version)
|
||||
|
||||
|
||||
Kernel installation:
|
||||
|
||||
a) Determine free irq/address to use if any (configure BIOS if need be)
|
||||
b) Run "make config" or "make menuconfig" or "make xconfig"
|
||||
Select (y) kernel for CONFIG_COMPUTONE under character
|
||||
devices. CONFIG_PCI may need to be set if you have PCI bus.
|
||||
c) Set address on ISA cards then:
|
||||
edit /usr/src/linux/drivers/char/ip2.c
|
||||
(Optional - may be specified on kernel command line now)
|
||||
d) Run "make zImage" or whatever target you prefer.
|
||||
e) mv /usr/src/linux/arch/x86/boot/zImage to /boot.
|
||||
f) Add new config for this kernel into /etc/lilo.conf, run "lilo"
|
||||
or copy to a floppy disk and boot from that floppy disk.
|
||||
g) Reboot using this kernel
|
||||
h) run ip2mkdev (either the script below or the binary version)
|
||||
|
||||
Kernel command line options:
|
||||
|
||||
When compiling the driver into the kernel, io and irq may be
|
||||
compiled into the driver by editing ip2.c and setting the values for
|
||||
io and irq in the appropriate array. An alternative is to specify
|
||||
a command line parameter to the kernel at boot up.
|
||||
|
||||
ip2=io0,irq0,io1,irq1,io2,irq2,io3,irq3
|
||||
|
||||
Note that this order is very different from the specifications for the
|
||||
modload parameters which have separate IRQ and IO specifiers.
|
||||
|
||||
The io port also selects PCI (1) and EISA (2) boards.
|
||||
|
||||
io=0 No board
|
||||
io=1 PCI board
|
||||
io=2 EISA board
|
||||
else ISA board io address
|
||||
|
||||
You only need to specify the boards which are present.
|
||||
|
||||
Examples:
|
||||
|
||||
2 PCI boards:
|
||||
|
||||
ip2=1,0,1,0
|
||||
|
||||
1 ISA board at 0x310 irq 5:
|
||||
|
||||
ip2=0x310,5
|
||||
|
||||
This can be added to and "append" option in lilo.conf similar to this:
|
||||
|
||||
append="ip2=1,0,1,0"
|
||||
|
||||
|
||||
3. INSTALLATION
|
||||
|
||||
Previously, the driver sources were packaged with a set of patch files
|
||||
to update the character drivers' makefile and configuration file, and other
|
||||
kernel source files. A build script (ip2build) was included which applies
|
||||
the patches if needed, and build any utilities needed.
|
||||
What you receive may be a single patch file in conventional kernel
|
||||
patch format build script. That form can also be applied by
|
||||
running patch -p1 < ThePatchFile. Otherwise run ip2build.
|
||||
|
||||
The driver can be installed as a module (recommended) or built into the
|
||||
kernel. This is selected as for other drivers through the `make config`
|
||||
command from the root of the Linux source tree. If the driver is built
|
||||
into the kernel you will need to edit the file ip2.c to match the boards
|
||||
you are installing. See that file for instructions. If the driver is
|
||||
installed as a module the configuration can also be specified on the
|
||||
modprobe command line as follows:
|
||||
|
||||
modprobe ip2 irq=irq1,irq2,irq3,irq4 io=addr1,addr2,addr3,addr4
|
||||
|
||||
where irqnum is one of the valid Intelliport II interrupts (3,4,5,7,10,11,
|
||||
12,15) and addr1-4 are the base addresses for up to four controllers. If
|
||||
the irqs are not specified the driver uses the default in ip2.c (which
|
||||
selects polled mode). If no base addresses are specified the defaults in
|
||||
ip2.c are used. If you are autoloading the driver module with kerneld or
|
||||
kmod the base addresses and interrupt number must also be set in ip2.c
|
||||
and recompile or just insert and options line in /etc/modprobe.d/*.conf or both.
|
||||
The options line is equivalent to the command line and takes precedence over
|
||||
what is in ip2.c.
|
||||
|
||||
config sample to put /etc/modprobe.d/*.conf:
|
||||
options ip2 io=1,0x328 irq=1,10
|
||||
alias char-major-71 ip2
|
||||
alias char-major-72 ip2
|
||||
alias char-major-73 ip2
|
||||
|
||||
The equivalent in ip2.c:
|
||||
|
||||
static int io[IP2_MAX_BOARDS]= { 1, 0x328, 0, 0 };
|
||||
static int irq[IP2_MAX_BOARDS] = { 1, 10, -1, -1 };
|
||||
|
||||
The equivalent for the kernel command line (in lilo.conf):
|
||||
|
||||
append="ip2=1,1,0x328,10"
|
||||
|
||||
|
||||
Note: Both io and irq should be updated to reflect YOUR system. An "io"
|
||||
address of 1 or 2 indicates a PCI or EISA card in the board table.
|
||||
The PCI or EISA irq will be assigned automatically.
|
||||
|
||||
Specifying an invalid or in-use irq will default the driver into
|
||||
running in polled mode for that card. If all irq entries are 0 then
|
||||
all cards will operate in polled mode.
|
||||
|
||||
If you select the driver as part of the kernel run :
|
||||
|
||||
make zlilo (or whatever you do to create a bootable kernel)
|
||||
|
||||
If you selected a module run :
|
||||
|
||||
make modules && make modules_install
|
||||
|
||||
The utility ip2mkdev (see 5 and 7 below) creates all the device nodes
|
||||
required by the driver. For a device to be created it must be configured
|
||||
in the driver and the board must be installed. Only devices corresponding
|
||||
to real IntelliPort II ports are created. With multiple boards and expansion
|
||||
boxes this will leave gaps in the sequence of device names. ip2mkdev uses
|
||||
Linux tty naming conventions: ttyF0 - ttyF255 for normal devices, and
|
||||
cuf0 - cuf255 for callout devices.
|
||||
|
||||
|
||||
4. USING THE DRIVERS
|
||||
|
||||
As noted above, the driver implements the ports in accordance with Linux
|
||||
conventions, and the devices should be interchangeable with the standard
|
||||
serial devices. (This is a key point for problem reporting: please make
|
||||
sure that what you are trying do works on the ttySx/cuax ports first; then
|
||||
tell us what went wrong with the ip2 ports!)
|
||||
|
||||
Higher speeds can be obtained using the setserial utility which remaps
|
||||
38,400 bps (extb) to 57,600 bps, 115,200 bps, or a custom speed.
|
||||
Intelliport II installations using the PowerPort expansion module can
|
||||
use the custom speed setting to select the highest speeds: 153,600 bps,
|
||||
230,400 bps, 307,200 bps, 460,800bps and 921,600 bps. The base for
|
||||
custom baud rate configuration is fixed at 921,600 for cards/expansion
|
||||
modules with ST654's and 115200 for those with Cirrus CD1400's. This
|
||||
corresponds to the maximum bit rates those chips are capable.
|
||||
For example if the baud base is 921600 and the baud divisor is 18 then
|
||||
the custom rate is 921600/18 = 51200 bps. See the setserial man page for
|
||||
complete details. Of course if stty accepts the higher rates now you can
|
||||
use that as well as the standard ioctls().
|
||||
|
||||
|
||||
5. ip2mkdev and assorted utilities...
|
||||
|
||||
Several utilities, including the source for a binary ip2mkdev utility are
|
||||
available under .../drivers/char/ip2. These can be build by changing to
|
||||
that directory and typing "make" after the kernel has be built. If you do
|
||||
not wish to compile the binary utilities, the shell script below can be
|
||||
cut out and run as "ip2mkdev" to create the necessary device files. To
|
||||
use the ip2mkdev script, you must have procfs enabled and the proc file
|
||||
system mounted on /proc.
|
||||
|
||||
|
||||
6. NOTES
|
||||
|
||||
This is a release version of the driver, but it is impossible to test it
|
||||
in all configurations of Linux. If there is any anomalous behaviour that
|
||||
does not match the standard serial port's behaviour please let us know.
|
||||
|
||||
|
||||
7. ip2mkdev shell script
|
||||
|
||||
Previously, this script was simply attached here. It is now attached as a
|
||||
shar archive to make it easier to extract the script from the documentation.
|
||||
To create the ip2mkdev shell script change to a convenient directory (/tmp
|
||||
works just fine) and run the following command:
|
||||
|
||||
unshar Documentation/serial/computone.txt
|
||||
(This file)
|
||||
|
||||
You should now have a file ip2mkdev in your current working directory with
|
||||
permissions set to execute. Running that script with then create the
|
||||
necessary devices for the Computone boards, interfaces, and ports which
|
||||
are present on you system at the time it is run.
|
||||
|
||||
|
||||
#!/bin/sh
|
||||
# This is a shell archive (produced by GNU sharutils 4.2.1).
|
||||
# To extract the files from this archive, save it to some FILE, remove
|
||||
# everything before the `!/bin/sh' line above, then type `sh FILE'.
|
||||
#
|
||||
# Made on 2001-10-29 10:32 EST by <mhw@alcove.wittsend.com>.
|
||||
# Source directory was `/home2/src/tmp'.
|
||||
#
|
||||
# Existing files will *not* be overwritten unless `-c' is specified.
|
||||
#
|
||||
# This shar contains:
|
||||
# length mode name
|
||||
# ------ ---------- ------------------------------------------
|
||||
# 4251 -rwxr-xr-x ip2mkdev
|
||||
#
|
||||
save_IFS="${IFS}"
|
||||
IFS="${IFS}:"
|
||||
gettext_dir=FAILED
|
||||
locale_dir=FAILED
|
||||
first_param="$1"
|
||||
for dir in $PATH
|
||||
do
|
||||
if test "$gettext_dir" = FAILED && test -f $dir/gettext \
|
||||
&& ($dir/gettext --version >/dev/null 2>&1)
|
||||
then
|
||||
set `$dir/gettext --version 2>&1`
|
||||
if test "$3" = GNU
|
||||
then
|
||||
gettext_dir=$dir
|
||||
fi
|
||||
fi
|
||||
if test "$locale_dir" = FAILED && test -f $dir/shar \
|
||||
&& ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
|
||||
then
|
||||
locale_dir=`$dir/shar --print-text-domain-dir`
|
||||
fi
|
||||
done
|
||||
IFS="$save_IFS"
|
||||
if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
|
||||
then
|
||||
echo=echo
|
||||
else
|
||||
TEXTDOMAINDIR=$locale_dir
|
||||
export TEXTDOMAINDIR
|
||||
TEXTDOMAIN=sharutils
|
||||
export TEXTDOMAIN
|
||||
echo="$gettext_dir/gettext -s"
|
||||
fi
|
||||
if touch -am -t 200112312359.59 $$.touch >/dev/null 2>&1 && test ! -f 200112312359.59 -a -f $$.touch; then
|
||||
shar_touch='touch -am -t $1$2$3$4$5$6.$7 "$8"'
|
||||
elif touch -am 123123592001.59 $$.touch >/dev/null 2>&1 && test ! -f 123123592001.59 -a ! -f 123123592001.5 -a -f $$.touch; then
|
||||
shar_touch='touch -am $3$4$5$6$1$2.$7 "$8"'
|
||||
elif touch -am 1231235901 $$.touch >/dev/null 2>&1 && test ! -f 1231235901 -a -f $$.touch; then
|
||||
shar_touch='touch -am $3$4$5$6$2 "$8"'
|
||||
else
|
||||
shar_touch=:
|
||||
echo
|
||||
$echo 'WARNING: not restoring timestamps. Consider getting and'
|
||||
$echo "installing GNU \`touch', distributed in GNU File Utilities..."
|
||||
echo
|
||||
fi
|
||||
rm -f 200112312359.59 123123592001.59 123123592001.5 1231235901 $$.touch
|
||||
#
|
||||
if mkdir _sh17581; then
|
||||
$echo 'x -' 'creating lock directory'
|
||||
else
|
||||
$echo 'failed to create lock directory'
|
||||
exit 1
|
||||
fi
|
||||
# ============= ip2mkdev ==============
|
||||
if test -f 'ip2mkdev' && test "$first_param" != -c; then
|
||||
$echo 'x -' SKIPPING 'ip2mkdev' '(file already exists)'
|
||||
else
|
||||
$echo 'x -' extracting 'ip2mkdev' '(text)'
|
||||
sed 's/^X//' << 'SHAR_EOF' > 'ip2mkdev' &&
|
||||
#!/bin/sh -
|
||||
#
|
||||
# ip2mkdev
|
||||
#
|
||||
# Make or remove devices as needed for Computone Intelliport drivers
|
||||
#
|
||||
# First rule! If the dev file exists and you need it, don't mess
|
||||
# with it. That prevents us from screwing up open ttys, ownership
|
||||
# and permissions on a running system!
|
||||
#
|
||||
# This script will NOT remove devices that no longer exist if their
|
||||
# board or interface box has been removed. If you want to get rid
|
||||
# of them, you can manually do an "rm -f /dev/ttyF* /dev/cuaf*"
|
||||
# before running this script. Running this script will then recreate
|
||||
# all the valid devices.
|
||||
#
|
||||
# Michael H. Warfield
|
||||
# /\/\|=mhw=|\/\/
|
||||
# mhw@wittsend.com
|
||||
#
|
||||
# Updated 10/29/2000 for version 1.2.13 naming convention
|
||||
# under devfs. /\/\|=mhw=|\/\/
|
||||
#
|
||||
# Updated 03/09/2000 for devfs support in ip2 drivers. /\/\|=mhw=|\/\/
|
||||
#
|
||||
X
|
||||
if test -d /dev/ip2 ; then
|
||||
# This is devfs mode... We don't do anything except create symlinks
|
||||
# from the real devices to the old names!
|
||||
X cd /dev
|
||||
X echo "Creating symbolic links to devfs devices"
|
||||
X for i in `ls ip2` ; do
|
||||
X if test ! -L ip2$i ; then
|
||||
X # Remove it incase it wasn't a symlink (old device)
|
||||
X rm -f ip2$i
|
||||
X ln -s ip2/$i ip2$i
|
||||
X fi
|
||||
X done
|
||||
X for i in `( cd tts ; ls F* )` ; do
|
||||
X if test ! -L tty$i ; then
|
||||
X # Remove it incase it wasn't a symlink (old device)
|
||||
X rm -f tty$i
|
||||
X ln -s tts/$i tty$i
|
||||
X fi
|
||||
X done
|
||||
X for i in `( cd cua ; ls F* )` ; do
|
||||
X DEVNUMBER=`expr $i : 'F\(.*\)'`
|
||||
X if test ! -L cuf$DEVNUMBER ; then
|
||||
X # Remove it incase it wasn't a symlink (old device)
|
||||
X rm -f cuf$DEVNUMBER
|
||||
X ln -s cua/$i cuf$DEVNUMBER
|
||||
X fi
|
||||
X done
|
||||
X exit 0
|
||||
fi
|
||||
X
|
||||
if test ! -f /proc/tty/drivers
|
||||
then
|
||||
X echo "\
|
||||
Unable to check driver status.
|
||||
Make sure proc file system is mounted."
|
||||
X
|
||||
X exit 255
|
||||
fi
|
||||
X
|
||||
if test ! -f /proc/tty/driver/ip2
|
||||
then
|
||||
X echo "\
|
||||
Unable to locate ip2 proc file.
|
||||
Attempting to load driver"
|
||||
X
|
||||
X if /sbin/insmod ip2
|
||||
X then
|
||||
X if test ! -f /proc/tty/driver/ip2
|
||||
X then
|
||||
X echo "\
|
||||
Unable to locate ip2 proc file after loading driver.
|
||||
Driver initialization failure or driver version error.
|
||||
"
|
||||
X exit 255
|
||||
X fi
|
||||
X else
|
||||
X echo "Unable to load ip2 driver."
|
||||
X exit 255
|
||||
X fi
|
||||
fi
|
||||
X
|
||||
# Ok... So we got the driver loaded and we can locate the procfs files.
|
||||
# Next we need our major numbers.
|
||||
X
|
||||
TTYMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/tt/!d' -e 's/.*tt[^ ]*[ ]*\([0-9]*\)[ ]*.*/\1/' < /proc/tty/drivers`
|
||||
CUAMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/cu/!d' -e 's/.*cu[^ ]*[ ]*\([0-9]*\)[ ]*.*/\1/' < /proc/tty/drivers`
|
||||
BRDMAJOR=`sed -e '/^Driver: /!d' -e 's/.*IMajor=\([0-9]*\)[ ]*.*/\1/' < /proc/tty/driver/ip2`
|
||||
X
|
||||
echo "\
|
||||
TTYMAJOR = $TTYMAJOR
|
||||
CUAMAJOR = $CUAMAJOR
|
||||
BRDMAJOR = $BRDMAJOR
|
||||
"
|
||||
X
|
||||
# Ok... Now we should know our major numbers, if appropriate...
|
||||
# Now we need our boards and start the device loops.
|
||||
X
|
||||
grep '^Board [0-9]:' /proc/tty/driver/ip2 | while read token number type alltherest
|
||||
do
|
||||
X # The test for blank "type" will catch the stats lead-in lines
|
||||
X # if they exist in the file
|
||||
X if test "$type" = "vacant" -o "$type" = "Vacant" -o "$type" = ""
|
||||
X then
|
||||
X continue
|
||||
X fi
|
||||
X
|
||||
X BOARDNO=`expr "$number" : '\([0-9]\):'`
|
||||
X PORTS=`expr "$alltherest" : '.*ports=\([0-9]*\)' | tr ',' ' '`
|
||||
X MINORS=`expr "$alltherest" : '.*minors=\([0-9,]*\)' | tr ',' ' '`
|
||||
X
|
||||
X if test "$BOARDNO" = "" -o "$PORTS" = ""
|
||||
X then
|
||||
# This may be a bug. We should at least get this much information
|
||||
X echo "Unable to process board line"
|
||||
X continue
|
||||
X fi
|
||||
X
|
||||
X if test "$MINORS" = ""
|
||||
X then
|
||||
# Silently skip this one. This board seems to have no boxes
|
||||
X continue
|
||||
X fi
|
||||
X
|
||||
X echo "board $BOARDNO: $type ports = $PORTS; port numbers = $MINORS"
|
||||
X
|
||||
X if test "$BRDMAJOR" != ""
|
||||
X then
|
||||
X BRDMINOR=`expr $BOARDNO \* 4`
|
||||
X STSMINOR=`expr $BRDMINOR + 1`
|
||||
X if test ! -c /dev/ip2ipl$BOARDNO ; then
|
||||
X mknod /dev/ip2ipl$BOARDNO c $BRDMAJOR $BRDMINOR
|
||||
X fi
|
||||
X if test ! -c /dev/ip2stat$BOARDNO ; then
|
||||
X mknod /dev/ip2stat$BOARDNO c $BRDMAJOR $STSMINOR
|
||||
X fi
|
||||
X fi
|
||||
X
|
||||
X if test "$TTYMAJOR" != ""
|
||||
X then
|
||||
X PORTNO=$BOARDBASE
|
||||
X
|
||||
X for PORTNO in $MINORS
|
||||
X do
|
||||
X if test ! -c /dev/ttyF$PORTNO ; then
|
||||
X # We got the hardware but no device - make it
|
||||
X mknod /dev/ttyF$PORTNO c $TTYMAJOR $PORTNO
|
||||
X fi
|
||||
X done
|
||||
X fi
|
||||
X
|
||||
X if test "$CUAMAJOR" != ""
|
||||
X then
|
||||
X PORTNO=$BOARDBASE
|
||||
X
|
||||
X for PORTNO in $MINORS
|
||||
X do
|
||||
X if test ! -c /dev/cuf$PORTNO ; then
|
||||
X # We got the hardware but no device - make it
|
||||
X mknod /dev/cuf$PORTNO c $CUAMAJOR $PORTNO
|
||||
X fi
|
||||
X done
|
||||
X fi
|
||||
done
|
||||
X
|
||||
Xexit 0
|
||||
SHAR_EOF
|
||||
(set 20 01 10 29 10 32 01 'ip2mkdev'; eval "$shar_touch") &&
|
||||
chmod 0755 'ip2mkdev' ||
|
||||
$echo 'restore of' 'ip2mkdev' 'failed'
|
||||
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
|
||||
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
|
||||
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|
||||
|| $echo 'ip2mkdev:' 'MD5 check failed'
|
||||
cb5717134509f38bad9fde6b1f79b4a4 ip2mkdev
|
||||
SHAR_EOF
|
||||
else
|
||||
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'ip2mkdev'`"
|
||||
test 4251 -eq "$shar_count" ||
|
||||
$echo 'ip2mkdev:' 'original size' '4251,' 'current size' "$shar_count!"
|
||||
fi
|
||||
fi
|
||||
rm -fr _sh17581
|
||||
exit 0
|
@ -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
|
||||
|
@ -223,6 +223,7 @@ srmcons_init(void)
|
||||
driver->subtype = SYSTEM_TYPE_SYSCONS;
|
||||
driver->init_termios = tty_std_termios;
|
||||
tty_set_operations(driver, &srmcons_ops);
|
||||
tty_port_link_device(&srmcons_singleton.port, driver, 0);
|
||||
err = tty_register_driver(driver);
|
||||
if (err) {
|
||||
put_tty_driver(driver);
|
||||
|
@ -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
|
||||
@ -312,7 +311,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
|
||||
@ -407,21 +405,19 @@ 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
|
||||
select CLKDEV_LOOKUP
|
||||
select COMMON_CLK
|
||||
select GENERIC_IRQ_CHIP
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
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"
|
||||
@ -456,7 +452,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
|
||||
@ -513,7 +509,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
|
||||
@ -523,7 +518,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
|
||||
@ -536,7 +530,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
|
||||
@ -576,7 +569,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
|
||||
@ -587,7 +579,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:
|
||||
@ -614,7 +605,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:
|
||||
@ -627,7 +617,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:
|
||||
@ -652,8 +641,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.
|
||||
@ -683,7 +673,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
|
||||
@ -709,14 +698,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
|
||||
@ -912,7 +893,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>).
|
||||
@ -931,6 +911,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.
|
||||
|
||||
@ -1118,6 +1099,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"
|
||||
@ -1179,12 +1162,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
|
||||
@ -1757,7 +1734,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;
|
||||
@ -423,6 +424,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;
|
||||
@ -445,11 +478,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)
|
||||
@ -627,3 +659,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);
|
@ -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");
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
@ -147,11 +148,6 @@ static struct map_desc ap_io_desc[] __initdata = {
|
||||
.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
|
||||
|
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
@ -23,25 +23,6 @@
|
||||
|
||||
#include "pci.h"
|
||||
|
||||
void * __iomem __iop13xx_io(unsigned long io_addr)
|
||||
{
|
||||
void __iomem * io_virt;
|
||||
|
||||
switch (io_addr) {
|
||||
case IOP13XX_PCIE_LOWER_IO_PA ... IOP13XX_PCIE_UPPER_IO_PA:
|
||||
io_virt = (void *) IOP13XX_PCIE_IO_PHYS_TO_VIRT(io_addr);
|
||||
break;
|
||||
case IOP13XX_PCIX_LOWER_IO_PA ... IOP13XX_PCIX_UPPER_IO_PA:
|
||||
io_virt = (void *) IOP13XX_PCIX_IO_PHYS_TO_VIRT(io_addr);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
return io_virt;
|
||||
}
|
||||
EXPORT_SYMBOL(__iop13xx_io);
|
||||
|
||||
static void __iomem *__iop13xx_ioremap_caller(unsigned long cookie,
|
||||
size_t size, unsigned int mtype, void *caller)
|
||||
{
|
||||
@ -67,12 +48,6 @@ static void __iomem *__iop13xx_ioremap_caller(unsigned long cookie,
|
||||
(cookie - IOP13XX_PBI_LOWER_MEM_RA),
|
||||
size, mtype, __builtin_return_address(0));
|
||||
break;
|
||||
case IOP13XX_PCIE_LOWER_IO_PA ... IOP13XX_PCIE_UPPER_IO_PA:
|
||||
retval = (void *) IOP13XX_PCIE_IO_PHYS_TO_VIRT(cookie);
|
||||
break;
|
||||
case IOP13XX_PCIX_LOWER_IO_PA ... IOP13XX_PCIX_UPPER_IO_PA:
|
||||
retval = (void *) IOP13XX_PCIX_IO_PHYS_TO_VIRT(cookie);
|
||||
break;
|
||||
case IOP13XX_PMMR_PHYS_MEM_BASE ... IOP13XX_PMMR_UPPER_MEM_PA:
|
||||
retval = (void *) IOP13XX_PMMR_PHYS_TO_VIRT(cookie);
|
||||
break;
|
||||
@ -99,8 +74,6 @@ static void __iop13xx_iounmap(volatile void __iomem *addr)
|
||||
goto skip;
|
||||
|
||||
switch ((u32) addr) {
|
||||
case IOP13XX_PCIE_LOWER_IO_VA ... IOP13XX_PCIE_UPPER_IO_VA:
|
||||
case IOP13XX_PCIX_LOWER_IO_VA ... IOP13XX_PCIX_UPPER_IO_VA:
|
||||
case IOP13XX_PMMR_VIRT_MEM_BASE ... IOP13XX_PMMR_UPPER_MEM_VA:
|
||||
goto skip;
|
||||
}
|
||||
|
@ -970,7 +970,6 @@ void __init iop13xx_pci_init(void)
|
||||
__raw_writel(__raw_readl(IOP13XX_XBG_BECSR) & 3, IOP13XX_XBG_BECSR);
|
||||
|
||||
/* Setup the Min Address for PCI memory... */
|
||||
pcibios_min_io = 0;
|
||||
pcibios_min_mem = IOP13XX_PCIX_LOWER_MEM_BA;
|
||||
|
||||
/* if Linux is given control of an ATU
|
||||
@ -1003,7 +1002,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys)
|
||||
if (nr > 1)
|
||||
return 0;
|
||||
|
||||
res = kcalloc(2, sizeof(struct resource), GFP_KERNEL);
|
||||
res = kzalloc(sizeof(struct resource), GFP_KERNEL);
|
||||
if (!res)
|
||||
panic("PCI: unable to alloc resources");
|
||||
|
||||
@ -1042,17 +1041,13 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys)
|
||||
<< IOP13XX_ATUX_PCIXSR_FUNC_NUM;
|
||||
__raw_writel(pcixsr, IOP13XX_ATUX_PCIXSR);
|
||||
|
||||
res[0].start = IOP13XX_PCIX_LOWER_IO_PA + IOP13XX_PCIX_IO_BUS_OFFSET;
|
||||
res[0].end = IOP13XX_PCIX_UPPER_IO_PA;
|
||||
res[0].name = "IQ81340 ATUX PCI I/O Space";
|
||||
res[0].flags = IORESOURCE_IO;
|
||||
pci_ioremap_io(0, IOP13XX_PCIX_LOWER_IO_PA);
|
||||
|
||||
res[1].start = IOP13XX_PCIX_LOWER_MEM_RA;
|
||||
res[1].end = IOP13XX_PCIX_UPPER_MEM_RA;
|
||||
res[1].name = "IQ81340 ATUX PCI Memory Space";
|
||||
res[1].flags = IORESOURCE_MEM;
|
||||
res->start = IOP13XX_PCIX_LOWER_MEM_RA;
|
||||
res->end = IOP13XX_PCIX_UPPER_MEM_RA;
|
||||
res->name = "IQ81340 ATUX PCI Memory Space";
|
||||
res->flags = IORESOURCE_MEM;
|
||||
sys->mem_offset = IOP13XX_PCIX_MEM_OFFSET;
|
||||
sys->io_offset = IOP13XX_PCIX_LOWER_IO_PA;
|
||||
break;
|
||||
case IOP13XX_INIT_ATU_ATUE:
|
||||
/* Note: the function number field in the PCSR is ro */
|
||||
@ -1063,17 +1058,13 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys)
|
||||
|
||||
__raw_writel(pcsr, IOP13XX_ATUE_PCSR);
|
||||
|
||||
res[0].start = IOP13XX_PCIE_LOWER_IO_PA + IOP13XX_PCIE_IO_BUS_OFFSET;
|
||||
res[0].end = IOP13XX_PCIE_UPPER_IO_PA;
|
||||
res[0].name = "IQ81340 ATUE PCI I/O Space";
|
||||
res[0].flags = IORESOURCE_IO;
|
||||
pci_ioremap_io(SZ_64K, IOP13XX_PCIE_LOWER_IO_PA);
|
||||
|
||||
res[1].start = IOP13XX_PCIE_LOWER_MEM_RA;
|
||||
res[1].end = IOP13XX_PCIE_UPPER_MEM_RA;
|
||||
res[1].name = "IQ81340 ATUE PCI Memory Space";
|
||||
res[1].flags = IORESOURCE_MEM;
|
||||
res->start = IOP13XX_PCIE_LOWER_MEM_RA;
|
||||
res->end = IOP13XX_PCIE_UPPER_MEM_RA;
|
||||
res->name = "IQ81340 ATUE PCI Memory Space";
|
||||
res->flags = IORESOURCE_MEM;
|
||||
sys->mem_offset = IOP13XX_PCIE_MEM_OFFSET;
|
||||
sys->io_offset = IOP13XX_PCIE_LOWER_IO_PA;
|
||||
sys->map_irq = iop13xx_pcie_map_irq;
|
||||
break;
|
||||
default:
|
||||
@ -1081,11 +1072,9 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys)
|
||||
return 0;
|
||||
}
|
||||
|
||||
request_resource(&ioport_resource, &res[0]);
|
||||
request_resource(&iomem_resource, &res[1]);
|
||||
request_resource(&iomem_resource, res);
|
||||
|
||||
pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset);
|
||||
pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset);
|
||||
pci_add_resource_offset(&sys->resources, res, sys->mem_offset);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -40,16 +40,6 @@ static struct map_desc iop13xx_std_desc[] __initdata = {
|
||||
.pfn = __phys_to_pfn(IOP13XX_PMMR_PHYS_MEM_BASE),
|
||||
.length = IOP13XX_PMMR_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
}, { /* PCIE IO space */
|
||||
.virtual = IOP13XX_PCIE_LOWER_IO_VA,
|
||||
.pfn = __phys_to_pfn(IOP13XX_PCIE_LOWER_IO_PA),
|
||||
.length = IOP13XX_PCIX_IO_WINDOW_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
}, { /* PCIX IO space */
|
||||
.virtual = IOP13XX_PCIX_LOWER_IO_VA,
|
||||
.pfn = __phys_to_pfn(IOP13XX_PCIX_LOWER_IO_PA),
|
||||
.length = IOP13XX_PCIX_IO_WINDOW_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -1,19 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-iop32x/include/mach/io.h
|
||||
*
|
||||
* Copyright (C) 2001 MontaVista Software, Inc.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __IO_H
|
||||
#define __IO_H
|
||||
|
||||
#include <asm/hardware/iop3xx.h>
|
||||
|
||||
#define IO_SPACE_LIMIT 0xffffffff
|
||||
#define __io(p) ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p))
|
||||
|
||||
#endif
|
@ -1,19 +0,0 @@
|
||||
/*
|
||||
* arch/arm/mach-iop33x/include/mach/io.h
|
||||
*
|
||||
* Copyright (C) 2001 MontaVista Software, Inc.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __IO_H
|
||||
#define __IO_H
|
||||
|
||||
#include <asm/hardware/iop3xx.h>
|
||||
|
||||
#define IO_SPACE_LIMIT 0xffffffff
|
||||
#define __io(p) ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p))
|
||||
|
||||
#endif
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user