diff options
| author | Tony Lindgren <tony@atomide.com> | 2012-05-09 12:58:42 -0400 |
|---|---|---|
| committer | Tony Lindgren <tony@atomide.com> | 2012-05-09 12:58:42 -0400 |
| commit | bfd17879866b36e95c58721da070d9f2ac7f8901 (patch) | |
| tree | 2381206a25ba7d664f4b787321ca5ce253e6a22c | |
| parent | 743a6d923f803c861a24d173e1d1818ca8ac0384 (diff) | |
| parent | 414e41286e3aeb87de140ef4c75100f9344c32b2 (diff) | |
Merge tag 'omap-devel-c-for-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/pjw/omap-pending into devel-hwmod-data
Some OMAP IP block data additions for 3.5, along with a
fix for a longstanding watchdog timer integration problem.
| -rw-r--r-- | arch/arm/mach-omap2/Makefile | 5 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/hdq1w.c | 72 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/io.c | 18 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/msdi.c | 88 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_2420_data.c | 112 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_2430_data.c | 47 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_interconnect_data.c | 9 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c | 22 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | 23 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 94 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 12 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_common_data.h | 5 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/wd_timer.c | 45 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/wd_timer.h | 1 | ||||
| -rw-r--r-- | arch/arm/plat-omap/include/plat/hdq1w.h | 36 | ||||
| -rw-r--r-- | arch/arm/plat-omap/include/plat/mmc.h | 4 |
16 files changed, 562 insertions, 31 deletions
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index d8604a3e490e..385c083d24b2 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | # Common support | 5 | # Common support |
| 6 | obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \ | 6 | obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \ |
| 7 | common.o gpio.o dma.o wd_timer.o display.o i2c.o | 7 | common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o |
| 8 | 8 | ||
| 9 | omap-2-3-common = irq.o sdrc.o | 9 | omap-2-3-common = irq.o sdrc.o |
| 10 | hwmod-common = omap_hwmod.o \ | 10 | hwmod-common = omap_hwmod.o \ |
| @@ -189,6 +189,9 @@ ifneq ($(CONFIG_TIDSPBRIDGE),) | |||
| 189 | obj-y += dsp.o | 189 | obj-y += dsp.o |
| 190 | endif | 190 | endif |
| 191 | 191 | ||
| 192 | # OMAP2420 MSDI controller integration support ("MMC") | ||
| 193 | obj-$(CONFIG_SOC_OMAP2420) += msdi.o | ||
| 194 | |||
| 192 | # Specific board support | 195 | # Specific board support |
| 193 | obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o | 196 | obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o |
| 194 | obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o | 197 | obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o |
diff --git a/arch/arm/mach-omap2/hdq1w.c b/arch/arm/mach-omap2/hdq1w.c new file mode 100644 index 000000000000..297ebe03f09c --- /dev/null +++ b/arch/arm/mach-omap2/hdq1w.c | |||
| @@ -0,0 +1,72 @@ | |||
| 1 | /* | ||
| 2 | * IP block integration code for the HDQ1W/1-wire IP block | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012 Texas Instruments, Inc. | ||
| 5 | * Paul Walmsley | ||
| 6 | * | ||
| 7 | * Based on the I2C reset code in arch/arm/mach-omap2/i2c.c by | ||
| 8 | * Avinash.H.M <avinashhm@ti.com> | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or | ||
| 11 | * modify it under the terms of the GNU General Public License | ||
| 12 | * version 2 as published by the Free Software Foundation. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, but | ||
| 15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 17 | * General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License | ||
| 20 | * along with this program; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| 22 | * 02110-1301 USA | ||
| 23 | */ | ||
| 24 | |||
| 25 | #include <plat/omap_hwmod.h> | ||
| 26 | #include <plat/hdq1w.h> | ||
| 27 | |||
| 28 | #include "common.h" | ||
| 29 | |||
| 30 | /* Maximum microseconds to wait for OMAP module to softreset */ | ||
| 31 | #define MAX_MODULE_SOFTRESET_WAIT 10000 | ||
| 32 | |||
| 33 | /** | ||
| 34 | * omap_hdq1w_reset - reset the OMAP HDQ1W module | ||
| 35 | * @oh: struct omap_hwmod * | ||
| 36 | * | ||
| 37 | * OCP soft reset the HDQ1W IP block. Section 20.6.1.4 "HDQ1W/1-Wire | ||
| 38 | * Software Reset" of the OMAP34xx Technical Reference Manual Revision | ||
| 39 | * ZR (SWPU223R) does not include the rather important fact that, for | ||
| 40 | * the reset to succeed, the HDQ1W module's internal clock gate must be | ||
| 41 | * programmed to allow the clock to propagate to the rest of the | ||
| 42 | * module. In this sense, it's rather similar to the I2C custom reset | ||
| 43 | * function. Returns 0. | ||
| 44 | */ | ||
| 45 | int omap_hdq1w_reset(struct omap_hwmod *oh) | ||
| 46 | { | ||
| 47 | u32 v; | ||
| 48 | int c = 0; | ||
| 49 | |||
| 50 | /* Write to the SOFTRESET bit */ | ||
| 51 | omap_hwmod_softreset(oh); | ||
| 52 | |||
| 53 | /* Enable the module's internal clocks */ | ||
| 54 | v = omap_hwmod_read(oh, HDQ_CTRL_STATUS_OFFSET); | ||
| 55 | v |= 1 << HDQ_CTRL_STATUS_CLOCKENABLE_SHIFT; | ||
| 56 | omap_hwmod_write(v, oh, HDQ_CTRL_STATUS_OFFSET); | ||
| 57 | |||
| 58 | /* Poll on RESETDONE bit */ | ||
| 59 | omap_test_timeout((omap_hwmod_read(oh, | ||
| 60 | oh->class->sysc->syss_offs) | ||
| 61 | & SYSS_RESETDONE_MASK), | ||
| 62 | MAX_MODULE_SOFTRESET_WAIT, c); | ||
| 63 | |||
| 64 | if (c == MAX_MODULE_SOFTRESET_WAIT) | ||
| 65 | pr_warning("%s: %s: softreset failed (waited %d usec)\n", | ||
| 66 | __func__, oh->name, MAX_MODULE_SOFTRESET_WAIT); | ||
| 67 | else | ||
| 68 | pr_debug("%s: %s: softreset in %d usec\n", __func__, | ||
| 69 | oh->name, c); | ||
| 70 | |||
| 71 | return 0; | ||
| 72 | } | ||
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 065bd768987c..fafcc35b970c 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -363,24 +363,6 @@ static void __init omap_hwmod_init_postsetup(void) | |||
| 363 | #endif | 363 | #endif |
| 364 | omap_hwmod_for_each(_set_hwmod_postsetup_state, &postsetup_state); | 364 | omap_hwmod_for_each(_set_hwmod_postsetup_state, &postsetup_state); |
| 365 | 365 | ||
| 366 | /* | ||
| 367 | * Set the default postsetup state for unusual modules (like | ||
| 368 | * MPU WDT). | ||
| 369 | * | ||
| 370 | * The postsetup_state is not actually used until | ||
| 371 | * omap_hwmod_late_init(), so boards that desire full watchdog | ||
| 372 | * coverage of kernel initialization can reprogram the | ||
| 373 | * postsetup_state between the calls to | ||
| 374 | * omap2_init_common_infra() and omap_sdrc_init(). | ||
| 375 | * | ||
| 376 | * XXX ideally we could detect whether the MPU WDT was currently | ||
| 377 | * enabled here and make this conditional | ||
| 378 | */ | ||
| 379 | postsetup_state = _HWMOD_STATE_DISABLED; | ||
| 380 | omap_hwmod_for_each_by_class("wd_timer", | ||
| 381 | _set_hwmod_postsetup_state, | ||
| 382 | &postsetup_state); | ||
| 383 | |||
| 384 | omap_pm_if_early_init(); | 366 | omap_pm_if_early_init(); |
| 385 | } | 367 | } |
| 386 | 368 | ||
diff --git a/arch/arm/mach-omap2/msdi.c b/arch/arm/mach-omap2/msdi.c new file mode 100644 index 000000000000..ef2a6924731a --- /dev/null +++ b/arch/arm/mach-omap2/msdi.c | |||
| @@ -0,0 +1,88 @@ | |||
| 1 | /* | ||
| 2 | * MSDI IP block reset | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012 Texas Instruments, Inc. | ||
| 5 | * Paul Walmsley | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU General Public License | ||
| 9 | * version 2 as published by the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, but | ||
| 12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 14 | * General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| 19 | * 02110-1301 USA | ||
| 20 | * | ||
| 21 | * XXX What about pad muxing? | ||
| 22 | */ | ||
| 23 | |||
| 24 | #include <linux/kernel.h> | ||
| 25 | |||
| 26 | #include <plat/omap_hwmod.h> | ||
| 27 | #include <plat/mmc.h> | ||
| 28 | |||
| 29 | #include "common.h" | ||
| 30 | |||
| 31 | /* | ||
| 32 | * MSDI_CON_OFFSET: offset in bytes of the MSDI IP block's CON register | ||
| 33 | * from the IP block's base address | ||
| 34 | */ | ||
| 35 | #define MSDI_CON_OFFSET 0x0c | ||
| 36 | |||
| 37 | /* Register bitfields in the CON register */ | ||
| 38 | #define MSDI_CON_POW_MASK BIT(11) | ||
| 39 | #define MSDI_CON_CLKD_MASK (0x3f << 0) | ||
| 40 | #define MSDI_CON_CLKD_SHIFT 0 | ||
| 41 | |||
| 42 | /* Maximum microseconds to wait for OMAP module to softreset */ | ||
| 43 | #define MAX_MODULE_SOFTRESET_WAIT 10000 | ||
| 44 | |||
| 45 | /* MSDI_TARGET_RESET_CLKD: clock divisor to use throughout the reset */ | ||
| 46 | #define MSDI_TARGET_RESET_CLKD 0x3ff | ||
| 47 | |||
| 48 | /** | ||
| 49 | * omap_msdi_reset - reset the MSDI IP block | ||
| 50 | * @oh: struct omap_hwmod * | ||
| 51 | * | ||
| 52 | * The MSDI IP block on OMAP2420 has to have both the POW and CLKD | ||
| 53 | * fields set inside its CON register for a reset to complete | ||
| 54 | * successfully. This is not documented in the TRM. For CLKD, we use | ||
| 55 | * the value that results in the lowest possible clock rate, to attempt | ||
| 56 | * to avoid disturbing any cards. | ||
| 57 | */ | ||
| 58 | int omap_msdi_reset(struct omap_hwmod *oh) | ||
| 59 | { | ||
| 60 | u16 v = 0; | ||
| 61 | int c = 0; | ||
| 62 | |||
| 63 | /* Write to the SOFTRESET bit */ | ||
| 64 | omap_hwmod_softreset(oh); | ||
| 65 | |||
| 66 | /* Enable the MSDI core and internal clock */ | ||
| 67 | v |= MSDI_CON_POW_MASK; | ||
| 68 | v |= MSDI_TARGET_RESET_CLKD << MSDI_CON_CLKD_SHIFT; | ||
| 69 | omap_hwmod_write(v, oh, MSDI_CON_OFFSET); | ||
| 70 | |||
| 71 | /* Poll on RESETDONE bit */ | ||
| 72 | omap_test_timeout((omap_hwmod_read(oh, oh->class->sysc->syss_offs) | ||
| 73 | & SYSS_RESETDONE_MASK), | ||
| 74 | MAX_MODULE_SOFTRESET_WAIT, c); | ||
| 75 | |||
| 76 | if (c == MAX_MODULE_SOFTRESET_WAIT) | ||
| 77 | pr_warning("%s: %s: softreset failed (waited %d usec)\n", | ||
| 78 | __func__, oh->name, MAX_MODULE_SOFTRESET_WAIT); | ||
| 79 | else | ||
| 80 | pr_debug("%s: %s: softreset in %d usec\n", __func__, | ||
| 81 | oh->name, c); | ||
| 82 | |||
| 83 | /* Disable the MSDI internal clock */ | ||
| 84 | v &= ~MSDI_CON_CLKD_MASK; | ||
| 85 | omap_hwmod_write(v, oh, MSDI_CON_OFFSET); | ||
| 86 | |||
| 87 | return 0; | ||
| 88 | } | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index 2c087ffc6a92..a7640d1b215e 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <plat/dmtimer.h> | 23 | #include <plat/dmtimer.h> |
| 24 | #include <plat/l3_2xxx.h> | 24 | #include <plat/l3_2xxx.h> |
| 25 | #include <plat/l4_2xxx.h> | 25 | #include <plat/l4_2xxx.h> |
| 26 | #include <plat/mmc.h> | ||
| 26 | 27 | ||
| 27 | #include "omap_hwmod_common_data.h" | 28 | #include "omap_hwmod_common_data.h" |
| 28 | 29 | ||
| @@ -239,6 +240,67 @@ static struct omap_hwmod omap2420_mcbsp2_hwmod = { | |||
| 239 | }, | 240 | }, |
| 240 | }; | 241 | }; |
| 241 | 242 | ||
| 243 | static struct omap_hwmod_class_sysconfig omap2420_msdi_sysc = { | ||
| 244 | .rev_offs = 0x3c, | ||
| 245 | .sysc_offs = 0x64, | ||
| 246 | .syss_offs = 0x68, | ||
| 247 | .sysc_flags = (SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS), | ||
| 248 | .sysc_fields = &omap_hwmod_sysc_type1, | ||
| 249 | }; | ||
| 250 | |||
| 251 | static struct omap_hwmod_class omap2420_msdi_hwmod_class = { | ||
| 252 | .name = "msdi", | ||
| 253 | .sysc = &omap2420_msdi_sysc, | ||
| 254 | .reset = &omap_msdi_reset, | ||
| 255 | }; | ||
| 256 | |||
| 257 | /* msdi1 */ | ||
| 258 | static struct omap_hwmod_irq_info omap2420_msdi1_irqs[] = { | ||
| 259 | { .irq = 83 }, | ||
| 260 | { .irq = -1 } | ||
| 261 | }; | ||
| 262 | |||
| 263 | static struct omap_hwmod_dma_info omap2420_msdi1_sdma_reqs[] = { | ||
| 264 | { .name = "tx", .dma_req = 61 }, /* OMAP24XX_DMA_MMC1_TX */ | ||
| 265 | { .name = "rx", .dma_req = 62 }, /* OMAP24XX_DMA_MMC1_RX */ | ||
| 266 | { .dma_req = -1 } | ||
| 267 | }; | ||
| 268 | |||
| 269 | static struct omap_hwmod omap2420_msdi1_hwmod = { | ||
| 270 | .name = "msdi1", | ||
| 271 | .class = &omap2420_msdi_hwmod_class, | ||
| 272 | .mpu_irqs = omap2420_msdi1_irqs, | ||
| 273 | .sdma_reqs = omap2420_msdi1_sdma_reqs, | ||
| 274 | .main_clk = "mmc_fck", | ||
| 275 | .prcm = { | ||
| 276 | .omap2 = { | ||
| 277 | .prcm_reg_id = 1, | ||
| 278 | .module_bit = OMAP2420_EN_MMC_SHIFT, | ||
| 279 | .module_offs = CORE_MOD, | ||
| 280 | .idlest_reg_id = 1, | ||
| 281 | .idlest_idle_bit = OMAP2420_ST_MMC_SHIFT, | ||
| 282 | }, | ||
| 283 | }, | ||
| 284 | .flags = HWMOD_16BIT_REG, | ||
| 285 | }; | ||
| 286 | |||
| 287 | /* HDQ1W/1-wire */ | ||
| 288 | static struct omap_hwmod omap2420_hdq1w_hwmod = { | ||
| 289 | .name = "hdq1w", | ||
| 290 | .mpu_irqs = omap2_hdq1w_mpu_irqs, | ||
| 291 | .main_clk = "hdq_fck", | ||
| 292 | .prcm = { | ||
| 293 | .omap2 = { | ||
| 294 | .module_offs = CORE_MOD, | ||
| 295 | .prcm_reg_id = 1, | ||
| 296 | .module_bit = OMAP24XX_EN_HDQ_SHIFT, | ||
| 297 | .idlest_reg_id = 1, | ||
| 298 | .idlest_idle_bit = OMAP24XX_ST_HDQ_SHIFT, | ||
| 299 | }, | ||
| 300 | }, | ||
| 301 | .class = &omap2_hdq1w_class, | ||
| 302 | }; | ||
| 303 | |||
| 242 | /* | 304 | /* |
| 243 | * interfaces | 305 | * interfaces |
| 244 | */ | 306 | */ |
| @@ -428,6 +490,53 @@ static struct omap_hwmod_ocp_if omap2420_l4_core__mcbsp2 = { | |||
| 428 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 490 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 429 | }; | 491 | }; |
| 430 | 492 | ||
| 493 | static struct omap_hwmod_addr_space omap2420_msdi1_addrs[] = { | ||
| 494 | { | ||
| 495 | .pa_start = 0x4809c000, | ||
| 496 | .pa_end = 0x4809c000 + SZ_128 - 1, | ||
| 497 | .flags = ADDR_TYPE_RT, | ||
| 498 | }, | ||
| 499 | { } | ||
| 500 | }; | ||
| 501 | |||
| 502 | /* l4_core -> msdi1 */ | ||
| 503 | static struct omap_hwmod_ocp_if omap2420_l4_core__msdi1 = { | ||
| 504 | .master = &omap2xxx_l4_core_hwmod, | ||
| 505 | .slave = &omap2420_msdi1_hwmod, | ||
| 506 | .clk = "mmc_ick", | ||
| 507 | .addr = omap2420_msdi1_addrs, | ||
| 508 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 509 | }; | ||
| 510 | |||
| 511 | /* l4_core -> hdq1w interface */ | ||
| 512 | static struct omap_hwmod_ocp_if omap2420_l4_core__hdq1w = { | ||
| 513 | .master = &omap2xxx_l4_core_hwmod, | ||
| 514 | .slave = &omap2420_hdq1w_hwmod, | ||
| 515 | .clk = "hdq_ick", | ||
| 516 | .addr = omap2_hdq1w_addr_space, | ||
| 517 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 518 | .flags = OMAP_FIREWALL_L4 | OCPIF_SWSUP_IDLE, | ||
| 519 | }; | ||
| 520 | |||
| 521 | |||
| 522 | /* l4_wkup -> 32ksync_counter */ | ||
| 523 | static struct omap_hwmod_addr_space omap2420_counter_32k_addrs[] = { | ||
| 524 | { | ||
| 525 | .pa_start = 0x48004000, | ||
| 526 | .pa_end = 0x4800401f, | ||
| 527 | .flags = ADDR_TYPE_RT | ||
| 528 | }, | ||
| 529 | { } | ||
| 530 | }; | ||
| 531 | |||
| 532 | static struct omap_hwmod_ocp_if omap2420_l4_wkup__counter_32k = { | ||
| 533 | .master = &omap2xxx_l4_wkup_hwmod, | ||
| 534 | .slave = &omap2xxx_counter_32k_hwmod, | ||
| 535 | .clk = "sync_32k_ick", | ||
| 536 | .addr = omap2420_counter_32k_addrs, | ||
| 537 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 538 | }; | ||
| 539 | |||
| 431 | static struct omap_hwmod_ocp_if *omap2420_hwmod_ocp_ifs[] __initdata = { | 540 | static struct omap_hwmod_ocp_if *omap2420_hwmod_ocp_ifs[] __initdata = { |
| 432 | &omap2xxx_l3_main__l4_core, | 541 | &omap2xxx_l3_main__l4_core, |
| 433 | &omap2xxx_mpu__l3_main, | 542 | &omap2xxx_mpu__l3_main, |
| @@ -468,6 +577,9 @@ static struct omap_hwmod_ocp_if *omap2420_hwmod_ocp_ifs[] __initdata = { | |||
| 468 | &omap2420_l4_core__mailbox, | 577 | &omap2420_l4_core__mailbox, |
| 469 | &omap2420_l4_core__mcbsp1, | 578 | &omap2420_l4_core__mcbsp1, |
| 470 | &omap2420_l4_core__mcbsp2, | 579 | &omap2420_l4_core__mcbsp2, |
| 580 | &omap2420_l4_core__msdi1, | ||
| 581 | &omap2420_l4_core__hdq1w, | ||
| 582 | &omap2420_l4_wkup__counter_32k, | ||
| 471 | NULL, | 583 | NULL, |
| 472 | }; | 584 | }; |
| 473 | 585 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c index 71d9f8824f9d..4d7264981230 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c | |||
| @@ -528,6 +528,23 @@ static struct omap_hwmod omap2430_mmc2_hwmod = { | |||
| 528 | .class = &omap2430_mmc_class, | 528 | .class = &omap2430_mmc_class, |
| 529 | }; | 529 | }; |
| 530 | 530 | ||
| 531 | /* HDQ1W/1-wire */ | ||
| 532 | static struct omap_hwmod omap2430_hdq1w_hwmod = { | ||
| 533 | .name = "hdq1w", | ||
| 534 | .mpu_irqs = omap2_hdq1w_mpu_irqs, | ||
| 535 | .main_clk = "hdq_fck", | ||
| 536 | .prcm = { | ||
| 537 | .omap2 = { | ||
| 538 | .module_offs = CORE_MOD, | ||
| 539 | .prcm_reg_id = 1, | ||
| 540 | .module_bit = OMAP24XX_EN_HDQ_SHIFT, | ||
| 541 | .idlest_reg_id = 1, | ||
| 542 | .idlest_idle_bit = OMAP24XX_ST_HDQ_SHIFT, | ||
| 543 | }, | ||
| 544 | }, | ||
| 545 | .class = &omap2_hdq1w_class, | ||
| 546 | }; | ||
| 547 | |||
| 531 | /* | 548 | /* |
| 532 | * interfaces | 549 | * interfaces |
| 533 | */ | 550 | */ |
| @@ -838,6 +855,34 @@ static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp5 = { | |||
| 838 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 855 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 839 | }; | 856 | }; |
| 840 | 857 | ||
| 858 | /* l4_core -> hdq1w */ | ||
| 859 | static struct omap_hwmod_ocp_if omap2430_l4_core__hdq1w = { | ||
| 860 | .master = &omap2xxx_l4_core_hwmod, | ||
| 861 | .slave = &omap2430_hdq1w_hwmod, | ||
| 862 | .clk = "hdq_ick", | ||
| 863 | .addr = omap2_hdq1w_addr_space, | ||
| 864 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 865 | .flags = OMAP_FIREWALL_L4 | OCPIF_SWSUP_IDLE, | ||
| 866 | }; | ||
| 867 | |||
| 868 | /* l4_wkup -> 32ksync_counter */ | ||
| 869 | static struct omap_hwmod_addr_space omap2430_counter_32k_addrs[] = { | ||
| 870 | { | ||
| 871 | .pa_start = 0x49020000, | ||
| 872 | .pa_end = 0x4902001f, | ||
| 873 | .flags = ADDR_TYPE_RT | ||
| 874 | }, | ||
| 875 | { } | ||
| 876 | }; | ||
| 877 | |||
| 878 | static struct omap_hwmod_ocp_if omap2430_l4_wkup__counter_32k = { | ||
| 879 | .master = &omap2xxx_l4_wkup_hwmod, | ||
| 880 | .slave = &omap2xxx_counter_32k_hwmod, | ||
| 881 | .clk = "sync_32k_ick", | ||
| 882 | .addr = omap2430_counter_32k_addrs, | ||
| 883 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 884 | }; | ||
| 885 | |||
| 841 | static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = { | 886 | static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = { |
| 842 | &omap2xxx_l3_main__l4_core, | 887 | &omap2xxx_l3_main__l4_core, |
| 843 | &omap2xxx_mpu__l3_main, | 888 | &omap2xxx_mpu__l3_main, |
| @@ -886,6 +931,8 @@ static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = { | |||
| 886 | &omap2430_l4_core__mcbsp3, | 931 | &omap2430_l4_core__mcbsp3, |
| 887 | &omap2430_l4_core__mcbsp4, | 932 | &omap2430_l4_core__mcbsp4, |
| 888 | &omap2430_l4_core__mcbsp5, | 933 | &omap2430_l4_core__mcbsp5, |
| 934 | &omap2430_l4_core__hdq1w, | ||
| 935 | &omap2430_l4_wkup__counter_32k, | ||
| 889 | NULL, | 936 | NULL, |
| 890 | }; | 937 | }; |
| 891 | 938 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_interconnect_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_interconnect_data.c index 04637fabadd2..cbb4ef6544ad 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_interconnect_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_interconnect_data.c | |||
| @@ -171,3 +171,12 @@ struct omap_hwmod_addr_space omap2_mcbsp1_addrs[] = { | |||
| 171 | }, | 171 | }, |
| 172 | { } | 172 | { } |
| 173 | }; | 173 | }; |
| 174 | |||
| 175 | struct omap_hwmod_addr_space omap2_hdq1w_addr_space[] = { | ||
| 176 | { | ||
| 177 | .pa_start = 0x480b2000, | ||
| 178 | .pa_end = 0x480b2fff, | ||
| 179 | .flags = ADDR_TYPE_RT, | ||
| 180 | }, | ||
| 181 | { } | ||
| 182 | }; | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c index f08e442af397..102d76e9e9ea 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * omap_hwmod_2xxx_3xxx_ipblock_data.c - common IP block data for OMAP2/3 | 2 | * omap_hwmod_2xxx_3xxx_ipblock_data.c - common IP block data for OMAP2/3 |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2011 Nokia Corporation | 4 | * Copyright (C) 2011 Nokia Corporation |
| 5 | * Copyright (C) 2012 Texas Instruments, Inc. | ||
| 5 | * Paul Walmsley | 6 | * Paul Walmsley |
| 6 | * | 7 | * |
| 7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
| @@ -12,6 +13,7 @@ | |||
| 12 | #include <plat/serial.h> | 13 | #include <plat/serial.h> |
| 13 | #include <plat/dma.h> | 14 | #include <plat/dma.h> |
| 14 | #include <plat/common.h> | 15 | #include <plat/common.h> |
| 16 | #include <plat/hdq1w.h> | ||
| 15 | 17 | ||
| 16 | #include <mach/irqs.h> | 18 | #include <mach/irqs.h> |
| 17 | 19 | ||
| @@ -302,3 +304,23 @@ struct omap_hwmod_irq_info omap2_mcspi2_mpu_irqs[] = { | |||
| 302 | { .irq = -1 } | 304 | { .irq = -1 } |
| 303 | }; | 305 | }; |
| 304 | 306 | ||
| 307 | struct omap_hwmod_class_sysconfig omap2_hdq1w_sysc = { | ||
| 308 | .rev_offs = 0x0, | ||
| 309 | .sysc_offs = 0x14, | ||
| 310 | .syss_offs = 0x18, | ||
| 311 | .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | | ||
| 312 | SYSS_HAS_RESET_STATUS), | ||
| 313 | .sysc_fields = &omap_hwmod_sysc_type1, | ||
| 314 | }; | ||
| 315 | |||
| 316 | struct omap_hwmod_class omap2_hdq1w_class = { | ||
| 317 | .name = "hdq1w", | ||
| 318 | .sysc = &omap2_hdq1w_sysc, | ||
| 319 | .reset = &omap_hdq1w_reset, | ||
| 320 | }; | ||
| 321 | |||
| 322 | struct omap_hwmod_irq_info omap2_hdq1w_mpu_irqs[] = { | ||
| 323 | { .irq = 58, }, | ||
| 324 | { .irq = -1 } | ||
| 325 | }; | ||
| 326 | |||
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 45aaa07e3025..83eafd96ecaa 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | |||
| @@ -89,7 +89,8 @@ static struct omap_hwmod_class_sysconfig omap2xxx_wd_timer_sysc = { | |||
| 89 | struct omap_hwmod_class omap2xxx_wd_timer_hwmod_class = { | 89 | struct omap_hwmod_class omap2xxx_wd_timer_hwmod_class = { |
| 90 | .name = "wd_timer", | 90 | .name = "wd_timer", |
| 91 | .sysc = &omap2xxx_wd_timer_sysc, | 91 | .sysc = &omap2xxx_wd_timer_sysc, |
| 92 | .pre_shutdown = &omap2_wd_timer_disable | 92 | .pre_shutdown = &omap2_wd_timer_disable, |
| 93 | .reset = &omap2_wd_timer_reset, | ||
| 93 | }; | 94 | }; |
| 94 | 95 | ||
| 95 | /* | 96 | /* |
| @@ -732,3 +733,23 @@ struct omap_hwmod omap2xxx_mcspi2_hwmod = { | |||
| 732 | .class = &omap2xxx_mcspi_class, | 733 | .class = &omap2xxx_mcspi_class, |
| 733 | .dev_attr = &omap_mcspi2_dev_attr, | 734 | .dev_attr = &omap_mcspi2_dev_attr, |
| 734 | }; | 735 | }; |
| 736 | |||
| 737 | |||
| 738 | static struct omap_hwmod_class omap2xxx_counter_hwmod_class = { | ||
| 739 | .name = "counter", | ||
| 740 | }; | ||
| 741 | |||
| 742 | struct omap_hwmod omap2xxx_counter_32k_hwmod = { | ||
| 743 | .name = "counter_32k", | ||
| 744 | .main_clk = "func_32k_ck", | ||
| 745 | .prcm = { | ||
| 746 | .omap2 = { | ||
| 747 | .module_offs = WKUP_MOD, | ||
| 748 | .prcm_reg_id = 1, | ||
| 749 | .module_bit = OMAP24XX_ST_32KSYNC_SHIFT, | ||
| 750 | .idlest_reg_id = 1, | ||
| 751 | .idlest_idle_bit = OMAP24XX_ST_32KSYNC_SHIFT, | ||
| 752 | }, | ||
| 753 | }, | ||
| 754 | .class = &omap2xxx_counter_hwmod_class, | ||
| 755 | }; | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 0c65079c2b69..fd48797fa95a 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
| @@ -418,7 +418,8 @@ static struct omap_hwmod_class_sysconfig i2c_sysc = { | |||
| 418 | static struct omap_hwmod_class omap3xxx_wd_timer_hwmod_class = { | 418 | static struct omap_hwmod_class omap3xxx_wd_timer_hwmod_class = { |
| 419 | .name = "wd_timer", | 419 | .name = "wd_timer", |
| 420 | .sysc = &omap3xxx_wd_timer_sysc, | 420 | .sysc = &omap3xxx_wd_timer_sysc, |
| 421 | .pre_shutdown = &omap2_wd_timer_disable | 421 | .pre_shutdown = &omap2_wd_timer_disable, |
| 422 | .reset = &omap2_wd_timer_reset, | ||
| 422 | }; | 423 | }; |
| 423 | 424 | ||
| 424 | static struct omap_hwmod omap3xxx_wd_timer2_hwmod = { | 425 | static struct omap_hwmod omap3xxx_wd_timer2_hwmod = { |
| @@ -1075,7 +1076,7 @@ static struct omap_hwmod_class omap3xxx_mcbsp_hwmod_class = { | |||
| 1075 | 1076 | ||
| 1076 | /* mcbsp1 */ | 1077 | /* mcbsp1 */ |
| 1077 | static struct omap_hwmod_irq_info omap3xxx_mcbsp1_irqs[] = { | 1078 | static struct omap_hwmod_irq_info omap3xxx_mcbsp1_irqs[] = { |
| 1078 | { .name = "irq", .irq = 16 }, | 1079 | { .name = "common", .irq = 16 }, |
| 1079 | { .name = "tx", .irq = 59 }, | 1080 | { .name = "tx", .irq = 59 }, |
| 1080 | { .name = "rx", .irq = 60 }, | 1081 | { .name = "rx", .irq = 60 }, |
| 1081 | { .irq = -1 } | 1082 | { .irq = -1 } |
| @@ -1100,7 +1101,7 @@ static struct omap_hwmod omap3xxx_mcbsp1_hwmod = { | |||
| 1100 | 1101 | ||
| 1101 | /* mcbsp2 */ | 1102 | /* mcbsp2 */ |
| 1102 | static struct omap_hwmod_irq_info omap3xxx_mcbsp2_irqs[] = { | 1103 | static struct omap_hwmod_irq_info omap3xxx_mcbsp2_irqs[] = { |
| 1103 | { .name = "irq", .irq = 17 }, | 1104 | { .name = "common", .irq = 17 }, |
| 1104 | { .name = "tx", .irq = 62 }, | 1105 | { .name = "tx", .irq = 62 }, |
| 1105 | { .name = "rx", .irq = 63 }, | 1106 | { .name = "rx", .irq = 63 }, |
| 1106 | { .irq = -1 } | 1107 | { .irq = -1 } |
| @@ -1130,7 +1131,7 @@ static struct omap_hwmod omap3xxx_mcbsp2_hwmod = { | |||
| 1130 | 1131 | ||
| 1131 | /* mcbsp3 */ | 1132 | /* mcbsp3 */ |
| 1132 | static struct omap_hwmod_irq_info omap3xxx_mcbsp3_irqs[] = { | 1133 | static struct omap_hwmod_irq_info omap3xxx_mcbsp3_irqs[] = { |
| 1133 | { .name = "irq", .irq = 22 }, | 1134 | { .name = "common", .irq = 22 }, |
| 1134 | { .name = "tx", .irq = 89 }, | 1135 | { .name = "tx", .irq = 89 }, |
| 1135 | { .name = "rx", .irq = 90 }, | 1136 | { .name = "rx", .irq = 90 }, |
| 1136 | { .irq = -1 } | 1137 | { .irq = -1 } |
| @@ -1160,7 +1161,7 @@ static struct omap_hwmod omap3xxx_mcbsp3_hwmod = { | |||
| 1160 | 1161 | ||
| 1161 | /* mcbsp4 */ | 1162 | /* mcbsp4 */ |
| 1162 | static struct omap_hwmod_irq_info omap3xxx_mcbsp4_irqs[] = { | 1163 | static struct omap_hwmod_irq_info omap3xxx_mcbsp4_irqs[] = { |
| 1163 | { .name = "irq", .irq = 23 }, | 1164 | { .name = "common", .irq = 23 }, |
| 1164 | { .name = "tx", .irq = 54 }, | 1165 | { .name = "tx", .irq = 54 }, |
| 1165 | { .name = "rx", .irq = 55 }, | 1166 | { .name = "rx", .irq = 55 }, |
| 1166 | { .irq = -1 } | 1167 | { .irq = -1 } |
| @@ -1191,7 +1192,7 @@ static struct omap_hwmod omap3xxx_mcbsp4_hwmod = { | |||
| 1191 | 1192 | ||
| 1192 | /* mcbsp5 */ | 1193 | /* mcbsp5 */ |
| 1193 | static struct omap_hwmod_irq_info omap3xxx_mcbsp5_irqs[] = { | 1194 | static struct omap_hwmod_irq_info omap3xxx_mcbsp5_irqs[] = { |
| 1194 | { .name = "irq", .irq = 27 }, | 1195 | { .name = "common", .irq = 27 }, |
| 1195 | { .name = "tx", .irq = 81 }, | 1196 | { .name = "tx", .irq = 81 }, |
| 1196 | { .name = "rx", .irq = 82 }, | 1197 | { .name = "rx", .irq = 82 }, |
| 1197 | { .irq = -1 } | 1198 | { .irq = -1 } |
| @@ -1980,6 +1981,56 @@ static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = { | |||
| 1980 | }, | 1981 | }, |
| 1981 | }; | 1982 | }; |
| 1982 | 1983 | ||
| 1984 | static struct omap_hwmod omap3xxx_hdq1w_hwmod = { | ||
| 1985 | .name = "hdq1w", | ||
| 1986 | .mpu_irqs = omap2_hdq1w_mpu_irqs, | ||
| 1987 | .main_clk = "hdq_fck", | ||
| 1988 | .prcm = { | ||
| 1989 | .omap2 = { | ||
| 1990 | .module_offs = CORE_MOD, | ||
| 1991 | .prcm_reg_id = 1, | ||
| 1992 | .module_bit = OMAP3430_EN_HDQ_SHIFT, | ||
| 1993 | .idlest_reg_id = 1, | ||
| 1994 | .idlest_idle_bit = OMAP3430_ST_HDQ_SHIFT, | ||
| 1995 | }, | ||
| 1996 | }, | ||
| 1997 | .class = &omap2_hdq1w_class, | ||
| 1998 | }; | ||
| 1999 | |||
| 2000 | /* | ||
| 2001 | * '32K sync counter' class | ||
| 2002 | * 32-bit ordinary counter, clocked by the falling edge of the 32 khz clock | ||
| 2003 | */ | ||
| 2004 | static struct omap_hwmod_class_sysconfig omap3xxx_counter_sysc = { | ||
| 2005 | .rev_offs = 0x0000, | ||
| 2006 | .sysc_offs = 0x0004, | ||
| 2007 | .sysc_flags = SYSC_HAS_SIDLEMODE, | ||
| 2008 | .idlemodes = (SIDLE_FORCE | SIDLE_NO), | ||
| 2009 | .sysc_fields = &omap_hwmod_sysc_type1, | ||
| 2010 | }; | ||
| 2011 | |||
| 2012 | static struct omap_hwmod_class omap3xxx_counter_hwmod_class = { | ||
| 2013 | .name = "counter", | ||
| 2014 | .sysc = &omap3xxx_counter_sysc, | ||
| 2015 | }; | ||
| 2016 | |||
| 2017 | static struct omap_hwmod omap3xxx_counter_32k_hwmod = { | ||
| 2018 | .name = "counter_32k", | ||
| 2019 | .class = &omap3xxx_counter_hwmod_class, | ||
| 2020 | .clkdm_name = "wkup_clkdm", | ||
| 2021 | .flags = HWMOD_SWSUP_SIDLE, | ||
| 2022 | .main_clk = "wkup_32k_fck", | ||
| 2023 | .prcm = { | ||
| 2024 | .omap2 = { | ||
| 2025 | .module_offs = WKUP_MOD, | ||
| 2026 | .prcm_reg_id = 1, | ||
| 2027 | .module_bit = OMAP3430_ST_32KSYNC_SHIFT, | ||
| 2028 | .idlest_reg_id = 1, | ||
| 2029 | .idlest_idle_bit = OMAP3430_ST_32KSYNC_SHIFT, | ||
| 2030 | }, | ||
| 2031 | }, | ||
| 2032 | }; | ||
| 2033 | |||
| 1983 | /* | 2034 | /* |
| 1984 | * interfaces | 2035 | * interfaces |
| 1985 | */ | 2036 | */ |
| @@ -3059,6 +3110,34 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_tll_hs = { | |||
| 3059 | .user = OCP_USER_MPU | OCP_USER_SDMA, | 3110 | .user = OCP_USER_MPU | OCP_USER_SDMA, |
| 3060 | }; | 3111 | }; |
| 3061 | 3112 | ||
| 3113 | /* l4_core -> hdq1w interface */ | ||
| 3114 | static struct omap_hwmod_ocp_if omap3xxx_l4_core__hdq1w = { | ||
| 3115 | .master = &omap3xxx_l4_core_hwmod, | ||
| 3116 | .slave = &omap3xxx_hdq1w_hwmod, | ||
| 3117 | .clk = "hdq_ick", | ||
| 3118 | .addr = omap2_hdq1w_addr_space, | ||
| 3119 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 3120 | .flags = OMAP_FIREWALL_L4 | OCPIF_SWSUP_IDLE, | ||
| 3121 | }; | ||
| 3122 | |||
| 3123 | /* l4_wkup -> 32ksync_counter */ | ||
| 3124 | static struct omap_hwmod_addr_space omap3xxx_counter_32k_addrs[] = { | ||
| 3125 | { | ||
| 3126 | .pa_start = 0x48320000, | ||
| 3127 | .pa_end = 0x4832001f, | ||
| 3128 | .flags = ADDR_TYPE_RT | ||
| 3129 | }, | ||
| 3130 | { } | ||
| 3131 | }; | ||
| 3132 | |||
| 3133 | static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__counter_32k = { | ||
| 3134 | .master = &omap3xxx_l4_wkup_hwmod, | ||
| 3135 | .slave = &omap3xxx_counter_32k_hwmod, | ||
| 3136 | .clk = "omap_32ksync_ick", | ||
| 3137 | .addr = omap3xxx_counter_32k_addrs, | ||
| 3138 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
| 3139 | }; | ||
| 3140 | |||
| 3062 | static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = { | 3141 | static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = { |
| 3063 | &omap3xxx_l3_main__l4_core, | 3142 | &omap3xxx_l3_main__l4_core, |
| 3064 | &omap3xxx_l3_main__l4_per, | 3143 | &omap3xxx_l3_main__l4_per, |
| @@ -3103,6 +3182,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = { | |||
| 3103 | &omap34xx_l4_core__mcspi2, | 3182 | &omap34xx_l4_core__mcspi2, |
| 3104 | &omap34xx_l4_core__mcspi3, | 3183 | &omap34xx_l4_core__mcspi3, |
| 3105 | &omap34xx_l4_core__mcspi4, | 3184 | &omap34xx_l4_core__mcspi4, |
| 3185 | &omap3xxx_l4_wkup__counter_32k, | ||
| 3106 | NULL, | 3186 | NULL, |
| 3107 | }; | 3187 | }; |
| 3108 | 3188 | ||
| @@ -3151,6 +3231,7 @@ static struct omap_hwmod_ocp_if *omap34xx_hwmod_ocp_ifs[] __initdata = { | |||
| 3151 | &omap34xx_l4_core__sr1, | 3231 | &omap34xx_l4_core__sr1, |
| 3152 | &omap34xx_l4_core__sr2, | 3232 | &omap34xx_l4_core__sr2, |
| 3153 | &omap3xxx_l4_core__mailbox, | 3233 | &omap3xxx_l4_core__mailbox, |
| 3234 | &omap3xxx_l4_core__hdq1w, | ||
| 3154 | NULL | 3235 | NULL |
| 3155 | }; | 3236 | }; |
| 3156 | 3237 | ||
| @@ -3170,6 +3251,7 @@ static struct omap_hwmod_ocp_if *omap36xx_hwmod_ocp_ifs[] __initdata = { | |||
| 3170 | &omap3xxx_l4_core__usb_tll_hs, | 3251 | &omap3xxx_l4_core__usb_tll_hs, |
| 3171 | &omap3xxx_l4_core__es3plus_mmc1, | 3252 | &omap3xxx_l4_core__es3plus_mmc1, |
| 3172 | &omap3xxx_l4_core__es3plus_mmc2, | 3253 | &omap3xxx_l4_core__es3plus_mmc2, |
| 3254 | &omap3xxx_l4_core__hdq1w, | ||
| 3173 | NULL | 3255 | NULL |
| 3174 | }; | 3256 | }; |
| 3175 | 3257 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 49061295475c..950454a3fa31 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
| @@ -1487,7 +1487,8 @@ static struct omap_hwmod_class omap44xx_i2c_hwmod_class = { | |||
| 1487 | }; | 1487 | }; |
| 1488 | 1488 | ||
| 1489 | static struct omap_i2c_dev_attr i2c_dev_attr = { | 1489 | static struct omap_i2c_dev_attr i2c_dev_attr = { |
| 1490 | .flags = OMAP_I2C_FLAG_BUS_SHIFT_NONE, | 1490 | .flags = OMAP_I2C_FLAG_BUS_SHIFT_NONE | |
| 1491 | OMAP_I2C_FLAG_RESET_REGS_POSTIDLE, | ||
| 1491 | }; | 1492 | }; |
| 1492 | 1493 | ||
| 1493 | /* i2c1 */ | 1494 | /* i2c1 */ |
| @@ -1911,7 +1912,7 @@ static struct omap_hwmod_class omap44xx_mcbsp_hwmod_class = { | |||
| 1911 | 1912 | ||
| 1912 | /* mcbsp1 */ | 1913 | /* mcbsp1 */ |
| 1913 | static struct omap_hwmod_irq_info omap44xx_mcbsp1_irqs[] = { | 1914 | static struct omap_hwmod_irq_info omap44xx_mcbsp1_irqs[] = { |
| 1914 | { .irq = 17 + OMAP44XX_IRQ_GIC_START }, | 1915 | { .name = "common", .irq = 17 + OMAP44XX_IRQ_GIC_START }, |
| 1915 | { .irq = -1 } | 1916 | { .irq = -1 } |
| 1916 | }; | 1917 | }; |
| 1917 | 1918 | ||
| @@ -1946,7 +1947,7 @@ static struct omap_hwmod omap44xx_mcbsp1_hwmod = { | |||
| 1946 | 1947 | ||
| 1947 | /* mcbsp2 */ | 1948 | /* mcbsp2 */ |
| 1948 | static struct omap_hwmod_irq_info omap44xx_mcbsp2_irqs[] = { | 1949 | static struct omap_hwmod_irq_info omap44xx_mcbsp2_irqs[] = { |
| 1949 | { .irq = 22 + OMAP44XX_IRQ_GIC_START }, | 1950 | { .name = "common", .irq = 22 + OMAP44XX_IRQ_GIC_START }, |
| 1950 | { .irq = -1 } | 1951 | { .irq = -1 } |
| 1951 | }; | 1952 | }; |
| 1952 | 1953 | ||
| @@ -1981,7 +1982,7 @@ static struct omap_hwmod omap44xx_mcbsp2_hwmod = { | |||
| 1981 | 1982 | ||
| 1982 | /* mcbsp3 */ | 1983 | /* mcbsp3 */ |
| 1983 | static struct omap_hwmod_irq_info omap44xx_mcbsp3_irqs[] = { | 1984 | static struct omap_hwmod_irq_info omap44xx_mcbsp3_irqs[] = { |
| 1984 | { .irq = 23 + OMAP44XX_IRQ_GIC_START }, | 1985 | { .name = "common", .irq = 23 + OMAP44XX_IRQ_GIC_START }, |
| 1985 | { .irq = -1 } | 1986 | { .irq = -1 } |
| 1986 | }; | 1987 | }; |
| 1987 | 1988 | ||
| @@ -2016,7 +2017,7 @@ static struct omap_hwmod omap44xx_mcbsp3_hwmod = { | |||
| 2016 | 2017 | ||
| 2017 | /* mcbsp4 */ | 2018 | /* mcbsp4 */ |
| 2018 | static struct omap_hwmod_irq_info omap44xx_mcbsp4_irqs[] = { | 2019 | static struct omap_hwmod_irq_info omap44xx_mcbsp4_irqs[] = { |
| 2019 | { .irq = 16 + OMAP44XX_IRQ_GIC_START }, | 2020 | { .name = "common", .irq = 16 + OMAP44XX_IRQ_GIC_START }, |
| 2020 | { .irq = -1 } | 2021 | { .irq = -1 } |
| 2021 | }; | 2022 | }; |
| 2022 | 2023 | ||
| @@ -3534,6 +3535,7 @@ static struct omap_hwmod_class omap44xx_wd_timer_hwmod_class = { | |||
| 3534 | .name = "wd_timer", | 3535 | .name = "wd_timer", |
| 3535 | .sysc = &omap44xx_wd_timer_sysc, | 3536 | .sysc = &omap44xx_wd_timer_sysc, |
| 3536 | .pre_shutdown = &omap2_wd_timer_disable, | 3537 | .pre_shutdown = &omap2_wd_timer_disable, |
| 3538 | .reset = &omap2_wd_timer_reset, | ||
| 3537 | }; | 3539 | }; |
| 3538 | 3540 | ||
| 3539 | /* wd_timer2 */ | 3541 | /* wd_timer2 */ |
diff --git a/arch/arm/mach-omap2/omap_hwmod_common_data.h b/arch/arm/mach-omap2/omap_hwmod_common_data.h index 7aa9156d50ab..e7e8eeae95e5 100644 --- a/arch/arm/mach-omap2/omap_hwmod_common_data.h +++ b/arch/arm/mach-omap2/omap_hwmod_common_data.h | |||
| @@ -38,6 +38,7 @@ extern struct omap_hwmod_addr_space omap2430_mcspi3_addr_space[]; | |||
| 38 | extern struct omap_hwmod_addr_space omap2_dma_system_addrs[]; | 38 | extern struct omap_hwmod_addr_space omap2_dma_system_addrs[]; |
| 39 | extern struct omap_hwmod_addr_space omap2_mailbox_addrs[]; | 39 | extern struct omap_hwmod_addr_space omap2_mailbox_addrs[]; |
| 40 | extern struct omap_hwmod_addr_space omap2_mcbsp1_addrs[]; | 40 | extern struct omap_hwmod_addr_space omap2_mcbsp1_addrs[]; |
| 41 | extern struct omap_hwmod_addr_space omap2_hdq1w_addr_space[]; | ||
| 41 | 42 | ||
| 42 | /* Common IP block data across OMAP2xxx */ | 43 | /* Common IP block data across OMAP2xxx */ |
| 43 | extern struct omap_hwmod_irq_info omap2xxx_timer12_mpu_irqs[]; | 44 | extern struct omap_hwmod_irq_info omap2xxx_timer12_mpu_irqs[]; |
| @@ -74,6 +75,7 @@ extern struct omap_hwmod omap2xxx_gpio3_hwmod; | |||
| 74 | extern struct omap_hwmod omap2xxx_gpio4_hwmod; | 75 | extern struct omap_hwmod omap2xxx_gpio4_hwmod; |
| 75 | extern struct omap_hwmod omap2xxx_mcspi1_hwmod; | 76 | extern struct omap_hwmod omap2xxx_mcspi1_hwmod; |
| 76 | extern struct omap_hwmod omap2xxx_mcspi2_hwmod; | 77 | extern struct omap_hwmod omap2xxx_mcspi2_hwmod; |
| 78 | extern struct omap_hwmod omap2xxx_counter_32k_hwmod; | ||
| 77 | 79 | ||
| 78 | /* Common interface data across OMAP2xxx */ | 80 | /* Common interface data across OMAP2xxx */ |
| 79 | extern struct omap_hwmod_ocp_if omap2xxx_l3_main__l4_core; | 81 | extern struct omap_hwmod_ocp_if omap2xxx_l3_main__l4_core; |
| @@ -141,6 +143,7 @@ extern struct omap_hwmod_irq_info omap2_dma_system_irqs[]; | |||
| 141 | extern struct omap_hwmod_irq_info omap2_mcspi1_mpu_irqs[]; | 143 | extern struct omap_hwmod_irq_info omap2_mcspi1_mpu_irqs[]; |
| 142 | extern struct omap_hwmod_irq_info omap2_mcspi2_mpu_irqs[]; | 144 | extern struct omap_hwmod_irq_info omap2_mcspi2_mpu_irqs[]; |
| 143 | extern struct omap_hwmod_addr_space omap2xxx_timer12_addrs[]; | 145 | extern struct omap_hwmod_addr_space omap2xxx_timer12_addrs[]; |
| 146 | extern struct omap_hwmod_irq_info omap2_hdq1w_mpu_irqs[]; | ||
| 144 | 147 | ||
| 145 | /* OMAP hwmod classes - forward declarations */ | 148 | /* OMAP hwmod classes - forward declarations */ |
| 146 | extern struct omap_hwmod_class l3_hwmod_class; | 149 | extern struct omap_hwmod_class l3_hwmod_class; |
| @@ -152,6 +155,8 @@ extern struct omap_hwmod_class omap2_dss_hwmod_class; | |||
| 152 | extern struct omap_hwmod_class omap2_dispc_hwmod_class; | 155 | extern struct omap_hwmod_class omap2_dispc_hwmod_class; |
| 153 | extern struct omap_hwmod_class omap2_rfbi_hwmod_class; | 156 | extern struct omap_hwmod_class omap2_rfbi_hwmod_class; |
| 154 | extern struct omap_hwmod_class omap2_venc_hwmod_class; | 157 | extern struct omap_hwmod_class omap2_venc_hwmod_class; |
| 158 | extern struct omap_hwmod_class_sysconfig omap2_hdq1w_sysc; | ||
| 159 | extern struct omap_hwmod_class omap2_hdq1w_class; | ||
| 155 | 160 | ||
| 156 | extern struct omap_hwmod_class omap2xxx_timer_hwmod_class; | 161 | extern struct omap_hwmod_class omap2xxx_timer_hwmod_class; |
| 157 | extern struct omap_hwmod_class omap2xxx_wd_timer_hwmod_class; | 162 | extern struct omap_hwmod_class omap2xxx_wd_timer_hwmod_class; |
diff --git a/arch/arm/mach-omap2/wd_timer.c b/arch/arm/mach-omap2/wd_timer.c index 4067669d96c4..b2f1c67043a2 100644 --- a/arch/arm/mach-omap2/wd_timer.c +++ b/arch/arm/mach-omap2/wd_timer.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <plat/omap_hwmod.h> | 14 | #include <plat/omap_hwmod.h> |
| 15 | 15 | ||
| 16 | #include "wd_timer.h" | 16 | #include "wd_timer.h" |
| 17 | #include "common.h" | ||
| 17 | 18 | ||
| 18 | /* | 19 | /* |
| 19 | * In order to avoid any assumptions from bootloader regarding WDT | 20 | * In order to avoid any assumptions from bootloader regarding WDT |
| @@ -25,6 +26,8 @@ | |||
| 25 | #define OMAP_WDT_WPS 0x34 | 26 | #define OMAP_WDT_WPS 0x34 |
| 26 | #define OMAP_WDT_SPR 0x48 | 27 | #define OMAP_WDT_SPR 0x48 |
| 27 | 28 | ||
| 29 | /* Maximum microseconds to wait for OMAP module to softreset */ | ||
| 30 | #define MAX_MODULE_SOFTRESET_WAIT 10000 | ||
| 28 | 31 | ||
| 29 | int omap2_wd_timer_disable(struct omap_hwmod *oh) | 32 | int omap2_wd_timer_disable(struct omap_hwmod *oh) |
| 30 | { | 33 | { |
| @@ -54,3 +57,45 @@ int omap2_wd_timer_disable(struct omap_hwmod *oh) | |||
| 54 | return 0; | 57 | return 0; |
| 55 | } | 58 | } |
| 56 | 59 | ||
| 60 | /** | ||
| 61 | * omap2_wdtimer_reset - reset and disable the WDTIMER IP block | ||
| 62 | * @oh: struct omap_hwmod * | ||
| 63 | * | ||
| 64 | * After the WDTIMER IP blocks are reset on OMAP2/3, we must also take | ||
| 65 | * care to execute the special watchdog disable sequence. This is | ||
| 66 | * because the watchdog is re-armed upon OCP softreset. (On OMAP4, | ||
| 67 | * this behavior was apparently changed and the watchdog is no longer | ||
| 68 | * re-armed after an OCP soft-reset.) Returns -ETIMEDOUT if the reset | ||
| 69 | * did not complete, or 0 upon success. | ||
| 70 | * | ||
| 71 | * XXX Most of this code should be moved to the omap_hwmod.c layer | ||
| 72 | * during a normal merge window. omap_hwmod_softreset() should be | ||
| 73 | * renamed to omap_hwmod_set_ocp_softreset(), and omap_hwmod_softreset() | ||
| 74 | * should call the hwmod _ocp_softreset() code. | ||
| 75 | */ | ||
| 76 | int omap2_wd_timer_reset(struct omap_hwmod *oh) | ||
| 77 | { | ||
| 78 | int c = 0; | ||
| 79 | |||
| 80 | /* Write to the SOFTRESET bit */ | ||
| 81 | omap_hwmod_softreset(oh); | ||
| 82 | |||
| 83 | /* Poll on RESETDONE bit */ | ||
| 84 | omap_test_timeout((omap_hwmod_read(oh, | ||
| 85 | oh->class->sysc->syss_offs) | ||
| 86 | & SYSS_RESETDONE_MASK), | ||
| 87 | MAX_MODULE_SOFTRESET_WAIT, c); | ||
| 88 | |||
| 89 | if (oh->class->sysc->srst_udelay) | ||
| 90 | udelay(oh->class->sysc->srst_udelay); | ||
| 91 | |||
| 92 | if (c == MAX_MODULE_SOFTRESET_WAIT) | ||
| 93 | pr_warning("%s: %s: softreset failed (waited %d usec)\n", | ||
| 94 | __func__, oh->name, MAX_MODULE_SOFTRESET_WAIT); | ||
| 95 | else | ||
| 96 | pr_debug("%s: %s: softreset in %d usec\n", __func__, | ||
| 97 | oh->name, c); | ||
| 98 | |||
| 99 | return (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT : | ||
| 100 | omap2_wd_timer_disable(oh); | ||
| 101 | } | ||
diff --git a/arch/arm/mach-omap2/wd_timer.h b/arch/arm/mach-omap2/wd_timer.h index e0054a2d5505..f6bbba73b535 100644 --- a/arch/arm/mach-omap2/wd_timer.h +++ b/arch/arm/mach-omap2/wd_timer.h | |||
| @@ -13,5 +13,6 @@ | |||
| 13 | #include <plat/omap_hwmod.h> | 13 | #include <plat/omap_hwmod.h> |
| 14 | 14 | ||
| 15 | extern int omap2_wd_timer_disable(struct omap_hwmod *oh); | 15 | extern int omap2_wd_timer_disable(struct omap_hwmod *oh); |
| 16 | extern int omap2_wd_timer_reset(struct omap_hwmod *oh); | ||
| 16 | 17 | ||
| 17 | #endif | 18 | #endif |
diff --git a/arch/arm/plat-omap/include/plat/hdq1w.h b/arch/arm/plat-omap/include/plat/hdq1w.h new file mode 100644 index 000000000000..0c1efc846d8d --- /dev/null +++ b/arch/arm/plat-omap/include/plat/hdq1w.h | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | /* | ||
| 2 | * Shared macros and function prototypes for the HDQ1W/1-wire IP block | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012 Texas Instruments, Inc. | ||
| 5 | * Paul Walmsley | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU General Public License | ||
| 9 | * version 2 as published by the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, but | ||
| 12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 14 | * General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| 19 | * 02110-1301 USA | ||
| 20 | */ | ||
| 21 | #ifndef ARCH_ARM_MACH_OMAP2_HDQ1W_H | ||
| 22 | #define ARCH_ARM_MACH_OMAP2_HDQ1W_H | ||
| 23 | |||
| 24 | #include <plat/omap_hwmod.h> | ||
| 25 | |||
| 26 | /* | ||
| 27 | * XXX A future cleanup patch should modify | ||
| 28 | * drivers/w1/masters/omap_hdq.c to use these macros | ||
| 29 | */ | ||
| 30 | #define HDQ_CTRL_STATUS_OFFSET 0x0c | ||
| 31 | #define HDQ_CTRL_STATUS_CLOCKENABLE_SHIFT 5 | ||
| 32 | |||
| 33 | |||
| 34 | extern int omap_hdq1w_reset(struct omap_hwmod *oh); | ||
| 35 | |||
| 36 | #endif | ||
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h index 7a38750c0079..3e7ae0f0215f 100644 --- a/arch/arm/plat-omap/include/plat/mmc.h +++ b/arch/arm/plat-omap/include/plat/mmc.h | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/mmc/host.h> | 16 | #include <linux/mmc/host.h> |
| 17 | 17 | ||
| 18 | #include <plat/board.h> | 18 | #include <plat/board.h> |
| 19 | #include <plat/omap_hwmod.h> | ||
| 19 | 20 | ||
| 20 | #define OMAP15XX_NR_MMC 1 | 21 | #define OMAP15XX_NR_MMC 1 |
| 21 | #define OMAP16XX_NR_MMC 2 | 22 | #define OMAP16XX_NR_MMC 2 |
| @@ -195,4 +196,7 @@ static inline int omap_mmc_add(const char *name, int id, unsigned long base, | |||
| 195 | } | 196 | } |
| 196 | 197 | ||
| 197 | #endif | 198 | #endif |
| 199 | |||
| 200 | extern int omap_msdi_reset(struct omap_hwmod *oh); | ||
| 201 | |||
| 198 | #endif | 202 | #endif |
