diff options
author | Arnd Bergmann <arnd@arndb.de> | 2012-07-03 15:56:23 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2012-07-03 15:56:23 -0400 |
commit | 5351da96bd6662d28c41a3e9e652019a11f3cf7c (patch) | |
tree | a7c102be99924b1ffc7b0210dab368679e6ea0ef | |
parent | 6887a4131da3adaab011613776d865f4bcfb5678 (diff) | |
parent | c59b537d87068be8c357a0150f6172a2dc8cdf82 (diff) |
Merge tag 'omap-devel-dmtimer-for-v3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/timer
From Tony Lindgren <tony@atomide.com>:
Here are some omap dmtimer changes to make it easier to add
device tree support for dmtimer by simplifying the platform
data structure used by dmtimr.
* tag 'omap-devel-dmtimer-for-v3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
ARM: OMAP2+: Simplify dmtimer clock aliases
ARM: OMAP2+: Move dmtimer clock set function to dmtimer driver
ARM: OMAP1: Fix dmtimer support
ARM: OMAP: Add flag to indicate if a timer needs a manual reset
ARM: OMAP: Remove timer function pointer for context loss counter
ARM: OMAP: Remove loses_context variable from timer platform data
ARM: OMAP2+: Fix external clock support for dmtimers
ARM: OMAP2+: HWMOD: Correct timer device attributes
ARM: OMAP: Add DMTIMER capability variable to represent timer features
ARM: OMAP2+: Add dmtimer platform function to reserve systimers
ARM: OMAP2+: Remove unused max number of timers definition
ARM: OMAP: Remove unnecessary clk structure
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-rw-r--r-- | arch/arm/mach-omap1/timer.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock2420_data.c | 39 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock2430_data.c | 39 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock3xxx_data.c | 26 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock44xx_data.c | 34 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 10 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-omap2/timer.c | 82 | ||||
-rw-r--r-- | arch/arm/plat-omap/dmtimer.c | 111 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/dmtimer.h | 22 |
11 files changed, 118 insertions, 262 deletions
diff --git a/arch/arm/mach-omap1/timer.c b/arch/arm/mach-omap1/timer.c index 64c65bcb2d67..aa81593db1af 100644 --- a/arch/arm/mach-omap1/timer.c +++ b/arch/arm/mach-omap1/timer.c | |||
@@ -140,7 +140,8 @@ static int __init omap1_dm_timer_init(void) | |||
140 | } | 140 | } |
141 | 141 | ||
142 | pdata->set_timer_src = omap1_dm_timer_set_src; | 142 | pdata->set_timer_src = omap1_dm_timer_set_src; |
143 | pdata->needs_manual_reset = 1; | 143 | pdata->timer_capability = OMAP_TIMER_ALWON | |
144 | OMAP_TIMER_NEEDS_RESET; | ||
144 | 145 | ||
145 | ret = platform_device_add_data(pdev, pdata, sizeof(*pdata)); | 146 | ret = platform_device_add_data(pdev, pdata, sizeof(*pdata)); |
146 | if (ret) { | 147 | if (ret) { |
diff --git a/arch/arm/mach-omap2/clock2420_data.c b/arch/arm/mach-omap2/clock2420_data.c index bace9308a4db..861767ed1a3a 100644 --- a/arch/arm/mach-omap2/clock2420_data.c +++ b/arch/arm/mach-omap2/clock2420_data.c | |||
@@ -1901,42 +1901,9 @@ static struct omap_clk omap2420_clks[] = { | |||
1901 | CLK(NULL, "pka_ick", &pka_ick, CK_242X), | 1901 | CLK(NULL, "pka_ick", &pka_ick, CK_242X), |
1902 | CLK(NULL, "usb_fck", &usb_fck, CK_242X), | 1902 | CLK(NULL, "usb_fck", &usb_fck, CK_242X), |
1903 | CLK("musb-hdrc", "fck", &osc_ck, CK_242X), | 1903 | CLK("musb-hdrc", "fck", &osc_ck, CK_242X), |
1904 | CLK("omap_timer.1", "32k_ck", &func_32k_ck, CK_243X), | 1904 | CLK(NULL, "timer_32k_ck", &func_32k_ck, CK_243X), |
1905 | CLK("omap_timer.2", "32k_ck", &func_32k_ck, CK_243X), | 1905 | CLK(NULL, "timer_sys_ck", &sys_ck, CK_243X), |
1906 | CLK("omap_timer.3", "32k_ck", &func_32k_ck, CK_243X), | 1906 | CLK(NULL, "timer_ext_ck", &alt_ck, CK_243X), |
1907 | CLK("omap_timer.4", "32k_ck", &func_32k_ck, CK_243X), | ||
1908 | CLK("omap_timer.5", "32k_ck", &func_32k_ck, CK_243X), | ||
1909 | CLK("omap_timer.6", "32k_ck", &func_32k_ck, CK_243X), | ||
1910 | CLK("omap_timer.7", "32k_ck", &func_32k_ck, CK_243X), | ||
1911 | CLK("omap_timer.8", "32k_ck", &func_32k_ck, CK_243X), | ||
1912 | CLK("omap_timer.9", "32k_ck", &func_32k_ck, CK_243X), | ||
1913 | CLK("omap_timer.10", "32k_ck", &func_32k_ck, CK_243X), | ||
1914 | CLK("omap_timer.11", "32k_ck", &func_32k_ck, CK_243X), | ||
1915 | CLK("omap_timer.12", "32k_ck", &func_32k_ck, CK_243X), | ||
1916 | CLK("omap_timer.1", "sys_ck", &sys_ck, CK_243X), | ||
1917 | CLK("omap_timer.2", "sys_ck", &sys_ck, CK_243X), | ||
1918 | CLK("omap_timer.3", "sys_ck", &sys_ck, CK_243X), | ||
1919 | CLK("omap_timer.4", "sys_ck", &sys_ck, CK_243X), | ||
1920 | CLK("omap_timer.5", "sys_ck", &sys_ck, CK_243X), | ||
1921 | CLK("omap_timer.6", "sys_ck", &sys_ck, CK_243X), | ||
1922 | CLK("omap_timer.7", "sys_ck", &sys_ck, CK_243X), | ||
1923 | CLK("omap_timer.8", "sys_ck", &sys_ck, CK_243X), | ||
1924 | CLK("omap_timer.9", "sys_ck", &sys_ck, CK_243X), | ||
1925 | CLK("omap_timer.10", "sys_ck", &sys_ck, CK_243X), | ||
1926 | CLK("omap_timer.11", "sys_ck", &sys_ck, CK_243X), | ||
1927 | CLK("omap_timer.12", "sys_ck", &sys_ck, CK_243X), | ||
1928 | CLK("omap_timer.1", "alt_ck", &alt_ck, CK_243X), | ||
1929 | CLK("omap_timer.2", "alt_ck", &alt_ck, CK_243X), | ||
1930 | CLK("omap_timer.3", "alt_ck", &alt_ck, CK_243X), | ||
1931 | CLK("omap_timer.4", "alt_ck", &alt_ck, CK_243X), | ||
1932 | CLK("omap_timer.5", "alt_ck", &alt_ck, CK_243X), | ||
1933 | CLK("omap_timer.6", "alt_ck", &alt_ck, CK_243X), | ||
1934 | CLK("omap_timer.7", "alt_ck", &alt_ck, CK_243X), | ||
1935 | CLK("omap_timer.8", "alt_ck", &alt_ck, CK_243X), | ||
1936 | CLK("omap_timer.9", "alt_ck", &alt_ck, CK_243X), | ||
1937 | CLK("omap_timer.10", "alt_ck", &alt_ck, CK_243X), | ||
1938 | CLK("omap_timer.11", "alt_ck", &alt_ck, CK_243X), | ||
1939 | CLK("omap_timer.12", "alt_ck", &alt_ck, CK_243X), | ||
1940 | }; | 1907 | }; |
1941 | 1908 | ||
1942 | /* | 1909 | /* |
diff --git a/arch/arm/mach-omap2/clock2430_data.c b/arch/arm/mach-omap2/clock2430_data.c index 3b4d09a50399..5577810dbc26 100644 --- a/arch/arm/mach-omap2/clock2430_data.c +++ b/arch/arm/mach-omap2/clock2430_data.c | |||
@@ -2000,42 +2000,9 @@ static struct omap_clk omap2430_clks[] = { | |||
2000 | CLK(NULL, "mdm_intc_ick", &mdm_intc_ick, CK_243X), | 2000 | CLK(NULL, "mdm_intc_ick", &mdm_intc_ick, CK_243X), |
2001 | CLK("omap_hsmmc.0", "mmchsdb_fck", &mmchsdb1_fck, CK_243X), | 2001 | CLK("omap_hsmmc.0", "mmchsdb_fck", &mmchsdb1_fck, CK_243X), |
2002 | CLK("omap_hsmmc.1", "mmchsdb_fck", &mmchsdb2_fck, CK_243X), | 2002 | CLK("omap_hsmmc.1", "mmchsdb_fck", &mmchsdb2_fck, CK_243X), |
2003 | CLK("omap_timer.1", "32k_ck", &func_32k_ck, CK_243X), | 2003 | CLK(NULL, "timer_32k_ck", &func_32k_ck, CK_243X), |
2004 | CLK("omap_timer.2", "32k_ck", &func_32k_ck, CK_243X), | 2004 | CLK(NULL, "timer_sys_ck", &sys_ck, CK_243X), |
2005 | CLK("omap_timer.3", "32k_ck", &func_32k_ck, CK_243X), | 2005 | CLK(NULL, "timer_ext_ck", &alt_ck, CK_243X), |
2006 | CLK("omap_timer.4", "32k_ck", &func_32k_ck, CK_243X), | ||
2007 | CLK("omap_timer.5", "32k_ck", &func_32k_ck, CK_243X), | ||
2008 | CLK("omap_timer.6", "32k_ck", &func_32k_ck, CK_243X), | ||
2009 | CLK("omap_timer.7", "32k_ck", &func_32k_ck, CK_243X), | ||
2010 | CLK("omap_timer.8", "32k_ck", &func_32k_ck, CK_243X), | ||
2011 | CLK("omap_timer.9", "32k_ck", &func_32k_ck, CK_243X), | ||
2012 | CLK("omap_timer.10", "32k_ck", &func_32k_ck, CK_243X), | ||
2013 | CLK("omap_timer.11", "32k_ck", &func_32k_ck, CK_243X), | ||
2014 | CLK("omap_timer.12", "32k_ck", &func_32k_ck, CK_243X), | ||
2015 | CLK("omap_timer.1", "sys_ck", &sys_ck, CK_243X), | ||
2016 | CLK("omap_timer.2", "sys_ck", &sys_ck, CK_243X), | ||
2017 | CLK("omap_timer.3", "sys_ck", &sys_ck, CK_243X), | ||
2018 | CLK("omap_timer.4", "sys_ck", &sys_ck, CK_243X), | ||
2019 | CLK("omap_timer.5", "sys_ck", &sys_ck, CK_243X), | ||
2020 | CLK("omap_timer.6", "sys_ck", &sys_ck, CK_243X), | ||
2021 | CLK("omap_timer.7", "sys_ck", &sys_ck, CK_243X), | ||
2022 | CLK("omap_timer.8", "sys_ck", &sys_ck, CK_243X), | ||
2023 | CLK("omap_timer.9", "sys_ck", &sys_ck, CK_243X), | ||
2024 | CLK("omap_timer.10", "sys_ck", &sys_ck, CK_243X), | ||
2025 | CLK("omap_timer.11", "sys_ck", &sys_ck, CK_243X), | ||
2026 | CLK("omap_timer.12", "sys_ck", &sys_ck, CK_243X), | ||
2027 | CLK("omap_timer.1", "alt_ck", &alt_ck, CK_243X), | ||
2028 | CLK("omap_timer.2", "alt_ck", &alt_ck, CK_243X), | ||
2029 | CLK("omap_timer.3", "alt_ck", &alt_ck, CK_243X), | ||
2030 | CLK("omap_timer.4", "alt_ck", &alt_ck, CK_243X), | ||
2031 | CLK("omap_timer.5", "alt_ck", &alt_ck, CK_243X), | ||
2032 | CLK("omap_timer.6", "alt_ck", &alt_ck, CK_243X), | ||
2033 | CLK("omap_timer.7", "alt_ck", &alt_ck, CK_243X), | ||
2034 | CLK("omap_timer.8", "alt_ck", &alt_ck, CK_243X), | ||
2035 | CLK("omap_timer.9", "alt_ck", &alt_ck, CK_243X), | ||
2036 | CLK("omap_timer.10", "alt_ck", &alt_ck, CK_243X), | ||
2037 | CLK("omap_timer.11", "alt_ck", &alt_ck, CK_243X), | ||
2038 | CLK("omap_timer.12", "alt_ck", &alt_ck, CK_243X), | ||
2039 | }; | 2006 | }; |
2040 | 2007 | ||
2041 | /* | 2008 | /* |
diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index 1efdec236ae8..0d814620b69c 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c | |||
@@ -3482,30 +3482,8 @@ static struct omap_clk omap3xxx_clks[] = { | |||
3482 | CLK("musb-am35x", "fck", &hsotgusb_fck_am35xx, CK_AM35XX), | 3482 | CLK("musb-am35x", "fck", &hsotgusb_fck_am35xx, CK_AM35XX), |
3483 | CLK(NULL, "hecc_ck", &hecc_ck, CK_AM35XX), | 3483 | CLK(NULL, "hecc_ck", &hecc_ck, CK_AM35XX), |
3484 | CLK(NULL, "uart4_ick", &uart4_ick_am35xx, CK_AM35XX), | 3484 | CLK(NULL, "uart4_ick", &uart4_ick_am35xx, CK_AM35XX), |
3485 | CLK("omap_timer.1", "32k_ck", &omap_32k_fck, CK_3XXX), | 3485 | CLK(NULL, "timer_32k_ck", &omap_32k_fck, CK_3XXX), |
3486 | CLK("omap_timer.2", "32k_ck", &omap_32k_fck, CK_3XXX), | 3486 | CLK(NULL, "timer_sys_ck", &sys_ck, CK_3XXX), |
3487 | CLK("omap_timer.3", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3488 | CLK("omap_timer.4", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3489 | CLK("omap_timer.5", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3490 | CLK("omap_timer.6", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3491 | CLK("omap_timer.7", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3492 | CLK("omap_timer.8", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3493 | CLK("omap_timer.9", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3494 | CLK("omap_timer.10", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3495 | CLK("omap_timer.11", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3496 | CLK("omap_timer.12", "32k_ck", &omap_32k_fck, CK_3XXX), | ||
3497 | CLK("omap_timer.1", "sys_ck", &sys_ck, CK_3XXX), | ||
3498 | CLK("omap_timer.2", "sys_ck", &sys_ck, CK_3XXX), | ||
3499 | CLK("omap_timer.3", "sys_ck", &sys_ck, CK_3XXX), | ||
3500 | CLK("omap_timer.4", "sys_ck", &sys_ck, CK_3XXX), | ||
3501 | CLK("omap_timer.5", "sys_ck", &sys_ck, CK_3XXX), | ||
3502 | CLK("omap_timer.6", "sys_ck", &sys_ck, CK_3XXX), | ||
3503 | CLK("omap_timer.7", "sys_ck", &sys_ck, CK_3XXX), | ||
3504 | CLK("omap_timer.8", "sys_ck", &sys_ck, CK_3XXX), | ||
3505 | CLK("omap_timer.9", "sys_ck", &sys_ck, CK_3XXX), | ||
3506 | CLK("omap_timer.10", "sys_ck", &sys_ck, CK_3XXX), | ||
3507 | CLK("omap_timer.11", "sys_ck", &sys_ck, CK_3XXX), | ||
3508 | CLK("omap_timer.12", "sys_ck", &sys_ck, CK_3XXX), | ||
3509 | }; | 3487 | }; |
3510 | 3488 | ||
3511 | 3489 | ||
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index ba6f9a0a43e9..de53b7014b80 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c | |||
@@ -3385,28 +3385,18 @@ static struct omap_clk omap44xx_clks[] = { | |||
3385 | CLK("usbhs_omap", "usbhost_ick", &dummy_ck, CK_443X), | 3385 | CLK("usbhs_omap", "usbhost_ick", &dummy_ck, CK_443X), |
3386 | CLK("usbhs_omap", "usbtll_fck", &dummy_ck, CK_443X), | 3386 | CLK("usbhs_omap", "usbtll_fck", &dummy_ck, CK_443X), |
3387 | CLK("omap_wdt", "ick", &dummy_ck, CK_443X), | 3387 | CLK("omap_wdt", "ick", &dummy_ck, CK_443X), |
3388 | CLK("omap_timer.1", "32k_ck", &sys_32k_ck, CK_443X), | 3388 | CLK(NULL, "timer_32k_ck", &sys_32k_ck, CK_443X), |
3389 | CLK("omap_timer.2", "32k_ck", &sys_32k_ck, CK_443X), | 3389 | CLK("omap_timer.1", "timer_sys_ck", &sys_clkin_ck, CK_443X), |
3390 | CLK("omap_timer.3", "32k_ck", &sys_32k_ck, CK_443X), | 3390 | CLK("omap_timer.2", "timer_sys_ck", &sys_clkin_ck, CK_443X), |
3391 | CLK("omap_timer.4", "32k_ck", &sys_32k_ck, CK_443X), | 3391 | CLK("omap_timer.3", "timer_sys_ck", &sys_clkin_ck, CK_443X), |
3392 | CLK("omap_timer.5", "32k_ck", &sys_32k_ck, CK_443X), | 3392 | CLK("omap_timer.4", "timer_sys_ck", &sys_clkin_ck, CK_443X), |
3393 | CLK("omap_timer.6", "32k_ck", &sys_32k_ck, CK_443X), | 3393 | CLK("omap_timer.9", "timer_sys_ck", &sys_clkin_ck, CK_443X), |
3394 | CLK("omap_timer.7", "32k_ck", &sys_32k_ck, CK_443X), | 3394 | CLK("omap_timer.10", "timer_sys_ck", &sys_clkin_ck, CK_443X), |
3395 | CLK("omap_timer.8", "32k_ck", &sys_32k_ck, CK_443X), | 3395 | CLK("omap_timer.11", "timer_sys_ck", &sys_clkin_ck, CK_443X), |
3396 | CLK("omap_timer.9", "32k_ck", &sys_32k_ck, CK_443X), | 3396 | CLK("omap_timer.5", "timer_sys_ck", &syc_clk_div_ck, CK_443X), |
3397 | CLK("omap_timer.10", "32k_ck", &sys_32k_ck, CK_443X), | 3397 | CLK("omap_timer.6", "timer_sys_ck", &syc_clk_div_ck, CK_443X), |
3398 | CLK("omap_timer.11", "32k_ck", &sys_32k_ck, CK_443X), | 3398 | CLK("omap_timer.7", "timer_sys_ck", &syc_clk_div_ck, CK_443X), |
3399 | CLK("omap_timer.1", "sys_ck", &sys_clkin_ck, CK_443X), | 3399 | CLK("omap_timer.8", "timer_sys_ck", &syc_clk_div_ck, CK_443X), |
3400 | CLK("omap_timer.2", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3401 | CLK("omap_timer.3", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3402 | CLK("omap_timer.4", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3403 | CLK("omap_timer.9", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3404 | CLK("omap_timer.10", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3405 | CLK("omap_timer.11", "sys_ck", &sys_clkin_ck, CK_443X), | ||
3406 | CLK("omap_timer.5", "sys_ck", &syc_clk_div_ck, CK_443X), | ||
3407 | CLK("omap_timer.6", "sys_ck", &syc_clk_div_ck, CK_443X), | ||
3408 | CLK("omap_timer.7", "sys_ck", &syc_clk_div_ck, CK_443X), | ||
3409 | CLK("omap_timer.8", "sys_ck", &syc_clk_div_ck, CK_443X), | ||
3410 | }; | 3400 | }; |
3411 | 3401 | ||
3412 | int __init omap4xxx_clk_init(void) | 3402 | int __init omap4xxx_clk_init(void) |
diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c index 83eafd96ecaa..afad69c6ba6e 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | |||
@@ -68,7 +68,6 @@ static struct omap_hwmod_class_sysconfig omap2xxx_timer_sysc = { | |||
68 | struct omap_hwmod_class omap2xxx_timer_hwmod_class = { | 68 | struct omap_hwmod_class omap2xxx_timer_hwmod_class = { |
69 | .name = "timer", | 69 | .name = "timer", |
70 | .sysc = &omap2xxx_timer_sysc, | 70 | .sysc = &omap2xxx_timer_sysc, |
71 | .rev = OMAP_TIMER_IP_VERSION_1, | ||
72 | }; | 71 | }; |
73 | 72 | ||
74 | /* | 73 | /* |
@@ -257,7 +256,6 @@ struct omap_hwmod omap2xxx_timer2_hwmod = { | |||
257 | .idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT, | 256 | .idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT, |
258 | }, | 257 | }, |
259 | }, | 258 | }, |
260 | .dev_attr = &capability_alwon_dev_attr, | ||
261 | .class = &omap2xxx_timer_hwmod_class, | 259 | .class = &omap2xxx_timer_hwmod_class, |
262 | }; | 260 | }; |
263 | 261 | ||
@@ -276,7 +274,6 @@ struct omap_hwmod omap2xxx_timer3_hwmod = { | |||
276 | .idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT, | 274 | .idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT, |
277 | }, | 275 | }, |
278 | }, | 276 | }, |
279 | .dev_attr = &capability_alwon_dev_attr, | ||
280 | .class = &omap2xxx_timer_hwmod_class, | 277 | .class = &omap2xxx_timer_hwmod_class, |
281 | }; | 278 | }; |
282 | 279 | ||
@@ -295,7 +292,6 @@ struct omap_hwmod omap2xxx_timer4_hwmod = { | |||
295 | .idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT, | 292 | .idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT, |
296 | }, | 293 | }, |
297 | }, | 294 | }, |
298 | .dev_attr = &capability_alwon_dev_attr, | ||
299 | .class = &omap2xxx_timer_hwmod_class, | 295 | .class = &omap2xxx_timer_hwmod_class, |
300 | }; | 296 | }; |
301 | 297 | ||
@@ -314,7 +310,6 @@ struct omap_hwmod omap2xxx_timer5_hwmod = { | |||
314 | .idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT, | 310 | .idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT, |
315 | }, | 311 | }, |
316 | }, | 312 | }, |
317 | .dev_attr = &capability_alwon_dev_attr, | ||
318 | .class = &omap2xxx_timer_hwmod_class, | 313 | .class = &omap2xxx_timer_hwmod_class, |
319 | }; | 314 | }; |
320 | 315 | ||
@@ -333,7 +328,6 @@ struct omap_hwmod omap2xxx_timer6_hwmod = { | |||
333 | .idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT, | 328 | .idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT, |
334 | }, | 329 | }, |
335 | }, | 330 | }, |
336 | .dev_attr = &capability_alwon_dev_attr, | ||
337 | .class = &omap2xxx_timer_hwmod_class, | 331 | .class = &omap2xxx_timer_hwmod_class, |
338 | }; | 332 | }; |
339 | 333 | ||
@@ -352,7 +346,6 @@ struct omap_hwmod omap2xxx_timer7_hwmod = { | |||
352 | .idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT, | 346 | .idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT, |
353 | }, | 347 | }, |
354 | }, | 348 | }, |
355 | .dev_attr = &capability_alwon_dev_attr, | ||
356 | .class = &omap2xxx_timer_hwmod_class, | 349 | .class = &omap2xxx_timer_hwmod_class, |
357 | }; | 350 | }; |
358 | 351 | ||
@@ -371,7 +364,6 @@ struct omap_hwmod omap2xxx_timer8_hwmod = { | |||
371 | .idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT, | 364 | .idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT, |
372 | }, | 365 | }, |
373 | }, | 366 | }, |
374 | .dev_attr = &capability_alwon_dev_attr, | ||
375 | .class = &omap2xxx_timer_hwmod_class, | 367 | .class = &omap2xxx_timer_hwmod_class, |
376 | }; | 368 | }; |
377 | 369 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index b26d3c9bca16..0ea53bcc7d18 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -129,7 +129,6 @@ static struct omap_hwmod_class_sysconfig omap3xxx_timer_1ms_sysc = { | |||
129 | static struct omap_hwmod_class omap3xxx_timer_1ms_hwmod_class = { | 129 | static struct omap_hwmod_class omap3xxx_timer_1ms_hwmod_class = { |
130 | .name = "timer", | 130 | .name = "timer", |
131 | .sysc = &omap3xxx_timer_1ms_sysc, | 131 | .sysc = &omap3xxx_timer_1ms_sysc, |
132 | .rev = OMAP_TIMER_IP_VERSION_1, | ||
133 | }; | 132 | }; |
134 | 133 | ||
135 | static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = { | 134 | static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = { |
@@ -145,12 +144,11 @@ static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = { | |||
145 | static struct omap_hwmod_class omap3xxx_timer_hwmod_class = { | 144 | static struct omap_hwmod_class omap3xxx_timer_hwmod_class = { |
146 | .name = "timer", | 145 | .name = "timer", |
147 | .sysc = &omap3xxx_timer_sysc, | 146 | .sysc = &omap3xxx_timer_sysc, |
148 | .rev = OMAP_TIMER_IP_VERSION_1, | ||
149 | }; | 147 | }; |
150 | 148 | ||
151 | /* secure timers dev attribute */ | 149 | /* secure timers dev attribute */ |
152 | static struct omap_timer_capability_dev_attr capability_secure_dev_attr = { | 150 | static struct omap_timer_capability_dev_attr capability_secure_dev_attr = { |
153 | .timer_capability = OMAP_TIMER_SECURE, | 151 | .timer_capability = OMAP_TIMER_ALWON | OMAP_TIMER_SECURE, |
154 | }; | 152 | }; |
155 | 153 | ||
156 | /* always-on timers dev attribute */ | 154 | /* always-on timers dev attribute */ |
@@ -195,7 +193,6 @@ static struct omap_hwmod omap3xxx_timer2_hwmod = { | |||
195 | .idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT, | 193 | .idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT, |
196 | }, | 194 | }, |
197 | }, | 195 | }, |
198 | .dev_attr = &capability_alwon_dev_attr, | ||
199 | .class = &omap3xxx_timer_1ms_hwmod_class, | 196 | .class = &omap3xxx_timer_1ms_hwmod_class, |
200 | }; | 197 | }; |
201 | 198 | ||
@@ -213,7 +210,6 @@ static struct omap_hwmod omap3xxx_timer3_hwmod = { | |||
213 | .idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT, | 210 | .idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT, |
214 | }, | 211 | }, |
215 | }, | 212 | }, |
216 | .dev_attr = &capability_alwon_dev_attr, | ||
217 | .class = &omap3xxx_timer_hwmod_class, | 213 | .class = &omap3xxx_timer_hwmod_class, |
218 | }; | 214 | }; |
219 | 215 | ||
@@ -231,7 +227,6 @@ static struct omap_hwmod omap3xxx_timer4_hwmod = { | |||
231 | .idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT, | 227 | .idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT, |
232 | }, | 228 | }, |
233 | }, | 229 | }, |
234 | .dev_attr = &capability_alwon_dev_attr, | ||
235 | .class = &omap3xxx_timer_hwmod_class, | 230 | .class = &omap3xxx_timer_hwmod_class, |
236 | }; | 231 | }; |
237 | 232 | ||
@@ -249,7 +244,6 @@ static struct omap_hwmod omap3xxx_timer5_hwmod = { | |||
249 | .idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT, | 244 | .idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT, |
250 | }, | 245 | }, |
251 | }, | 246 | }, |
252 | .dev_attr = &capability_alwon_dev_attr, | ||
253 | .class = &omap3xxx_timer_hwmod_class, | 247 | .class = &omap3xxx_timer_hwmod_class, |
254 | }; | 248 | }; |
255 | 249 | ||
@@ -267,7 +261,6 @@ static struct omap_hwmod omap3xxx_timer6_hwmod = { | |||
267 | .idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT, | 261 | .idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT, |
268 | }, | 262 | }, |
269 | }, | 263 | }, |
270 | .dev_attr = &capability_alwon_dev_attr, | ||
271 | .class = &omap3xxx_timer_hwmod_class, | 264 | .class = &omap3xxx_timer_hwmod_class, |
272 | }; | 265 | }; |
273 | 266 | ||
@@ -285,7 +278,6 @@ static struct omap_hwmod omap3xxx_timer7_hwmod = { | |||
285 | .idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT, | 278 | .idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT, |
286 | }, | 279 | }, |
287 | }, | 280 | }, |
288 | .dev_attr = &capability_alwon_dev_attr, | ||
289 | .class = &omap3xxx_timer_hwmod_class, | 281 | .class = &omap3xxx_timer_hwmod_class, |
290 | }; | 282 | }; |
291 | 283 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index f30e861ce6d9..afddec835ece 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -2947,7 +2947,6 @@ static struct omap_hwmod omap44xx_timer2_hwmod = { | |||
2947 | .modulemode = MODULEMODE_SWCTRL, | 2947 | .modulemode = MODULEMODE_SWCTRL, |
2948 | }, | 2948 | }, |
2949 | }, | 2949 | }, |
2950 | .dev_attr = &capability_alwon_dev_attr, | ||
2951 | }; | 2950 | }; |
2952 | 2951 | ||
2953 | /* timer3 */ | 2952 | /* timer3 */ |
@@ -2969,7 +2968,6 @@ static struct omap_hwmod omap44xx_timer3_hwmod = { | |||
2969 | .modulemode = MODULEMODE_SWCTRL, | 2968 | .modulemode = MODULEMODE_SWCTRL, |
2970 | }, | 2969 | }, |
2971 | }, | 2970 | }, |
2972 | .dev_attr = &capability_alwon_dev_attr, | ||
2973 | }; | 2971 | }; |
2974 | 2972 | ||
2975 | /* timer4 */ | 2973 | /* timer4 */ |
@@ -2991,7 +2989,6 @@ static struct omap_hwmod omap44xx_timer4_hwmod = { | |||
2991 | .modulemode = MODULEMODE_SWCTRL, | 2989 | .modulemode = MODULEMODE_SWCTRL, |
2992 | }, | 2990 | }, |
2993 | }, | 2991 | }, |
2994 | .dev_attr = &capability_alwon_dev_attr, | ||
2995 | }; | 2992 | }; |
2996 | 2993 | ||
2997 | /* timer5 */ | 2994 | /* timer5 */ |
@@ -3013,7 +3010,6 @@ static struct omap_hwmod omap44xx_timer5_hwmod = { | |||
3013 | .modulemode = MODULEMODE_SWCTRL, | 3010 | .modulemode = MODULEMODE_SWCTRL, |
3014 | }, | 3011 | }, |
3015 | }, | 3012 | }, |
3016 | .dev_attr = &capability_alwon_dev_attr, | ||
3017 | }; | 3013 | }; |
3018 | 3014 | ||
3019 | /* timer6 */ | 3015 | /* timer6 */ |
@@ -3036,7 +3032,6 @@ static struct omap_hwmod omap44xx_timer6_hwmod = { | |||
3036 | .modulemode = MODULEMODE_SWCTRL, | 3032 | .modulemode = MODULEMODE_SWCTRL, |
3037 | }, | 3033 | }, |
3038 | }, | 3034 | }, |
3039 | .dev_attr = &capability_alwon_dev_attr, | ||
3040 | }; | 3035 | }; |
3041 | 3036 | ||
3042 | /* timer7 */ | 3037 | /* timer7 */ |
@@ -3058,7 +3053,6 @@ static struct omap_hwmod omap44xx_timer7_hwmod = { | |||
3058 | .modulemode = MODULEMODE_SWCTRL, | 3053 | .modulemode = MODULEMODE_SWCTRL, |
3059 | }, | 3054 | }, |
3060 | }, | 3055 | }, |
3061 | .dev_attr = &capability_alwon_dev_attr, | ||
3062 | }; | 3056 | }; |
3063 | 3057 | ||
3064 | /* timer8 */ | 3058 | /* timer8 */ |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 840929bd9dae..8fe75a81e12d 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
@@ -69,11 +69,6 @@ | |||
69 | #define OMAP3_SECURE_TIMER 1 | 69 | #define OMAP3_SECURE_TIMER 1 |
70 | #endif | 70 | #endif |
71 | 71 | ||
72 | /* MAX_GPTIMER_ID: number of GPTIMERs on the chip */ | ||
73 | #define MAX_GPTIMER_ID 12 | ||
74 | |||
75 | static u32 sys_timer_reserved; | ||
76 | |||
77 | /* Clockevent code */ | 72 | /* Clockevent code */ |
78 | 73 | ||
79 | static struct omap_dm_timer clkev; | 74 | static struct omap_dm_timer clkev; |
@@ -180,7 +175,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, | |||
180 | 175 | ||
181 | omap_hwmod_enable(oh); | 176 | omap_hwmod_enable(oh); |
182 | 177 | ||
183 | sys_timer_reserved |= (1 << (gptimer_id - 1)); | 178 | if (omap_dm_timer_reserve_systimer(gptimer_id)) |
179 | return -ENODEV; | ||
184 | 180 | ||
185 | if (gptimer_id != 12) { | 181 | if (gptimer_id != 12) { |
186 | struct clk *src; | 182 | struct clk *src; |
@@ -394,66 +390,6 @@ OMAP_SYS_TIMER(4) | |||
394 | #endif | 390 | #endif |
395 | 391 | ||
396 | /** | 392 | /** |
397 | * omap2_dm_timer_set_src - change the timer input clock source | ||
398 | * @pdev: timer platform device pointer | ||
399 | * @source: array index of parent clock source | ||
400 | */ | ||
401 | static int omap2_dm_timer_set_src(struct platform_device *pdev, int source) | ||
402 | { | ||
403 | int ret; | ||
404 | struct dmtimer_platform_data *pdata = pdev->dev.platform_data; | ||
405 | struct clk *fclk, *parent; | ||
406 | char *parent_name = NULL; | ||
407 | |||
408 | fclk = clk_get(&pdev->dev, "fck"); | ||
409 | if (IS_ERR_OR_NULL(fclk)) { | ||
410 | dev_err(&pdev->dev, "%s: %d: clk_get() FAILED\n", | ||
411 | __func__, __LINE__); | ||
412 | return -EINVAL; | ||
413 | } | ||
414 | |||
415 | switch (source) { | ||
416 | case OMAP_TIMER_SRC_SYS_CLK: | ||
417 | parent_name = "sys_ck"; | ||
418 | break; | ||
419 | |||
420 | case OMAP_TIMER_SRC_32_KHZ: | ||
421 | parent_name = "32k_ck"; | ||
422 | break; | ||
423 | |||
424 | case OMAP_TIMER_SRC_EXT_CLK: | ||
425 | if (pdata->timer_ip_version == OMAP_TIMER_IP_VERSION_1) { | ||
426 | parent_name = "alt_ck"; | ||
427 | break; | ||
428 | } | ||
429 | dev_err(&pdev->dev, "%s: %d: invalid clk src.\n", | ||
430 | __func__, __LINE__); | ||
431 | clk_put(fclk); | ||
432 | return -EINVAL; | ||
433 | } | ||
434 | |||
435 | parent = clk_get(&pdev->dev, parent_name); | ||
436 | if (IS_ERR_OR_NULL(parent)) { | ||
437 | dev_err(&pdev->dev, "%s: %d: clk_get() %s FAILED\n", | ||
438 | __func__, __LINE__, parent_name); | ||
439 | clk_put(fclk); | ||
440 | return -EINVAL; | ||
441 | } | ||
442 | |||
443 | ret = clk_set_parent(fclk, parent); | ||
444 | if (IS_ERR_VALUE(ret)) { | ||
445 | dev_err(&pdev->dev, "%s: clk_set_parent() to %s FAILED\n", | ||
446 | __func__, parent_name); | ||
447 | ret = -EINVAL; | ||
448 | } | ||
449 | |||
450 | clk_put(parent); | ||
451 | clk_put(fclk); | ||
452 | |||
453 | return ret; | ||
454 | } | ||
455 | |||
456 | /** | ||
457 | * omap_timer_init - build and register timer device with an | 393 | * omap_timer_init - build and register timer device with an |
458 | * associated timer hwmod | 394 | * associated timer hwmod |
459 | * @oh: timer hwmod pointer to be used to build timer device | 395 | * @oh: timer hwmod pointer to be used to build timer device |
@@ -473,7 +409,6 @@ static int __init omap_timer_init(struct omap_hwmod *oh, void *unused) | |||
473 | struct dmtimer_platform_data *pdata; | 409 | struct dmtimer_platform_data *pdata; |
474 | struct platform_device *pdev; | 410 | struct platform_device *pdev; |
475 | struct omap_timer_capability_dev_attr *timer_dev_attr; | 411 | struct omap_timer_capability_dev_attr *timer_dev_attr; |
476 | struct powerdomain *pwrdm; | ||
477 | 412 | ||
478 | pr_debug("%s: %s\n", __func__, oh->name); | 413 | pr_debug("%s: %s\n", __func__, oh->name); |
479 | 414 | ||
@@ -501,18 +436,9 @@ static int __init omap_timer_init(struct omap_hwmod *oh, void *unused) | |||
501 | */ | 436 | */ |
502 | sscanf(oh->name, "timer%2d", &id); | 437 | sscanf(oh->name, "timer%2d", &id); |
503 | 438 | ||
504 | pdata->set_timer_src = omap2_dm_timer_set_src; | 439 | if (timer_dev_attr) |
505 | pdata->timer_ip_version = oh->class->rev; | 440 | pdata->timer_capability = timer_dev_attr->timer_capability; |
506 | |||
507 | /* Mark clocksource and clockevent timers as reserved */ | ||
508 | if ((sys_timer_reserved >> (id - 1)) & 0x1) | ||
509 | pdata->reserved = 1; | ||
510 | 441 | ||
511 | pwrdm = omap_hwmod_get_pwrdm(oh); | ||
512 | pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm); | ||
513 | #ifdef CONFIG_PM | ||
514 | pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count; | ||
515 | #endif | ||
516 | pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata), | 442 | pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata), |
517 | NULL, 0, 0); | 443 | NULL, 0, 0); |
518 | 444 | ||
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index 3b0cfeb33d05..54ed4e6e429e 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
@@ -42,9 +42,11 @@ | |||
42 | #include <linux/pm_runtime.h> | 42 | #include <linux/pm_runtime.h> |
43 | 43 | ||
44 | #include <plat/dmtimer.h> | 44 | #include <plat/dmtimer.h> |
45 | #include <plat/omap-pm.h> | ||
45 | 46 | ||
46 | #include <mach/hardware.h> | 47 | #include <mach/hardware.h> |
47 | 48 | ||
49 | static u32 omap_reserved_systimers; | ||
48 | static LIST_HEAD(omap_timer_list); | 50 | static LIST_HEAD(omap_timer_list); |
49 | static DEFINE_SPINLOCK(dm_timer_lock); | 51 | static DEFINE_SPINLOCK(dm_timer_lock); |
50 | 52 | ||
@@ -133,17 +135,22 @@ static void omap_dm_timer_reset(struct omap_dm_timer *timer) | |||
133 | 135 | ||
134 | int omap_dm_timer_prepare(struct omap_dm_timer *timer) | 136 | int omap_dm_timer_prepare(struct omap_dm_timer *timer) |
135 | { | 137 | { |
136 | struct dmtimer_platform_data *pdata = timer->pdev->dev.platform_data; | ||
137 | int ret; | 138 | int ret; |
138 | 139 | ||
139 | timer->fclk = clk_get(&timer->pdev->dev, "fck"); | 140 | /* |
140 | if (WARN_ON_ONCE(IS_ERR_OR_NULL(timer->fclk))) { | 141 | * FIXME: OMAP1 devices do not use the clock framework for dmtimers so |
141 | timer->fclk = NULL; | 142 | * do not call clk_get() for these devices. |
142 | dev_err(&timer->pdev->dev, ": No fclk handle.\n"); | 143 | */ |
143 | return -EINVAL; | 144 | if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { |
145 | timer->fclk = clk_get(&timer->pdev->dev, "fck"); | ||
146 | if (WARN_ON_ONCE(IS_ERR_OR_NULL(timer->fclk))) { | ||
147 | timer->fclk = NULL; | ||
148 | dev_err(&timer->pdev->dev, ": No fclk handle.\n"); | ||
149 | return -EINVAL; | ||
150 | } | ||
144 | } | 151 | } |
145 | 152 | ||
146 | if (pdata->needs_manual_reset) | 153 | if (timer->capability & OMAP_TIMER_NEEDS_RESET) |
147 | omap_dm_timer_reset(timer); | 154 | omap_dm_timer_reset(timer); |
148 | 155 | ||
149 | ret = omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); | 156 | ret = omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); |
@@ -152,6 +159,21 @@ int omap_dm_timer_prepare(struct omap_dm_timer *timer) | |||
152 | return ret; | 159 | return ret; |
153 | } | 160 | } |
154 | 161 | ||
162 | static inline u32 omap_dm_timer_reserved_systimer(int id) | ||
163 | { | ||
164 | return (omap_reserved_systimers & (1 << (id - 1))) ? 1 : 0; | ||
165 | } | ||
166 | |||
167 | int omap_dm_timer_reserve_systimer(int id) | ||
168 | { | ||
169 | if (omap_dm_timer_reserved_systimer(id)) | ||
170 | return -ENODEV; | ||
171 | |||
172 | omap_reserved_systimers |= (1 << (id - 1)); | ||
173 | |||
174 | return 0; | ||
175 | } | ||
176 | |||
155 | struct omap_dm_timer *omap_dm_timer_request(void) | 177 | struct omap_dm_timer *omap_dm_timer_request(void) |
156 | { | 178 | { |
157 | struct omap_dm_timer *timer = NULL, *t; | 179 | struct omap_dm_timer *timer = NULL, *t; |
@@ -325,10 +347,9 @@ int omap_dm_timer_start(struct omap_dm_timer *timer) | |||
325 | 347 | ||
326 | omap_dm_timer_enable(timer); | 348 | omap_dm_timer_enable(timer); |
327 | 349 | ||
328 | if (timer->loses_context) { | 350 | if (!(timer->capability & OMAP_TIMER_ALWON)) { |
329 | u32 ctx_loss_cnt_after = | 351 | if (omap_pm_get_dev_context_loss_count(&timer->pdev->dev) != |
330 | timer->get_context_loss_count(&timer->pdev->dev); | 352 | timer->ctx_loss_count) |
331 | if (ctx_loss_cnt_after != timer->ctx_loss_count) | ||
332 | omap_timer_restore_context(timer); | 353 | omap_timer_restore_context(timer); |
333 | } | 354 | } |
334 | 355 | ||
@@ -347,20 +368,18 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_start); | |||
347 | int omap_dm_timer_stop(struct omap_dm_timer *timer) | 368 | int omap_dm_timer_stop(struct omap_dm_timer *timer) |
348 | { | 369 | { |
349 | unsigned long rate = 0; | 370 | unsigned long rate = 0; |
350 | struct dmtimer_platform_data *pdata; | ||
351 | 371 | ||
352 | if (unlikely(!timer)) | 372 | if (unlikely(!timer)) |
353 | return -EINVAL; | 373 | return -EINVAL; |
354 | 374 | ||
355 | pdata = timer->pdev->dev.platform_data; | 375 | if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) |
356 | if (!pdata->needs_manual_reset) | ||
357 | rate = clk_get_rate(timer->fclk); | 376 | rate = clk_get_rate(timer->fclk); |
358 | 377 | ||
359 | __omap_dm_timer_stop(timer, timer->posted, rate); | 378 | __omap_dm_timer_stop(timer, timer->posted, rate); |
360 | 379 | ||
361 | if (timer->loses_context && timer->get_context_loss_count) | 380 | if (!(timer->capability & OMAP_TIMER_ALWON)) |
362 | timer->ctx_loss_count = | 381 | timer->ctx_loss_count = |
363 | timer->get_context_loss_count(&timer->pdev->dev); | 382 | omap_pm_get_dev_context_loss_count(&timer->pdev->dev); |
364 | 383 | ||
365 | /* | 384 | /* |
366 | * Since the register values are computed and written within | 385 | * Since the register values are computed and written within |
@@ -378,6 +397,8 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_stop); | |||
378 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) | 397 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) |
379 | { | 398 | { |
380 | int ret; | 399 | int ret; |
400 | char *parent_name = NULL; | ||
401 | struct clk *fclk, *parent; | ||
381 | struct dmtimer_platform_data *pdata; | 402 | struct dmtimer_platform_data *pdata; |
382 | 403 | ||
383 | if (unlikely(!timer)) | 404 | if (unlikely(!timer)) |
@@ -388,7 +409,49 @@ int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) | |||
388 | if (source < 0 || source >= 3) | 409 | if (source < 0 || source >= 3) |
389 | return -EINVAL; | 410 | return -EINVAL; |
390 | 411 | ||
391 | ret = pdata->set_timer_src(timer->pdev, source); | 412 | /* |
413 | * FIXME: Used for OMAP1 devices only because they do not currently | ||
414 | * use the clock framework to set the parent clock. To be removed | ||
415 | * once OMAP1 migrated to using clock framework for dmtimers | ||
416 | */ | ||
417 | if (pdata->set_timer_src) | ||
418 | return pdata->set_timer_src(timer->pdev, source); | ||
419 | |||
420 | fclk = clk_get(&timer->pdev->dev, "fck"); | ||
421 | if (IS_ERR_OR_NULL(fclk)) { | ||
422 | pr_err("%s: fck not found\n", __func__); | ||
423 | return -EINVAL; | ||
424 | } | ||
425 | |||
426 | switch (source) { | ||
427 | case OMAP_TIMER_SRC_SYS_CLK: | ||
428 | parent_name = "timer_sys_ck"; | ||
429 | break; | ||
430 | |||
431 | case OMAP_TIMER_SRC_32_KHZ: | ||
432 | parent_name = "timer_32k_ck"; | ||
433 | break; | ||
434 | |||
435 | case OMAP_TIMER_SRC_EXT_CLK: | ||
436 | parent_name = "timer_ext_ck"; | ||
437 | break; | ||
438 | } | ||
439 | |||
440 | parent = clk_get(&timer->pdev->dev, parent_name); | ||
441 | if (IS_ERR_OR_NULL(parent)) { | ||
442 | pr_err("%s: %s not found\n", __func__, parent_name); | ||
443 | ret = -EINVAL; | ||
444 | goto out; | ||
445 | } | ||
446 | |||
447 | ret = clk_set_parent(fclk, parent); | ||
448 | if (IS_ERR_VALUE(ret)) | ||
449 | pr_err("%s: failed to set %s as parent\n", __func__, | ||
450 | parent_name); | ||
451 | |||
452 | clk_put(parent); | ||
453 | out: | ||
454 | clk_put(fclk); | ||
392 | 455 | ||
393 | return ret; | 456 | return ret; |
394 | } | 457 | } |
@@ -431,10 +494,9 @@ int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, | |||
431 | 494 | ||
432 | omap_dm_timer_enable(timer); | 495 | omap_dm_timer_enable(timer); |
433 | 496 | ||
434 | if (timer->loses_context) { | 497 | if (!(timer->capability & OMAP_TIMER_ALWON)) { |
435 | u32 ctx_loss_cnt_after = | 498 | if (omap_pm_get_dev_context_loss_count(&timer->pdev->dev) != |
436 | timer->get_context_loss_count(&timer->pdev->dev); | 499 | timer->ctx_loss_count) |
437 | if (ctx_loss_cnt_after != timer->ctx_loss_count) | ||
438 | omap_timer_restore_context(timer); | 500 | omap_timer_restore_context(timer); |
439 | } | 501 | } |
440 | 502 | ||
@@ -674,13 +736,12 @@ static int __devinit omap_dm_timer_probe(struct platform_device *pdev) | |||
674 | 736 | ||
675 | timer->id = pdev->id; | 737 | timer->id = pdev->id; |
676 | timer->irq = irq->start; | 738 | timer->irq = irq->start; |
677 | timer->reserved = pdata->reserved; | 739 | timer->reserved = omap_dm_timer_reserved_systimer(timer->id); |
678 | timer->pdev = pdev; | 740 | timer->pdev = pdev; |
679 | timer->loses_context = pdata->loses_context; | 741 | timer->capability = pdata->timer_capability; |
680 | timer->get_context_loss_count = pdata->get_context_loss_count; | ||
681 | 742 | ||
682 | /* Skip pm_runtime_enable for OMAP1 */ | 743 | /* Skip pm_runtime_enable for OMAP1 */ |
683 | if (!pdata->needs_manual_reset) { | 744 | if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { |
684 | pm_runtime_enable(&pdev->dev); | 745 | pm_runtime_enable(&pdev->dev); |
685 | pm_runtime_irq_safe(&pdev->dev); | 746 | pm_runtime_irq_safe(&pdev->dev); |
686 | } | 747 | } |
diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h index 5da73562e486..19e7fa577bd0 100644 --- a/arch/arm/plat-omap/include/plat/dmtimer.h +++ b/arch/arm/plat-omap/include/plat/dmtimer.h | |||
@@ -55,23 +55,17 @@ | |||
55 | #define OMAP_TIMER_TRIGGER_OVERFLOW 0x01 | 55 | #define OMAP_TIMER_TRIGGER_OVERFLOW 0x01 |
56 | #define OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE 0x02 | 56 | #define OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE 0x02 |
57 | 57 | ||
58 | /* | ||
59 | * IP revision identifier so that Highlander IP | ||
60 | * in OMAP4 can be distinguished. | ||
61 | */ | ||
62 | #define OMAP_TIMER_IP_VERSION_1 0x1 | ||
63 | |||
64 | /* timer capabilities used in hwmod database */ | 58 | /* timer capabilities used in hwmod database */ |
65 | #define OMAP_TIMER_SECURE 0x80000000 | 59 | #define OMAP_TIMER_SECURE 0x80000000 |
66 | #define OMAP_TIMER_ALWON 0x40000000 | 60 | #define OMAP_TIMER_ALWON 0x40000000 |
67 | #define OMAP_TIMER_HAS_PWM 0x20000000 | 61 | #define OMAP_TIMER_HAS_PWM 0x20000000 |
62 | #define OMAP_TIMER_NEEDS_RESET 0x10000000 | ||
68 | 63 | ||
69 | struct omap_timer_capability_dev_attr { | 64 | struct omap_timer_capability_dev_attr { |
70 | u32 timer_capability; | 65 | u32 timer_capability; |
71 | }; | 66 | }; |
72 | 67 | ||
73 | struct omap_dm_timer; | 68 | struct omap_dm_timer; |
74 | struct clk; | ||
75 | 69 | ||
76 | struct timer_regs { | 70 | struct timer_regs { |
77 | u32 tidr; | 71 | u32 tidr; |
@@ -96,16 +90,12 @@ struct timer_regs { | |||
96 | }; | 90 | }; |
97 | 91 | ||
98 | struct dmtimer_platform_data { | 92 | struct dmtimer_platform_data { |
93 | /* set_timer_src - Only used for OMAP1 devices */ | ||
99 | int (*set_timer_src)(struct platform_device *pdev, int source); | 94 | int (*set_timer_src)(struct platform_device *pdev, int source); |
100 | int timer_ip_version; | 95 | u32 timer_capability; |
101 | u32 needs_manual_reset:1; | ||
102 | bool reserved; | ||
103 | |||
104 | bool loses_context; | ||
105 | |||
106 | int (*get_context_loss_count)(struct device *dev); | ||
107 | }; | 96 | }; |
108 | 97 | ||
98 | int omap_dm_timer_reserve_systimer(int id); | ||
109 | struct omap_dm_timer *omap_dm_timer_request(void); | 99 | struct omap_dm_timer *omap_dm_timer_request(void); |
110 | struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id); | 100 | struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id); |
111 | int omap_dm_timer_free(struct omap_dm_timer *timer); | 101 | int omap_dm_timer_free(struct omap_dm_timer *timer); |
@@ -272,13 +262,11 @@ struct omap_dm_timer { | |||
272 | unsigned reserved:1; | 262 | unsigned reserved:1; |
273 | unsigned posted:1; | 263 | unsigned posted:1; |
274 | struct timer_regs context; | 264 | struct timer_regs context; |
275 | bool loses_context; | ||
276 | int ctx_loss_count; | 265 | int ctx_loss_count; |
277 | int revision; | 266 | int revision; |
267 | u32 capability; | ||
278 | struct platform_device *pdev; | 268 | struct platform_device *pdev; |
279 | struct list_head node; | 269 | struct list_head node; |
280 | |||
281 | int (*get_context_loss_count)(struct device *dev); | ||
282 | }; | 270 | }; |
283 | 271 | ||
284 | int omap_dm_timer_prepare(struct omap_dm_timer *timer); | 272 | int omap_dm_timer_prepare(struct omap_dm_timer *timer); |