Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
xcap
xcap-capability-linux
Commits
6c529a26
Commit
6c529a26
authored
Dec 22, 2010
by
Ingo Molnar
Browse files
Merge commit 'v2.6.37-rc7' into perf/core
Merge reason: Pick up the latest -rc. Signed-off-by:
Ingo Molnar
<
mingo@elte.hu
>
parents
7639dae0
90a8a73c
Changes
441
Hide whitespace changes
Inline
Side-by-side
Documentation/filesystems/Locking
View file @
6c529a26
...
...
@@ -173,12 +173,13 @@ prototypes:
sector_t (*bmap)(struct address_space *, sector_t);
int (*invalidatepage) (struct page *, unsigned long);
int (*releasepage) (struct page *, int);
void (*freepage)(struct page *);
int (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
loff_t offset, unsigned long nr_segs);
int (*launder_page) (struct page *);
locking rules:
All except set_page_dirty may block
All except set_page_dirty
and freepage
may block
BKL PageLocked(page) i_mutex
writepage: no yes, unlocks (see below)
...
...
@@ -193,6 +194,7 @@ perform_write: no n/a yes
bmap: no
invalidatepage: no yes
releasepage: no yes
freepage: no yes
direct_IO: no
launder_page: no yes
...
...
@@ -288,6 +290,9 @@ buffers from the page in preparation for freeing it. It returns zero to
indicate that the buffers are (or may be) freeable. If ->releasepage is zero,
the kernel assumes that the fs has no private interest in the buffers.
->freepage() is called when the kernel is done dropping the page
from the page cache.
->launder_page() may be called prior to releasing a page if
it is still found to be dirty. It returns zero if the page was successfully
cleaned, or an error value if not. Note that in order to prevent the page
...
...
Documentation/filesystems/vfs.txt
View file @
6c529a26
...
...
@@ -534,6 +534,7 @@ struct address_space_operations {
sector_t (*bmap)(struct address_space *, sector_t);
int (*invalidatepage) (struct page *, unsigned long);
int (*releasepage) (struct page *, int);
void (*freepage)(struct page *);
ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
loff_t offset, unsigned long nr_segs);
struct page* (*get_xip_page)(struct address_space *, sector_t,
...
...
@@ -678,6 +679,12 @@ struct address_space_operations {
need to ensure this. Possibly it can clear the PageUptodate
bit if it cannot free private data yet.
freepage: freepage is called once the page is no longer visible in
the page cache in order to allow the cleanup of any private
data. Since it may be called by the memory reclaimer, it
should not assume that the original address_space mapping still
exists, and it should not block.
direct_IO: called by the generic read/write routines to perform
direct_IO - that is IO requests which bypass the page cache
and transfer data directly between the storage and the
...
...
Documentation/kernel-parameters.txt
View file @
6c529a26
...
...
@@ -2167,11 +2167,6 @@ and is between 256 and 4096 characters. It is defined in the file
reset_devices [KNL] Force drivers to reset the underlying device
during initialization.
resource_alloc_from_bottom
Allocate new resources from the beginning of available
space, not the end. If you need to use this, please
report a bug.
resume= [SWSUSP]
Specify the partition device for software suspend
...
...
Documentation/power/runtime_pm.txt
View file @
6c529a26
...
...
@@ -379,8 +379,8 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h:
zero)
bool pm_runtime_suspended(struct device *dev);
- return true if the device's runtime PM status is 'suspended'
, or false
otherwise
- return true if the device's runtime PM status is 'suspended'
and its
'power.disable_depth' field is equal to zero, or false
otherwise
void pm_runtime_allow(struct device *dev);
- set the power.runtime_auto flag for the device and decrease its usage
...
...
MAINTAINERS
View file @
6c529a26
...
...
@@ -559,14 +559,14 @@ W: http://maxim.org.za/at91_26.html
S: Maintained
ARM/BCMRING ARM ARCHITECTURE
M:
Leo C
hen <
leoc
hen@broadcom.com>
M:
Jiandong Z
hen
g
<
jdz
hen
g
@broadcom.com>
M: Scott Branden <sbranden@broadcom.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained
F: arch/arm/mach-bcmring
ARM/BCMRING MTD NAND DRIVER
M:
Leo C
hen <
leoc
hen@broadcom.com>
M:
Jiandong Z
hen
g
<
jdz
hen
g
@broadcom.com>
M: Scott Branden <sbranden@broadcom.com>
L: linux-mtd@lists.infradead.org
S: Maintained
...
...
@@ -815,7 +815,7 @@ F: drivers/mmc/host/msm_sdcc.c
F: drivers/mmc/host/msm_sdcc.h
F: drivers/serial/msm_serial.h
F: drivers/serial/msm_serial.c
T: git git://codeaurora.org/quic/kernel/d
walker
/linux-msm.git
T: git git://codeaurora.org/quic/kernel/d
avidb
/linux-msm.git
S: Maintained
ARM/TOSA MACHINE SUPPORT
...
...
@@ -5932,7 +5932,6 @@ F: include/linux/tty.h
TULIP NETWORK DRIVERS
M: Grant Grundler <grundler@parisc-linux.org>
M: Kyle McMartin <kyle@mcmartin.ca>
L: netdev@vger.kernel.org
S: Maintained
F: drivers/net/tulip/
...
...
@@ -6584,6 +6583,15 @@ F: include/linux/mfd/wm8400*
F: include/sound/wm????.h
F: sound/soc/codecs/wm*
WORKQUEUE
M: Tejun Heo <tj@kernel.org>
L: linux-kernel@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git
S: Maintained
F: include/linux/workqueue.h
F: kernel/workqueue.c
F: Documentation/workqueue.txt
X.25 NETWORK LAYER
M: Andrew Hendry <andrew.hendry@gmail.com>
L: linux-x25@vger.kernel.org
...
...
Makefile
View file @
6c529a26
VERSION
=
2
PATCHLEVEL
=
6
SUBLEVEL
=
37
EXTRAVERSION
=
-rc
5
EXTRAVERSION
=
-rc
7
NAME
=
Flesh-Eating Bats with Fangs
# *DOCUMENTATION*
...
...
arch/arm/Kconfig
View file @
6c529a26
...
...
@@ -1311,7 +1311,7 @@ config HZ
config THUMB2_KERNEL
bool "Compile the kernel in Thumb-2 mode"
depends on CPU_V7 && EXPERIMENTAL
depends on CPU_V7 &&
!CPU_V6 &&
EXPERIMENTAL
select AEABI
select ARM_ASM_UNIFIED
help
...
...
@@ -1759,7 +1759,7 @@ comment "At least one emulation must be selected"
config FPE_NWFPE
bool "NWFPE math emulation"
depends on !AEABI || OABI_COMPAT
depends on
(
!AEABI || OABI_COMPAT
) && !THUMB2_KERNEL
---help---
Say Y to include the NWFPE floating point emulator in the kernel.
This is necessary to run most binaries. Linux does not currently
...
...
arch/arm/mach-at91/Makefile
View file @
6c529a26
...
...
@@ -65,7 +65,7 @@ obj-$(CONFIG_MACH_AT91SAM9G20EK) += board-sam9g20ek.o
obj-$(CONFIG_MACH_CPU9G20)
+=
board-cpu9krea.o
obj-$(CONFIG_MACH_STAMP9G20)
+=
board-stamp9g20.o
obj-$(CONFIG_MACH_PORTUXG20)
+=
board-stamp9g20.o
obj-$(CONFIG_MACH_PCONTROL_G20)
+=
board-pcontrol-g20.o
obj-$(CONFIG_MACH_PCONTROL_G20)
+=
board-pcontrol-g20.o
board-stamp9g20.o
# AT91SAM9260/AT91SAM9G20 board-specific support
obj-$(CONFIG_MACH_SNAPPER_9260)
+=
board-snapper9260.o
...
...
arch/arm/mach-at91/board-pcontrol-g20.c
View file @
6c529a26
...
...
@@ -31,6 +31,7 @@
#include <mach/board.h>
#include <mach/at91sam9_smc.h>
#include <mach/stamp9g20.h>
#include "sam9_smc.h"
#include "generic.h"
...
...
@@ -38,11 +39,7 @@
static
void
__init
pcontrol_g20_map_io
(
void
)
{
/* Initialize processor: 18.432 MHz crystal */
at91sam9260_initialize
(
18432000
);
/* DGBU on ttyS0. (Rx, Tx) only TTL -> JTAG connector X7 17,19 ) */
at91_register_uart
(
0
,
0
,
0
);
stamp9g20_map_io
();
/* USART0 on ttyS1. (Rx, Tx, CTS, RTS) piggyback A2 */
at91_register_uart
(
AT91SAM9260_ID_US0
,
1
,
ATMEL_UART_CTS
...
...
@@ -54,9 +51,6 @@ static void __init pcontrol_g20_map_io(void)
/* USART2 on ttyS3. (Rx, Tx) 9bit-Bus Multidrop-mode X4 */
at91_register_uart
(
AT91SAM9260_ID_US4
,
3
,
0
);
/* set serial console to ttyS0 (ie, DBGU) */
at91_set_serial_console
(
0
);
}
...
...
@@ -66,38 +60,6 @@ static void __init init_irq(void)
}
/*
* NAND flash 512MiB 1,8V 8-bit, sector size 128 KiB
*/
static
struct
atmel_nand_data
__initdata
nand_data
=
{
.
ale
=
21
,
.
cle
=
22
,
.
rdy_pin
=
AT91_PIN_PC13
,
.
enable_pin
=
AT91_PIN_PC14
,
};
/*
* Bus timings; unit = 7.57ns
*/
static
struct
sam9_smc_config
__initdata
nand_smc_config
=
{
.
ncs_read_setup
=
0
,
.
nrd_setup
=
2
,
.
ncs_write_setup
=
0
,
.
nwe_setup
=
2
,
.
ncs_read_pulse
=
4
,
.
nrd_pulse
=
4
,
.
ncs_write_pulse
=
4
,
.
nwe_pulse
=
4
,
.
read_cycle
=
7
,
.
write_cycle
=
7
,
.
mode
=
AT91_SMC_READMODE
|
AT91_SMC_WRITEMODE
|
AT91_SMC_EXNWMODE_DISABLE
|
AT91_SMC_DBW_8
,
.
tdf_cycles
=
3
,
};
static
struct
sam9_smc_config
__initdata
pcontrol_smc_config
[
2
]
=
{
{
.
ncs_read_setup
=
16
,
.
nrd_setup
=
18
,
...
...
@@ -138,14 +100,6 @@ static struct sam9_smc_config __initdata pcontrol_smc_config[2] = { {
.
tdf_cycles
=
1
,
}
};
static
void
__init
add_device_nand
(
void
)
{
/* configure chip-select 3 (NAND) */
sam9_smc_configure
(
3
,
&
nand_smc_config
);
at91_add_device_nand
(
&
nand_data
);
}
static
void
__init
add_device_pcontrol
(
void
)
{
/* configure chip-select 4 (IO compatible to 8051 X4 ) */
...
...
@@ -155,23 +109,6 @@ static void __init add_device_pcontrol(void)
}
/*
* MCI (SD/MMC)
* det_pin, wp_pin and vcc_pin are not connected
*/
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
static
struct
mci_platform_data
__initdata
mmc_data
=
{
.
slot
[
0
]
=
{
.
bus_width
=
4
,
},
};
#else
static
struct
at91_mmc_data
__initdata
mmc_data
=
{
.
wire4
=
1
,
};
#endif
/*
* USB Host port
*/
...
...
@@ -265,42 +202,13 @@ static struct spi_board_info pcontrol_g20_spi_devices[] = {
};
/*
* Dallas 1-Wire DS2431
*/
static
struct
w1_gpio_platform_data
w1_gpio_pdata
=
{
.
pin
=
AT91_PIN_PA29
,
.
is_open_drain
=
1
,
};
static
struct
platform_device
w1_device
=
{
.
name
=
"w1-gpio"
,
.
id
=
-
1
,
.
dev
.
platform_data
=
&
w1_gpio_pdata
,
};
static
void
add_wire1
(
void
)
{
at91_set_GPIO_periph
(
w1_gpio_pdata
.
pin
,
1
);
at91_set_multi_drive
(
w1_gpio_pdata
.
pin
,
1
);
platform_device_register
(
&
w1_device
);
}
static
void
__init
pcontrol_g20_board_init
(
void
)
{
at91_add_device_serial
();
add_device_nand
();
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
at91_add_device_mci
(
0
,
&
mmc_data
);
#else
at91_add_device_mmc
(
0
,
&
mmc_data
);
#endif
stamp9g20_board_init
();
at91_add_device_usbh
(
&
usbh_data
);
at91_add_device_eth
(
&
macb_data
);
at91_add_device_i2c
(
pcontrol_g20_i2c_devices
,
ARRAY_SIZE
(
pcontrol_g20_i2c_devices
));
add_wire1
();
add_device_pcontrol
();
at91_add_device_spi
(
pcontrol_g20_spi_devices
,
ARRAY_SIZE
(
pcontrol_g20_spi_devices
));
...
...
arch/arm/mach-at91/board-stamp9g20.c
View file @
6c529a26
...
...
@@ -32,7 +32,7 @@
#include "generic.h"
static
void
__init
portux
g20_map_io
(
void
)
void
__init
stamp9
g20_map_io
(
void
)
{
/* Initialize processor: 18.432 MHz crystal */
at91sam9260_initialize
(
18432000
);
...
...
@@ -40,6 +40,24 @@ static void __init portuxg20_map_io(void)
/* DGBU on ttyS0. (Rx & Tx only) */
at91_register_uart
(
0
,
0
,
0
);
/* set serial console to ttyS0 (ie, DBGU) */
at91_set_serial_console
(
0
);
}
static
void
__init
stamp9g20evb_map_io
(
void
)
{
stamp9g20_map_io
();
/* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
at91_register_uart
(
AT91SAM9260_ID_US0
,
1
,
ATMEL_UART_CTS
|
ATMEL_UART_RTS
|
ATMEL_UART_DTR
|
ATMEL_UART_DSR
|
ATMEL_UART_DCD
|
ATMEL_UART_RI
);
}
static
void
__init
portuxg20_map_io
(
void
)
{
stamp9g20_map_io
();
/* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
at91_register_uart
(
AT91SAM9260_ID_US0
,
1
,
ATMEL_UART_CTS
|
ATMEL_UART_RTS
|
ATMEL_UART_DTR
|
ATMEL_UART_DSR
...
...
@@ -56,26 +74,6 @@ static void __init portuxg20_map_io(void)
/* USART5 on ttyS6. (Rx, Tx only) */
at91_register_uart
(
AT91SAM9260_ID_US5
,
6
,
0
);
/* set serial console to ttyS0 (ie, DBGU) */
at91_set_serial_console
(
0
);
}
static
void
__init
stamp9g20_map_io
(
void
)
{
/* Initialize processor: 18.432 MHz crystal */
at91sam9260_initialize
(
18432000
);
/* DGBU on ttyS0. (Rx & Tx only) */
at91_register_uart
(
0
,
0
,
0
);
/* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
at91_register_uart
(
AT91SAM9260_ID_US0
,
1
,
ATMEL_UART_CTS
|
ATMEL_UART_RTS
|
ATMEL_UART_DTR
|
ATMEL_UART_DSR
|
ATMEL_UART_DCD
|
ATMEL_UART_RI
);
/* set serial console to ttyS0 (ie, DBGU) */
at91_set_serial_console
(
0
);
}
static
void
__init
init_irq
(
void
)
...
...
@@ -156,7 +154,7 @@ static struct at91_udc_data __initdata portuxg20_udc_data = {
.
pullup_pin
=
0
,
/* pull-up driven by UDC */
};
static
struct
at91_udc_data
__initdata
stamp9g20_udc_data
=
{
static
struct
at91_udc_data
__initdata
stamp9g20
evb
_udc_data
=
{
.
vbus_pin
=
AT91_PIN_PA22
,
.
pullup_pin
=
0
,
/* pull-up driven by UDC */
};
...
...
@@ -190,7 +188,7 @@ static struct gpio_led portuxg20_leds[] = {
}
};
static
struct
gpio_led
stamp9g20_leds
[]
=
{
static
struct
gpio_led
stamp9g20
evb
_leds
[]
=
{
{
.
name
=
"D8"
,
.
gpio
=
AT91_PIN_PB18
,
...
...
@@ -250,7 +248,7 @@ void add_w1(void)
}
static
void
__init
generic
_board_init
(
void
)
void
__init
stamp9g20
_board_init
(
void
)
{
/* Serial */
at91_add_device_serial
();
...
...
@@ -262,34 +260,40 @@ static void __init generic_board_init(void)
#else
at91_add_device_mmc
(
0
,
&
mmc_data
);
#endif
/* USB Host */
at91_add_device_usbh
(
&
usbh_data
);
/* Ethernet */
at91_add_device_eth
(
&
macb_data
);
/* I2C */
at91_add_device_i2c
(
NULL
,
0
);
/* W1 */
add_w1
();
}
static
void
__init
portuxg20_board_init
(
void
)
{
generic
_board_init
();
/*
SPI
*/
at91_add_device_
spi
(
portuxg20_spi_devices
,
ARRAY_SIZE
(
portuxg20_spi_devices
)
);
stamp9g20
_board_init
();
/*
USB Host
*/
at91_add_device_
usbh
(
&
usbh_data
);
/* USB Device */
at91_add_device_udc
(
&
portuxg20_udc_data
);
/* Ethernet */
at91_add_device_eth
(
&
macb_data
);
/* I2C */
at91_add_device_i2c
(
NULL
,
0
);
/* SPI */
at91_add_device_spi
(
portuxg20_spi_devices
,
ARRAY_SIZE
(
portuxg20_spi_devices
));
/* LEDs */
at91_gpio_leds
(
portuxg20_leds
,
ARRAY_SIZE
(
portuxg20_leds
));
}
static
void
__init
stamp9g20_board_init
(
void
)
static
void
__init
stamp9g20
evb
_board_init
(
void
)
{
generic_board_init
();
stamp9g20_board_init
();
/* USB Host */
at91_add_device_usbh
(
&
usbh_data
);
/* USB Device */
at91_add_device_udc
(
&
stamp9g20_udc_data
);
at91_add_device_udc
(
&
stamp9g20evb_udc_data
);
/* Ethernet */
at91_add_device_eth
(
&
macb_data
);
/* I2C */
at91_add_device_i2c
(
NULL
,
0
);
/* LEDs */
at91_gpio_leds
(
stamp9g20_leds
,
ARRAY_SIZE
(
stamp9g20_leds
));
at91_gpio_leds
(
stamp9g20
evb
_leds
,
ARRAY_SIZE
(
stamp9g20
evb
_leds
));
}
MACHINE_START
(
PORTUXG20
,
"taskit PortuxG20"
)
...
...
@@ -305,7 +309,7 @@ MACHINE_START(STAMP9G20, "taskit Stamp9G20")
/* Maintainer: taskit GmbH */
.
boot_params
=
AT91_SDRAM_BASE
+
0x100
,
.
timer
=
&
at91sam926x_timer
,
.
map_io
=
stamp9g20_map_io
,
.
map_io
=
stamp9g20
evb
_map_io
,
.
init_irq
=
init_irq
,
.
init_machine
=
stamp9g20_board_init
,
.
init_machine
=
stamp9g20
evb
_board_init
,
MACHINE_END
arch/arm/mach-at91/clock.c
View file @
6c529a26
...
...
@@ -658,7 +658,7 @@ static void __init at91_upll_usbfs_clock_init(unsigned long main_clock)
/* Now set uhpck values */
uhpck
.
parent
=
&
utmi_clk
;
uhpck
.
pmc_mask
=
AT91SAM926x_PMC_UHP
;
uhpck
.
rate_hz
=
utmi_clk
.
parent
->
rate_hz
;
uhpck
.
rate_hz
=
utmi_clk
.
rate_hz
;
uhpck
.
rate_hz
/=
1
+
((
at91_sys_read
(
AT91_PMC_USB
)
&
AT91_PMC_OHCIUSBDIV
)
>>
8
);
}
...
...
arch/arm/mach-at91/include/mach/stamp9g20.h
0 → 100644
View file @
6c529a26
#ifndef __MACH_STAMP9G20_H
#define __MACH_STAMP9G20_H
void
stamp9g20_map_io
(
void
);
void
stamp9g20_board_init
(
void
);
#endif
arch/arm/mach-mmp/mmp2.c
View file @
6c529a26
...
...
@@ -126,7 +126,6 @@ static APBC_CLK(twsi3, MMP2_TWSI3, 0, 26000000);
static
APBC_CLK
(
twsi4
,
MMP2_TWSI4
,
0
,
26000000
);
static
APBC_CLK
(
twsi5
,
MMP2_TWSI5
,
0
,
26000000
);
static
APBC_CLK
(
twsi6
,
MMP2_TWSI6
,
0
,
26000000
);
static
APBC_CLK
(
rtc
,
MMP2_RTC
,
0
,
32768
);
static
APMU_CLK
(
nand
,
NAND
,
0xbf
,
100000000
);
...
...
arch/arm/mach-omap2/board-zoom-peripherals.c
View file @
6c529a26
...
...
@@ -216,7 +216,7 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
{
.
name
=
"wl1271"
,
.
mmc
=
3
,
.
caps
=
MMC_CAP_4_BIT_DATA
,
.
caps
=
MMC_CAP_4_BIT_DATA
|
MMC_CAP_POWER_OFF_CARD
,
.
gpio_wp
=
-
EINVAL
,
.
gpio_cd
=
-
EINVAL
,
.
nonremovable
=
true
,
...
...
arch/arm/mach-omap2/io.c
View file @
6c529a26
...
...
@@ -297,7 +297,7 @@ static int __init _omap2_init_reprogram_sdrc(void)
return
0
;
dpll3_m2_ck
=
clk_get
(
NULL
,
"dpll3_m2_ck"
);
if
(
!
dpll3_m2_ck
)
if
(
IS_ERR
(
dpll3_m2_ck
)
)
return
-
EINVAL
;
rate
=
clk_get_rate
(
dpll3_m2_ck
);
...
...
arch/arm/mach-omap2/pm-debug.c
View file @
6c529a26
...
...
@@ -161,6 +161,23 @@ void omap2_pm_dump(int mode, int resume, unsigned int us)
printk
(
KERN_INFO
"%-20s: 0x%08x
\n
"
,
regs
[
i
].
name
,
regs
[
i
].
val
);
}
void
omap2_pm_wakeup_on_timer
(
u32
seconds
,
u32
milliseconds
)
{
u32
tick_rate
,
cycles
;
if
(
!
seconds
&&
!
milliseconds
)
return
;
tick_rate
=
clk_get_rate
(
omap_dm_timer_get_fclk
(
gptimer_wakeup
));
cycles
=
tick_rate
*
seconds
+
tick_rate
*
milliseconds
/
1000
;
omap_dm_timer_stop
(
gptimer_wakeup
);
omap_dm_timer_set_load_start
(
gptimer_wakeup
,
0
,
0xffffffff
-
cycles
);
pr_info
(
"PM: Resume timer in %u.%03u secs"
" (%d ticks at %d ticks/sec.)
\n
"
,
seconds
,
milliseconds
,
cycles
,
tick_rate
);
}
#ifdef CONFIG_DEBUG_FS
#include <linux/debugfs.h>
#include <linux/seq_file.h>
...
...
@@ -354,23 +371,6 @@ void pm_dbg_update_time(struct powerdomain *pwrdm, int prev)
pwrdm
->
timer
=
t
;
}
void
omap2_pm_wakeup_on_timer
(
u32
seconds
,
u32
milliseconds
)
{
u32
tick_rate
,
cycles
;
if
(
!
seconds
&&
!
milliseconds
)
return
;
tick_rate
=
clk_get_rate
(
omap_dm_timer_get_fclk
(
gptimer_wakeup
));
cycles
=
tick_rate
*
seconds
+
tick_rate
*
milliseconds
/
1000
;
omap_dm_timer_stop
(
gptimer_wakeup
);
omap_dm_timer_set_load_start
(
gptimer_wakeup
,
0
,
0xffffffff
-
cycles
);
pr_info
(
"PM: Resume timer in %u.%03u secs"
" (%d ticks at %d ticks/sec.)
\n
"
,
seconds
,
milliseconds
,
cycles
,
tick_rate
);
}
static
int
clkdm_dbg_show_counter
(
struct
clockdomain
*
clkdm
,
void
*
user
)
{
struct
seq_file
*
s
=
(
struct
seq_file
*
)
user
;
...
...
arch/arm/mach-omap2/pm24xx.c
View file @
6c529a26
...
...
@@ -53,6 +53,19 @@
#include <plat/powerdomain.h>
#include <plat/clockdomain.h>
#ifdef CONFIG_SUSPEND
static
suspend_state_t
suspend_state
=
PM_SUSPEND_ON
;
static
inline
bool
is_suspending
(
void
)
{
return
(
suspend_state
!=
PM_SUSPEND_ON
);
}
#else
static
inline
bool
is_suspending
(
void
)
{
return
false
;
}
#endif
static
void
(
*
omap2_sram_idle
)(
void
);
static
void
(
*
omap2_sram_suspend
)(
u32
dllctrl
,
void
__iomem
*
sdrc_dlla_ctrl
,
void
__iomem
*
sdrc_power
);
...
...
@@ -120,8 +133,9 @@ static void omap2_enter_full_retention(void)
goto
no_sleep
;
/* Block console output in case it is on one of the OMAP UARTs */
if
(
try_acquire_console_sem
())
goto
no_sleep
;
if
(
!
is_suspending
())
if
(
try_acquire_console_sem
())
goto
no_sleep
;
omap_uart_prepare_idle
(
0
);
omap_uart_prepare_idle
(
1
);
...
...
@@ -136,7 +150,8 @@ static void omap2_enter_full_retention(void)
omap_uart_resume_idle
(
1
);
omap_uart_resume_idle
(
0
);
release_console_sem
();
if
(
!
is_suspending
())
release_console_sem
();
no_sleep:
if
(
omap2_pm_debug
)
{
...
...
@@ -284,6 +299,12 @@ out:
local_irq_enable
();
}
static
int
omap2_pm_begin
(
suspend_state_t
state
)
{
suspend_state
=
state
;
return
0
;
}
static
int
omap2_pm_prepare
(
void
)
{
/* We cannot sleep in idle until we have resumed */
...
...
@@ -333,10 +354,17 @@ static void omap2_pm_finish(void)
enable_hlt
();
}
static
void
omap2_pm_end
(
void
)
{
suspend_state
=
PM_SUSPEND_ON
;
}
static
struct
platform_suspend_ops
omap_pm_ops
=
{
.
begin
=
omap2_pm_begin
,
.
prepare
=
omap2_pm_prepare
,
.
enter
=
omap2_pm_enter
,
.
finish
=
omap2_pm_finish
,