Merge commit 'v3.3' into fbdev-next
This commit is contained in:
commit
44e8ba93cf
|
@ -7,9 +7,9 @@ Each LED is represented as a sub-node of the gpio-leds device. Each
|
||||||
node's name represents the name of the corresponding LED.
|
node's name represents the name of the corresponding LED.
|
||||||
|
|
||||||
LED sub-node properties:
|
LED sub-node properties:
|
||||||
- gpios : Should specify the LED's GPIO, see "Specifying GPIO information
|
- gpios : Should specify the LED's GPIO, see "gpios property" in
|
||||||
for devices" in Documentation/devicetree/booting-without-of.txt. Active
|
Documentation/devicetree/gpio.txt. Active low LEDs should be
|
||||||
low LEDs should be indicated using flags in the GPIO specifier.
|
indicated using flags in the GPIO specifier.
|
||||||
- label : (optional) The label for this LED. If omitted, the label is
|
- label : (optional) The label for this LED. If omitted, the label is
|
||||||
taken from the node name (excluding the unit address).
|
taken from the node name (excluding the unit address).
|
||||||
- linux,default-trigger : (optional) This parameter, if present, is a
|
- linux,default-trigger : (optional) This parameter, if present, is a
|
||||||
|
|
|
@ -30,6 +30,7 @@ national National Semiconductor
|
||||||
nintendo Nintendo
|
nintendo Nintendo
|
||||||
nvidia NVIDIA
|
nvidia NVIDIA
|
||||||
nxp NXP Semiconductors
|
nxp NXP Semiconductors
|
||||||
|
picochip Picochip Ltd
|
||||||
powervr Imagination Technologies
|
powervr Imagination Technologies
|
||||||
qcom Qualcomm, Inc.
|
qcom Qualcomm, Inc.
|
||||||
ramtron Ramtron International
|
ramtron Ramtron International
|
||||||
|
|
|
@ -7,21 +7,29 @@ Supported chips:
|
||||||
Addresses scanned: I2C 0x18 - 0x1f
|
Addresses scanned: I2C 0x18 - 0x1f
|
||||||
Datasheets:
|
Datasheets:
|
||||||
http://www.analog.com/static/imported-files/data_sheets/ADT7408.pdf
|
http://www.analog.com/static/imported-files/data_sheets/ADT7408.pdf
|
||||||
* IDT TSE2002B3, TS3000B3
|
* Atmel AT30TS00
|
||||||
Prefix: 'tse2002b3', 'ts3000b3'
|
Prefix: 'at30ts00'
|
||||||
Addresses scanned: I2C 0x18 - 0x1f
|
Addresses scanned: I2C 0x18 - 0x1f
|
||||||
Datasheets:
|
Datasheets:
|
||||||
http://www.idt.com/products/getdoc.cfm?docid=18715691
|
http://www.atmel.com/Images/doc8585.pdf
|
||||||
http://www.idt.com/products/getdoc.cfm?docid=18715692
|
* IDT TSE2002B3, TSE2002GB2, TS3000B3, TS3000GB2
|
||||||
|
Prefix: 'tse2002', 'ts3000'
|
||||||
|
Addresses scanned: I2C 0x18 - 0x1f
|
||||||
|
Datasheets:
|
||||||
|
http://www.idt.com/sites/default/files/documents/IDT_TSE2002B3C_DST_20100512_120303152056.pdf
|
||||||
|
http://www.idt.com/sites/default/files/documents/IDT_TSE2002GB2A1_DST_20111107_120303145914.pdf
|
||||||
|
http://www.idt.com/sites/default/files/documents/IDT_TS3000B3A_DST_20101129_120303152013.pdf
|
||||||
|
http://www.idt.com/sites/default/files/documents/IDT_TS3000GB2A1_DST_20111104_120303151012.pdf
|
||||||
* Maxim MAX6604
|
* Maxim MAX6604
|
||||||
Prefix: 'max6604'
|
Prefix: 'max6604'
|
||||||
Addresses scanned: I2C 0x18 - 0x1f
|
Addresses scanned: I2C 0x18 - 0x1f
|
||||||
Datasheets:
|
Datasheets:
|
||||||
http://datasheets.maxim-ic.com/en/ds/MAX6604.pdf
|
http://datasheets.maxim-ic.com/en/ds/MAX6604.pdf
|
||||||
* Microchip MCP9805, MCP98242, MCP98243, MCP9843
|
* Microchip MCP9804, MCP9805, MCP98242, MCP98243, MCP9843
|
||||||
Prefixes: 'mcp9805', 'mcp98242', 'mcp98243', 'mcp9843'
|
Prefixes: 'mcp9804', 'mcp9805', 'mcp98242', 'mcp98243', 'mcp9843'
|
||||||
Addresses scanned: I2C 0x18 - 0x1f
|
Addresses scanned: I2C 0x18 - 0x1f
|
||||||
Datasheets:
|
Datasheets:
|
||||||
|
http://ww1.microchip.com/downloads/en/DeviceDoc/22203C.pdf
|
||||||
http://ww1.microchip.com/downloads/en/DeviceDoc/21977b.pdf
|
http://ww1.microchip.com/downloads/en/DeviceDoc/21977b.pdf
|
||||||
http://ww1.microchip.com/downloads/en/DeviceDoc/21996a.pdf
|
http://ww1.microchip.com/downloads/en/DeviceDoc/21996a.pdf
|
||||||
http://ww1.microchip.com/downloads/en/DeviceDoc/22153c.pdf
|
http://ww1.microchip.com/downloads/en/DeviceDoc/22153c.pdf
|
||||||
|
@ -48,6 +56,12 @@ Supported chips:
|
||||||
Datasheets:
|
Datasheets:
|
||||||
http://www.st.com/stonline/products/literature/ds/13447/stts424.pdf
|
http://www.st.com/stonline/products/literature/ds/13447/stts424.pdf
|
||||||
http://www.st.com/stonline/products/literature/ds/13448/stts424e02.pdf
|
http://www.st.com/stonline/products/literature/ds/13448/stts424e02.pdf
|
||||||
|
* ST Microelectronics STTS2002, STTS3000
|
||||||
|
Prefix: 'stts2002', 'stts3000'
|
||||||
|
Addresses scanned: I2C 0x18 - 0x1f
|
||||||
|
Datasheets:
|
||||||
|
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00225278.pdf
|
||||||
|
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATA_BRIEF/CD00270920.pdf
|
||||||
* JEDEC JC 42.4 compliant temperature sensor chips
|
* JEDEC JC 42.4 compliant temperature sensor chips
|
||||||
Prefix: 'jc42'
|
Prefix: 'jc42'
|
||||||
Addresses scanned: I2C 0x18 - 0x1f
|
Addresses scanned: I2C 0x18 - 0x1f
|
||||||
|
|
|
@ -50,7 +50,7 @@ W83627DHG, W83627DHG-P, W83627UHG, W83667HG, W83667HG-B, W83667HG-I
|
||||||
(NCT6775F), and NCT6776F super I/O chips. We will refer to them collectively
|
(NCT6775F), and NCT6776F super I/O chips. We will refer to them collectively
|
||||||
as Winbond chips.
|
as Winbond chips.
|
||||||
|
|
||||||
The chips implement 2 to 4 temperature sensors (9 for NCT6775F and NCT6776F),
|
The chips implement 3 to 4 temperature sensors (9 for NCT6775F and NCT6776F),
|
||||||
2 to 5 fan rotation speed sensors, 8 to 10 analog voltage sensors, one VID
|
2 to 5 fan rotation speed sensors, 8 to 10 analog voltage sensors, one VID
|
||||||
(except for 627UHG), alarms with beep warnings (control unimplemented),
|
(except for 627UHG), alarms with beep warnings (control unimplemented),
|
||||||
and some automatic fan regulation strategies (plus manual fan control mode).
|
and some automatic fan regulation strategies (plus manual fan control mode).
|
||||||
|
@ -143,8 +143,13 @@ pwm[1-4]_min_output - minimum fan speed (range 1 - 255), when the temperature
|
||||||
pwm[1-4]_stop_time - how many milliseconds [ms] must elapse to switch
|
pwm[1-4]_stop_time - how many milliseconds [ms] must elapse to switch
|
||||||
corresponding fan off. (when the temperature was below
|
corresponding fan off. (when the temperature was below
|
||||||
defined range).
|
defined range).
|
||||||
|
pwm[1-4]_start_output-minimum fan speed (range 1 - 255) when spinning up
|
||||||
|
pwm[1-4]_step_output- rate of fan speed change (1 - 255)
|
||||||
|
pwm[1-4]_stop_output- minimum fan speed (range 1 - 255) when spinning down
|
||||||
|
pwm[1-4]_max_output - maximum fan speed (range 1 - 255), when the temperature
|
||||||
|
is above defined range.
|
||||||
|
|
||||||
Note: last two functions are influenced by other control bits, not yet exported
|
Note: last six functions are influenced by other control bits, not yet exported
|
||||||
by the driver, so a change might not have any effect.
|
by the driver, so a change might not have any effect.
|
||||||
|
|
||||||
Implementation Details
|
Implementation Details
|
||||||
|
|
|
@ -88,14 +88,12 @@ Module parameters
|
||||||
delay
|
delay
|
||||||
-----
|
-----
|
||||||
|
|
||||||
Some Intersil/Zilker Labs DC-DC controllers require a minimum interval between
|
Intersil/Zilker Labs DC-DC controllers require a minimum interval between I2C
|
||||||
I2C bus accesses. According to Intersil, the minimum interval is 2 ms, though
|
bus accesses. According to Intersil, the minimum interval is 2 ms, though 1 ms
|
||||||
1 ms appears to be sufficient and has not caused any problems in testing.
|
appears to be sufficient and has not caused any problems in testing. The problem
|
||||||
The problem is known to affect ZL6100, ZL2105, and ZL2008. It is known not to
|
is known to affect all currently supported chips. For manual override, the
|
||||||
affect ZL2004 and ZL6105. The driver automatically sets the interval to 1 ms
|
driver provides a writeable module parameter, 'delay', which can be used to set
|
||||||
except for ZL2004 and ZL6105. To enable manual override, the driver provides a
|
the interval to a value between 0 and 65,535 microseconds.
|
||||||
writeable module parameter, 'delay', which can be used to set the interval to
|
|
||||||
a value between 0 and 65,535 microseconds.
|
|
||||||
|
|
||||||
|
|
||||||
Sysfs entries
|
Sysfs entries
|
||||||
|
|
|
@ -13,7 +13,8 @@ Detection
|
||||||
|
|
||||||
All ALPS touchpads should respond to the "E6 report" command sequence:
|
All ALPS touchpads should respond to the "E6 report" command sequence:
|
||||||
E8-E6-E6-E6-E9. An ALPS touchpad should respond with either 00-00-0A or
|
E8-E6-E6-E6-E9. An ALPS touchpad should respond with either 00-00-0A or
|
||||||
00-00-64.
|
00-00-64 if no buttons are pressed. The bits 0-2 of the first byte will be 1s
|
||||||
|
if some buttons are pressed.
|
||||||
|
|
||||||
If the E6 report is successful, the touchpad model is identified using the "E7
|
If the E6 report is successful, the touchpad model is identified using the "E7
|
||||||
report" sequence: E8-E7-E7-E7-E9. The response is the model signature and is
|
report" sequence: E8-E7-E7-E7-E9. The response is the model signature and is
|
||||||
|
|
|
@ -2211,6 +2211,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
|
|
||||||
default: off.
|
default: off.
|
||||||
|
|
||||||
|
printk.always_kmsg_dump=
|
||||||
|
Trigger kmsg_dump for cases other than kernel oops or
|
||||||
|
panics
|
||||||
|
Format: <bool> (1/Y/y=enable, 0/N/n=disable)
|
||||||
|
default: disabled
|
||||||
|
|
||||||
printk.time= Show timing data prefixed to each printk message line
|
printk.time= Show timing data prefixed to each printk message line
|
||||||
Format: <bool> (1/Y/y=enable, 0/N/n=disable)
|
Format: <bool> (1/Y/y=enable, 0/N/n=disable)
|
||||||
|
|
||||||
|
|
52
MAINTAINERS
52
MAINTAINERS
|
@ -962,7 +962,7 @@ F: drivers/tty/serial/msm_serial.c
|
||||||
F: drivers/platform/msm/
|
F: drivers/platform/msm/
|
||||||
F: drivers/*/pm8???-*
|
F: drivers/*/pm8???-*
|
||||||
F: include/linux/mfd/pm8xxx/
|
F: include/linux/mfd/pm8xxx/
|
||||||
T: git git://codeaurora.org/quic/kernel/davidb/linux-msm.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davidb/linux-msm.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ARM/TOSA MACHINE SUPPORT
|
ARM/TOSA MACHINE SUPPORT
|
||||||
|
@ -1310,7 +1310,7 @@ F: drivers/atm/
|
||||||
F: include/linux/atm*
|
F: include/linux/atm*
|
||||||
|
|
||||||
ATMEL AT91 MCI DRIVER
|
ATMEL AT91 MCI DRIVER
|
||||||
M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
M: Ludovic Desroches <ludovic.desroches@atmel.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.atmel.com/products/AT91/
|
W: http://www.atmel.com/products/AT91/
|
||||||
W: http://www.at91.com/
|
W: http://www.at91.com/
|
||||||
|
@ -1318,7 +1318,7 @@ S: Maintained
|
||||||
F: drivers/mmc/host/at91_mci.c
|
F: drivers/mmc/host/at91_mci.c
|
||||||
|
|
||||||
ATMEL AT91 / AT32 MCI DRIVER
|
ATMEL AT91 / AT32 MCI DRIVER
|
||||||
M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
M: Ludovic Desroches <ludovic.desroches@atmel.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/mmc/host/atmel-mci.c
|
F: drivers/mmc/host/atmel-mci.c
|
||||||
F: drivers/mmc/host/atmel-mci-regs.h
|
F: drivers/mmc/host/atmel-mci-regs.h
|
||||||
|
@ -1513,19 +1513,23 @@ F: drivers/mtd/devices/block2mtd.c
|
||||||
|
|
||||||
BLUETOOTH DRIVERS
|
BLUETOOTH DRIVERS
|
||||||
M: Marcel Holtmann <marcel@holtmann.org>
|
M: Marcel Holtmann <marcel@holtmann.org>
|
||||||
M: "Gustavo F. Padovan" <padovan@profusion.mobi>
|
M: Gustavo Padovan <gustavo@padovan.org>
|
||||||
|
M: Johan Hedberg <johan.hedberg@gmail.com>
|
||||||
L: linux-bluetooth@vger.kernel.org
|
L: linux-bluetooth@vger.kernel.org
|
||||||
W: http://www.bluez.org/
|
W: http://www.bluez.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth.git
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jh/bluetooth.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/bluetooth/
|
F: drivers/bluetooth/
|
||||||
|
|
||||||
BLUETOOTH SUBSYSTEM
|
BLUETOOTH SUBSYSTEM
|
||||||
M: Marcel Holtmann <marcel@holtmann.org>
|
M: Marcel Holtmann <marcel@holtmann.org>
|
||||||
M: "Gustavo F. Padovan" <padovan@profusion.mobi>
|
M: Gustavo Padovan <gustavo@padovan.org>
|
||||||
|
M: Johan Hedberg <johan.hedberg@gmail.com>
|
||||||
L: linux-bluetooth@vger.kernel.org
|
L: linux-bluetooth@vger.kernel.org
|
||||||
W: http://www.bluez.org/
|
W: http://www.bluez.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth.git
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jh/bluetooth.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: net/bluetooth/
|
F: net/bluetooth/
|
||||||
F: include/net/bluetooth/
|
F: include/net/bluetooth/
|
||||||
|
@ -1717,6 +1721,14 @@ F: include/linux/can/error.h
|
||||||
F: include/linux/can/netlink.h
|
F: include/linux/can/netlink.h
|
||||||
F: include/linux/can/platform/
|
F: include/linux/can/platform/
|
||||||
|
|
||||||
|
CAPABILITIES
|
||||||
|
M: Serge Hallyn <serge.hallyn@canonical.com>
|
||||||
|
L: linux-security-module@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
F: include/linux/capability.h
|
||||||
|
F: security/capability.c
|
||||||
|
F: security/commoncap.c
|
||||||
|
|
||||||
CELL BROADBAND ENGINE ARCHITECTURE
|
CELL BROADBAND ENGINE ARCHITECTURE
|
||||||
M: Arnd Bergmann <arnd@arndb.de>
|
M: Arnd Bergmann <arnd@arndb.de>
|
||||||
L: linuxppc-dev@lists.ozlabs.org
|
L: linuxppc-dev@lists.ozlabs.org
|
||||||
|
@ -2360,6 +2372,15 @@ S: Supported
|
||||||
F: drivers/gpu/drm/exynos
|
F: drivers/gpu/drm/exynos
|
||||||
F: include/drm/exynos*
|
F: include/drm/exynos*
|
||||||
|
|
||||||
|
EXYNOS MIPI DISPLAY DRIVERS
|
||||||
|
M: Inki Dae <inki.dae@samsung.com>
|
||||||
|
M: Donghwa Lee <dh09.lee@samsung.com>
|
||||||
|
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||||
|
L: linux-fbdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/video/exynos/exynos_mipi*
|
||||||
|
F: include/video/exynos_mipi*
|
||||||
|
|
||||||
DSCC4 DRIVER
|
DSCC4 DRIVER
|
||||||
M: Francois Romieu <romieu@fr.zoreil.com>
|
M: Francois Romieu <romieu@fr.zoreil.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
@ -2869,6 +2890,12 @@ S: Maintained
|
||||||
F: drivers/media/video/m5mols/
|
F: drivers/media/video/m5mols/
|
||||||
F: include/media/m5mols.h
|
F: include/media/m5mols.h
|
||||||
|
|
||||||
|
FUJITSU TABLET EXTRAS
|
||||||
|
M: Robert Gerlach <khnz@gmx.de>
|
||||||
|
L: platform-driver-x86@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/platform/x86/fujitsu-tablet.c
|
||||||
|
|
||||||
FUSE: FILESYSTEM IN USERSPACE
|
FUSE: FILESYSTEM IN USERSPACE
|
||||||
M: Miklos Szeredi <miklos@szeredi.hu>
|
M: Miklos Szeredi <miklos@szeredi.hu>
|
||||||
L: fuse-devel@lists.sourceforge.net
|
L: fuse-devel@lists.sourceforge.net
|
||||||
|
@ -5877,6 +5904,7 @@ F: drivers/mmc/host/sdhci-s3c.c
|
||||||
|
|
||||||
SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) ST SPEAR DRIVER
|
SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) ST SPEAR DRIVER
|
||||||
M: Viresh Kumar <viresh.kumar@st.com>
|
M: Viresh Kumar <viresh.kumar@st.com>
|
||||||
|
L: spear-devel@list.st.com
|
||||||
L: linux-mmc@vger.kernel.org
|
L: linux-mmc@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/mmc/host/sdhci-spear.c
|
F: drivers/mmc/host/sdhci-spear.c
|
||||||
|
@ -6219,24 +6247,32 @@ F: drivers/tty/serial/sunzilog.h
|
||||||
|
|
||||||
SPEAR PLATFORM SUPPORT
|
SPEAR PLATFORM SUPPORT
|
||||||
M: Viresh Kumar <viresh.kumar@st.com>
|
M: Viresh Kumar <viresh.kumar@st.com>
|
||||||
|
L: spear-devel@list.st.com
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.st.com/spear
|
W: http://www.st.com/spear
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/plat-spear/
|
F: arch/arm/plat-spear/
|
||||||
|
|
||||||
SPEAR3XX MACHINE SUPPORT
|
SPEAR3XX MACHINE SUPPORT
|
||||||
M: Viresh Kumar <viresh.kumar@st.com>
|
M: Viresh Kumar <viresh.kumar@st.com>
|
||||||
|
L: spear-devel@list.st.com
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.st.com/spear
|
W: http://www.st.com/spear
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-spear3xx/
|
F: arch/arm/mach-spear3xx/
|
||||||
|
|
||||||
SPEAR6XX MACHINE SUPPORT
|
SPEAR6XX MACHINE SUPPORT
|
||||||
M: Rajeev Kumar <rajeev-dlh.kumar@st.com>
|
M: Rajeev Kumar <rajeev-dlh.kumar@st.com>
|
||||||
|
L: spear-devel@list.st.com
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.st.com/spear
|
W: http://www.st.com/spear
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-spear6xx/
|
F: arch/arm/mach-spear6xx/
|
||||||
|
|
||||||
SPEAR CLOCK FRAMEWORK SUPPORT
|
SPEAR CLOCK FRAMEWORK SUPPORT
|
||||||
M: Viresh Kumar <viresh.kumar@st.com>
|
M: Viresh Kumar <viresh.kumar@st.com>
|
||||||
|
L: spear-devel@list.st.com
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.st.com/spear
|
W: http://www.st.com/spear
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-spear*/clock.c
|
F: arch/arm/mach-spear*/clock.c
|
||||||
|
@ -6245,6 +6281,8 @@ F: arch/arm/plat-spear/include/plat/clock.h
|
||||||
|
|
||||||
SPEAR PAD MULTIPLEXING SUPPORT
|
SPEAR PAD MULTIPLEXING SUPPORT
|
||||||
M: Viresh Kumar <viresh.kumar@st.com>
|
M: Viresh Kumar <viresh.kumar@st.com>
|
||||||
|
L: spear-devel@list.st.com
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.st.com/spear
|
W: http://www.st.com/spear
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/plat-spear/include/plat/padmux.h
|
F: arch/arm/plat-spear/include/plat/padmux.h
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 3
|
PATCHLEVEL = 3
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc6
|
EXTRAVERSION =
|
||||||
NAME = Saber-toothed Squirrel
|
NAME = Saber-toothed Squirrel
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -108,7 +108,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
||||||
" lda $31,3b-2b(%0)\n"
|
" lda $31,3b-2b(%0)\n"
|
||||||
" .previous\n"
|
" .previous\n"
|
||||||
: "+r"(ret), "=&r"(prev), "=&r"(cmp)
|
: "+r"(ret), "=&r"(prev), "=&r"(cmp)
|
||||||
: "r"(uaddr), "r"((long)oldval), "r"(newval)
|
: "r"(uaddr), "r"((long)(int)oldval), "r"(newval)
|
||||||
: "memory");
|
: "memory");
|
||||||
|
|
||||||
*uval = prev;
|
*uval = prev;
|
||||||
|
|
|
@ -1280,7 +1280,7 @@ config ARM_ERRATA_743622
|
||||||
depends on CPU_V7
|
depends on CPU_V7
|
||||||
help
|
help
|
||||||
This option enables the workaround for the 743622 Cortex-A9
|
This option enables the workaround for the 743622 Cortex-A9
|
||||||
(r2p0..r2p2) erratum. Under very rare conditions, a faulty
|
(r2p*) erratum. Under very rare conditions, a faulty
|
||||||
optimisation in the Cortex-A9 Store Buffer may lead to data
|
optimisation in the Cortex-A9 Store Buffer may lead to data
|
||||||
corruption. This workaround sets a specific bit in the diagnostic
|
corruption. This workaround sets a specific bit in the diagnostic
|
||||||
register of the Cortex-A9 which disables the Store Buffer
|
register of the Cortex-A9 which disables the Store Buffer
|
||||||
|
|
1
arch/arm/boot/.gitignore
vendored
1
arch/arm/boot/.gitignore
vendored
|
@ -3,3 +3,4 @@ zImage
|
||||||
xipImage
|
xipImage
|
||||||
bootpImage
|
bootpImage
|
||||||
uImage
|
uImage
|
||||||
|
*.dtb
|
||||||
|
|
|
@ -134,7 +134,7 @@ int __init armpmu_register(struct arm_pmu *armpmu, char *name, int type);
|
||||||
|
|
||||||
u64 armpmu_event_update(struct perf_event *event,
|
u64 armpmu_event_update(struct perf_event *event,
|
||||||
struct hw_perf_event *hwc,
|
struct hw_perf_event *hwc,
|
||||||
int idx, int overflow);
|
int idx);
|
||||||
|
|
||||||
int armpmu_event_set_period(struct perf_event *event,
|
int armpmu_event_set_period(struct perf_event *event,
|
||||||
struct hw_perf_event *hwc,
|
struct hw_perf_event *hwc,
|
||||||
|
|
|
@ -242,6 +242,7 @@ static void ecard_init_pgtables(struct mm_struct *mm)
|
||||||
|
|
||||||
memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (EASI_SIZE / PGDIR_SIZE));
|
memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (EASI_SIZE / PGDIR_SIZE));
|
||||||
|
|
||||||
|
vma.vm_flags = VM_EXEC;
|
||||||
vma.vm_mm = mm;
|
vma.vm_mm = mm;
|
||||||
|
|
||||||
flush_tlb_range(&vma, IO_START, IO_START + IO_SIZE);
|
flush_tlb_range(&vma, IO_START, IO_START + IO_SIZE);
|
||||||
|
|
|
@ -180,7 +180,7 @@ armpmu_event_set_period(struct perf_event *event,
|
||||||
u64
|
u64
|
||||||
armpmu_event_update(struct perf_event *event,
|
armpmu_event_update(struct perf_event *event,
|
||||||
struct hw_perf_event *hwc,
|
struct hw_perf_event *hwc,
|
||||||
int idx, int overflow)
|
int idx)
|
||||||
{
|
{
|
||||||
struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
|
struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
|
||||||
u64 delta, prev_raw_count, new_raw_count;
|
u64 delta, prev_raw_count, new_raw_count;
|
||||||
|
@ -193,13 +193,7 @@ again:
|
||||||
new_raw_count) != prev_raw_count)
|
new_raw_count) != prev_raw_count)
|
||||||
goto again;
|
goto again;
|
||||||
|
|
||||||
new_raw_count &= armpmu->max_period;
|
delta = (new_raw_count - prev_raw_count) & armpmu->max_period;
|
||||||
prev_raw_count &= armpmu->max_period;
|
|
||||||
|
|
||||||
if (overflow)
|
|
||||||
delta = armpmu->max_period - prev_raw_count + new_raw_count + 1;
|
|
||||||
else
|
|
||||||
delta = new_raw_count - prev_raw_count;
|
|
||||||
|
|
||||||
local64_add(delta, &event->count);
|
local64_add(delta, &event->count);
|
||||||
local64_sub(delta, &hwc->period_left);
|
local64_sub(delta, &hwc->period_left);
|
||||||
|
@ -216,7 +210,7 @@ armpmu_read(struct perf_event *event)
|
||||||
if (hwc->idx < 0)
|
if (hwc->idx < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
armpmu_event_update(event, hwc, hwc->idx, 0);
|
armpmu_event_update(event, hwc, hwc->idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -232,7 +226,7 @@ armpmu_stop(struct perf_event *event, int flags)
|
||||||
if (!(hwc->state & PERF_HES_STOPPED)) {
|
if (!(hwc->state & PERF_HES_STOPPED)) {
|
||||||
armpmu->disable(hwc, hwc->idx);
|
armpmu->disable(hwc, hwc->idx);
|
||||||
barrier(); /* why? */
|
barrier(); /* why? */
|
||||||
armpmu_event_update(event, hwc, hwc->idx, 0);
|
armpmu_event_update(event, hwc, hwc->idx);
|
||||||
hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;
|
hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -518,7 +512,13 @@ __hw_perf_event_init(struct perf_event *event)
|
||||||
hwc->config_base |= (unsigned long)mapping;
|
hwc->config_base |= (unsigned long)mapping;
|
||||||
|
|
||||||
if (!hwc->sample_period) {
|
if (!hwc->sample_period) {
|
||||||
hwc->sample_period = armpmu->max_period;
|
/*
|
||||||
|
* For non-sampling runs, limit the sample_period to half
|
||||||
|
* of the counter width. That way, the new counter value
|
||||||
|
* is far less likely to overtake the previous one unless
|
||||||
|
* you have some serious IRQ latency issues.
|
||||||
|
*/
|
||||||
|
hwc->sample_period = armpmu->max_period >> 1;
|
||||||
hwc->last_period = hwc->sample_period;
|
hwc->last_period = hwc->sample_period;
|
||||||
local64_set(&hwc->period_left, hwc->sample_period);
|
local64_set(&hwc->period_left, hwc->sample_period);
|
||||||
}
|
}
|
||||||
|
@ -679,6 +679,28 @@ static void __init cpu_pmu_init(struct arm_pmu *armpmu)
|
||||||
armpmu->type = ARM_PMU_DEVICE_CPU;
|
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.
|
* CPU PMU identification and registration.
|
||||||
*/
|
*/
|
||||||
|
@ -730,6 +752,7 @@ init_hw_perf_events(void)
|
||||||
pr_info("enabled with %s PMU driver, %d counters available\n",
|
pr_info("enabled with %s PMU driver, %d counters available\n",
|
||||||
cpu_pmu->name, cpu_pmu->num_events);
|
cpu_pmu->name, cpu_pmu->num_events);
|
||||||
cpu_pmu_init(cpu_pmu);
|
cpu_pmu_init(cpu_pmu);
|
||||||
|
register_cpu_notifier(&pmu_cpu_notifier);
|
||||||
armpmu_register(cpu_pmu, "cpu", PERF_TYPE_RAW);
|
armpmu_register(cpu_pmu, "cpu", PERF_TYPE_RAW);
|
||||||
} else {
|
} else {
|
||||||
pr_info("no hardware support available\n");
|
pr_info("no hardware support available\n");
|
||||||
|
|
|
@ -467,23 +467,6 @@ armv6pmu_enable_event(struct hw_perf_event *hwc,
|
||||||
raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
|
raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int counter_is_active(unsigned long pmcr, int idx)
|
|
||||||
{
|
|
||||||
unsigned long mask = 0;
|
|
||||||
if (idx == ARMV6_CYCLE_COUNTER)
|
|
||||||
mask = ARMV6_PMCR_CCOUNT_IEN;
|
|
||||||
else if (idx == ARMV6_COUNTER0)
|
|
||||||
mask = ARMV6_PMCR_COUNT0_IEN;
|
|
||||||
else if (idx == ARMV6_COUNTER1)
|
|
||||||
mask = ARMV6_PMCR_COUNT1_IEN;
|
|
||||||
|
|
||||||
if (mask)
|
|
||||||
return pmcr & mask;
|
|
||||||
|
|
||||||
WARN_ONCE(1, "invalid counter number (%d)\n", idx);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static irqreturn_t
|
static irqreturn_t
|
||||||
armv6pmu_handle_irq(int irq_num,
|
armv6pmu_handle_irq(int irq_num,
|
||||||
void *dev)
|
void *dev)
|
||||||
|
@ -513,7 +496,8 @@ armv6pmu_handle_irq(int irq_num,
|
||||||
struct perf_event *event = cpuc->events[idx];
|
struct perf_event *event = cpuc->events[idx];
|
||||||
struct hw_perf_event *hwc;
|
struct hw_perf_event *hwc;
|
||||||
|
|
||||||
if (!counter_is_active(pmcr, idx))
|
/* Ignore if we don't have an event. */
|
||||||
|
if (!event)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -524,7 +508,7 @@ armv6pmu_handle_irq(int irq_num,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
hwc = &event->hw;
|
hwc = &event->hw;
|
||||||
armpmu_event_update(event, hwc, idx, 1);
|
armpmu_event_update(event, hwc, idx);
|
||||||
data.period = event->hw.last_period;
|
data.period = event->hw.last_period;
|
||||||
if (!armpmu_event_set_period(event, hwc, idx))
|
if (!armpmu_event_set_period(event, hwc, idx))
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -809,6 +809,11 @@ static inline int armv7_pmnc_disable_intens(int idx)
|
||||||
|
|
||||||
counter = ARMV7_IDX_TO_COUNTER(idx);
|
counter = ARMV7_IDX_TO_COUNTER(idx);
|
||||||
asm volatile("mcr p15, 0, %0, c9, c14, 2" : : "r" (BIT(counter)));
|
asm volatile("mcr p15, 0, %0, c9, c14, 2" : : "r" (BIT(counter)));
|
||||||
|
isb();
|
||||||
|
/* Clear the overflow flag in case an interrupt is pending. */
|
||||||
|
asm volatile("mcr p15, 0, %0, c9, c12, 3" : : "r" (BIT(counter)));
|
||||||
|
isb();
|
||||||
|
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -955,6 +960,10 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)
|
||||||
struct perf_event *event = cpuc->events[idx];
|
struct perf_event *event = cpuc->events[idx];
|
||||||
struct hw_perf_event *hwc;
|
struct hw_perf_event *hwc;
|
||||||
|
|
||||||
|
/* Ignore if we don't have an event. */
|
||||||
|
if (!event)
|
||||||
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have a single interrupt for all counters. Check that
|
* We have a single interrupt for all counters. Check that
|
||||||
* each counter has overflowed before we process it.
|
* each counter has overflowed before we process it.
|
||||||
|
@ -963,7 +972,7 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
hwc = &event->hw;
|
hwc = &event->hw;
|
||||||
armpmu_event_update(event, hwc, idx, 1);
|
armpmu_event_update(event, hwc, idx);
|
||||||
data.period = event->hw.last_period;
|
data.period = event->hw.last_period;
|
||||||
if (!armpmu_event_set_period(event, hwc, idx))
|
if (!armpmu_event_set_period(event, hwc, idx))
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -255,11 +255,14 @@ xscale1pmu_handle_irq(int irq_num, void *dev)
|
||||||
struct perf_event *event = cpuc->events[idx];
|
struct perf_event *event = cpuc->events[idx];
|
||||||
struct hw_perf_event *hwc;
|
struct hw_perf_event *hwc;
|
||||||
|
|
||||||
|
if (!event)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (!xscale1_pmnc_counter_has_overflowed(pmnc, idx))
|
if (!xscale1_pmnc_counter_has_overflowed(pmnc, idx))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
hwc = &event->hw;
|
hwc = &event->hw;
|
||||||
armpmu_event_update(event, hwc, idx, 1);
|
armpmu_event_update(event, hwc, idx);
|
||||||
data.period = event->hw.last_period;
|
data.period = event->hw.last_period;
|
||||||
if (!armpmu_event_set_period(event, hwc, idx))
|
if (!armpmu_event_set_period(event, hwc, idx))
|
||||||
continue;
|
continue;
|
||||||
|
@ -592,11 +595,14 @@ xscale2pmu_handle_irq(int irq_num, void *dev)
|
||||||
struct perf_event *event = cpuc->events[idx];
|
struct perf_event *event = cpuc->events[idx];
|
||||||
struct hw_perf_event *hwc;
|
struct hw_perf_event *hwc;
|
||||||
|
|
||||||
if (!xscale2_pmnc_counter_has_overflowed(pmnc, idx))
|
if (!event)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!xscale2_pmnc_counter_has_overflowed(of_flags, idx))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
hwc = &event->hw;
|
hwc = &event->hw;
|
||||||
armpmu_event_update(event, hwc, idx, 1);
|
armpmu_event_update(event, hwc, idx);
|
||||||
data.period = event->hw.last_period;
|
data.period = event->hw.last_period;
|
||||||
if (!armpmu_event_set_period(event, hwc, idx))
|
if (!armpmu_event_set_period(event, hwc, idx))
|
||||||
continue;
|
continue;
|
||||||
|
@ -663,7 +669,7 @@ xscale2pmu_enable_event(struct hw_perf_event *hwc, int idx)
|
||||||
static void
|
static void
|
||||||
xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
|
xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
|
||||||
{
|
{
|
||||||
unsigned long flags, ien, evtsel;
|
unsigned long flags, ien, evtsel, of_flags;
|
||||||
struct pmu_hw_events *events = cpu_pmu->get_hw_events();
|
struct pmu_hw_events *events = cpu_pmu->get_hw_events();
|
||||||
|
|
||||||
ien = xscale2pmu_read_int_enable();
|
ien = xscale2pmu_read_int_enable();
|
||||||
|
@ -672,26 +678,31 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
|
||||||
switch (idx) {
|
switch (idx) {
|
||||||
case XSCALE_CYCLE_COUNTER:
|
case XSCALE_CYCLE_COUNTER:
|
||||||
ien &= ~XSCALE2_CCOUNT_INT_EN;
|
ien &= ~XSCALE2_CCOUNT_INT_EN;
|
||||||
|
of_flags = XSCALE2_CCOUNT_OVERFLOW;
|
||||||
break;
|
break;
|
||||||
case XSCALE_COUNTER0:
|
case XSCALE_COUNTER0:
|
||||||
ien &= ~XSCALE2_COUNT0_INT_EN;
|
ien &= ~XSCALE2_COUNT0_INT_EN;
|
||||||
evtsel &= ~XSCALE2_COUNT0_EVT_MASK;
|
evtsel &= ~XSCALE2_COUNT0_EVT_MASK;
|
||||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT0_EVT_SHFT;
|
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT0_EVT_SHFT;
|
||||||
|
of_flags = XSCALE2_COUNT0_OVERFLOW;
|
||||||
break;
|
break;
|
||||||
case XSCALE_COUNTER1:
|
case XSCALE_COUNTER1:
|
||||||
ien &= ~XSCALE2_COUNT1_INT_EN;
|
ien &= ~XSCALE2_COUNT1_INT_EN;
|
||||||
evtsel &= ~XSCALE2_COUNT1_EVT_MASK;
|
evtsel &= ~XSCALE2_COUNT1_EVT_MASK;
|
||||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT1_EVT_SHFT;
|
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT1_EVT_SHFT;
|
||||||
|
of_flags = XSCALE2_COUNT1_OVERFLOW;
|
||||||
break;
|
break;
|
||||||
case XSCALE_COUNTER2:
|
case XSCALE_COUNTER2:
|
||||||
ien &= ~XSCALE2_COUNT2_INT_EN;
|
ien &= ~XSCALE2_COUNT2_INT_EN;
|
||||||
evtsel &= ~XSCALE2_COUNT2_EVT_MASK;
|
evtsel &= ~XSCALE2_COUNT2_EVT_MASK;
|
||||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT2_EVT_SHFT;
|
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT2_EVT_SHFT;
|
||||||
|
of_flags = XSCALE2_COUNT2_OVERFLOW;
|
||||||
break;
|
break;
|
||||||
case XSCALE_COUNTER3:
|
case XSCALE_COUNTER3:
|
||||||
ien &= ~XSCALE2_COUNT3_INT_EN;
|
ien &= ~XSCALE2_COUNT3_INT_EN;
|
||||||
evtsel &= ~XSCALE2_COUNT3_EVT_MASK;
|
evtsel &= ~XSCALE2_COUNT3_EVT_MASK;
|
||||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT3_EVT_SHFT;
|
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT3_EVT_SHFT;
|
||||||
|
of_flags = XSCALE2_COUNT3_OVERFLOW;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
WARN_ONCE(1, "invalid counter number (%d)\n", idx);
|
WARN_ONCE(1, "invalid counter number (%d)\n", idx);
|
||||||
|
@ -701,6 +712,7 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
|
||||||
raw_spin_lock_irqsave(&events->pmu_lock, flags);
|
raw_spin_lock_irqsave(&events->pmu_lock, flags);
|
||||||
xscale2pmu_write_event_select(evtsel);
|
xscale2pmu_write_event_select(evtsel);
|
||||||
xscale2pmu_write_int_enable(ien);
|
xscale2pmu_write_int_enable(ien);
|
||||||
|
xscale2pmu_write_overflow_flags(of_flags);
|
||||||
raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
|
raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,10 +38,6 @@
|
||||||
#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
|
#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
|
||||||
static u64 hdmac_dmamask = DMA_BIT_MASK(32);
|
static u64 hdmac_dmamask = DMA_BIT_MASK(32);
|
||||||
|
|
||||||
static struct at_dma_platform_data atdma_pdata = {
|
|
||||||
.nr_channels = 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource hdmac_resources[] = {
|
static struct resource hdmac_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = AT91SAM9G45_BASE_DMA,
|
.start = AT91SAM9G45_BASE_DMA,
|
||||||
|
@ -56,12 +52,11 @@ static struct resource hdmac_resources[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device at_hdmac_device = {
|
static struct platform_device at_hdmac_device = {
|
||||||
.name = "at_hdmac",
|
.name = "at91sam9g45_dma",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.dev = {
|
.dev = {
|
||||||
.dma_mask = &hdmac_dmamask,
|
.dma_mask = &hdmac_dmamask,
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
.platform_data = &atdma_pdata,
|
|
||||||
},
|
},
|
||||||
.resource = hdmac_resources,
|
.resource = hdmac_resources,
|
||||||
.num_resources = ARRAY_SIZE(hdmac_resources),
|
.num_resources = ARRAY_SIZE(hdmac_resources),
|
||||||
|
@ -69,9 +64,15 @@ static struct platform_device at_hdmac_device = {
|
||||||
|
|
||||||
void __init at91_add_device_hdmac(void)
|
void __init at91_add_device_hdmac(void)
|
||||||
{
|
{
|
||||||
dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);
|
#if defined(CONFIG_OF)
|
||||||
dma_cap_set(DMA_SLAVE, atdma_pdata.cap_mask);
|
struct device_node *of_node =
|
||||||
platform_device_register(&at_hdmac_device);
|
of_find_node_by_name(NULL, "dma-controller");
|
||||||
|
|
||||||
|
if (of_node)
|
||||||
|
of_node_put(of_node);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
platform_device_register(&at_hdmac_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void __init at91_add_device_hdmac(void) {}
|
void __init at91_add_device_hdmac(void) {}
|
||||||
|
|
|
@ -33,10 +33,6 @@
|
||||||
#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
|
#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
|
||||||
static u64 hdmac_dmamask = DMA_BIT_MASK(32);
|
static u64 hdmac_dmamask = DMA_BIT_MASK(32);
|
||||||
|
|
||||||
static struct at_dma_platform_data atdma_pdata = {
|
|
||||||
.nr_channels = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource hdmac_resources[] = {
|
static struct resource hdmac_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = AT91SAM9RL_BASE_DMA,
|
.start = AT91SAM9RL_BASE_DMA,
|
||||||
|
@ -51,12 +47,11 @@ static struct resource hdmac_resources[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device at_hdmac_device = {
|
static struct platform_device at_hdmac_device = {
|
||||||
.name = "at_hdmac",
|
.name = "at91sam9rl_dma",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.dev = {
|
.dev = {
|
||||||
.dma_mask = &hdmac_dmamask,
|
.dma_mask = &hdmac_dmamask,
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
.platform_data = &atdma_pdata,
|
|
||||||
},
|
},
|
||||||
.resource = hdmac_resources,
|
.resource = hdmac_resources,
|
||||||
.num_resources = ARRAY_SIZE(hdmac_resources),
|
.num_resources = ARRAY_SIZE(hdmac_resources),
|
||||||
|
@ -64,7 +59,6 @@ static struct platform_device at_hdmac_device = {
|
||||||
|
|
||||||
void __init at91_add_device_hdmac(void)
|
void __init at91_add_device_hdmac(void)
|
||||||
{
|
{
|
||||||
dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);
|
|
||||||
platform_device_register(&at_hdmac_device);
|
platform_device_register(&at_hdmac_device);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <mach/ep93xx_spi.h>
|
#include <mach/ep93xx_spi.h>
|
||||||
#include <mach/gpio-ep93xx.h>
|
#include <mach/gpio-ep93xx.h>
|
||||||
|
|
||||||
|
#include <asm/hardware/vic.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
@ -361,6 +362,7 @@ MACHINE_START(VISION_EP9307, "Vision Engraving Systems EP9307")
|
||||||
.atag_offset = 0x100,
|
.atag_offset = 0x100,
|
||||||
.map_io = vision_map_io,
|
.map_io = vision_map_io,
|
||||||
.init_irq = ep93xx_init_irq,
|
.init_irq = ep93xx_init_irq,
|
||||||
|
.handle_irq = vic_handle_irq,
|
||||||
.timer = &ep93xx_timer,
|
.timer = &ep93xx_timer,
|
||||||
.init_machine = vision_init_machine,
|
.init_machine = vision_init_machine,
|
||||||
.restart = ep93xx_restart,
|
.restart = ep93xx_restart,
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
#include <linux/fb.h>
|
#include <linux/fb.h>
|
||||||
#include <linux/mfd/max8998.h>
|
#include <linux/mfd/max8998.h>
|
||||||
#include <linux/regulator/machine.h>
|
#include <linux/regulator/machine.h>
|
||||||
|
@ -595,6 +596,7 @@ static struct mxt_platform_data qt602240_platform_data = {
|
||||||
.threshold = 0x28,
|
.threshold = 0x28,
|
||||||
.voltage = 2800000, /* 2.8V */
|
.voltage = 2800000, /* 2.8V */
|
||||||
.orient = MXT_DIAGONAL,
|
.orient = MXT_DIAGONAL,
|
||||||
|
.irqflags = IRQF_TRIGGER_FALLING,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct i2c_board_info i2c3_devs[] __initdata = {
|
static struct i2c_board_info i2c3_devs[] __initdata = {
|
||||||
|
|
|
@ -343,6 +343,7 @@ static void __init omap3_check_revision(const char **cpu_rev)
|
||||||
case 0xb944:
|
case 0xb944:
|
||||||
omap_revision = AM335X_REV_ES1_0;
|
omap_revision = AM335X_REV_ES1_0;
|
||||||
*cpu_rev = "1.0";
|
*cpu_rev = "1.0";
|
||||||
|
break;
|
||||||
case 0xb8f2:
|
case 0xb8f2:
|
||||||
switch (rev) {
|
switch (rev) {
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
@ -420,8 +420,7 @@ static void __exit omap2_mbox_exit(void)
|
||||||
platform_driver_unregister(&omap2_mbox_driver);
|
platform_driver_unregister(&omap2_mbox_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* must be ready before omap3isp is probed */
|
module_init(omap2_mbox_init);
|
||||||
subsys_initcall(omap2_mbox_init);
|
|
||||||
module_exit(omap2_mbox_exit);
|
module_exit(omap2_mbox_exit);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
|
@ -150,7 +150,8 @@ err_out:
|
||||||
platform_device_put(omap_iommu_pdev[i]);
|
platform_device_put(omap_iommu_pdev[i]);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
module_init(omap_iommu_init);
|
/* must be ready before omap3isp is probed */
|
||||||
|
subsys_initcall(omap_iommu_init);
|
||||||
|
|
||||||
static void __exit omap_iommu_exit(void)
|
static void __exit omap_iommu_exit(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "omap4-sar-layout.h"
|
#include "omap4-sar-layout.h"
|
||||||
|
#include <linux/export.h>
|
||||||
|
|
||||||
#ifdef CONFIG_CACHE_L2X0
|
#ifdef CONFIG_CACHE_L2X0
|
||||||
static void __iomem *l2cache_base;
|
static void __iomem *l2cache_base;
|
||||||
|
@ -55,6 +56,7 @@ void omap_bus_sync(void)
|
||||||
isb();
|
isb();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(omap_bus_sync);
|
||||||
|
|
||||||
/* Steal one page physical memory for barrier implementation */
|
/* Steal one page physical memory for barrier implementation */
|
||||||
int __init omap_barrier_reserve_memblock(void)
|
int __init omap_barrier_reserve_memblock(void)
|
||||||
|
|
|
@ -270,7 +270,6 @@ static struct regulator_init_data omap4_vusb_idata = {
|
||||||
.constraints = {
|
.constraints = {
|
||||||
.min_uV = 3300000,
|
.min_uV = 3300000,
|
||||||
.max_uV = 3300000,
|
.max_uV = 3300000,
|
||||||
.apply_uV = true,
|
|
||||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||||
| REGULATOR_MODE_STANDBY,
|
| REGULATOR_MODE_STANDBY,
|
||||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||||
|
|
|
@ -49,7 +49,6 @@ extern unsigned pxa3xx_get_clk_frequency_khz(int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern struct syscore_ops pxa_irq_syscore_ops;
|
extern struct syscore_ops pxa_irq_syscore_ops;
|
||||||
extern struct syscore_ops pxa_gpio_syscore_ops;
|
|
||||||
extern struct syscore_ops pxa2xx_mfp_syscore_ops;
|
extern struct syscore_ops pxa2xx_mfp_syscore_ops;
|
||||||
extern struct syscore_ops pxa3xx_mfp_syscore_ops;
|
extern struct syscore_ops pxa3xx_mfp_syscore_ops;
|
||||||
|
|
||||||
|
|
|
@ -226,6 +226,12 @@ static void __init pxa25x_mfp_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* running before pxa_gpio_probe() */
|
||||||
|
#ifdef CONFIG_CPU_PXA26x
|
||||||
|
pxa_last_gpio = 89;
|
||||||
|
#else
|
||||||
|
pxa_last_gpio = 84;
|
||||||
|
#endif
|
||||||
for (i = 0; i <= pxa_last_gpio; i++)
|
for (i = 0; i <= pxa_last_gpio; i++)
|
||||||
gpio_desc[i].valid = 1;
|
gpio_desc[i].valid = 1;
|
||||||
|
|
||||||
|
@ -295,6 +301,7 @@ static void __init pxa27x_mfp_init(void)
|
||||||
{
|
{
|
||||||
int i, gpio;
|
int i, gpio;
|
||||||
|
|
||||||
|
pxa_last_gpio = 120; /* running before pxa_gpio_probe() */
|
||||||
for (i = 0; i <= pxa_last_gpio; i++) {
|
for (i = 0; i <= pxa_last_gpio; i++) {
|
||||||
/* skip GPIO2, 5, 6, 7, 8, they are not
|
/* skip GPIO2, 5, 6, 7, 8, they are not
|
||||||
* valid pins allow configuration
|
* valid pins allow configuration
|
||||||
|
|
|
@ -208,6 +208,7 @@ static struct clk_lookup pxa25x_clkregs[] = {
|
||||||
INIT_CLKREG(&clk_pxa25x_gpio11, NULL, "GPIO11_CLK"),
|
INIT_CLKREG(&clk_pxa25x_gpio11, NULL, "GPIO11_CLK"),
|
||||||
INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"),
|
INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"),
|
||||||
INIT_CLKREG(&clk_pxa25x_mem, "pxa2xx-pcmcia", NULL),
|
INIT_CLKREG(&clk_pxa25x_mem, "pxa2xx-pcmcia", NULL),
|
||||||
|
INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk_lookup pxa25x_hwuart_clkreg =
|
static struct clk_lookup pxa25x_hwuart_clkreg =
|
||||||
|
@ -367,7 +368,6 @@ static int __init pxa25x_init(void)
|
||||||
|
|
||||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||||
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
|
||||||
register_syscore_ops(&pxa2xx_clock_syscore_ops);
|
register_syscore_ops(&pxa2xx_clock_syscore_ops);
|
||||||
|
|
||||||
ret = platform_add_devices(pxa25x_devices,
|
ret = platform_add_devices(pxa25x_devices,
|
||||||
|
|
|
@ -229,6 +229,7 @@ static struct clk_lookup pxa27x_clkregs[] = {
|
||||||
INIT_CLKREG(&clk_pxa27x_im, NULL, "IMCLK"),
|
INIT_CLKREG(&clk_pxa27x_im, NULL, "IMCLK"),
|
||||||
INIT_CLKREG(&clk_pxa27x_memc, NULL, "MEMCLK"),
|
INIT_CLKREG(&clk_pxa27x_memc, NULL, "MEMCLK"),
|
||||||
INIT_CLKREG(&clk_pxa27x_mem, "pxa2xx-pcmcia", NULL),
|
INIT_CLKREG(&clk_pxa27x_mem, "pxa2xx-pcmcia", NULL),
|
||||||
|
INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL),
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
@ -455,7 +456,6 @@ static int __init pxa27x_init(void)
|
||||||
|
|
||||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||||
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
|
||||||
register_syscore_ops(&pxa2xx_clock_syscore_ops);
|
register_syscore_ops(&pxa2xx_clock_syscore_ops);
|
||||||
|
|
||||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
|
|
|
@ -462,7 +462,6 @@ static int __init pxa3xx_init(void)
|
||||||
|
|
||||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||||
register_syscore_ops(&pxa3xx_mfp_syscore_ops);
|
register_syscore_ops(&pxa3xx_mfp_syscore_ops);
|
||||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
|
||||||
register_syscore_ops(&pxa3xx_clock_syscore_ops);
|
register_syscore_ops(&pxa3xx_clock_syscore_ops);
|
||||||
|
|
||||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
|
|
|
@ -283,7 +283,6 @@ static int __init pxa95x_init(void)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
|
||||||
register_syscore_ops(&pxa3xx_clock_syscore_ops);
|
register_syscore_ops(&pxa3xx_clock_syscore_ops);
|
||||||
|
|
||||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
|
|
|
@ -12,6 +12,6 @@
|
||||||
#ifndef __ARCH_ARM_MACH_S3C2440_COMMON_H
|
#ifndef __ARCH_ARM_MACH_S3C2440_COMMON_H
|
||||||
#define __ARCH_ARM_MACH_S3C2440_COMMON_H
|
#define __ARCH_ARM_MACH_S3C2440_COMMON_H
|
||||||
|
|
||||||
void s3c2440_restart(char mode, const char *cmd);
|
void s3c244x_restart(char mode, const char *cmd);
|
||||||
|
|
||||||
#endif /* __ARCH_ARM_MACH_S3C2440_COMMON_H */
|
#endif /* __ARCH_ARM_MACH_S3C2440_COMMON_H */
|
||||||
|
|
|
@ -487,5 +487,5 @@ MACHINE_START(ANUBIS, "Simtec-Anubis")
|
||||||
.init_machine = anubis_init,
|
.init_machine = anubis_init,
|
||||||
.init_irq = s3c24xx_init_irq,
|
.init_irq = s3c24xx_init_irq,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
.restart = s3c2440_restart,
|
.restart = s3c244x_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -222,5 +222,5 @@ MACHINE_START(AT2440EVB, "AT2440EVB")
|
||||||
.init_machine = at2440evb_init,
|
.init_machine = at2440evb_init,
|
||||||
.init_irq = s3c24xx_init_irq,
|
.init_irq = s3c24xx_init_irq,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
.restart = s3c2440_restart,
|
.restart = s3c244x_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -601,5 +601,5 @@ MACHINE_START(NEO1973_GTA02, "GTA02")
|
||||||
.init_irq = s3c24xx_init_irq,
|
.init_irq = s3c24xx_init_irq,
|
||||||
.init_machine = gta02_machine_init,
|
.init_machine = gta02_machine_init,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
.restart = s3c2440_restart,
|
.restart = s3c244x_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -701,5 +701,5 @@ MACHINE_START(MINI2440, "MINI2440")
|
||||||
.init_machine = mini2440_init,
|
.init_machine = mini2440_init,
|
||||||
.init_irq = s3c24xx_init_irq,
|
.init_irq = s3c24xx_init_irq,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
.restart = s3c2440_restart,
|
.restart = s3c244x_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -158,5 +158,5 @@ MACHINE_START(NEXCODER_2440, "NexVision - Nexcoder 2440")
|
||||||
.init_machine = nexcoder_init,
|
.init_machine = nexcoder_init,
|
||||||
.init_irq = s3c24xx_init_irq,
|
.init_irq = s3c24xx_init_irq,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
.restart = s3c2440_restart,
|
.restart = s3c244x_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -436,5 +436,5 @@ MACHINE_START(OSIRIS, "Simtec-OSIRIS")
|
||||||
.init_irq = s3c24xx_init_irq,
|
.init_irq = s3c24xx_init_irq,
|
||||||
.init_machine = osiris_init,
|
.init_machine = osiris_init,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
.restart = s3c2440_restart,
|
.restart = s3c244x_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -822,5 +822,5 @@ MACHINE_START(RX1950, "HP iPAQ RX1950")
|
||||||
.init_irq = s3c24xx_init_irq,
|
.init_irq = s3c24xx_init_irq,
|
||||||
.init_machine = rx1950_init_machine,
|
.init_machine = rx1950_init_machine,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
.restart = s3c2440_restart,
|
.restart = s3c244x_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -213,5 +213,5 @@ MACHINE_START(RX3715, "IPAQ-RX3715")
|
||||||
.init_irq = rx3715_init_irq,
|
.init_irq = rx3715_init_irq,
|
||||||
.init_machine = rx3715_init_machine,
|
.init_machine = rx3715_init_machine,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
.restart = s3c2440_restart,
|
.restart = s3c244x_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -183,5 +183,5 @@ MACHINE_START(S3C2440, "SMDK2440")
|
||||||
.map_io = smdk2440_map_io,
|
.map_io = smdk2440_map_io,
|
||||||
.init_machine = smdk2440_machine_init,
|
.init_machine = smdk2440_machine_init,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
.restart = s3c2440_restart,
|
.restart = s3c244x_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
#include <plat/cpu.h>
|
#include <plat/cpu.h>
|
||||||
#include <plat/s3c244x.h>
|
#include <plat/s3c244x.h>
|
||||||
#include <plat/pm.h>
|
#include <plat/pm.h>
|
||||||
#include <plat/watchdog-reset.h>
|
|
||||||
|
|
||||||
#include <plat/gpio-core.h>
|
#include <plat/gpio-core.h>
|
||||||
#include <plat/gpio-cfg.h>
|
#include <plat/gpio-cfg.h>
|
||||||
|
@ -74,15 +73,3 @@ void __init s3c2440_map_io(void)
|
||||||
s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up;
|
s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up;
|
||||||
s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up;
|
s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up;
|
||||||
}
|
}
|
||||||
|
|
||||||
void s3c2440_restart(char mode, const char *cmd)
|
|
||||||
{
|
|
||||||
if (mode == 's') {
|
|
||||||
soft_restart(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
arch_wdt_reset();
|
|
||||||
|
|
||||||
/* we'll take a jump through zero as a poor second */
|
|
||||||
soft_restart(0);
|
|
||||||
}
|
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include <plat/pm.h>
|
#include <plat/pm.h>
|
||||||
#include <plat/pll.h>
|
#include <plat/pll.h>
|
||||||
#include <plat/nand-core.h>
|
#include <plat/nand-core.h>
|
||||||
|
#include <plat/watchdog-reset.h>
|
||||||
|
|
||||||
static struct map_desc s3c244x_iodesc[] __initdata = {
|
static struct map_desc s3c244x_iodesc[] __initdata = {
|
||||||
IODESC_ENT(CLKPWR),
|
IODESC_ENT(CLKPWR),
|
||||||
|
@ -196,3 +197,14 @@ struct syscore_ops s3c244x_pm_syscore_ops = {
|
||||||
.suspend = s3c244x_suspend,
|
.suspend = s3c244x_suspend,
|
||||||
.resume = s3c244x_resume,
|
.resume = s3c244x_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void s3c244x_restart(char mode, const char *cmd)
|
||||||
|
{
|
||||||
|
if (mode == 's')
|
||||||
|
soft_restart(0);
|
||||||
|
|
||||||
|
arch_wdt_reset();
|
||||||
|
|
||||||
|
/* we'll take a jump through zero as a poor second */
|
||||||
|
soft_restart(0);
|
||||||
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include <linux/mmc/sh_mobile_sdhi.h>
|
#include <linux/mmc/sh_mobile_sdhi.h>
|
||||||
#include <linux/mfd/tmio.h>
|
#include <linux/mfd/tmio.h>
|
||||||
#include <linux/sh_clk.h>
|
#include <linux/sh_clk.h>
|
||||||
|
#include <linux/videodev2.h>
|
||||||
#include <video/sh_mobile_lcdc.h>
|
#include <video/sh_mobile_lcdc.h>
|
||||||
#include <video/sh_mipi_dsi.h>
|
#include <video/sh_mipi_dsi.h>
|
||||||
#include <sound/sh_fsi.h>
|
#include <sound/sh_fsi.h>
|
||||||
|
|
|
@ -801,7 +801,7 @@ static struct fsi_ak4642_info fsi2_ak4643_info = {
|
||||||
static struct platform_device fsi_ak4643_device = {
|
static struct platform_device fsi_ak4643_device = {
|
||||||
.name = "fsi-ak4642-audio",
|
.name = "fsi-ak4642-audio",
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = &fsi_info,
|
.platform_data = &fsi2_ak4643_info,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/smsc911x.h>
|
#include <linux/smsc911x.h>
|
||||||
|
#include <linux/videodev2.h>
|
||||||
#include <mach/common.h>
|
#include <mach/common.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
@ -241,7 +242,7 @@ static struct sh_mobile_lcdc_info lcdc0_info = {
|
||||||
.clock_source = LCDC_CLK_BUS,
|
.clock_source = LCDC_CLK_BUS,
|
||||||
.ch[0] = {
|
.ch[0] = {
|
||||||
.chan = LCDC_CHAN_MAINLCD,
|
.chan = LCDC_CHAN_MAINLCD,
|
||||||
.bpp = 16,
|
.fourcc = V4L2_PIX_FMT_RGB565,
|
||||||
.interface_type = RGB24,
|
.interface_type = RGB24,
|
||||||
.clock_divider = 5,
|
.clock_divider = 5,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
|
|
|
@ -1346,6 +1346,10 @@ static struct map_desc mackerel_io_desc[] __initdata = {
|
||||||
static void __init mackerel_map_io(void)
|
static void __init mackerel_map_io(void)
|
||||||
{
|
{
|
||||||
iotable_init(mackerel_io_desc, ARRAY_SIZE(mackerel_io_desc));
|
iotable_init(mackerel_io_desc, ARRAY_SIZE(mackerel_io_desc));
|
||||||
|
/* DMA memory at 0xff200000 - 0xffdfffff. The default 2MB size isn't
|
||||||
|
* enough to allocate the frame buffer memory.
|
||||||
|
*/
|
||||||
|
init_consistent_dma_size(12 << 20);
|
||||||
|
|
||||||
/* setup early devices and console here as well */
|
/* setup early devices and console here as well */
|
||||||
sh7372_add_early_devices();
|
sh7372_add_early_devices();
|
||||||
|
|
|
@ -5,7 +5,7 @@ config UX500_SOC_COMMON
|
||||||
default y
|
default y
|
||||||
select ARM_GIC
|
select ARM_GIC
|
||||||
select HAS_MTU
|
select HAS_MTU
|
||||||
select ARM_ERRATA_753970
|
select PL310_ERRATA_753970
|
||||||
select ARM_ERRATA_754322
|
select ARM_ERRATA_754322
|
||||||
select ARM_ERRATA_764369
|
select ARM_ERRATA_764369
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ config ARCH_VEXPRESS_CA9X4
|
||||||
select ARM_GIC
|
select ARM_GIC
|
||||||
select ARM_ERRATA_720789
|
select ARM_ERRATA_720789
|
||||||
select ARM_ERRATA_751472
|
select ARM_ERRATA_751472
|
||||||
select ARM_ERRATA_753970
|
select PL310_ERRATA_753970
|
||||||
select HAVE_SMP
|
select HAVE_SMP
|
||||||
select MIGHT_HAVE_CACHE_L2X0
|
select MIGHT_HAVE_CACHE_L2X0
|
||||||
|
|
||||||
|
|
|
@ -230,9 +230,7 @@ __v7_setup:
|
||||||
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ARM_ERRATA_743622
|
#ifdef CONFIG_ARM_ERRATA_743622
|
||||||
teq r6, #0x20 @ present in r2p0
|
teq r5, #0x00200000 @ only present in r2p*
|
||||||
teqne r6, #0x21 @ present in r2p1
|
|
||||||
teqne r6, #0x22 @ present in r2p2
|
|
||||||
mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||||
orreq r10, r10, #1 << 6 @ set bit #6
|
orreq r10, r10, #1 << 6 @ set bit #6
|
||||||
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||||
|
|
|
@ -428,8 +428,16 @@
|
||||||
#define OMAP_GPMC_NR_IRQS 8
|
#define OMAP_GPMC_NR_IRQS 8
|
||||||
#define OMAP_GPMC_IRQ_END (OMAP_GPMC_IRQ_BASE + OMAP_GPMC_NR_IRQS)
|
#define OMAP_GPMC_IRQ_END (OMAP_GPMC_IRQ_BASE + OMAP_GPMC_NR_IRQS)
|
||||||
|
|
||||||
|
/* PRCM IRQ handler */
|
||||||
|
#ifdef CONFIG_ARCH_OMAP2PLUS
|
||||||
|
#define OMAP_PRCM_IRQ_BASE (OMAP_GPMC_IRQ_END)
|
||||||
|
#define OMAP_PRCM_NR_IRQS 64
|
||||||
|
#define OMAP_PRCM_IRQ_END (OMAP_PRCM_IRQ_BASE + OMAP_PRCM_NR_IRQS)
|
||||||
|
#else
|
||||||
|
#define OMAP_PRCM_IRQ_END OMAP_GPMC_IRQ_END
|
||||||
|
#endif
|
||||||
|
|
||||||
#define NR_IRQS OMAP_GPMC_IRQ_END
|
#define NR_IRQS OMAP_PRCM_IRQ_END
|
||||||
|
|
||||||
#define OMAP_IRQ_BIT(irq) (1 << ((irq) % 32))
|
#define OMAP_IRQ_BIT(irq) (1 << ((irq) % 32))
|
||||||
|
|
||||||
|
|
|
@ -1249,7 +1249,7 @@ static void s3c2410_dma_resume(void)
|
||||||
struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1;
|
struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1;
|
||||||
int channel;
|
int channel;
|
||||||
|
|
||||||
for (channel = dma_channels - 1; channel >= 0; cp++, channel--)
|
for (channel = dma_channels - 1; channel >= 0; cp--, channel--)
|
||||||
s3c2410_dma_resume_chan(cp);
|
s3c2410_dma_resume_chan(cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1409,7 +1409,7 @@ void __init s5p_ehci_set_platdata(struct s5p_ehci_platdata *pd)
|
||||||
|
|
||||||
#ifdef CONFIG_S3C_DEV_USB_HSOTG
|
#ifdef CONFIG_S3C_DEV_USB_HSOTG
|
||||||
static struct resource s3c_usb_hsotg_resources[] = {
|
static struct resource s3c_usb_hsotg_resources[] = {
|
||||||
[0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_16K),
|
[0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_128K),
|
||||||
[1] = DEFINE_RES_IRQ(IRQ_OTG),
|
[1] = DEFINE_RES_IRQ(IRQ_OTG),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -145,11 +145,13 @@ static void clockevent_set_mode(enum clock_event_mode mode,
|
||||||
static int clockevent_next_event(unsigned long cycles,
|
static int clockevent_next_event(unsigned long cycles,
|
||||||
struct clock_event_device *clk_event_dev)
|
struct clock_event_device *clk_event_dev)
|
||||||
{
|
{
|
||||||
u16 val;
|
u16 val = readw(gpt_base + CR(CLKEVT));
|
||||||
|
|
||||||
|
if (val & CTRL_ENABLE)
|
||||||
|
writew(val & ~CTRL_ENABLE, gpt_base + CR(CLKEVT));
|
||||||
|
|
||||||
writew(cycles, gpt_base + LOAD(CLKEVT));
|
writew(cycles, gpt_base + LOAD(CLKEVT));
|
||||||
|
|
||||||
val = readw(gpt_base + CR(CLKEVT));
|
|
||||||
val |= CTRL_ENABLE | CTRL_INT_ENABLE;
|
val |= CTRL_ENABLE | CTRL_INT_ENABLE;
|
||||||
writew(val, gpt_base + CR(CLKEVT));
|
writew(val, gpt_base + CR(CLKEVT));
|
||||||
|
|
||||||
|
|
|
@ -122,8 +122,8 @@ extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
|
||||||
|
|
||||||
extern unsigned long get_wchan(struct task_struct *p);
|
extern unsigned long get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
#define KSTK_EIP(tsk) (task_pt_regs(task)->pc)
|
#define KSTK_EIP(task) (task_pt_regs(task)->pc)
|
||||||
#define KSTK_ESP(tsk) (task_pt_regs(task)->sp)
|
#define KSTK_ESP(task) (task_pt_regs(task)->sp)
|
||||||
|
|
||||||
#define cpu_relax() do { } while (0)
|
#define cpu_relax() do { } while (0)
|
||||||
|
|
||||||
|
|
|
@ -717,33 +717,6 @@ ENTRY(sys_ftruncate64_c6x)
|
||||||
#endif
|
#endif
|
||||||
ENDPROC(sys_ftruncate64_c6x)
|
ENDPROC(sys_ftruncate64_c6x)
|
||||||
|
|
||||||
#ifdef __ARCH_WANT_SYSCALL_OFF_T
|
|
||||||
;; On Entry
|
|
||||||
;; A4 - fd
|
|
||||||
;; B4 - offset_lo (LE), offset_hi (BE)
|
|
||||||
;; A6 - offset_lo (BE), offset_hi (LE)
|
|
||||||
;; B6 - len
|
|
||||||
;; A8 - advice
|
|
||||||
ENTRY(sys_fadvise64_c6x)
|
|
||||||
#ifdef CONFIG_C6X_BIG_KERNEL
|
|
||||||
MVKL .S1 sys_fadvise64,A0
|
|
||||||
MVKH .S1 sys_fadvise64,A0
|
|
||||||
BNOP .S2X A0,2
|
|
||||||
#else
|
|
||||||
B .S2 sys_fadvise64
|
|
||||||
NOP 2
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_CPU_BIG_ENDIAN
|
|
||||||
MV .L2 B4,B5
|
|
||||||
|| MV .D2X A6,B4
|
|
||||||
#else
|
|
||||||
MV .D2X A6,B5
|
|
||||||
#endif
|
|
||||||
MV .D1X B6,A6
|
|
||||||
MV .D2X A8,B6
|
|
||||||
#endif
|
|
||||||
ENDPROC(sys_fadvise64_c6x)
|
|
||||||
|
|
||||||
;; On Entry
|
;; On Entry
|
||||||
;; A4 - fd
|
;; A4 - fd
|
||||||
;; B4 - offset_lo (LE), offset_hi (BE)
|
;; B4 - offset_lo (LE), offset_hi (BE)
|
||||||
|
|
|
@ -146,7 +146,7 @@ static int __init alchemy_time_init(unsigned int m2int)
|
||||||
cd->shift = 32;
|
cd->shift = 32;
|
||||||
cd->mult = div_sc(32768, NSEC_PER_SEC, cd->shift);
|
cd->mult = div_sc(32768, NSEC_PER_SEC, cd->shift);
|
||||||
cd->max_delta_ns = clockevent_delta2ns(0xffffffff, cd);
|
cd->max_delta_ns = clockevent_delta2ns(0xffffffff, cd);
|
||||||
cd->min_delta_ns = clockevent_delta2ns(8, cd); /* ~0.25ms */
|
cd->min_delta_ns = clockevent_delta2ns(9, cd); /* ~0.28ms */
|
||||||
clockevents_register_device(cd);
|
clockevents_register_device(cd);
|
||||||
setup_irq(m2int, &au1x_rtcmatch2_irqaction);
|
setup_irq(m2int, &au1x_rtcmatch2_irqaction);
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ void __init ath79_register_wmac(u8 *cal_data)
|
||||||
{
|
{
|
||||||
if (soc_is_ar913x())
|
if (soc_is_ar913x())
|
||||||
ar913x_wmac_setup();
|
ar913x_wmac_setup();
|
||||||
if (soc_is_ar933x())
|
else if (soc_is_ar933x())
|
||||||
ar933x_wmac_setup();
|
ar933x_wmac_setup();
|
||||||
else
|
else
|
||||||
BUG();
|
BUG();
|
||||||
|
|
|
@ -8,7 +8,7 @@ CONFIG_HIGH_RES_TIMERS=y
|
||||||
# CONFIG_SECCOMP is not set
|
# CONFIG_SECCOMP is not set
|
||||||
CONFIG_USE_OF=y
|
CONFIG_USE_OF=y
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
CONFIG_CROSS_COMPILE="mips-linux-gnu-"
|
CONFIG_CROSS_COMPILE=""
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
|
@ -22,7 +22,7 @@ CONFIG_AUDIT=y
|
||||||
CONFIG_CGROUPS=y
|
CONFIG_CGROUPS=y
|
||||||
CONFIG_NAMESPACES=y
|
CONFIG_NAMESPACES=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_INITRAMFS_SOURCE="usr/dev_file_list usr/rootfs.xlp"
|
CONFIG_INITRAMFS_SOURCE=""
|
||||||
CONFIG_RD_BZIP2=y
|
CONFIG_RD_BZIP2=y
|
||||||
CONFIG_RD_LZMA=y
|
CONFIG_RD_LZMA=y
|
||||||
CONFIG_INITRAMFS_COMPRESSION_LZMA=y
|
CONFIG_INITRAMFS_COMPRESSION_LZMA=y
|
||||||
|
|
|
@ -8,7 +8,7 @@ CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_PREEMPT_VOLUNTARY=y
|
CONFIG_PREEMPT_VOLUNTARY=y
|
||||||
CONFIG_KEXEC=y
|
CONFIG_KEXEC=y
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
CONFIG_CROSS_COMPILE="mips-linux-gnu-"
|
CONFIG_CROSS_COMPILE=""
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
|
@ -22,7 +22,7 @@ CONFIG_AUDIT=y
|
||||||
CONFIG_NAMESPACES=y
|
CONFIG_NAMESPACES=y
|
||||||
CONFIG_SCHED_AUTOGROUP=y
|
CONFIG_SCHED_AUTOGROUP=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_INITRAMFS_SOURCE="usr/dev_file_list usr/rootfs.xlr"
|
CONFIG_INITRAMFS_SOURCE=""
|
||||||
CONFIG_RD_BZIP2=y
|
CONFIG_RD_BZIP2=y
|
||||||
CONFIG_RD_LZMA=y
|
CONFIG_RD_LZMA=y
|
||||||
CONFIG_INITRAMFS_COMPRESSION_GZIP=y
|
CONFIG_INITRAMFS_COMPRESSION_GZIP=y
|
||||||
|
|
|
@ -6,7 +6,7 @@ CONFIG_HZ_1000=y
|
||||||
CONFIG_PREEMPT=y
|
CONFIG_PREEMPT=y
|
||||||
# CONFIG_SECCOMP is not set
|
# CONFIG_SECCOMP is not set
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
CONFIG_CROSS_COMPILE="mips-linux-"
|
CONFIG_CROSS_COMPILE=""
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_LOG_BUF_SHIFT=16
|
CONFIG_LOG_BUF_SHIFT=16
|
||||||
|
|
|
@ -11,6 +11,9 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/mach-au1x00/au1000.h>
|
#include <asm/mach-au1x00/au1000.h>
|
||||||
|
|
||||||
|
struct gpio;
|
||||||
|
struct gpio_chip;
|
||||||
|
|
||||||
/* with the current GPIC design, up to 128 GPIOs are possible.
|
/* with the current GPIC design, up to 128 GPIOs are possible.
|
||||||
* The only implementation so far is in the Au1300, which has 75 externally
|
* The only implementation so far is in the Au1300, which has 75 externally
|
||||||
* available GPIOs.
|
* available GPIOs.
|
||||||
|
@ -203,7 +206,22 @@ static inline int gpio_request(unsigned int gpio, const char *label)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gpio_free(unsigned int gpio)
|
static inline int gpio_request_one(unsigned gpio,
|
||||||
|
unsigned long flags, const char *label)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int gpio_request_array(struct gpio *array, size_t num)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void gpio_free(unsigned gpio)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void gpio_free_array(struct gpio *array, size_t num)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,9 +39,6 @@
|
||||||
#define HPAGE_MASK (~(HPAGE_SIZE - 1))
|
#define HPAGE_MASK (~(HPAGE_SIZE - 1))
|
||||||
#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
|
#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
|
||||||
#else /* !CONFIG_HUGETLB_PAGE */
|
#else /* !CONFIG_HUGETLB_PAGE */
|
||||||
# ifndef BUILD_BUG
|
|
||||||
# define BUILD_BUG() do { extern void __build_bug(void); __build_bug(); } while (0)
|
|
||||||
# endif
|
|
||||||
#define HPAGE_SHIFT ({BUILD_BUG(); 0; })
|
#define HPAGE_SHIFT ({BUILD_BUG(); 0; })
|
||||||
#define HPAGE_SIZE ({BUILD_BUG(); 0; })
|
#define HPAGE_SIZE ({BUILD_BUG(); 0; })
|
||||||
#define HPAGE_MASK ({BUILD_BUG(); 0; })
|
#define HPAGE_MASK ({BUILD_BUG(); 0; })
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
* SMP support for BMIPS
|
* SMP support for BMIPS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/version.h>
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
|
|
@ -1135,7 +1135,7 @@ asmlinkage void do_mt(struct pt_regs *regs)
|
||||||
printk(KERN_DEBUG "YIELD Scheduler Exception\n");
|
printk(KERN_DEBUG "YIELD Scheduler Exception\n");
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
printk(KERN_DEBUG "Gating Storage Schedulier Exception\n");
|
printk(KERN_DEBUG "Gating Storage Scheduler Exception\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_DEBUG "*** UNKNOWN THREAD EXCEPTION %d ***\n",
|
printk(KERN_DEBUG "*** UNKNOWN THREAD EXCEPTION %d ***\n",
|
||||||
|
|
|
@ -69,7 +69,6 @@ SECTIONS
|
||||||
RODATA
|
RODATA
|
||||||
|
|
||||||
/* writeable */
|
/* writeable */
|
||||||
_sdata = .; /* Start of data section */
|
|
||||||
.data : { /* Data */
|
.data : { /* Data */
|
||||||
. = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */
|
. = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,8 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long writ
|
||||||
const int field = sizeof(unsigned long) * 2;
|
const int field = sizeof(unsigned long) * 2;
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
int fault;
|
int fault;
|
||||||
|
unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
|
||||||
|
(write ? FAULT_FLAG_WRITE : 0);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
printk("Cpu%d[%s:%d:%0*lx:%ld:%0*lx]\n", raw_smp_processor_id(),
|
printk("Cpu%d[%s:%d:%0*lx:%ld:%0*lx]\n", raw_smp_processor_id(),
|
||||||
|
@ -91,6 +93,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long writ
|
||||||
if (in_atomic() || !mm)
|
if (in_atomic() || !mm)
|
||||||
goto bad_area_nosemaphore;
|
goto bad_area_nosemaphore;
|
||||||
|
|
||||||
|
retry:
|
||||||
down_read(&mm->mmap_sem);
|
down_read(&mm->mmap_sem);
|
||||||
vma = find_vma(mm, address);
|
vma = find_vma(mm, address);
|
||||||
if (!vma)
|
if (!vma)
|
||||||
|
@ -144,7 +147,11 @@ good_area:
|
||||||
* make sure we exit gracefully rather than endlessly redo
|
* make sure we exit gracefully rather than endlessly redo
|
||||||
* the fault.
|
* the fault.
|
||||||
*/
|
*/
|
||||||
fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0);
|
fault = handle_mm_fault(mm, vma, address, flags);
|
||||||
|
|
||||||
|
if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
|
||||||
|
return;
|
||||||
|
|
||||||
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
|
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
|
||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
|
@ -153,12 +160,27 @@ good_area:
|
||||||
goto do_sigbus;
|
goto do_sigbus;
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
if (fault & VM_FAULT_MAJOR) {
|
if (flags & FAULT_FLAG_ALLOW_RETRY) {
|
||||||
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address);
|
if (fault & VM_FAULT_MAJOR) {
|
||||||
tsk->maj_flt++;
|
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1,
|
||||||
} else {
|
regs, address);
|
||||||
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address);
|
tsk->maj_flt++;
|
||||||
tsk->min_flt++;
|
} else {
|
||||||
|
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1,
|
||||||
|
regs, address);
|
||||||
|
tsk->min_flt++;
|
||||||
|
}
|
||||||
|
if (fault & VM_FAULT_RETRY) {
|
||||||
|
flags &= ~FAULT_FLAG_ALLOW_RETRY;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* No need to up_read(&mm->mmap_sem) as we would
|
||||||
|
* have already released it in __lock_page_or_retry
|
||||||
|
* in mm/filemap.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
up_read(&mm->mmap_sem);
|
up_read(&mm->mmap_sem);
|
||||||
|
|
|
@ -279,7 +279,6 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)
|
||||||
{
|
{
|
||||||
/* Propagate hose info into the subordinate devices. */
|
/* Propagate hose info into the subordinate devices. */
|
||||||
|
|
||||||
struct list_head *ln;
|
|
||||||
struct pci_dev *dev = bus->self;
|
struct pci_dev *dev = bus->self;
|
||||||
|
|
||||||
if (pci_probe_only && dev &&
|
if (pci_probe_only && dev &&
|
||||||
|
@ -288,9 +287,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)
|
||||||
pcibios_fixup_device_resources(dev, bus);
|
pcibios_fixup_device_resources(dev, bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) {
|
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||||
dev = pci_dev_b(ln);
|
|
||||||
|
|
||||||
if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI)
|
if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI)
|
||||||
pcibios_fixup_device_resources(dev, bus);
|
pcibios_fixup_device_resources(dev, bus);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,16 +35,6 @@
|
||||||
*/
|
*/
|
||||||
void __init titan_ht_pcibios_fixup_bus(struct pci_bus *bus)
|
void __init titan_ht_pcibios_fixup_bus(struct pci_bus *bus)
|
||||||
{
|
{
|
||||||
struct pci_bus *current_bus = bus;
|
|
||||||
struct pci_dev *devices;
|
|
||||||
struct list_head *devices_link;
|
|
||||||
|
|
||||||
list_for_each(devices_link, &(current_bus->devices)) {
|
|
||||||
devices = pci_dev_b(devices_link);
|
|
||||||
if (devices == NULL)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PLX and SPKT related changes go here
|
* PLX and SPKT related changes go here
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -102,7 +102,7 @@ static int __init tx_7segled_init_sysfs(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
dev->id = i;
|
dev->id = i;
|
||||||
dev->dev = &tx_7segled_subsys;
|
dev->bus = &tx_7segled_subsys;
|
||||||
error = device_register(dev);
|
error = device_register(dev);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
device_create_file(dev, &dev_attr_ascii);
|
device_create_file(dev, &dev_attr_ascii);
|
||||||
|
|
|
@ -66,6 +66,7 @@ vector = 0
|
||||||
.long exception_entry0 + vector * 6
|
.long exception_entry0 + vector * 6
|
||||||
vector = vector + 1
|
vector = vector + 1
|
||||||
.endr
|
.endr
|
||||||
|
vector = 0
|
||||||
.rept 256
|
.rept 256
|
||||||
.long exception_entry1 + vector * 6
|
.long exception_entry1 + vector * 6
|
||||||
vector = vector + 1
|
vector = vector + 1
|
||||||
|
|
|
@ -79,7 +79,7 @@ struct clk div4_clks[DIV4_NR] = {
|
||||||
#define MSTPCR1 0xffc80034
|
#define MSTPCR1 0xffc80034
|
||||||
#define MSTPCR2 0xffc10028
|
#define MSTPCR2 0xffc10028
|
||||||
|
|
||||||
enum { MSTP004, MSTP000, MSTP114, MSTP113, MSTP112,
|
enum { MSTP004, MSTP000, MSTP127, MSTP114, MSTP113, MSTP112,
|
||||||
MSTP111, MSTP110, MSTP103, MSTP102, MSTP220,
|
MSTP111, MSTP110, MSTP103, MSTP102, MSTP220,
|
||||||
MSTP_NR };
|
MSTP_NR };
|
||||||
|
|
||||||
|
@ -89,6 +89,7 @@ static struct clk mstp_clks[MSTP_NR] = {
|
||||||
[MSTP000] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 0, 0),
|
[MSTP000] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 0, 0),
|
||||||
|
|
||||||
/* MSTPCR1 */
|
/* MSTPCR1 */
|
||||||
|
[MSTP127] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 27, 0),
|
||||||
[MSTP114] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 14, 0),
|
[MSTP114] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 14, 0),
|
||||||
[MSTP113] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 13, 0),
|
[MSTP113] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 13, 0),
|
||||||
[MSTP112] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 12, 0),
|
[MSTP112] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1, 12, 0),
|
||||||
|
@ -131,6 +132,7 @@ static struct clk_lookup lookups[] = {
|
||||||
CLKDEV_CON_ID("usb_fck", &mstp_clks[MSTP103]),
|
CLKDEV_CON_ID("usb_fck", &mstp_clks[MSTP103]),
|
||||||
CLKDEV_DEV_ID("renesas_usbhs.0", &mstp_clks[MSTP102]),
|
CLKDEV_DEV_ID("renesas_usbhs.0", &mstp_clks[MSTP102]),
|
||||||
CLKDEV_CON_ID("mmc0", &mstp_clks[MSTP220]),
|
CLKDEV_CON_ID("mmc0", &mstp_clks[MSTP220]),
|
||||||
|
CLKDEV_CON_ID("rspi2", &mstp_clks[MSTP127]),
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init arch_clk_init(void)
|
int __init arch_clk_init(void)
|
||||||
|
|
|
@ -156,7 +156,7 @@ static struct clk_lookup lookups[] = {
|
||||||
CLKDEV_CON_ID("siof_fck", &mstp_clks[MSTP003]),
|
CLKDEV_CON_ID("siof_fck", &mstp_clks[MSTP003]),
|
||||||
CLKDEV_CON_ID("hspi_fck", &mstp_clks[MSTP002]),
|
CLKDEV_CON_ID("hspi_fck", &mstp_clks[MSTP002]),
|
||||||
CLKDEV_CON_ID("hudi_fck", &mstp_clks[MSTP119]),
|
CLKDEV_CON_ID("hudi_fck", &mstp_clks[MSTP119]),
|
||||||
CLKDEV_CON_ID("ubc_fck", &mstp_clks[MSTP117]),
|
CLKDEV_CON_ID("ubc0", &mstp_clks[MSTP117]),
|
||||||
CLKDEV_CON_ID("dmac_11_6_fck", &mstp_clks[MSTP105]),
|
CLKDEV_CON_ID("dmac_11_6_fck", &mstp_clks[MSTP105]),
|
||||||
CLKDEV_CON_ID("dmac_5_0_fck", &mstp_clks[MSTP104]),
|
CLKDEV_CON_ID("dmac_5_0_fck", &mstp_clks[MSTP104]),
|
||||||
CLKDEV_CON_ID("gdta_fck", &mstp_clks[MSTP100]),
|
CLKDEV_CON_ID("gdta_fck", &mstp_clks[MSTP100]),
|
||||||
|
|
|
@ -31,7 +31,7 @@ UTS_MACHINE := sparc
|
||||||
|
|
||||||
#KBUILD_CFLAGS += -g -pipe -fcall-used-g5 -fcall-used-g7
|
#KBUILD_CFLAGS += -g -pipe -fcall-used-g5 -fcall-used-g7
|
||||||
KBUILD_CFLAGS += -m32 -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7
|
KBUILD_CFLAGS += -m32 -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7
|
||||||
KBUILD_AFLAGS += -m32
|
KBUILD_AFLAGS += -m32 -Wa,-Av8
|
||||||
|
|
||||||
#LDFLAGS_vmlinux = -N -Ttext 0xf0004000
|
#LDFLAGS_vmlinux = -N -Ttext 0xf0004000
|
||||||
# Since 2.5.40, the first stage is left not btfix-ed.
|
# Since 2.5.40, the first stage is left not btfix-ed.
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -303,10 +303,7 @@ long compat_sys_rt_sigreturn(struct pt_regs *regs)
|
||||||
goto badframe;
|
goto badframe;
|
||||||
|
|
||||||
sigdelsetmask(&set, ~_BLOCKABLE);
|
sigdelsetmask(&set, ~_BLOCKABLE);
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
set_current_blocked(&set);
|
||||||
current->blocked = set;
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
|
|
||||||
if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
|
if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
|
|
|
@ -97,10 +97,7 @@ SYSCALL_DEFINE1(rt_sigreturn, struct pt_regs *, regs)
|
||||||
goto badframe;
|
goto badframe;
|
||||||
|
|
||||||
sigdelsetmask(&set, ~_BLOCKABLE);
|
sigdelsetmask(&set, ~_BLOCKABLE);
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
set_current_blocked(&set);
|
||||||
current->blocked = set;
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
|
|
||||||
if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
|
if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
|
@ -286,13 +283,7 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
|
||||||
* the work_pending path in the return-to-user code, and
|
* the work_pending path in the return-to-user code, and
|
||||||
* either way we can re-enable interrupts unconditionally.
|
* either way we can re-enable interrupts unconditionally.
|
||||||
*/
|
*/
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
block_sigmask(ka, sig);
|
||||||
sigorsets(¤t->blocked,
|
|
||||||
¤t->blocked, &ka->sa.sa_mask);
|
|
||||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
|
||||||
sigaddset(¤t->blocked, sig);
|
|
||||||
recalc_sigpending();
|
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -163,7 +163,7 @@ static int __init create_sysfs_entries(void)
|
||||||
|
|
||||||
#define create_hv_attr(name) \
|
#define create_hv_attr(name) \
|
||||||
if (!err) \
|
if (!err) \
|
||||||
err = sysfs_create_file(hypervisor_kobj, &dev_attr_##name);
|
err = sysfs_create_file(hypervisor_kobj, &dev_attr_##name.attr);
|
||||||
create_hv_attr(type);
|
create_hv_attr(type);
|
||||||
create_hv_attr(version);
|
create_hv_attr(version);
|
||||||
create_hv_attr(config_version);
|
create_hv_attr(config_version);
|
||||||
|
|
|
@ -144,7 +144,7 @@ void arch_read_unlock(arch_rwlock_t *rwlock)
|
||||||
for (;;) {
|
for (;;) {
|
||||||
__insn_mtspr(SPR_INTERRUPT_CRITICAL_SECTION, 1);
|
__insn_mtspr(SPR_INTERRUPT_CRITICAL_SECTION, 1);
|
||||||
val = __insn_tns((int *)&rwlock->lock);
|
val = __insn_tns((int *)&rwlock->lock);
|
||||||
if (likely(val & 1) == 0) {
|
if (likely((val & 1) == 0)) {
|
||||||
rwlock->lock = val - (1 << _RD_COUNT_SHIFT);
|
rwlock->lock = val - (1 << _RD_COUNT_SHIFT);
|
||||||
__insn_mtspr(SPR_INTERRUPT_CRITICAL_SECTION, 0);
|
__insn_mtspr(SPR_INTERRUPT_CRITICAL_SECTION, 0);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -315,6 +315,13 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
||||||
current->mm->free_area_cache = TASK_UNMAPPED_BASE;
|
current->mm->free_area_cache = TASK_UNMAPPED_BASE;
|
||||||
current->mm->cached_hole_size = 0;
|
current->mm->cached_hole_size = 0;
|
||||||
|
|
||||||
|
retval = setup_arg_pages(bprm, IA32_STACK_TOP, EXSTACK_DEFAULT);
|
||||||
|
if (retval < 0) {
|
||||||
|
/* Someone check-me: is this error path enough? */
|
||||||
|
send_sig(SIGKILL, current, 0);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
install_exec_creds(bprm);
|
install_exec_creds(bprm);
|
||||||
current->flags &= ~PF_FORKNOEXEC;
|
current->flags &= ~PF_FORKNOEXEC;
|
||||||
|
|
||||||
|
@ -410,13 +417,6 @@ beyond_if:
|
||||||
|
|
||||||
set_brk(current->mm->start_brk, current->mm->brk);
|
set_brk(current->mm->start_brk, current->mm->brk);
|
||||||
|
|
||||||
retval = setup_arg_pages(bprm, IA32_STACK_TOP, EXSTACK_DEFAULT);
|
|
||||||
if (retval < 0) {
|
|
||||||
/* Someone check-me: is this error path enough? */
|
|
||||||
send_sig(SIGKILL, current, 0);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
current->mm->start_stack =
|
current->mm->start_stack =
|
||||||
(unsigned long)create_aout_tables((char __user *)bprm->p, bprm);
|
(unsigned long)create_aout_tables((char __user *)bprm->p, bprm);
|
||||||
/* start thread */
|
/* start thread */
|
||||||
|
|
|
@ -385,14 +385,15 @@ static __initconst const u64 westmere_hw_cache_event_ids
|
||||||
#define NHM_LOCAL_DRAM (1 << 14)
|
#define NHM_LOCAL_DRAM (1 << 14)
|
||||||
#define NHM_NON_DRAM (1 << 15)
|
#define NHM_NON_DRAM (1 << 15)
|
||||||
|
|
||||||
#define NHM_ALL_DRAM (NHM_REMOTE_DRAM|NHM_LOCAL_DRAM)
|
#define NHM_LOCAL (NHM_LOCAL_DRAM|NHM_REMOTE_CACHE_FWD)
|
||||||
|
#define NHM_REMOTE (NHM_REMOTE_DRAM)
|
||||||
|
|
||||||
#define NHM_DMND_READ (NHM_DMND_DATA_RD)
|
#define NHM_DMND_READ (NHM_DMND_DATA_RD)
|
||||||
#define NHM_DMND_WRITE (NHM_DMND_RFO|NHM_DMND_WB)
|
#define NHM_DMND_WRITE (NHM_DMND_RFO|NHM_DMND_WB)
|
||||||
#define NHM_DMND_PREFETCH (NHM_PF_DATA_RD|NHM_PF_DATA_RFO)
|
#define NHM_DMND_PREFETCH (NHM_PF_DATA_RD|NHM_PF_DATA_RFO)
|
||||||
|
|
||||||
#define NHM_L3_HIT (NHM_UNCORE_HIT|NHM_OTHER_CORE_HIT_SNP|NHM_OTHER_CORE_HITM)
|
#define NHM_L3_HIT (NHM_UNCORE_HIT|NHM_OTHER_CORE_HIT_SNP|NHM_OTHER_CORE_HITM)
|
||||||
#define NHM_L3_MISS (NHM_NON_DRAM|NHM_ALL_DRAM|NHM_REMOTE_CACHE_FWD)
|
#define NHM_L3_MISS (NHM_NON_DRAM|NHM_LOCAL_DRAM|NHM_REMOTE_DRAM|NHM_REMOTE_CACHE_FWD)
|
||||||
#define NHM_L3_ACCESS (NHM_L3_HIT|NHM_L3_MISS)
|
#define NHM_L3_ACCESS (NHM_L3_HIT|NHM_L3_MISS)
|
||||||
|
|
||||||
static __initconst const u64 nehalem_hw_cache_extra_regs
|
static __initconst const u64 nehalem_hw_cache_extra_regs
|
||||||
|
@ -416,16 +417,16 @@ static __initconst const u64 nehalem_hw_cache_extra_regs
|
||||||
},
|
},
|
||||||
[ C(NODE) ] = {
|
[ C(NODE) ] = {
|
||||||
[ C(OP_READ) ] = {
|
[ C(OP_READ) ] = {
|
||||||
[ C(RESULT_ACCESS) ] = NHM_DMND_READ|NHM_ALL_DRAM,
|
[ C(RESULT_ACCESS) ] = NHM_DMND_READ|NHM_LOCAL|NHM_REMOTE,
|
||||||
[ C(RESULT_MISS) ] = NHM_DMND_READ|NHM_REMOTE_DRAM,
|
[ C(RESULT_MISS) ] = NHM_DMND_READ|NHM_REMOTE,
|
||||||
},
|
},
|
||||||
[ C(OP_WRITE) ] = {
|
[ C(OP_WRITE) ] = {
|
||||||
[ C(RESULT_ACCESS) ] = NHM_DMND_WRITE|NHM_ALL_DRAM,
|
[ C(RESULT_ACCESS) ] = NHM_DMND_WRITE|NHM_LOCAL|NHM_REMOTE,
|
||||||
[ C(RESULT_MISS) ] = NHM_DMND_WRITE|NHM_REMOTE_DRAM,
|
[ C(RESULT_MISS) ] = NHM_DMND_WRITE|NHM_REMOTE,
|
||||||
},
|
},
|
||||||
[ C(OP_PREFETCH) ] = {
|
[ C(OP_PREFETCH) ] = {
|
||||||
[ C(RESULT_ACCESS) ] = NHM_DMND_PREFETCH|NHM_ALL_DRAM,
|
[ C(RESULT_ACCESS) ] = NHM_DMND_PREFETCH|NHM_LOCAL|NHM_REMOTE,
|
||||||
[ C(RESULT_MISS) ] = NHM_DMND_PREFETCH|NHM_REMOTE_DRAM,
|
[ C(RESULT_MISS) ] = NHM_DMND_PREFETCH|NHM_REMOTE,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -48,9 +48,9 @@ static void delay_loop(unsigned long loops)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TSC based delay: */
|
/* TSC based delay: */
|
||||||
static void delay_tsc(unsigned long loops)
|
static void delay_tsc(unsigned long __loops)
|
||||||
{
|
{
|
||||||
unsigned long bclock, now;
|
u32 bclock, now, loops = __loops;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
|
@ -333,13 +333,15 @@ try_again:
|
||||||
* Lookup failure means no vma is above this address,
|
* Lookup failure means no vma is above this address,
|
||||||
* i.e. return with success:
|
* i.e. return with success:
|
||||||
*/
|
*/
|
||||||
if (!(vma = find_vma_prev(mm, addr, &prev_vma)))
|
vma = find_vma(mm, addr);
|
||||||
|
if (!vma)
|
||||||
return addr;
|
return addr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* new region fits between prev_vma->vm_end and
|
* new region fits between prev_vma->vm_end and
|
||||||
* vma->vm_start, use it:
|
* vma->vm_start, use it:
|
||||||
*/
|
*/
|
||||||
|
prev_vma = vma->vm_prev;
|
||||||
if (addr + len <= vma->vm_start &&
|
if (addr + len <= vma->vm_start &&
|
||||||
(!prev_vma || (addr >= prev_vma->vm_end))) {
|
(!prev_vma || (addr >= prev_vma->vm_end))) {
|
||||||
/* remember the address as a hint for next time */
|
/* remember the address as a hint for next time */
|
||||||
|
|
|
@ -60,6 +60,16 @@ static const struct dmi_system_id pci_use_crs_table[] __initconst = {
|
||||||
DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
|
DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
/* https://bugzilla.kernel.org/show_bug.cgi?id=42619 */
|
||||||
|
{
|
||||||
|
.callback = set_use_crs,
|
||||||
|
.ident = "MSI MS-7253",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
|
||||||
|
DMI_MATCH(DMI_BOARD_NAME, "MS-7253"),
|
||||||
|
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
/* Now for the blacklist.. */
|
/* Now for the blacklist.. */
|
||||||
|
|
||||||
|
@ -282,9 +292,6 @@ static void add_resources(struct pci_root_info *info)
|
||||||
int i;
|
int i;
|
||||||
struct resource *res, *root, *conflict;
|
struct resource *res, *root, *conflict;
|
||||||
|
|
||||||
if (!pci_use_crs)
|
|
||||||
return;
|
|
||||||
|
|
||||||
coalesce_windows(info, IORESOURCE_MEM);
|
coalesce_windows(info, IORESOURCE_MEM);
|
||||||
coalesce_windows(info, IORESOURCE_IO);
|
coalesce_windows(info, IORESOURCE_IO);
|
||||||
|
|
||||||
|
@ -336,8 +343,13 @@ get_current_resources(struct acpi_device *device, int busnum,
|
||||||
acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource,
|
acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource,
|
||||||
&info);
|
&info);
|
||||||
|
|
||||||
add_resources(&info);
|
if (pci_use_crs) {
|
||||||
return;
|
add_resources(&info);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
kfree(info.name);
|
||||||
|
|
||||||
name_alloc_fail:
|
name_alloc_fail:
|
||||||
kfree(info.res);
|
kfree(info.res);
|
||||||
|
|
133
block/blk-ioc.c
133
block/blk-ioc.c
|
@ -36,10 +36,22 @@ static void icq_free_icq_rcu(struct rcu_head *head)
|
||||||
kmem_cache_free(icq->__rcu_icq_cache, icq);
|
kmem_cache_free(icq->__rcu_icq_cache, icq);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Exit an icq. Called with both ioc and q locked. */
|
||||||
* Exit and free an icq. Called with both ioc and q locked.
|
|
||||||
*/
|
|
||||||
static void ioc_exit_icq(struct io_cq *icq)
|
static void ioc_exit_icq(struct io_cq *icq)
|
||||||
|
{
|
||||||
|
struct elevator_type *et = icq->q->elevator->type;
|
||||||
|
|
||||||
|
if (icq->flags & ICQ_EXITED)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (et->ops.elevator_exit_icq_fn)
|
||||||
|
et->ops.elevator_exit_icq_fn(icq);
|
||||||
|
|
||||||
|
icq->flags |= ICQ_EXITED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Release an icq. Called with both ioc and q locked. */
|
||||||
|
static void ioc_destroy_icq(struct io_cq *icq)
|
||||||
{
|
{
|
||||||
struct io_context *ioc = icq->ioc;
|
struct io_context *ioc = icq->ioc;
|
||||||
struct request_queue *q = icq->q;
|
struct request_queue *q = icq->q;
|
||||||
|
@ -60,8 +72,7 @@ static void ioc_exit_icq(struct io_cq *icq)
|
||||||
if (rcu_dereference_raw(ioc->icq_hint) == icq)
|
if (rcu_dereference_raw(ioc->icq_hint) == icq)
|
||||||
rcu_assign_pointer(ioc->icq_hint, NULL);
|
rcu_assign_pointer(ioc->icq_hint, NULL);
|
||||||
|
|
||||||
if (et->ops.elevator_exit_icq_fn)
|
ioc_exit_icq(icq);
|
||||||
et->ops.elevator_exit_icq_fn(icq);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @icq->q might have gone away by the time RCU callback runs
|
* @icq->q might have gone away by the time RCU callback runs
|
||||||
|
@ -79,7 +90,6 @@ static void ioc_release_fn(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct io_context *ioc = container_of(work, struct io_context,
|
struct io_context *ioc = container_of(work, struct io_context,
|
||||||
release_work);
|
release_work);
|
||||||
struct request_queue *last_q = NULL;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -93,44 +103,19 @@ static void ioc_release_fn(struct work_struct *work)
|
||||||
while (!hlist_empty(&ioc->icq_list)) {
|
while (!hlist_empty(&ioc->icq_list)) {
|
||||||
struct io_cq *icq = hlist_entry(ioc->icq_list.first,
|
struct io_cq *icq = hlist_entry(ioc->icq_list.first,
|
||||||
struct io_cq, ioc_node);
|
struct io_cq, ioc_node);
|
||||||
struct request_queue *this_q = icq->q;
|
struct request_queue *q = icq->q;
|
||||||
|
|
||||||
if (this_q != last_q) {
|
if (spin_trylock(q->queue_lock)) {
|
||||||
/*
|
ioc_destroy_icq(icq);
|
||||||
* Need to switch to @this_q. Once we release
|
spin_unlock(q->queue_lock);
|
||||||
* @ioc->lock, it can go away along with @cic.
|
} else {
|
||||||
* Hold on to it.
|
spin_unlock_irqrestore(&ioc->lock, flags);
|
||||||
*/
|
cpu_relax();
|
||||||
__blk_get_queue(this_q);
|
spin_lock_irqsave_nested(&ioc->lock, flags, 1);
|
||||||
|
|
||||||
/*
|
|
||||||
* blk_put_queue() might sleep thanks to kobject
|
|
||||||
* idiocy. Always release both locks, put and
|
|
||||||
* restart.
|
|
||||||
*/
|
|
||||||
if (last_q) {
|
|
||||||
spin_unlock(last_q->queue_lock);
|
|
||||||
spin_unlock_irqrestore(&ioc->lock, flags);
|
|
||||||
blk_put_queue(last_q);
|
|
||||||
} else {
|
|
||||||
spin_unlock_irqrestore(&ioc->lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
last_q = this_q;
|
|
||||||
spin_lock_irqsave(this_q->queue_lock, flags);
|
|
||||||
spin_lock_nested(&ioc->lock, 1);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
ioc_exit_icq(icq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last_q) {
|
spin_unlock_irqrestore(&ioc->lock, flags);
|
||||||
spin_unlock(last_q->queue_lock);
|
|
||||||
spin_unlock_irqrestore(&ioc->lock, flags);
|
|
||||||
blk_put_queue(last_q);
|
|
||||||
} else {
|
|
||||||
spin_unlock_irqrestore(&ioc->lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
kmem_cache_free(iocontext_cachep, ioc);
|
kmem_cache_free(iocontext_cachep, ioc);
|
||||||
}
|
}
|
||||||
|
@ -145,6 +130,7 @@ static void ioc_release_fn(struct work_struct *work)
|
||||||
void put_io_context(struct io_context *ioc)
|
void put_io_context(struct io_context *ioc)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
bool free_ioc = false;
|
||||||
|
|
||||||
if (ioc == NULL)
|
if (ioc == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -159,8 +145,13 @@ void put_io_context(struct io_context *ioc)
|
||||||
spin_lock_irqsave(&ioc->lock, flags);
|
spin_lock_irqsave(&ioc->lock, flags);
|
||||||
if (!hlist_empty(&ioc->icq_list))
|
if (!hlist_empty(&ioc->icq_list))
|
||||||
schedule_work(&ioc->release_work);
|
schedule_work(&ioc->release_work);
|
||||||
|
else
|
||||||
|
free_ioc = true;
|
||||||
spin_unlock_irqrestore(&ioc->lock, flags);
|
spin_unlock_irqrestore(&ioc->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (free_ioc)
|
||||||
|
kmem_cache_free(iocontext_cachep, ioc);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(put_io_context);
|
EXPORT_SYMBOL(put_io_context);
|
||||||
|
|
||||||
|
@ -168,13 +159,41 @@ EXPORT_SYMBOL(put_io_context);
|
||||||
void exit_io_context(struct task_struct *task)
|
void exit_io_context(struct task_struct *task)
|
||||||
{
|
{
|
||||||
struct io_context *ioc;
|
struct io_context *ioc;
|
||||||
|
struct io_cq *icq;
|
||||||
|
struct hlist_node *n;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
task_lock(task);
|
task_lock(task);
|
||||||
ioc = task->io_context;
|
ioc = task->io_context;
|
||||||
task->io_context = NULL;
|
task->io_context = NULL;
|
||||||
task_unlock(task);
|
task_unlock(task);
|
||||||
|
|
||||||
atomic_dec(&ioc->nr_tasks);
|
if (!atomic_dec_and_test(&ioc->nr_tasks)) {
|
||||||
|
put_io_context(ioc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Need ioc lock to walk icq_list and q lock to exit icq. Perform
|
||||||
|
* reverse double locking. Read comment in ioc_release_fn() for
|
||||||
|
* explanation on the nested locking annotation.
|
||||||
|
*/
|
||||||
|
retry:
|
||||||
|
spin_lock_irqsave_nested(&ioc->lock, flags, 1);
|
||||||
|
hlist_for_each_entry(icq, n, &ioc->icq_list, ioc_node) {
|
||||||
|
if (icq->flags & ICQ_EXITED)
|
||||||
|
continue;
|
||||||
|
if (spin_trylock(icq->q->queue_lock)) {
|
||||||
|
ioc_exit_icq(icq);
|
||||||
|
spin_unlock(icq->q->queue_lock);
|
||||||
|
} else {
|
||||||
|
spin_unlock_irqrestore(&ioc->lock, flags);
|
||||||
|
cpu_relax();
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spin_unlock_irqrestore(&ioc->lock, flags);
|
||||||
|
|
||||||
put_io_context(ioc);
|
put_io_context(ioc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,7 +213,7 @@ void ioc_clear_queue(struct request_queue *q)
|
||||||
struct io_context *ioc = icq->ioc;
|
struct io_context *ioc = icq->ioc;
|
||||||
|
|
||||||
spin_lock(&ioc->lock);
|
spin_lock(&ioc->lock);
|
||||||
ioc_exit_icq(icq);
|
ioc_destroy_icq(icq);
|
||||||
spin_unlock(&ioc->lock);
|
spin_unlock(&ioc->lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -363,13 +382,13 @@ struct io_cq *ioc_create_icq(struct request_queue *q, gfp_t gfp_mask)
|
||||||
return icq;
|
return icq;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ioc_set_changed(struct io_context *ioc, int which)
|
void ioc_set_icq_flags(struct io_context *ioc, unsigned int flags)
|
||||||
{
|
{
|
||||||
struct io_cq *icq;
|
struct io_cq *icq;
|
||||||
struct hlist_node *n;
|
struct hlist_node *n;
|
||||||
|
|
||||||
hlist_for_each_entry(icq, n, &ioc->icq_list, ioc_node)
|
hlist_for_each_entry(icq, n, &ioc->icq_list, ioc_node)
|
||||||
set_bit(which, &icq->changed);
|
icq->flags |= flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -387,7 +406,7 @@ void ioc_ioprio_changed(struct io_context *ioc, int ioprio)
|
||||||
|
|
||||||
spin_lock_irqsave(&ioc->lock, flags);
|
spin_lock_irqsave(&ioc->lock, flags);
|
||||||
ioc->ioprio = ioprio;
|
ioc->ioprio = ioprio;
|
||||||
ioc_set_changed(ioc, ICQ_IOPRIO_CHANGED);
|
ioc_set_icq_flags(ioc, ICQ_IOPRIO_CHANGED);
|
||||||
spin_unlock_irqrestore(&ioc->lock, flags);
|
spin_unlock_irqrestore(&ioc->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,11 +423,33 @@ void ioc_cgroup_changed(struct io_context *ioc)
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&ioc->lock, flags);
|
spin_lock_irqsave(&ioc->lock, flags);
|
||||||
ioc_set_changed(ioc, ICQ_CGROUP_CHANGED);
|
ioc_set_icq_flags(ioc, ICQ_CGROUP_CHANGED);
|
||||||
spin_unlock_irqrestore(&ioc->lock, flags);
|
spin_unlock_irqrestore(&ioc->lock, flags);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ioc_cgroup_changed);
|
EXPORT_SYMBOL(ioc_cgroup_changed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* icq_get_changed - fetch and clear icq changed mask
|
||||||
|
* @icq: icq of interest
|
||||||
|
*
|
||||||
|
* Fetch and clear ICQ_*_CHANGED bits from @icq. Grabs and releases
|
||||||
|
* @icq->ioc->lock.
|
||||||
|
*/
|
||||||
|
unsigned icq_get_changed(struct io_cq *icq)
|
||||||
|
{
|
||||||
|
unsigned int changed = 0;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (unlikely(icq->flags & ICQ_CHANGED_MASK)) {
|
||||||
|
spin_lock_irqsave(&icq->ioc->lock, flags);
|
||||||
|
changed = icq->flags & ICQ_CHANGED_MASK;
|
||||||
|
icq->flags &= ~ICQ_CHANGED_MASK;
|
||||||
|
spin_unlock_irqrestore(&icq->ioc->lock, flags);
|
||||||
|
}
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(icq_get_changed);
|
||||||
|
|
||||||
static int __init blk_ioc_init(void)
|
static int __init blk_ioc_init(void)
|
||||||
{
|
{
|
||||||
iocontext_cachep = kmem_cache_create("blkdev_ioc",
|
iocontext_cachep = kmem_cache_create("blkdev_ioc",
|
||||||
|
|
|
@ -3470,20 +3470,20 @@ cfq_set_request(struct request_queue *q, struct request *rq, gfp_t gfp_mask)
|
||||||
const int rw = rq_data_dir(rq);
|
const int rw = rq_data_dir(rq);
|
||||||
const bool is_sync = rq_is_sync(rq);
|
const bool is_sync = rq_is_sync(rq);
|
||||||
struct cfq_queue *cfqq;
|
struct cfq_queue *cfqq;
|
||||||
|
unsigned int changed;
|
||||||
|
|
||||||
might_sleep_if(gfp_mask & __GFP_WAIT);
|
might_sleep_if(gfp_mask & __GFP_WAIT);
|
||||||
|
|
||||||
spin_lock_irq(q->queue_lock);
|
spin_lock_irq(q->queue_lock);
|
||||||
|
|
||||||
/* handle changed notifications */
|
/* handle changed notifications */
|
||||||
if (unlikely(cic->icq.changed)) {
|
changed = icq_get_changed(&cic->icq);
|
||||||
if (test_and_clear_bit(ICQ_IOPRIO_CHANGED, &cic->icq.changed))
|
if (unlikely(changed & ICQ_IOPRIO_CHANGED))
|
||||||
changed_ioprio(cic);
|
changed_ioprio(cic);
|
||||||
#ifdef CONFIG_CFQ_GROUP_IOSCHED
|
#ifdef CONFIG_CFQ_GROUP_IOSCHED
|
||||||
if (test_and_clear_bit(ICQ_CGROUP_CHANGED, &cic->icq.changed))
|
if (unlikely(changed & ICQ_CGROUP_CHANGED))
|
||||||
changed_cgroup(cic);
|
changed_cgroup(cic);
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
new_queue:
|
new_queue:
|
||||||
cfqq = cic_to_cfqq(cic, is_sync);
|
cfqq = cic_to_cfqq(cic, is_sync);
|
||||||
|
|
|
@ -35,6 +35,7 @@ static DEFINE_IDR(ext_devt_idr);
|
||||||
|
|
||||||
static struct device_type disk_type;
|
static struct device_type disk_type;
|
||||||
|
|
||||||
|
static void disk_alloc_events(struct gendisk *disk);
|
||||||
static void disk_add_events(struct gendisk *disk);
|
static void disk_add_events(struct gendisk *disk);
|
||||||
static void disk_del_events(struct gendisk *disk);
|
static void disk_del_events(struct gendisk *disk);
|
||||||
static void disk_release_events(struct gendisk *disk);
|
static void disk_release_events(struct gendisk *disk);
|
||||||
|
@ -601,6 +602,8 @@ void add_disk(struct gendisk *disk)
|
||||||
disk->major = MAJOR(devt);
|
disk->major = MAJOR(devt);
|
||||||
disk->first_minor = MINOR(devt);
|
disk->first_minor = MINOR(devt);
|
||||||
|
|
||||||
|
disk_alloc_events(disk);
|
||||||
|
|
||||||
/* Register BDI before referencing it from bdev */
|
/* Register BDI before referencing it from bdev */
|
||||||
bdi = &disk->queue->backing_dev_info;
|
bdi = &disk->queue->backing_dev_info;
|
||||||
bdi_register_dev(bdi, disk_devt(disk));
|
bdi_register_dev(bdi, disk_devt(disk));
|
||||||
|
@ -1475,9 +1478,9 @@ static void __disk_unblock_events(struct gendisk *disk, bool check_now)
|
||||||
intv = disk_events_poll_jiffies(disk);
|
intv = disk_events_poll_jiffies(disk);
|
||||||
set_timer_slack(&ev->dwork.timer, intv / 4);
|
set_timer_slack(&ev->dwork.timer, intv / 4);
|
||||||
if (check_now)
|
if (check_now)
|
||||||
queue_delayed_work(system_nrt_wq, &ev->dwork, 0);
|
queue_delayed_work(system_nrt_freezable_wq, &ev->dwork, 0);
|
||||||
else if (intv)
|
else if (intv)
|
||||||
queue_delayed_work(system_nrt_wq, &ev->dwork, intv);
|
queue_delayed_work(system_nrt_freezable_wq, &ev->dwork, intv);
|
||||||
out_unlock:
|
out_unlock:
|
||||||
spin_unlock_irqrestore(&ev->lock, flags);
|
spin_unlock_irqrestore(&ev->lock, flags);
|
||||||
}
|
}
|
||||||
|
@ -1521,7 +1524,7 @@ void disk_flush_events(struct gendisk *disk, unsigned int mask)
|
||||||
ev->clearing |= mask;
|
ev->clearing |= mask;
|
||||||
if (!ev->block) {
|
if (!ev->block) {
|
||||||
cancel_delayed_work(&ev->dwork);
|
cancel_delayed_work(&ev->dwork);
|
||||||
queue_delayed_work(system_nrt_wq, &ev->dwork, 0);
|
queue_delayed_work(system_nrt_freezable_wq, &ev->dwork, 0);
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&ev->lock);
|
spin_unlock_irq(&ev->lock);
|
||||||
}
|
}
|
||||||
|
@ -1558,7 +1561,7 @@ unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask)
|
||||||
|
|
||||||
/* uncondtionally schedule event check and wait for it to finish */
|
/* uncondtionally schedule event check and wait for it to finish */
|
||||||
disk_block_events(disk);
|
disk_block_events(disk);
|
||||||
queue_delayed_work(system_nrt_wq, &ev->dwork, 0);
|
queue_delayed_work(system_nrt_freezable_wq, &ev->dwork, 0);
|
||||||
flush_delayed_work(&ev->dwork);
|
flush_delayed_work(&ev->dwork);
|
||||||
__disk_unblock_events(disk, false);
|
__disk_unblock_events(disk, false);
|
||||||
|
|
||||||
|
@ -1595,7 +1598,7 @@ static void disk_events_workfn(struct work_struct *work)
|
||||||
|
|
||||||
intv = disk_events_poll_jiffies(disk);
|
intv = disk_events_poll_jiffies(disk);
|
||||||
if (!ev->block && intv)
|
if (!ev->block && intv)
|
||||||
queue_delayed_work(system_nrt_wq, &ev->dwork, intv);
|
queue_delayed_work(system_nrt_freezable_wq, &ev->dwork, intv);
|
||||||
|
|
||||||
spin_unlock_irq(&ev->lock);
|
spin_unlock_irq(&ev->lock);
|
||||||
|
|
||||||
|
@ -1733,9 +1736,9 @@ module_param_cb(events_dfl_poll_msecs, &disk_events_dfl_poll_msecs_param_ops,
|
||||||
&disk_events_dfl_poll_msecs, 0644);
|
&disk_events_dfl_poll_msecs, 0644);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* disk_{add|del|release}_events - initialize and destroy disk_events.
|
* disk_{alloc|add|del|release}_events - initialize and destroy disk_events.
|
||||||
*/
|
*/
|
||||||
static void disk_add_events(struct gendisk *disk)
|
static void disk_alloc_events(struct gendisk *disk)
|
||||||
{
|
{
|
||||||
struct disk_events *ev;
|
struct disk_events *ev;
|
||||||
|
|
||||||
|
@ -1748,16 +1751,6 @@ static void disk_add_events(struct gendisk *disk)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sysfs_create_files(&disk_to_dev(disk)->kobj,
|
|
||||||
disk_events_attrs) < 0) {
|
|
||||||
pr_warn("%s: failed to create sysfs files for events\n",
|
|
||||||
disk->disk_name);
|
|
||||||
kfree(ev);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
disk->ev = ev;
|
|
||||||
|
|
||||||
INIT_LIST_HEAD(&ev->node);
|
INIT_LIST_HEAD(&ev->node);
|
||||||
ev->disk = disk;
|
ev->disk = disk;
|
||||||
spin_lock_init(&ev->lock);
|
spin_lock_init(&ev->lock);
|
||||||
|
@ -1766,8 +1759,21 @@ static void disk_add_events(struct gendisk *disk)
|
||||||
ev->poll_msecs = -1;
|
ev->poll_msecs = -1;
|
||||||
INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn);
|
INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn);
|
||||||
|
|
||||||
|
disk->ev = ev;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void disk_add_events(struct gendisk *disk)
|
||||||
|
{
|
||||||
|
if (!disk->ev)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* FIXME: error handling */
|
||||||
|
if (sysfs_create_files(&disk_to_dev(disk)->kobj, disk_events_attrs) < 0)
|
||||||
|
pr_warn("%s: failed to create sysfs files for events\n",
|
||||||
|
disk->disk_name);
|
||||||
|
|
||||||
mutex_lock(&disk_events_mutex);
|
mutex_lock(&disk_events_mutex);
|
||||||
list_add_tail(&ev->node, &disk_events);
|
list_add_tail(&disk->ev->node, &disk_events);
|
||||||
mutex_unlock(&disk_events_mutex);
|
mutex_unlock(&disk_events_mutex);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -389,17 +389,11 @@ static bool disk_unlock_native_capacity(struct gendisk *disk)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
|
static int drop_partitions(struct gendisk *disk, struct block_device *bdev)
|
||||||
{
|
{
|
||||||
struct parsed_partitions *state = NULL;
|
|
||||||
struct disk_part_iter piter;
|
struct disk_part_iter piter;
|
||||||
struct hd_struct *part;
|
struct hd_struct *part;
|
||||||
int p, highest, res;
|
int res;
|
||||||
rescan:
|
|
||||||
if (state && !IS_ERR(state)) {
|
|
||||||
kfree(state);
|
|
||||||
state = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bdev->bd_part_count)
|
if (bdev->bd_part_count)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -412,6 +406,24 @@ rescan:
|
||||||
delete_partition(disk, part->partno);
|
delete_partition(disk, part->partno);
|
||||||
disk_part_iter_exit(&piter);
|
disk_part_iter_exit(&piter);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
|
||||||
|
{
|
||||||
|
struct parsed_partitions *state = NULL;
|
||||||
|
struct hd_struct *part;
|
||||||
|
int p, highest, res;
|
||||||
|
rescan:
|
||||||
|
if (state && !IS_ERR(state)) {
|
||||||
|
kfree(state);
|
||||||
|
state = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = drop_partitions(disk, bdev);
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
|
||||||
if (disk->fops->revalidate_disk)
|
if (disk->fops->revalidate_disk)
|
||||||
disk->fops->revalidate_disk(disk);
|
disk->fops->revalidate_disk(disk);
|
||||||
check_disk_size_change(disk, bdev);
|
check_disk_size_change(disk, bdev);
|
||||||
|
@ -515,6 +527,26 @@ rescan:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int invalidate_partitions(struct gendisk *disk, struct block_device *bdev)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (!bdev->bd_invalidated)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
res = drop_partitions(disk, bdev);
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
set_capacity(disk, 0);
|
||||||
|
check_disk_size_change(disk, bdev);
|
||||||
|
bdev->bd_invalidated = 0;
|
||||||
|
/* tell userspace that the media / partition table may have changed */
|
||||||
|
kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
|
unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
|
||||||
{
|
{
|
||||||
struct address_space *mapping = bdev->bd_inode->i_mapping;
|
struct address_space *mapping = bdev->bd_inode->i_mapping;
|
||||||
|
|
|
@ -1177,7 +1177,8 @@ static bool DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T
|
||||||
int TimeoutCounter;
|
int TimeoutCounter;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
memset(&CommandMailbox, 0, sizeof(DAC960_V1_CommandMailbox_T));
|
||||||
|
|
||||||
if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32)))
|
if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32)))
|
||||||
return DAC960_Failure(Controller, "DMA mask out of range");
|
return DAC960_Failure(Controller, "DMA mask out of range");
|
||||||
Controller->BounceBufferLimit = DMA_BIT_MASK(32);
|
Controller->BounceBufferLimit = DMA_BIT_MASK(32);
|
||||||
|
@ -4627,7 +4628,8 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
|
||||||
DAC960_Controller_T *Controller = Command->Controller;
|
DAC960_Controller_T *Controller = Command->Controller;
|
||||||
DAC960_CommandType_T CommandType = Command->CommandType;
|
DAC960_CommandType_T CommandType = Command->CommandType;
|
||||||
DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
|
DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
|
||||||
DAC960_V2_IOCTL_Opcode_T CommandOpcode = CommandMailbox->Common.IOCTL_Opcode;
|
DAC960_V2_IOCTL_Opcode_T IOCTLOpcode = CommandMailbox->Common.IOCTL_Opcode;
|
||||||
|
DAC960_V2_CommandOpcode_T CommandOpcode = CommandMailbox->SCSI_10.CommandOpcode;
|
||||||
DAC960_V2_CommandStatus_T CommandStatus = Command->V2.CommandStatus;
|
DAC960_V2_CommandStatus_T CommandStatus = Command->V2.CommandStatus;
|
||||||
|
|
||||||
if (CommandType == DAC960_ReadCommand ||
|
if (CommandType == DAC960_ReadCommand ||
|
||||||
|
@ -4699,7 +4701,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
|
||||||
{
|
{
|
||||||
if (Controller->ShutdownMonitoringTimer)
|
if (Controller->ShutdownMonitoringTimer)
|
||||||
return;
|
return;
|
||||||
if (CommandOpcode == DAC960_V2_GetControllerInfo)
|
if (IOCTLOpcode == DAC960_V2_GetControllerInfo)
|
||||||
{
|
{
|
||||||
DAC960_V2_ControllerInfo_T *NewControllerInfo =
|
DAC960_V2_ControllerInfo_T *NewControllerInfo =
|
||||||
Controller->V2.NewControllerInformation;
|
Controller->V2.NewControllerInformation;
|
||||||
|
@ -4719,14 +4721,14 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
|
||||||
memcpy(ControllerInfo, NewControllerInfo,
|
memcpy(ControllerInfo, NewControllerInfo,
|
||||||
sizeof(DAC960_V2_ControllerInfo_T));
|
sizeof(DAC960_V2_ControllerInfo_T));
|
||||||
}
|
}
|
||||||
else if (CommandOpcode == DAC960_V2_GetEvent)
|
else if (IOCTLOpcode == DAC960_V2_GetEvent)
|
||||||
{
|
{
|
||||||
if (CommandStatus == DAC960_V2_NormalCompletion) {
|
if (CommandStatus == DAC960_V2_NormalCompletion) {
|
||||||
DAC960_V2_ReportEvent(Controller, Controller->V2.Event);
|
DAC960_V2_ReportEvent(Controller, Controller->V2.Event);
|
||||||
}
|
}
|
||||||
Controller->V2.NextEventSequenceNumber++;
|
Controller->V2.NextEventSequenceNumber++;
|
||||||
}
|
}
|
||||||
else if (CommandOpcode == DAC960_V2_GetPhysicalDeviceInfoValid &&
|
else if (IOCTLOpcode == DAC960_V2_GetPhysicalDeviceInfoValid &&
|
||||||
CommandStatus == DAC960_V2_NormalCompletion)
|
CommandStatus == DAC960_V2_NormalCompletion)
|
||||||
{
|
{
|
||||||
DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo =
|
DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo =
|
||||||
|
@ -4915,7 +4917,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
|
||||||
NewPhysicalDeviceInfo->LogicalUnit++;
|
NewPhysicalDeviceInfo->LogicalUnit++;
|
||||||
Controller->V2.PhysicalDeviceIndex++;
|
Controller->V2.PhysicalDeviceIndex++;
|
||||||
}
|
}
|
||||||
else if (CommandOpcode == DAC960_V2_GetPhysicalDeviceInfoValid)
|
else if (IOCTLOpcode == DAC960_V2_GetPhysicalDeviceInfoValid)
|
||||||
{
|
{
|
||||||
unsigned int DeviceIndex;
|
unsigned int DeviceIndex;
|
||||||
for (DeviceIndex = Controller->V2.PhysicalDeviceIndex;
|
for (DeviceIndex = Controller->V2.PhysicalDeviceIndex;
|
||||||
|
@ -4938,7 +4940,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
|
||||||
}
|
}
|
||||||
Controller->V2.NeedPhysicalDeviceInformation = false;
|
Controller->V2.NeedPhysicalDeviceInformation = false;
|
||||||
}
|
}
|
||||||
else if (CommandOpcode == DAC960_V2_GetLogicalDeviceInfoValid &&
|
else if (IOCTLOpcode == DAC960_V2_GetLogicalDeviceInfoValid &&
|
||||||
CommandStatus == DAC960_V2_NormalCompletion)
|
CommandStatus == DAC960_V2_NormalCompletion)
|
||||||
{
|
{
|
||||||
DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo =
|
DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo =
|
||||||
|
@ -5065,7 +5067,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
|
||||||
[LogicalDeviceNumber] = true;
|
[LogicalDeviceNumber] = true;
|
||||||
NewLogicalDeviceInfo->LogicalDeviceNumber++;
|
NewLogicalDeviceInfo->LogicalDeviceNumber++;
|
||||||
}
|
}
|
||||||
else if (CommandOpcode == DAC960_V2_GetLogicalDeviceInfoValid)
|
else if (IOCTLOpcode == DAC960_V2_GetLogicalDeviceInfoValid)
|
||||||
{
|
{
|
||||||
int LogicalDriveNumber;
|
int LogicalDriveNumber;
|
||||||
for (LogicalDriveNumber = 0;
|
for (LogicalDriveNumber = 0;
|
||||||
|
|
|
@ -3832,7 +3832,7 @@ static int __floppy_read_block_0(struct block_device *bdev)
|
||||||
bio.bi_size = size;
|
bio.bi_size = size;
|
||||||
bio.bi_bdev = bdev;
|
bio.bi_bdev = bdev;
|
||||||
bio.bi_sector = 0;
|
bio.bi_sector = 0;
|
||||||
bio.bi_flags = BIO_QUIET;
|
bio.bi_flags = (1 << BIO_QUIET);
|
||||||
init_completion(&complete);
|
init_completion(&complete);
|
||||||
bio.bi_private = &complete;
|
bio.bi_private = &complete;
|
||||||
bio.bi_end_io = floppy_rb0_complete;
|
bio.bi_end_io = floppy_rb0_complete;
|
||||||
|
|
|
@ -1120,7 +1120,7 @@ static inline void carm_handle_resp(struct carm_host *host,
|
||||||
break;
|
break;
|
||||||
case MISC_GET_FW_VER: {
|
case MISC_GET_FW_VER: {
|
||||||
struct carm_fw_ver *ver = (struct carm_fw_ver *)
|
struct carm_fw_ver *ver = (struct carm_fw_ver *)
|
||||||
mem + sizeof(struct carm_msg_get_fw_ver);
|
(mem + sizeof(struct carm_msg_get_fw_ver));
|
||||||
if (!error) {
|
if (!error) {
|
||||||
host->fw_ver = le32_to_cpu(ver->version);
|
host->fw_ver = le32_to_cpu(ver->version);
|
||||||
host->flags |= (ver->features & FL_FW_VER_MASK);
|
host->flags |= (ver->features & FL_FW_VER_MASK);
|
||||||
|
|
|
@ -54,14 +54,14 @@ convert_to_display_mode(struct drm_display_mode *mode,
|
||||||
mode->vrefresh = timing->refresh;
|
mode->vrefresh = timing->refresh;
|
||||||
|
|
||||||
mode->hdisplay = timing->xres;
|
mode->hdisplay = timing->xres;
|
||||||
mode->hsync_start = mode->hdisplay + timing->left_margin;
|
mode->hsync_start = mode->hdisplay + timing->right_margin;
|
||||||
mode->hsync_end = mode->hsync_start + timing->hsync_len;
|
mode->hsync_end = mode->hsync_start + timing->hsync_len;
|
||||||
mode->htotal = mode->hsync_end + timing->right_margin;
|
mode->htotal = mode->hsync_end + timing->left_margin;
|
||||||
|
|
||||||
mode->vdisplay = timing->yres;
|
mode->vdisplay = timing->yres;
|
||||||
mode->vsync_start = mode->vdisplay + timing->upper_margin;
|
mode->vsync_start = mode->vdisplay + timing->lower_margin;
|
||||||
mode->vsync_end = mode->vsync_start + timing->vsync_len;
|
mode->vsync_end = mode->vsync_start + timing->vsync_len;
|
||||||
mode->vtotal = mode->vsync_end + timing->lower_margin;
|
mode->vtotal = mode->vsync_end + timing->upper_margin;
|
||||||
mode->width_mm = panel->width_mm;
|
mode->width_mm = panel->width_mm;
|
||||||
mode->height_mm = panel->height_mm;
|
mode->height_mm = panel->height_mm;
|
||||||
|
|
||||||
|
@ -85,14 +85,14 @@ convert_to_video_timing(struct fb_videomode *timing,
|
||||||
timing->refresh = drm_mode_vrefresh(mode);
|
timing->refresh = drm_mode_vrefresh(mode);
|
||||||
|
|
||||||
timing->xres = mode->hdisplay;
|
timing->xres = mode->hdisplay;
|
||||||
timing->left_margin = mode->hsync_start - mode->hdisplay;
|
timing->right_margin = mode->hsync_start - mode->hdisplay;
|
||||||
timing->hsync_len = mode->hsync_end - mode->hsync_start;
|
timing->hsync_len = mode->hsync_end - mode->hsync_start;
|
||||||
timing->right_margin = mode->htotal - mode->hsync_end;
|
timing->left_margin = mode->htotal - mode->hsync_end;
|
||||||
|
|
||||||
timing->yres = mode->vdisplay;
|
timing->yres = mode->vdisplay;
|
||||||
timing->upper_margin = mode->vsync_start - mode->vdisplay;
|
timing->lower_margin = mode->vsync_start - mode->vdisplay;
|
||||||
timing->vsync_len = mode->vsync_end - mode->vsync_start;
|
timing->vsync_len = mode->vsync_end - mode->vsync_start;
|
||||||
timing->lower_margin = mode->vtotal - mode->vsync_end;
|
timing->upper_margin = mode->vtotal - mode->vsync_end;
|
||||||
|
|
||||||
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
|
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
|
||||||
timing->vmode = FB_VMODE_INTERLACED;
|
timing->vmode = FB_VMODE_INTERLACED;
|
||||||
|
|
|
@ -246,7 +246,7 @@ static struct platform_driver exynos_drm_platform_driver = {
|
||||||
.remove = __devexit_p(exynos_drm_platform_remove),
|
.remove = __devexit_p(exynos_drm_platform_remove),
|
||||||
.driver = {
|
.driver = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.name = DRIVER_NAME,
|
.name = "exynos-drm",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -46,39 +46,13 @@ struct exynos_drm_fbdev {
|
||||||
struct exynos_drm_gem_obj *exynos_gem_obj;
|
struct exynos_drm_gem_obj *exynos_gem_obj;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int exynos_drm_fbdev_set_par(struct fb_info *info)
|
|
||||||
{
|
|
||||||
struct fb_var_screeninfo *var = &info->var;
|
|
||||||
|
|
||||||
switch (var->bits_per_pixel) {
|
|
||||||
case 32:
|
|
||||||
case 24:
|
|
||||||
case 18:
|
|
||||||
case 16:
|
|
||||||
case 12:
|
|
||||||
info->fix.visual = FB_VISUAL_TRUECOLOR;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
info->fix.visual = FB_VISUAL_MONO01;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
info->fix.line_length = (var->xres_virtual * var->bits_per_pixel) / 8;
|
|
||||||
|
|
||||||
return drm_fb_helper_set_par(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static struct fb_ops exynos_drm_fb_ops = {
|
static struct fb_ops exynos_drm_fb_ops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.fb_fillrect = cfb_fillrect,
|
.fb_fillrect = cfb_fillrect,
|
||||||
.fb_copyarea = cfb_copyarea,
|
.fb_copyarea = cfb_copyarea,
|
||||||
.fb_imageblit = cfb_imageblit,
|
.fb_imageblit = cfb_imageblit,
|
||||||
.fb_check_var = drm_fb_helper_check_var,
|
.fb_check_var = drm_fb_helper_check_var,
|
||||||
.fb_set_par = exynos_drm_fbdev_set_par,
|
.fb_set_par = drm_fb_helper_set_par,
|
||||||
.fb_blank = drm_fb_helper_blank,
|
.fb_blank = drm_fb_helper_blank,
|
||||||
.fb_pan_display = drm_fb_helper_pan_display,
|
.fb_pan_display = drm_fb_helper_pan_display,
|
||||||
.fb_setcmap = drm_fb_helper_setcmap,
|
.fb_setcmap = drm_fb_helper_setcmap,
|
||||||
|
|
|
@ -817,8 +817,6 @@ static int __devinit fimd_probe(struct platform_device *pdev)
|
||||||
goto err_clk_get;
|
goto err_clk_get;
|
||||||
}
|
}
|
||||||
|
|
||||||
clk_enable(ctx->bus_clk);
|
|
||||||
|
|
||||||
ctx->lcd_clk = clk_get(dev, "sclk_fimd");
|
ctx->lcd_clk = clk_get(dev, "sclk_fimd");
|
||||||
if (IS_ERR(ctx->lcd_clk)) {
|
if (IS_ERR(ctx->lcd_clk)) {
|
||||||
dev_err(dev, "failed to get lcd clock\n");
|
dev_err(dev, "failed to get lcd clock\n");
|
||||||
|
@ -826,8 +824,6 @@ static int __devinit fimd_probe(struct platform_device *pdev)
|
||||||
goto err_bus_clk;
|
goto err_bus_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
clk_enable(ctx->lcd_clk);
|
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
dev_err(dev, "failed to find registers\n");
|
dev_err(dev, "failed to find registers\n");
|
||||||
|
@ -864,17 +860,11 @@ static int __devinit fimd_probe(struct platform_device *pdev)
|
||||||
goto err_req_irq;
|
goto err_req_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->clkdiv = fimd_calc_clkdiv(ctx, &panel->timing);
|
|
||||||
ctx->vidcon0 = pdata->vidcon0;
|
ctx->vidcon0 = pdata->vidcon0;
|
||||||
ctx->vidcon1 = pdata->vidcon1;
|
ctx->vidcon1 = pdata->vidcon1;
|
||||||
ctx->default_win = pdata->default_win;
|
ctx->default_win = pdata->default_win;
|
||||||
ctx->panel = panel;
|
ctx->panel = panel;
|
||||||
|
|
||||||
panel->timing.pixclock = clk_get_rate(ctx->lcd_clk) / ctx->clkdiv;
|
|
||||||
|
|
||||||
DRM_DEBUG_KMS("pixel clock = %d, clkdiv = %d\n",
|
|
||||||
panel->timing.pixclock, ctx->clkdiv);
|
|
||||||
|
|
||||||
subdrv = &ctx->subdrv;
|
subdrv = &ctx->subdrv;
|
||||||
|
|
||||||
subdrv->probe = fimd_subdrv_probe;
|
subdrv->probe = fimd_subdrv_probe;
|
||||||
|
@ -889,10 +879,15 @@ static int __devinit fimd_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
platform_set_drvdata(pdev, ctx);
|
platform_set_drvdata(pdev, ctx);
|
||||||
|
|
||||||
pm_runtime_set_active(dev);
|
|
||||||
pm_runtime_enable(dev);
|
pm_runtime_enable(dev);
|
||||||
pm_runtime_get_sync(dev);
|
pm_runtime_get_sync(dev);
|
||||||
|
|
||||||
|
ctx->clkdiv = fimd_calc_clkdiv(ctx, &panel->timing);
|
||||||
|
panel->timing.pixclock = clk_get_rate(ctx->lcd_clk) / ctx->clkdiv;
|
||||||
|
|
||||||
|
DRM_DEBUG_KMS("pixel clock = %d, clkdiv = %d\n",
|
||||||
|
panel->timing.pixclock, ctx->clkdiv);
|
||||||
|
|
||||||
for (win = 0; win < WINDOWS_NR; win++)
|
for (win = 0; win < WINDOWS_NR; win++)
|
||||||
fimd_clear_win(ctx, win);
|
fimd_clear_win(ctx, win);
|
||||||
|
|
||||||
|
|
|
@ -321,6 +321,8 @@ static int cdv_chip_setup(struct drm_device *dev)
|
||||||
cdv_get_core_freq(dev);
|
cdv_get_core_freq(dev);
|
||||||
gma_intel_opregion_init(dev);
|
gma_intel_opregion_init(dev);
|
||||||
psb_intel_init_bios(dev);
|
psb_intel_init_bios(dev);
|
||||||
|
REG_WRITE(PORT_HOTPLUG_EN, 0);
|
||||||
|
REG_WRITE(PORT_HOTPLUG_STAT, REG_READ(PORT_HOTPLUG_STAT));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -247,7 +247,6 @@ static struct fb_ops psbfb_roll_ops = {
|
||||||
.fb_imageblit = cfb_imageblit,
|
.fb_imageblit = cfb_imageblit,
|
||||||
.fb_pan_display = psbfb_pan,
|
.fb_pan_display = psbfb_pan,
|
||||||
.fb_mmap = psbfb_mmap,
|
.fb_mmap = psbfb_mmap,
|
||||||
.fb_sync = psbfb_sync,
|
|
||||||
.fb_ioctl = psbfb_ioctl,
|
.fb_ioctl = psbfb_ioctl,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue