* [PATCH 0/6 v2] OMAP2PLUS: WDT: Implement WDT in HWMOD way @ 2010-08-11 10:11 Charulatha V 2010-08-11 10:11 ` [PATCH 1/6 v2] OMAP2PLUS: WDT: Add ICLKEN, FCLKEN, WKEN shared bits for WDT Charulatha V 0 siblings, 1 reply; 9+ messages in thread From: Charulatha V @ 2010-08-11 10:11 UTC (permalink / raw) To: linux-omap; +Cc: wim, khilman, paul, b-cousson, rnayak, p-basak2, Charulatha V This patch series makes OMAP2PLUS Watchdog Timer Module implemented in HWMOD FW way. It also implements OMAP2/3 Watchdog timer driver to use the runtime PM layer. This patch series is created on "origin/pm-wip/hwmods-omap4". This patch series is tested on OMAP3430 SDP and OMAP4430 SDP. It would be of great help if someone could test the same on OMAP1 and OMAP2 boards. Version History: --------------- Version v2: Rebase to latest kernel Version v1: Some of the v1 links: http://www.spinics.net/lists/linux-omap/msg30628.html http://www.spinics.net/lists/linux-omap/msg30625.html Charulatha V (6): OMAP2PLUS: WDT: Add ICLKEN, FCLKEN, WKEN shared bits for WDT OMAP3: WDT: Add watchdog timer HWMOD data for OMAP3 OMAP2420: WDT: Add watchdog timer HWMOD data for OMAP2420 OMAP2430: WDT: Add watchdog timer HWMOD data for OMAP2430 OMAP4: WDT: Enable watchdog timer2 hwmod structure OMAP2PLUS: WDT: Conversion to runtime PM arch/arm/mach-omap2/omap_hwmod_2420_data.c | 59 +++++++++++++++++++++++++++ arch/arm/mach-omap2/omap_hwmod_2430_data.c | 59 +++++++++++++++++++++++++++ arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 61 ++++++++++++++++++++++++++++ arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 2 +- arch/arm/mach-omap2/prcm-common.h | 4 ++ arch/arm/plat-omap/devices.c | 52 +++++++++++++++++------ drivers/watchdog/omap_wdt.c | 43 ++++---------------- 7 files changed, 230 insertions(+), 50 deletions(-) ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/6 v2] OMAP2PLUS: WDT: Add ICLKEN, FCLKEN, WKEN shared bits for WDT 2010-08-11 10:11 [PATCH 0/6 v2] OMAP2PLUS: WDT: Implement WDT in HWMOD way Charulatha V @ 2010-08-11 10:11 ` Charulatha V 2010-08-11 10:11 ` [PATCH 2/6 v2] OMAP3: WDT: Add watchdog timer HWMOD data for OMAP3 Charulatha V 0 siblings, 1 reply; 9+ messages in thread From: Charulatha V @ 2010-08-11 10:11 UTC (permalink / raw) To: linux-omap; +Cc: wim, khilman, paul, b-cousson, rnayak, p-basak2, Charulatha V This patch adds the CM_FCLKEN_WKUP, CM_ICLKEN_WKUP, PM_WKEN_WKUP shared bits for OMAP2PLUS watchdog timer module Signed-off-by: Charulatha V <charu@ti.com> Signed-off-by: Basak, Partha <p-basak2@ti.com> --- arch/arm/mach-omap2/prcm-common.h | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h index 995b7ed..e190c64 100644 --- a/arch/arm/mach-omap2/prcm-common.h +++ b/arch/arm/mach-omap2/prcm-common.h @@ -237,6 +237,8 @@ #define OMAP24XX_ST_USB_MASK (1 << 0) /* CM_FCLKEN_WKUP, CM_ICLKEN_WKUP, PM_WKEN_WKUP shared bits */ +#define OMAP24XX_EN_WDT2_SHIFT 3 +#define OMAP24XX_EN_WDT2_MASK (1 << 3) #define OMAP24XX_EN_GPIOS_SHIFT 2 #define OMAP24XX_EN_GPIOS_MASK (1 << 2) #define OMAP24XX_EN_GPT1_SHIFT 0 @@ -344,6 +346,8 @@ #define OMAP3430_ST_D2D_MASK (1 << 3) /* CM_FCLKEN_WKUP, CM_ICLKEN_WKUP, PM_WKEN_WKUP shared bits */ +#define OMAP3430_EN_WDT2_SHIFT 5 +#define OMAP3430_EN_WDT2_MASK (1 << 5) #define OMAP3430_EN_GPIO1_MASK (1 << 3) #define OMAP3430_EN_GPIO1_SHIFT 3 #define OMAP3430_EN_GPT12_MASK (1 << 1) -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/6 v2] OMAP3: WDT: Add watchdog timer HWMOD data for OMAP3 2010-08-11 10:11 ` [PATCH 1/6 v2] OMAP2PLUS: WDT: Add ICLKEN, FCLKEN, WKEN shared bits for WDT Charulatha V @ 2010-08-11 10:11 ` Charulatha V 2010-08-11 10:11 ` [PATCH 3/6 v2] OMAP2420: WDT: Add watchdog timer HWMOD data for OMAP2420 Charulatha V 0 siblings, 1 reply; 9+ messages in thread From: Charulatha V @ 2010-08-11 10:11 UTC (permalink / raw) To: linux-omap; +Cc: wim, khilman, paul, b-cousson, rnayak, p-basak2, Charulatha V Add hwmod structures for Watchdog module on OMAP3 Signed-off-by: Charulatha V <charu@ti.com> Signed-off-by: Basak, Partha <p-basak2@ti.com> --- arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 61 ++++++++++++++++++++++++++++ 1 files changed, 61 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 5d8eb58..4ea323b 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c @@ -36,6 +36,7 @@ static struct omap_hwmod omap3xxx_iva_hwmod; static struct omap_hwmod omap3xxx_l3_main_hwmod; static struct omap_hwmod omap3xxx_l4_core_hwmod; static struct omap_hwmod omap3xxx_l4_per_hwmod; +static struct omap_hwmod omap3xxx_wd_timer2_hwmod; /* L3 -> L4_CORE interface */ static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = { @@ -197,6 +198,65 @@ static struct omap_hwmod omap3xxx_iva_hwmod = { .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430) }; +/* WDTIMER2 <- L4_WKUP interface */ +static struct omap_hwmod_addr_space omap3xxx_wd_timer2_addrs[] = { + { + .pa_start = 0x48314000, + .pa_end = 0x48314000 + SZ_4K - 1, + .flags = ADDR_TYPE_RT + }, +}; + +static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__wd_timer2 = { + .master = &omap3xxx_l4_wkup_hwmod, + .slave = &omap3xxx_wd_timer2_hwmod, + .clk = "wdt2_ick", + .addr = omap3xxx_wd_timer2_addrs, + .addr_cnt = ARRAY_SIZE(omap3xxx_wd_timer2_addrs), + .user = OCP_USER_MPU | OCP_USER_SDMA, +}; + +/* WDTIMER common */ + +static struct omap_hwmod_class_sysconfig omap3xxx_wd_timer_sysc = { + .rev_offs = 0x0000, + .sysc_offs = 0x0010, + .syss_offs = 0x0014, + .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE | + SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | + SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY), + .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), + .sysc_fields = &omap_hwmod_sysc_type1, +}; + +static struct omap_hwmod_class omap3xxx_wd_timer_hwmod_class = { + .name = "wd_timer", + .sysc = &omap3xxx_wd_timer_sysc, +}; + +/* WDTIMER2 */ +static struct omap_hwmod_ocp_if *omap3xxx_wd_timer2_slaves[] = { + &omap3xxx_l4_wkup__wd_timer2, +}; + +static struct omap_hwmod omap3xxx_wd_timer2_hwmod = { + .name = "wd_timer2", + .class = &omap3xxx_wd_timer_hwmod_class, + .main_clk = "wdt2_fck", + .prcm = { + .omap2 = { + .prcm_reg_id = 1, + .module_bit = OMAP3430_EN_WDT2_SHIFT, + .module_offs = WKUP_MOD, + .idlest_reg_id = 1, + .idlest_idle_bit = OMAP3430_EN_WDT2_SHIFT, + }, + }, + .slaves = omap3xxx_wd_timer2_slaves, + .slaves_cnt = ARRAY_SIZE(omap3xxx_wd_timer2_slaves), + .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), +}; + static __initdata struct omap_hwmod *omap3xxx_hwmods[] = { &omap3xxx_l3_main_hwmod, &omap3xxx_l4_core_hwmod, @@ -204,6 +264,7 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = { &omap3xxx_l4_wkup_hwmod, &omap3xxx_mpu_hwmod, &omap3xxx_iva_hwmod, + &omap3xxx_wd_timer2_hwmod, NULL, }; -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/6 v2] OMAP2420: WDT: Add watchdog timer HWMOD data for OMAP2420 2010-08-11 10:11 ` [PATCH 2/6 v2] OMAP3: WDT: Add watchdog timer HWMOD data for OMAP3 Charulatha V @ 2010-08-11 10:11 ` Charulatha V 2010-08-11 10:11 ` [PATCH 4/6 v2] OMAP2430: WDT: Add watchdog timer HWMOD data for OMAP2430 Charulatha V 0 siblings, 1 reply; 9+ messages in thread From: Charulatha V @ 2010-08-11 10:11 UTC (permalink / raw) To: linux-omap; +Cc: wim, khilman, paul, b-cousson, rnayak, p-basak2, Charulatha V Add hwmod structures for Watchdog module on OMAP2420 Signed-off-by: Charulatha V <charu@ti.com> Signed-off-by: Basak, Partha <p-basak2@ti.com> --- arch/arm/mach-omap2/omap_hwmod_2420_data.c | 59 ++++++++++++++++++++++++++++ 1 files changed, 59 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index 3cc768e..3ec5bc9 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c @@ -33,6 +33,7 @@ static struct omap_hwmod omap2420_mpu_hwmod; static struct omap_hwmod omap2420_iva_hwmod; static struct omap_hwmod omap2420_l3_main_hwmod; static struct omap_hwmod omap2420_l4_core_hwmod; +static struct omap_hwmod omap2420_wd_timer2_hwmod; /* L3 -> L4_CORE interface */ static struct omap_hwmod_ocp_if omap2420_l3_main__l4_core = { @@ -165,12 +166,70 @@ static struct omap_hwmod omap2420_iva_hwmod = { .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420) }; +/* WDTIMER2 <- L4_WKUP interface */ +static struct omap_hwmod_addr_space omap2420_wd_timer2_addrs[] = { + { + .pa_start = 0x48022000, + .pa_end = 0x48022000 + SZ_4K - 1, + .flags = ADDR_TYPE_RT + }, +}; + +static struct omap_hwmod_ocp_if omap2420_l4_wkup__wd_timer2 = { + .master = &omap2420_l4_wkup_hwmod, + .slave = &omap2420_wd_timer2_hwmod, + .clk = "mpu_wdt_ick", + .addr = omap2420_wd_timer2_addrs, + .addr_cnt = ARRAY_SIZE(omap2420_wd_timer2_addrs), + .user = OCP_USER_MPU | OCP_USER_SDMA, +}; + +/* WDTIMER common */ + +static struct omap_hwmod_class_sysconfig omap2420_wd_timer_sysc = { + .rev_offs = 0x0000, + .sysc_offs = 0x0010, + .syss_offs = 0x0014, + .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET | + SYSC_HAS_AUTOIDLE), + .sysc_fields = &omap_hwmod_sysc_type1, +}; + +static struct omap_hwmod_class omap2420_wd_timer_hwmod_class = { + .name = "wd_timer", + .sysc = &omap2420_wd_timer_sysc, +}; + +/* WDTIMER2 */ +static struct omap_hwmod_ocp_if *omap2420_wd_timer2_slaves[] = { + &omap2420_l4_wkup__wd_timer2, +}; + +static struct omap_hwmod omap2420_wd_timer2_hwmod = { + .name = "wd_timer2", + .class = &omap2420_wd_timer_hwmod_class, + .main_clk = "mpu_wdt_fck", + .prcm = { + .omap2 = { + .prcm_reg_id = 1, + .module_bit = OMAP24XX_EN_WDT2_SHIFT, + .module_offs = WKUP_MOD, + .idlest_reg_id = 1, + .idlest_idle_bit = OMAP24XX_EN_WDT2_SHIFT, + }, + }, + .slaves = omap2420_wd_timer2_slaves, + .slaves_cnt = ARRAY_SIZE(omap2420_wd_timer2_slaves), + .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420), +}; + static __initdata struct omap_hwmod *omap2420_hwmods[] = { &omap2420_l3_main_hwmod, &omap2420_l4_core_hwmod, &omap2420_l4_wkup_hwmod, &omap2420_mpu_hwmod, &omap2420_iva_hwmod, + &omap2420_wd_timer2_hwmod, NULL, }; -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/6 v2] OMAP2430: WDT: Add watchdog timer HWMOD data for OMAP2430 2010-08-11 10:11 ` [PATCH 3/6 v2] OMAP2420: WDT: Add watchdog timer HWMOD data for OMAP2420 Charulatha V @ 2010-08-11 10:11 ` Charulatha V 2010-08-11 10:11 ` [PATCH 5/6 v2] OMAP4: WDT: Enable watchdog timer2 hwmod structure Charulatha V 0 siblings, 1 reply; 9+ messages in thread From: Charulatha V @ 2010-08-11 10:11 UTC (permalink / raw) To: linux-omap; +Cc: wim, khilman, paul, b-cousson, rnayak, p-basak2, Charulatha V Add hwmod structures for Watchdog module on OMAP2430 Signed-off-by: Charulatha V <charu@ti.com> Signed-off-by: Basak, Partha <p-basak2@ti.com> --- arch/arm/mach-omap2/omap_hwmod_2430_data.c | 59 ++++++++++++++++++++++++++++ 1 files changed, 59 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c index 4526628..a22e0e1 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c @@ -33,6 +33,7 @@ static struct omap_hwmod omap2430_mpu_hwmod; static struct omap_hwmod omap2430_iva_hwmod; static struct omap_hwmod omap2430_l3_main_hwmod; static struct omap_hwmod omap2430_l4_core_hwmod; +static struct omap_hwmod omap2430_wd_timer2_hwmod; /* L3 -> L4_CORE interface */ static struct omap_hwmod_ocp_if omap2430_l3_main__l4_core = { @@ -165,12 +166,70 @@ static struct omap_hwmod omap2430_iva_hwmod = { .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430) }; +/* WDTIMER2 <- L4_WKUP interface */ +static struct omap_hwmod_addr_space omap2430_wd_timer2_addrs[] = { + { + .pa_start = 0x49016000, + .pa_end = 0x49016000 + SZ_4K - 1, + .flags = ADDR_TYPE_RT + }, +}; + +static struct omap_hwmod_ocp_if omap2430_l4_wkup__wd_timer2 = { + .master = &omap2430_l4_wkup_hwmod, + .slave = &omap2430_wd_timer2_hwmod, + .clk = "mpu_wdt_ick", + .addr = omap2430_wd_timer2_addrs, + .addr_cnt = ARRAY_SIZE(omap2430_wd_timer2_addrs), + .user = OCP_USER_MPU | OCP_USER_SDMA, +}; + +/* WDTIMER common */ + +static struct omap_hwmod_class_sysconfig omap2430_wd_timer_sysc = { + .rev_offs = 0x0, + .sysc_offs = 0x0010, + .syss_offs = 0x0014, + .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET | + SYSC_HAS_AUTOIDLE), + .sysc_fields = &omap_hwmod_sysc_type1, +}; + +static struct omap_hwmod_class omap2430_wd_timer_hwmod_class = { + .name = "wd_timer", + .sysc = &omap2430_wd_timer_sysc, +}; + +/* WDTIMER2 */ +static struct omap_hwmod_ocp_if *omap2430_wd_timer2_slaves[] = { + &omap2430_l4_wkup__wd_timer2, +}; + +static struct omap_hwmod omap2430_wd_timer2_hwmod = { + .name = "wd_timer2", + .class = &omap2430_wd_timer_hwmod_class, + .main_clk = "mpu_wdt_fck", + .prcm = { + .omap2 = { + .prcm_reg_id = 1, + .module_bit = OMAP24XX_EN_WDT2_SHIFT, + .module_offs = WKUP_MOD, + .idlest_reg_id = 1, + .idlest_idle_bit = OMAP24XX_EN_WDT2_SHIFT, + }, + }, + .slaves = omap2430_wd_timer2_slaves, + .slaves_cnt = ARRAY_SIZE(omap2430_wd_timer2_slaves), + .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), +}; + static __initdata struct omap_hwmod *omap2430_hwmods[] = { &omap2430_l3_main_hwmod, &omap2430_l4_core_hwmod, &omap2430_l4_wkup_hwmod, &omap2430_mpu_hwmod, &omap2430_iva_hwmod, + &omap2430_wd_timer2_hwmod, NULL, }; -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/6 v2] OMAP4: WDT: Enable watchdog timer2 hwmod structure 2010-08-11 10:11 ` [PATCH 4/6 v2] OMAP2430: WDT: Add watchdog timer HWMOD data for OMAP2430 Charulatha V @ 2010-08-11 10:11 ` Charulatha V 2010-08-11 10:11 ` [PATCH 6/6 v2] OMAP2PLUS: WDT: Conversion to runtime PM Charulatha V 0 siblings, 1 reply; 9+ messages in thread From: Charulatha V @ 2010-08-11 10:11 UTC (permalink / raw) To: linux-omap; +Cc: wim, khilman, paul, b-cousson, rnayak, p-basak2, Charulatha V This patch enables the watchdog timer2 hwmod structure Signed-off-by: Charulatha V <charu@ti.com> Signed-off-by: Basak, Partha <p-basak2@ti.com> --- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 9736a49..929d458 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -5789,7 +5789,7 @@ static __initdata struct omap_hwmod *omap44xx_hwmods[] = { /* usb_tll_hs class */ /* &omap44xx_usb_tll_hs_hwmod, */ /* wd_timer class */ -/* &omap44xx_wd_timer2_hwmod, */ + &omap44xx_wd_timer2_hwmod, /* &omap44xx_wd_timer3_hwmod, */ NULL, }; -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 6/6 v2] OMAP2PLUS: WDT: Conversion to runtime PM 2010-08-11 10:11 ` [PATCH 5/6 v2] OMAP4: WDT: Enable watchdog timer2 hwmod structure Charulatha V @ 2010-08-11 10:11 ` Charulatha V 2010-08-11 18:45 ` Kevin Hilman 0 siblings, 1 reply; 9+ messages in thread From: Charulatha V @ 2010-08-11 10:11 UTC (permalink / raw) To: linux-omap; +Cc: wim, khilman, paul, b-cousson, rnayak, p-basak2, Charulatha V This patch converts the OMAP Watchdog timer driver to get adapted to HWMOD FW and to use the runtime PM APIs. Signed-off-by: Charulatha V <charu@ti.com> Signed-off-by: Basak, Partha <p-basak2@ti.com> --- arch/arm/plat-omap/devices.c | 52 ++++++++++++++++++++++++++++++----------- drivers/watchdog/omap_wdt.c | 43 ++++++---------------------------- 2 files changed, 46 insertions(+), 49 deletions(-) diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c index d1920be..efe2aff 100644 --- a/arch/arm/plat-omap/devices.c +++ b/arch/arm/plat-omap/devices.c @@ -15,6 +15,7 @@ #include <linux/platform_device.h> #include <linux/io.h> #include <linux/slab.h> +#include <linux/err.h> #include <mach/hardware.h> #include <asm/mach-types.h> @@ -28,6 +29,8 @@ #include <plat/menelaus.h> #include <plat/mcbsp.h> #include <plat/omap44xx.h> +#include <plat/omap_hwmod.h> +#include <plat/omap_device.h> /*-------------------------------------------------------------------------*/ @@ -238,6 +241,8 @@ static inline void omap_init_uwire(void) {} static struct resource wdt_resources[] = { { + .start = 0xfffeb000, + .end = 0xfffeb07F, .flags = IORESOURCE_MEM, }, }; @@ -249,24 +254,43 @@ static struct platform_device omap_wdt_device = { .resource = wdt_resources, }; -static void omap_init_wdt(void) +struct omap_device_pm_latency omap_wdt_latency[] = { + [0] = { + .deactivate_func = omap_device_idle_hwmods, + .activate_func = omap_device_enable_hwmods, + .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST, + }, +}; + +static void omap2_init_wdt() { - if (cpu_is_omap16xx()) - wdt_resources[0].start = 0xfffeb000; - else if (cpu_is_omap2420()) - wdt_resources[0].start = 0x48022000; /* WDT2 */ - else if (cpu_is_omap2430()) - wdt_resources[0].start = 0x49016000; /* WDT2 */ - else if (cpu_is_omap343x()) - wdt_resources[0].start = 0x48314000; /* WDT2 */ - else if (cpu_is_omap44xx()) - wdt_resources[0].start = 0x4a314000; - else + int id = -1; + struct omap_device *od; + struct omap_hwmod *oh; + char *oh_name = "wd_timer2"; + char *name = "omap_wdt"; + + oh = omap_hwmod_lookup(oh_name); + if (!oh) { + pr_err("Could not look up %s\n", oh_name); return; + } - wdt_resources[0].end = wdt_resources[0].start + 0x4f; + od = omap_device_build(name, id, oh, NULL, 0, + omap_wdt_latency, + ARRAY_SIZE(omap_wdt_latency), 0); + WARN(IS_ERR(od), "Cant build omap_device for %s:%s.\n", + name, oh->name); + return 0; +} - (void) platform_device_register(&omap_wdt_device); +static void omap_init_wdt(void) +{ + if (cpu_class_is_omap2()) + omap2_init_wdt(); + else if (cpu_is_omap16xx()) + (void) platform_device_register(&omap_wdt_device); + return; } #else static inline void omap_init_wdt(void) {} diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index 76b58ab..7645ca3 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -38,13 +38,14 @@ #include <linux/err.h> #include <linux/platform_device.h> #include <linux/moduleparam.h> -#include <linux/clk.h> #include <linux/bitops.h> #include <linux/io.h> #include <linux/uaccess.h> #include <linux/slab.h> +#include <linux/pm_runtime.h> #include <mach/hardware.h> #include <plat/prcm.h> +#include <plat/omap_device.h> #include "omap_wdt.h" @@ -61,8 +62,6 @@ struct omap_wdt_dev { void __iomem *base; /* physical */ struct device *dev; int omap_wdt_users; - struct clk *ick; - struct clk *fck; struct resource *mem; struct miscdevice omap_wdt_miscdev; }; @@ -146,8 +145,7 @@ static int omap_wdt_open(struct inode *inode, struct file *file) if (test_and_set_bit(1, (unsigned long *)&(wdev->omap_wdt_users))) return -EBUSY; - clk_enable(wdev->ick); /* Enable the interface clock */ - clk_enable(wdev->fck); /* Enable the functional clock */ + pm_runtime_get_sync(wdev->dev); /* initialize prescaler */ while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) @@ -177,8 +175,7 @@ static int omap_wdt_release(struct inode *inode, struct file *file) omap_wdt_disable(wdev); - clk_disable(wdev->ick); - clk_disable(wdev->fck); + pm_runtime_put_sync(wdev->dev); #else printk(KERN_CRIT "omap_wdt: Unexpected close, not stopping!\n"); #endif @@ -292,19 +289,7 @@ static int __devinit omap_wdt_probe(struct platform_device *pdev) wdev->omap_wdt_users = 0; wdev->mem = mem; - - wdev->ick = clk_get(&pdev->dev, "ick"); - if (IS_ERR(wdev->ick)) { - ret = PTR_ERR(wdev->ick); - wdev->ick = NULL; - goto err_clk; - } - wdev->fck = clk_get(&pdev->dev, "fck"); - if (IS_ERR(wdev->fck)) { - ret = PTR_ERR(wdev->fck); - wdev->fck = NULL; - goto err_clk; - } + wdev->dev = &pdev->dev; wdev->base = ioremap(res->start, resource_size(res)); if (!wdev->base) { @@ -314,8 +299,8 @@ static int __devinit omap_wdt_probe(struct platform_device *pdev) platform_set_drvdata(pdev, wdev); - clk_enable(wdev->ick); - clk_enable(wdev->fck); + pm_runtime_enable(wdev->dev); + pm_runtime_get_sync(wdev->dev); omap_wdt_disable(wdev); omap_wdt_adjust_timeout(timer_margin); @@ -333,11 +318,7 @@ static int __devinit omap_wdt_probe(struct platform_device *pdev) __raw_readl(wdev->base + OMAP_WATCHDOG_REV) & 0xFF, timer_margin); - /* autogate OCP interface clock */ - __raw_writel(0x01, wdev->base + OMAP_WATCHDOG_SYS_CONFIG); - - clk_disable(wdev->ick); - clk_disable(wdev->fck); + pm_runtime_put_sync(wdev->dev); omap_wdt_dev = pdev; @@ -349,12 +330,6 @@ err_misc: err_ioremap: wdev->base = NULL; - -err_clk: - if (wdev->ick) - clk_put(wdev->ick); - if (wdev->fck) - clk_put(wdev->fck); kfree(wdev); err_kzalloc: @@ -386,8 +361,6 @@ static int __devexit omap_wdt_remove(struct platform_device *pdev) release_mem_region(res->start, resource_size(res)); platform_set_drvdata(pdev, NULL); - clk_put(wdev->ick); - clk_put(wdev->fck); iounmap(wdev->base); kfree(wdev); -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 6/6 v2] OMAP2PLUS: WDT: Conversion to runtime PM 2010-08-11 10:11 ` [PATCH 6/6 v2] OMAP2PLUS: WDT: Conversion to runtime PM Charulatha V @ 2010-08-11 18:45 ` Kevin Hilman 2010-08-12 4:40 ` Varadarajan, Charulatha 0 siblings, 1 reply; 9+ messages in thread From: Kevin Hilman @ 2010-08-11 18:45 UTC (permalink / raw) To: Charulatha V; +Cc: linux-omap, wim, paul, b-cousson, rnayak, p-basak2 Charulatha V <charu@ti.com> writes: > This patch converts the OMAP Watchdog timer driver to > get adapted to HWMOD FW and to use the runtime PM APIs. > > Signed-off-by: Charulatha V <charu@ti.com> > Signed-off-by: Basak, Partha <p-basak2@ti.com> This series looks good. One minor comment below... > --- > arch/arm/plat-omap/devices.c | 52 ++++++++++++++++++++++++++++++----------- > drivers/watchdog/omap_wdt.c | 43 ++++++---------------------------- > 2 files changed, 46 insertions(+), 49 deletions(-) > > diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c > index d1920be..efe2aff 100644 > --- a/arch/arm/plat-omap/devices.c > +++ b/arch/arm/plat-omap/devices.c > @@ -15,6 +15,7 @@ > #include <linux/platform_device.h> > #include <linux/io.h> > #include <linux/slab.h> > +#include <linux/err.h> > > #include <mach/hardware.h> > #include <asm/mach-types.h> > @@ -28,6 +29,8 @@ > #include <plat/menelaus.h> > #include <plat/mcbsp.h> > #include <plat/omap44xx.h> > +#include <plat/omap_hwmod.h> > +#include <plat/omap_device.h> > > /*-------------------------------------------------------------------------*/ > > @@ -238,6 +241,8 @@ static inline void omap_init_uwire(void) {} > > static struct resource wdt_resources[] = { > { > + .start = 0xfffeb000, > + .end = 0xfffeb07F, > .flags = IORESOURCE_MEM, > }, > }; This struct should probably be renamed with an omap1_ prefix. > @@ -249,24 +254,43 @@ static struct platform_device omap_wdt_device = { > .resource = wdt_resources, > }; ditto and they should be moved down just above omap_init_wdt() > -static void omap_init_wdt(void) > +struct omap_device_pm_latency omap_wdt_latency[] = { > + [0] = { > + .deactivate_func = omap_device_idle_hwmods, > + .activate_func = omap_device_enable_hwmods, > + .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST, > + }, > +}; > + > +static void omap2_init_wdt() > { > - if (cpu_is_omap16xx()) > - wdt_resources[0].start = 0xfffeb000; > - else if (cpu_is_omap2420()) > - wdt_resources[0].start = 0x48022000; /* WDT2 */ > - else if (cpu_is_omap2430()) > - wdt_resources[0].start = 0x49016000; /* WDT2 */ > - else if (cpu_is_omap343x()) > - wdt_resources[0].start = 0x48314000; /* WDT2 */ > - else if (cpu_is_omap44xx()) > - wdt_resources[0].start = 0x4a314000; > - else > + int id = -1; > + struct omap_device *od; > + struct omap_hwmod *oh; > + char *oh_name = "wd_timer2"; > + char *name = "omap_wdt"; > + > + oh = omap_hwmod_lookup(oh_name); > + if (!oh) { > + pr_err("Could not look up %s\n", oh_name); > return; > + } Kevin ^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: [PATCH 6/6 v2] OMAP2PLUS: WDT: Conversion to runtime PM 2010-08-11 18:45 ` Kevin Hilman @ 2010-08-12 4:40 ` Varadarajan, Charulatha 0 siblings, 0 replies; 9+ messages in thread From: Varadarajan, Charulatha @ 2010-08-12 4:40 UTC (permalink / raw) To: Kevin Hilman Cc: linux-omap@vger.kernel.org, wim@iguana.be, paul@pwsan.com, Cousson, Benoit, Nayak, Rajendra, Basak, Partha > -----Original Message----- > From: Kevin Hilman [mailto:khilman@deeprootsystems.com] > Sent: Thursday, August 12, 2010 12:15 AM > To: Varadarajan, Charulatha > Cc: linux-omap@vger.kernel.org; wim@iguana.be; paul@pwsan.com; Cousson, > Benoit; Nayak, Rajendra; Basak, Partha > Subject: Re: [PATCH 6/6 v2] OMAP2PLUS: WDT: Conversion to runtime PM > > Charulatha V <charu@ti.com> writes: > > > This patch converts the OMAP Watchdog timer driver to > > get adapted to HWMOD FW and to use the runtime PM APIs. > > > > Signed-off-by: Charulatha V <charu@ti.com> > > Signed-off-by: Basak, Partha <p-basak2@ti.com> > > This series looks good. One minor comment below... > > > --- > > arch/arm/plat-omap/devices.c | 52 ++++++++++++++++++++++++++++++----- > ------ > > drivers/watchdog/omap_wdt.c | 43 ++++++---------------------------- > > 2 files changed, 46 insertions(+), 49 deletions(-) > > > > diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c > > index d1920be..efe2aff 100644 > > --- a/arch/arm/plat-omap/devices.c > > +++ b/arch/arm/plat-omap/devices.c > > @@ -15,6 +15,7 @@ > > #include <linux/platform_device.h> > > #include <linux/io.h> > > #include <linux/slab.h> > > +#include <linux/err.h> > > > > #include <mach/hardware.h> > > #include <asm/mach-types.h> > > @@ -28,6 +29,8 @@ > > #include <plat/menelaus.h> > > #include <plat/mcbsp.h> > > #include <plat/omap44xx.h> > > +#include <plat/omap_hwmod.h> > > +#include <plat/omap_device.h> > > > > /*--------------------------------------------------------------------- > ----*/ > > > > @@ -238,6 +241,8 @@ static inline void omap_init_uwire(void) {} > > > > static struct resource wdt_resources[] = { > > { > > + .start = 0xfffeb000, > > + .end = 0xfffeb07F, > > .flags = IORESOURCE_MEM, > > }, > > }; > > This struct should probably be renamed with an omap1_ prefix. > > > @@ -249,24 +254,43 @@ static struct platform_device omap_wdt_device = { > > .resource = wdt_resources, > > }; > > ditto > Okay > and they should be moved down just above omap_init_wdt() Okay. Will send you the updated patch series soon. > > > -static void omap_init_wdt(void) > > +struct omap_device_pm_latency omap_wdt_latency[] = { > > + [0] = { > > + .deactivate_func = omap_device_idle_hwmods, > > + .activate_func = omap_device_enable_hwmods, > > + .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST, > > + }, > > +}; > > + > > +static void omap2_init_wdt() > > { > > - if (cpu_is_omap16xx()) > > - wdt_resources[0].start = 0xfffeb000; > > - else if (cpu_is_omap2420()) > > - wdt_resources[0].start = 0x48022000; /* WDT2 */ > > - else if (cpu_is_omap2430()) > > - wdt_resources[0].start = 0x49016000; /* WDT2 */ > > - else if (cpu_is_omap343x()) > > - wdt_resources[0].start = 0x48314000; /* WDT2 */ > > - else if (cpu_is_omap44xx()) > > - wdt_resources[0].start = 0x4a314000; > > - else > > + int id = -1; > > + struct omap_device *od; > > + struct omap_hwmod *oh; > > + char *oh_name = "wd_timer2"; > > + char *name = "omap_wdt"; > > + > > + oh = omap_hwmod_lookup(oh_name); > > + if (!oh) { > > + pr_err("Could not look up %s\n", oh_name); > > return; > > + } > > Kevin ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-08-12 4:40 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-08-11 10:11 [PATCH 0/6 v2] OMAP2PLUS: WDT: Implement WDT in HWMOD way Charulatha V 2010-08-11 10:11 ` [PATCH 1/6 v2] OMAP2PLUS: WDT: Add ICLKEN, FCLKEN, WKEN shared bits for WDT Charulatha V 2010-08-11 10:11 ` [PATCH 2/6 v2] OMAP3: WDT: Add watchdog timer HWMOD data for OMAP3 Charulatha V 2010-08-11 10:11 ` [PATCH 3/6 v2] OMAP2420: WDT: Add watchdog timer HWMOD data for OMAP2420 Charulatha V 2010-08-11 10:11 ` [PATCH 4/6 v2] OMAP2430: WDT: Add watchdog timer HWMOD data for OMAP2430 Charulatha V 2010-08-11 10:11 ` [PATCH 5/6 v2] OMAP4: WDT: Enable watchdog timer2 hwmod structure Charulatha V 2010-08-11 10:11 ` [PATCH 6/6 v2] OMAP2PLUS: WDT: Conversion to runtime PM Charulatha V 2010-08-11 18:45 ` Kevin Hilman 2010-08-12 4:40 ` Varadarajan, Charulatha
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).