提交 812655e9 编写于 作者: O Olof Johansson

Merge tag 'omap-cleanup-for-v3.5' of...

Merge tag 'omap-cleanup-for-v3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/cleanup2

Clean up to make it easier to add support for new SoCs.

Note that these have a merge dependency to omap-devel-hwmod-for-v3.5
branch for the Makefile changes.

By Paul Walmsley (37) and others
via Tony Lindgren
* tag 'omap-cleanup-for-v3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: (55 commits)
  GPMC: add ECC control definitions
  ARM: OMAP2+: dmtimer: remove redundant sysconfig context restore
  ARM: OMAP: AM35xx: convert 3517 detection/flags to AM35xx
  ARM: OMAP: AM35xx: remove redunant cpu_is checks for AM3505
  ARM: OMAP2+: dma: Define dma capabilities register bitfields and use them.
  ARM: OMAP4: Reduce the static IO mapping
  ARM: All OMAP2PLUS machines use omap2 directory so just add one entry
  ARM: OMAP: dma: Make use of cpu_class_is_omap2() to avoid future patching.
  ARM: OMAP4: Remove un-used WakeupGen register defines.
  ARM: OMAP2+: Clean up wrapping multiple objects in Makefile
  ARM: OMAP4: Don't compile cm2xxx_3xxx.c for OMAP4 only builds.
  ARM: OMAP4: hwmod data: add DEBUGSS skeleton
  ARM: OMAP4: hwmod data: add PRCM and related IP blocks
  ARM: OMAP4: hwmod data: add System Control Module
  ARM: OMAP4: hwmod data: add the OCP-WP IP block
  ARM: OMAP4: hwmod data: add OCM RAM IP block
  ARM: OMAP4: hwmod data: add remaining USB-related IP blocks
  ARM: OMAP4: hwmod data: add some interconnect-related IP blocks
  ARM: OMAP4: hwmod data: add McASP
  ARM: OMAP4: hwmod data: add the Slimbus IP blocks
  ...
...@@ -164,9 +164,7 @@ machine-$(CONFIG_ARCH_MXS) := mxs ...@@ -164,9 +164,7 @@ machine-$(CONFIG_ARCH_MXS) := mxs
machine-$(CONFIG_ARCH_NETX) := netx machine-$(CONFIG_ARCH_NETX) := netx
machine-$(CONFIG_ARCH_NOMADIK) := nomadik machine-$(CONFIG_ARCH_NOMADIK) := nomadik
machine-$(CONFIG_ARCH_OMAP1) := omap1 machine-$(CONFIG_ARCH_OMAP1) := omap1
machine-$(CONFIG_ARCH_OMAP2) := omap2 machine-$(CONFIG_ARCH_OMAP2PLUS) := omap2
machine-$(CONFIG_ARCH_OMAP3) := omap2
machine-$(CONFIG_ARCH_OMAP4) := omap2
machine-$(CONFIG_ARCH_ORION5X) := orion5x machine-$(CONFIG_ARCH_ORION5X) := orion5x
machine-$(CONFIG_ARCH_PICOXCELL) := picoxcell machine-$(CONFIG_ARCH_PICOXCELL) := picoxcell
machine-$(CONFIG_ARCH_PNX4008) := pnx4008 machine-$(CONFIG_ARCH_PNX4008) := pnx4008
......
...@@ -24,10 +24,11 @@ endif ...@@ -24,10 +24,11 @@ endif
obj-$(CONFIG_TWL4030_CORE) += omap_twl.o obj-$(CONFIG_TWL4030_CORE) += omap_twl.o
# SMP support ONLY available for OMAP4 # SMP support ONLY available for OMAP4
obj-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o obj-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o
obj-$(CONFIG_HOTPLUG_CPU) += omap-hotplug.o obj-$(CONFIG_HOTPLUG_CPU) += omap-hotplug.o
obj-$(CONFIG_ARCH_OMAP4) += omap4-common.o omap-wakeupgen.o \ obj-$(CONFIG_ARCH_OMAP4) += omap4-common.o omap-wakeupgen.o
sleep44xx.o obj-$(CONFIG_ARCH_OMAP4) += sleep44xx.o
plus_sec := $(call as-instr,.arch_extension sec,+sec) plus_sec := $(call as-instr,.arch_extension sec,+sec)
AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec) AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec)
...@@ -64,10 +65,10 @@ endif ...@@ -64,10 +65,10 @@ endif
ifeq ($(CONFIG_PM),y) ifeq ($(CONFIG_PM),y)
obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o
obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o
obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o \ obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o
cpuidle34xx.o obj-$(CONFIG_ARCH_OMAP3) += cpuidle34xx.o
obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o omap-mpuss-lowpower.o \ obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o omap-mpuss-lowpower.o
cpuidle44xx.o obj-$(CONFIG_ARCH_OMAP4) += cpuidle44xx.o
obj-$(CONFIG_PM_DEBUG) += pm-debug.o obj-$(CONFIG_PM_DEBUG) += pm-debug.o
obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o
obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o
...@@ -84,88 +85,86 @@ endif ...@@ -84,88 +85,86 @@ endif
# PRCM # PRCM
obj-y += prm_common.o obj-y += prm_common.o
obj-$(CONFIG_ARCH_OMAP2) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o obj-$(CONFIG_ARCH_OMAP2) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o
obj-$(CONFIG_ARCH_OMAP3) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o \ obj-$(CONFIG_ARCH_OMAP3) += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o
vc3xxx_data.o vp3xxx_data.o obj-$(CONFIG_ARCH_OMAP3) += vc3xxx_data.o vp3xxx_data.o
# XXX The presence of cm2xxx_3xxx.o on the line below is temporary and obj-$(CONFIG_ARCH_OMAP4) += prcm.o cminst44xx.o cm44xx.o
# will be removed once the OMAP4 part of the codebase is converted to obj-$(CONFIG_ARCH_OMAP4) += prcm_mpu44xx.o prminst44xx.o
# use OMAP4-specific PRCM functions. obj-$(CONFIG_ARCH_OMAP4) += vc44xx_data.o vp44xx_data.o prm44xx.o
obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm2xxx_3xxx.o cminst44xx.o \
cm44xx.o prcm_mpu44xx.o \
prminst44xx.o vc44xx_data.o \
vp44xx_data.o prm44xx.o
# OMAP voltage domains # OMAP voltage domains
voltagedomain-common := voltage.o vc.o vp.o voltagedomain-common := voltage.o vc.o vp.o
obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common) \ obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common)
voltagedomains2xxx_data.o obj-$(CONFIG_ARCH_OMAP2) += voltagedomains2xxx_data.o
obj-$(CONFIG_ARCH_OMAP3) += $(voltagedomain-common) \ obj-$(CONFIG_ARCH_OMAP3) += $(voltagedomain-common)
voltagedomains3xxx_data.o obj-$(CONFIG_ARCH_OMAP3) += voltagedomains3xxx_data.o
obj-$(CONFIG_ARCH_OMAP4) += $(voltagedomain-common) \ obj-$(CONFIG_ARCH_OMAP4) += $(voltagedomain-common)
voltagedomains44xx_data.o obj-$(CONFIG_ARCH_OMAP4) += voltagedomains44xx_data.o
# OMAP powerdomain framework # OMAP powerdomain framework
powerdomain-common += powerdomain.o powerdomain-common.o powerdomain-common += powerdomain.o powerdomain-common.o
obj-$(CONFIG_ARCH_OMAP2) += $(powerdomain-common) \ obj-$(CONFIG_ARCH_OMAP2) += $(powerdomain-common)
powerdomain2xxx_3xxx.o \ obj-$(CONFIG_ARCH_OMAP2) += powerdomains2xxx_data.o
powerdomains2xxx_data.o \ obj-$(CONFIG_ARCH_OMAP2) += powerdomain2xxx_3xxx.o
powerdomains2xxx_3xxx_data.o obj-$(CONFIG_ARCH_OMAP2) += powerdomains2xxx_3xxx_data.o
obj-$(CONFIG_ARCH_OMAP3) += $(powerdomain-common) \ obj-$(CONFIG_ARCH_OMAP3) += $(powerdomain-common)
powerdomain2xxx_3xxx.o \ obj-$(CONFIG_ARCH_OMAP3) += powerdomain2xxx_3xxx.o
powerdomains3xxx_data.o \ obj-$(CONFIG_ARCH_OMAP3) += powerdomains3xxx_data.o
powerdomains2xxx_3xxx_data.o obj-$(CONFIG_ARCH_OMAP3) += powerdomains2xxx_3xxx_data.o
obj-$(CONFIG_ARCH_OMAP4) += $(powerdomain-common) \ obj-$(CONFIG_ARCH_OMAP4) += $(powerdomain-common)
powerdomain44xx.o \ obj-$(CONFIG_ARCH_OMAP4) += powerdomain44xx.o
powerdomains44xx_data.o obj-$(CONFIG_ARCH_OMAP4) += powerdomains44xx_data.o
# PRCM clockdomain control # PRCM clockdomain control
obj-$(CONFIG_ARCH_OMAP2) += clockdomain.o \ clockdomain-common += clockdomain.o
clockdomain2xxx_3xxx.o \ clockdomain-common += clockdomains_common_data.o
clockdomains2xxx_3xxx_data.o obj-$(CONFIG_ARCH_OMAP2) += $(clockdomain-common)
obj-$(CONFIG_ARCH_OMAP2) += clockdomain2xxx_3xxx.o
obj-$(CONFIG_ARCH_OMAP2) += clockdomains2xxx_3xxx_data.o
obj-$(CONFIG_SOC_OMAP2420) += clockdomains2420_data.o obj-$(CONFIG_SOC_OMAP2420) += clockdomains2420_data.o
obj-$(CONFIG_SOC_OMAP2430) += clockdomains2430_data.o obj-$(CONFIG_SOC_OMAP2430) += clockdomains2430_data.o
obj-$(CONFIG_ARCH_OMAP3) += clockdomain.o \ obj-$(CONFIG_ARCH_OMAP3) += $(clockdomain-common)
clockdomain2xxx_3xxx.o \ obj-$(CONFIG_ARCH_OMAP3) += clockdomain2xxx_3xxx.o
clockdomains2xxx_3xxx_data.o \ obj-$(CONFIG_ARCH_OMAP3) += clockdomains2xxx_3xxx_data.o
clockdomains3xxx_data.o obj-$(CONFIG_ARCH_OMAP3) += clockdomains3xxx_data.o
obj-$(CONFIG_ARCH_OMAP4) += clockdomain.o \ obj-$(CONFIG_ARCH_OMAP4) += $(clockdomain-common)
clockdomain44xx.o \ obj-$(CONFIG_ARCH_OMAP4) += clockdomain44xx.o
clockdomains44xx_data.o obj-$(CONFIG_ARCH_OMAP4) += clockdomains44xx_data.o
# Clock framework # Clock framework
obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o \ obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o
clkt2xxx_sys.o \ obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_sys.o
clkt2xxx_dpllcore.o \ obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_dpllcore.o
clkt2xxx_virt_prcm_set.o \ obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_virt_prcm_set.o
clkt2xxx_apll.o clkt2xxx_osc.o \ obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_apll.o clkt2xxx_osc.o
clkt2xxx_dpll.o clkt_iclk.o obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_dpll.o clkt_iclk.o
obj-$(CONFIG_SOC_OMAP2420) += clock2420_data.o obj-$(CONFIG_SOC_OMAP2420) += clock2420_data.o
obj-$(CONFIG_SOC_OMAP2430) += clock2430.o clock2430_data.o obj-$(CONFIG_SOC_OMAP2430) += clock2430.o clock2430_data.o
obj-$(CONFIG_ARCH_OMAP3) += $(clock-common) clock3xxx.o \ obj-$(CONFIG_ARCH_OMAP3) += $(clock-common) clock3xxx.o
clock34xx.o clkt34xx_dpll3m2.o \ obj-$(CONFIG_ARCH_OMAP3) += clock34xx.o clkt34xx_dpll3m2.o
clock3517.o clock36xx.o \ obj-$(CONFIG_ARCH_OMAP3) += clock3517.o clock36xx.o
dpll3xxx.o clock3xxx_data.o \ obj-$(CONFIG_ARCH_OMAP3) += dpll3xxx.o clock3xxx_data.o
clkt_iclk.o obj-$(CONFIG_ARCH_OMAP3) += clkt_iclk.o
obj-$(CONFIG_ARCH_OMAP4) += $(clock-common) clock44xx_data.o \ obj-$(CONFIG_ARCH_OMAP4) += $(clock-common) clock44xx_data.o
dpll3xxx.o dpll44xx.o obj-$(CONFIG_ARCH_OMAP4) += dpll3xxx.o dpll44xx.o
# OMAP2 clock rate set data (old "OPP" data) # OMAP2 clock rate set data (old "OPP" data)
obj-$(CONFIG_SOC_OMAP2420) += opp2420_data.o obj-$(CONFIG_SOC_OMAP2420) += opp2420_data.o
obj-$(CONFIG_SOC_OMAP2430) += opp2430_data.o obj-$(CONFIG_SOC_OMAP2430) += opp2430_data.o
# hwmod data # hwmod data
obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_ipblock_data.o \ obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_ipblock_data.o
omap_hwmod_2xxx_3xxx_ipblock_data.o \ obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_3xxx_ipblock_data.o
omap_hwmod_2xxx_interconnect_data.o \ obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_interconnect_data.o
omap_hwmod_2xxx_3xxx_interconnect_data.o \ obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_3xxx_interconnect_data.o
omap_hwmod_2420_data.o obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2420_data.o
obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2xxx_ipblock_data.o \ obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2xxx_ipblock_data.o
omap_hwmod_2xxx_3xxx_ipblock_data.o \ obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2xxx_3xxx_ipblock_data.o
omap_hwmod_2xxx_interconnect_data.o \ obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2xxx_interconnect_data.o
omap_hwmod_2xxx_3xxx_interconnect_data.o \ obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2xxx_3xxx_interconnect_data.o
omap_hwmod_2430_data.o obj-$(CONFIG_SOC_OMAP2430) += omap_hwmod_2430_data.o
obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_2xxx_3xxx_ipblock_data.o \ obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_2xxx_3xxx_ipblock_data.o
omap_hwmod_2xxx_3xxx_interconnect_data.o \ obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_2xxx_3xxx_interconnect_data.o
omap_hwmod_3xxx_data.o obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_3xxx_data.o
obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o
# EMU peripherals # EMU peripherals
...@@ -203,23 +202,19 @@ obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o ...@@ -203,23 +202,19 @@ obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o
obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o
obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o
obj-$(CONFIG_MACH_NOKIA_N8X0) += board-n8x0.o obj-$(CONFIG_MACH_NOKIA_N8X0) += board-n8x0.o
obj-$(CONFIG_MACH_NOKIA_RM680) += board-rm680.o \ obj-$(CONFIG_MACH_NOKIA_RM680) += board-rm680.o sdram-nokia.o
sdram-nokia.o obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o sdram-nokia.o
obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o \ obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51-peripherals.o
sdram-nokia.o \ obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51-video.o
board-rx51-peripherals.o \ obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom.o board-zoom-peripherals.o
board-rx51-video.o obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom-display.o
obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom.o \ obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom-debugboard.o
board-zoom-peripherals.o \ obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom.o board-zoom-peripherals.o
board-zoom-display.o \ obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom-display.o
board-zoom-debugboard.o obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom-debugboard.o
obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom.o \ obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o
board-zoom-peripherals.o \ obj-$(CONFIG_MACH_OMAP_3630SDP) += board-zoom-peripherals.o
board-zoom-display.o \ obj-$(CONFIG_MACH_OMAP_3630SDP) += board-zoom-display.o
board-zoom-debugboard.o
obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o \
board-zoom-peripherals.o \
board-zoom-display.o
obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o
obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o
obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o
......
...@@ -51,6 +51,9 @@ static int omap4_clkdm_clear_all_wkup_sleep_deps(struct clockdomain *clkdm) ...@@ -51,6 +51,9 @@ static int omap4_clkdm_clear_all_wkup_sleep_deps(struct clockdomain *clkdm)
struct clkdm_dep *cd; struct clkdm_dep *cd;
u32 mask = 0; u32 mask = 0;
if (!clkdm->prcm_partition)
return 0;
for (cd = clkdm->wkdep_srcs; cd && cd->clkdm_name; cd++) { for (cd = clkdm->wkdep_srcs; cd && cd->clkdm_name; cd++) {
if (!cd->clkdm) if (!cd->clkdm)
continue; /* only happens if data is erroneous */ continue; /* only happens if data is erroneous */
...@@ -103,6 +106,9 @@ static int omap4_clkdm_clk_disable(struct clockdomain *clkdm) ...@@ -103,6 +106,9 @@ static int omap4_clkdm_clk_disable(struct clockdomain *clkdm)
{ {
bool hwsup = false; bool hwsup = false;
if (!clkdm->prcm_partition)
return 0;
hwsup = omap4_cminst_is_clkdm_in_hwsup(clkdm->prcm_partition, hwsup = omap4_cminst_is_clkdm_in_hwsup(clkdm->prcm_partition,
clkdm->cm_inst, clkdm->clkdm_offs); clkdm->cm_inst, clkdm->clkdm_offs);
......
...@@ -89,13 +89,3 @@ struct clockdomain wkup_common_clkdm = { ...@@ -89,13 +89,3 @@ struct clockdomain wkup_common_clkdm = {
.pwrdm = { .name = "wkup_pwrdm" }, .pwrdm = { .name = "wkup_pwrdm" },
.dep_bit = OMAP_EN_WKUP_SHIFT, .dep_bit = OMAP_EN_WKUP_SHIFT,
}; };
struct clockdomain prm_common_clkdm = {
.name = "prm_clkdm",
.pwrdm = { .name = "wkup_pwrdm" },
};
struct clockdomain cm_common_clkdm = {
.name = "cm_clkdm",
.pwrdm = { .name = "core_pwrdm" },
};
...@@ -430,6 +430,8 @@ static struct clockdomain *clockdomains_omap44xx[] __initdata = { ...@@ -430,6 +430,8 @@ static struct clockdomain *clockdomains_omap44xx[] __initdata = {
&l4_wkup_44xx_clkdm, &l4_wkup_44xx_clkdm,
&emu_sys_44xx_clkdm, &emu_sys_44xx_clkdm,
&l3_dma_44xx_clkdm, &l3_dma_44xx_clkdm,
&prm_common_clkdm,
&cm_common_clkdm,
NULL NULL
}; };
......
/*
* OMAP2+-common clockdomain data
*
* Copyright (C) 2008-2012 Texas Instruments, Inc.
* Copyright (C) 2008-2010 Nokia Corporation
*
* Paul Walmsley, Jouni Högander
*/
#include <linux/kernel.h>
#include <linux/io.h>
#include "clockdomain.h"
/* These are implicit clockdomains - they are never defined as such in TRM */
struct clockdomain prm_common_clkdm = {
.name = "prm_clkdm",
.pwrdm = { .name = "wkup_pwrdm" },
};
struct clockdomain cm_common_clkdm = {
.name = "cm_clkdm",
.pwrdm = { .name = "core_pwrdm" },
};
...@@ -227,10 +227,6 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused) ...@@ -227,10 +227,6 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused)
dma_stride = OMAP2_DMA_STRIDE; dma_stride = OMAP2_DMA_STRIDE;
dma_common_ch_start = CSDP; dma_common_ch_start = CSDP;
if (cpu_is_omap3630() || cpu_is_omap44xx())
dma_common_ch_end = CCDN;
else
dma_common_ch_end = CCFN;
p = kzalloc(sizeof(struct omap_system_dma_plat_info), GFP_KERNEL); p = kzalloc(sizeof(struct omap_system_dma_plat_info), GFP_KERNEL);
if (!p) { if (!p) {
...@@ -277,6 +273,13 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused) ...@@ -277,6 +273,13 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused)
dev_err(&pdev->dev, "%s: kzalloc fail\n", __func__); dev_err(&pdev->dev, "%s: kzalloc fail\n", __func__);
return -ENOMEM; return -ENOMEM;
} }
/* Check the capabilities register for descriptor loading feature */
if (dma_read(CAPS_0, 0) & DMA_HAS_DESCRIPTOR_CAPS)
dma_common_ch_end = CCDN;
else
dma_common_ch_end = CCFN;
return 0; return 0;
} }
......
...@@ -50,6 +50,19 @@ ...@@ -50,6 +50,19 @@
#define GPMC_ECC_SIZE_CONFIG 0x1fc #define GPMC_ECC_SIZE_CONFIG 0x1fc
#define GPMC_ECC1_RESULT 0x200 #define GPMC_ECC1_RESULT 0x200
/* GPMC ECC control settings */
#define GPMC_ECC_CTRL_ECCCLEAR 0x100
#define GPMC_ECC_CTRL_ECCDISABLE 0x000
#define GPMC_ECC_CTRL_ECCREG1 0x001
#define GPMC_ECC_CTRL_ECCREG2 0x002
#define GPMC_ECC_CTRL_ECCREG3 0x003
#define GPMC_ECC_CTRL_ECCREG4 0x004
#define GPMC_ECC_CTRL_ECCREG5 0x005
#define GPMC_ECC_CTRL_ECCREG6 0x006
#define GPMC_ECC_CTRL_ECCREG7 0x007
#define GPMC_ECC_CTRL_ECCREG8 0x008
#define GPMC_ECC_CTRL_ECCREG9 0x009
#define GPMC_CS0_OFFSET 0x60 #define GPMC_CS0_OFFSET 0x60
#define GPMC_CS_SIZE 0x30 #define GPMC_CS_SIZE 0x30
...@@ -861,8 +874,9 @@ int gpmc_enable_hwecc(int cs, int mode, int dev_width, int ecc_size) ...@@ -861,8 +874,9 @@ int gpmc_enable_hwecc(int cs, int mode, int dev_width, int ecc_size)
gpmc_ecc_used = cs; gpmc_ecc_used = cs;
/* clear ecc and enable bits */ /* clear ecc and enable bits */
val = ((0x00000001<<8) | 0x00000001); gpmc_write_reg(GPMC_ECC_CONTROL,
gpmc_write_reg(GPMC_ECC_CONTROL, val); GPMC_ECC_CTRL_ECCCLEAR |
GPMC_ECC_CTRL_ECCREG1);
/* program ecc and result sizes */ /* program ecc and result sizes */
val = ((((ecc_size >> 1) - 1) << 22) | (0x0000000F)); val = ((((ecc_size >> 1) - 1) << 22) | (0x0000000F));
...@@ -870,13 +884,15 @@ int gpmc_enable_hwecc(int cs, int mode, int dev_width, int ecc_size) ...@@ -870,13 +884,15 @@ int gpmc_enable_hwecc(int cs, int mode, int dev_width, int ecc_size)
switch (mode) { switch (mode) {
case GPMC_ECC_READ: case GPMC_ECC_READ:
gpmc_write_reg(GPMC_ECC_CONTROL, 0x101); case GPMC_ECC_WRITE:
gpmc_write_reg(GPMC_ECC_CONTROL,
GPMC_ECC_CTRL_ECCCLEAR |
GPMC_ECC_CTRL_ECCREG1);
break; break;
case GPMC_ECC_READSYN: case GPMC_ECC_READSYN:
gpmc_write_reg(GPMC_ECC_CONTROL, 0x100); gpmc_write_reg(GPMC_ECC_CONTROL,
break; GPMC_ECC_CTRL_ECCCLEAR |
case GPMC_ECC_WRITE: GPMC_ECC_CTRL_ECCDISABLE);
gpmc_write_reg(GPMC_ECC_CONTROL, 0x101);
break; break;
default: default:
printk(KERN_INFO "Error: Unrecognized Mode[%d]!\n", mode); printk(KERN_INFO "Error: Unrecognized Mode[%d]!\n", mode);
......
...@@ -355,7 +355,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, ...@@ -355,7 +355,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
* *
* temporary HACK: ocr_mask instead of fixed supply * temporary HACK: ocr_mask instead of fixed supply
*/ */
if (cpu_is_omap3505() || cpu_is_omap3517()) if (soc_is_am35xx())
mmc->slots[0].ocr_mask = MMC_VDD_165_195 | mmc->slots[0].ocr_mask = MMC_VDD_165_195 |
MMC_VDD_26_27 | MMC_VDD_26_27 |
MMC_VDD_27_28 | MMC_VDD_27_28 |
...@@ -365,7 +365,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, ...@@ -365,7 +365,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
else else
mmc->slots[0].ocr_mask = c->ocr_mask; mmc->slots[0].ocr_mask = c->ocr_mask;
if (!cpu_is_omap3517() && !cpu_is_omap3505()) if (!soc_is_am35xx())
mmc->slots[0].features |= HSMMC_HAS_PBIAS; mmc->slots[0].features |= HSMMC_HAS_PBIAS;
if (cpu_is_omap44xx() && (omap_rev() > OMAP4430_REV_ES1_0)) if (cpu_is_omap44xx() && (omap_rev() > OMAP4430_REV_ES1_0))
...@@ -388,7 +388,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, ...@@ -388,7 +388,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
} }
} }
if (cpu_is_omap3517() || cpu_is_omap3505()) if (soc_is_am35xx())
mmc->slots[0].set_power = nop_mmc_set_power; mmc->slots[0].set_power = nop_mmc_set_power;
/* OMAP3630 HSMMC1 supports only 4-bit */ /* OMAP3630 HSMMC1 supports only 4-bit */
...@@ -400,7 +400,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, ...@@ -400,7 +400,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
} }
break; break;
case 2: case 2:
if (cpu_is_omap3517() || cpu_is_omap3505()) if (soc_is_am35xx())
mmc->slots[0].set_power = am35x_hsmmc2_set_power; mmc->slots[0].set_power = am35x_hsmmc2_set_power;
if (c->ext_clock) if (c->ext_clock)
......
...@@ -185,8 +185,7 @@ static void __init omap3_cpuinfo(void) ...@@ -185,8 +185,7 @@ static void __init omap3_cpuinfo(void)
*/ */
if (cpu_is_omap3630()) { if (cpu_is_omap3630()) {
cpu_name = "OMAP3630"; cpu_name = "OMAP3630";
} else if (cpu_is_omap3517()) { } else if (soc_is_am35xx()) {
/* AM35xx devices */
cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505"; cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505";
} else if (cpu_is_ti816x()) { } else if (cpu_is_ti816x()) {
cpu_name = "TI816X"; cpu_name = "TI816X";
...@@ -352,13 +351,13 @@ void __init omap3xxx_check_revision(void) ...@@ -352,13 +351,13 @@ void __init omap3xxx_check_revision(void)
*/ */
switch (rev) { switch (rev) {
case 0: case 0:
omap_revision = OMAP3517_REV_ES1_0; omap_revision = AM35XX_REV_ES1_0;
cpu_rev = "1.0"; cpu_rev = "1.0";
break; break;
case 1: case 1:
/* FALLTHROUGH */ /* FALLTHROUGH */
default: default:
omap_revision = OMAP3517_REV_ES1_1; omap_revision = AM35XX_REV_ES1_1;
cpu_rev = "1.1"; cpu_rev = "1.1";
} }
break; break;
......
...@@ -16,18 +16,10 @@ ...@@ -16,18 +16,10 @@
#define OMAP_WKG_ENB_B_0 0x14 #define OMAP_WKG_ENB_B_0 0x14
#define OMAP_WKG_ENB_C_0 0x18 #define OMAP_WKG_ENB_C_0 0x18
#define OMAP_WKG_ENB_D_0 0x1c #define OMAP_WKG_ENB_D_0 0x1c
#define OMAP_WKG_ENB_SECURE_A_0 0x20
#define OMAP_WKG_ENB_SECURE_B_0 0x24
#define OMAP_WKG_ENB_SECURE_C_0 0x28
#define OMAP_WKG_ENB_SECURE_D_0 0x2c
#define OMAP_WKG_ENB_A_1 0x410 #define OMAP_WKG_ENB_A_1 0x410
#define OMAP_WKG_ENB_B_1 0x414 #define OMAP_WKG_ENB_B_1 0x414
#define OMAP_WKG_ENB_C_1 0x418 #define OMAP_WKG_ENB_C_1 0x418
#define OMAP_WKG_ENB_D_1 0x41c #define OMAP_WKG_ENB_D_1 0x41c
#define OMAP_WKG_ENB_SECURE_A_1 0x420
#define OMAP_WKG_ENB_SECURE_B_1 0x424
#define OMAP_WKG_ENB_SECURE_C_1 0x428
#define OMAP_WKG_ENB_SECURE_D_1 0x42c
#define OMAP_AUX_CORE_BOOT_0 0x800 #define OMAP_AUX_CORE_BOOT_0 0x800
#define OMAP_AUX_CORE_BOOT_1 0x804 #define OMAP_AUX_CORE_BOOT_1 0x804
#define OMAP_PTMSYNCREQ_MASK 0xc00 #define OMAP_PTMSYNCREQ_MASK 0xc00
......
...@@ -214,42 +214,12 @@ static struct map_desc omap44xx_io_desc[] __initdata = { ...@@ -214,42 +214,12 @@ static struct map_desc omap44xx_io_desc[] __initdata = {
.length = L4_44XX_SIZE, .length = L4_44XX_SIZE,
.type = MT_DEVICE, .type = MT_DEVICE,
}, },
{
.virtual = OMAP44XX_GPMC_VIRT,
.pfn = __phys_to_pfn(OMAP44XX_GPMC_PHYS),
.length = OMAP44XX_GPMC_SIZE,
.type = MT_DEVICE,
},
{
.virtual = OMAP44XX_EMIF1_VIRT,
.pfn = __phys_to_pfn(OMAP44XX_EMIF1_PHYS),
.length = OMAP44XX_EMIF1_SIZE,
.type = MT_DEVICE,
},
{
.virtual = OMAP44XX_EMIF2_VIRT,
.pfn = __phys_to_pfn(OMAP44XX_EMIF2_PHYS),
.length = OMAP44XX_EMIF2_SIZE,
.type = MT_DEVICE,
},
{
.virtual = OMAP44XX_DMM_VIRT,
.pfn = __phys_to_pfn(OMAP44XX_DMM_PHYS),
.length = OMAP44XX_DMM_SIZE,
.type = MT_DEVICE,
},
{ {
.virtual = L4_PER_44XX_VIRT, .virtual = L4_PER_44XX_VIRT,
.pfn = __phys_to_pfn(L4_PER_44XX_PHYS), .pfn = __phys_to_pfn(L4_PER_44XX_PHYS),
.length = L4_PER_44XX_SIZE, .length = L4_PER_44XX_SIZE,
.type = MT_DEVICE, .type = MT_DEVICE,
}, },
{
.virtual = L4_EMU_44XX_VIRT,
.pfn = __phys_to_pfn(L4_EMU_44XX_PHYS),
.length = L4_EMU_44XX_SIZE,
.type = MT_DEVICE,
},
#ifdef CONFIG_OMAP4_ERRATA_I688 #ifdef CONFIG_OMAP4_ERRATA_I688
{ {
.virtual = OMAP4_SRAM_VA, .virtual = OMAP4_SRAM_VA,
......
...@@ -37,9 +37,6 @@ ...@@ -37,9 +37,6 @@
#define OMAP4_L3_PER_IO_OFFSET 0xb1100000 #define OMAP4_L3_PER_IO_OFFSET 0xb1100000
#define OMAP4_L3_PER_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_L3_PER_IO_OFFSET) #define OMAP4_L3_PER_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_L3_PER_IO_OFFSET)
#define OMAP4_GPMC_IO_OFFSET 0xa9000000
#define OMAP4_GPMC_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_GPMC_IO_OFFSET)
#define OMAP2_EMU_IO_OFFSET 0xaa800000 /* Emulation */ #define OMAP2_EMU_IO_OFFSET 0xaa800000 /* Emulation */
#define OMAP2_EMU_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_EMU_IO_OFFSET) #define OMAP2_EMU_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_EMU_IO_OFFSET)
...@@ -170,28 +167,3 @@ ...@@ -170,28 +167,3 @@
#define L4_ABE_44XX_VIRT (L4_ABE_44XX_PHYS + OMAP2_L4_IO_OFFSET) #define L4_ABE_44XX_VIRT (L4_ABE_44XX_PHYS + OMAP2_L4_IO_OFFSET)
#define L4_ABE_44XX_SIZE SZ_1M #define L4_ABE_44XX_SIZE SZ_1M
#define L4_EMU_44XX_PHYS L4_EMU_44XX_BASE
/* 0x54000000 --> 0xfe800000 */
#define L4_EMU_44XX_VIRT (L4_EMU_44XX_PHYS + OMAP2_EMU_IO_OFFSET)
#define L4_EMU_44XX_SIZE SZ_8M
#define OMAP44XX_GPMC_PHYS OMAP44XX_GPMC_BASE
/* 0x50000000 --> 0xf9000000 */
#define OMAP44XX_GPMC_VIRT (OMAP44XX_GPMC_PHYS + OMAP4_GPMC_IO_OFFSET)
#define OMAP44XX_GPMC_SIZE SZ_1M
#define OMAP44XX_EMIF1_PHYS OMAP44XX_EMIF1_BASE
/* 0x4c000000 --> 0xfd100000 */
#define OMAP44XX_EMIF1_VIRT (OMAP44XX_EMIF1_PHYS + OMAP4_L3_PER_IO_OFFSET)
#define OMAP44XX_EMIF1_SIZE SZ_1M
#define OMAP44XX_EMIF2_PHYS OMAP44XX_EMIF2_BASE
/* 0x4d000000 --> 0xfd200000 */
#define OMAP44XX_EMIF2_SIZE SZ_1M
#define OMAP44XX_EMIF2_VIRT (OMAP44XX_EMIF1_VIRT + OMAP44XX_EMIF1_SIZE)
#define OMAP44XX_DMM_PHYS OMAP44XX_DMM_BASE
/* 0x4e000000 --> 0xfd300000 */
#define OMAP44XX_DMM_SIZE SZ_1M
#define OMAP44XX_DMM_VIRT (OMAP44XX_EMIF2_VIRT + OMAP44XX_EMIF2_SIZE)
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* omap_hwmod implementation for OMAP2/3/4 * omap_hwmod implementation for OMAP2/3/4
* *
* Copyright (C) 2009-2011 Nokia Corporation * Copyright (C) 2009-2011 Nokia Corporation
* Copyright (C) 2011 Texas Instruments, Inc. * Copyright (C) 2011-2012 Texas Instruments, Inc.
* *
* Paul Walmsley, Benoît Cousson, Kevin Hilman * Paul Walmsley, Benoît Cousson, Kevin Hilman
* *
...@@ -137,6 +137,7 @@ ...@@ -137,6 +137,7 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/bootmem.h>
#include "common.h" #include "common.h"
#include <plat/cpu.h> #include <plat/cpu.h>
...@@ -159,15 +160,57 @@ ...@@ -159,15 +160,57 @@
/* Name of the OMAP hwmod for the MPU */ /* Name of the OMAP hwmod for the MPU */
#define MPU_INITIATOR_NAME "mpu" #define MPU_INITIATOR_NAME "mpu"
/*
* Number of struct omap_hwmod_link records per struct
* omap_hwmod_ocp_if record (master->slave and slave->master)
*/
#define LINKS_PER_OCP_IF 2
/* omap_hwmod_list contains all registered struct omap_hwmods */ /* omap_hwmod_list contains all registered struct omap_hwmods */
static LIST_HEAD(omap_hwmod_list); static LIST_HEAD(omap_hwmod_list);
/* mpu_oh: used to add/remove MPU initiator from sleepdep list */ /* mpu_oh: used to add/remove MPU initiator from sleepdep list */
static struct omap_hwmod *mpu_oh; static struct omap_hwmod *mpu_oh;
/*
* linkspace: ptr to a buffer that struct omap_hwmod_link records are
* allocated from - used to reduce the number of small memory
* allocations, which has a significant impact on performance
*/
static struct omap_hwmod_link *linkspace;
/*
* free_ls, max_ls: array indexes into linkspace; representing the
* next free struct omap_hwmod_link index, and the maximum number of
* struct omap_hwmod_link records allocated (respectively)
*/
static unsigned short free_ls, max_ls, ls_supp;
/* Private functions */ /* Private functions */
/**
* _fetch_next_ocp_if - return the next OCP interface in a list
* @p: ptr to a ptr to the list_head inside the ocp_if to return
* @i: pointer to the index of the element pointed to by @p in the list
*
* Return a pointer to the struct omap_hwmod_ocp_if record
* containing the struct list_head pointed to by @p, and increment
* @p such that a future call to this routine will return the next
* record.
*/
static struct omap_hwmod_ocp_if *_fetch_next_ocp_if(struct list_head **p,
int *i)
{
struct omap_hwmod_ocp_if *oi;
oi = list_entry(*p, struct omap_hwmod_link, node)->ocp_if;
*p = (*p)->next;
*i = *i + 1;
return oi;
}
/** /**
* _update_sysc_cache - return the module OCP_SYSCONFIG register, keep copy * _update_sysc_cache - return the module OCP_SYSCONFIG register, keep copy
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod *
...@@ -582,16 +625,16 @@ static int _init_main_clk(struct omap_hwmod *oh) ...@@ -582,16 +625,16 @@ static int _init_main_clk(struct omap_hwmod *oh)
*/ */
static int _init_interface_clks(struct omap_hwmod *oh) static int _init_interface_clks(struct omap_hwmod *oh)
{ {
struct omap_hwmod_ocp_if *os;
struct list_head *p;
struct clk *c; struct clk *c;
int i; int i = 0;
int ret = 0; int ret = 0;
if (oh->slaves_cnt == 0) p = oh->slave_ports.next;
return 0;
for (i = 0; i < oh->slaves_cnt; i++) {
struct omap_hwmod_ocp_if *os = oh->slaves[i];
while (i < oh->slaves_cnt) {
os = _fetch_next_ocp_if(&p, &i);
if (!os->clk) if (!os->clk)
continue; continue;
...@@ -643,21 +686,22 @@ static int _init_opt_clks(struct omap_hwmod *oh) ...@@ -643,21 +686,22 @@ static int _init_opt_clks(struct omap_hwmod *oh)
*/ */
static int _enable_clocks(struct omap_hwmod *oh) static int _enable_clocks(struct omap_hwmod *oh)
{ {
int i; struct omap_hwmod_ocp_if *os;
struct list_head *p;
int i = 0;
pr_debug("omap_hwmod: %s: enabling clocks\n", oh->name); pr_debug("omap_hwmod: %s: enabling clocks\n", oh->name);
if (oh->_clk) if (oh->_clk)
clk_enable(oh->_clk); clk_enable(oh->_clk);
if (oh->slaves_cnt > 0) { p = oh->slave_ports.next;
for (i = 0; i < oh->slaves_cnt; i++) {
struct omap_hwmod_ocp_if *os = oh->slaves[i];
struct clk *c = os->_clk;
if (c && (os->flags & OCPIF_SWSUP_IDLE)) while (i < oh->slaves_cnt) {
clk_enable(c); os = _fetch_next_ocp_if(&p, &i);
}
if (os->_clk && (os->flags & OCPIF_SWSUP_IDLE))
clk_enable(os->_clk);
} }
/* The opt clocks are controlled by the device driver. */ /* The opt clocks are controlled by the device driver. */
...@@ -673,21 +717,22 @@ static int _enable_clocks(struct omap_hwmod *oh) ...@@ -673,21 +717,22 @@ static int _enable_clocks(struct omap_hwmod *oh)
*/ */
static int _disable_clocks(struct omap_hwmod *oh) static int _disable_clocks(struct omap_hwmod *oh)
{ {
int i; struct omap_hwmod_ocp_if *os;
struct list_head *p;
int i = 0;
pr_debug("omap_hwmod: %s: disabling clocks\n", oh->name); pr_debug("omap_hwmod: %s: disabling clocks\n", oh->name);
if (oh->_clk) if (oh->_clk)
clk_disable(oh->_clk); clk_disable(oh->_clk);
if (oh->slaves_cnt > 0) { p = oh->slave_ports.next;
for (i = 0; i < oh->slaves_cnt; i++) {
struct omap_hwmod_ocp_if *os = oh->slaves[i];
struct clk *c = os->_clk;
if (c && (os->flags & OCPIF_SWSUP_IDLE)) while (i < oh->slaves_cnt) {
clk_disable(c); os = _fetch_next_ocp_if(&p, &i);
}
if (os->_clk && (os->flags & OCPIF_SWSUP_IDLE))
clk_disable(os->_clk);
} }
/* The opt clocks are controlled by the device driver. */ /* The opt clocks are controlled by the device driver. */
...@@ -780,39 +825,6 @@ static int _omap4_wait_target_disable(struct omap_hwmod *oh) ...@@ -780,39 +825,6 @@ static int _omap4_wait_target_disable(struct omap_hwmod *oh)
oh->prcm.omap4.clkctrl_offs); oh->prcm.omap4.clkctrl_offs);
} }
/**
* _omap4_disable_module - enable CLKCTRL modulemode on OMAP4
* @oh: struct omap_hwmod *
*
* Disable the PRCM module mode related to the hwmod @oh.
* Return EINVAL if the modulemode is not supported and 0 in case of success.
*/
static int _omap4_disable_module(struct omap_hwmod *oh)
{
int v;
/* The module mode does not exist prior OMAP4 */
if (!cpu_is_omap44xx())
return -EINVAL;
if (!oh->clkdm || !oh->prcm.omap4.modulemode)
return -EINVAL;
pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__);
omap4_cminst_module_disable(oh->clkdm->prcm_partition,
oh->clkdm->cm_inst,
oh->clkdm->clkdm_offs,
oh->prcm.omap4.clkctrl_offs);
v = _omap4_wait_target_disable(oh);
if (v)
pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
oh->name);
return 0;
}
/** /**
* _count_mpu_irqs - count the number of MPU IRQ lines associated with @oh * _count_mpu_irqs - count the number of MPU IRQ lines associated with @oh
* @oh: struct omap_hwmod *oh * @oh: struct omap_hwmod *oh
...@@ -883,59 +895,220 @@ static int _count_ocp_if_addr_spaces(struct omap_hwmod_ocp_if *os) ...@@ -883,59 +895,220 @@ static int _count_ocp_if_addr_spaces(struct omap_hwmod_ocp_if *os)
} }
/** /**
* _find_mpu_port_index - find hwmod OCP slave port ID intended for MPU use * _get_mpu_irq_by_name - fetch MPU interrupt line number by name
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod * to operate on
* @name: pointer to the name of the MPU interrupt number to fetch (optional)
* @irq: pointer to an unsigned int to store the MPU IRQ number to
* *
* Returns the array index of the OCP slave port that the MPU * Retrieve a MPU hardware IRQ line number named by @name associated
* addresses the device on, or -EINVAL upon error or not found. * with the IP block pointed to by @oh. The IRQ number will be filled
* into the address pointed to by @dma. When @name is non-null, the
* IRQ line number associated with the named entry will be returned.
* If @name is null, the first matching entry will be returned. Data
* order is not meaningful in hwmod data, so callers are strongly
* encouraged to use a non-null @name whenever possible to avoid
* unpredictable effects if hwmod data is later added that causes data
* ordering to change. Returns 0 upon success or a negative error
* code upon error.
*/ */
static int __init _find_mpu_port_index(struct omap_hwmod *oh) static int _get_mpu_irq_by_name(struct omap_hwmod *oh, const char *name,
unsigned int *irq)
{ {
int i; int i;
int found = 0; bool found = false;
if (!oh || oh->slaves_cnt == 0) if (!oh->mpu_irqs)
return -EINVAL; return -ENOENT;
for (i = 0; i < oh->slaves_cnt; i++) { i = 0;
struct omap_hwmod_ocp_if *os = oh->slaves[i]; while (oh->mpu_irqs[i].irq != -1) {
if (name == oh->mpu_irqs[i].name ||
!strcmp(name, oh->mpu_irqs[i].name)) {
found = true;
break;
}
i++;
}
if (os->user & OCP_USER_MPU) { if (!found)
found = 1; return -ENOENT;
*irq = oh->mpu_irqs[i].irq;
return 0;
}
/**
* _get_sdma_req_by_name - fetch SDMA request line ID by name
* @oh: struct omap_hwmod * to operate on
* @name: pointer to the name of the SDMA request line to fetch (optional)
* @dma: pointer to an unsigned int to store the request line ID to
*
* Retrieve an SDMA request line ID named by @name on the IP block
* pointed to by @oh. The ID will be filled into the address pointed
* to by @dma. When @name is non-null, the request line ID associated
* with the named entry will be returned. If @name is null, the first
* matching entry will be returned. Data order is not meaningful in
* hwmod data, so callers are strongly encouraged to use a non-null
* @name whenever possible to avoid unpredictable effects if hwmod
* data is later added that causes data ordering to change. Returns 0
* upon success or a negative error code upon error.
*/
static int _get_sdma_req_by_name(struct omap_hwmod *oh, const char *name,
unsigned int *dma)
{
int i;
bool found = false;
if (!oh->sdma_reqs)
return -ENOENT;
i = 0;
while (oh->sdma_reqs[i].dma_req != -1) {
if (name == oh->sdma_reqs[i].name ||
!strcmp(name, oh->sdma_reqs[i].name)) {
found = true;
break; break;
} }
i++;
} }
if (found) if (!found)
pr_debug("omap_hwmod: %s: MPU OCP slave port ID %d\n", return -ENOENT;
oh->name, i);
else *dma = oh->sdma_reqs[i].dma_req;
pr_debug("omap_hwmod: %s: no MPU OCP slave port found\n",
oh->name);
return (found) ? i : -EINVAL; return 0;
} }
/** /**
* _find_mpu_rt_base - find hwmod register target base addr accessible by MPU * _get_addr_space_by_name - fetch address space start & end by name
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod * to operate on
* @name: pointer to the name of the address space to fetch (optional)
* @pa_start: pointer to a u32 to store the starting address to
* @pa_end: pointer to a u32 to store the ending address to
* *
* Return the virtual address of the base of the register target of * Retrieve address space start and end addresses for the IP block
* device @oh, or NULL on error. * pointed to by @oh. The data will be filled into the addresses
* pointed to by @pa_start and @pa_end. When @name is non-null, the
* address space data associated with the named entry will be
* returned. If @name is null, the first matching entry will be
* returned. Data order is not meaningful in hwmod data, so callers
* are strongly encouraged to use a non-null @name whenever possible
* to avoid unpredictable effects if hwmod data is later added that
* causes data ordering to change. Returns 0 upon success or a
* negative error code upon error.
*/ */
static void __iomem * __init _find_mpu_rt_base(struct omap_hwmod *oh, u8 index) static int _get_addr_space_by_name(struct omap_hwmod *oh, const char *name,
u32 *pa_start, u32 *pa_end)
{ {
int i, j;
struct omap_hwmod_ocp_if *os; struct omap_hwmod_ocp_if *os;
struct omap_hwmod_addr_space *mem; struct list_head *p = NULL;
int i = 0, found = 0; bool found = false;
void __iomem *va_start;
p = oh->slave_ports.next;
i = 0;
while (i < oh->slaves_cnt) {
os = _fetch_next_ocp_if(&p, &i);
if (!os->addr)
return -ENOENT;
j = 0;
while (os->addr[j].pa_start != os->addr[j].pa_end) {
if (name == os->addr[j].name ||
!strcmp(name, os->addr[j].name)) {
found = true;
break;
}
j++;
}
if (found)
break;
}
if (!found)
return -ENOENT;
*pa_start = os->addr[j].pa_start;
*pa_end = os->addr[j].pa_end;
return 0;
}
/**
* _save_mpu_port_index - find and save the index to @oh's MPU port
* @oh: struct omap_hwmod *
*
* Determines the array index of the OCP slave port that the MPU uses
* to address the device, and saves it into the struct omap_hwmod.
* Intended to be called during hwmod registration only. No return
* value.
*/
static void __init _save_mpu_port_index(struct omap_hwmod *oh)
{
struct omap_hwmod_ocp_if *os = NULL;
struct list_head *p;
int i = 0;
if (!oh)
return;
if (!oh || oh->slaves_cnt == 0) oh->_int_flags |= _HWMOD_NO_MPU_PORT;
p = oh->slave_ports.next;
while (i < oh->slaves_cnt) {
os = _fetch_next_ocp_if(&p, &i);
if (os->user & OCP_USER_MPU) {
oh->_mpu_port = os;
oh->_int_flags &= ~_HWMOD_NO_MPU_PORT;
break;
}
}
return;
}
/**
* _find_mpu_rt_port - return omap_hwmod_ocp_if accessible by the MPU
* @oh: struct omap_hwmod *
*
* Given a pointer to a struct omap_hwmod record @oh, return a pointer
* to the struct omap_hwmod_ocp_if record that is used by the MPU to
* communicate with the IP block. This interface need not be directly
* connected to the MPU (and almost certainly is not), but is directly
* connected to the IP block represented by @oh. Returns a pointer
* to the struct omap_hwmod_ocp_if * upon success, or returns NULL upon
* error or if there does not appear to be a path from the MPU to this
* IP block.
*/
static struct omap_hwmod_ocp_if *_find_mpu_rt_port(struct omap_hwmod *oh)
{
if (!oh || oh->_int_flags & _HWMOD_NO_MPU_PORT || oh->slaves_cnt == 0)
return NULL; return NULL;
os = oh->slaves[index]; return oh->_mpu_port;
};
/**
* _find_mpu_rt_addr_space - return MPU register target address space for @oh
* @oh: struct omap_hwmod *
*
* Returns a pointer to the struct omap_hwmod_addr_space record representing
* the register target MPU address space; or returns NULL upon error.
*/
static struct omap_hwmod_addr_space * __init _find_mpu_rt_addr_space(struct omap_hwmod *oh)
{
struct omap_hwmod_ocp_if *os;
struct omap_hwmod_addr_space *mem;
int found = 0, i = 0;
if (!os->addr) os = _find_mpu_rt_port(oh);
if (!os || !os->addr)
return NULL; return NULL;
do { do {
...@@ -944,20 +1117,7 @@ static void __iomem * __init _find_mpu_rt_base(struct omap_hwmod *oh, u8 index) ...@@ -944,20 +1117,7 @@ static void __iomem * __init _find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
found = 1; found = 1;
} while (!found && mem->pa_start != mem->pa_end); } while (!found && mem->pa_start != mem->pa_end);
if (found) { return (found) ? mem : NULL;
va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
if (!va_start) {
pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name);
return NULL;
}
pr_debug("omap_hwmod: %s: MPU register target at va %p\n",
oh->name, va_start);
} else {
pr_debug("omap_hwmod: %s: no MPU register target found\n",
oh->name);
}
return (found) ? va_start : NULL;
} }
/** /**
...@@ -1205,12 +1365,11 @@ static int _wait_target_ready(struct omap_hwmod *oh) ...@@ -1205,12 +1365,11 @@ static int _wait_target_ready(struct omap_hwmod *oh)
if (!oh) if (!oh)
return -EINVAL; return -EINVAL;
if (oh->_int_flags & _HWMOD_NO_MPU_PORT) if (oh->flags & HWMOD_NO_IDLEST)
return 0; return 0;
os = oh->slaves[oh->_mpu_port_index]; os = _find_mpu_rt_port(oh);
if (!os)
if (oh->flags & HWMOD_NO_IDLEST)
return 0; return 0;
/* XXX check module SIDLEMODE */ /* XXX check module SIDLEMODE */
...@@ -1377,14 +1536,74 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name) ...@@ -1377,14 +1536,74 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name)
} }
} }
/**
* _are_any_hardreset_lines_asserted - return true if part of @oh is hard-reset
* @oh: struct omap_hwmod *
*
* If any hardreset line associated with @oh is asserted, then return true.
* Otherwise, if @oh has no hardreset lines associated with it, or if
* no hardreset lines associated with @oh are asserted, then return false.
* This function is used to avoid executing some parts of the IP block
* enable/disable sequence if a hardreset line is set.
*/
static bool _are_any_hardreset_lines_asserted(struct omap_hwmod *oh)
{
int i;
if (oh->rst_lines_cnt == 0)
return false;
for (i = 0; i < oh->rst_lines_cnt; i++)
if (_read_hardreset(oh, oh->rst_lines[i].name) > 0)
return true;
return false;
}
/**
* _omap4_disable_module - enable CLKCTRL modulemode on OMAP4
* @oh: struct omap_hwmod *
*
* Disable the PRCM module mode related to the hwmod @oh.
* Return EINVAL if the modulemode is not supported and 0 in case of success.
*/
static int _omap4_disable_module(struct omap_hwmod *oh)
{
int v;
/* The module mode does not exist prior OMAP4 */
if (!cpu_is_omap44xx())
return -EINVAL;
if (!oh->clkdm || !oh->prcm.omap4.modulemode)
return -EINVAL;
pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__);
omap4_cminst_module_disable(oh->clkdm->prcm_partition,
oh->clkdm->cm_inst,
oh->clkdm->clkdm_offs,
oh->prcm.omap4.clkctrl_offs);
if (_are_any_hardreset_lines_asserted(oh))
return 0;
v = _omap4_wait_target_disable(oh);
if (v)
pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
oh->name);
return 0;
}
/** /**
* _ocp_softreset - reset an omap_hwmod via the OCP_SYSCONFIG bit * _ocp_softreset - reset an omap_hwmod via the OCP_SYSCONFIG bit
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod *
* *
* Resets an omap_hwmod @oh via the OCP_SYSCONFIG bit. hwmod must be * Resets an omap_hwmod @oh via the OCP_SYSCONFIG bit. hwmod must be
* enabled for this to work. Returns -EINVAL if the hwmod cannot be * enabled for this to work. Returns -ENOENT if the hwmod cannot be
* reset this way or if the hwmod is in the wrong state, -ETIMEDOUT if * reset this way, -EINVAL if the hwmod is in the wrong state,
* the module did not reset in time, or 0 upon success. * -ETIMEDOUT if the module did not reset in time, or 0 upon success.
* *
* In OMAP3 a specific SYSSTATUS register is used to get the reset status. * In OMAP3 a specific SYSSTATUS register is used to get the reset status.
* Starting in OMAP4, some IPs do not have SYSSTATUS registers and instead * Starting in OMAP4, some IPs do not have SYSSTATUS registers and instead
...@@ -1401,7 +1620,7 @@ static int _ocp_softreset(struct omap_hwmod *oh) ...@@ -1401,7 +1620,7 @@ static int _ocp_softreset(struct omap_hwmod *oh)
if (!oh->class->sysc || if (!oh->class->sysc ||
!(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET)) !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
return -EINVAL; return -ENOENT;
/* clocks must be on for this operation */ /* clocks must be on for this operation */
if (oh->_state != _HWMOD_STATE_ENABLED) { if (oh->_state != _HWMOD_STATE_ENABLED) {
...@@ -1462,32 +1681,60 @@ static int _ocp_softreset(struct omap_hwmod *oh) ...@@ -1462,32 +1681,60 @@ static int _ocp_softreset(struct omap_hwmod *oh)
* _reset - reset an omap_hwmod * _reset - reset an omap_hwmod
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod *
* *
* Resets an omap_hwmod @oh. The default software reset mechanism for * Resets an omap_hwmod @oh. If the module has a custom reset
* most OMAP IP blocks is triggered via the OCP_SYSCONFIG.SOFTRESET * function pointer defined, then call it to reset the IP block, and
* bit. However, some hwmods cannot be reset via this method: some * pass along its return value to the caller. Otherwise, if the IP
* are not targets and therefore have no OCP header registers to * block has an OCP_SYSCONFIG register with a SOFTRESET bitfield
* access; others (like the IVA) have idiosyncratic reset sequences. * associated with it, call a function to reset the IP block via that
* So for these relatively rare cases, custom reset code can be * method, and pass along the return value to the caller. Finally, if
* supplied in the struct omap_hwmod_class .reset function pointer. * the IP block has some hardreset lines associated with it, assert
* Passes along the return value from either _reset() or the custom * all of those, but do _not_ deassert them. (This is because driver
* reset function - these must return -EINVAL if the hwmod cannot be * authors have expressed an apparent requirement to control the
* reset this way or if the hwmod is in the wrong state, -ETIMEDOUT if * deassertion of the hardreset lines themselves.)
* the module did not reset in time, or 0 upon success. *
* The default software reset mechanism for most OMAP IP blocks is
* triggered via the OCP_SYSCONFIG.SOFTRESET bit. However, some
* hwmods cannot be reset via this method. Some are not targets and
* therefore have no OCP header registers to access. Others (like the
* IVA) have idiosyncratic reset sequences. So for these relatively
* rare cases, custom reset code can be supplied in the struct
* omap_hwmod_class .reset function pointer. Passes along the return
* value from either _ocp_softreset() or the custom reset function -
* these must return -EINVAL if the hwmod cannot be reset this way or
* if the hwmod is in the wrong state, -ETIMEDOUT if the module did
* not reset in time, or 0 upon success.
*/ */
static int _reset(struct omap_hwmod *oh) static int _reset(struct omap_hwmod *oh)
{ {
int ret; int i, r;
pr_debug("omap_hwmod: %s: resetting\n", oh->name); pr_debug("omap_hwmod: %s: resetting\n", oh->name);
ret = (oh->class->reset) ? oh->class->reset(oh) : _ocp_softreset(oh); if (oh->class->reset) {
r = oh->class->reset(oh);
} else {
if (oh->rst_lines_cnt > 0) {
for (i = 0; i < oh->rst_lines_cnt; i++)
_assert_hardreset(oh, oh->rst_lines[i].name);
return 0;
} else {
r = _ocp_softreset(oh);
if (r == -ENOENT)
r = 0;
}
}
/*
* OCP_SYSCONFIG bits need to be reprogrammed after a
* softreset. The _enable() function should be split to avoid
* the rewrite of the OCP_SYSCONFIG register.
*/
if (oh->class->sysc) { if (oh->class->sysc) {
_update_sysc_cache(oh); _update_sysc_cache(oh);
_enable_sysc(oh); _enable_sysc(oh);
} }
return ret; return r;
} }
/** /**
...@@ -1506,10 +1753,9 @@ static int _enable(struct omap_hwmod *oh) ...@@ -1506,10 +1753,9 @@ static int _enable(struct omap_hwmod *oh)
pr_debug("omap_hwmod: %s: enabling\n", oh->name); pr_debug("omap_hwmod: %s: enabling\n", oh->name);
/* /*
* hwmods with HWMOD_INIT_NO_IDLE flag set are left * hwmods with HWMOD_INIT_NO_IDLE flag set are left in enabled
* in enabled state at init. * state at init. Now that someone is really trying to enable
* Now that someone is really trying to enable them, * them, just ensure that the hwmod mux is set.
* just ensure that the hwmod mux is set.
*/ */
if (oh->_int_flags & _HWMOD_SKIP_ENABLE) { if (oh->_int_flags & _HWMOD_SKIP_ENABLE) {
/* /*
...@@ -1532,15 +1778,17 @@ static int _enable(struct omap_hwmod *oh) ...@@ -1532,15 +1778,17 @@ static int _enable(struct omap_hwmod *oh)
return -EINVAL; return -EINVAL;
} }
/* /*
* If an IP contains only one HW reset line, then de-assert it in order * If an IP block contains HW reset lines and any of them are
* to allow the module state transition. Otherwise the PRCM will return * asserted, we let integration code associated with that
* Intransition status, and the init will failed. * block handle the enable. We've received very little
* information on what those driver authors need, and until
* detailed information is provided and the driver code is
* posted to the public lists, this is probably the best we
* can do.
*/ */
if ((oh->_state == _HWMOD_STATE_INITIALIZED || if (_are_any_hardreset_lines_asserted(oh))
oh->_state == _HWMOD_STATE_DISABLED) && oh->rst_lines_cnt == 1) return 0;
_deassert_hardreset(oh, oh->rst_lines[0].name);
/* Mux pins for device runtime if populated */ /* Mux pins for device runtime if populated */
if (oh->mux && (!oh->mux->enabled || if (oh->mux && (!oh->mux->enabled ||
...@@ -1615,6 +1863,9 @@ static int _idle(struct omap_hwmod *oh) ...@@ -1615,6 +1863,9 @@ static int _idle(struct omap_hwmod *oh)
return -EINVAL; return -EINVAL;
} }
if (_are_any_hardreset_lines_asserted(oh))
return 0;
if (oh->class->sysc) if (oh->class->sysc)
_idle_sysc(oh); _idle_sysc(oh);
_del_initiator_dep(oh, mpu_oh); _del_initiator_dep(oh, mpu_oh);
...@@ -1687,7 +1938,7 @@ int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle) ...@@ -1687,7 +1938,7 @@ int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle)
*/ */
static int _shutdown(struct omap_hwmod *oh) static int _shutdown(struct omap_hwmod *oh)
{ {
int ret; int ret, i;
u8 prev_state; u8 prev_state;
if (oh->_state != _HWMOD_STATE_IDLE && if (oh->_state != _HWMOD_STATE_IDLE &&
...@@ -1697,6 +1948,9 @@ static int _shutdown(struct omap_hwmod *oh) ...@@ -1697,6 +1948,9 @@ static int _shutdown(struct omap_hwmod *oh)
return -EINVAL; return -EINVAL;
} }
if (_are_any_hardreset_lines_asserted(oh))
return 0;
pr_debug("omap_hwmod: %s: disabling\n", oh->name); pr_debug("omap_hwmod: %s: disabling\n", oh->name);
if (oh->class->pre_shutdown) { if (oh->class->pre_shutdown) {
...@@ -1728,12 +1982,8 @@ static int _shutdown(struct omap_hwmod *oh) ...@@ -1728,12 +1982,8 @@ static int _shutdown(struct omap_hwmod *oh)
} }
/* XXX Should this code also force-disable the optional clocks? */ /* XXX Should this code also force-disable the optional clocks? */
/* for (i = 0; i < oh->rst_lines_cnt; i++)
* If an IP contains only one HW reset line, then assert it _assert_hardreset(oh, oh->rst_lines[i].name);
* after disabling the clocks and before shutting down the IP.
*/
if (oh->rst_lines_cnt == 1)
_assert_hardreset(oh, oh->rst_lines[0].name);
/* Mux pins to safe mode or use populated off mode values */ /* Mux pins to safe mode or use populated off mode values */
if (oh->mux) if (oh->mux)
...@@ -1745,59 +1995,186 @@ static int _shutdown(struct omap_hwmod *oh) ...@@ -1745,59 +1995,186 @@ static int _shutdown(struct omap_hwmod *oh)
} }
/** /**
* _setup - do initial configuration of omap_hwmod * _init_mpu_rt_base - populate the virtual address for a hwmod
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod * to locate the virtual address
* *
* Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh * Cache the virtual address used by the MPU to access this IP block's
* OCP_SYSCONFIG register. Returns 0. * registers. This address is needed early so the OCP registers that
* are part of the device's address space can be ioremapped properly.
* No return value.
*/ */
static int _setup(struct omap_hwmod *oh, void *data) static void __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data)
{ {
int i, r; struct omap_hwmod_addr_space *mem;
u8 postsetup_state; void __iomem *va_start;
if (!oh)
return;
_save_mpu_port_index(oh);
if (oh->_state != _HWMOD_STATE_CLKS_INITED) if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
return;
mem = _find_mpu_rt_addr_space(oh);
if (!mem) {
pr_debug("omap_hwmod: %s: no MPU register target found\n",
oh->name);
return;
}
va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
if (!va_start) {
pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name);
return;
}
pr_debug("omap_hwmod: %s: MPU register target at va %p\n",
oh->name, va_start);
oh->_mpu_rt_va = va_start;
}
/**
* _init - initialize internal data for the hwmod @oh
* @oh: struct omap_hwmod *
* @n: (unused)
*
* Look up the clocks and the address space used by the MPU to access
* registers belonging to the hwmod @oh. @oh must already be
* registered at this point. This is the first of two phases for
* hwmod initialization. Code called here does not touch any hardware
* registers, it simply prepares internal data structures. Returns 0
* upon success or if the hwmod isn't registered, or -EINVAL upon
* failure.
*/
static int __init _init(struct omap_hwmod *oh, void *data)
{
int r;
if (oh->_state != _HWMOD_STATE_REGISTERED)
return 0; return 0;
/* Set iclk autoidle mode */ _init_mpu_rt_base(oh, NULL);
if (oh->slaves_cnt > 0) {
for (i = 0; i < oh->slaves_cnt; i++) {
struct omap_hwmod_ocp_if *os = oh->slaves[i];
struct clk *c = os->_clk;
if (!c) r = _init_clocks(oh, NULL);
continue; if (IS_ERR_VALUE(r)) {
WARN(1, "omap_hwmod: %s: couldn't init clocks\n", oh->name);
return -EINVAL;
}
if (os->flags & OCPIF_SWSUP_IDLE) { oh->_state = _HWMOD_STATE_INITIALIZED;
/* XXX omap_iclk_deny_idle(c); */
} else { return 0;
/* XXX omap_iclk_allow_idle(c); */ }
clk_enable(c);
} /**
* _setup_iclk_autoidle - configure an IP block's interface clocks
* @oh: struct omap_hwmod *
*
* Set up the module's interface clocks. XXX This function is still mostly
* a stub; implementing this properly requires iclk autoidle usecounting in
* the clock code. No return value.
*/
static void __init _setup_iclk_autoidle(struct omap_hwmod *oh)
{
struct omap_hwmod_ocp_if *os;
struct list_head *p;
int i = 0;
if (oh->_state != _HWMOD_STATE_INITIALIZED)
return;
p = oh->slave_ports.next;
while (i < oh->slaves_cnt) {
os = _fetch_next_ocp_if(&p, &i);
if (!os->_clk)
continue;
if (os->flags & OCPIF_SWSUP_IDLE) {
/* XXX omap_iclk_deny_idle(c); */
} else {
/* XXX omap_iclk_allow_idle(c); */
clk_enable(os->_clk);
} }
} }
oh->_state = _HWMOD_STATE_INITIALIZED; return;
}
/* /**
* In the case of hwmod with hardreset that should not be * _setup_reset - reset an IP block during the setup process
* de-assert at boot time, we have to keep the module * @oh: struct omap_hwmod *
* initialized, because we cannot enable it properly with the *
* reset asserted. Exit without warning because that behavior is * Reset the IP block corresponding to the hwmod @oh during the setup
* expected. * process. The IP block is first enabled so it can be successfully
*/ * reset. Returns 0 upon success or a negative error code upon
if ((oh->flags & HWMOD_INIT_NO_RESET) && oh->rst_lines_cnt == 1) * failure.
return 0; */
static int __init _setup_reset(struct omap_hwmod *oh)
{
int r;
r = _enable(oh); if (oh->_state != _HWMOD_STATE_INITIALIZED)
if (r) { return -EINVAL;
pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n",
oh->name, oh->_state); if (oh->rst_lines_cnt == 0) {
return 0; r = _enable(oh);
if (r) {
pr_warning("omap_hwmod: %s: cannot be enabled for reset (%d)\n",
oh->name, oh->_state);
return -EINVAL;
}
} }
if (!(oh->flags & HWMOD_INIT_NO_RESET)) if (!(oh->flags & HWMOD_INIT_NO_RESET))
_reset(oh); r = _reset(oh);
return r;
}
/**
* _setup_postsetup - transition to the appropriate state after _setup
* @oh: struct omap_hwmod *
*
* Place an IP block represented by @oh into a "post-setup" state --
* either IDLE, ENABLED, or DISABLED. ("post-setup" simply means that
* this function is called at the end of _setup().) The postsetup
* state for an IP block can be changed by calling
* omap_hwmod_enter_postsetup_state() early in the boot process,
* before one of the omap_hwmod_setup*() functions are called for the
* IP block.
*
* The IP block stays in this state until a PM runtime-based driver is
* loaded for that IP block. A post-setup state of IDLE is
* appropriate for almost all IP blocks with runtime PM-enabled
* drivers, since those drivers are able to enable the IP block. A
* post-setup state of ENABLED is appropriate for kernels with PM
* runtime disabled. The DISABLED state is appropriate for unusual IP
* blocks such as the MPU WDTIMER on kernels without WDTIMER drivers
* included, since the WDTIMER starts running on reset and will reset
* the MPU if left active.
*
* This post-setup mechanism is deprecated. Once all of the OMAP
* drivers have been converted to use PM runtime, and all of the IP
* block data and interconnect data is available to the hwmod code, it
* should be possible to replace this mechanism with a "lazy reset"
* arrangement. In a "lazy reset" setup, each IP block is enabled
* when the driver first probes, then all remaining IP blocks without
* drivers are either shut down or enabled after the drivers have
* loaded. However, this cannot take place until the above
* preconditions have been met, since otherwise the late reset code
* has no way of knowing which IP blocks are in use by drivers, and
* which ones are unused.
*
* No return value.
*/
static void __init _setup_postsetup(struct omap_hwmod *oh)
{
u8 postsetup_state;
if (oh->rst_lines_cnt > 0)
return;
postsetup_state = oh->_postsetup_state; postsetup_state = oh->_postsetup_state;
if (postsetup_state == _HWMOD_STATE_UNKNOWN) if (postsetup_state == _HWMOD_STATE_UNKNOWN)
...@@ -1821,6 +2198,35 @@ static int _setup(struct omap_hwmod *oh, void *data) ...@@ -1821,6 +2198,35 @@ static int _setup(struct omap_hwmod *oh, void *data)
WARN(1, "hwmod: %s: unknown postsetup state %d! defaulting to enabled\n", WARN(1, "hwmod: %s: unknown postsetup state %d! defaulting to enabled\n",
oh->name, postsetup_state); oh->name, postsetup_state);
return;
}
/**
* _setup - prepare IP block hardware for use
* @oh: struct omap_hwmod *
* @n: (unused, pass NULL)
*
* Configure the IP block represented by @oh. This may include
* enabling the IP block, resetting it, and placing it into a
* post-setup state, depending on the type of IP block and applicable
* flags. IP blocks are reset to prevent any previous configuration
* by the bootloader or previous operating system from interfering
* with power management or other parts of the system. The reset can
* be avoided; see omap_hwmod_no_setup_reset(). This is the second of
* two phases for hwmod initialization. Code called here generally
* affects the IP block hardware, or system integration hardware
* associated with the IP block. Returns 0.
*/
static int __init _setup(struct omap_hwmod *oh, void *data)
{
if (oh->_state != _HWMOD_STATE_INITIALIZED)
return 0;
_setup_iclk_autoidle(oh);
if (!_setup_reset(oh))
_setup_postsetup(oh);
return 0; return 0;
} }
...@@ -1843,8 +2249,6 @@ static int _setup(struct omap_hwmod *oh, void *data) ...@@ -1843,8 +2249,6 @@ static int _setup(struct omap_hwmod *oh, void *data)
*/ */
static int __init _register(struct omap_hwmod *oh) static int __init _register(struct omap_hwmod *oh)
{ {
int ms_id;
if (!oh || !oh->name || !oh->class || !oh->class->name || if (!oh || !oh->name || !oh->class || !oh->class->name ||
(oh->_state != _HWMOD_STATE_UNKNOWN)) (oh->_state != _HWMOD_STATE_UNKNOWN))
return -EINVAL; return -EINVAL;
...@@ -1854,14 +2258,10 @@ static int __init _register(struct omap_hwmod *oh) ...@@ -1854,14 +2258,10 @@ static int __init _register(struct omap_hwmod *oh)
if (_lookup(oh->name)) if (_lookup(oh->name))
return -EEXIST; return -EEXIST;
ms_id = _find_mpu_port_index(oh);
if (!IS_ERR_VALUE(ms_id))
oh->_mpu_port_index = ms_id;
else
oh->_int_flags |= _HWMOD_NO_MPU_PORT;
list_add_tail(&oh->node, &omap_hwmod_list); list_add_tail(&oh->node, &omap_hwmod_list);
INIT_LIST_HEAD(&oh->master_ports);
INIT_LIST_HEAD(&oh->slave_ports);
spin_lock_init(&oh->_lock); spin_lock_init(&oh->_lock);
oh->_state = _HWMOD_STATE_REGISTERED; oh->_state = _HWMOD_STATE_REGISTERED;
...@@ -1876,6 +2276,160 @@ static int __init _register(struct omap_hwmod *oh) ...@@ -1876,6 +2276,160 @@ static int __init _register(struct omap_hwmod *oh)
return 0; return 0;
} }
/**
* _alloc_links - return allocated memory for hwmod links
* @ml: pointer to a struct omap_hwmod_link * for the master link
* @sl: pointer to a struct omap_hwmod_link * for the slave link
*
* Return pointers to two struct omap_hwmod_link records, via the
* addresses pointed to by @ml and @sl. Will first attempt to return
* memory allocated as part of a large initial block, but if that has
* been exhausted, will allocate memory itself. Since ideally this
* second allocation path will never occur, the number of these
* 'supplemental' allocations will be logged when debugging is
* enabled. Returns 0.
*/
static int __init _alloc_links(struct omap_hwmod_link **ml,
struct omap_hwmod_link **sl)
{
unsigned int sz;
if ((free_ls + LINKS_PER_OCP_IF) <= max_ls) {
*ml = &linkspace[free_ls++];
*sl = &linkspace[free_ls++];
return 0;
}
sz = sizeof(struct omap_hwmod_link) * LINKS_PER_OCP_IF;
*sl = NULL;
*ml = alloc_bootmem(sz);
memset(*ml, 0, sz);
*sl = (void *)(*ml) + sizeof(struct omap_hwmod_link);
ls_supp++;
pr_debug("omap_hwmod: supplemental link allocations needed: %d\n",
ls_supp * LINKS_PER_OCP_IF);
return 0;
};
/**
* _add_link - add an interconnect between two IP blocks
* @oi: pointer to a struct omap_hwmod_ocp_if record
*
* Add struct omap_hwmod_link records connecting the master IP block
* specified in @oi->master to @oi, and connecting the slave IP block
* specified in @oi->slave to @oi. This code is assumed to run before
* preemption or SMP has been enabled, thus avoiding the need for
* locking in this code. Changes to this assumption will require
* additional locking. Returns 0.
*/
static int __init _add_link(struct omap_hwmod_ocp_if *oi)
{
struct omap_hwmod_link *ml, *sl;
pr_debug("omap_hwmod: %s -> %s: adding link\n", oi->master->name,
oi->slave->name);
_alloc_links(&ml, &sl);
ml->ocp_if = oi;
INIT_LIST_HEAD(&ml->node);
list_add(&ml->node, &oi->master->master_ports);
oi->master->masters_cnt++;
sl->ocp_if = oi;
INIT_LIST_HEAD(&sl->node);
list_add(&sl->node, &oi->slave->slave_ports);
oi->slave->slaves_cnt++;
return 0;
}
/**
* _register_link - register a struct omap_hwmod_ocp_if
* @oi: struct omap_hwmod_ocp_if *
*
* Registers the omap_hwmod_ocp_if record @oi. Returns -EEXIST if it
* has already been registered; -EINVAL if @oi is NULL or if the
* record pointed to by @oi is missing required fields; or 0 upon
* success.
*
* XXX The data should be copied into bootmem, so the original data
* should be marked __initdata and freed after init. This would allow
* unneeded omap_hwmods to be freed on multi-OMAP configurations.
*/
static int __init _register_link(struct omap_hwmod_ocp_if *oi)
{
if (!oi || !oi->master || !oi->slave || !oi->user)
return -EINVAL;
if (oi->_int_flags & _OCPIF_INT_FLAGS_REGISTERED)
return -EEXIST;
pr_debug("omap_hwmod: registering link from %s to %s\n",
oi->master->name, oi->slave->name);
/*
* Register the connected hwmods, if they haven't been
* registered already
*/
if (oi->master->_state != _HWMOD_STATE_REGISTERED)
_register(oi->master);
if (oi->slave->_state != _HWMOD_STATE_REGISTERED)
_register(oi->slave);
_add_link(oi);
oi->_int_flags |= _OCPIF_INT_FLAGS_REGISTERED;
return 0;
}
/**
* _alloc_linkspace - allocate large block of hwmod links
* @ois: pointer to an array of struct omap_hwmod_ocp_if records to count
*
* Allocate a large block of struct omap_hwmod_link records. This
* improves boot time significantly by avoiding the need to allocate
* individual records one by one. If the number of records to
* allocate in the block hasn't been manually specified, this function
* will count the number of struct omap_hwmod_ocp_if records in @ois
* and use that to determine the allocation size. For SoC families
* that require multiple list registrations, such as OMAP3xxx, this
* estimation process isn't optimal, so manual estimation is advised
* in those cases. Returns -EEXIST if the allocation has already occurred
* or 0 upon success.
*/
static int __init _alloc_linkspace(struct omap_hwmod_ocp_if **ois)
{
unsigned int i = 0;
unsigned int sz;
if (linkspace) {
WARN(1, "linkspace already allocated\n");
return -EEXIST;
}
if (max_ls == 0)
while (ois[i++])
max_ls += LINKS_PER_OCP_IF;
sz = sizeof(struct omap_hwmod_link) * max_ls;
pr_debug("omap_hwmod: %s: allocating %d byte linkspace (%d links)\n",
__func__, sz, max_ls);
linkspace = alloc_bootmem(sz);
memset(linkspace, 0, sz);
return 0;
}
/* Public functions */ /* Public functions */
...@@ -2004,120 +2558,101 @@ int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data), ...@@ -2004,120 +2558,101 @@ int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
} }
/** /**
* omap_hwmod_register - register an array of hwmods * omap_hwmod_register_links - register an array of hwmod links
* @ohs: pointer to an array of omap_hwmods to register * @ois: pointer to an array of omap_hwmod_ocp_if to register
* *
* Intended to be called early in boot before the clock framework is * Intended to be called early in boot before the clock framework is
* initialized. If @ohs is not null, will register all omap_hwmods * initialized. If @ois is not null, will register all omap_hwmods
* listed in @ohs that are valid for this chip. Returns 0. * listed in @ois that are valid for this chip. Returns 0.
*/ */
int __init omap_hwmod_register(struct omap_hwmod **ohs) int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois)
{ {
int r, i; int r, i;
if (!ohs) if (!ois)
return 0; return 0;
if (!linkspace) {
if (_alloc_linkspace(ois)) {
pr_err("omap_hwmod: could not allocate link space\n");
return -ENOMEM;
}
}
i = 0; i = 0;
do { do {
r = _register(ohs[i]); r = _register_link(ois[i]);
WARN(r, "omap_hwmod: %s: _register returned %d\n", ohs[i]->name, WARN(r && r != -EEXIST,
r); "omap_hwmod: _register_link(%s -> %s) returned %d\n",
} while (ohs[++i]); ois[i]->master->name, ois[i]->slave->name, r);
} while (ois[++i]);
return 0; return 0;
} }
/* /**
* _populate_mpu_rt_base - populate the virtual address for a hwmod * _ensure_mpu_hwmod_is_setup - ensure the MPU SS hwmod is init'ed and set up
* @oh: pointer to the hwmod currently being set up (usually not the MPU)
* *
* Must be called only from omap_hwmod_setup_*() so ioremap works properly. * If the hwmod data corresponding to the MPU subsystem IP block
* Assumes the caller takes care of locking if needed. * hasn't been initialized and set up yet, do so now. This must be
* done first since sleep dependencies may be added from other hwmods
* to the MPU. Intended to be called only by omap_hwmod_setup*(). No
* return value.
*/ */
static int __init _populate_mpu_rt_base(struct omap_hwmod *oh, void *data) static void __init _ensure_mpu_hwmod_is_setup(struct omap_hwmod *oh)
{ {
if (oh->_state != _HWMOD_STATE_REGISTERED) if (!mpu_oh || mpu_oh->_state == _HWMOD_STATE_UNKNOWN)
return 0; pr_err("omap_hwmod: %s: MPU initiator hwmod %s not yet registered\n",
__func__, MPU_INITIATOR_NAME);
if (oh->_int_flags & _HWMOD_NO_MPU_PORT) else if (mpu_oh->_state == _HWMOD_STATE_REGISTERED && oh != mpu_oh)
return 0; omap_hwmod_setup_one(MPU_INITIATOR_NAME);
oh->_mpu_rt_va = _find_mpu_rt_base(oh, oh->_mpu_port_index);
return 0;
} }
/** /**
* omap_hwmod_setup_one - set up a single hwmod * omap_hwmod_setup_one - set up a single hwmod
* @oh_name: const char * name of the already-registered hwmod to set up * @oh_name: const char * name of the already-registered hwmod to set up
* *
* Must be called after omap2_clk_init(). Resolves the struct clk * Initialize and set up a single hwmod. Intended to be used for a
* names to struct clk pointers for each registered omap_hwmod. Also * small number of early devices, such as the timer IP blocks used for
* calls _setup() on each hwmod. Returns -EINVAL upon error or 0 upon * the scheduler clock. Must be called after omap2_clk_init().
* success. * Resolves the struct clk names to struct clk pointers for each
* registered omap_hwmod. Also calls _setup() on each hwmod. Returns
* -EINVAL upon error or 0 upon success.
*/ */
int __init omap_hwmod_setup_one(const char *oh_name) int __init omap_hwmod_setup_one(const char *oh_name)
{ {
struct omap_hwmod *oh; struct omap_hwmod *oh;
int r;
pr_debug("omap_hwmod: %s: %s\n", oh_name, __func__); pr_debug("omap_hwmod: %s: %s\n", oh_name, __func__);
if (!mpu_oh) {
pr_err("omap_hwmod: %s: cannot setup_one: MPU initiator hwmod %s not yet registered\n",
oh_name, MPU_INITIATOR_NAME);
return -EINVAL;
}
oh = _lookup(oh_name); oh = _lookup(oh_name);
if (!oh) { if (!oh) {
WARN(1, "omap_hwmod: %s: hwmod not yet registered\n", oh_name); WARN(1, "omap_hwmod: %s: hwmod not yet registered\n", oh_name);
return -EINVAL; return -EINVAL;
} }
if (mpu_oh->_state == _HWMOD_STATE_REGISTERED && oh != mpu_oh) _ensure_mpu_hwmod_is_setup(oh);
omap_hwmod_setup_one(MPU_INITIATOR_NAME);
r = _populate_mpu_rt_base(oh, NULL);
if (IS_ERR_VALUE(r)) {
WARN(1, "omap_hwmod: %s: couldn't set mpu_rt_base\n", oh_name);
return -EINVAL;
}
r = _init_clocks(oh, NULL);
if (IS_ERR_VALUE(r)) {
WARN(1, "omap_hwmod: %s: couldn't init clocks\n", oh_name);
return -EINVAL;
}
_init(oh, NULL);
_setup(oh, NULL); _setup(oh, NULL);
return 0; return 0;
} }
/** /**
* omap_hwmod_setup - do some post-clock framework initialization * omap_hwmod_setup_all - set up all registered IP blocks
* *
* Must be called after omap2_clk_init(). Resolves the struct clk names * Initialize and set up all IP blocks registered with the hwmod code.
* to struct clk pointers for each registered omap_hwmod. Also calls * Must be called after omap2_clk_init(). Resolves the struct clk
* _setup() on each hwmod. Returns 0 upon success. * names to struct clk pointers for each registered omap_hwmod. Also
* calls _setup() on each hwmod. Returns 0 upon success.
*/ */
static int __init omap_hwmod_setup_all(void) static int __init omap_hwmod_setup_all(void)
{ {
int r; _ensure_mpu_hwmod_is_setup(NULL);
if (!mpu_oh) {
pr_err("omap_hwmod: %s: MPU initiator hwmod %s not yet registered\n",
__func__, MPU_INITIATOR_NAME);
return -EINVAL;
}
r = omap_hwmod_for_each(_populate_mpu_rt_base, NULL);
r = omap_hwmod_for_each(_init_clocks, NULL);
WARN(IS_ERR_VALUE(r),
"omap_hwmod: %s: _init_clocks failed\n", __func__);
omap_hwmod_for_each(_init, NULL);
omap_hwmod_for_each(_setup, NULL); omap_hwmod_for_each(_setup, NULL);
return 0; return 0;
...@@ -2274,6 +2809,10 @@ int omap_hwmod_reset(struct omap_hwmod *oh) ...@@ -2274,6 +2809,10 @@ int omap_hwmod_reset(struct omap_hwmod *oh)
return r; return r;
} }
/*
* IP block data retrieval functions
*/
/** /**
* omap_hwmod_count_resources - count number of struct resources needed by hwmod * omap_hwmod_count_resources - count number of struct resources needed by hwmod
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod *
...@@ -2292,12 +2831,19 @@ int omap_hwmod_reset(struct omap_hwmod *oh) ...@@ -2292,12 +2831,19 @@ int omap_hwmod_reset(struct omap_hwmod *oh)
*/ */
int omap_hwmod_count_resources(struct omap_hwmod *oh) int omap_hwmod_count_resources(struct omap_hwmod *oh)
{ {
int ret, i; struct omap_hwmod_ocp_if *os;
struct list_head *p;
int ret;
int i = 0;
ret = _count_mpu_irqs(oh) + _count_sdma_reqs(oh); ret = _count_mpu_irqs(oh) + _count_sdma_reqs(oh);
for (i = 0; i < oh->slaves_cnt; i++) p = oh->slave_ports.next;
ret += _count_ocp_if_addr_spaces(oh->slaves[i]);
while (i < oh->slaves_cnt) {
os = _fetch_next_ocp_if(&p, &i);
ret += _count_ocp_if_addr_spaces(os);
}
return ret; return ret;
} }
...@@ -2314,7 +2860,9 @@ int omap_hwmod_count_resources(struct omap_hwmod *oh) ...@@ -2314,7 +2860,9 @@ int omap_hwmod_count_resources(struct omap_hwmod *oh)
*/ */
int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res) int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
{ {
int i, j, mpu_irqs_cnt, sdma_reqs_cnt; struct omap_hwmod_ocp_if *os;
struct list_head *p;
int i, j, mpu_irqs_cnt, sdma_reqs_cnt, addr_cnt;
int r = 0; int r = 0;
/* For each IRQ, DMA, memory area, fill in array.*/ /* For each IRQ, DMA, memory area, fill in array.*/
...@@ -2337,11 +2885,11 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res) ...@@ -2337,11 +2885,11 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
r++; r++;
} }
for (i = 0; i < oh->slaves_cnt; i++) { p = oh->slave_ports.next;
struct omap_hwmod_ocp_if *os;
int addr_cnt;
os = oh->slaves[i]; i = 0;
while (i < oh->slaves_cnt) {
os = _fetch_next_ocp_if(&p, &i);
addr_cnt = _count_ocp_if_addr_spaces(os); addr_cnt = _count_ocp_if_addr_spaces(os);
for (j = 0; j < addr_cnt; j++) { for (j = 0; j < addr_cnt; j++) {
...@@ -2356,6 +2904,69 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res) ...@@ -2356,6 +2904,69 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
return r; return r;
} }
/**
* omap_hwmod_get_resource_byname - fetch IP block integration data by name
* @oh: struct omap_hwmod * to operate on
* @type: one of the IORESOURCE_* constants from include/linux/ioport.h
* @name: pointer to the name of the data to fetch (optional)
* @rsrc: pointer to a struct resource, allocated by the caller
*
* Retrieve MPU IRQ, SDMA request line, or address space start/end
* data for the IP block pointed to by @oh. The data will be filled
* into a struct resource record pointed to by @rsrc. The struct
* resource must be allocated by the caller. When @name is non-null,
* the data associated with the matching entry in the IRQ/SDMA/address
* space hwmod data arrays will be returned. If @name is null, the
* first array entry will be returned. Data order is not meaningful
* in hwmod data, so callers are strongly encouraged to use a non-null
* @name whenever possible to avoid unpredictable effects if hwmod
* data is later added that causes data ordering to change. This
* function is only intended for use by OMAP core code. Device
* drivers should not call this function - the appropriate bus-related
* data accessor functions should be used instead. Returns 0 upon
* success or a negative error code upon error.
*/
int omap_hwmod_get_resource_byname(struct omap_hwmod *oh, unsigned int type,
const char *name, struct resource *rsrc)
{
int r;
unsigned int irq, dma;
u32 pa_start, pa_end;
if (!oh || !rsrc)
return -EINVAL;
if (type == IORESOURCE_IRQ) {
r = _get_mpu_irq_by_name(oh, name, &irq);
if (r)
return r;
rsrc->start = irq;
rsrc->end = irq;
} else if (type == IORESOURCE_DMA) {
r = _get_sdma_req_by_name(oh, name, &dma);
if (r)
return r;
rsrc->start = dma;
rsrc->end = dma;
} else if (type == IORESOURCE_MEM) {
r = _get_addr_space_by_name(oh, name, &pa_start, &pa_end);
if (r)
return r;
rsrc->start = pa_start;
rsrc->end = pa_end;
} else {
return -EINVAL;
}
rsrc->flags = type;
rsrc->name = name;
return 0;
}
/** /**
* omap_hwmod_get_pwrdm - return pointer to this module's main powerdomain * omap_hwmod_get_pwrdm - return pointer to this module's main powerdomain
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod *
...@@ -2370,6 +2981,7 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res) ...@@ -2370,6 +2981,7 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh) struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
{ {
struct clk *c; struct clk *c;
struct omap_hwmod_ocp_if *oi;
if (!oh) if (!oh)
return NULL; return NULL;
...@@ -2377,9 +2989,10 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh) ...@@ -2377,9 +2989,10 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
if (oh->_clk) { if (oh->_clk) {
c = oh->_clk; c = oh->_clk;
} else { } else {
if (oh->_int_flags & _HWMOD_NO_MPU_PORT) oi = _find_mpu_rt_port(oh);
if (!oi)
return NULL; return NULL;
c = oh->slaves[oh->_mpu_port_index]->_clk; c = oi->_clk;
} }
if (!c->clkdm) if (!c->clkdm)
...@@ -2653,10 +3266,10 @@ int omap_hwmod_for_each_by_class(const char *classname, ...@@ -2653,10 +3266,10 @@ int omap_hwmod_for_each_by_class(const char *classname,
* @state: state that _setup() should leave the hwmod in * @state: state that _setup() should leave the hwmod in
* *
* Sets the hwmod state that @oh will enter at the end of _setup() * Sets the hwmod state that @oh will enter at the end of _setup()
* (called by omap_hwmod_setup_*()). Only valid to call between * (called by omap_hwmod_setup_*()). See also the documentation
* calling omap_hwmod_register() and omap_hwmod_setup_*(). Returns * for _setup_postsetup(), above. Returns 0 upon success or
* 0 upon success or -EINVAL if there is a problem with the arguments * -EINVAL if there is a problem with the arguments or if the hwmod is
* or if the hwmod is in the wrong state. * in the wrong state.
*/ */
int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state) int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state)
{ {
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* omap_hwmod_2420_data.c - hardware modules present on the OMAP2420 chips * omap_hwmod_2420_data.c - hardware modules present on the OMAP2420 chips
* *
* Copyright (C) 2009-2011 Nokia Corporation * Copyright (C) 2009-2011 Nokia Corporation
* Copyright (C) 2012 Texas Instruments, Inc.
* Paul Walmsley * Paul Walmsley
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -32,1073 +33,284 @@ ...@@ -32,1073 +33,284 @@
/* /*
* OMAP2420 hardware module integration data * OMAP2420 hardware module integration data
* *
* ALl of the data in this section should be autogeneratable from the * All of the data in this section should be autogeneratable from the
* TI hardware database or other technical documentation. Data that * TI hardware database or other technical documentation. Data that
* is driver-specific or driver-kernel integration-specific belongs * is driver-specific or driver-kernel integration-specific belongs
* elsewhere. * elsewhere.
*/ */
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_dss_core_hwmod;
static struct omap_hwmod omap2420_dss_dispc_hwmod;
static struct omap_hwmod omap2420_dss_rfbi_hwmod;
static struct omap_hwmod omap2420_dss_venc_hwmod;
static struct omap_hwmod omap2420_wd_timer2_hwmod;
static struct omap_hwmod omap2420_gpio1_hwmod;
static struct omap_hwmod omap2420_gpio2_hwmod;
static struct omap_hwmod omap2420_gpio3_hwmod;
static struct omap_hwmod omap2420_gpio4_hwmod;
static struct omap_hwmod omap2420_dma_system_hwmod;
static struct omap_hwmod omap2420_mcspi1_hwmod;
static struct omap_hwmod omap2420_mcspi2_hwmod;
/* L3 -> L4_CORE interface */
static struct omap_hwmod_ocp_if omap2420_l3_main__l4_core = {
.master = &omap2420_l3_main_hwmod,
.slave = &omap2420_l4_core_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* MPU -> L3 interface */
static struct omap_hwmod_ocp_if omap2420_mpu__l3_main = {
.master = &omap2420_mpu_hwmod,
.slave = &omap2420_l3_main_hwmod,
.user = OCP_USER_MPU,
};
/* Slave interfaces on the L3 interconnect */
static struct omap_hwmod_ocp_if *omap2420_l3_main_slaves[] = {
&omap2420_mpu__l3_main,
};
/* DSS -> l3 */
static struct omap_hwmod_ocp_if omap2420_dss__l3 = {
.master = &omap2420_dss_core_hwmod,
.slave = &omap2420_l3_main_hwmod,
.fw = {
.omap2 = {
.l3_perm_bit = OMAP2_L3_CORE_FW_CONNID_DSS,
.flags = OMAP_FIREWALL_L3,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* Master interfaces on the L3 interconnect */
static struct omap_hwmod_ocp_if *omap2420_l3_main_masters[] = {
&omap2420_l3_main__l4_core,
};
/* L3 */
static struct omap_hwmod omap2420_l3_main_hwmod = {
.name = "l3_main",
.class = &l3_hwmod_class,
.masters = omap2420_l3_main_masters,
.masters_cnt = ARRAY_SIZE(omap2420_l3_main_masters),
.slaves = omap2420_l3_main_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_l3_main_slaves),
.flags = HWMOD_NO_IDLEST,
};
static struct omap_hwmod omap2420_l4_wkup_hwmod;
static struct omap_hwmod omap2420_uart1_hwmod;
static struct omap_hwmod omap2420_uart2_hwmod;
static struct omap_hwmod omap2420_uart3_hwmod;
static struct omap_hwmod omap2420_i2c1_hwmod;
static struct omap_hwmod omap2420_i2c2_hwmod;
static struct omap_hwmod omap2420_mcbsp1_hwmod;
static struct omap_hwmod omap2420_mcbsp2_hwmod;
/* l4 core -> mcspi1 interface */
static struct omap_hwmod_ocp_if omap2420_l4_core__mcspi1 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_mcspi1_hwmod,
.clk = "mcspi1_ick",
.addr = omap2_mcspi1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4 core -> mcspi2 interface */
static struct omap_hwmod_ocp_if omap2420_l4_core__mcspi2 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_mcspi2_hwmod,
.clk = "mcspi2_ick",
.addr = omap2_mcspi2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4_CORE -> L4_WKUP interface */
static struct omap_hwmod_ocp_if omap2420_l4_core__l4_wkup = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_l4_wkup_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4 CORE -> UART1 interface */
static struct omap_hwmod_ocp_if omap2_l4_core__uart1 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_uart1_hwmod,
.clk = "uart1_ick",
.addr = omap2xxx_uart1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4 CORE -> UART2 interface */
static struct omap_hwmod_ocp_if omap2_l4_core__uart2 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_uart2_hwmod,
.clk = "uart2_ick",
.addr = omap2xxx_uart2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4 PER -> UART3 interface */
static struct omap_hwmod_ocp_if omap2_l4_core__uart3 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_uart3_hwmod,
.clk = "uart3_ick",
.addr = omap2xxx_uart3_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4 CORE -> I2C1 interface */
static struct omap_hwmod_ocp_if omap2420_l4_core__i2c1 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_i2c1_hwmod,
.clk = "i2c1_ick",
.addr = omap2_i2c1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4 CORE -> I2C2 interface */
static struct omap_hwmod_ocp_if omap2420_l4_core__i2c2 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_i2c2_hwmod,
.clk = "i2c2_ick",
.addr = omap2_i2c2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* Slave interfaces on the L4_CORE interconnect */
static struct omap_hwmod_ocp_if *omap2420_l4_core_slaves[] = {
&omap2420_l3_main__l4_core,
};
/* Master interfaces on the L4_CORE interconnect */
static struct omap_hwmod_ocp_if *omap2420_l4_core_masters[] = {
&omap2420_l4_core__l4_wkup,
&omap2_l4_core__uart1,
&omap2_l4_core__uart2,
&omap2_l4_core__uart3,
&omap2420_l4_core__i2c1,
&omap2420_l4_core__i2c2
};
/* L4 CORE */
static struct omap_hwmod omap2420_l4_core_hwmod = {
.name = "l4_core",
.class = &l4_hwmod_class,
.masters = omap2420_l4_core_masters,
.masters_cnt = ARRAY_SIZE(omap2420_l4_core_masters),
.slaves = omap2420_l4_core_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_l4_core_slaves),
.flags = HWMOD_NO_IDLEST,
};
/* Slave interfaces on the L4_WKUP interconnect */
static struct omap_hwmod_ocp_if *omap2420_l4_wkup_slaves[] = {
&omap2420_l4_core__l4_wkup,
};
/* Master interfaces on the L4_WKUP interconnect */
static struct omap_hwmod_ocp_if *omap2420_l4_wkup_masters[] = {
};
/* L4 WKUP */
static struct omap_hwmod omap2420_l4_wkup_hwmod = {
.name = "l4_wkup",
.class = &l4_hwmod_class,
.masters = omap2420_l4_wkup_masters,
.masters_cnt = ARRAY_SIZE(omap2420_l4_wkup_masters),
.slaves = omap2420_l4_wkup_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_l4_wkup_slaves),
.flags = HWMOD_NO_IDLEST,
};
/* Master interfaces on the MPU device */
static struct omap_hwmod_ocp_if *omap2420_mpu_masters[] = {
&omap2420_mpu__l3_main,
};
/* MPU */
static struct omap_hwmod omap2420_mpu_hwmod = {
.name = "mpu",
.class = &mpu_hwmod_class,
.main_clk = "mpu_ck",
.masters = omap2420_mpu_masters,
.masters_cnt = ARRAY_SIZE(omap2420_mpu_masters),
};
/* /*
* IVA1 interface data * IP blocks
*/ */
/* IVA <- L3 interface */ /* IVA1 (IVA1) */
static struct omap_hwmod_ocp_if omap2420_l3__iva = { static struct omap_hwmod_class iva1_hwmod_class = {
.master = &omap2420_l3_main_hwmod, .name = "iva1",
.slave = &omap2420_iva_hwmod,
.clk = "iva1_ifck",
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_ocp_if *omap2420_iva_masters[] = { static struct omap_hwmod_rst_info omap2420_iva_resets[] = {
&omap2420_l3__iva, { .name = "iva", .rst_shift = 8 },
}; };
/*
* IVA2 (IVA2)
*/
static struct omap_hwmod omap2420_iva_hwmod = { static struct omap_hwmod omap2420_iva_hwmod = {
.name = "iva", .name = "iva",
.class = &iva_hwmod_class, .class = &iva1_hwmod_class,
.masters = omap2420_iva_masters, .clkdm_name = "iva1_clkdm",
.masters_cnt = ARRAY_SIZE(omap2420_iva_masters), .rst_lines = omap2420_iva_resets,
.rst_lines_cnt = ARRAY_SIZE(omap2420_iva_resets),
.main_clk = "iva1_ifck",
}; };
/* always-on timers dev attribute */ /* DSP */
static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = { static struct omap_hwmod_class dsp_hwmod_class = {
.timer_capability = OMAP_TIMER_ALWON, .name = "dsp",
}; };
/* pwm timers dev attribute */ static struct omap_hwmod_rst_info omap2420_dsp_resets[] = {
static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = { { .name = "logic", .rst_shift = 0 },
.timer_capability = OMAP_TIMER_HAS_PWM, { .name = "mmu", .rst_shift = 1 },
}; };
/* timer1 */ static struct omap_hwmod omap2420_dsp_hwmod = {
static struct omap_hwmod omap2420_timer1_hwmod; .name = "dsp",
.class = &dsp_hwmod_class,
static struct omap_hwmod_addr_space omap2420_timer1_addrs[] = { .clkdm_name = "dsp_clkdm",
{ .rst_lines = omap2420_dsp_resets,
.pa_start = 0x48028000, .rst_lines_cnt = ARRAY_SIZE(omap2420_dsp_resets),
.pa_end = 0x48028000 + SZ_1K - 1, .main_clk = "dsp_fck",
.flags = ADDR_TYPE_RT
},
{ }
}; };
/* l4_wkup -> timer1 */ /* I2C common */
static struct omap_hwmod_ocp_if omap2420_l4_wkup__timer1 = { static struct omap_hwmod_class_sysconfig i2c_sysc = {
.master = &omap2420_l4_wkup_hwmod, .rev_offs = 0x00,
.slave = &omap2420_timer1_hwmod, .sysc_offs = 0x20,
.clk = "gpt1_ick", .syss_offs = 0x10,
.addr = omap2420_timer1_addrs, .sysc_flags = (SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
.user = OCP_USER_MPU | OCP_USER_SDMA, .sysc_fields = &omap_hwmod_sysc_type1,
};
/* timer1 slave port */
static struct omap_hwmod_ocp_if *omap2420_timer1_slaves[] = {
&omap2420_l4_wkup__timer1,
};
/* timer1 hwmod */
static struct omap_hwmod omap2420_timer1_hwmod = {
.name = "timer1",
.mpu_irqs = omap2_timer1_mpu_irqs,
.main_clk = "gpt1_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT1_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT1_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2420_timer1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_timer1_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* timer2 */
static struct omap_hwmod omap2420_timer2_hwmod;
/* l4_core -> timer2 */
static struct omap_hwmod_ocp_if omap2420_l4_core__timer2 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_timer2_hwmod,
.clk = "gpt2_ick",
.addr = omap2xxx_timer2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* timer2 slave port */
static struct omap_hwmod_ocp_if *omap2420_timer2_slaves[] = {
&omap2420_l4_core__timer2,
};
/* timer2 hwmod */
static struct omap_hwmod omap2420_timer2_hwmod = {
.name = "timer2",
.mpu_irqs = omap2_timer2_mpu_irqs,
.main_clk = "gpt2_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT2_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2420_timer2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_timer2_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* timer3 */
static struct omap_hwmod omap2420_timer3_hwmod;
/* l4_core -> timer3 */
static struct omap_hwmod_ocp_if omap2420_l4_core__timer3 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_timer3_hwmod,
.clk = "gpt3_ick",
.addr = omap2xxx_timer3_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* timer3 slave port */
static struct omap_hwmod_ocp_if *omap2420_timer3_slaves[] = {
&omap2420_l4_core__timer3,
};
/* timer3 hwmod */
static struct omap_hwmod omap2420_timer3_hwmod = {
.name = "timer3",
.mpu_irqs = omap2_timer3_mpu_irqs,
.main_clk = "gpt3_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT3_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2420_timer3_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_timer3_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* timer4 */
static struct omap_hwmod omap2420_timer4_hwmod;
/* l4_core -> timer4 */
static struct omap_hwmod_ocp_if omap2420_l4_core__timer4 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_timer4_hwmod,
.clk = "gpt4_ick",
.addr = omap2xxx_timer4_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* timer4 slave port */
static struct omap_hwmod_ocp_if *omap2420_timer4_slaves[] = {
&omap2420_l4_core__timer4,
};
/* timer4 hwmod */
static struct omap_hwmod omap2420_timer4_hwmod = {
.name = "timer4",
.mpu_irqs = omap2_timer4_mpu_irqs,
.main_clk = "gpt4_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT4_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2420_timer4_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_timer4_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* timer5 */
static struct omap_hwmod omap2420_timer5_hwmod;
/* l4_core -> timer5 */
static struct omap_hwmod_ocp_if omap2420_l4_core__timer5 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_timer5_hwmod,
.clk = "gpt5_ick",
.addr = omap2xxx_timer5_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* timer5 slave port */
static struct omap_hwmod_ocp_if *omap2420_timer5_slaves[] = {
&omap2420_l4_core__timer5,
};
/* timer5 hwmod */
static struct omap_hwmod omap2420_timer5_hwmod = {
.name = "timer5",
.mpu_irqs = omap2_timer5_mpu_irqs,
.main_clk = "gpt5_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT5_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2420_timer5_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_timer5_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* timer6 */
static struct omap_hwmod omap2420_timer6_hwmod;
/* l4_core -> timer6 */
static struct omap_hwmod_ocp_if omap2420_l4_core__timer6 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_timer6_hwmod,
.clk = "gpt6_ick",
.addr = omap2xxx_timer6_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* timer6 slave port */
static struct omap_hwmod_ocp_if *omap2420_timer6_slaves[] = {
&omap2420_l4_core__timer6,
};
/* timer6 hwmod */
static struct omap_hwmod omap2420_timer6_hwmod = {
.name = "timer6",
.mpu_irqs = omap2_timer6_mpu_irqs,
.main_clk = "gpt6_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT6_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2420_timer6_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_timer6_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* timer7 */ static struct omap_hwmod_class i2c_class = {
static struct omap_hwmod omap2420_timer7_hwmod; .name = "i2c",
.sysc = &i2c_sysc,
/* l4_core -> timer7 */ .rev = OMAP_I2C_IP_VERSION_1,
static struct omap_hwmod_ocp_if omap2420_l4_core__timer7 = { .reset = &omap_i2c_reset,
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_timer7_hwmod,
.clk = "gpt7_ick",
.addr = omap2xxx_timer7_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer7 slave port */ static struct omap_i2c_dev_attr i2c_dev_attr = {
static struct omap_hwmod_ocp_if *omap2420_timer7_slaves[] = { .flags = OMAP_I2C_FLAG_NO_FIFO |
&omap2420_l4_core__timer7, OMAP_I2C_FLAG_SIMPLE_CLOCK |
OMAP_I2C_FLAG_16BIT_DATA_REG |
OMAP_I2C_FLAG_BUS_SHIFT_2,
}; };
/* timer7 hwmod */ /* I2C1 */
static struct omap_hwmod omap2420_timer7_hwmod = { static struct omap_hwmod omap2420_i2c1_hwmod = {
.name = "timer7", .name = "i2c1",
.mpu_irqs = omap2_timer7_mpu_irqs, .mpu_irqs = omap2_i2c1_mpu_irqs,
.main_clk = "gpt7_fck", .sdma_reqs = omap2_i2c1_sdma_reqs,
.main_clk = "i2c1_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT7_SHIFT,
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2420_timer7_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_timer7_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* timer8 */
static struct omap_hwmod omap2420_timer8_hwmod;
/* l4_core -> timer8 */
static struct omap_hwmod_ocp_if omap2420_l4_core__timer8 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_timer8_hwmod,
.clk = "gpt8_ick",
.addr = omap2xxx_timer8_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* timer8 slave port */
static struct omap_hwmod_ocp_if *omap2420_timer8_slaves[] = {
&omap2420_l4_core__timer8,
};
/* timer8 hwmod */
static struct omap_hwmod omap2420_timer8_hwmod = {
.name = "timer8",
.mpu_irqs = omap2_timer8_mpu_irqs,
.main_clk = "gpt8_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT8_SHIFT, .module_bit = OMAP2420_EN_I2C1_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT, .idlest_idle_bit = OMAP2420_ST_I2C1_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr, .class = &i2c_class,
.slaves = omap2420_timer8_slaves, .dev_attr = &i2c_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap2420_timer8_slaves), .flags = HWMOD_16BIT_REG,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer9 */
static struct omap_hwmod omap2420_timer9_hwmod;
/* l4_core -> timer9 */
static struct omap_hwmod_ocp_if omap2420_l4_core__timer9 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_timer9_hwmod,
.clk = "gpt9_ick",
.addr = omap2xxx_timer9_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* timer9 slave port */
static struct omap_hwmod_ocp_if *omap2420_timer9_slaves[] = {
&omap2420_l4_core__timer9,
}; };
/* timer9 hwmod */ /* I2C2 */
static struct omap_hwmod omap2420_timer9_hwmod = { static struct omap_hwmod omap2420_i2c2_hwmod = {
.name = "timer9", .name = "i2c2",
.mpu_irqs = omap2_timer9_mpu_irqs, .mpu_irqs = omap2_i2c2_mpu_irqs,
.main_clk = "gpt9_fck", .sdma_reqs = omap2_i2c2_sdma_reqs,
.main_clk = "i2c2_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT9_SHIFT,
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.slaves = omap2420_timer9_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_timer9_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* timer10 */
static struct omap_hwmod omap2420_timer10_hwmod;
/* l4_core -> timer10 */
static struct omap_hwmod_ocp_if omap2420_l4_core__timer10 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_timer10_hwmod,
.clk = "gpt10_ick",
.addr = omap2_timer10_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* timer10 slave port */
static struct omap_hwmod_ocp_if *omap2420_timer10_slaves[] = {
&omap2420_l4_core__timer10,
};
/* timer10 hwmod */
static struct omap_hwmod omap2420_timer10_hwmod = {
.name = "timer10",
.mpu_irqs = omap2_timer10_mpu_irqs,
.main_clk = "gpt10_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT10_SHIFT, .module_bit = OMAP2420_EN_I2C2_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT, .idlest_idle_bit = OMAP2420_ST_I2C2_SHIFT,
}, },
}, },
.dev_attr = &capability_pwm_dev_attr, .class = &i2c_class,
.slaves = omap2420_timer10_slaves, .dev_attr = &i2c_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap2420_timer10_slaves), .flags = HWMOD_16BIT_REG,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer11 */
static struct omap_hwmod omap2420_timer11_hwmod;
/* l4_core -> timer11 */
static struct omap_hwmod_ocp_if omap2420_l4_core__timer11 = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_timer11_hwmod,
.clk = "gpt11_ick",
.addr = omap2_timer11_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* timer11 slave port */
static struct omap_hwmod_ocp_if *omap2420_timer11_slaves[] = {
&omap2420_l4_core__timer11,
}; };
/* timer11 hwmod */ /* dma attributes */
static struct omap_hwmod omap2420_timer11_hwmod = { static struct omap_dma_dev_attr dma_dev_attr = {
.name = "timer11", .dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
.mpu_irqs = omap2_timer11_mpu_irqs, IS_CSSA_32 | IS_CDSA_32,
.main_clk = "gpt11_fck", .lch_count = 32,
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT11_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.slaves = omap2420_timer11_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_timer11_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* timer12 */ static struct omap_hwmod omap2420_dma_system_hwmod = {
static struct omap_hwmod omap2420_timer12_hwmod; .name = "dma",
.class = &omap2xxx_dma_hwmod_class,
/* l4_core -> timer12 */ .mpu_irqs = omap2_dma_system_irqs,
static struct omap_hwmod_ocp_if omap2420_l4_core__timer12 = { .main_clk = "core_l3_ck",
.master = &omap2420_l4_core_hwmod, .dev_attr = &dma_dev_attr,
.slave = &omap2420_timer12_hwmod, .flags = HWMOD_NO_IDLEST,
.clk = "gpt12_ick",
.addr = omap2xxx_timer12_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer12 slave port */ /* mailbox */
static struct omap_hwmod_ocp_if *omap2420_timer12_slaves[] = { static struct omap_hwmod_irq_info omap2420_mailbox_irqs[] = {
&omap2420_l4_core__timer12, { .name = "dsp", .irq = 26 },
{ .name = "iva", .irq = 34 },
{ .irq = -1 }
}; };
/* timer12 hwmod */ static struct omap_hwmod omap2420_mailbox_hwmod = {
static struct omap_hwmod omap2420_timer12_hwmod = { .name = "mailbox",
.name = "timer12", .class = &omap2xxx_mailbox_hwmod_class,
.mpu_irqs = omap2xxx_timer12_mpu_irqs, .mpu_irqs = omap2420_mailbox_irqs,
.main_clk = "gpt12_fck", .main_clk = "mailboxes_ick",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT12_SHIFT, .module_bit = OMAP24XX_EN_MAILBOXES_SHIFT,
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT, .idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT,
}, },
}, },
.dev_attr = &capability_pwm_dev_attr,
.slaves = omap2420_timer12_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_timer12_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* l4_wkup -> wd_timer2 */
static struct omap_hwmod_addr_space omap2420_wd_timer2_addrs[] = {
{
.pa_start = 0x48022000,
.pa_end = 0x4802207f,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod_ocp_if omap2420_l4_wkup__wd_timer2 = { /*
.master = &omap2420_l4_wkup_hwmod, * 'mcbsp' class
.slave = &omap2420_wd_timer2_hwmod, * multi channel buffered serial port controller
.clk = "mpu_wdt_ick", */
.addr = omap2420_wd_timer2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* wd_timer2 */
static struct omap_hwmod_ocp_if *omap2420_wd_timer2_slaves[] = {
&omap2420_l4_wkup__wd_timer2,
};
static struct omap_hwmod omap2420_wd_timer2_hwmod = { static struct omap_hwmod_class omap2420_mcbsp_hwmod_class = {
.name = "wd_timer2", .name = "mcbsp",
.class = &omap2xxx_wd_timer_hwmod_class,
.main_clk = "mpu_wdt_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MPU_WDT_SHIFT,
},
},
.slaves = omap2420_wd_timer2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_wd_timer2_slaves),
}; };
/* UART1 */ /* mcbsp1 */
static struct omap_hwmod_irq_info omap2420_mcbsp1_irqs[] = {
static struct omap_hwmod_ocp_if *omap2420_uart1_slaves[] = { { .name = "tx", .irq = 59 },
&omap2_l4_core__uart1, { .name = "rx", .irq = 60 },
{ .irq = -1 }
}; };
static struct omap_hwmod omap2420_uart1_hwmod = { static struct omap_hwmod omap2420_mcbsp1_hwmod = {
.name = "uart1", .name = "mcbsp1",
.mpu_irqs = omap2_uart1_mpu_irqs, .class = &omap2420_mcbsp_hwmod_class,
.sdma_reqs = omap2_uart1_sdma_reqs, .mpu_irqs = omap2420_mcbsp1_irqs,
.main_clk = "uart1_fck", .sdma_reqs = omap2_mcbsp1_sdma_reqs,
.main_clk = "mcbsp1_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_UART1_SHIFT, .module_bit = OMAP24XX_EN_MCBSP1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_EN_UART1_SHIFT,
},
},
.slaves = omap2420_uart1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_uart1_slaves),
.class = &omap2_uart_class,
};
/* UART2 */
static struct omap_hwmod_ocp_if *omap2420_uart2_slaves[] = {
&omap2_l4_core__uart2,
};
static struct omap_hwmod omap2420_uart2_hwmod = {
.name = "uart2",
.mpu_irqs = omap2_uart2_mpu_irqs,
.sdma_reqs = omap2_uart2_sdma_reqs,
.main_clk = "uart2_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_UART2_SHIFT,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_EN_UART2_SHIFT, .idlest_idle_bit = OMAP24XX_ST_MCBSP1_SHIFT,
},
},
.slaves = omap2420_uart2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_uart2_slaves),
.class = &omap2_uart_class,
};
/* UART3 */
static struct omap_hwmod_ocp_if *omap2420_uart3_slaves[] = {
&omap2_l4_core__uart3,
};
static struct omap_hwmod omap2420_uart3_hwmod = {
.name = "uart3",
.mpu_irqs = omap2_uart3_mpu_irqs,
.sdma_reqs = omap2_uart3_sdma_reqs,
.main_clk = "uart3_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 2,
.module_bit = OMAP24XX_EN_UART3_SHIFT,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP24XX_EN_UART3_SHIFT,
}, },
}, },
.slaves = omap2420_uart3_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_uart3_slaves),
.class = &omap2_uart_class,
};
/* dss */
/* dss master ports */
static struct omap_hwmod_ocp_if *omap2420_dss_masters[] = {
&omap2420_dss__l3,
}; };
/* l4_core -> dss */ /* mcbsp2 */
static struct omap_hwmod_ocp_if omap2420_l4_core__dss = { static struct omap_hwmod_irq_info omap2420_mcbsp2_irqs[] = {
.master = &omap2420_l4_core_hwmod, { .name = "tx", .irq = 62 },
.slave = &omap2420_dss_core_hwmod, { .name = "rx", .irq = 63 },
.clk = "dss_ick", { .irq = -1 }
.addr = omap2_dss_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP2420_L4_CORE_FW_DSS_CORE_REGION,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* dss slave ports */
static struct omap_hwmod_ocp_if *omap2420_dss_slaves[] = {
&omap2420_l4_core__dss,
};
static struct omap_hwmod_opt_clk dss_opt_clks[] = {
/*
* The DSS HW needs all DSS clocks enabled during reset. The dss_core
* driver does not use these clocks.
*/
{ .role = "tv_clk", .clk = "dss_54m_fck" },
{ .role = "sys_clk", .clk = "dss2_fck" },
}; };
static struct omap_hwmod omap2420_dss_core_hwmod = { static struct omap_hwmod omap2420_mcbsp2_hwmod = {
.name = "dss_core", .name = "mcbsp2",
.class = &omap2_dss_hwmod_class, .class = &omap2420_mcbsp_hwmod_class,
.main_clk = "dss1_fck", /* instead of dss_fck */ .mpu_irqs = omap2420_mcbsp2_irqs,
.sdma_reqs = omap2xxx_dss_sdma_chs, .sdma_reqs = omap2_mcbsp2_sdma_reqs,
.main_clk = "mcbsp2_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT, .module_bit = OMAP24XX_EN_MCBSP2_SHIFT,
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_stdby_bit = OMAP24XX_ST_DSS_SHIFT, .idlest_idle_bit = OMAP24XX_ST_MCBSP2_SHIFT,
}, },
}, },
.opt_clks = dss_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
.slaves = omap2420_dss_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_dss_slaves),
.masters = omap2420_dss_masters,
.masters_cnt = ARRAY_SIZE(omap2420_dss_masters),
.flags = HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
}; };
/* l4_core -> dss_dispc */ /*
static struct omap_hwmod_ocp_if omap2420_l4_core__dss_dispc = { * interfaces
.master = &omap2420_l4_core_hwmod, */
.slave = &omap2420_dss_dispc_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_dispc_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP2420_L4_CORE_FW_DSS_DISPC_REGION,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* dss_dispc slave ports */
static struct omap_hwmod_ocp_if *omap2420_dss_dispc_slaves[] = {
&omap2420_l4_core__dss_dispc,
};
static struct omap_hwmod omap2420_dss_dispc_hwmod = {
.name = "dss_dispc",
.class = &omap2_dispc_hwmod_class,
.mpu_irqs = omap2_dispc_irqs,
.main_clk = "dss1_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_stdby_bit = OMAP24XX_ST_DSS_SHIFT,
},
},
.slaves = omap2420_dss_dispc_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_dss_dispc_slaves),
.flags = HWMOD_NO_IDLEST,
.dev_attr = &omap2_3_dss_dispc_dev_attr
};
/* l4_core -> dss_rfbi */ /* L4 CORE -> I2C1 interface */
static struct omap_hwmod_ocp_if omap2420_l4_core__dss_rfbi = { static struct omap_hwmod_ocp_if omap2420_l4_core__i2c1 = {
.master = &omap2420_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2420_dss_rfbi_hwmod, .slave = &omap2420_i2c1_hwmod,
.clk = "dss_ick", .clk = "i2c1_ick",
.addr = omap2_dss_rfbi_addrs, .addr = omap2_i2c1_addr_space,
.fw = {
.omap2 = {
.l4_fw_region = OMAP2420_L4_CORE_FW_DSS_CORE_REGION,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dss_rfbi slave ports */ /* L4 CORE -> I2C2 interface */
static struct omap_hwmod_ocp_if *omap2420_dss_rfbi_slaves[] = { static struct omap_hwmod_ocp_if omap2420_l4_core__i2c2 = {
&omap2420_l4_core__dss_rfbi, .master = &omap2xxx_l4_core_hwmod,
}; .slave = &omap2420_i2c2_hwmod,
.clk = "i2c2_ick",
static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = { .addr = omap2_i2c2_addr_space,
{ .role = "ick", .clk = "dss_ick" },
};
static struct omap_hwmod omap2420_dss_rfbi_hwmod = {
.name = "dss_rfbi",
.class = &omap2_rfbi_hwmod_class,
.main_clk = "dss1_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
},
},
.opt_clks = dss_rfbi_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks),
.slaves = omap2420_dss_rfbi_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_dss_rfbi_slaves),
.flags = HWMOD_NO_IDLEST,
};
/* l4_core -> dss_venc */
static struct omap_hwmod_ocp_if omap2420_l4_core__dss_venc = {
.master = &omap2420_l4_core_hwmod,
.slave = &omap2420_dss_venc_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_venc_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP2420_L4_CORE_FW_DSS_VENC_REGION,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dss_venc slave ports */ /* IVA <- L3 interface */
static struct omap_hwmod_ocp_if *omap2420_dss_venc_slaves[] = { static struct omap_hwmod_ocp_if omap2420_l3__iva = {
&omap2420_l4_core__dss_venc, .master = &omap2xxx_l3_main_hwmod,
}; .slave = &omap2420_iva_hwmod,
.clk = "core_l3_ck",
static struct omap_hwmod omap2420_dss_venc_hwmod = { .user = OCP_USER_MPU | OCP_USER_SDMA,
.name = "dss_venc",
.class = &omap2_venc_hwmod_class,
.main_clk = "dss_54m_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
},
},
.slaves = omap2420_dss_venc_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_dss_venc_slaves),
.flags = HWMOD_NO_IDLEST,
};
/* I2C common */
static struct omap_hwmod_class_sysconfig i2c_sysc = {
.rev_offs = 0x00,
.sysc_offs = 0x20,
.syss_offs = 0x10,
.sysc_flags = (SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
.sysc_fields = &omap_hwmod_sysc_type1,
};
static struct omap_hwmod_class i2c_class = {
.name = "i2c",
.sysc = &i2c_sysc,
.rev = OMAP_I2C_IP_VERSION_1,
.reset = &omap_i2c_reset,
};
static struct omap_i2c_dev_attr i2c_dev_attr = {
.flags = OMAP_I2C_FLAG_NO_FIFO |
OMAP_I2C_FLAG_SIMPLE_CLOCK |
OMAP_I2C_FLAG_16BIT_DATA_REG |
OMAP_I2C_FLAG_BUS_SHIFT_2,
};
/* I2C1 */
static struct omap_hwmod_ocp_if *omap2420_i2c1_slaves[] = {
&omap2420_l4_core__i2c1,
};
static struct omap_hwmod omap2420_i2c1_hwmod = {
.name = "i2c1",
.mpu_irqs = omap2_i2c1_mpu_irqs,
.sdma_reqs = omap2_i2c1_sdma_reqs,
.main_clk = "i2c1_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP2420_EN_I2C1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP2420_ST_I2C1_SHIFT,
},
},
.slaves = omap2420_i2c1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_i2c1_slaves),
.class = &i2c_class,
.dev_attr = &i2c_dev_attr,
.flags = HWMOD_16BIT_REG,
}; };
/* I2C2 */ /* DSP <- L3 interface */
static struct omap_hwmod_ocp_if omap2420_l3__dsp = {
.master = &omap2xxx_l3_main_hwmod,
.slave = &omap2420_dsp_hwmod,
.clk = "dsp_ick",
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
static struct omap_hwmod_ocp_if *omap2420_i2c2_slaves[] = { static struct omap_hwmod_addr_space omap2420_timer1_addrs[] = {
&omap2420_l4_core__i2c2, {
.pa_start = 0x48028000,
.pa_end = 0x48028000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod omap2420_i2c2_hwmod = { /* l4_wkup -> timer1 */
.name = "i2c2", static struct omap_hwmod_ocp_if omap2420_l4_wkup__timer1 = {
.mpu_irqs = omap2_i2c2_mpu_irqs, .master = &omap2xxx_l4_wkup_hwmod,
.sdma_reqs = omap2_i2c2_sdma_reqs, .slave = &omap2xxx_timer1_hwmod,
.main_clk = "i2c2_fck", .clk = "gpt1_ick",
.prcm = { .addr = omap2420_timer1_addrs,
.omap2 = { .user = OCP_USER_MPU | OCP_USER_SDMA,
.module_offs = CORE_MOD, };
.prcm_reg_id = 1,
.module_bit = OMAP2420_EN_I2C2_SHIFT, /* l4_wkup -> wd_timer2 */
.idlest_reg_id = 1, static struct omap_hwmod_addr_space omap2420_wd_timer2_addrs[] = {
.idlest_idle_bit = OMAP2420_ST_I2C2_SHIFT, {
}, .pa_start = 0x48022000,
.pa_end = 0x4802207f,
.flags = ADDR_TYPE_RT
}, },
.slaves = omap2420_i2c2_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap2420_i2c2_slaves), };
.class = &i2c_class,
.dev_attr = &i2c_dev_attr, static struct omap_hwmod_ocp_if omap2420_l4_wkup__wd_timer2 = {
.flags = HWMOD_16BIT_REG, .master = &omap2xxx_l4_wkup_hwmod,
.slave = &omap2xxx_wd_timer2_hwmod,
.clk = "mpu_wdt_ick",
.addr = omap2420_wd_timer2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* l4_wkup -> gpio1 */ /* l4_wkup -> gpio1 */
...@@ -1112,8 +324,8 @@ static struct omap_hwmod_addr_space omap2420_gpio1_addr_space[] = { ...@@ -1112,8 +324,8 @@ static struct omap_hwmod_addr_space omap2420_gpio1_addr_space[] = {
}; };
static struct omap_hwmod_ocp_if omap2420_l4_wkup__gpio1 = { static struct omap_hwmod_ocp_if omap2420_l4_wkup__gpio1 = {
.master = &omap2420_l4_wkup_hwmod, .master = &omap2xxx_l4_wkup_hwmod,
.slave = &omap2420_gpio1_hwmod, .slave = &omap2xxx_gpio1_hwmod,
.clk = "gpios_ick", .clk = "gpios_ick",
.addr = omap2420_gpio1_addr_space, .addr = omap2420_gpio1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
...@@ -1130,8 +342,8 @@ static struct omap_hwmod_addr_space omap2420_gpio2_addr_space[] = { ...@@ -1130,8 +342,8 @@ static struct omap_hwmod_addr_space omap2420_gpio2_addr_space[] = {
}; };
static struct omap_hwmod_ocp_if omap2420_l4_wkup__gpio2 = { static struct omap_hwmod_ocp_if omap2420_l4_wkup__gpio2 = {
.master = &omap2420_l4_wkup_hwmod, .master = &omap2xxx_l4_wkup_hwmod,
.slave = &omap2420_gpio2_hwmod, .slave = &omap2xxx_gpio2_hwmod,
.clk = "gpios_ick", .clk = "gpios_ick",
.addr = omap2420_gpio2_addr_space, .addr = omap2420_gpio2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
...@@ -1148,8 +360,8 @@ static struct omap_hwmod_addr_space omap2420_gpio3_addr_space[] = { ...@@ -1148,8 +360,8 @@ static struct omap_hwmod_addr_space omap2420_gpio3_addr_space[] = {
}; };
static struct omap_hwmod_ocp_if omap2420_l4_wkup__gpio3 = { static struct omap_hwmod_ocp_if omap2420_l4_wkup__gpio3 = {
.master = &omap2420_l4_wkup_hwmod, .master = &omap2xxx_l4_wkup_hwmod,
.slave = &omap2420_gpio3_hwmod, .slave = &omap2xxx_gpio3_hwmod,
.clk = "gpios_ick", .clk = "gpios_ick",
.addr = omap2420_gpio3_addr_space, .addr = omap2420_gpio3_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
...@@ -1166,408 +378,100 @@ static struct omap_hwmod_addr_space omap2420_gpio4_addr_space[] = { ...@@ -1166,408 +378,100 @@ static struct omap_hwmod_addr_space omap2420_gpio4_addr_space[] = {
}; };
static struct omap_hwmod_ocp_if omap2420_l4_wkup__gpio4 = { static struct omap_hwmod_ocp_if omap2420_l4_wkup__gpio4 = {
.master = &omap2420_l4_wkup_hwmod, .master = &omap2xxx_l4_wkup_hwmod,
.slave = &omap2420_gpio4_hwmod, .slave = &omap2xxx_gpio4_hwmod,
.clk = "gpios_ick", .clk = "gpios_ick",
.addr = omap2420_gpio4_addr_space, .addr = omap2420_gpio4_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* gpio dev_attr */
static struct omap_gpio_dev_attr gpio_dev_attr = {
.bank_width = 32,
.dbck_flag = false,
};
/* gpio1 */
static struct omap_hwmod_ocp_if *omap2420_gpio1_slaves[] = {
&omap2420_l4_wkup__gpio1,
};
static struct omap_hwmod omap2420_gpio1_hwmod = {
.name = "gpio1",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio1_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.slaves = omap2420_gpio1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_gpio1_slaves),
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* gpio2 */
static struct omap_hwmod_ocp_if *omap2420_gpio2_slaves[] = {
&omap2420_l4_wkup__gpio2,
};
static struct omap_hwmod omap2420_gpio2_hwmod = {
.name = "gpio2",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio2_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.slaves = omap2420_gpio2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_gpio2_slaves),
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* gpio3 */
static struct omap_hwmod_ocp_if *omap2420_gpio3_slaves[] = {
&omap2420_l4_wkup__gpio3,
};
static struct omap_hwmod omap2420_gpio3_hwmod = {
.name = "gpio3",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio3_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.slaves = omap2420_gpio3_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_gpio3_slaves),
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* gpio4 */
static struct omap_hwmod_ocp_if *omap2420_gpio4_slaves[] = {
&omap2420_l4_wkup__gpio4,
};
static struct omap_hwmod omap2420_gpio4_hwmod = {
.name = "gpio4",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio4_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.slaves = omap2420_gpio4_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_gpio4_slaves),
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* dma attributes */
static struct omap_dma_dev_attr dma_dev_attr = {
.dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
IS_CSSA_32 | IS_CDSA_32,
.lch_count = 32,
};
/* dma_system -> L3 */ /* dma_system -> L3 */
static struct omap_hwmod_ocp_if omap2420_dma_system__l3 = { static struct omap_hwmod_ocp_if omap2420_dma_system__l3 = {
.master = &omap2420_dma_system_hwmod, .master = &omap2420_dma_system_hwmod,
.slave = &omap2420_l3_main_hwmod, .slave = &omap2xxx_l3_main_hwmod,
.clk = "core_l3_ck", .clk = "core_l3_ck",
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dma_system master ports */
static struct omap_hwmod_ocp_if *omap2420_dma_system_masters[] = {
&omap2420_dma_system__l3,
};
/* l4_core -> dma_system */ /* l4_core -> dma_system */
static struct omap_hwmod_ocp_if omap2420_l4_core__dma_system = { static struct omap_hwmod_ocp_if omap2420_l4_core__dma_system = {
.master = &omap2420_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2420_dma_system_hwmod, .slave = &omap2420_dma_system_hwmod,
.clk = "sdma_ick", .clk = "sdma_ick",
.addr = omap2_dma_system_addrs, .addr = omap2_dma_system_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dma_system slave ports */
static struct omap_hwmod_ocp_if *omap2420_dma_system_slaves[] = {
&omap2420_l4_core__dma_system,
};
static struct omap_hwmod omap2420_dma_system_hwmod = {
.name = "dma",
.class = &omap2xxx_dma_hwmod_class,
.mpu_irqs = omap2_dma_system_irqs,
.main_clk = "core_l3_ck",
.slaves = omap2420_dma_system_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_dma_system_slaves),
.masters = omap2420_dma_system_masters,
.masters_cnt = ARRAY_SIZE(omap2420_dma_system_masters),
.dev_attr = &dma_dev_attr,
.flags = HWMOD_NO_IDLEST,
};
/* mailbox */
static struct omap_hwmod omap2420_mailbox_hwmod;
static struct omap_hwmod_irq_info omap2420_mailbox_irqs[] = {
{ .name = "dsp", .irq = 26 },
{ .name = "iva", .irq = 34 },
{ .irq = -1 }
};
/* l4_core -> mailbox */ /* l4_core -> mailbox */
static struct omap_hwmod_ocp_if omap2420_l4_core__mailbox = { static struct omap_hwmod_ocp_if omap2420_l4_core__mailbox = {
.master = &omap2420_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2420_mailbox_hwmod, .slave = &omap2420_mailbox_hwmod,
.addr = omap2_mailbox_addrs, .addr = omap2_mailbox_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mailbox slave ports */
static struct omap_hwmod_ocp_if *omap2420_mailbox_slaves[] = {
&omap2420_l4_core__mailbox,
};
static struct omap_hwmod omap2420_mailbox_hwmod = {
.name = "mailbox",
.class = &omap2xxx_mailbox_hwmod_class,
.mpu_irqs = omap2420_mailbox_irqs,
.main_clk = "mailboxes_ick",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MAILBOXES_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT,
},
},
.slaves = omap2420_mailbox_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_mailbox_slaves),
};
/* mcspi1 */
static struct omap_hwmod_ocp_if *omap2420_mcspi1_slaves[] = {
&omap2420_l4_core__mcspi1,
};
static struct omap2_mcspi_dev_attr omap_mcspi1_dev_attr = {
.num_chipselect = 4,
};
static struct omap_hwmod omap2420_mcspi1_hwmod = {
.name = "mcspi1_hwmod",
.mpu_irqs = omap2_mcspi1_mpu_irqs,
.sdma_reqs = omap2_mcspi1_sdma_reqs,
.main_clk = "mcspi1_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MCSPI1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MCSPI1_SHIFT,
},
},
.slaves = omap2420_mcspi1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_mcspi1_slaves),
.class = &omap2xxx_mcspi_class,
.dev_attr = &omap_mcspi1_dev_attr,
};
/* mcspi2 */
static struct omap_hwmod_ocp_if *omap2420_mcspi2_slaves[] = {
&omap2420_l4_core__mcspi2,
};
static struct omap2_mcspi_dev_attr omap_mcspi2_dev_attr = {
.num_chipselect = 2,
};
static struct omap_hwmod omap2420_mcspi2_hwmod = {
.name = "mcspi2_hwmod",
.mpu_irqs = omap2_mcspi2_mpu_irqs,
.sdma_reqs = omap2_mcspi2_sdma_reqs,
.main_clk = "mcspi2_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MCSPI2_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MCSPI2_SHIFT,
},
},
.slaves = omap2420_mcspi2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_mcspi2_slaves),
.class = &omap2xxx_mcspi_class,
.dev_attr = &omap_mcspi2_dev_attr,
};
/*
* 'mcbsp' class
* multi channel buffered serial port controller
*/
static struct omap_hwmod_class omap2420_mcbsp_hwmod_class = {
.name = "mcbsp",
};
/* mcbsp1 */
static struct omap_hwmod_irq_info omap2420_mcbsp1_irqs[] = {
{ .name = "tx", .irq = 59 },
{ .name = "rx", .irq = 60 },
{ .irq = -1 }
};
/* l4_core -> mcbsp1 */ /* l4_core -> mcbsp1 */
static struct omap_hwmod_ocp_if omap2420_l4_core__mcbsp1 = { static struct omap_hwmod_ocp_if omap2420_l4_core__mcbsp1 = {
.master = &omap2420_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2420_mcbsp1_hwmod, .slave = &omap2420_mcbsp1_hwmod,
.clk = "mcbsp1_ick", .clk = "mcbsp1_ick",
.addr = omap2_mcbsp1_addrs, .addr = omap2_mcbsp1_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mcbsp1 slave ports */
static struct omap_hwmod_ocp_if *omap2420_mcbsp1_slaves[] = {
&omap2420_l4_core__mcbsp1,
};
static struct omap_hwmod omap2420_mcbsp1_hwmod = {
.name = "mcbsp1",
.class = &omap2420_mcbsp_hwmod_class,
.mpu_irqs = omap2420_mcbsp1_irqs,
.sdma_reqs = omap2_mcbsp1_sdma_reqs,
.main_clk = "mcbsp1_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MCBSP1_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MCBSP1_SHIFT,
},
},
.slaves = omap2420_mcbsp1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_mcbsp1_slaves),
};
/* mcbsp2 */
static struct omap_hwmod_irq_info omap2420_mcbsp2_irqs[] = {
{ .name = "tx", .irq = 62 },
{ .name = "rx", .irq = 63 },
{ .irq = -1 }
};
/* l4_core -> mcbsp2 */ /* l4_core -> mcbsp2 */
static struct omap_hwmod_ocp_if omap2420_l4_core__mcbsp2 = { static struct omap_hwmod_ocp_if omap2420_l4_core__mcbsp2 = {
.master = &omap2420_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2420_mcbsp2_hwmod, .slave = &omap2420_mcbsp2_hwmod,
.clk = "mcbsp2_ick", .clk = "mcbsp2_ick",
.addr = omap2xxx_mcbsp2_addrs, .addr = omap2xxx_mcbsp2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mcbsp2 slave ports */ static struct omap_hwmod_ocp_if *omap2420_hwmod_ocp_ifs[] __initdata = {
static struct omap_hwmod_ocp_if *omap2420_mcbsp2_slaves[] = { &omap2xxx_l3_main__l4_core,
&omap2xxx_mpu__l3_main,
&omap2xxx_dss__l3,
&omap2xxx_l4_core__mcspi1,
&omap2xxx_l4_core__mcspi2,
&omap2xxx_l4_core__l4_wkup,
&omap2_l4_core__uart1,
&omap2_l4_core__uart2,
&omap2_l4_core__uart3,
&omap2420_l4_core__i2c1,
&omap2420_l4_core__i2c2,
&omap2420_l3__iva,
&omap2420_l3__dsp,
&omap2420_l4_wkup__timer1,
&omap2xxx_l4_core__timer2,
&omap2xxx_l4_core__timer3,
&omap2xxx_l4_core__timer4,
&omap2xxx_l4_core__timer5,
&omap2xxx_l4_core__timer6,
&omap2xxx_l4_core__timer7,
&omap2xxx_l4_core__timer8,
&omap2xxx_l4_core__timer9,
&omap2xxx_l4_core__timer10,
&omap2xxx_l4_core__timer11,
&omap2xxx_l4_core__timer12,
&omap2420_l4_wkup__wd_timer2,
&omap2xxx_l4_core__dss,
&omap2xxx_l4_core__dss_dispc,
&omap2xxx_l4_core__dss_rfbi,
&omap2xxx_l4_core__dss_venc,
&omap2420_l4_wkup__gpio1,
&omap2420_l4_wkup__gpio2,
&omap2420_l4_wkup__gpio3,
&omap2420_l4_wkup__gpio4,
&omap2420_dma_system__l3,
&omap2420_l4_core__dma_system,
&omap2420_l4_core__mailbox,
&omap2420_l4_core__mcbsp1,
&omap2420_l4_core__mcbsp2, &omap2420_l4_core__mcbsp2,
};
static struct omap_hwmod omap2420_mcbsp2_hwmod = {
.name = "mcbsp2",
.class = &omap2420_mcbsp_hwmod_class,
.mpu_irqs = omap2420_mcbsp2_irqs,
.sdma_reqs = omap2_mcbsp2_sdma_reqs,
.main_clk = "mcbsp2_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MCBSP2_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MCBSP2_SHIFT,
},
},
.slaves = omap2420_mcbsp2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2420_mcbsp2_slaves),
};
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_timer1_hwmod,
&omap2420_timer2_hwmod,
&omap2420_timer3_hwmod,
&omap2420_timer4_hwmod,
&omap2420_timer5_hwmod,
&omap2420_timer6_hwmod,
&omap2420_timer7_hwmod,
&omap2420_timer8_hwmod,
&omap2420_timer9_hwmod,
&omap2420_timer10_hwmod,
&omap2420_timer11_hwmod,
&omap2420_timer12_hwmod,
&omap2420_wd_timer2_hwmod,
&omap2420_uart1_hwmod,
&omap2420_uart2_hwmod,
&omap2420_uart3_hwmod,
/* dss class */
&omap2420_dss_core_hwmod,
&omap2420_dss_dispc_hwmod,
&omap2420_dss_rfbi_hwmod,
&omap2420_dss_venc_hwmod,
/* i2c class */
&omap2420_i2c1_hwmod,
&omap2420_i2c2_hwmod,
/* gpio class */
&omap2420_gpio1_hwmod,
&omap2420_gpio2_hwmod,
&omap2420_gpio3_hwmod,
&omap2420_gpio4_hwmod,
/* dma_system class*/
&omap2420_dma_system_hwmod,
/* mailbox class */
&omap2420_mailbox_hwmod,
/* mcbsp class */
&omap2420_mcbsp1_hwmod,
&omap2420_mcbsp2_hwmod,
/* mcspi class */
&omap2420_mcspi1_hwmod,
&omap2420_mcspi2_hwmod,
NULL, NULL,
}; };
int __init omap2420_hwmod_init(void) int __init omap2420_hwmod_init(void)
{ {
return omap_hwmod_register(omap2420_hwmods); return omap_hwmod_register_links(omap2420_hwmod_ocp_ifs);
} }
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* omap_hwmod_2430_data.c - hardware modules present on the OMAP2430 chips * omap_hwmod_2430_data.c - hardware modules present on the OMAP2430 chips
* *
* Copyright (C) 2009-2011 Nokia Corporation * Copyright (C) 2009-2011 Nokia Corporation
* Copyright (C) 2012 Texas Instruments, Inc.
* Paul Walmsley * Paul Walmsley
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -33,777 +34,600 @@ ...@@ -33,777 +34,600 @@
/* /*
* OMAP2430 hardware module integration data * OMAP2430 hardware module integration data
* *
* ALl of the data in this section should be autogeneratable from the * All of the data in this section should be autogeneratable from the
* TI hardware database or other technical documentation. Data that * TI hardware database or other technical documentation. Data that
* is driver-specific or driver-kernel integration-specific belongs * is driver-specific or driver-kernel integration-specific belongs
* elsewhere. * elsewhere.
*/ */
static struct omap_hwmod omap2430_mpu_hwmod; /*
static struct omap_hwmod omap2430_iva_hwmod; * IP blocks
static struct omap_hwmod omap2430_l3_main_hwmod; */
static struct omap_hwmod omap2430_l4_core_hwmod;
static struct omap_hwmod omap2430_dss_core_hwmod;
static struct omap_hwmod omap2430_dss_dispc_hwmod;
static struct omap_hwmod omap2430_dss_rfbi_hwmod;
static struct omap_hwmod omap2430_dss_venc_hwmod;
static struct omap_hwmod omap2430_wd_timer2_hwmod;
static struct omap_hwmod omap2430_gpio1_hwmod;
static struct omap_hwmod omap2430_gpio2_hwmod;
static struct omap_hwmod omap2430_gpio3_hwmod;
static struct omap_hwmod omap2430_gpio4_hwmod;
static struct omap_hwmod omap2430_gpio5_hwmod;
static struct omap_hwmod omap2430_dma_system_hwmod;
static struct omap_hwmod omap2430_mcbsp1_hwmod;
static struct omap_hwmod omap2430_mcbsp2_hwmod;
static struct omap_hwmod omap2430_mcbsp3_hwmod;
static struct omap_hwmod omap2430_mcbsp4_hwmod;
static struct omap_hwmod omap2430_mcbsp5_hwmod;
static struct omap_hwmod omap2430_mcspi1_hwmod;
static struct omap_hwmod omap2430_mcspi2_hwmod;
static struct omap_hwmod omap2430_mcspi3_hwmod;
static struct omap_hwmod omap2430_mmc1_hwmod;
static struct omap_hwmod omap2430_mmc2_hwmod;
/* L3 -> L4_CORE interface */
static struct omap_hwmod_ocp_if omap2430_l3_main__l4_core = {
.master = &omap2430_l3_main_hwmod,
.slave = &omap2430_l4_core_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* MPU -> L3 interface */ /* IVA2 (IVA2) */
static struct omap_hwmod_ocp_if omap2430_mpu__l3_main = { static struct omap_hwmod_rst_info omap2430_iva_resets[] = {
.master = &omap2430_mpu_hwmod, { .name = "logic", .rst_shift = 0 },
.slave = &omap2430_l3_main_hwmod, { .name = "mmu", .rst_shift = 1 },
.user = OCP_USER_MPU,
}; };
/* Slave interfaces on the L3 interconnect */ static struct omap_hwmod omap2430_iva_hwmod = {
static struct omap_hwmod_ocp_if *omap2430_l3_main_slaves[] = { .name = "iva",
&omap2430_mpu__l3_main, .class = &iva_hwmod_class,
.clkdm_name = "dsp_clkdm",
.rst_lines = omap2430_iva_resets,
.rst_lines_cnt = ARRAY_SIZE(omap2430_iva_resets),
.main_clk = "dsp_fck",
}; };
/* DSS -> l3 */ /* I2C common */
static struct omap_hwmod_ocp_if omap2430_dss__l3 = { static struct omap_hwmod_class_sysconfig i2c_sysc = {
.master = &omap2430_dss_core_hwmod, .rev_offs = 0x00,
.slave = &omap2430_l3_main_hwmod, .sysc_offs = 0x20,
.fw = { .syss_offs = 0x10,
.omap2 = { .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
.l3_perm_bit = OMAP2_L3_CORE_FW_CONNID_DSS, SYSS_HAS_RESET_STATUS),
.flags = OMAP_FIREWALL_L3, .sysc_fields = &omap_hwmod_sysc_type1,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* Master interfaces on the L3 interconnect */ static struct omap_hwmod_class i2c_class = {
static struct omap_hwmod_ocp_if *omap2430_l3_main_masters[] = { .name = "i2c",
&omap2430_l3_main__l4_core, .sysc = &i2c_sysc,
.rev = OMAP_I2C_IP_VERSION_1,
.reset = &omap_i2c_reset,
}; };
/* L3 */ static struct omap_i2c_dev_attr i2c_dev_attr = {
static struct omap_hwmod omap2430_l3_main_hwmod = { .fifo_depth = 8, /* bytes */
.name = "l3_main", .flags = OMAP_I2C_FLAG_APPLY_ERRATA_I207 |
.class = &l3_hwmod_class, OMAP_I2C_FLAG_BUS_SHIFT_2 |
.masters = omap2430_l3_main_masters, OMAP_I2C_FLAG_FORCE_19200_INT_CLK,
.masters_cnt = ARRAY_SIZE(omap2430_l3_main_masters),
.slaves = omap2430_l3_main_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_l3_main_slaves),
.flags = HWMOD_NO_IDLEST,
}; };
static struct omap_hwmod omap2430_l4_wkup_hwmod; /* I2C1 */
static struct omap_hwmod omap2430_uart1_hwmod; static struct omap_hwmod omap2430_i2c1_hwmod = {
static struct omap_hwmod omap2430_uart2_hwmod; .name = "i2c1",
static struct omap_hwmod omap2430_uart3_hwmod; .flags = HWMOD_16BIT_REG,
static struct omap_hwmod omap2430_i2c1_hwmod; .mpu_irqs = omap2_i2c1_mpu_irqs,
static struct omap_hwmod omap2430_i2c2_hwmod; .sdma_reqs = omap2_i2c1_sdma_reqs,
.main_clk = "i2chs1_fck",
static struct omap_hwmod omap2430_usbhsotg_hwmod; .prcm = {
.omap2 = {
/* l3_core -> usbhsotg interface */ /*
static struct omap_hwmod_ocp_if omap2430_usbhsotg__l3 = { * NOTE: The CM_FCLKEN* and CM_ICLKEN* for
.master = &omap2430_usbhsotg_hwmod, * I2CHS IP's do not follow the usual pattern.
.slave = &omap2430_l3_main_hwmod, * prcm_reg_id alone cannot be used to program
.clk = "core_l3_ck", * the iclk and fclk. Needs to be handled using
.user = OCP_USER_MPU, * additional flags when clk handling is moved
* to hwmod framework.
*/
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP2430_EN_I2CHS1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP2430_ST_I2CHS1_SHIFT,
},
},
.class = &i2c_class,
.dev_attr = &i2c_dev_attr,
}; };
/* L4 CORE -> I2C1 interface */ /* I2C2 */
static struct omap_hwmod_ocp_if omap2430_l4_core__i2c1 = { static struct omap_hwmod omap2430_i2c2_hwmod = {
.master = &omap2430_l4_core_hwmod, .name = "i2c2",
.slave = &omap2430_i2c1_hwmod, .flags = HWMOD_16BIT_REG,
.clk = "i2c1_ick", .mpu_irqs = omap2_i2c2_mpu_irqs,
.addr = omap2_i2c1_addr_space, .sdma_reqs = omap2_i2c2_sdma_reqs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .main_clk = "i2chs2_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP2430_EN_I2CHS2_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP2430_ST_I2CHS2_SHIFT,
},
},
.class = &i2c_class,
.dev_attr = &i2c_dev_attr,
}; };
/* L4 CORE -> I2C2 interface */ /* gpio5 */
static struct omap_hwmod_ocp_if omap2430_l4_core__i2c2 = { static struct omap_hwmod_irq_info omap243x_gpio5_irqs[] = {
.master = &omap2430_l4_core_hwmod, { .irq = 33 }, /* INT_24XX_GPIO_BANK5 */
.slave = &omap2430_i2c2_hwmod, { .irq = -1 }
.clk = "i2c2_ick",
.addr = omap2_i2c2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* L4_CORE -> L4_WKUP interface */ static struct omap_hwmod omap2430_gpio5_hwmod = {
static struct omap_hwmod_ocp_if omap2430_l4_core__l4_wkup = { .name = "gpio5",
.master = &omap2430_l4_core_hwmod, .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.slave = &omap2430_l4_wkup_hwmod, .mpu_irqs = omap243x_gpio5_irqs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .main_clk = "gpio5_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 2,
.module_bit = OMAP2430_EN_GPIO5_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP2430_ST_GPIO5_SHIFT,
},
},
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &omap2xxx_gpio_dev_attr,
}; };
/* L4 CORE -> UART1 interface */ /* dma attributes */
static struct omap_hwmod_ocp_if omap2_l4_core__uart1 = { static struct omap_dma_dev_attr dma_dev_attr = {
.master = &omap2430_l4_core_hwmod, .dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
.slave = &omap2430_uart1_hwmod, IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
.clk = "uart1_ick", .lch_count = 32,
.addr = omap2xxx_uart1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* L4 CORE -> UART2 interface */ static struct omap_hwmod omap2430_dma_system_hwmod = {
static struct omap_hwmod_ocp_if omap2_l4_core__uart2 = { .name = "dma",
.master = &omap2430_l4_core_hwmod, .class = &omap2xxx_dma_hwmod_class,
.slave = &omap2430_uart2_hwmod, .mpu_irqs = omap2_dma_system_irqs,
.clk = "uart2_ick", .main_clk = "core_l3_ck",
.addr = omap2xxx_uart2_addr_space, .dev_attr = &dma_dev_attr,
.user = OCP_USER_MPU | OCP_USER_SDMA, .flags = HWMOD_NO_IDLEST,
}; };
/* L4 PER -> UART3 interface */ /* mailbox */
static struct omap_hwmod_ocp_if omap2_l4_core__uart3 = { static struct omap_hwmod_irq_info omap2430_mailbox_irqs[] = {
.master = &omap2430_l4_core_hwmod, { .irq = 26 },
.slave = &omap2430_uart3_hwmod, { .irq = -1 }
.clk = "uart3_ick",
.addr = omap2xxx_uart3_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* static struct omap_hwmod omap2430_mailbox_hwmod = {
* usbhsotg interface data .name = "mailbox",
*/ .class = &omap2xxx_mailbox_hwmod_class,
static struct omap_hwmod_addr_space omap2430_usbhsotg_addrs[] = { .mpu_irqs = omap2430_mailbox_irqs,
{ .main_clk = "mailboxes_ick",
.pa_start = OMAP243X_HS_BASE, .prcm = {
.pa_end = OMAP243X_HS_BASE + SZ_4K - 1, .omap2 = {
.flags = ADDR_TYPE_RT .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MAILBOXES_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT,
},
}, },
{ }
}; };
/* l4_core ->usbhsotg interface */ /* mcspi3 */
static struct omap_hwmod_ocp_if omap2430_l4_core__usbhsotg = { static struct omap_hwmod_irq_info omap2430_mcspi3_mpu_irqs[] = {
.master = &omap2430_l4_core_hwmod, { .irq = 91 },
.slave = &omap2430_usbhsotg_hwmod, { .irq = -1 }
.clk = "usb_l4_ick",
.addr = omap2430_usbhsotg_addrs,
.user = OCP_USER_MPU,
}; };
static struct omap_hwmod_ocp_if *omap2430_usbhsotg_masters[] = { static struct omap_hwmod_dma_info omap2430_mcspi3_sdma_reqs[] = {
&omap2430_usbhsotg__l3, { .name = "tx0", .dma_req = 15 }, /* DMA_SPI3_TX0 */
{ .name = "rx0", .dma_req = 16 }, /* DMA_SPI3_RX0 */
{ .name = "tx1", .dma_req = 23 }, /* DMA_SPI3_TX1 */
{ .name = "rx1", .dma_req = 24 }, /* DMA_SPI3_RX1 */
{ .dma_req = -1 }
}; };
static struct omap_hwmod_ocp_if *omap2430_usbhsotg_slaves[] = { static struct omap2_mcspi_dev_attr omap_mcspi3_dev_attr = {
&omap2430_l4_core__usbhsotg, .num_chipselect = 2,
}; };
/* L4 CORE -> MMC1 interface */ static struct omap_hwmod omap2430_mcspi3_hwmod = {
static struct omap_hwmod_ocp_if omap2430_l4_core__mmc1 = { .name = "mcspi3",
.master = &omap2430_l4_core_hwmod, .mpu_irqs = omap2430_mcspi3_mpu_irqs,
.slave = &omap2430_mmc1_hwmod, .sdma_reqs = omap2430_mcspi3_sdma_reqs,
.clk = "mmchs1_ick", .main_clk = "mcspi3_fck",
.addr = omap2430_mmc1_addr_space, .prcm = {
.user = OCP_USER_MPU | OCP_USER_SDMA, .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 2,
.module_bit = OMAP2430_EN_MCSPI3_SHIFT,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP2430_ST_MCSPI3_SHIFT,
},
},
.class = &omap2xxx_mcspi_class,
.dev_attr = &omap_mcspi3_dev_attr,
}; };
/* L4 CORE -> MMC2 interface */ /* usbhsotg */
static struct omap_hwmod_ocp_if omap2430_l4_core__mmc2 = { static struct omap_hwmod_class_sysconfig omap2430_usbhsotg_sysc = {
.master = &omap2430_l4_core_hwmod, .rev_offs = 0x0400,
.slave = &omap2430_mmc2_hwmod, .sysc_offs = 0x0404,
.clk = "mmchs2_ick", .syss_offs = 0x0408,
.addr = omap2430_mmc2_addr_space, .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE|
.user = OCP_USER_MPU | OCP_USER_SDMA, SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_AUTOIDLE),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
/* Slave interfaces on the L4_CORE interconnect */ static struct omap_hwmod_class usbotg_class = {
static struct omap_hwmod_ocp_if *omap2430_l4_core_slaves[] = { .name = "usbotg",
&omap2430_l3_main__l4_core, .sysc = &omap2430_usbhsotg_sysc,
}; };
/* Master interfaces on the L4_CORE interconnect */ /* usb_otg_hs */
static struct omap_hwmod_ocp_if *omap2430_l4_core_masters[] = { static struct omap_hwmod_irq_info omap2430_usbhsotg_mpu_irqs[] = {
&omap2430_l4_core__l4_wkup,
&omap2430_l4_core__mmc1,
&omap2430_l4_core__mmc2,
};
/* L4 CORE */ { .name = "mc", .irq = 92 },
static struct omap_hwmod omap2430_l4_core_hwmod = { { .name = "dma", .irq = 93 },
.name = "l4_core", { .irq = -1 }
.class = &l4_hwmod_class,
.masters = omap2430_l4_core_masters,
.masters_cnt = ARRAY_SIZE(omap2430_l4_core_masters),
.slaves = omap2430_l4_core_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_l4_core_slaves),
.flags = HWMOD_NO_IDLEST,
}; };
/* Slave interfaces on the L4_WKUP interconnect */ static struct omap_hwmod omap2430_usbhsotg_hwmod = {
static struct omap_hwmod_ocp_if *omap2430_l4_wkup_slaves[] = { .name = "usb_otg_hs",
&omap2430_l4_core__l4_wkup, .mpu_irqs = omap2430_usbhsotg_mpu_irqs,
&omap2_l4_core__uart1, .main_clk = "usbhs_ick",
&omap2_l4_core__uart2, .prcm = {
&omap2_l4_core__uart3, .omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP2430_EN_USBHS_MASK,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP2430_ST_USBHS_SHIFT,
},
},
.class = &usbotg_class,
/*
* Erratum ID: i479 idle_req / idle_ack mechanism potentially
* broken when autoidle is enabled
* workaround is to disable the autoidle bit at module level.
*/
.flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
| HWMOD_SWSUP_MSTANDBY,
}; };
/* Master interfaces on the L4_WKUP interconnect */ /*
static struct omap_hwmod_ocp_if *omap2430_l4_wkup_masters[] = { * 'mcbsp' class
}; * multi channel buffered serial port controller
*/
/* l4 core -> mcspi1 interface */ static struct omap_hwmod_class_sysconfig omap2430_mcbsp_sysc = {
static struct omap_hwmod_ocp_if omap2430_l4_core__mcspi1 = { .rev_offs = 0x007C,
.master = &omap2430_l4_core_hwmod, .sysc_offs = 0x008C,
.slave = &omap2430_mcspi1_hwmod, .sysc_flags = (SYSC_HAS_SOFTRESET),
.clk = "mcspi1_ick", .sysc_fields = &omap_hwmod_sysc_type1,
.addr = omap2_mcspi1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* l4 core -> mcspi2 interface */ static struct omap_hwmod_class omap2430_mcbsp_hwmod_class = {
static struct omap_hwmod_ocp_if omap2430_l4_core__mcspi2 = { .name = "mcbsp",
.master = &omap2430_l4_core_hwmod, .sysc = &omap2430_mcbsp_sysc,
.slave = &omap2430_mcspi2_hwmod, .rev = MCBSP_CONFIG_TYPE2,
.clk = "mcspi2_ick",
.addr = omap2_mcspi2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4 core -> mcspi3 interface */
static struct omap_hwmod_ocp_if omap2430_l4_core__mcspi3 = {
.master = &omap2430_l4_core_hwmod,
.slave = &omap2430_mcspi3_hwmod,
.clk = "mcspi3_ick",
.addr = omap2430_mcspi3_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4 WKUP */
static struct omap_hwmod omap2430_l4_wkup_hwmod = {
.name = "l4_wkup",
.class = &l4_hwmod_class,
.masters = omap2430_l4_wkup_masters,
.masters_cnt = ARRAY_SIZE(omap2430_l4_wkup_masters),
.slaves = omap2430_l4_wkup_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_l4_wkup_slaves),
.flags = HWMOD_NO_IDLEST,
};
/* Master interfaces on the MPU device */
static struct omap_hwmod_ocp_if *omap2430_mpu_masters[] = {
&omap2430_mpu__l3_main,
};
/* MPU */
static struct omap_hwmod omap2430_mpu_hwmod = {
.name = "mpu",
.class = &mpu_hwmod_class,
.main_clk = "mpu_ck",
.masters = omap2430_mpu_masters,
.masters_cnt = ARRAY_SIZE(omap2430_mpu_masters),
};
/*
* IVA2_1 interface data
*/
/* IVA2 <- L3 interface */
static struct omap_hwmod_ocp_if omap2430_l3__iva = {
.master = &omap2430_l3_main_hwmod,
.slave = &omap2430_iva_hwmod,
.clk = "dsp_fck",
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
static struct omap_hwmod_ocp_if *omap2430_iva_masters[] = {
&omap2430_l3__iva,
};
/*
* IVA2 (IVA2)
*/
static struct omap_hwmod omap2430_iva_hwmod = {
.name = "iva",
.class = &iva_hwmod_class,
.masters = omap2430_iva_masters,
.masters_cnt = ARRAY_SIZE(omap2430_iva_masters),
};
/* always-on timers dev attribute */
static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = {
.timer_capability = OMAP_TIMER_ALWON,
};
/* pwm timers dev attribute */
static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = {
.timer_capability = OMAP_TIMER_HAS_PWM,
};
/* timer1 */
static struct omap_hwmod omap2430_timer1_hwmod;
static struct omap_hwmod_addr_space omap2430_timer1_addrs[] = {
{
.pa_start = 0x49018000,
.pa_end = 0x49018000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
};
/* l4_wkup -> timer1 */
static struct omap_hwmod_ocp_if omap2430_l4_wkup__timer1 = {
.master = &omap2430_l4_wkup_hwmod,
.slave = &omap2430_timer1_hwmod,
.clk = "gpt1_ick",
.addr = omap2430_timer1_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer1 slave port */ /* mcbsp1 */
static struct omap_hwmod_ocp_if *omap2430_timer1_slaves[] = { static struct omap_hwmod_irq_info omap2430_mcbsp1_irqs[] = {
&omap2430_l4_wkup__timer1, { .name = "tx", .irq = 59 },
{ .name = "rx", .irq = 60 },
{ .name = "ovr", .irq = 61 },
{ .name = "common", .irq = 64 },
{ .irq = -1 }
}; };
/* timer1 hwmod */ static struct omap_hwmod omap2430_mcbsp1_hwmod = {
static struct omap_hwmod omap2430_timer1_hwmod = { .name = "mcbsp1",
.name = "timer1", .class = &omap2430_mcbsp_hwmod_class,
.mpu_irqs = omap2_timer1_mpu_irqs, .mpu_irqs = omap2430_mcbsp1_irqs,
.main_clk = "gpt1_fck", .sdma_reqs = omap2_mcbsp1_sdma_reqs,
.main_clk = "mcbsp1_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT1_SHIFT, .module_bit = OMAP24XX_EN_MCBSP1_SHIFT,
.module_offs = WKUP_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT1_SHIFT, .idlest_idle_bit = OMAP24XX_ST_MCBSP1_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2430_timer1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer1_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* timer2 */
static struct omap_hwmod omap2430_timer2_hwmod;
/* l4_core -> timer2 */
static struct omap_hwmod_ocp_if omap2430_l4_core__timer2 = {
.master = &omap2430_l4_core_hwmod,
.slave = &omap2430_timer2_hwmod,
.clk = "gpt2_ick",
.addr = omap2xxx_timer2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer2 slave port */ /* mcbsp2 */
static struct omap_hwmod_ocp_if *omap2430_timer2_slaves[] = { static struct omap_hwmod_irq_info omap2430_mcbsp2_irqs[] = {
&omap2430_l4_core__timer2, { .name = "tx", .irq = 62 },
{ .name = "rx", .irq = 63 },
{ .name = "common", .irq = 16 },
{ .irq = -1 }
}; };
/* timer2 hwmod */ static struct omap_hwmod omap2430_mcbsp2_hwmod = {
static struct omap_hwmod omap2430_timer2_hwmod = { .name = "mcbsp2",
.name = "timer2", .class = &omap2430_mcbsp_hwmod_class,
.mpu_irqs = omap2_timer2_mpu_irqs, .mpu_irqs = omap2430_mcbsp2_irqs,
.main_clk = "gpt2_fck", .sdma_reqs = omap2_mcbsp2_sdma_reqs,
.main_clk = "mcbsp2_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT2_SHIFT, .module_bit = OMAP24XX_EN_MCBSP2_SHIFT,
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT, .idlest_idle_bit = OMAP24XX_ST_MCBSP2_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2430_timer2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer2_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* timer3 */
static struct omap_hwmod omap2430_timer3_hwmod;
/* l4_core -> timer3 */
static struct omap_hwmod_ocp_if omap2430_l4_core__timer3 = {
.master = &omap2430_l4_core_hwmod,
.slave = &omap2430_timer3_hwmod,
.clk = "gpt3_ick",
.addr = omap2xxx_timer3_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer3 slave port */ /* mcbsp3 */
static struct omap_hwmod_ocp_if *omap2430_timer3_slaves[] = { static struct omap_hwmod_irq_info omap2430_mcbsp3_irqs[] = {
&omap2430_l4_core__timer3, { .name = "tx", .irq = 89 },
{ .name = "rx", .irq = 90 },
{ .name = "common", .irq = 17 },
{ .irq = -1 }
}; };
/* timer3 hwmod */ static struct omap_hwmod omap2430_mcbsp3_hwmod = {
static struct omap_hwmod omap2430_timer3_hwmod = { .name = "mcbsp3",
.name = "timer3", .class = &omap2430_mcbsp_hwmod_class,
.mpu_irqs = omap2_timer3_mpu_irqs, .mpu_irqs = omap2430_mcbsp3_irqs,
.main_clk = "gpt3_fck", .sdma_reqs = omap2_mcbsp3_sdma_reqs,
.main_clk = "mcbsp3_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT3_SHIFT, .module_bit = OMAP2430_EN_MCBSP3_SHIFT,
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 2,
.idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT, .idlest_idle_bit = OMAP2430_ST_MCBSP3_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2430_timer3_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer3_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* timer4 */ /* mcbsp4 */
static struct omap_hwmod omap2430_timer4_hwmod; static struct omap_hwmod_irq_info omap2430_mcbsp4_irqs[] = {
{ .name = "tx", .irq = 54 },
/* l4_core -> timer4 */ { .name = "rx", .irq = 55 },
static struct omap_hwmod_ocp_if omap2430_l4_core__timer4 = { { .name = "common", .irq = 18 },
.master = &omap2430_l4_core_hwmod, { .irq = -1 }
.slave = &omap2430_timer4_hwmod,
.clk = "gpt4_ick",
.addr = omap2xxx_timer4_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer4 slave port */ static struct omap_hwmod_dma_info omap2430_mcbsp4_sdma_chs[] = {
static struct omap_hwmod_ocp_if *omap2430_timer4_slaves[] = { { .name = "rx", .dma_req = 20 },
&omap2430_l4_core__timer4, { .name = "tx", .dma_req = 19 },
{ .dma_req = -1 }
}; };
/* timer4 hwmod */ static struct omap_hwmod omap2430_mcbsp4_hwmod = {
static struct omap_hwmod omap2430_timer4_hwmod = { .name = "mcbsp4",
.name = "timer4", .class = &omap2430_mcbsp_hwmod_class,
.mpu_irqs = omap2_timer4_mpu_irqs, .mpu_irqs = omap2430_mcbsp4_irqs,
.main_clk = "gpt4_fck", .sdma_reqs = omap2430_mcbsp4_sdma_chs,
.main_clk = "mcbsp4_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT4_SHIFT, .module_bit = OMAP2430_EN_MCBSP4_SHIFT,
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 2,
.idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT, .idlest_idle_bit = OMAP2430_ST_MCBSP4_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2430_timer4_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer4_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* timer5 */ /* mcbsp5 */
static struct omap_hwmod omap2430_timer5_hwmod; static struct omap_hwmod_irq_info omap2430_mcbsp5_irqs[] = {
{ .name = "tx", .irq = 81 },
/* l4_core -> timer5 */ { .name = "rx", .irq = 82 },
static struct omap_hwmod_ocp_if omap2430_l4_core__timer5 = { { .name = "common", .irq = 19 },
.master = &omap2430_l4_core_hwmod, { .irq = -1 }
.slave = &omap2430_timer5_hwmod,
.clk = "gpt5_ick",
.addr = omap2xxx_timer5_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer5 slave port */ static struct omap_hwmod_dma_info omap2430_mcbsp5_sdma_chs[] = {
static struct omap_hwmod_ocp_if *omap2430_timer5_slaves[] = { { .name = "rx", .dma_req = 22 },
&omap2430_l4_core__timer5, { .name = "tx", .dma_req = 21 },
{ .dma_req = -1 }
}; };
/* timer5 hwmod */ static struct omap_hwmod omap2430_mcbsp5_hwmod = {
static struct omap_hwmod omap2430_timer5_hwmod = { .name = "mcbsp5",
.name = "timer5", .class = &omap2430_mcbsp_hwmod_class,
.mpu_irqs = omap2_timer5_mpu_irqs, .mpu_irqs = omap2430_mcbsp5_irqs,
.main_clk = "gpt5_fck", .sdma_reqs = omap2430_mcbsp5_sdma_chs,
.main_clk = "mcbsp5_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT5_SHIFT, .module_bit = OMAP2430_EN_MCBSP5_SHIFT,
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 2,
.idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT, .idlest_idle_bit = OMAP2430_ST_MCBSP5_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2430_timer5_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer5_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* timer6 */ /* MMC/SD/SDIO common */
static struct omap_hwmod omap2430_timer6_hwmod; static struct omap_hwmod_class_sysconfig omap2430_mmc_sysc = {
.rev_offs = 0x1fc,
/* l4_core -> timer6 */ .sysc_offs = 0x10,
static struct omap_hwmod_ocp_if omap2430_l4_core__timer6 = { .syss_offs = 0x14,
.master = &omap2430_l4_core_hwmod, .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
.slave = &omap2430_timer6_hwmod, SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
.clk = "gpt6_ick", SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
.addr = omap2xxx_timer6_addrs, .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.user = OCP_USER_MPU | OCP_USER_SDMA, .sysc_fields = &omap_hwmod_sysc_type1,
}; };
/* timer6 slave port */ static struct omap_hwmod_class omap2430_mmc_class = {
static struct omap_hwmod_ocp_if *omap2430_timer6_slaves[] = { .name = "mmc",
&omap2430_l4_core__timer6, .sysc = &omap2430_mmc_sysc,
}; };
/* timer6 hwmod */ /* MMC/SD/SDIO1 */
static struct omap_hwmod omap2430_timer6_hwmod = { static struct omap_hwmod_irq_info omap2430_mmc1_mpu_irqs[] = {
.name = "timer6", { .irq = 83 },
.mpu_irqs = omap2_timer6_mpu_irqs, { .irq = -1 }
.main_clk = "gpt6_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT6_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.slaves = omap2430_timer6_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer6_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* timer7 */ static struct omap_hwmod_dma_info omap2430_mmc1_sdma_reqs[] = {
static struct omap_hwmod omap2430_timer7_hwmod; { .name = "tx", .dma_req = 61 }, /* DMA_MMC1_TX */
{ .name = "rx", .dma_req = 62 }, /* DMA_MMC1_RX */
{ .dma_req = -1 }
};
/* l4_core -> timer7 */ static struct omap_hwmod_opt_clk omap2430_mmc1_opt_clks[] = {
static struct omap_hwmod_ocp_if omap2430_l4_core__timer7 = { { .role = "dbck", .clk = "mmchsdb1_fck" },
.master = &omap2430_l4_core_hwmod,
.slave = &omap2430_timer7_hwmod,
.clk = "gpt7_ick",
.addr = omap2xxx_timer7_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer7 slave port */ static struct omap_mmc_dev_attr mmc1_dev_attr = {
static struct omap_hwmod_ocp_if *omap2430_timer7_slaves[] = { .flags = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
&omap2430_l4_core__timer7,
}; };
/* timer7 hwmod */ static struct omap_hwmod omap2430_mmc1_hwmod = {
static struct omap_hwmod omap2430_timer7_hwmod = { .name = "mmc1",
.name = "timer7", .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_timer7_mpu_irqs, .mpu_irqs = omap2430_mmc1_mpu_irqs,
.main_clk = "gpt7_fck", .sdma_reqs = omap2430_mmc1_sdma_reqs,
.opt_clks = omap2430_mmc1_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(omap2430_mmc1_opt_clks),
.main_clk = "mmchs1_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT7_SHIFT,
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1, .prcm_reg_id = 2,
.idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT, .module_bit = OMAP2430_EN_MMCHS1_SHIFT,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP2430_ST_MMCHS1_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr, .dev_attr = &mmc1_dev_attr,
.slaves = omap2430_timer7_slaves, .class = &omap2430_mmc_class,
.slaves_cnt = ARRAY_SIZE(omap2430_timer7_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* timer8 */ /* MMC/SD/SDIO2 */
static struct omap_hwmod omap2430_timer8_hwmod; static struct omap_hwmod_irq_info omap2430_mmc2_mpu_irqs[] = {
{ .irq = 86 },
{ .irq = -1 }
};
/* l4_core -> timer8 */ static struct omap_hwmod_dma_info omap2430_mmc2_sdma_reqs[] = {
static struct omap_hwmod_ocp_if omap2430_l4_core__timer8 = { { .name = "tx", .dma_req = 47 }, /* DMA_MMC2_TX */
.master = &omap2430_l4_core_hwmod, { .name = "rx", .dma_req = 48 }, /* DMA_MMC2_RX */
.slave = &omap2430_timer8_hwmod, { .dma_req = -1 }
.clk = "gpt8_ick",
.addr = omap2xxx_timer8_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer8 slave port */ static struct omap_hwmod_opt_clk omap2430_mmc2_opt_clks[] = {
static struct omap_hwmod_ocp_if *omap2430_timer8_slaves[] = { { .role = "dbck", .clk = "mmchsdb2_fck" },
&omap2430_l4_core__timer8,
}; };
/* timer8 hwmod */ static struct omap_hwmod omap2430_mmc2_hwmod = {
static struct omap_hwmod omap2430_timer8_hwmod = { .name = "mmc2",
.name = "timer8", .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_timer8_mpu_irqs, .mpu_irqs = omap2430_mmc2_mpu_irqs,
.main_clk = "gpt8_fck", .sdma_reqs = omap2430_mmc2_sdma_reqs,
.opt_clks = omap2430_mmc2_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(omap2430_mmc2_opt_clks),
.main_clk = "mmchs2_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT8_SHIFT,
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1, .prcm_reg_id = 2,
.idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT, .module_bit = OMAP2430_EN_MMCHS2_SHIFT,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP2430_ST_MMCHS2_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr, .class = &omap2430_mmc_class,
.slaves = omap2430_timer8_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer8_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* timer9 */ /*
static struct omap_hwmod omap2430_timer9_hwmod; * interfaces
*/
/* l4_core -> timer9 */ /* L3 -> L4_CORE interface */
static struct omap_hwmod_ocp_if omap2430_l4_core__timer9 = { /* l3_core -> usbhsotg interface */
.master = &omap2430_l4_core_hwmod, static struct omap_hwmod_ocp_if omap2430_usbhsotg__l3 = {
.slave = &omap2430_timer9_hwmod, .master = &omap2430_usbhsotg_hwmod,
.clk = "gpt9_ick", .slave = &omap2xxx_l3_main_hwmod,
.addr = omap2xxx_timer9_addrs, .clk = "core_l3_ck",
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU,
}; };
/* timer9 slave port */ /* L4 CORE -> I2C1 interface */
static struct omap_hwmod_ocp_if *omap2430_timer9_slaves[] = { static struct omap_hwmod_ocp_if omap2430_l4_core__i2c1 = {
&omap2430_l4_core__timer9, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2430_i2c1_hwmod,
.clk = "i2c1_ick",
.addr = omap2_i2c1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer9 hwmod */ /* L4 CORE -> I2C2 interface */
static struct omap_hwmod omap2430_timer9_hwmod = { static struct omap_hwmod_ocp_if omap2430_l4_core__i2c2 = {
.name = "timer9", .master = &omap2xxx_l4_core_hwmod,
.mpu_irqs = omap2_timer9_mpu_irqs, .slave = &omap2430_i2c2_hwmod,
.main_clk = "gpt9_fck", .clk = "i2c2_ick",
.prcm = { .addr = omap2_i2c2_addr_space,
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT9_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.slaves = omap2430_timer9_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer9_slaves),
.class = &omap2xxx_timer_hwmod_class,
};
/* timer10 */
static struct omap_hwmod omap2430_timer10_hwmod;
/* l4_core -> timer10 */
static struct omap_hwmod_ocp_if omap2430_l4_core__timer10 = {
.master = &omap2430_l4_core_hwmod,
.slave = &omap2430_timer10_hwmod,
.clk = "gpt10_ick",
.addr = omap2_timer10_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer10 slave port */ static struct omap_hwmod_addr_space omap2430_usbhsotg_addrs[] = {
static struct omap_hwmod_ocp_if *omap2430_timer10_slaves[] = { {
&omap2430_l4_core__timer10, .pa_start = OMAP243X_HS_BASE,
}; .pa_end = OMAP243X_HS_BASE + SZ_4K - 1,
.flags = ADDR_TYPE_RT
/* timer10 hwmod */
static struct omap_hwmod omap2430_timer10_hwmod = {
.name = "timer10",
.mpu_irqs = omap2_timer10_mpu_irqs,
.main_clk = "gpt10_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT10_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT,
},
}, },
.dev_attr = &capability_pwm_dev_attr, { }
.slaves = omap2430_timer10_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer10_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* timer11 */ /* l4_core ->usbhsotg interface */
static struct omap_hwmod omap2430_timer11_hwmod; static struct omap_hwmod_ocp_if omap2430_l4_core__usbhsotg = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2430_usbhsotg_hwmod,
.clk = "usb_l4_ick",
.addr = omap2430_usbhsotg_addrs,
.user = OCP_USER_MPU,
};
/* l4_core -> timer11 */ /* L4 CORE -> MMC1 interface */
static struct omap_hwmod_ocp_if omap2430_l4_core__timer11 = { static struct omap_hwmod_ocp_if omap2430_l4_core__mmc1 = {
.master = &omap2430_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2430_timer11_hwmod, .slave = &omap2430_mmc1_hwmod,
.clk = "gpt11_ick", .clk = "mmchs1_ick",
.addr = omap2_timer11_addrs, .addr = omap2430_mmc1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer11 slave port */ /* L4 CORE -> MMC2 interface */
static struct omap_hwmod_ocp_if *omap2430_timer11_slaves[] = { static struct omap_hwmod_ocp_if omap2430_l4_core__mmc2 = {
&omap2430_l4_core__timer11, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2430_mmc2_hwmod,
.clk = "mmchs2_ick",
.addr = omap2430_mmc2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer11 hwmod */ /* l4 core -> mcspi3 interface */
static struct omap_hwmod omap2430_timer11_hwmod = { static struct omap_hwmod_ocp_if omap2430_l4_core__mcspi3 = {
.name = "timer11", .master = &omap2xxx_l4_core_hwmod,
.mpu_irqs = omap2_timer11_mpu_irqs, .slave = &omap2430_mcspi3_hwmod,
.main_clk = "gpt11_fck", .clk = "mcspi3_ick",
.prcm = { .addr = omap2430_mcspi3_addr_space,
.omap2 = { .user = OCP_USER_MPU | OCP_USER_SDMA,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT11_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.slaves = omap2430_timer11_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer11_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* timer12 */ /* IVA2 <- L3 interface */
static struct omap_hwmod omap2430_timer12_hwmod; static struct omap_hwmod_ocp_if omap2430_l3__iva = {
.master = &omap2xxx_l3_main_hwmod,
/* l4_core -> timer12 */ .slave = &omap2430_iva_hwmod,
static struct omap_hwmod_ocp_if omap2430_l4_core__timer12 = { .clk = "core_l3_ck",
.master = &omap2430_l4_core_hwmod,
.slave = &omap2430_timer12_hwmod,
.clk = "gpt12_ick",
.addr = omap2xxx_timer12_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer12 slave port */ static struct omap_hwmod_addr_space omap2430_timer1_addrs[] = {
static struct omap_hwmod_ocp_if *omap2430_timer12_slaves[] = { {
&omap2430_l4_core__timer12, .pa_start = 0x49018000,
.pa_end = 0x49018000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
}; };
/* timer12 hwmod */ /* l4_wkup -> timer1 */
static struct omap_hwmod omap2430_timer12_hwmod = { static struct omap_hwmod_ocp_if omap2430_l4_wkup__timer1 = {
.name = "timer12", .master = &omap2xxx_l4_wkup_hwmod,
.mpu_irqs = omap2xxx_timer12_mpu_irqs, .slave = &omap2xxx_timer1_hwmod,
.main_clk = "gpt12_fck", .clk = "gpt1_ick",
.prcm = { .addr = omap2430_timer1_addrs,
.omap2 = { .user = OCP_USER_MPU | OCP_USER_SDMA,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT12_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.slaves = omap2430_timer12_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_timer12_slaves),
.class = &omap2xxx_timer_hwmod_class,
}; };
/* l4_wkup -> wd_timer2 */ /* l4_wkup -> wd_timer2 */
...@@ -817,923 +641,146 @@ static struct omap_hwmod_addr_space omap2430_wd_timer2_addrs[] = { ...@@ -817,923 +641,146 @@ static struct omap_hwmod_addr_space omap2430_wd_timer2_addrs[] = {
}; };
static struct omap_hwmod_ocp_if omap2430_l4_wkup__wd_timer2 = { static struct omap_hwmod_ocp_if omap2430_l4_wkup__wd_timer2 = {
.master = &omap2430_l4_wkup_hwmod, .master = &omap2xxx_l4_wkup_hwmod,
.slave = &omap2430_wd_timer2_hwmod, .slave = &omap2xxx_wd_timer2_hwmod,
.clk = "mpu_wdt_ick", .clk = "mpu_wdt_ick",
.addr = omap2430_wd_timer2_addrs, .addr = omap2430_wd_timer2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* wd_timer2 */ /* l4_wkup -> gpio1 */
static struct omap_hwmod_ocp_if *omap2430_wd_timer2_slaves[] = { static struct omap_hwmod_addr_space omap2430_gpio1_addr_space[] = {
&omap2430_l4_wkup__wd_timer2, {
}; .pa_start = 0x4900C000,
.pa_end = 0x4900C1ff,
static struct omap_hwmod omap2430_wd_timer2_hwmod = { .flags = ADDR_TYPE_RT
.name = "wd_timer2",
.class = &omap2xxx_wd_timer_hwmod_class,
.main_clk = "mpu_wdt_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MPU_WDT_SHIFT,
},
},
.slaves = omap2430_wd_timer2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_wd_timer2_slaves),
};
/* UART1 */
static struct omap_hwmod_ocp_if *omap2430_uart1_slaves[] = {
&omap2_l4_core__uart1,
};
static struct omap_hwmod omap2430_uart1_hwmod = {
.name = "uart1",
.mpu_irqs = omap2_uart1_mpu_irqs,
.sdma_reqs = omap2_uart1_sdma_reqs,
.main_clk = "uart1_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_UART1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_EN_UART1_SHIFT,
},
},
.slaves = omap2430_uart1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_uart1_slaves),
.class = &omap2_uart_class,
};
/* UART2 */
static struct omap_hwmod_ocp_if *omap2430_uart2_slaves[] = {
&omap2_l4_core__uart2,
};
static struct omap_hwmod omap2430_uart2_hwmod = {
.name = "uart2",
.mpu_irqs = omap2_uart2_mpu_irqs,
.sdma_reqs = omap2_uart2_sdma_reqs,
.main_clk = "uart2_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_UART2_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_EN_UART2_SHIFT,
},
},
.slaves = omap2430_uart2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_uart2_slaves),
.class = &omap2_uart_class,
};
/* UART3 */
static struct omap_hwmod_ocp_if *omap2430_uart3_slaves[] = {
&omap2_l4_core__uart3,
};
static struct omap_hwmod omap2430_uart3_hwmod = {
.name = "uart3",
.mpu_irqs = omap2_uart3_mpu_irqs,
.sdma_reqs = omap2_uart3_sdma_reqs,
.main_clk = "uart3_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 2,
.module_bit = OMAP24XX_EN_UART3_SHIFT,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP24XX_EN_UART3_SHIFT,
},
}, },
.slaves = omap2430_uart3_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap2430_uart3_slaves),
.class = &omap2_uart_class,
};
/* dss */
/* dss master ports */
static struct omap_hwmod_ocp_if *omap2430_dss_masters[] = {
&omap2430_dss__l3,
}; };
/* l4_core -> dss */ static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio1 = {
static struct omap_hwmod_ocp_if omap2430_l4_core__dss = { .master = &omap2xxx_l4_wkup_hwmod,
.master = &omap2430_l4_core_hwmod, .slave = &omap2xxx_gpio1_hwmod,
.slave = &omap2430_dss_core_hwmod, .clk = "gpios_ick",
.clk = "dss_ick", .addr = omap2430_gpio1_addr_space,
.addr = omap2_dss_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dss slave ports */ /* l4_wkup -> gpio2 */
static struct omap_hwmod_ocp_if *omap2430_dss_slaves[] = { static struct omap_hwmod_addr_space omap2430_gpio2_addr_space[] = {
&omap2430_l4_core__dss, {
}; .pa_start = 0x4900E000,
.pa_end = 0x4900E1ff,
static struct omap_hwmod_opt_clk dss_opt_clks[] = { .flags = ADDR_TYPE_RT
/*
* The DSS HW needs all DSS clocks enabled during reset. The dss_core
* driver does not use these clocks.
*/
{ .role = "tv_clk", .clk = "dss_54m_fck" },
{ .role = "sys_clk", .clk = "dss2_fck" },
};
static struct omap_hwmod omap2430_dss_core_hwmod = {
.name = "dss_core",
.class = &omap2_dss_hwmod_class,
.main_clk = "dss1_fck", /* instead of dss_fck */
.sdma_reqs = omap2xxx_dss_sdma_chs,
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_stdby_bit = OMAP24XX_ST_DSS_SHIFT,
},
}, },
.opt_clks = dss_opt_clks, { }
.opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
.slaves = omap2430_dss_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_dss_slaves),
.masters = omap2430_dss_masters,
.masters_cnt = ARRAY_SIZE(omap2430_dss_masters),
.flags = HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
};
/* l4_core -> dss_dispc */
static struct omap_hwmod_ocp_if omap2430_l4_core__dss_dispc = {
.master = &omap2430_l4_core_hwmod,
.slave = &omap2430_dss_dispc_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_dispc_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dss_dispc slave ports */ static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio2 = {
static struct omap_hwmod_ocp_if *omap2430_dss_dispc_slaves[] = { .master = &omap2xxx_l4_wkup_hwmod,
&omap2430_l4_core__dss_dispc, .slave = &omap2xxx_gpio2_hwmod,
.clk = "gpios_ick",
.addr = omap2430_gpio2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap2430_dss_dispc_hwmod = { /* l4_wkup -> gpio3 */
.name = "dss_dispc", static struct omap_hwmod_addr_space omap2430_gpio3_addr_space[] = {
.class = &omap2_dispc_hwmod_class, {
.mpu_irqs = omap2_dispc_irqs, .pa_start = 0x49010000,
.main_clk = "dss1_fck", .pa_end = 0x490101ff,
.prcm = { .flags = ADDR_TYPE_RT
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_stdby_bit = OMAP24XX_ST_DSS_SHIFT,
},
}, },
.slaves = omap2430_dss_dispc_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap2430_dss_dispc_slaves),
.flags = HWMOD_NO_IDLEST,
.dev_attr = &omap2_3_dss_dispc_dev_attr
}; };
/* l4_core -> dss_rfbi */ static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio3 = {
static struct omap_hwmod_ocp_if omap2430_l4_core__dss_rfbi = { .master = &omap2xxx_l4_wkup_hwmod,
.master = &omap2430_l4_core_hwmod, .slave = &omap2xxx_gpio3_hwmod,
.slave = &omap2430_dss_rfbi_hwmod, .clk = "gpios_ick",
.clk = "dss_ick", .addr = omap2430_gpio3_addr_space,
.addr = omap2_dss_rfbi_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dss_rfbi slave ports */ /* l4_wkup -> gpio4 */
static struct omap_hwmod_ocp_if *omap2430_dss_rfbi_slaves[] = { static struct omap_hwmod_addr_space omap2430_gpio4_addr_space[] = {
&omap2430_l4_core__dss_rfbi, {
}; .pa_start = 0x49012000,
.pa_end = 0x490121ff,
static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = { .flags = ADDR_TYPE_RT
{ .role = "ick", .clk = "dss_ick" },
};
static struct omap_hwmod omap2430_dss_rfbi_hwmod = {
.name = "dss_rfbi",
.class = &omap2_rfbi_hwmod_class,
.main_clk = "dss1_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
},
}, },
.opt_clks = dss_rfbi_opt_clks, { }
.opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks),
.slaves = omap2430_dss_rfbi_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_dss_rfbi_slaves),
.flags = HWMOD_NO_IDLEST,
}; };
/* l4_core -> dss_venc */ static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio4 = {
static struct omap_hwmod_ocp_if omap2430_l4_core__dss_venc = { .master = &omap2xxx_l4_wkup_hwmod,
.master = &omap2430_l4_core_hwmod, .slave = &omap2xxx_gpio4_hwmod,
.slave = &omap2430_dss_venc_hwmod, .clk = "gpios_ick",
.clk = "dss_ick", .addr = omap2430_gpio4_addr_space,
.addr = omap2_dss_venc_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dss_venc slave ports */ /* l4_core -> gpio5 */
static struct omap_hwmod_ocp_if *omap2430_dss_venc_slaves[] = { static struct omap_hwmod_addr_space omap2430_gpio5_addr_space[] = {
&omap2430_l4_core__dss_venc, {
}; .pa_start = 0x480B6000,
.pa_end = 0x480B61ff,
static struct omap_hwmod omap2430_dss_venc_hwmod = { .flags = ADDR_TYPE_RT
.name = "dss_venc",
.class = &omap2_venc_hwmod_class,
.main_clk = "dss_54m_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
},
}, },
.slaves = omap2430_dss_venc_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap2430_dss_venc_slaves),
.flags = HWMOD_NO_IDLEST,
};
/* I2C common */
static struct omap_hwmod_class_sysconfig i2c_sysc = {
.rev_offs = 0x00,
.sysc_offs = 0x20,
.syss_offs = 0x10,
.sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
SYSS_HAS_RESET_STATUS),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_class i2c_class = { static struct omap_hwmod_ocp_if omap2430_l4_core__gpio5 = {
.name = "i2c", .master = &omap2xxx_l4_core_hwmod,
.sysc = &i2c_sysc, .slave = &omap2430_gpio5_hwmod,
.rev = OMAP_I2C_IP_VERSION_1, .clk = "gpio5_ick",
.reset = &omap_i2c_reset, .addr = omap2430_gpio5_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_i2c_dev_attr i2c_dev_attr = { /* dma_system -> L3 */
.fifo_depth = 8, /* bytes */ static struct omap_hwmod_ocp_if omap2430_dma_system__l3 = {
.flags = OMAP_I2C_FLAG_APPLY_ERRATA_I207 | .master = &omap2430_dma_system_hwmod,
OMAP_I2C_FLAG_BUS_SHIFT_2 | .slave = &omap2xxx_l3_main_hwmod,
OMAP_I2C_FLAG_FORCE_19200_INT_CLK, .clk = "core_l3_ck",
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* I2C1 */ /* l4_core -> dma_system */
static struct omap_hwmod_ocp_if omap2430_l4_core__dma_system = {
static struct omap_hwmod_ocp_if *omap2430_i2c1_slaves[] = { .master = &omap2xxx_l4_core_hwmod,
&omap2430_l4_core__i2c1, .slave = &omap2430_dma_system_hwmod,
}; .clk = "sdma_ick",
.addr = omap2_dma_system_addrs,
static struct omap_hwmod omap2430_i2c1_hwmod = { .user = OCP_USER_MPU | OCP_USER_SDMA,
.name = "i2c1",
.flags = HWMOD_16BIT_REG,
.mpu_irqs = omap2_i2c1_mpu_irqs,
.sdma_reqs = omap2_i2c1_sdma_reqs,
.main_clk = "i2chs1_fck",
.prcm = {
.omap2 = {
/*
* NOTE: The CM_FCLKEN* and CM_ICLKEN* for
* I2CHS IP's do not follow the usual pattern.
* prcm_reg_id alone cannot be used to program
* the iclk and fclk. Needs to be handled using
* additional flags when clk handling is moved
* to hwmod framework.
*/
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP2430_EN_I2CHS1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP2430_ST_I2CHS1_SHIFT,
},
},
.slaves = omap2430_i2c1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_i2c1_slaves),
.class = &i2c_class,
.dev_attr = &i2c_dev_attr,
};
/* I2C2 */
static struct omap_hwmod_ocp_if *omap2430_i2c2_slaves[] = {
&omap2430_l4_core__i2c2,
};
static struct omap_hwmod omap2430_i2c2_hwmod = {
.name = "i2c2",
.flags = HWMOD_16BIT_REG,
.mpu_irqs = omap2_i2c2_mpu_irqs,
.sdma_reqs = omap2_i2c2_sdma_reqs,
.main_clk = "i2chs2_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP2430_EN_I2CHS2_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP2430_ST_I2CHS2_SHIFT,
},
},
.slaves = omap2430_i2c2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_i2c2_slaves),
.class = &i2c_class,
.dev_attr = &i2c_dev_attr,
};
/* l4_wkup -> gpio1 */
static struct omap_hwmod_addr_space omap2430_gpio1_addr_space[] = {
{
.pa_start = 0x4900C000,
.pa_end = 0x4900C1ff,
.flags = ADDR_TYPE_RT
},
{ }
};
static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio1 = {
.master = &omap2430_l4_wkup_hwmod,
.slave = &omap2430_gpio1_hwmod,
.clk = "gpios_ick",
.addr = omap2430_gpio1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_wkup -> gpio2 */
static struct omap_hwmod_addr_space omap2430_gpio2_addr_space[] = {
{
.pa_start = 0x4900E000,
.pa_end = 0x4900E1ff,
.flags = ADDR_TYPE_RT
},
{ }
};
static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio2 = {
.master = &omap2430_l4_wkup_hwmod,
.slave = &omap2430_gpio2_hwmod,
.clk = "gpios_ick",
.addr = omap2430_gpio2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_wkup -> gpio3 */
static struct omap_hwmod_addr_space omap2430_gpio3_addr_space[] = {
{
.pa_start = 0x49010000,
.pa_end = 0x490101ff,
.flags = ADDR_TYPE_RT
},
{ }
};
static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio3 = {
.master = &omap2430_l4_wkup_hwmod,
.slave = &omap2430_gpio3_hwmod,
.clk = "gpios_ick",
.addr = omap2430_gpio3_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_wkup -> gpio4 */
static struct omap_hwmod_addr_space omap2430_gpio4_addr_space[] = {
{
.pa_start = 0x49012000,
.pa_end = 0x490121ff,
.flags = ADDR_TYPE_RT
},
{ }
};
static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio4 = {
.master = &omap2430_l4_wkup_hwmod,
.slave = &omap2430_gpio4_hwmod,
.clk = "gpios_ick",
.addr = omap2430_gpio4_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> gpio5 */
static struct omap_hwmod_addr_space omap2430_gpio5_addr_space[] = {
{
.pa_start = 0x480B6000,
.pa_end = 0x480B61ff,
.flags = ADDR_TYPE_RT
},
{ }
};
static struct omap_hwmod_ocp_if omap2430_l4_core__gpio5 = {
.master = &omap2430_l4_core_hwmod,
.slave = &omap2430_gpio5_hwmod,
.clk = "gpio5_ick",
.addr = omap2430_gpio5_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* gpio dev_attr */
static struct omap_gpio_dev_attr gpio_dev_attr = {
.bank_width = 32,
.dbck_flag = false,
};
/* gpio1 */
static struct omap_hwmod_ocp_if *omap2430_gpio1_slaves[] = {
&omap2430_l4_wkup__gpio1,
};
static struct omap_hwmod omap2430_gpio1_hwmod = {
.name = "gpio1",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio1_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_EN_GPIOS_SHIFT,
},
},
.slaves = omap2430_gpio1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_gpio1_slaves),
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* gpio2 */
static struct omap_hwmod_ocp_if *omap2430_gpio2_slaves[] = {
&omap2430_l4_wkup__gpio2,
};
static struct omap_hwmod omap2430_gpio2_hwmod = {
.name = "gpio2",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio2_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.slaves = omap2430_gpio2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_gpio2_slaves),
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* gpio3 */
static struct omap_hwmod_ocp_if *omap2430_gpio3_slaves[] = {
&omap2430_l4_wkup__gpio3,
};
static struct omap_hwmod omap2430_gpio3_hwmod = {
.name = "gpio3",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio3_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.slaves = omap2430_gpio3_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_gpio3_slaves),
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* gpio4 */
static struct omap_hwmod_ocp_if *omap2430_gpio4_slaves[] = {
&omap2430_l4_wkup__gpio4,
};
static struct omap_hwmod omap2430_gpio4_hwmod = {
.name = "gpio4",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio4_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.slaves = omap2430_gpio4_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_gpio4_slaves),
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* gpio5 */
static struct omap_hwmod_irq_info omap243x_gpio5_irqs[] = {
{ .irq = 33 }, /* INT_24XX_GPIO_BANK5 */
{ .irq = -1 }
};
static struct omap_hwmod_ocp_if *omap2430_gpio5_slaves[] = {
&omap2430_l4_core__gpio5,
};
static struct omap_hwmod omap2430_gpio5_hwmod = {
.name = "gpio5",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap243x_gpio5_irqs,
.main_clk = "gpio5_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 2,
.module_bit = OMAP2430_EN_GPIO5_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP2430_ST_GPIO5_SHIFT,
},
},
.slaves = omap2430_gpio5_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_gpio5_slaves),
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* dma attributes */
static struct omap_dma_dev_attr dma_dev_attr = {
.dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
.lch_count = 32,
};
/* dma_system -> L3 */
static struct omap_hwmod_ocp_if omap2430_dma_system__l3 = {
.master = &omap2430_dma_system_hwmod,
.slave = &omap2430_l3_main_hwmod,
.clk = "core_l3_ck",
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* dma_system master ports */
static struct omap_hwmod_ocp_if *omap2430_dma_system_masters[] = {
&omap2430_dma_system__l3,
};
/* l4_core -> dma_system */
static struct omap_hwmod_ocp_if omap2430_l4_core__dma_system = {
.master = &omap2430_l4_core_hwmod,
.slave = &omap2430_dma_system_hwmod,
.clk = "sdma_ick",
.addr = omap2_dma_system_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* dma_system slave ports */
static struct omap_hwmod_ocp_if *omap2430_dma_system_slaves[] = {
&omap2430_l4_core__dma_system,
};
static struct omap_hwmod omap2430_dma_system_hwmod = {
.name = "dma",
.class = &omap2xxx_dma_hwmod_class,
.mpu_irqs = omap2_dma_system_irqs,
.main_clk = "core_l3_ck",
.slaves = omap2430_dma_system_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_dma_system_slaves),
.masters = omap2430_dma_system_masters,
.masters_cnt = ARRAY_SIZE(omap2430_dma_system_masters),
.dev_attr = &dma_dev_attr,
.flags = HWMOD_NO_IDLEST,
};
/* mailbox */
static struct omap_hwmod omap2430_mailbox_hwmod;
static struct omap_hwmod_irq_info omap2430_mailbox_irqs[] = {
{ .irq = 26 },
{ .irq = -1 }
}; };
/* l4_core -> mailbox */ /* l4_core -> mailbox */
static struct omap_hwmod_ocp_if omap2430_l4_core__mailbox = { static struct omap_hwmod_ocp_if omap2430_l4_core__mailbox = {
.master = &omap2430_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2430_mailbox_hwmod, .slave = &omap2430_mailbox_hwmod,
.addr = omap2_mailbox_addrs, .addr = omap2_mailbox_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* mailbox slave ports */
static struct omap_hwmod_ocp_if *omap2430_mailbox_slaves[] = {
&omap2430_l4_core__mailbox,
};
static struct omap_hwmod omap2430_mailbox_hwmod = {
.name = "mailbox",
.class = &omap2xxx_mailbox_hwmod_class,
.mpu_irqs = omap2430_mailbox_irqs,
.main_clk = "mailboxes_ick",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MAILBOXES_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT,
},
},
.slaves = omap2430_mailbox_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_mailbox_slaves),
};
/* mcspi1 */
static struct omap_hwmod_ocp_if *omap2430_mcspi1_slaves[] = {
&omap2430_l4_core__mcspi1,
};
static struct omap2_mcspi_dev_attr omap_mcspi1_dev_attr = {
.num_chipselect = 4,
};
static struct omap_hwmod omap2430_mcspi1_hwmod = {
.name = "mcspi1_hwmod",
.mpu_irqs = omap2_mcspi1_mpu_irqs,
.sdma_reqs = omap2_mcspi1_sdma_reqs,
.main_clk = "mcspi1_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MCSPI1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MCSPI1_SHIFT,
},
},
.slaves = omap2430_mcspi1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_mcspi1_slaves),
.class = &omap2xxx_mcspi_class,
.dev_attr = &omap_mcspi1_dev_attr,
};
/* mcspi2 */
static struct omap_hwmod_ocp_if *omap2430_mcspi2_slaves[] = {
&omap2430_l4_core__mcspi2,
};
static struct omap2_mcspi_dev_attr omap_mcspi2_dev_attr = {
.num_chipselect = 2,
};
static struct omap_hwmod omap2430_mcspi2_hwmod = {
.name = "mcspi2_hwmod",
.mpu_irqs = omap2_mcspi2_mpu_irqs,
.sdma_reqs = omap2_mcspi2_sdma_reqs,
.main_clk = "mcspi2_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MCSPI2_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MCSPI2_SHIFT,
},
},
.slaves = omap2430_mcspi2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_mcspi2_slaves),
.class = &omap2xxx_mcspi_class,
.dev_attr = &omap_mcspi2_dev_attr,
};
/* mcspi3 */
static struct omap_hwmod_irq_info omap2430_mcspi3_mpu_irqs[] = {
{ .irq = 91 },
{ .irq = -1 }
};
static struct omap_hwmod_dma_info omap2430_mcspi3_sdma_reqs[] = {
{ .name = "tx0", .dma_req = 15 }, /* DMA_SPI3_TX0 */
{ .name = "rx0", .dma_req = 16 }, /* DMA_SPI3_RX0 */
{ .name = "tx1", .dma_req = 23 }, /* DMA_SPI3_TX1 */
{ .name = "rx1", .dma_req = 24 }, /* DMA_SPI3_RX1 */
{ .dma_req = -1 }
};
static struct omap_hwmod_ocp_if *omap2430_mcspi3_slaves[] = {
&omap2430_l4_core__mcspi3,
};
static struct omap2_mcspi_dev_attr omap_mcspi3_dev_attr = {
.num_chipselect = 2,
};
static struct omap_hwmod omap2430_mcspi3_hwmod = {
.name = "mcspi3_hwmod",
.mpu_irqs = omap2430_mcspi3_mpu_irqs,
.sdma_reqs = omap2430_mcspi3_sdma_reqs,
.main_clk = "mcspi3_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 2,
.module_bit = OMAP2430_EN_MCSPI3_SHIFT,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP2430_ST_MCSPI3_SHIFT,
},
},
.slaves = omap2430_mcspi3_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_mcspi3_slaves),
.class = &omap2xxx_mcspi_class,
.dev_attr = &omap_mcspi3_dev_attr,
};
/*
* usbhsotg
*/
static struct omap_hwmod_class_sysconfig omap2430_usbhsotg_sysc = {
.rev_offs = 0x0400,
.sysc_offs = 0x0404,
.syss_offs = 0x0408,
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE|
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_AUTOIDLE),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
};
static struct omap_hwmod_class usbotg_class = {
.name = "usbotg",
.sysc = &omap2430_usbhsotg_sysc,
};
/* usb_otg_hs */
static struct omap_hwmod_irq_info omap2430_usbhsotg_mpu_irqs[] = {
{ .name = "mc", .irq = 92 },
{ .name = "dma", .irq = 93 },
{ .irq = -1 }
};
static struct omap_hwmod omap2430_usbhsotg_hwmod = {
.name = "usb_otg_hs",
.mpu_irqs = omap2430_usbhsotg_mpu_irqs,
.main_clk = "usbhs_ick",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP2430_EN_USBHS_MASK,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP2430_ST_USBHS_SHIFT,
},
},
.masters = omap2430_usbhsotg_masters,
.masters_cnt = ARRAY_SIZE(omap2430_usbhsotg_masters),
.slaves = omap2430_usbhsotg_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_usbhsotg_slaves),
.class = &usbotg_class,
/*
* Erratum ID: i479 idle_req / idle_ack mechanism potentially
* broken when autoidle is enabled
* workaround is to disable the autoidle bit at module level.
*/
.flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
| HWMOD_SWSUP_MSTANDBY,
};
/*
* 'mcbsp' class
* multi channel buffered serial port controller
*/
static struct omap_hwmod_class_sysconfig omap2430_mcbsp_sysc = {
.rev_offs = 0x007C,
.sysc_offs = 0x008C,
.sysc_flags = (SYSC_HAS_SOFTRESET),
.sysc_fields = &omap_hwmod_sysc_type1,
};
static struct omap_hwmod_class omap2430_mcbsp_hwmod_class = {
.name = "mcbsp",
.sysc = &omap2430_mcbsp_sysc,
.rev = MCBSP_CONFIG_TYPE2,
};
/* mcbsp1 */
static struct omap_hwmod_irq_info omap2430_mcbsp1_irqs[] = {
{ .name = "tx", .irq = 59 },
{ .name = "rx", .irq = 60 },
{ .name = "ovr", .irq = 61 },
{ .name = "common", .irq = 64 },
{ .irq = -1 }
};
/* l4_core -> mcbsp1 */
static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp1 = {
.master = &omap2430_l4_core_hwmod,
.slave = &omap2430_mcbsp1_hwmod,
.clk = "mcbsp1_ick",
.addr = omap2_mcbsp1_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* mcbsp1 slave ports */
static struct omap_hwmod_ocp_if *omap2430_mcbsp1_slaves[] = {
&omap2430_l4_core__mcbsp1,
};
static struct omap_hwmod omap2430_mcbsp1_hwmod = {
.name = "mcbsp1",
.class = &omap2430_mcbsp_hwmod_class,
.mpu_irqs = omap2430_mcbsp1_irqs,
.sdma_reqs = omap2_mcbsp1_sdma_reqs,
.main_clk = "mcbsp1_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MCBSP1_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MCBSP1_SHIFT,
},
},
.slaves = omap2430_mcbsp1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_mcbsp1_slaves),
}; };
/* mcbsp2 */ /* l4_core -> mcbsp1 */
static struct omap_hwmod_irq_info omap2430_mcbsp2_irqs[] = { static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp1 = {
{ .name = "tx", .irq = 62 }, .master = &omap2xxx_l4_core_hwmod,
{ .name = "rx", .irq = 63 }, .slave = &omap2430_mcbsp1_hwmod,
{ .name = "common", .irq = 16 }, .clk = "mcbsp1_ick",
{ .irq = -1 } .addr = omap2_mcbsp1_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* l4_core -> mcbsp2 */ /* l4_core -> mcbsp2 */
static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp2 = { static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp2 = {
.master = &omap2430_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2430_mcbsp2_hwmod, .slave = &omap2430_mcbsp2_hwmod,
.clk = "mcbsp2_ick", .clk = "mcbsp2_ick",
.addr = omap2xxx_mcbsp2_addrs, .addr = omap2xxx_mcbsp2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mcbsp2 slave ports */
static struct omap_hwmod_ocp_if *omap2430_mcbsp2_slaves[] = {
&omap2430_l4_core__mcbsp2,
};
static struct omap_hwmod omap2430_mcbsp2_hwmod = {
.name = "mcbsp2",
.class = &omap2430_mcbsp_hwmod_class,
.mpu_irqs = omap2430_mcbsp2_irqs,
.sdma_reqs = omap2_mcbsp2_sdma_reqs,
.main_clk = "mcbsp2_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MCBSP2_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MCBSP2_SHIFT,
},
},
.slaves = omap2430_mcbsp2_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_mcbsp2_slaves),
};
/* mcbsp3 */
static struct omap_hwmod_irq_info omap2430_mcbsp3_irqs[] = {
{ .name = "tx", .irq = 89 },
{ .name = "rx", .irq = 90 },
{ .name = "common", .irq = 17 },
{ .irq = -1 }
};
static struct omap_hwmod_addr_space omap2430_mcbsp3_addrs[] = { static struct omap_hwmod_addr_space omap2430_mcbsp3_addrs[] = {
{ {
.name = "mpu", .name = "mpu",
...@@ -1746,51 +793,13 @@ static struct omap_hwmod_addr_space omap2430_mcbsp3_addrs[] = { ...@@ -1746,51 +793,13 @@ static struct omap_hwmod_addr_space omap2430_mcbsp3_addrs[] = {
/* l4_core -> mcbsp3 */ /* l4_core -> mcbsp3 */
static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp3 = { static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp3 = {
.master = &omap2430_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2430_mcbsp3_hwmod, .slave = &omap2430_mcbsp3_hwmod,
.clk = "mcbsp3_ick", .clk = "mcbsp3_ick",
.addr = omap2430_mcbsp3_addrs, .addr = omap2430_mcbsp3_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mcbsp3 slave ports */
static struct omap_hwmod_ocp_if *omap2430_mcbsp3_slaves[] = {
&omap2430_l4_core__mcbsp3,
};
static struct omap_hwmod omap2430_mcbsp3_hwmod = {
.name = "mcbsp3",
.class = &omap2430_mcbsp_hwmod_class,
.mpu_irqs = omap2430_mcbsp3_irqs,
.sdma_reqs = omap2_mcbsp3_sdma_reqs,
.main_clk = "mcbsp3_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP2430_EN_MCBSP3_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP2430_ST_MCBSP3_SHIFT,
},
},
.slaves = omap2430_mcbsp3_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_mcbsp3_slaves),
};
/* mcbsp4 */
static struct omap_hwmod_irq_info omap2430_mcbsp4_irqs[] = {
{ .name = "tx", .irq = 54 },
{ .name = "rx", .irq = 55 },
{ .name = "common", .irq = 18 },
{ .irq = -1 }
};
static struct omap_hwmod_dma_info omap2430_mcbsp4_sdma_chs[] = {
{ .name = "rx", .dma_req = 20 },
{ .name = "tx", .dma_req = 19 },
{ .dma_req = -1 }
};
static struct omap_hwmod_addr_space omap2430_mcbsp4_addrs[] = { static struct omap_hwmod_addr_space omap2430_mcbsp4_addrs[] = {
{ {
.name = "mpu", .name = "mpu",
...@@ -1803,51 +812,13 @@ static struct omap_hwmod_addr_space omap2430_mcbsp4_addrs[] = { ...@@ -1803,51 +812,13 @@ static struct omap_hwmod_addr_space omap2430_mcbsp4_addrs[] = {
/* l4_core -> mcbsp4 */ /* l4_core -> mcbsp4 */
static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp4 = { static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp4 = {
.master = &omap2430_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2430_mcbsp4_hwmod, .slave = &omap2430_mcbsp4_hwmod,
.clk = "mcbsp4_ick", .clk = "mcbsp4_ick",
.addr = omap2430_mcbsp4_addrs, .addr = omap2430_mcbsp4_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mcbsp4 slave ports */
static struct omap_hwmod_ocp_if *omap2430_mcbsp4_slaves[] = {
&omap2430_l4_core__mcbsp4,
};
static struct omap_hwmod omap2430_mcbsp4_hwmod = {
.name = "mcbsp4",
.class = &omap2430_mcbsp_hwmod_class,
.mpu_irqs = omap2430_mcbsp4_irqs,
.sdma_reqs = omap2430_mcbsp4_sdma_chs,
.main_clk = "mcbsp4_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP2430_EN_MCBSP4_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP2430_ST_MCBSP4_SHIFT,
},
},
.slaves = omap2430_mcbsp4_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_mcbsp4_slaves),
};
/* mcbsp5 */
static struct omap_hwmod_irq_info omap2430_mcbsp5_irqs[] = {
{ .name = "tx", .irq = 81 },
{ .name = "rx", .irq = 82 },
{ .name = "common", .irq = 19 },
{ .irq = -1 }
};
static struct omap_hwmod_dma_info omap2430_mcbsp5_sdma_chs[] = {
{ .name = "rx", .dma_req = 22 },
{ .name = "tx", .dma_req = 21 },
{ .dma_req = -1 }
};
static struct omap_hwmod_addr_space omap2430_mcbsp5_addrs[] = { static struct omap_hwmod_addr_space omap2430_mcbsp5_addrs[] = {
{ {
.name = "mpu", .name = "mpu",
...@@ -1860,213 +831,65 @@ static struct omap_hwmod_addr_space omap2430_mcbsp5_addrs[] = { ...@@ -1860,213 +831,65 @@ static struct omap_hwmod_addr_space omap2430_mcbsp5_addrs[] = {
/* l4_core -> mcbsp5 */ /* l4_core -> mcbsp5 */
static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp5 = { static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp5 = {
.master = &omap2430_l4_core_hwmod, .master = &omap2xxx_l4_core_hwmod,
.slave = &omap2430_mcbsp5_hwmod, .slave = &omap2430_mcbsp5_hwmod,
.clk = "mcbsp5_ick", .clk = "mcbsp5_ick",
.addr = omap2430_mcbsp5_addrs, .addr = omap2430_mcbsp5_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mcbsp5 slave ports */ static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = {
static struct omap_hwmod_ocp_if *omap2430_mcbsp5_slaves[] = { &omap2xxx_l3_main__l4_core,
&omap2430_l4_core__mcbsp5, &omap2xxx_mpu__l3_main,
}; &omap2xxx_dss__l3,
&omap2430_usbhsotg__l3,
static struct omap_hwmod omap2430_mcbsp5_hwmod = { &omap2430_l4_core__i2c1,
.name = "mcbsp5", &omap2430_l4_core__i2c2,
.class = &omap2430_mcbsp_hwmod_class, &omap2xxx_l4_core__l4_wkup,
.mpu_irqs = omap2430_mcbsp5_irqs, &omap2_l4_core__uart1,
.sdma_reqs = omap2430_mcbsp5_sdma_chs, &omap2_l4_core__uart2,
.main_clk = "mcbsp5_fck", &omap2_l4_core__uart3,
.prcm = { &omap2430_l4_core__usbhsotg,
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP2430_EN_MCBSP5_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP2430_ST_MCBSP5_SHIFT,
},
},
.slaves = omap2430_mcbsp5_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_mcbsp5_slaves),
};
/* MMC/SD/SDIO common */
static struct omap_hwmod_class_sysconfig omap2430_mmc_sysc = {
.rev_offs = 0x1fc,
.sysc_offs = 0x10,
.syss_offs = 0x14,
.sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
};
static struct omap_hwmod_class omap2430_mmc_class = {
.name = "mmc",
.sysc = &omap2430_mmc_sysc,
};
/* MMC/SD/SDIO1 */
static struct omap_hwmod_irq_info omap2430_mmc1_mpu_irqs[] = {
{ .irq = 83 },
{ .irq = -1 }
};
static struct omap_hwmod_dma_info omap2430_mmc1_sdma_reqs[] = {
{ .name = "tx", .dma_req = 61 }, /* DMA_MMC1_TX */
{ .name = "rx", .dma_req = 62 }, /* DMA_MMC1_RX */
{ .dma_req = -1 }
};
static struct omap_hwmod_opt_clk omap2430_mmc1_opt_clks[] = {
{ .role = "dbck", .clk = "mmchsdb1_fck" },
};
static struct omap_hwmod_ocp_if *omap2430_mmc1_slaves[] = {
&omap2430_l4_core__mmc1, &omap2430_l4_core__mmc1,
};
static struct omap_mmc_dev_attr mmc1_dev_attr = {
.flags = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
};
static struct omap_hwmod omap2430_mmc1_hwmod = {
.name = "mmc1",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2430_mmc1_mpu_irqs,
.sdma_reqs = omap2430_mmc1_sdma_reqs,
.opt_clks = omap2430_mmc1_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(omap2430_mmc1_opt_clks),
.main_clk = "mmchs1_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 2,
.module_bit = OMAP2430_EN_MMCHS1_SHIFT,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP2430_ST_MMCHS1_SHIFT,
},
},
.dev_attr = &mmc1_dev_attr,
.slaves = omap2430_mmc1_slaves,
.slaves_cnt = ARRAY_SIZE(omap2430_mmc1_slaves),
.class = &omap2430_mmc_class,
};
/* MMC/SD/SDIO2 */
static struct omap_hwmod_irq_info omap2430_mmc2_mpu_irqs[] = {
{ .irq = 86 },
{ .irq = -1 }
};
static struct omap_hwmod_dma_info omap2430_mmc2_sdma_reqs[] = {
{ .name = "tx", .dma_req = 47 }, /* DMA_MMC2_TX */
{ .name = "rx", .dma_req = 48 }, /* DMA_MMC2_RX */
{ .dma_req = -1 }
};
static struct omap_hwmod_opt_clk omap2430_mmc2_opt_clks[] = {
{ .role = "dbck", .clk = "mmchsdb2_fck" },
};
static struct omap_hwmod_ocp_if *omap2430_mmc2_slaves[] = {
&omap2430_l4_core__mmc2, &omap2430_l4_core__mmc2,
}; &omap2xxx_l4_core__mcspi1,
&omap2xxx_l4_core__mcspi2,
static struct omap_hwmod omap2430_mmc2_hwmod = { &omap2430_l4_core__mcspi3,
.name = "mmc2", &omap2430_l3__iva,
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, &omap2430_l4_wkup__timer1,
.mpu_irqs = omap2430_mmc2_mpu_irqs, &omap2xxx_l4_core__timer2,
.sdma_reqs = omap2430_mmc2_sdma_reqs, &omap2xxx_l4_core__timer3,
.opt_clks = omap2430_mmc2_opt_clks, &omap2xxx_l4_core__timer4,
.opt_clks_cnt = ARRAY_SIZE(omap2430_mmc2_opt_clks), &omap2xxx_l4_core__timer5,
.main_clk = "mmchs2_fck", &omap2xxx_l4_core__timer6,
.prcm = { &omap2xxx_l4_core__timer7,
.omap2 = { &omap2xxx_l4_core__timer8,
.module_offs = CORE_MOD, &omap2xxx_l4_core__timer9,
.prcm_reg_id = 2, &omap2xxx_l4_core__timer10,
.module_bit = OMAP2430_EN_MMCHS2_SHIFT, &omap2xxx_l4_core__timer11,
.idlest_reg_id = 2, &omap2xxx_l4_core__timer12,
.idlest_idle_bit = OMAP2430_ST_MMCHS2_SHIFT, &omap2430_l4_wkup__wd_timer2,
}, &omap2xxx_l4_core__dss,
}, &omap2xxx_l4_core__dss_dispc,
.slaves = omap2430_mmc2_slaves, &omap2xxx_l4_core__dss_rfbi,
.slaves_cnt = ARRAY_SIZE(omap2430_mmc2_slaves), &omap2xxx_l4_core__dss_venc,
.class = &omap2430_mmc_class, &omap2430_l4_wkup__gpio1,
}; &omap2430_l4_wkup__gpio2,
&omap2430_l4_wkup__gpio3,
static __initdata struct omap_hwmod *omap2430_hwmods[] = { &omap2430_l4_wkup__gpio4,
&omap2430_l3_main_hwmod, &omap2430_l4_core__gpio5,
&omap2430_l4_core_hwmod, &omap2430_dma_system__l3,
&omap2430_l4_wkup_hwmod, &omap2430_l4_core__dma_system,
&omap2430_mpu_hwmod, &omap2430_l4_core__mailbox,
&omap2430_iva_hwmod, &omap2430_l4_core__mcbsp1,
&omap2430_l4_core__mcbsp2,
&omap2430_timer1_hwmod, &omap2430_l4_core__mcbsp3,
&omap2430_timer2_hwmod, &omap2430_l4_core__mcbsp4,
&omap2430_timer3_hwmod, &omap2430_l4_core__mcbsp5,
&omap2430_timer4_hwmod,
&omap2430_timer5_hwmod,
&omap2430_timer6_hwmod,
&omap2430_timer7_hwmod,
&omap2430_timer8_hwmod,
&omap2430_timer9_hwmod,
&omap2430_timer10_hwmod,
&omap2430_timer11_hwmod,
&omap2430_timer12_hwmod,
&omap2430_wd_timer2_hwmod,
&omap2430_uart1_hwmod,
&omap2430_uart2_hwmod,
&omap2430_uart3_hwmod,
/* dss class */
&omap2430_dss_core_hwmod,
&omap2430_dss_dispc_hwmod,
&omap2430_dss_rfbi_hwmod,
&omap2430_dss_venc_hwmod,
/* i2c class */
&omap2430_i2c1_hwmod,
&omap2430_i2c2_hwmod,
&omap2430_mmc1_hwmod,
&omap2430_mmc2_hwmod,
/* gpio class */
&omap2430_gpio1_hwmod,
&omap2430_gpio2_hwmod,
&omap2430_gpio3_hwmod,
&omap2430_gpio4_hwmod,
&omap2430_gpio5_hwmod,
/* dma_system class*/
&omap2430_dma_system_hwmod,
/* mcbsp class */
&omap2430_mcbsp1_hwmod,
&omap2430_mcbsp2_hwmod,
&omap2430_mcbsp3_hwmod,
&omap2430_mcbsp4_hwmod,
&omap2430_mcbsp5_hwmod,
/* mailbox class */
&omap2430_mailbox_hwmod,
/* mcspi class */
&omap2430_mcspi1_hwmod,
&omap2430_mcspi2_hwmod,
&omap2430_mcspi3_hwmod,
/* usbotg class*/
&omap2430_usbhsotg_hwmod,
NULL, NULL,
}; };
int __init omap2430_hwmod_init(void) int __init omap2430_hwmod_init(void)
{ {
return omap_hwmod_register(omap2430_hwmods); return omap_hwmod_register_links(omap2430_hwmod_ocp_ifs);
} }
...@@ -15,10 +15,12 @@ ...@@ -15,10 +15,12 @@
#include <plat/omap_hwmod.h> #include <plat/omap_hwmod.h>
#include <plat/serial.h> #include <plat/serial.h>
#include <plat/l3_2xxx.h>
#include <plat/l4_2xxx.h>
#include "omap_hwmod_common_data.h" #include "omap_hwmod_common_data.h"
struct omap_hwmod_addr_space omap2xxx_uart1_addr_space[] = { static struct omap_hwmod_addr_space omap2xxx_uart1_addr_space[] = {
{ {
.pa_start = OMAP2_UART1_BASE, .pa_start = OMAP2_UART1_BASE,
.pa_end = OMAP2_UART1_BASE + SZ_8K - 1, .pa_end = OMAP2_UART1_BASE + SZ_8K - 1,
...@@ -27,7 +29,7 @@ struct omap_hwmod_addr_space omap2xxx_uart1_addr_space[] = { ...@@ -27,7 +29,7 @@ struct omap_hwmod_addr_space omap2xxx_uart1_addr_space[] = {
{ } { }
}; };
struct omap_hwmod_addr_space omap2xxx_uart2_addr_space[] = { static struct omap_hwmod_addr_space omap2xxx_uart2_addr_space[] = {
{ {
.pa_start = OMAP2_UART2_BASE, .pa_start = OMAP2_UART2_BASE,
.pa_end = OMAP2_UART2_BASE + SZ_1K - 1, .pa_end = OMAP2_UART2_BASE + SZ_1K - 1,
...@@ -36,7 +38,7 @@ struct omap_hwmod_addr_space omap2xxx_uart2_addr_space[] = { ...@@ -36,7 +38,7 @@ struct omap_hwmod_addr_space omap2xxx_uart2_addr_space[] = {
{ } { }
}; };
struct omap_hwmod_addr_space omap2xxx_uart3_addr_space[] = { static struct omap_hwmod_addr_space omap2xxx_uart3_addr_space[] = {
{ {
.pa_start = OMAP2_UART3_BASE, .pa_start = OMAP2_UART3_BASE,
.pa_end = OMAP2_UART3_BASE + SZ_1K - 1, .pa_end = OMAP2_UART3_BASE + SZ_1K - 1,
...@@ -45,7 +47,7 @@ struct omap_hwmod_addr_space omap2xxx_uart3_addr_space[] = { ...@@ -45,7 +47,7 @@ struct omap_hwmod_addr_space omap2xxx_uart3_addr_space[] = {
{ } { }
}; };
struct omap_hwmod_addr_space omap2xxx_timer2_addrs[] = { static struct omap_hwmod_addr_space omap2xxx_timer2_addrs[] = {
{ {
.pa_start = 0x4802a000, .pa_start = 0x4802a000,
.pa_end = 0x4802a000 + SZ_1K - 1, .pa_end = 0x4802a000 + SZ_1K - 1,
...@@ -54,7 +56,7 @@ struct omap_hwmod_addr_space omap2xxx_timer2_addrs[] = { ...@@ -54,7 +56,7 @@ struct omap_hwmod_addr_space omap2xxx_timer2_addrs[] = {
{ } { }
}; };
struct omap_hwmod_addr_space omap2xxx_timer3_addrs[] = { static struct omap_hwmod_addr_space omap2xxx_timer3_addrs[] = {
{ {
.pa_start = 0x48078000, .pa_start = 0x48078000,
.pa_end = 0x48078000 + SZ_1K - 1, .pa_end = 0x48078000 + SZ_1K - 1,
...@@ -63,7 +65,7 @@ struct omap_hwmod_addr_space omap2xxx_timer3_addrs[] = { ...@@ -63,7 +65,7 @@ struct omap_hwmod_addr_space omap2xxx_timer3_addrs[] = {
{ } { }
}; };
struct omap_hwmod_addr_space omap2xxx_timer4_addrs[] = { static struct omap_hwmod_addr_space omap2xxx_timer4_addrs[] = {
{ {
.pa_start = 0x4807a000, .pa_start = 0x4807a000,
.pa_end = 0x4807a000 + SZ_1K - 1, .pa_end = 0x4807a000 + SZ_1K - 1,
...@@ -72,7 +74,7 @@ struct omap_hwmod_addr_space omap2xxx_timer4_addrs[] = { ...@@ -72,7 +74,7 @@ struct omap_hwmod_addr_space omap2xxx_timer4_addrs[] = {
{ } { }
}; };
struct omap_hwmod_addr_space omap2xxx_timer5_addrs[] = { static struct omap_hwmod_addr_space omap2xxx_timer5_addrs[] = {
{ {
.pa_start = 0x4807c000, .pa_start = 0x4807c000,
.pa_end = 0x4807c000 + SZ_1K - 1, .pa_end = 0x4807c000 + SZ_1K - 1,
...@@ -81,7 +83,7 @@ struct omap_hwmod_addr_space omap2xxx_timer5_addrs[] = { ...@@ -81,7 +83,7 @@ struct omap_hwmod_addr_space omap2xxx_timer5_addrs[] = {
{ } { }
}; };
struct omap_hwmod_addr_space omap2xxx_timer6_addrs[] = { static struct omap_hwmod_addr_space omap2xxx_timer6_addrs[] = {
{ {
.pa_start = 0x4807e000, .pa_start = 0x4807e000,
.pa_end = 0x4807e000 + SZ_1K - 1, .pa_end = 0x4807e000 + SZ_1K - 1,
...@@ -90,7 +92,7 @@ struct omap_hwmod_addr_space omap2xxx_timer6_addrs[] = { ...@@ -90,7 +92,7 @@ struct omap_hwmod_addr_space omap2xxx_timer6_addrs[] = {
{ } { }
}; };
struct omap_hwmod_addr_space omap2xxx_timer7_addrs[] = { static struct omap_hwmod_addr_space omap2xxx_timer7_addrs[] = {
{ {
.pa_start = 0x48080000, .pa_start = 0x48080000,
.pa_end = 0x48080000 + SZ_1K - 1, .pa_end = 0x48080000 + SZ_1K - 1,
...@@ -99,7 +101,7 @@ struct omap_hwmod_addr_space omap2xxx_timer7_addrs[] = { ...@@ -99,7 +101,7 @@ struct omap_hwmod_addr_space omap2xxx_timer7_addrs[] = {
{ } { }
}; };
struct omap_hwmod_addr_space omap2xxx_timer8_addrs[] = { static struct omap_hwmod_addr_space omap2xxx_timer8_addrs[] = {
{ {
.pa_start = 0x48082000, .pa_start = 0x48082000,
.pa_end = 0x48082000 + SZ_1K - 1, .pa_end = 0x48082000 + SZ_1K - 1,
...@@ -108,7 +110,7 @@ struct omap_hwmod_addr_space omap2xxx_timer8_addrs[] = { ...@@ -108,7 +110,7 @@ struct omap_hwmod_addr_space omap2xxx_timer8_addrs[] = {
{ } { }
}; };
struct omap_hwmod_addr_space omap2xxx_timer9_addrs[] = { static struct omap_hwmod_addr_space omap2xxx_timer9_addrs[] = {
{ {
.pa_start = 0x48084000, .pa_start = 0x48084000,
.pa_end = 0x48084000 + SZ_1K - 1, .pa_end = 0x48084000 + SZ_1K - 1,
...@@ -127,4 +129,246 @@ struct omap_hwmod_addr_space omap2xxx_mcbsp2_addrs[] = { ...@@ -127,4 +129,246 @@ struct omap_hwmod_addr_space omap2xxx_mcbsp2_addrs[] = {
{ } { }
}; };
/*
* Common interconnect data
*/
/* L3 -> L4_CORE interface */
struct omap_hwmod_ocp_if omap2xxx_l3_main__l4_core = {
.master = &omap2xxx_l3_main_hwmod,
.slave = &omap2xxx_l4_core_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* MPU -> L3 interface */
struct omap_hwmod_ocp_if omap2xxx_mpu__l3_main = {
.master = &omap2xxx_mpu_hwmod,
.slave = &omap2xxx_l3_main_hwmod,
.user = OCP_USER_MPU,
};
/* DSS -> l3 */
struct omap_hwmod_ocp_if omap2xxx_dss__l3 = {
.master = &omap2xxx_dss_core_hwmod,
.slave = &omap2xxx_l3_main_hwmod,
.fw = {
.omap2 = {
.l3_perm_bit = OMAP2_L3_CORE_FW_CONNID_DSS,
.flags = OMAP_FIREWALL_L3,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4_CORE -> L4_WKUP interface */
struct omap_hwmod_ocp_if omap2xxx_l4_core__l4_wkup = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_l4_wkup_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4 CORE -> UART1 interface */
struct omap_hwmod_ocp_if omap2_l4_core__uart1 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_uart1_hwmod,
.clk = "uart1_ick",
.addr = omap2xxx_uart1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4 CORE -> UART2 interface */
struct omap_hwmod_ocp_if omap2_l4_core__uart2 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_uart2_hwmod,
.clk = "uart2_ick",
.addr = omap2xxx_uart2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L4 PER -> UART3 interface */
struct omap_hwmod_ocp_if omap2_l4_core__uart3 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_uart3_hwmod,
.clk = "uart3_ick",
.addr = omap2xxx_uart3_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4 core -> mcspi1 interface */
struct omap_hwmod_ocp_if omap2xxx_l4_core__mcspi1 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_mcspi1_hwmod,
.clk = "mcspi1_ick",
.addr = omap2_mcspi1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4 core -> mcspi2 interface */
struct omap_hwmod_ocp_if omap2xxx_l4_core__mcspi2 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_mcspi2_hwmod,
.clk = "mcspi2_ick",
.addr = omap2_mcspi2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer2 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer2 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer2_hwmod,
.clk = "gpt2_ick",
.addr = omap2xxx_timer2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer3 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer3 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer3_hwmod,
.clk = "gpt3_ick",
.addr = omap2xxx_timer3_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer4 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer4 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer4_hwmod,
.clk = "gpt4_ick",
.addr = omap2xxx_timer4_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer5 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer5 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer5_hwmod,
.clk = "gpt5_ick",
.addr = omap2xxx_timer5_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer6 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer6 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer6_hwmod,
.clk = "gpt6_ick",
.addr = omap2xxx_timer6_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer7 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer7 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer7_hwmod,
.clk = "gpt7_ick",
.addr = omap2xxx_timer7_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer8 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer8 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer8_hwmod,
.clk = "gpt8_ick",
.addr = omap2xxx_timer8_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer9 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer9 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer9_hwmod,
.clk = "gpt9_ick",
.addr = omap2xxx_timer9_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer10 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer10 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer10_hwmod,
.clk = "gpt10_ick",
.addr = omap2_timer10_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer11 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer11 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer11_hwmod,
.clk = "gpt11_ick",
.addr = omap2_timer11_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> timer12 */
struct omap_hwmod_ocp_if omap2xxx_l4_core__timer12 = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_timer12_hwmod,
.clk = "gpt12_ick",
.addr = omap2xxx_timer12_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> dss */
struct omap_hwmod_ocp_if omap2xxx_l4_core__dss = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_dss_core_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP2420_L4_CORE_FW_DSS_CORE_REGION,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> dss_dispc */
struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_dispc = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_dss_dispc_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_dispc_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP2420_L4_CORE_FW_DSS_DISPC_REGION,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> dss_rfbi */
struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_rfbi = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_dss_rfbi_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_rfbi_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP2420_L4_CORE_FW_DSS_CORE_REGION,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* l4_core -> dss_venc */
struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_venc = {
.master = &omap2xxx_l4_core_hwmod,
.slave = &omap2xxx_dss_venc_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_venc_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP2420_L4_CORE_FW_DSS_VENC_REGION,
.flags = OMAP_FIREWALL_L4,
}
},
.flags = OCPIF_SWSUP_IDLE,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
*/ */
#include <plat/omap_hwmod.h> #include <plat/omap_hwmod.h>
#include <plat/serial.h> #include <plat/serial.h>
#include <plat/gpio.h>
#include <plat/dma.h> #include <plat/dma.h>
#include <plat/dmtimer.h> #include <plat/dmtimer.h>
#include <plat/mcspi.h> #include <plat/mcspi.h>
...@@ -17,6 +18,8 @@ ...@@ -17,6 +18,8 @@
#include <mach/irqs.h> #include <mach/irqs.h>
#include "omap_hwmod_common_data.h" #include "omap_hwmod_common_data.h"
#include "cm-regbits-24xx.h"
#include "prm-regbits-24xx.h"
#include "wd_timer.h" #include "wd_timer.h"
struct omap_hwmod_irq_info omap2xxx_timer12_mpu_irqs[] = { struct omap_hwmod_irq_info omap2xxx_timer12_mpu_irqs[] = {
...@@ -170,3 +173,562 @@ struct omap_hwmod_class omap2xxx_mcspi_class = { ...@@ -170,3 +173,562 @@ struct omap_hwmod_class omap2xxx_mcspi_class = {
.sysc = &omap2xxx_mcspi_sysc, .sysc = &omap2xxx_mcspi_sysc,
.rev = OMAP2_MCSPI_REV, .rev = OMAP2_MCSPI_REV,
}; };
/*
* IP blocks
*/
/* L3 */
struct omap_hwmod omap2xxx_l3_main_hwmod = {
.name = "l3_main",
.class = &l3_hwmod_class,
.flags = HWMOD_NO_IDLEST,
};
/* L4 CORE */
struct omap_hwmod omap2xxx_l4_core_hwmod = {
.name = "l4_core",
.class = &l4_hwmod_class,
.flags = HWMOD_NO_IDLEST,
};
/* L4 WKUP */
struct omap_hwmod omap2xxx_l4_wkup_hwmod = {
.name = "l4_wkup",
.class = &l4_hwmod_class,
.flags = HWMOD_NO_IDLEST,
};
/* MPU */
struct omap_hwmod omap2xxx_mpu_hwmod = {
.name = "mpu",
.class = &mpu_hwmod_class,
.main_clk = "mpu_ck",
};
/* IVA2 */
struct omap_hwmod omap2xxx_iva_hwmod = {
.name = "iva",
.class = &iva_hwmod_class,
};
/* always-on timers dev attribute */
static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = {
.timer_capability = OMAP_TIMER_ALWON,
};
/* pwm timers dev attribute */
static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = {
.timer_capability = OMAP_TIMER_HAS_PWM,
};
/* timer1 */
struct omap_hwmod omap2xxx_timer1_hwmod = {
.name = "timer1",
.mpu_irqs = omap2_timer1_mpu_irqs,
.main_clk = "gpt1_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT1_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT1_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer2 */
struct omap_hwmod omap2xxx_timer2_hwmod = {
.name = "timer2",
.mpu_irqs = omap2_timer2_mpu_irqs,
.main_clk = "gpt2_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT2_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer3 */
struct omap_hwmod omap2xxx_timer3_hwmod = {
.name = "timer3",
.mpu_irqs = omap2_timer3_mpu_irqs,
.main_clk = "gpt3_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT3_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer4 */
struct omap_hwmod omap2xxx_timer4_hwmod = {
.name = "timer4",
.mpu_irqs = omap2_timer4_mpu_irqs,
.main_clk = "gpt4_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT4_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer5 */
struct omap_hwmod omap2xxx_timer5_hwmod = {
.name = "timer5",
.mpu_irqs = omap2_timer5_mpu_irqs,
.main_clk = "gpt5_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT5_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer6 */
struct omap_hwmod omap2xxx_timer6_hwmod = {
.name = "timer6",
.mpu_irqs = omap2_timer6_mpu_irqs,
.main_clk = "gpt6_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT6_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer7 */
struct omap_hwmod omap2xxx_timer7_hwmod = {
.name = "timer7",
.mpu_irqs = omap2_timer7_mpu_irqs,
.main_clk = "gpt7_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT7_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer8 */
struct omap_hwmod omap2xxx_timer8_hwmod = {
.name = "timer8",
.mpu_irqs = omap2_timer8_mpu_irqs,
.main_clk = "gpt8_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT8_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT,
},
},
.dev_attr = &capability_alwon_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer9 */
struct omap_hwmod omap2xxx_timer9_hwmod = {
.name = "timer9",
.mpu_irqs = omap2_timer9_mpu_irqs,
.main_clk = "gpt9_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT9_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer10 */
struct omap_hwmod omap2xxx_timer10_hwmod = {
.name = "timer10",
.mpu_irqs = omap2_timer10_mpu_irqs,
.main_clk = "gpt10_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT10_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer11 */
struct omap_hwmod omap2xxx_timer11_hwmod = {
.name = "timer11",
.mpu_irqs = omap2_timer11_mpu_irqs,
.main_clk = "gpt11_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT11_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* timer12 */
struct omap_hwmod omap2xxx_timer12_hwmod = {
.name = "timer12",
.mpu_irqs = omap2xxx_timer12_mpu_irqs,
.main_clk = "gpt12_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPT12_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.class = &omap2xxx_timer_hwmod_class,
};
/* wd_timer2 */
struct omap_hwmod omap2xxx_wd_timer2_hwmod = {
.name = "wd_timer2",
.class = &omap2xxx_wd_timer_hwmod_class,
.main_clk = "mpu_wdt_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MPU_WDT_SHIFT,
},
},
};
/* UART1 */
struct omap_hwmod omap2xxx_uart1_hwmod = {
.name = "uart1",
.mpu_irqs = omap2_uart1_mpu_irqs,
.sdma_reqs = omap2_uart1_sdma_reqs,
.main_clk = "uart1_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_UART1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_EN_UART1_SHIFT,
},
},
.class = &omap2_uart_class,
};
/* UART2 */
struct omap_hwmod omap2xxx_uart2_hwmod = {
.name = "uart2",
.mpu_irqs = omap2_uart2_mpu_irqs,
.sdma_reqs = omap2_uart2_sdma_reqs,
.main_clk = "uart2_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_UART2_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_EN_UART2_SHIFT,
},
},
.class = &omap2_uart_class,
};
/* UART3 */
struct omap_hwmod omap2xxx_uart3_hwmod = {
.name = "uart3",
.mpu_irqs = omap2_uart3_mpu_irqs,
.sdma_reqs = omap2_uart3_sdma_reqs,
.main_clk = "uart3_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 2,
.module_bit = OMAP24XX_EN_UART3_SHIFT,
.idlest_reg_id = 2,
.idlest_idle_bit = OMAP24XX_EN_UART3_SHIFT,
},
},
.class = &omap2_uart_class,
};
/* dss */
static struct omap_hwmod_opt_clk dss_opt_clks[] = {
/*
* The DSS HW needs all DSS clocks enabled during reset. The dss_core
* driver does not use these clocks.
*/
{ .role = "tv_clk", .clk = "dss_54m_fck" },
{ .role = "sys_clk", .clk = "dss2_fck" },
};
struct omap_hwmod omap2xxx_dss_core_hwmod = {
.name = "dss_core",
.class = &omap2_dss_hwmod_class,
.main_clk = "dss1_fck", /* instead of dss_fck */
.sdma_reqs = omap2xxx_dss_sdma_chs,
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_stdby_bit = OMAP24XX_ST_DSS_SHIFT,
},
},
.opt_clks = dss_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
.flags = HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
};
struct omap_hwmod omap2xxx_dss_dispc_hwmod = {
.name = "dss_dispc",
.class = &omap2_dispc_hwmod_class,
.mpu_irqs = omap2_dispc_irqs,
.main_clk = "dss1_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_stdby_bit = OMAP24XX_ST_DSS_SHIFT,
},
},
.flags = HWMOD_NO_IDLEST,
.dev_attr = &omap2_3_dss_dispc_dev_attr
};
static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
{ .role = "ick", .clk = "dss_ick" },
};
struct omap_hwmod omap2xxx_dss_rfbi_hwmod = {
.name = "dss_rfbi",
.class = &omap2_rfbi_hwmod_class,
.main_clk = "dss1_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
},
},
.opt_clks = dss_rfbi_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks),
.flags = HWMOD_NO_IDLEST,
};
struct omap_hwmod omap2xxx_dss_venc_hwmod = {
.name = "dss_venc",
.class = &omap2_venc_hwmod_class,
.main_clk = "dss_54m_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_DSS1_SHIFT,
.module_offs = CORE_MOD,
},
},
.flags = HWMOD_NO_IDLEST,
};
/* gpio dev_attr */
struct omap_gpio_dev_attr omap2xxx_gpio_dev_attr = {
.bank_width = 32,
.dbck_flag = false,
};
/* gpio1 */
struct omap_hwmod omap2xxx_gpio1_hwmod = {
.name = "gpio1",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio1_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &omap2xxx_gpio_dev_attr,
};
/* gpio2 */
struct omap_hwmod omap2xxx_gpio2_hwmod = {
.name = "gpio2",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio2_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &omap2xxx_gpio_dev_attr,
};
/* gpio3 */
struct omap_hwmod omap2xxx_gpio3_hwmod = {
.name = "gpio3",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio3_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &omap2xxx_gpio_dev_attr,
};
/* gpio4 */
struct omap_hwmod omap2xxx_gpio4_hwmod = {
.name = "gpio4",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio4_irqs,
.main_clk = "gpios_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_GPIOS_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
},
},
.class = &omap2xxx_gpio_hwmod_class,
.dev_attr = &omap2xxx_gpio_dev_attr,
};
/* mcspi1 */
static struct omap2_mcspi_dev_attr omap_mcspi1_dev_attr = {
.num_chipselect = 4,
};
struct omap_hwmod omap2xxx_mcspi1_hwmod = {
.name = "mcspi1",
.mpu_irqs = omap2_mcspi1_mpu_irqs,
.sdma_reqs = omap2_mcspi1_sdma_reqs,
.main_clk = "mcspi1_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MCSPI1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MCSPI1_SHIFT,
},
},
.class = &omap2xxx_mcspi_class,
.dev_attr = &omap_mcspi1_dev_attr,
};
/* mcspi2 */
static struct omap2_mcspi_dev_attr omap_mcspi2_dev_attr = {
.num_chipselect = 2,
};
struct omap_hwmod omap2xxx_mcspi2_hwmod = {
.name = "mcspi2",
.mpu_irqs = omap2_mcspi2_mpu_irqs,
.sdma_reqs = omap2_mcspi2_sdma_reqs,
.main_clk = "mcspi2_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP24XX_EN_MCSPI2_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP24XX_ST_MCSPI2_SHIFT,
},
},
.class = &omap2xxx_mcspi_class,
.dev_attr = &omap_mcspi2_dev_attr,
};
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* omap_hwmod_3xxx_data.c - hardware modules present on the OMAP3xxx chips * omap_hwmod_3xxx_data.c - hardware modules present on the OMAP3xxx chips
* *
* Copyright (C) 2009-2011 Nokia Corporation * Copyright (C) 2009-2011 Nokia Corporation
* Copyright (C) 2012 Texas Instruments, Inc.
* Paul Walmsley * Paul Walmsley
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -38,3302 +39,2973 @@ ...@@ -38,3302 +39,2973 @@
/* /*
* OMAP3xxx hardware module integration data * OMAP3xxx hardware module integration data
* *
* ALl of the data in this section should be autogeneratable from the * All of the data in this section should be autogeneratable from the
* TI hardware database or other technical documentation. Data that * TI hardware database or other technical documentation. Data that
* is driver-specific or driver-kernel integration-specific belongs * is driver-specific or driver-kernel integration-specific belongs
* elsewhere. * elsewhere.
*/ */
static struct omap_hwmod omap3xxx_mpu_hwmod; /*
static struct omap_hwmod omap3xxx_iva_hwmod; * IP blocks
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;
static struct omap_hwmod omap3430es1_dss_core_hwmod;
static struct omap_hwmod omap3xxx_dss_core_hwmod;
static struct omap_hwmod omap3xxx_dss_dispc_hwmod;
static struct omap_hwmod omap3xxx_dss_dsi1_hwmod;
static struct omap_hwmod omap3xxx_dss_rfbi_hwmod;
static struct omap_hwmod omap3xxx_dss_venc_hwmod;
static struct omap_hwmod omap3xxx_i2c1_hwmod;
static struct omap_hwmod omap3xxx_i2c2_hwmod;
static struct omap_hwmod omap3xxx_i2c3_hwmod;
static struct omap_hwmod omap3xxx_gpio1_hwmod;
static struct omap_hwmod omap3xxx_gpio2_hwmod;
static struct omap_hwmod omap3xxx_gpio3_hwmod;
static struct omap_hwmod omap3xxx_gpio4_hwmod;
static struct omap_hwmod omap3xxx_gpio5_hwmod;
static struct omap_hwmod omap3xxx_gpio6_hwmod;
static struct omap_hwmod omap34xx_sr1_hwmod;
static struct omap_hwmod omap34xx_sr2_hwmod;
static struct omap_hwmod omap34xx_mcspi1;
static struct omap_hwmod omap34xx_mcspi2;
static struct omap_hwmod omap34xx_mcspi3;
static struct omap_hwmod omap34xx_mcspi4;
static struct omap_hwmod omap3xxx_mmc1_hwmod;
static struct omap_hwmod omap3xxx_mmc2_hwmod;
static struct omap_hwmod omap3xxx_mmc3_hwmod;
static struct omap_hwmod am35xx_usbhsotg_hwmod;
static struct omap_hwmod omap3xxx_dma_system_hwmod;
static struct omap_hwmod omap3xxx_mcbsp1_hwmod;
static struct omap_hwmod omap3xxx_mcbsp2_hwmod;
static struct omap_hwmod omap3xxx_mcbsp3_hwmod;
static struct omap_hwmod omap3xxx_mcbsp4_hwmod;
static struct omap_hwmod omap3xxx_mcbsp5_hwmod;
static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod;
static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod;
static struct omap_hwmod omap3xxx_usb_host_hs_hwmod;
static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod;
/* L3 -> L4_CORE interface */
static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = {
.master = &omap3xxx_l3_main_hwmod,
.slave = &omap3xxx_l4_core_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L3 -> L4_PER interface */
static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_per = {
.master = &omap3xxx_l3_main_hwmod,
.slave = &omap3xxx_l4_per_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* L3 taret configuration and error log registers */ /* L3 */
static struct omap_hwmod_irq_info omap3xxx_l3_main_irqs[] = { static struct omap_hwmod_irq_info omap3xxx_l3_main_irqs[] = {
{ .irq = INT_34XX_L3_DBG_IRQ }, { .irq = INT_34XX_L3_DBG_IRQ },
{ .irq = INT_34XX_L3_APP_IRQ }, { .irq = INT_34XX_L3_APP_IRQ },
{ .irq = -1 } { .irq = -1 }
}; };
static struct omap_hwmod_addr_space omap3xxx_l3_main_addrs[] = {
{
.pa_start = 0x68000000,
.pa_end = 0x6800ffff,
.flags = ADDR_TYPE_RT,
},
{ }
};
/* MPU -> L3 interface */
static struct omap_hwmod_ocp_if omap3xxx_mpu__l3_main = {
.master = &omap3xxx_mpu_hwmod,
.slave = &omap3xxx_l3_main_hwmod,
.addr = omap3xxx_l3_main_addrs,
.user = OCP_USER_MPU,
};
/* Slave interfaces on the L3 interconnect */
static struct omap_hwmod_ocp_if *omap3xxx_l3_main_slaves[] = {
&omap3xxx_mpu__l3_main,
};
/* DSS -> l3 */
static struct omap_hwmod_ocp_if omap3xxx_dss__l3 = {
.master = &omap3xxx_dss_core_hwmod,
.slave = &omap3xxx_l3_main_hwmod,
.fw = {
.omap2 = {
.l3_perm_bit = OMAP3_L3_CORE_FW_INIT_ID_DSS,
.flags = OMAP_FIREWALL_L3,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* Master interfaces on the L3 interconnect */
static struct omap_hwmod_ocp_if *omap3xxx_l3_main_masters[] = {
&omap3xxx_l3_main__l4_core,
&omap3xxx_l3_main__l4_per,
};
/* L3 */
static struct omap_hwmod omap3xxx_l3_main_hwmod = { static struct omap_hwmod omap3xxx_l3_main_hwmod = {
.name = "l3_main", .name = "l3_main",
.class = &l3_hwmod_class, .class = &l3_hwmod_class,
.mpu_irqs = omap3xxx_l3_main_irqs, .mpu_irqs = omap3xxx_l3_main_irqs,
.masters = omap3xxx_l3_main_masters,
.masters_cnt = ARRAY_SIZE(omap3xxx_l3_main_masters),
.slaves = omap3xxx_l3_main_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_l3_main_slaves),
.flags = HWMOD_NO_IDLEST, .flags = HWMOD_NO_IDLEST,
}; };
static struct omap_hwmod omap3xxx_l4_wkup_hwmod; /* L4 CORE */
static struct omap_hwmod omap3xxx_uart1_hwmod; static struct omap_hwmod omap3xxx_l4_core_hwmod = {
static struct omap_hwmod omap3xxx_uart2_hwmod; .name = "l4_core",
static struct omap_hwmod omap3xxx_uart3_hwmod; .class = &l4_hwmod_class,
static struct omap_hwmod omap3xxx_uart4_hwmod; .flags = HWMOD_NO_IDLEST,
static struct omap_hwmod am35xx_uart4_hwmod;
static struct omap_hwmod omap3xxx_usbhsotg_hwmod;
/* l3_core -> usbhsotg interface */
static struct omap_hwmod_ocp_if omap3xxx_usbhsotg__l3 = {
.master = &omap3xxx_usbhsotg_hwmod,
.slave = &omap3xxx_l3_main_hwmod,
.clk = "core_l3_ick",
.user = OCP_USER_MPU,
}; };
/* l3_core -> am35xx_usbhsotg interface */ /* L4 PER */
static struct omap_hwmod_ocp_if am35xx_usbhsotg__l3 = { static struct omap_hwmod omap3xxx_l4_per_hwmod = {
.master = &am35xx_usbhsotg_hwmod, .name = "l4_per",
.slave = &omap3xxx_l3_main_hwmod, .class = &l4_hwmod_class,
.clk = "core_l3_ick", .flags = HWMOD_NO_IDLEST,
.user = OCP_USER_MPU,
};
/* L4_CORE -> L4_WKUP interface */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_l4_wkup_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* L4 CORE -> MMC1 interface */ /* L4 WKUP */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmc1 = { static struct omap_hwmod omap3xxx_l4_wkup_hwmod = {
.master = &omap3xxx_l4_core_hwmod, .name = "l4_wkup",
.slave = &omap3xxx_mmc1_hwmod, .class = &l4_hwmod_class,
.clk = "mmchs1_ick", .flags = HWMOD_NO_IDLEST,
.addr = omap2430_mmc1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
.flags = OMAP_FIREWALL_L4
}; };
/* L4 CORE -> MMC2 interface */ /* L4 SEC */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmc2 = { static struct omap_hwmod omap3xxx_l4_sec_hwmod = {
.master = &omap3xxx_l4_core_hwmod, .name = "l4_sec",
.slave = &omap3xxx_mmc2_hwmod, .class = &l4_hwmod_class,
.clk = "mmchs2_ick", .flags = HWMOD_NO_IDLEST,
.addr = omap2430_mmc2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
.flags = OMAP_FIREWALL_L4
}; };
/* L4 CORE -> MMC3 interface */ /* MPU */
static struct omap_hwmod_addr_space omap3xxx_mmc3_addr_space[] = { static struct omap_hwmod omap3xxx_mpu_hwmod = {
{ .name = "mpu",
.pa_start = 0x480ad000, .class = &mpu_hwmod_class,
.pa_end = 0x480ad1ff, .main_clk = "arm_fck",
.flags = ADDR_TYPE_RT,
},
{ }
}; };
static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmc3 = { /* IVA2 (IVA2) */
.master = &omap3xxx_l4_core_hwmod, static struct omap_hwmod_rst_info omap3xxx_iva_resets[] = {
.slave = &omap3xxx_mmc3_hwmod, { .name = "logic", .rst_shift = 0 },
.clk = "mmchs3_ick", { .name = "seq0", .rst_shift = 1 },
.addr = omap3xxx_mmc3_addr_space, { .name = "seq1", .rst_shift = 2 },
.user = OCP_USER_MPU | OCP_USER_SDMA,
.flags = OMAP_FIREWALL_L4
}; };
/* L4 CORE -> UART1 interface */ static struct omap_hwmod omap3xxx_iva_hwmod = {
static struct omap_hwmod_addr_space omap3xxx_uart1_addr_space[] = { .name = "iva",
{ .class = &iva_hwmod_class,
.pa_start = OMAP3_UART1_BASE, .clkdm_name = "iva2_clkdm",
.pa_end = OMAP3_UART1_BASE + SZ_8K - 1, .rst_lines = omap3xxx_iva_resets,
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT, .rst_lines_cnt = ARRAY_SIZE(omap3xxx_iva_resets),
}, .main_clk = "iva2_ck",
{ }
}; };
static struct omap_hwmod_ocp_if omap3_l4_core__uart1 = { /* timer class */
.master = &omap3xxx_l4_core_hwmod, static struct omap_hwmod_class_sysconfig omap3xxx_timer_1ms_sysc = {
.slave = &omap3xxx_uart1_hwmod, .rev_offs = 0x0000,
.clk = "uart1_ick", .sysc_offs = 0x0010,
.addr = omap3xxx_uart1_addr_space, .syss_offs = 0x0014,
.user = OCP_USER_MPU | OCP_USER_SDMA, .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
/* L4 CORE -> UART2 interface */ static struct omap_hwmod_class omap3xxx_timer_1ms_hwmod_class = {
static struct omap_hwmod_addr_space omap3xxx_uart2_addr_space[] = { .name = "timer",
{ .sysc = &omap3xxx_timer_1ms_sysc,
.pa_start = OMAP3_UART2_BASE, .rev = OMAP_TIMER_IP_VERSION_1,
.pa_end = OMAP3_UART2_BASE + SZ_1K - 1,
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
},
{ }
}; };
static struct omap_hwmod_ocp_if omap3_l4_core__uart2 = { static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = {
.master = &omap3xxx_l4_core_hwmod, .rev_offs = 0x0000,
.slave = &omap3xxx_uart2_hwmod, .sysc_offs = 0x0010,
.clk = "uart2_ick", .syss_offs = 0x0014,
.addr = omap3xxx_uart2_addr_space, .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
.user = OCP_USER_MPU | OCP_USER_SDMA, SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
/* L4 PER -> UART3 interface */ static struct omap_hwmod_class omap3xxx_timer_hwmod_class = {
static struct omap_hwmod_addr_space omap3xxx_uart3_addr_space[] = { .name = "timer",
{ .sysc = &omap3xxx_timer_sysc,
.pa_start = OMAP3_UART3_BASE, .rev = OMAP_TIMER_IP_VERSION_1,
.pa_end = OMAP3_UART3_BASE + SZ_1K - 1,
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
},
{ }
}; };
static struct omap_hwmod_ocp_if omap3_l4_per__uart3 = { /* secure timers dev attribute */
.master = &omap3xxx_l4_per_hwmod, static struct omap_timer_capability_dev_attr capability_secure_dev_attr = {
.slave = &omap3xxx_uart3_hwmod, .timer_capability = OMAP_TIMER_SECURE,
.clk = "uart3_ick",
.addr = omap3xxx_uart3_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* L4 PER -> UART4 interface */ /* always-on timers dev attribute */
static struct omap_hwmod_addr_space omap3xxx_uart4_addr_space[] = { static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = {
{ .timer_capability = OMAP_TIMER_ALWON,
.pa_start = OMAP3_UART4_BASE,
.pa_end = OMAP3_UART4_BASE + SZ_1K - 1,
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
},
{ }
}; };
static struct omap_hwmod_ocp_if omap3_l4_per__uart4 = { /* pwm timers dev attribute */
.master = &omap3xxx_l4_per_hwmod, static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = {
.slave = &omap3xxx_uart4_hwmod, .timer_capability = OMAP_TIMER_HAS_PWM,
.clk = "uart4_ick",
.addr = omap3xxx_uart4_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* AM35xx: L4 CORE -> UART4 interface */ /* timer1 */
static struct omap_hwmod_addr_space am35xx_uart4_addr_space[] = { static struct omap_hwmod omap3xxx_timer1_hwmod = {
{ .name = "timer1",
.pa_start = OMAP3_UART4_AM35XX_BASE, .mpu_irqs = omap2_timer1_mpu_irqs,
.pa_end = OMAP3_UART4_AM35XX_BASE + SZ_1K - 1, .main_clk = "gpt1_fck",
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT, .prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT1_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT1_SHIFT,
},
}, },
.dev_attr = &capability_alwon_dev_attr,
.class = &omap3xxx_timer_1ms_hwmod_class,
}; };
static struct omap_hwmod_ocp_if am35xx_l4_core__uart4 = { /* timer2 */
.master = &omap3xxx_l4_core_hwmod, static struct omap_hwmod omap3xxx_timer2_hwmod = {
.slave = &am35xx_uart4_hwmod, .name = "timer2",
.clk = "uart4_ick", .mpu_irqs = omap2_timer2_mpu_irqs,
.addr = am35xx_uart4_addr_space, .main_clk = "gpt2_fck",
.user = OCP_USER_MPU | OCP_USER_SDMA, .prcm = {
};
/* L4 CORE -> I2C1 interface */
static struct omap_hwmod_ocp_if omap3_l4_core__i2c1 = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_i2c1_hwmod,
.clk = "i2c1_ick",
.addr = omap2_i2c1_addr_space,
.fw = {
.omap2 = { .omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_I2C1_REGION, .prcm_reg_id = 1,
.l4_prot_group = 7, .module_bit = OMAP3430_EN_GPT2_SHIFT,
.flags = OMAP_FIREWALL_L4, .module_offs = OMAP3430_PER_MOD,
} .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT,
},
}, },
.user = OCP_USER_MPU | OCP_USER_SDMA, .dev_attr = &capability_alwon_dev_attr,
.class = &omap3xxx_timer_1ms_hwmod_class,
}; };
/* L4 CORE -> I2C2 interface */ /* timer3 */
static struct omap_hwmod_ocp_if omap3_l4_core__i2c2 = { static struct omap_hwmod omap3xxx_timer3_hwmod = {
.master = &omap3xxx_l4_core_hwmod, .name = "timer3",
.slave = &omap3xxx_i2c2_hwmod, .mpu_irqs = omap2_timer3_mpu_irqs,
.clk = "i2c2_ick", .main_clk = "gpt3_fck",
.addr = omap2_i2c2_addr_space, .prcm = {
.fw = {
.omap2 = { .omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_I2C2_REGION, .prcm_reg_id = 1,
.l4_prot_group = 7, .module_bit = OMAP3430_EN_GPT3_SHIFT,
.flags = OMAP_FIREWALL_L4, .module_offs = OMAP3430_PER_MOD,
} .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT,
},
}, },
.user = OCP_USER_MPU | OCP_USER_SDMA, .dev_attr = &capability_alwon_dev_attr,
.class = &omap3xxx_timer_hwmod_class,
}; };
/* L4 CORE -> I2C3 interface */ /* timer4 */
static struct omap_hwmod_addr_space omap3xxx_i2c3_addr_space[] = { static struct omap_hwmod omap3xxx_timer4_hwmod = {
{ .name = "timer4",
.pa_start = 0x48060000, .mpu_irqs = omap2_timer4_mpu_irqs,
.pa_end = 0x48060000 + SZ_128 - 1, .main_clk = "gpt4_fck",
.flags = ADDR_TYPE_RT, .prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT4_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT,
},
}, },
{ } .dev_attr = &capability_alwon_dev_attr,
.class = &omap3xxx_timer_hwmod_class,
}; };
static struct omap_hwmod_ocp_if omap3_l4_core__i2c3 = { /* timer5 */
.master = &omap3xxx_l4_core_hwmod, static struct omap_hwmod omap3xxx_timer5_hwmod = {
.slave = &omap3xxx_i2c3_hwmod, .name = "timer5",
.clk = "i2c3_ick", .mpu_irqs = omap2_timer5_mpu_irqs,
.addr = omap3xxx_i2c3_addr_space, .main_clk = "gpt5_fck",
.fw = { .prcm = {
.omap2 = { .omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_I2C3_REGION, .prcm_reg_id = 1,
.l4_prot_group = 7, .module_bit = OMAP3430_EN_GPT5_SHIFT,
.flags = OMAP_FIREWALL_L4, .module_offs = OMAP3430_PER_MOD,
} .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT,
},
}, },
.user = OCP_USER_MPU | OCP_USER_SDMA, .dev_attr = &capability_alwon_dev_attr,
}; .class = &omap3xxx_timer_hwmod_class,
static struct omap_hwmod_irq_info omap3_smartreflex_mpu_irqs[] = {
{ .irq = 18},
{ .irq = -1 }
};
static struct omap_hwmod_irq_info omap3_smartreflex_core_irqs[] = {
{ .irq = 19},
{ .irq = -1 }
}; };
/* L4 CORE -> SR1 interface */ /* timer6 */
static struct omap_hwmod_addr_space omap3_sr1_addr_space[] = { static struct omap_hwmod omap3xxx_timer6_hwmod = {
{ .name = "timer6",
.pa_start = OMAP34XX_SR1_BASE, .mpu_irqs = omap2_timer6_mpu_irqs,
.pa_end = OMAP34XX_SR1_BASE + SZ_1K - 1, .main_clk = "gpt6_fck",
.flags = ADDR_TYPE_RT, .prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT6_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT,
},
}, },
{ } .dev_attr = &capability_alwon_dev_attr,
}; .class = &omap3xxx_timer_hwmod_class,
static struct omap_hwmod_ocp_if omap3_l4_core__sr1 = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap34xx_sr1_hwmod,
.clk = "sr_l4_ick",
.addr = omap3_sr1_addr_space,
.user = OCP_USER_MPU,
}; };
/* L4 CORE -> SR1 interface */ /* timer7 */
static struct omap_hwmod_addr_space omap3_sr2_addr_space[] = { static struct omap_hwmod omap3xxx_timer7_hwmod = {
{ .name = "timer7",
.pa_start = OMAP34XX_SR2_BASE, .mpu_irqs = omap2_timer7_mpu_irqs,
.pa_end = OMAP34XX_SR2_BASE + SZ_1K - 1, .main_clk = "gpt7_fck",
.flags = ADDR_TYPE_RT, .prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT7_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT,
},
}, },
{ } .dev_attr = &capability_alwon_dev_attr,
}; .class = &omap3xxx_timer_hwmod_class,
static struct omap_hwmod_ocp_if omap3_l4_core__sr2 = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap34xx_sr2_hwmod,
.clk = "sr_l4_ick",
.addr = omap3_sr2_addr_space,
.user = OCP_USER_MPU,
}; };
/* /* timer8 */
* usbhsotg interface data static struct omap_hwmod omap3xxx_timer8_hwmod = {
*/ .name = "timer8",
.mpu_irqs = omap2_timer8_mpu_irqs,
static struct omap_hwmod_addr_space omap3xxx_usbhsotg_addrs[] = { .main_clk = "gpt8_fck",
{ .prcm = {
.pa_start = OMAP34XX_HSUSB_OTG_BASE, .omap2 = {
.pa_end = OMAP34XX_HSUSB_OTG_BASE + SZ_4K - 1, .prcm_reg_id = 1,
.flags = ADDR_TYPE_RT .module_bit = OMAP3430_EN_GPT8_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT8_SHIFT,
},
}, },
{ } .dev_attr = &capability_pwm_dev_attr,
}; .class = &omap3xxx_timer_hwmod_class,
/* l4_core -> usbhsotg */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__usbhsotg = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_usbhsotg_hwmod,
.clk = "l4_ick",
.addr = omap3xxx_usbhsotg_addrs,
.user = OCP_USER_MPU,
};
static struct omap_hwmod_ocp_if *omap3xxx_usbhsotg_masters[] = {
&omap3xxx_usbhsotg__l3,
};
static struct omap_hwmod_ocp_if *omap3xxx_usbhsotg_slaves[] = {
&omap3xxx_l4_core__usbhsotg,
}; };
static struct omap_hwmod_addr_space am35xx_usbhsotg_addrs[] = { /* timer9 */
{ static struct omap_hwmod omap3xxx_timer9_hwmod = {
.pa_start = AM35XX_IPSS_USBOTGSS_BASE, .name = "timer9",
.pa_end = AM35XX_IPSS_USBOTGSS_BASE + SZ_4K - 1, .mpu_irqs = omap2_timer9_mpu_irqs,
.flags = ADDR_TYPE_RT .main_clk = "gpt9_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT9_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT9_SHIFT,
},
}, },
{ } .dev_attr = &capability_pwm_dev_attr,
}; .class = &omap3xxx_timer_hwmod_class,
/* l4_core -> usbhsotg */
static struct omap_hwmod_ocp_if am35xx_l4_core__usbhsotg = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &am35xx_usbhsotg_hwmod,
.clk = "l4_ick",
.addr = am35xx_usbhsotg_addrs,
.user = OCP_USER_MPU,
};
static struct omap_hwmod_ocp_if *am35xx_usbhsotg_masters[] = {
&am35xx_usbhsotg__l3,
};
static struct omap_hwmod_ocp_if *am35xx_usbhsotg_slaves[] = {
&am35xx_l4_core__usbhsotg,
};
/* Slave interfaces on the L4_CORE interconnect */
static struct omap_hwmod_ocp_if *omap3xxx_l4_core_slaves[] = {
&omap3xxx_l3_main__l4_core,
};
/* L4 CORE */
static struct omap_hwmod omap3xxx_l4_core_hwmod = {
.name = "l4_core",
.class = &l4_hwmod_class,
.slaves = omap3xxx_l4_core_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_l4_core_slaves),
.flags = HWMOD_NO_IDLEST,
};
/* Slave interfaces on the L4_PER interconnect */
static struct omap_hwmod_ocp_if *omap3xxx_l4_per_slaves[] = {
&omap3xxx_l3_main__l4_per,
};
/* L4 PER */
static struct omap_hwmod omap3xxx_l4_per_hwmod = {
.name = "l4_per",
.class = &l4_hwmod_class,
.slaves = omap3xxx_l4_per_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_l4_per_slaves),
.flags = HWMOD_NO_IDLEST,
};
/* Slave interfaces on the L4_WKUP interconnect */
static struct omap_hwmod_ocp_if *omap3xxx_l4_wkup_slaves[] = {
&omap3xxx_l4_core__l4_wkup,
};
/* L4 WKUP */
static struct omap_hwmod omap3xxx_l4_wkup_hwmod = {
.name = "l4_wkup",
.class = &l4_hwmod_class,
.slaves = omap3xxx_l4_wkup_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_l4_wkup_slaves),
.flags = HWMOD_NO_IDLEST,
}; };
/* Master interfaces on the MPU device */ /* timer10 */
static struct omap_hwmod_ocp_if *omap3xxx_mpu_masters[] = { static struct omap_hwmod omap3xxx_timer10_hwmod = {
&omap3xxx_mpu__l3_main, .name = "timer10",
.mpu_irqs = omap2_timer10_mpu_irqs,
.main_clk = "gpt10_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT10_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT10_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.class = &omap3xxx_timer_1ms_hwmod_class,
}; };
/* MPU */ /* timer11 */
static struct omap_hwmod omap3xxx_mpu_hwmod = { static struct omap_hwmod omap3xxx_timer11_hwmod = {
.name = "mpu", .name = "timer11",
.class = &mpu_hwmod_class, .mpu_irqs = omap2_timer11_mpu_irqs,
.main_clk = "arm_fck", .main_clk = "gpt11_fck",
.masters = omap3xxx_mpu_masters, .prcm = {
.masters_cnt = ARRAY_SIZE(omap3xxx_mpu_masters), .omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT11_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT11_SHIFT,
},
},
.dev_attr = &capability_pwm_dev_attr,
.class = &omap3xxx_timer_hwmod_class,
}; };
/* /* timer12 */
* IVA2_2 interface data static struct omap_hwmod_irq_info omap3xxx_timer12_mpu_irqs[] = {
*/ { .irq = 95, },
{ .irq = -1 }
/* IVA2 <- L3 interface */
static struct omap_hwmod_ocp_if omap3xxx_l3__iva = {
.master = &omap3xxx_l3_main_hwmod,
.slave = &omap3xxx_iva_hwmod,
.clk = "iva2_ck",
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_ocp_if *omap3xxx_iva_masters[] = { static struct omap_hwmod omap3xxx_timer12_hwmod = {
&omap3xxx_l3__iva, .name = "timer12",
.mpu_irqs = omap3xxx_timer12_mpu_irqs,
.main_clk = "gpt12_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT12_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT12_SHIFT,
},
},
.dev_attr = &capability_secure_dev_attr,
.class = &omap3xxx_timer_hwmod_class,
}; };
/* /*
* IVA2 (IVA2) * 'wd_timer' class
* 32-bit watchdog upward counter that generates a pulse on the reset pin on
* overflow condition
*/ */
static struct omap_hwmod omap3xxx_iva_hwmod = { static struct omap_hwmod_class_sysconfig omap3xxx_wd_timer_sysc = {
.name = "iva",
.class = &iva_hwmod_class,
.masters = omap3xxx_iva_masters,
.masters_cnt = ARRAY_SIZE(omap3xxx_iva_masters),
};
/* timer class */
static struct omap_hwmod_class_sysconfig omap3xxx_timer_1ms_sysc = {
.rev_offs = 0x0000, .rev_offs = 0x0000,
.sysc_offs = 0x0010, .sysc_offs = 0x0010,
.syss_offs = 0x0014, .syss_offs = 0x0014,
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_CLOCKACTIVITY | .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE |
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE), SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
SYSS_HAS_RESET_STATUS),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1, .sysc_fields = &omap_hwmod_sysc_type1,
};
static struct omap_hwmod_class omap3xxx_timer_1ms_hwmod_class = {
.name = "timer",
.sysc = &omap3xxx_timer_1ms_sysc,
.rev = OMAP_TIMER_IP_VERSION_1,
}; };
static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = { /* I2C common */
.rev_offs = 0x0000, static struct omap_hwmod_class_sysconfig i2c_sysc = {
.sysc_offs = 0x0010, .rev_offs = 0x00,
.syss_offs = 0x0014, .sysc_offs = 0x20,
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP | .syss_offs = 0x10,
SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1, .clockact = CLOCKACT_TEST_ICLK,
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_class omap3xxx_timer_hwmod_class = { static struct omap_hwmod_class omap3xxx_wd_timer_hwmod_class = {
.name = "timer", .name = "wd_timer",
.sysc = &omap3xxx_timer_sysc, .sysc = &omap3xxx_wd_timer_sysc,
.rev = OMAP_TIMER_IP_VERSION_1, .pre_shutdown = &omap2_wd_timer_disable
}; };
/* secure timers dev attribute */ static struct omap_hwmod omap3xxx_wd_timer2_hwmod = {
static struct omap_timer_capability_dev_attr capability_secure_dev_attr = { .name = "wd_timer2",
.timer_capability = OMAP_TIMER_SECURE, .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_ST_WDT2_SHIFT,
},
},
/*
* XXX: Use software supervised mode, HW supervised smartidle seems to
* block CORE power domain idle transitions. Maybe a HW bug in wdt2?
*/
.flags = HWMOD_SWSUP_SIDLE,
}; };
/* always-on timers dev attribute */ /* UART1 */
static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = { static struct omap_hwmod omap3xxx_uart1_hwmod = {
.timer_capability = OMAP_TIMER_ALWON, .name = "uart1",
.mpu_irqs = omap2_uart1_mpu_irqs,
.sdma_reqs = omap2_uart1_sdma_reqs,
.main_clk = "uart1_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_UART1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_UART1_SHIFT,
},
},
.class = &omap2_uart_class,
}; };
/* pwm timers dev attribute */ /* UART2 */
static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = { static struct omap_hwmod omap3xxx_uart2_hwmod = {
.timer_capability = OMAP_TIMER_HAS_PWM, .name = "uart2",
.mpu_irqs = omap2_uart2_mpu_irqs,
.sdma_reqs = omap2_uart2_sdma_reqs,
.main_clk = "uart2_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_UART2_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_UART2_SHIFT,
},
},
.class = &omap2_uart_class,
}; };
/* timer1 */ /* UART3 */
static struct omap_hwmod omap3xxx_timer1_hwmod; static struct omap_hwmod omap3xxx_uart3_hwmod = {
.name = "uart3",
static struct omap_hwmod_addr_space omap3xxx_timer1_addrs[] = { .mpu_irqs = omap2_uart3_mpu_irqs,
{ .sdma_reqs = omap2_uart3_sdma_reqs,
.pa_start = 0x48318000, .main_clk = "uart3_fck",
.pa_end = 0x48318000 + SZ_1K - 1, .prcm = {
.flags = ADDR_TYPE_RT .omap2 = {
.module_offs = OMAP3430_PER_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_UART3_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_UART3_SHIFT,
},
}, },
{ } .class = &omap2_uart_class,
}; };
/* l4_wkup -> timer1 */ /* UART4 */
static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__timer1 = { static struct omap_hwmod_irq_info uart4_mpu_irqs[] = {
.master = &omap3xxx_l4_wkup_hwmod, { .irq = INT_36XX_UART4_IRQ, },
.slave = &omap3xxx_timer1_hwmod, { .irq = -1 }
.clk = "gpt1_ick",
.addr = omap3xxx_timer1_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer1 slave port */ static struct omap_hwmod_dma_info uart4_sdma_reqs[] = {
static struct omap_hwmod_ocp_if *omap3xxx_timer1_slaves[] = { { .name = "rx", .dma_req = OMAP36XX_DMA_UART4_RX, },
&omap3xxx_l4_wkup__timer1, { .name = "tx", .dma_req = OMAP36XX_DMA_UART4_TX, },
{ .dma_req = -1 }
}; };
/* timer1 hwmod */ static struct omap_hwmod omap36xx_uart4_hwmod = {
static struct omap_hwmod omap3xxx_timer1_hwmod = { .name = "uart4",
.name = "timer1", .mpu_irqs = uart4_mpu_irqs,
.mpu_irqs = omap2_timer1_mpu_irqs, .sdma_reqs = uart4_sdma_reqs,
.main_clk = "gpt1_fck", .main_clk = "uart4_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = OMAP3430_PER_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT1_SHIFT, .module_bit = OMAP3630_EN_UART4_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT1_SHIFT, .idlest_idle_bit = OMAP3630_EN_UART4_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr, .class = &omap2_uart_class,
.slaves = omap3xxx_timer1_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer1_slaves),
.class = &omap3xxx_timer_1ms_hwmod_class,
}; };
/* timer2 */ static struct omap_hwmod_irq_info am35xx_uart4_mpu_irqs[] = {
static struct omap_hwmod omap3xxx_timer2_hwmod; { .irq = INT_35XX_UART4_IRQ, },
};
static struct omap_hwmod_addr_space omap3xxx_timer2_addrs[] = { static struct omap_hwmod_dma_info am35xx_uart4_sdma_reqs[] = {
{ { .name = "rx", .dma_req = AM35XX_DMA_UART4_RX, },
.pa_start = 0x49032000, { .name = "tx", .dma_req = AM35XX_DMA_UART4_TX, },
.pa_end = 0x49032000 + SZ_1K - 1, };
.flags = ADDR_TYPE_RT
static struct omap_hwmod am35xx_uart4_hwmod = {
.name = "uart4",
.mpu_irqs = am35xx_uart4_mpu_irqs,
.sdma_reqs = am35xx_uart4_sdma_reqs,
.main_clk = "uart4_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_UART4_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_UART4_SHIFT,
},
}, },
{ } .class = &omap2_uart_class,
}; };
/* l4_per -> timer2 */ static struct omap_hwmod_class i2c_class = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer2 = { .name = "i2c",
.master = &omap3xxx_l4_per_hwmod, .sysc = &i2c_sysc,
.slave = &omap3xxx_timer2_hwmod, .rev = OMAP_I2C_IP_VERSION_1,
.clk = "gpt2_ick", .reset = &omap_i2c_reset,
.addr = omap3xxx_timer2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer2 slave port */ static struct omap_hwmod_dma_info omap3xxx_dss_sdma_chs[] = {
static struct omap_hwmod_ocp_if *omap3xxx_timer2_slaves[] = { { .name = "dispc", .dma_req = 5 },
&omap3xxx_l4_per__timer2, { .name = "dsi1", .dma_req = 74 },
{ .dma_req = -1 }
};
/* dss */
static struct omap_hwmod_opt_clk dss_opt_clks[] = {
/*
* The DSS HW needs all DSS clocks enabled during reset. The dss_core
* driver does not use these clocks.
*/
{ .role = "sys_clk", .clk = "dss2_alwon_fck" },
{ .role = "tv_clk", .clk = "dss_tv_fck" },
/* required only on OMAP3430 */
{ .role = "tv_dac_clk", .clk = "dss_96m_fck" },
}; };
/* timer2 hwmod */ static struct omap_hwmod omap3430es1_dss_core_hwmod = {
static struct omap_hwmod omap3xxx_timer2_hwmod = { .name = "dss_core",
.name = "timer2", .class = &omap2_dss_hwmod_class,
.mpu_irqs = omap2_timer2_mpu_irqs, .main_clk = "dss1_alwon_fck", /* instead of dss_fck */
.main_clk = "gpt2_fck", .sdma_reqs = omap3xxx_dss_sdma_chs,
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT2_SHIFT, .module_bit = OMAP3430_EN_DSS1_SHIFT,
.module_offs = OMAP3430_PER_MOD, .module_offs = OMAP3430_DSS_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT, .idlest_stdby_bit = OMAP3430ES1_ST_DSS_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr, .opt_clks = dss_opt_clks,
.slaves = omap3xxx_timer2_slaves, .opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer2_slaves), .flags = HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.class = &omap3xxx_timer_1ms_hwmod_class,
};
/* timer3 */
static struct omap_hwmod omap3xxx_timer3_hwmod;
static struct omap_hwmod_addr_space omap3xxx_timer3_addrs[] = {
{
.pa_start = 0x49034000,
.pa_end = 0x49034000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
};
/* l4_per -> timer3 */
static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer3 = {
.master = &omap3xxx_l4_per_hwmod,
.slave = &omap3xxx_timer3_hwmod,
.clk = "gpt3_ick",
.addr = omap3xxx_timer3_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
/* timer3 slave port */
static struct omap_hwmod_ocp_if *omap3xxx_timer3_slaves[] = {
&omap3xxx_l4_per__timer3,
}; };
/* timer3 hwmod */ static struct omap_hwmod omap3xxx_dss_core_hwmod = {
static struct omap_hwmod omap3xxx_timer3_hwmod = { .name = "dss_core",
.name = "timer3", .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_timer3_mpu_irqs, .class = &omap2_dss_hwmod_class,
.main_clk = "gpt3_fck", .main_clk = "dss1_alwon_fck", /* instead of dss_fck */
.sdma_reqs = omap3xxx_dss_sdma_chs,
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT3_SHIFT, .module_bit = OMAP3430_EN_DSS1_SHIFT,
.module_offs = OMAP3430_PER_MOD, .module_offs = OMAP3430_DSS_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT, .idlest_idle_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT,
.idlest_stdby_bit = OMAP3430ES2_ST_DSS_STDBY_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr, .opt_clks = dss_opt_clks,
.slaves = omap3xxx_timer3_slaves, .opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer3_slaves),
.class = &omap3xxx_timer_hwmod_class,
}; };
/* timer4 */ /*
static struct omap_hwmod omap3xxx_timer4_hwmod; * 'dispc' class
* display controller
static struct omap_hwmod_addr_space omap3xxx_timer4_addrs[] = { */
{
.pa_start = 0x49036000,
.pa_end = 0x49036000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
};
/* l4_per -> timer4 */ static struct omap_hwmod_class_sysconfig omap3_dispc_sysc = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer4 = { .rev_offs = 0x0000,
.master = &omap3xxx_l4_per_hwmod, .sysc_offs = 0x0010,
.slave = &omap3xxx_timer4_hwmod, .syss_offs = 0x0014,
.clk = "gpt4_ick", .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE |
.addr = omap3xxx_timer4_addrs, SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
.user = OCP_USER_MPU | OCP_USER_SDMA, SYSC_HAS_ENAWAKEUP),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
/* timer4 slave port */ static struct omap_hwmod_class omap3_dispc_hwmod_class = {
static struct omap_hwmod_ocp_if *omap3xxx_timer4_slaves[] = { .name = "dispc",
&omap3xxx_l4_per__timer4, .sysc = &omap3_dispc_sysc,
}; };
/* timer4 hwmod */ static struct omap_hwmod omap3xxx_dss_dispc_hwmod = {
static struct omap_hwmod omap3xxx_timer4_hwmod = { .name = "dss_dispc",
.name = "timer4", .class = &omap3_dispc_hwmod_class,
.mpu_irqs = omap2_timer4_mpu_irqs, .mpu_irqs = omap2_dispc_irqs,
.main_clk = "gpt4_fck", .main_clk = "dss1_alwon_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT4_SHIFT, .module_bit = OMAP3430_EN_DSS1_SHIFT,
.module_offs = OMAP3430_PER_MOD, .module_offs = OMAP3430_DSS_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr, .flags = HWMOD_NO_IDLEST,
.slaves = omap3xxx_timer4_slaves, .dev_attr = &omap2_3_dss_dispc_dev_attr
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer4_slaves),
.class = &omap3xxx_timer_hwmod_class,
}; };
/* timer5 */ /*
static struct omap_hwmod omap3xxx_timer5_hwmod; * 'dsi' class
* display serial interface controller
*/
static struct omap_hwmod_addr_space omap3xxx_timer5_addrs[] = { static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = {
{ .name = "dsi",
.pa_start = 0x49038000,
.pa_end = 0x49038000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
}; };
/* l4_per -> timer5 */ static struct omap_hwmod_irq_info omap3xxx_dsi1_irqs[] = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer5 = { { .irq = 25 },
.master = &omap3xxx_l4_per_hwmod, { .irq = -1 }
.slave = &omap3xxx_timer5_hwmod,
.clk = "gpt5_ick",
.addr = omap3xxx_timer5_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer5 slave port */ /* dss_dsi1 */
static struct omap_hwmod_ocp_if *omap3xxx_timer5_slaves[] = { static struct omap_hwmod_opt_clk dss_dsi1_opt_clks[] = {
&omap3xxx_l4_per__timer5, { .role = "sys_clk", .clk = "dss2_alwon_fck" },
}; };
/* timer5 hwmod */ static struct omap_hwmod omap3xxx_dss_dsi1_hwmod = {
static struct omap_hwmod omap3xxx_timer5_hwmod = { .name = "dss_dsi1",
.name = "timer5", .class = &omap3xxx_dsi_hwmod_class,
.mpu_irqs = omap2_timer5_mpu_irqs, .mpu_irqs = omap3xxx_dsi1_irqs,
.main_clk = "gpt5_fck", .main_clk = "dss1_alwon_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT5_SHIFT, .module_bit = OMAP3430_EN_DSS1_SHIFT,
.module_offs = OMAP3430_PER_MOD, .module_offs = OMAP3430_DSS_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr, .opt_clks = dss_dsi1_opt_clks,
.slaves = omap3xxx_timer5_slaves, .opt_clks_cnt = ARRAY_SIZE(dss_dsi1_opt_clks),
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer5_slaves), .flags = HWMOD_NO_IDLEST,
.class = &omap3xxx_timer_hwmod_class,
}; };
/* timer6 */ static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
static struct omap_hwmod omap3xxx_timer6_hwmod; { .role = "ick", .clk = "dss_ick" },
static struct omap_hwmod_addr_space omap3xxx_timer6_addrs[] = {
{
.pa_start = 0x4903A000,
.pa_end = 0x4903A000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
}; };
/* l4_per -> timer6 */ static struct omap_hwmod omap3xxx_dss_rfbi_hwmod = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer6 = { .name = "dss_rfbi",
.master = &omap3xxx_l4_per_hwmod, .class = &omap2_rfbi_hwmod_class,
.slave = &omap3xxx_timer6_hwmod, .main_clk = "dss1_alwon_fck",
.clk = "gpt6_ick", .prcm = {
.addr = omap3xxx_timer6_addrs, .omap2 = {
.user = OCP_USER_MPU | OCP_USER_SDMA, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_DSS1_SHIFT,
.module_offs = OMAP3430_DSS_MOD,
},
},
.opt_clks = dss_rfbi_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks),
.flags = HWMOD_NO_IDLEST,
}; };
/* timer6 slave port */ static struct omap_hwmod_opt_clk dss_venc_opt_clks[] = {
static struct omap_hwmod_ocp_if *omap3xxx_timer6_slaves[] = { /* required only on OMAP3430 */
&omap3xxx_l4_per__timer6, { .role = "tv_dac_clk", .clk = "dss_96m_fck" },
}; };
/* timer6 hwmod */ static struct omap_hwmod omap3xxx_dss_venc_hwmod = {
static struct omap_hwmod omap3xxx_timer6_hwmod = { .name = "dss_venc",
.name = "timer6", .class = &omap2_venc_hwmod_class,
.mpu_irqs = omap2_timer6_mpu_irqs, .main_clk = "dss_tv_fck",
.main_clk = "gpt6_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT6_SHIFT, .module_bit = OMAP3430_EN_DSS1_SHIFT,
.module_offs = OMAP3430_PER_MOD, .module_offs = OMAP3430_DSS_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr, .opt_clks = dss_venc_opt_clks,
.slaves = omap3xxx_timer6_slaves, .opt_clks_cnt = ARRAY_SIZE(dss_venc_opt_clks),
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer6_slaves), .flags = HWMOD_NO_IDLEST,
.class = &omap3xxx_timer_hwmod_class,
}; };
/* timer7 */ /* I2C1 */
static struct omap_hwmod omap3xxx_timer7_hwmod; static struct omap_i2c_dev_attr i2c1_dev_attr = {
.fifo_depth = 8, /* bytes */
static struct omap_hwmod_addr_space omap3xxx_timer7_addrs[] = { .flags = OMAP_I2C_FLAG_APPLY_ERRATA_I207 |
{ OMAP_I2C_FLAG_RESET_REGS_POSTIDLE |
.pa_start = 0x4903C000, OMAP_I2C_FLAG_BUS_SHIFT_2,
.pa_end = 0x4903C000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
}; };
/* l4_per -> timer7 */ static struct omap_hwmod omap3xxx_i2c1_hwmod = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer7 = { .name = "i2c1",
.master = &omap3xxx_l4_per_hwmod, .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
.slave = &omap3xxx_timer7_hwmod, .mpu_irqs = omap2_i2c1_mpu_irqs,
.clk = "gpt7_ick", .sdma_reqs = omap2_i2c1_sdma_reqs,
.addr = omap3xxx_timer7_addrs, .main_clk = "i2c1_fck",
.user = OCP_USER_MPU | OCP_USER_SDMA, .prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_I2C1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_I2C1_SHIFT,
},
},
.class = &i2c_class,
.dev_attr = &i2c1_dev_attr,
}; };
/* timer7 slave port */ /* I2C2 */
static struct omap_hwmod_ocp_if *omap3xxx_timer7_slaves[] = { static struct omap_i2c_dev_attr i2c2_dev_attr = {
&omap3xxx_l4_per__timer7, .fifo_depth = 8, /* bytes */
.flags = OMAP_I2C_FLAG_APPLY_ERRATA_I207 |
OMAP_I2C_FLAG_RESET_REGS_POSTIDLE |
OMAP_I2C_FLAG_BUS_SHIFT_2,
}; };
/* timer7 hwmod */ static struct omap_hwmod omap3xxx_i2c2_hwmod = {
static struct omap_hwmod omap3xxx_timer7_hwmod = { .name = "i2c2",
.name = "timer7", .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
.mpu_irqs = omap2_timer7_mpu_irqs, .mpu_irqs = omap2_i2c2_mpu_irqs,
.main_clk = "gpt7_fck", .sdma_reqs = omap2_i2c2_sdma_reqs,
.main_clk = "i2c2_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT7_SHIFT, .module_bit = OMAP3430_EN_I2C2_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT, .idlest_idle_bit = OMAP3430_ST_I2C2_SHIFT,
}, },
}, },
.dev_attr = &capability_alwon_dev_attr, .class = &i2c_class,
.slaves = omap3xxx_timer7_slaves, .dev_attr = &i2c2_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer7_slaves),
.class = &omap3xxx_timer_hwmod_class,
}; };
/* timer8 */ /* I2C3 */
static struct omap_hwmod omap3xxx_timer8_hwmod; static struct omap_i2c_dev_attr i2c3_dev_attr = {
.fifo_depth = 64, /* bytes */
static struct omap_hwmod_addr_space omap3xxx_timer8_addrs[] = { .flags = OMAP_I2C_FLAG_APPLY_ERRATA_I207 |
{ OMAP_I2C_FLAG_RESET_REGS_POSTIDLE |
.pa_start = 0x4903E000, OMAP_I2C_FLAG_BUS_SHIFT_2,
.pa_end = 0x4903E000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
}; };
/* l4_per -> timer8 */ static struct omap_hwmod_irq_info i2c3_mpu_irqs[] = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer8 = { { .irq = INT_34XX_I2C3_IRQ, },
.master = &omap3xxx_l4_per_hwmod, { .irq = -1 }
.slave = &omap3xxx_timer8_hwmod,
.clk = "gpt8_ick",
.addr = omap3xxx_timer8_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer8 slave port */ static struct omap_hwmod_dma_info i2c3_sdma_reqs[] = {
static struct omap_hwmod_ocp_if *omap3xxx_timer8_slaves[] = { { .name = "tx", .dma_req = OMAP34XX_DMA_I2C3_TX },
&omap3xxx_l4_per__timer8, { .name = "rx", .dma_req = OMAP34XX_DMA_I2C3_RX },
{ .dma_req = -1 }
}; };
/* timer8 hwmod */ static struct omap_hwmod omap3xxx_i2c3_hwmod = {
static struct omap_hwmod omap3xxx_timer8_hwmod = { .name = "i2c3",
.name = "timer8", .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
.mpu_irqs = omap2_timer8_mpu_irqs, .mpu_irqs = i2c3_mpu_irqs,
.main_clk = "gpt8_fck", .sdma_reqs = i2c3_sdma_reqs,
.main_clk = "i2c3_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT8_SHIFT, .module_bit = OMAP3430_EN_I2C3_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT8_SHIFT, .idlest_idle_bit = OMAP3430_ST_I2C3_SHIFT,
}, },
}, },
.dev_attr = &capability_pwm_dev_attr, .class = &i2c_class,
.slaves = omap3xxx_timer8_slaves, .dev_attr = &i2c3_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer8_slaves),
.class = &omap3xxx_timer_hwmod_class,
}; };
/* timer9 */ /*
static struct omap_hwmod omap3xxx_timer9_hwmod; * 'gpio' class
* general purpose io module
*/
static struct omap_hwmod_addr_space omap3xxx_timer9_addrs[] = { static struct omap_hwmod_class_sysconfig omap3xxx_gpio_sysc = {
{ .rev_offs = 0x0000,
.pa_start = 0x49040000, .sysc_offs = 0x0010,
.pa_end = 0x49040000 + SZ_1K - 1, .syss_offs = 0x0014,
.flags = ADDR_TYPE_RT .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
}, SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
{ } SYSS_HAS_RESET_STATUS),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
/* l4_per -> timer9 */ static struct omap_hwmod_class omap3xxx_gpio_hwmod_class = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer9 = { .name = "gpio",
.master = &omap3xxx_l4_per_hwmod, .sysc = &omap3xxx_gpio_sysc,
.slave = &omap3xxx_timer9_hwmod, .rev = 1,
.clk = "gpt9_ick",
.addr = omap3xxx_timer9_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer9 slave port */ /* gpio_dev_attr */
static struct omap_hwmod_ocp_if *omap3xxx_timer9_slaves[] = { static struct omap_gpio_dev_attr gpio_dev_attr = {
&omap3xxx_l4_per__timer9, .bank_width = 32,
.dbck_flag = true,
}; };
/* timer9 hwmod */ /* gpio1 */
static struct omap_hwmod omap3xxx_timer9_hwmod = { static struct omap_hwmod_opt_clk gpio1_opt_clks[] = {
.name = "timer9", { .role = "dbclk", .clk = "gpio1_dbck", },
.mpu_irqs = omap2_timer9_mpu_irqs, };
.main_clk = "gpt9_fck",
static struct omap_hwmod omap3xxx_gpio1_hwmod = {
.name = "gpio1",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_gpio1_irqs,
.main_clk = "gpio1_ick",
.opt_clks = gpio1_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(gpio1_opt_clks),
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT9_SHIFT, .module_bit = OMAP3430_EN_GPIO1_SHIFT,
.module_offs = OMAP3430_PER_MOD, .module_offs = WKUP_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT9_SHIFT, .idlest_idle_bit = OMAP3430_ST_GPIO1_SHIFT,
}, },
}, },
.dev_attr = &capability_pwm_dev_attr, .class = &omap3xxx_gpio_hwmod_class,
.slaves = omap3xxx_timer9_slaves, .dev_attr = &gpio_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer9_slaves),
.class = &omap3xxx_timer_hwmod_class,
};
/* timer10 */
static struct omap_hwmod omap3xxx_timer10_hwmod;
/* l4_core -> timer10 */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer10 = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_timer10_hwmod,
.clk = "gpt10_ick",
.addr = omap2_timer10_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer10 slave port */ /* gpio2 */
static struct omap_hwmod_ocp_if *omap3xxx_timer10_slaves[] = { static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {
&omap3xxx_l4_core__timer10, { .role = "dbclk", .clk = "gpio2_dbck", },
}; };
/* timer10 hwmod */ static struct omap_hwmod omap3xxx_gpio2_hwmod = {
static struct omap_hwmod omap3xxx_timer10_hwmod = { .name = "gpio2",
.name = "timer10", .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_timer10_mpu_irqs, .mpu_irqs = omap2_gpio2_irqs,
.main_clk = "gpt10_fck", .main_clk = "gpio2_ick",
.opt_clks = gpio2_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(gpio2_opt_clks),
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT10_SHIFT, .module_bit = OMAP3430_EN_GPIO2_SHIFT,
.module_offs = CORE_MOD, .module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT10_SHIFT, .idlest_idle_bit = OMAP3430_ST_GPIO2_SHIFT,
}, },
}, },
.dev_attr = &capability_pwm_dev_attr, .class = &omap3xxx_gpio_hwmod_class,
.slaves = omap3xxx_timer10_slaves, .dev_attr = &gpio_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer10_slaves),
.class = &omap3xxx_timer_1ms_hwmod_class,
};
/* timer11 */
static struct omap_hwmod omap3xxx_timer11_hwmod;
/* l4_core -> timer11 */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer11 = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_timer11_hwmod,
.clk = "gpt11_ick",
.addr = omap2_timer11_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer11 slave port */ /* gpio3 */
static struct omap_hwmod_ocp_if *omap3xxx_timer11_slaves[] = { static struct omap_hwmod_opt_clk gpio3_opt_clks[] = {
&omap3xxx_l4_core__timer11, { .role = "dbclk", .clk = "gpio3_dbck", },
}; };
/* timer11 hwmod */ static struct omap_hwmod omap3xxx_gpio3_hwmod = {
static struct omap_hwmod omap3xxx_timer11_hwmod = { .name = "gpio3",
.name = "timer11", .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap2_timer11_mpu_irqs, .mpu_irqs = omap2_gpio3_irqs,
.main_clk = "gpt11_fck", .main_clk = "gpio3_ick",
.opt_clks = gpio3_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(gpio3_opt_clks),
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT11_SHIFT, .module_bit = OMAP3430_EN_GPIO3_SHIFT,
.module_offs = CORE_MOD, .module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT11_SHIFT, .idlest_idle_bit = OMAP3430_ST_GPIO3_SHIFT,
}, },
}, },
.dev_attr = &capability_pwm_dev_attr, .class = &omap3xxx_gpio_hwmod_class,
.slaves = omap3xxx_timer11_slaves, .dev_attr = &gpio_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer11_slaves),
.class = &omap3xxx_timer_hwmod_class,
}; };
/* timer12*/ /* gpio4 */
static struct omap_hwmod omap3xxx_timer12_hwmod; static struct omap_hwmod_opt_clk gpio4_opt_clks[] = {
static struct omap_hwmod_irq_info omap3xxx_timer12_mpu_irqs[] = { { .role = "dbclk", .clk = "gpio4_dbck", },
{ .irq = 95, },
{ .irq = -1 }
}; };
static struct omap_hwmod_addr_space omap3xxx_timer12_addrs[] = { static struct omap_hwmod omap3xxx_gpio4_hwmod = {
{ .name = "gpio4",
.pa_start = 0x48304000, .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.pa_end = 0x48304000 + SZ_1K - 1, .mpu_irqs = omap2_gpio4_irqs,
.flags = ADDR_TYPE_RT .main_clk = "gpio4_ick",
.opt_clks = gpio4_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(gpio4_opt_clks),
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPIO4_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPIO4_SHIFT,
},
}, },
{ } .class = &omap3xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
}; };
/* l4_core -> timer12 */ /* gpio5 */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer12 = { static struct omap_hwmod_irq_info omap3xxx_gpio5_irqs[] = {
.master = &omap3xxx_l4_core_hwmod, { .irq = 33 }, /* INT_34XX_GPIO_BANK5 */
.slave = &omap3xxx_timer12_hwmod, { .irq = -1 }
.clk = "gpt12_ick",
.addr = omap3xxx_timer12_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* timer12 slave port */ static struct omap_hwmod_opt_clk gpio5_opt_clks[] = {
static struct omap_hwmod_ocp_if *omap3xxx_timer12_slaves[] = { { .role = "dbclk", .clk = "gpio5_dbck", },
&omap3xxx_l4_core__timer12,
}; };
/* timer12 hwmod */ static struct omap_hwmod omap3xxx_gpio5_hwmod = {
static struct omap_hwmod omap3xxx_timer12_hwmod = { .name = "gpio5",
.name = "timer12", .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap3xxx_timer12_mpu_irqs, .mpu_irqs = omap3xxx_gpio5_irqs,
.main_clk = "gpt12_fck", .main_clk = "gpio5_ick",
.opt_clks = gpio5_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(gpio5_opt_clks),
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPT12_SHIFT, .module_bit = OMAP3430_EN_GPIO5_SHIFT,
.module_offs = WKUP_MOD, .module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPT12_SHIFT, .idlest_idle_bit = OMAP3430_ST_GPIO5_SHIFT,
}, },
}, },
.dev_attr = &capability_secure_dev_attr, .class = &omap3xxx_gpio_hwmod_class,
.slaves = omap3xxx_timer12_slaves, .dev_attr = &gpio_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer12_slaves),
.class = &omap3xxx_timer_hwmod_class,
}; };
/* l4_wkup -> wd_timer2 */ /* gpio6 */
static struct omap_hwmod_addr_space omap3xxx_wd_timer2_addrs[] = { static struct omap_hwmod_irq_info omap3xxx_gpio6_irqs[] = {
{ { .irq = 34 }, /* INT_34XX_GPIO_BANK6 */
.pa_start = 0x48314000, { .irq = -1 }
.pa_end = 0x4831407f,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__wd_timer2 = { static struct omap_hwmod_opt_clk gpio6_opt_clks[] = {
.master = &omap3xxx_l4_wkup_hwmod, { .role = "dbclk", .clk = "gpio6_dbck", },
.slave = &omap3xxx_wd_timer2_hwmod,
.clk = "wdt2_ick",
.addr = omap3xxx_wd_timer2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* static struct omap_hwmod omap3xxx_gpio6_hwmod = {
* 'wd_timer' class .name = "gpio6",
* 32-bit watchdog upward counter that generates a pulse on the reset pin on .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
* overflow condition .mpu_irqs = omap3xxx_gpio6_irqs,
*/ .main_clk = "gpio6_ick",
.opt_clks = gpio6_opt_clks,
static struct omap_hwmod_class_sysconfig omap3xxx_wd_timer_sysc = { .opt_clks_cnt = ARRAY_SIZE(gpio6_opt_clks),
.rev_offs = 0x0000, .prcm = {
.sysc_offs = 0x0010, .omap2 = {
.syss_offs = 0x0014, .prcm_reg_id = 1,
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE | .module_bit = OMAP3430_EN_GPIO6_SHIFT,
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | .module_offs = OMAP3430_PER_MOD,
SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY | .idlest_reg_id = 1,
SYSS_HAS_RESET_STATUS), .idlest_idle_bit = OMAP3430_ST_GPIO6_SHIFT,
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), },
.sysc_fields = &omap_hwmod_sysc_type1, },
.class = &omap3xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
}; };
/* I2C common */ /* dma attributes */
static struct omap_hwmod_class_sysconfig i2c_sysc = { static struct omap_dma_dev_attr dma_dev_attr = {
.rev_offs = 0x00, .dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
.sysc_offs = 0x20, IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
.syss_offs = 0x10, .lch_count = 32,
.sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.clockact = CLOCKACT_TEST_ICLK,
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_class omap3xxx_wd_timer_hwmod_class = { static struct omap_hwmod_class_sysconfig omap3xxx_dma_sysc = {
.name = "wd_timer", .rev_offs = 0x0000,
.sysc = &omap3xxx_wd_timer_sysc, .sysc_offs = 0x002c,
.pre_shutdown = &omap2_wd_timer_disable .syss_offs = 0x0028,
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE |
SYSS_HAS_RESET_STATUS),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
/* wd_timer2 */ static struct omap_hwmod_class omap3xxx_dma_hwmod_class = {
static struct omap_hwmod_ocp_if *omap3xxx_wd_timer2_slaves[] = { .name = "dma",
&omap3xxx_l4_wkup__wd_timer2, .sysc = &omap3xxx_dma_sysc,
}; };
static struct omap_hwmod omap3xxx_wd_timer2_hwmod = { /* dma_system */
.name = "wd_timer2", static struct omap_hwmod omap3xxx_dma_system_hwmod = {
.class = &omap3xxx_wd_timer_hwmod_class, .name = "dma",
.main_clk = "wdt2_fck", .class = &omap3xxx_dma_hwmod_class,
.prcm = { .mpu_irqs = omap2_dma_system_irqs,
.main_clk = "core_l3_ick",
.prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .module_offs = CORE_MOD,
.module_bit = OMAP3430_EN_WDT2_SHIFT, .prcm_reg_id = 1,
.module_offs = WKUP_MOD, .module_bit = OMAP3430_ST_SDMA_SHIFT,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_WDT2_SHIFT, .idlest_idle_bit = OMAP3430_ST_SDMA_SHIFT,
}, },
}, },
.slaves = omap3xxx_wd_timer2_slaves, .dev_attr = &dma_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_wd_timer2_slaves), .flags = HWMOD_NO_IDLEST,
/*
* XXX: Use software supervised mode, HW supervised smartidle seems to
* block CORE power domain idle transitions. Maybe a HW bug in wdt2?
*/
.flags = HWMOD_SWSUP_SIDLE,
}; };
/* UART1 */ /*
* 'mcbsp' class
* multi channel buffered serial port controller
*/
static struct omap_hwmod_ocp_if *omap3xxx_uart1_slaves[] = { static struct omap_hwmod_class_sysconfig omap3xxx_mcbsp_sysc = {
&omap3_l4_core__uart1, .sysc_offs = 0x008c,
.sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_ENAWAKEUP |
SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
.clockact = 0x2,
}; };
static struct omap_hwmod omap3xxx_uart1_hwmod = { static struct omap_hwmod_class omap3xxx_mcbsp_hwmod_class = {
.name = "uart1", .name = "mcbsp",
.mpu_irqs = omap2_uart1_mpu_irqs, .sysc = &omap3xxx_mcbsp_sysc,
.sdma_reqs = omap2_uart1_sdma_reqs, .rev = MCBSP_CONFIG_TYPE3,
.main_clk = "uart1_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_UART1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_UART1_SHIFT,
},
},
.slaves = omap3xxx_uart1_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_uart1_slaves),
.class = &omap2_uart_class,
}; };
/* UART2 */ /* mcbsp1 */
static struct omap_hwmod_irq_info omap3xxx_mcbsp1_irqs[] = {
static struct omap_hwmod_ocp_if *omap3xxx_uart2_slaves[] = { { .name = "irq", .irq = 16 },
&omap3_l4_core__uart2, { .name = "tx", .irq = 59 },
{ .name = "rx", .irq = 60 },
{ .irq = -1 }
}; };
static struct omap_hwmod omap3xxx_uart2_hwmod = { static struct omap_hwmod omap3xxx_mcbsp1_hwmod = {
.name = "uart2", .name = "mcbsp1",
.mpu_irqs = omap2_uart2_mpu_irqs, .class = &omap3xxx_mcbsp_hwmod_class,
.sdma_reqs = omap2_uart2_sdma_reqs, .mpu_irqs = omap3xxx_mcbsp1_irqs,
.main_clk = "uart2_fck", .sdma_reqs = omap2_mcbsp1_sdma_reqs,
.main_clk = "mcbsp1_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_UART2_SHIFT, .module_bit = OMAP3430_EN_MCBSP1_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_UART2_SHIFT, .idlest_idle_bit = OMAP3430_ST_MCBSP1_SHIFT,
}, },
}, },
.slaves = omap3xxx_uart2_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_uart2_slaves),
.class = &omap2_uart_class,
}; };
/* UART3 */ /* mcbsp2 */
static struct omap_hwmod_irq_info omap3xxx_mcbsp2_irqs[] = {
{ .name = "irq", .irq = 17 },
{ .name = "tx", .irq = 62 },
{ .name = "rx", .irq = 63 },
{ .irq = -1 }
};
static struct omap_hwmod_ocp_if *omap3xxx_uart3_slaves[] = { static struct omap_mcbsp_dev_attr omap34xx_mcbsp2_dev_attr = {
&omap3_l4_per__uart3, .sidetone = "mcbsp2_sidetone",
}; };
static struct omap_hwmod omap3xxx_uart3_hwmod = { static struct omap_hwmod omap3xxx_mcbsp2_hwmod = {
.name = "uart3", .name = "mcbsp2",
.mpu_irqs = omap2_uart3_mpu_irqs, .class = &omap3xxx_mcbsp_hwmod_class,
.sdma_reqs = omap2_uart3_sdma_reqs, .mpu_irqs = omap3xxx_mcbsp2_irqs,
.main_clk = "uart3_fck", .sdma_reqs = omap2_mcbsp2_sdma_reqs,
.main_clk = "mcbsp2_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = OMAP3430_PER_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_UART3_SHIFT, .module_bit = OMAP3430_EN_MCBSP2_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_UART3_SHIFT, .idlest_idle_bit = OMAP3430_ST_MCBSP2_SHIFT,
}, },
}, },
.slaves = omap3xxx_uart3_slaves, .dev_attr = &omap34xx_mcbsp2_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_uart3_slaves),
.class = &omap2_uart_class,
}; };
/* UART4 */ /* mcbsp3 */
static struct omap_hwmod_irq_info omap3xxx_mcbsp3_irqs[] = {
static struct omap_hwmod_irq_info uart4_mpu_irqs[] = { { .name = "irq", .irq = 22 },
{ .irq = INT_36XX_UART4_IRQ, }, { .name = "tx", .irq = 89 },
{ .name = "rx", .irq = 90 },
{ .irq = -1 } { .irq = -1 }
}; };
static struct omap_hwmod_dma_info uart4_sdma_reqs[] = { static struct omap_mcbsp_dev_attr omap34xx_mcbsp3_dev_attr = {
{ .name = "rx", .dma_req = OMAP36XX_DMA_UART4_RX, }, .sidetone = "mcbsp3_sidetone",
{ .name = "tx", .dma_req = OMAP36XX_DMA_UART4_TX, },
{ .dma_req = -1 }
};
static struct omap_hwmod_ocp_if *omap3xxx_uart4_slaves[] = {
&omap3_l4_per__uart4,
}; };
static struct omap_hwmod omap3xxx_uart4_hwmod = { static struct omap_hwmod omap3xxx_mcbsp3_hwmod = {
.name = "uart4", .name = "mcbsp3",
.mpu_irqs = uart4_mpu_irqs, .class = &omap3xxx_mcbsp_hwmod_class,
.sdma_reqs = uart4_sdma_reqs, .mpu_irqs = omap3xxx_mcbsp3_irqs,
.main_clk = "uart4_fck", .sdma_reqs = omap2_mcbsp3_sdma_reqs,
.main_clk = "mcbsp3_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = OMAP3430_PER_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3630_EN_UART4_SHIFT, .module_bit = OMAP3430_EN_MCBSP3_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3630_EN_UART4_SHIFT, .idlest_idle_bit = OMAP3430_ST_MCBSP3_SHIFT,
}, },
}, },
.slaves = omap3xxx_uart4_slaves, .dev_attr = &omap34xx_mcbsp3_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_uart4_slaves),
.class = &omap2_uart_class,
};
static struct omap_hwmod_irq_info am35xx_uart4_mpu_irqs[] = {
{ .irq = INT_35XX_UART4_IRQ, },
}; };
static struct omap_hwmod_dma_info am35xx_uart4_sdma_reqs[] = { /* mcbsp4 */
{ .name = "rx", .dma_req = AM35XX_DMA_UART4_RX, }, static struct omap_hwmod_irq_info omap3xxx_mcbsp4_irqs[] = {
{ .name = "tx", .dma_req = AM35XX_DMA_UART4_TX, }, { .name = "irq", .irq = 23 },
{ .name = "tx", .irq = 54 },
{ .name = "rx", .irq = 55 },
{ .irq = -1 }
}; };
static struct omap_hwmod_ocp_if *am35xx_uart4_slaves[] = { static struct omap_hwmod_dma_info omap3xxx_mcbsp4_sdma_chs[] = {
&am35xx_l4_core__uart4, { .name = "rx", .dma_req = 20 },
{ .name = "tx", .dma_req = 19 },
{ .dma_req = -1 }
}; };
static struct omap_hwmod am35xx_uart4_hwmod = { static struct omap_hwmod omap3xxx_mcbsp4_hwmod = {
.name = "uart4", .name = "mcbsp4",
.mpu_irqs = am35xx_uart4_mpu_irqs, .class = &omap3xxx_mcbsp_hwmod_class,
.sdma_reqs = am35xx_uart4_sdma_reqs, .mpu_irqs = omap3xxx_mcbsp4_irqs,
.main_clk = "uart4_fck", .sdma_reqs = omap3xxx_mcbsp4_sdma_chs,
.prcm = { .main_clk = "mcbsp4_fck",
.prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_UART4_SHIFT, .module_bit = OMAP3430_EN_MCBSP4_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_UART4_SHIFT, .idlest_idle_bit = OMAP3430_ST_MCBSP4_SHIFT,
}, },
}, },
.slaves = am35xx_uart4_slaves,
.slaves_cnt = ARRAY_SIZE(am35xx_uart4_slaves),
.class = &omap2_uart_class,
}; };
/* mcbsp5 */
static struct omap_hwmod_class i2c_class = { static struct omap_hwmod_irq_info omap3xxx_mcbsp5_irqs[] = {
.name = "i2c", { .name = "irq", .irq = 27 },
.sysc = &i2c_sysc, { .name = "tx", .irq = 81 },
.rev = OMAP_I2C_IP_VERSION_1, { .name = "rx", .irq = 82 },
.reset = &omap_i2c_reset, { .irq = -1 }
}; };
static struct omap_hwmod_dma_info omap3xxx_dss_sdma_chs[] = { static struct omap_hwmod_dma_info omap3xxx_mcbsp5_sdma_chs[] = {
{ .name = "dispc", .dma_req = 5 }, { .name = "rx", .dma_req = 22 },
{ .name = "dsi1", .dma_req = 74 }, { .name = "tx", .dma_req = 21 },
{ .dma_req = -1 } { .dma_req = -1 }
}; };
/* dss */ static struct omap_hwmod omap3xxx_mcbsp5_hwmod = {
/* dss master ports */ .name = "mcbsp5",
static struct omap_hwmod_ocp_if *omap3xxx_dss_masters[] = { .class = &omap3xxx_mcbsp_hwmod_class,
&omap3xxx_dss__l3, .mpu_irqs = omap3xxx_mcbsp5_irqs,
}; .sdma_reqs = omap3xxx_mcbsp5_sdma_chs,
.main_clk = "mcbsp5_fck",
/* l4_core -> dss */ .prcm = {
static struct omap_hwmod_ocp_if omap3430es1_l4_core__dss = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3430es1_dss_core_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP3ES1_L4_CORE_FW_DSS_CORE_REGION,
.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_dss_core_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_addrs,
.fw = {
.omap2 = { .omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_DSS_CORE_REGION, .prcm_reg_id = 1,
.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP, .module_bit = OMAP3430_EN_MCBSP5_SHIFT,
.flags = OMAP_FIREWALL_L4, .module_offs = CORE_MOD,
} .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MCBSP5_SHIFT,
},
}, },
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dss slave ports */ /* 'mcbsp sidetone' class */
static struct omap_hwmod_ocp_if *omap3430es1_dss_slaves[] = { static struct omap_hwmod_class_sysconfig omap3xxx_mcbsp_sidetone_sysc = {
&omap3430es1_l4_core__dss, .sysc_offs = 0x0010,
.sysc_flags = SYSC_HAS_AUTOIDLE,
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_ocp_if *omap3xxx_dss_slaves[] = { static struct omap_hwmod_class omap3xxx_mcbsp_sidetone_hwmod_class = {
&omap3xxx_l4_core__dss, .name = "mcbsp_sidetone",
.sysc = &omap3xxx_mcbsp_sidetone_sysc,
}; };
static struct omap_hwmod_opt_clk dss_opt_clks[] = { /* mcbsp2_sidetone */
/* static struct omap_hwmod_irq_info omap3xxx_mcbsp2_sidetone_irqs[] = {
* The DSS HW needs all DSS clocks enabled during reset. The dss_core { .name = "irq", .irq = 4 },
* driver does not use these clocks. { .irq = -1 }
*/
{ .role = "sys_clk", .clk = "dss2_alwon_fck" },
{ .role = "tv_clk", .clk = "dss_tv_fck" },
/* required only on OMAP3430 */
{ .role = "tv_dac_clk", .clk = "dss_96m_fck" },
}; };
static struct omap_hwmod omap3430es1_dss_core_hwmod = { static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod = {
.name = "dss_core", .name = "mcbsp2_sidetone",
.class = &omap2_dss_hwmod_class, .class = &omap3xxx_mcbsp_sidetone_hwmod_class,
.main_clk = "dss1_alwon_fck", /* instead of dss_fck */ .mpu_irqs = omap3xxx_mcbsp2_sidetone_irqs,
.sdma_reqs = omap3xxx_dss_sdma_chs, .main_clk = "mcbsp2_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_DSS1_SHIFT, .module_bit = OMAP3430_EN_MCBSP2_SHIFT,
.module_offs = OMAP3430_DSS_MOD, .module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_stdby_bit = OMAP3430ES1_ST_DSS_SHIFT, .idlest_idle_bit = OMAP3430_ST_MCBSP2_SHIFT,
}, },
}, },
.opt_clks = dss_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
.slaves = omap3430es1_dss_slaves,
.slaves_cnt = ARRAY_SIZE(omap3430es1_dss_slaves),
.masters = omap3xxx_dss_masters,
.masters_cnt = ARRAY_SIZE(omap3xxx_dss_masters),
.flags = HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
}; };
static struct omap_hwmod omap3xxx_dss_core_hwmod = { /* mcbsp3_sidetone */
.name = "dss_core", static struct omap_hwmod_irq_info omap3xxx_mcbsp3_sidetone_irqs[] = {
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, { .name = "irq", .irq = 5 },
.class = &omap2_dss_hwmod_class, { .irq = -1 }
.main_clk = "dss1_alwon_fck", /* instead of dss_fck */ };
.sdma_reqs = omap3xxx_dss_sdma_chs,
static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod = {
.name = "mcbsp3_sidetone",
.class = &omap3xxx_mcbsp_sidetone_hwmod_class,
.mpu_irqs = omap3xxx_mcbsp3_sidetone_irqs,
.main_clk = "mcbsp3_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_DSS1_SHIFT, .module_bit = OMAP3430_EN_MCBSP3_SHIFT,
.module_offs = OMAP3430_DSS_MOD, .module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT, .idlest_idle_bit = OMAP3430_ST_MCBSP3_SHIFT,
.idlest_stdby_bit = OMAP3430ES2_ST_DSS_STDBY_SHIFT,
}, },
}, },
.opt_clks = dss_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
.slaves = omap3xxx_dss_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_dss_slaves),
.masters = omap3xxx_dss_masters,
.masters_cnt = ARRAY_SIZE(omap3xxx_dss_masters),
}; };
/* /* SR common */
* 'dispc' class static struct omap_hwmod_sysc_fields omap34xx_sr_sysc_fields = {
* display controller .clkact_shift = 20,
*/
static struct omap_hwmod_class_sysconfig omap3_dispc_sysc = {
.rev_offs = 0x0000,
.sysc_offs = 0x0010,
.syss_offs = 0x0014,
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE |
SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
SYSC_HAS_ENAWAKEUP),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_class omap3_dispc_hwmod_class = { static struct omap_hwmod_class_sysconfig omap34xx_sr_sysc = {
.name = "dispc", .sysc_offs = 0x24,
.sysc = &omap3_dispc_sysc, .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_NO_CACHE),
.clockact = CLOCKACT_TEST_ICLK,
.sysc_fields = &omap34xx_sr_sysc_fields,
}; };
/* l4_core -> dss_dispc */ static struct omap_hwmod_class omap34xx_smartreflex_hwmod_class = {
static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dispc = { .name = "smartreflex",
.master = &omap3xxx_l4_core_hwmod, .sysc = &omap34xx_sr_sysc,
.slave = &omap3xxx_dss_dispc_hwmod, .rev = 1,
.clk = "dss_ick",
.addr = omap2_dss_dispc_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_DSS_DISPC_REGION,
.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dss_dispc slave ports */ static struct omap_hwmod_sysc_fields omap36xx_sr_sysc_fields = {
static struct omap_hwmod_ocp_if *omap3xxx_dss_dispc_slaves[] = { .sidle_shift = 24,
&omap3xxx_l4_core__dss_dispc, .enwkup_shift = 26,
}; };
static struct omap_hwmod omap3xxx_dss_dispc_hwmod = { static struct omap_hwmod_class_sysconfig omap36xx_sr_sysc = {
.name = "dss_dispc", .sysc_offs = 0x38,
.class = &omap3_dispc_hwmod_class, .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.mpu_irqs = omap2_dispc_irqs, .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
.main_clk = "dss1_alwon_fck", SYSC_NO_CACHE),
.prcm = { .sysc_fields = &omap36xx_sr_sysc_fields,
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_DSS1_SHIFT,
.module_offs = OMAP3430_DSS_MOD,
},
},
.slaves = omap3xxx_dss_dispc_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_dss_dispc_slaves),
.flags = HWMOD_NO_IDLEST,
.dev_attr = &omap2_3_dss_dispc_dev_attr
}; };
/* static struct omap_hwmod_class omap36xx_smartreflex_hwmod_class = {
* 'dsi' class .name = "smartreflex",
* display serial interface controller .sysc = &omap36xx_sr_sysc,
*/ .rev = 2,
};
static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = { /* SR1 */
.name = "dsi", static struct omap_smartreflex_dev_attr sr1_dev_attr = {
.sensor_voltdm_name = "mpu_iva",
}; };
static struct omap_hwmod_irq_info omap3xxx_dsi1_irqs[] = { static struct omap_hwmod_irq_info omap3_smartreflex_mpu_irqs[] = {
{ .irq = 25 }, { .irq = 18 },
{ .irq = -1 } { .irq = -1 }
}; };
/* dss_dsi1 */ static struct omap_hwmod omap34xx_sr1_hwmod = {
static struct omap_hwmod_addr_space omap3xxx_dss_dsi1_addrs[] = { .name = "sr1",
{ .class = &omap34xx_smartreflex_hwmod_class,
.pa_start = 0x4804FC00, .main_clk = "sr1_fck",
.pa_end = 0x4804FFFF, .prcm = {
.flags = ADDR_TYPE_RT .omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_SR1_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_SR1_SHIFT,
},
}, },
{ } .dev_attr = &sr1_dev_attr,
.mpu_irqs = omap3_smartreflex_mpu_irqs,
.flags = HWMOD_SET_DEFAULT_CLOCKACT,
}; };
/* l4_core -> dss_dsi1 */ static struct omap_hwmod omap36xx_sr1_hwmod = {
static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dsi1 = { .name = "sr1",
.master = &omap3xxx_l4_core_hwmod, .class = &omap36xx_smartreflex_hwmod_class,
.slave = &omap3xxx_dss_dsi1_hwmod, .main_clk = "sr1_fck",
.clk = "dss_ick", .prcm = {
.addr = omap3xxx_dss_dsi1_addrs,
.fw = {
.omap2 = { .omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_DSS_DSI_REGION, .prcm_reg_id = 1,
.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP, .module_bit = OMAP3430_EN_SR1_SHIFT,
.flags = OMAP_FIREWALL_L4, .module_offs = WKUP_MOD,
} .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_SR1_SHIFT,
},
}, },
.user = OCP_USER_MPU | OCP_USER_SDMA, .dev_attr = &sr1_dev_attr,
.mpu_irqs = omap3_smartreflex_mpu_irqs,
}; };
/* dss_dsi1 slave ports */ /* SR2 */
static struct omap_hwmod_ocp_if *omap3xxx_dss_dsi1_slaves[] = { static struct omap_smartreflex_dev_attr sr2_dev_attr = {
&omap3xxx_l4_core__dss_dsi1, .sensor_voltdm_name = "core",
}; };
static struct omap_hwmod_opt_clk dss_dsi1_opt_clks[] = { static struct omap_hwmod_irq_info omap3_smartreflex_core_irqs[] = {
{ .role = "sys_clk", .clk = "dss2_alwon_fck" }, { .irq = 19 },
{ .irq = -1 }
}; };
static struct omap_hwmod omap3xxx_dss_dsi1_hwmod = { static struct omap_hwmod omap34xx_sr2_hwmod = {
.name = "dss_dsi1", .name = "sr2",
.class = &omap3xxx_dsi_hwmod_class, .class = &omap34xx_smartreflex_hwmod_class,
.mpu_irqs = omap3xxx_dsi1_irqs, .main_clk = "sr2_fck",
.main_clk = "dss1_alwon_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_DSS1_SHIFT, .module_bit = OMAP3430_EN_SR2_SHIFT,
.module_offs = OMAP3430_DSS_MOD, .module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_SR2_SHIFT,
}, },
}, },
.opt_clks = dss_dsi1_opt_clks, .dev_attr = &sr2_dev_attr,
.opt_clks_cnt = ARRAY_SIZE(dss_dsi1_opt_clks), .mpu_irqs = omap3_smartreflex_core_irqs,
.slaves = omap3xxx_dss_dsi1_slaves, .flags = HWMOD_SET_DEFAULT_CLOCKACT,
.slaves_cnt = ARRAY_SIZE(omap3xxx_dss_dsi1_slaves),
.flags = HWMOD_NO_IDLEST,
}; };
/* l4_core -> dss_rfbi */ static struct omap_hwmod omap36xx_sr2_hwmod = {
static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_rfbi = { .name = "sr2",
.master = &omap3xxx_l4_core_hwmod, .class = &omap36xx_smartreflex_hwmod_class,
.slave = &omap3xxx_dss_rfbi_hwmod, .main_clk = "sr2_fck",
.clk = "dss_ick", .prcm = {
.addr = omap2_dss_rfbi_addrs,
.fw = {
.omap2 = { .omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_DSS_RFBI_REGION, .prcm_reg_id = 1,
.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP , .module_bit = OMAP3430_EN_SR2_SHIFT,
.flags = OMAP_FIREWALL_L4, .module_offs = WKUP_MOD,
} .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_SR2_SHIFT,
},
}, },
.user = OCP_USER_MPU | OCP_USER_SDMA, .dev_attr = &sr2_dev_attr,
.mpu_irqs = omap3_smartreflex_core_irqs,
}; };
/* dss_rfbi slave ports */ /*
static struct omap_hwmod_ocp_if *omap3xxx_dss_rfbi_slaves[] = { * 'mailbox' class
&omap3xxx_l4_core__dss_rfbi, * mailbox module allowing communication between the on-chip processors
* using a queued mailbox-interrupt mechanism.
*/
static struct omap_hwmod_class_sysconfig omap3xxx_mailbox_sysc = {
.rev_offs = 0x000,
.sysc_offs = 0x010,
.syss_offs = 0x014,
.sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = { static struct omap_hwmod_class omap3xxx_mailbox_hwmod_class = {
{ .role = "ick", .clk = "dss_ick" }, .name = "mailbox",
.sysc = &omap3xxx_mailbox_sysc,
}; };
static struct omap_hwmod omap3xxx_dss_rfbi_hwmod = { static struct omap_hwmod_irq_info omap3xxx_mailbox_irqs[] = {
.name = "dss_rfbi", { .irq = 26 },
.class = &omap2_rfbi_hwmod_class, { .irq = -1 }
.main_clk = "dss1_alwon_fck", };
static struct omap_hwmod omap3xxx_mailbox_hwmod = {
.name = "mailbox",
.class = &omap3xxx_mailbox_hwmod_class,
.mpu_irqs = omap3xxx_mailbox_irqs,
.main_clk = "mailboxes_ick",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_DSS1_SHIFT, .module_bit = OMAP3430_EN_MAILBOXES_SHIFT,
.module_offs = OMAP3430_DSS_MOD, .module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MAILBOXES_SHIFT,
}, },
}, },
.opt_clks = dss_rfbi_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks),
.slaves = omap3xxx_dss_rfbi_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_dss_rfbi_slaves),
.flags = HWMOD_NO_IDLEST,
}; };
/* l4_core -> dss_venc */ /*
static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_venc = { * 'mcspi' class
.master = &omap3xxx_l4_core_hwmod, * multichannel serial port interface (mcspi) / master/slave synchronous serial
.slave = &omap3xxx_dss_venc_hwmod, * bus
.clk = "dss_ick", */
.addr = omap2_dss_venc_addrs,
.fw = { static struct omap_hwmod_class_sysconfig omap34xx_mcspi_sysc = {
.omap2 = { .rev_offs = 0x0000,
.l4_fw_region = OMAP3_L4_CORE_FW_DSS_VENC_REGION, .sysc_offs = 0x0010,
.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP, .syss_offs = 0x0014,
.flags = OMAP_FIREWALL_L4, .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
} SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
}, SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
.user = OCP_USER_MPU | OCP_USER_SDMA, .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
/* dss_venc slave ports */ static struct omap_hwmod_class omap34xx_mcspi_class = {
static struct omap_hwmod_ocp_if *omap3xxx_dss_venc_slaves[] = { .name = "mcspi",
&omap3xxx_l4_core__dss_venc, .sysc = &omap34xx_mcspi_sysc,
.rev = OMAP3_MCSPI_REV,
}; };
static struct omap_hwmod_opt_clk dss_venc_opt_clks[] = { /* mcspi1 */
/* required only on OMAP3430 */ static struct omap2_mcspi_dev_attr omap_mcspi1_dev_attr = {
{ .role = "tv_dac_clk", .clk = "dss_96m_fck" }, .num_chipselect = 4,
}; };
static struct omap_hwmod omap3xxx_dss_venc_hwmod = { static struct omap_hwmod omap34xx_mcspi1 = {
.name = "dss_venc", .name = "mcspi1",
.class = &omap2_venc_hwmod_class, .mpu_irqs = omap2_mcspi1_mpu_irqs,
.main_clk = "dss_tv_fck", .sdma_reqs = omap2_mcspi1_sdma_reqs,
.main_clk = "mcspi1_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_DSS1_SHIFT, .module_bit = OMAP3430_EN_MCSPI1_SHIFT,
.module_offs = OMAP3430_DSS_MOD, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MCSPI1_SHIFT,
}, },
}, },
.opt_clks = dss_venc_opt_clks, .class = &omap34xx_mcspi_class,
.opt_clks_cnt = ARRAY_SIZE(dss_venc_opt_clks), .dev_attr = &omap_mcspi1_dev_attr,
.slaves = omap3xxx_dss_venc_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_dss_venc_slaves),
.flags = HWMOD_NO_IDLEST,
};
/* I2C1 */
static struct omap_i2c_dev_attr i2c1_dev_attr = {
.fifo_depth = 8, /* bytes */
.flags = OMAP_I2C_FLAG_APPLY_ERRATA_I207 |
OMAP_I2C_FLAG_RESET_REGS_POSTIDLE |
OMAP_I2C_FLAG_BUS_SHIFT_2,
}; };
static struct omap_hwmod_ocp_if *omap3xxx_i2c1_slaves[] = { /* mcspi2 */
&omap3_l4_core__i2c1, static struct omap2_mcspi_dev_attr omap_mcspi2_dev_attr = {
.num_chipselect = 2,
}; };
static struct omap_hwmod omap3xxx_i2c1_hwmod = { static struct omap_hwmod omap34xx_mcspi2 = {
.name = "i2c1", .name = "mcspi2",
.flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, .mpu_irqs = omap2_mcspi2_mpu_irqs,
.mpu_irqs = omap2_i2c1_mpu_irqs, .sdma_reqs = omap2_mcspi2_sdma_reqs,
.sdma_reqs = omap2_i2c1_sdma_reqs, .main_clk = "mcspi2_fck",
.main_clk = "i2c1_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_I2C1_SHIFT, .module_bit = OMAP3430_EN_MCSPI2_SHIFT,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_I2C1_SHIFT, .idlest_idle_bit = OMAP3430_ST_MCSPI2_SHIFT,
}, },
}, },
.slaves = omap3xxx_i2c1_slaves, .class = &omap34xx_mcspi_class,
.slaves_cnt = ARRAY_SIZE(omap3xxx_i2c1_slaves), .dev_attr = &omap_mcspi2_dev_attr,
.class = &i2c_class,
.dev_attr = &i2c1_dev_attr,
}; };
/* I2C2 */ /* mcspi3 */
static struct omap_hwmod_irq_info omap34xx_mcspi3_mpu_irqs[] = {
static struct omap_i2c_dev_attr i2c2_dev_attr = { { .name = "irq", .irq = 91 }, /* 91 */
.fifo_depth = 8, /* bytes */ { .irq = -1 }
.flags = OMAP_I2C_FLAG_APPLY_ERRATA_I207 |
OMAP_I2C_FLAG_RESET_REGS_POSTIDLE |
OMAP_I2C_FLAG_BUS_SHIFT_2,
}; };
static struct omap_hwmod_ocp_if *omap3xxx_i2c2_slaves[] = { static struct omap_hwmod_dma_info omap34xx_mcspi3_sdma_reqs[] = {
&omap3_l4_core__i2c2, { .name = "tx0", .dma_req = 15 },
{ .name = "rx0", .dma_req = 16 },
{ .name = "tx1", .dma_req = 23 },
{ .name = "rx1", .dma_req = 24 },
{ .dma_req = -1 }
}; };
static struct omap_hwmod omap3xxx_i2c2_hwmod = { static struct omap2_mcspi_dev_attr omap_mcspi3_dev_attr = {
.name = "i2c2", .num_chipselect = 2,
.flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, };
.mpu_irqs = omap2_i2c2_mpu_irqs,
.sdma_reqs = omap2_i2c2_sdma_reqs, static struct omap_hwmod omap34xx_mcspi3 = {
.main_clk = "i2c2_fck", .name = "mcspi3",
.mpu_irqs = omap34xx_mcspi3_mpu_irqs,
.sdma_reqs = omap34xx_mcspi3_sdma_reqs,
.main_clk = "mcspi3_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_I2C2_SHIFT, .module_bit = OMAP3430_EN_MCSPI3_SHIFT,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_I2C2_SHIFT, .idlest_idle_bit = OMAP3430_ST_MCSPI3_SHIFT,
}, },
}, },
.slaves = omap3xxx_i2c2_slaves, .class = &omap34xx_mcspi_class,
.slaves_cnt = ARRAY_SIZE(omap3xxx_i2c2_slaves), .dev_attr = &omap_mcspi3_dev_attr,
.class = &i2c_class,
.dev_attr = &i2c2_dev_attr,
};
/* I2C3 */
static struct omap_i2c_dev_attr i2c3_dev_attr = {
.fifo_depth = 64, /* bytes */
.flags = OMAP_I2C_FLAG_APPLY_ERRATA_I207 |
OMAP_I2C_FLAG_RESET_REGS_POSTIDLE |
OMAP_I2C_FLAG_BUS_SHIFT_2,
}; };
static struct omap_hwmod_irq_info i2c3_mpu_irqs[] = { /* mcspi4 */
{ .irq = INT_34XX_I2C3_IRQ, }, static struct omap_hwmod_irq_info omap34xx_mcspi4_mpu_irqs[] = {
{ .name = "irq", .irq = INT_34XX_SPI4_IRQ }, /* 48 */
{ .irq = -1 } { .irq = -1 }
}; };
static struct omap_hwmod_dma_info i2c3_sdma_reqs[] = { static struct omap_hwmod_dma_info omap34xx_mcspi4_sdma_reqs[] = {
{ .name = "tx", .dma_req = OMAP34XX_DMA_I2C3_TX }, { .name = "tx0", .dma_req = 70 }, /* DMA_SPI4_TX0 */
{ .name = "rx", .dma_req = OMAP34XX_DMA_I2C3_RX }, { .name = "rx0", .dma_req = 71 }, /* DMA_SPI4_RX0 */
{ .dma_req = -1 } { .dma_req = -1 }
}; };
static struct omap_hwmod_ocp_if *omap3xxx_i2c3_slaves[] = { static struct omap2_mcspi_dev_attr omap_mcspi4_dev_attr = {
&omap3_l4_core__i2c3, .num_chipselect = 1,
}; };
static struct omap_hwmod omap3xxx_i2c3_hwmod = { static struct omap_hwmod omap34xx_mcspi4 = {
.name = "i2c3", .name = "mcspi4",
.flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, .mpu_irqs = omap34xx_mcspi4_mpu_irqs,
.mpu_irqs = i2c3_mpu_irqs, .sdma_reqs = omap34xx_mcspi4_sdma_reqs,
.sdma_reqs = i2c3_sdma_reqs, .main_clk = "mcspi4_fck",
.main_clk = "i2c3_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_I2C3_SHIFT, .module_bit = OMAP3430_EN_MCSPI4_SHIFT,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_I2C3_SHIFT, .idlest_idle_bit = OMAP3430_ST_MCSPI4_SHIFT,
}, },
}, },
.slaves = omap3xxx_i2c3_slaves, .class = &omap34xx_mcspi_class,
.slaves_cnt = ARRAY_SIZE(omap3xxx_i2c3_slaves), .dev_attr = &omap_mcspi4_dev_attr,
.class = &i2c_class,
.dev_attr = &i2c3_dev_attr,
}; };
/* l4_wkup -> gpio1 */ /* usbhsotg */
static struct omap_hwmod_addr_space omap3xxx_gpio1_addrs[] = { static struct omap_hwmod_class_sysconfig omap3xxx_usbhsotg_sysc = {
{ .rev_offs = 0x0400,
.pa_start = 0x48310000, .sysc_offs = 0x0404,
.pa_end = 0x483101ff, .syss_offs = 0x0408,
.flags = ADDR_TYPE_RT .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE|
}, SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
{ } SYSC_HAS_AUTOIDLE),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__gpio1 = { static struct omap_hwmod_class usbotg_class = {
.master = &omap3xxx_l4_wkup_hwmod, .name = "usbotg",
.slave = &omap3xxx_gpio1_hwmod, .sysc = &omap3xxx_usbhsotg_sysc,
.addr = omap3xxx_gpio1_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* l4_per -> gpio2 */ /* usb_otg_hs */
static struct omap_hwmod_addr_space omap3xxx_gpio2_addrs[] = { static struct omap_hwmod_irq_info omap3xxx_usbhsotg_mpu_irqs[] = {
{
.pa_start = 0x49050000,
.pa_end = 0x490501ff,
.flags = ADDR_TYPE_RT
},
{ }
};
static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio2 = { { .name = "mc", .irq = 92 },
.master = &omap3xxx_l4_per_hwmod, { .name = "dma", .irq = 93 },
.slave = &omap3xxx_gpio2_hwmod, { .irq = -1 }
.addr = omap3xxx_gpio2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* l4_per -> gpio3 */ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = {
static struct omap_hwmod_addr_space omap3xxx_gpio3_addrs[] = { .name = "usb_otg_hs",
{ .mpu_irqs = omap3xxx_usbhsotg_mpu_irqs,
.pa_start = 0x49052000, .main_clk = "hsotgusb_ick",
.pa_end = 0x490521ff, .prcm = {
.flags = ADDR_TYPE_RT .omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_HSOTGUSB_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT,
.idlest_stdby_bit = OMAP3430ES2_ST_HSOTGUSB_STDBY_SHIFT
},
}, },
{ } .class = &usbotg_class,
};
static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio3 = { /*
.master = &omap3xxx_l4_per_hwmod, * Erratum ID: i479 idle_req / idle_ack mechanism potentially
.slave = &omap3xxx_gpio3_hwmod, * broken when autoidle is enabled
.addr = omap3xxx_gpio3_addrs, * workaround is to disable the autoidle bit at module level.
.user = OCP_USER_MPU | OCP_USER_SDMA, */
.flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
| HWMOD_SWSUP_MSTANDBY,
}; };
/* l4_per -> gpio4 */ /* usb_otg_hs */
static struct omap_hwmod_addr_space omap3xxx_gpio4_addrs[] = { static struct omap_hwmod_irq_info am35xx_usbhsotg_mpu_irqs[] = {
{
.pa_start = 0x49054000,
.pa_end = 0x490541ff,
.flags = ADDR_TYPE_RT
},
{ }
};
static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio4 = { { .name = "mc", .irq = 71 },
.master = &omap3xxx_l4_per_hwmod, { .irq = -1 }
.slave = &omap3xxx_gpio4_hwmod,
.addr = omap3xxx_gpio4_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* l4_per -> gpio5 */ static struct omap_hwmod_class am35xx_usbotg_class = {
static struct omap_hwmod_addr_space omap3xxx_gpio5_addrs[] = { .name = "am35xx_usbotg",
{ .sysc = NULL,
.pa_start = 0x49056000,
.pa_end = 0x490561ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio5 = { static struct omap_hwmod am35xx_usbhsotg_hwmod = {
.master = &omap3xxx_l4_per_hwmod, .name = "am35x_otg_hs",
.slave = &omap3xxx_gpio5_hwmod, .mpu_irqs = am35xx_usbhsotg_mpu_irqs,
.addr = omap3xxx_gpio5_addrs, .main_clk = NULL,
.user = OCP_USER_MPU | OCP_USER_SDMA, .prcm = {
.omap2 = {
},
},
.class = &am35xx_usbotg_class,
}; };
/* l4_per -> gpio6 */ /* MMC/SD/SDIO common */
static struct omap_hwmod_addr_space omap3xxx_gpio6_addrs[] = { static struct omap_hwmod_class_sysconfig omap34xx_mmc_sysc = {
{ .rev_offs = 0x1fc,
.pa_start = 0x49058000, .sysc_offs = 0x10,
.pa_end = 0x490581ff, .syss_offs = 0x14,
.flags = ADDR_TYPE_RT .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
}, SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
{ } SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio6 = { static struct omap_hwmod_class omap34xx_mmc_class = {
.master = &omap3xxx_l4_per_hwmod, .name = "mmc",
.slave = &omap3xxx_gpio6_hwmod, .sysc = &omap34xx_mmc_sysc,
.addr = omap3xxx_gpio6_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* /* MMC/SD/SDIO1 */
* 'gpio' class
* general purpose io module
*/
static struct omap_hwmod_class_sysconfig omap3xxx_gpio_sysc = { static struct omap_hwmod_irq_info omap34xx_mmc1_mpu_irqs[] = {
.rev_offs = 0x0000, { .irq = 83, },
.sysc_offs = 0x0010, { .irq = -1 }
.syss_offs = 0x0014,
.sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
SYSS_HAS_RESET_STATUS),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_class omap3xxx_gpio_hwmod_class = { static struct omap_hwmod_dma_info omap34xx_mmc1_sdma_reqs[] = {
.name = "gpio", { .name = "tx", .dma_req = 61, },
.sysc = &omap3xxx_gpio_sysc, { .name = "rx", .dma_req = 62, },
.rev = 1, { .dma_req = -1 }
}; };
/* gpio_dev_attr*/ static struct omap_hwmod_opt_clk omap34xx_mmc1_opt_clks[] = {
static struct omap_gpio_dev_attr gpio_dev_attr = { { .role = "dbck", .clk = "omap_32k_fck", },
.bank_width = 32,
.dbck_flag = true,
}; };
/* gpio1 */ static struct omap_mmc_dev_attr mmc1_dev_attr = {
static struct omap_hwmod_opt_clk gpio1_opt_clks[] = { .flags = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
{ .role = "dbclk", .clk = "gpio1_dbck", },
}; };
static struct omap_hwmod_ocp_if *omap3xxx_gpio1_slaves[] = { /* See 35xx errata 2.1.1.128 in SPRZ278F */
&omap3xxx_l4_wkup__gpio1, static struct omap_mmc_dev_attr mmc1_pre_es3_dev_attr = {
.flags = (OMAP_HSMMC_SUPPORTS_DUAL_VOLT |
OMAP_HSMMC_BROKEN_MULTIBLOCK_READ),
}; };
static struct omap_hwmod omap3xxx_gpio1_hwmod = { static struct omap_hwmod omap3xxx_pre_es3_mmc1_hwmod = {
.name = "gpio1", .name = "mmc1",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, .mpu_irqs = omap34xx_mmc1_mpu_irqs,
.mpu_irqs = omap2_gpio1_irqs, .sdma_reqs = omap34xx_mmc1_sdma_reqs,
.main_clk = "gpio1_ick", .opt_clks = omap34xx_mmc1_opt_clks,
.opt_clks = gpio1_opt_clks, .opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc1_opt_clks),
.opt_clks_cnt = ARRAY_SIZE(gpio1_opt_clks), .main_clk = "mmchs1_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPIO1_SHIFT, .module_bit = OMAP3430_EN_MMC1_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPIO1_SHIFT, .idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT,
}, },
}, },
.slaves = omap3xxx_gpio1_slaves, .dev_attr = &mmc1_pre_es3_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_gpio1_slaves), .class = &omap34xx_mmc_class,
.class = &omap3xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* gpio2 */
static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {
{ .role = "dbclk", .clk = "gpio2_dbck", },
};
static struct omap_hwmod_ocp_if *omap3xxx_gpio2_slaves[] = {
&omap3xxx_l4_per__gpio2,
}; };
static struct omap_hwmod omap3xxx_gpio2_hwmod = { static struct omap_hwmod omap3xxx_es3plus_mmc1_hwmod = {
.name = "gpio2", .name = "mmc1",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, .mpu_irqs = omap34xx_mmc1_mpu_irqs,
.mpu_irqs = omap2_gpio2_irqs, .sdma_reqs = omap34xx_mmc1_sdma_reqs,
.main_clk = "gpio2_ick", .opt_clks = omap34xx_mmc1_opt_clks,
.opt_clks = gpio2_opt_clks, .opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc1_opt_clks),
.opt_clks_cnt = ARRAY_SIZE(gpio2_opt_clks), .main_clk = "mmchs1_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPIO2_SHIFT, .module_bit = OMAP3430_EN_MMC1_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPIO2_SHIFT, .idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT,
}, },
}, },
.slaves = omap3xxx_gpio2_slaves, .dev_attr = &mmc1_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_gpio2_slaves), .class = &omap34xx_mmc_class,
.class = &omap3xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
}; };
/* gpio3 */ /* MMC/SD/SDIO2 */
static struct omap_hwmod_opt_clk gpio3_opt_clks[] = {
{ .role = "dbclk", .clk = "gpio3_dbck", }, static struct omap_hwmod_irq_info omap34xx_mmc2_mpu_irqs[] = {
{ .irq = INT_24XX_MMC2_IRQ, },
{ .irq = -1 }
}; };
static struct omap_hwmod_ocp_if *omap3xxx_gpio3_slaves[] = { static struct omap_hwmod_dma_info omap34xx_mmc2_sdma_reqs[] = {
&omap3xxx_l4_per__gpio3, { .name = "tx", .dma_req = 47, },
{ .name = "rx", .dma_req = 48, },
{ .dma_req = -1 }
}; };
static struct omap_hwmod omap3xxx_gpio3_hwmod = { static struct omap_hwmod_opt_clk omap34xx_mmc2_opt_clks[] = {
.name = "gpio3", { .role = "dbck", .clk = "omap_32k_fck", },
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, };
.mpu_irqs = omap2_gpio3_irqs,
.main_clk = "gpio3_ick", /* See 35xx errata 2.1.1.128 in SPRZ278F */
.opt_clks = gpio3_opt_clks, static struct omap_mmc_dev_attr mmc2_pre_es3_dev_attr = {
.opt_clks_cnt = ARRAY_SIZE(gpio3_opt_clks), .flags = OMAP_HSMMC_BROKEN_MULTIBLOCK_READ,
};
static struct omap_hwmod omap3xxx_pre_es3_mmc2_hwmod = {
.name = "mmc2",
.mpu_irqs = omap34xx_mmc2_mpu_irqs,
.sdma_reqs = omap34xx_mmc2_sdma_reqs,
.opt_clks = omap34xx_mmc2_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc2_opt_clks),
.main_clk = "mmchs2_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPIO3_SHIFT, .module_bit = OMAP3430_EN_MMC2_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPIO3_SHIFT, .idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT,
}, },
}, },
.slaves = omap3xxx_gpio3_slaves, .dev_attr = &mmc2_pre_es3_dev_attr,
.slaves_cnt = ARRAY_SIZE(omap3xxx_gpio3_slaves), .class = &omap34xx_mmc_class,
.class = &omap3xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
};
/* gpio4 */
static struct omap_hwmod_opt_clk gpio4_opt_clks[] = {
{ .role = "dbclk", .clk = "gpio4_dbck", },
};
static struct omap_hwmod_ocp_if *omap3xxx_gpio4_slaves[] = {
&omap3xxx_l4_per__gpio4,
}; };
static struct omap_hwmod omap3xxx_gpio4_hwmod = { static struct omap_hwmod omap3xxx_es3plus_mmc2_hwmod = {
.name = "gpio4", .name = "mmc2",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, .mpu_irqs = omap34xx_mmc2_mpu_irqs,
.mpu_irqs = omap2_gpio4_irqs, .sdma_reqs = omap34xx_mmc2_sdma_reqs,
.main_clk = "gpio4_ick", .opt_clks = omap34xx_mmc2_opt_clks,
.opt_clks = gpio4_opt_clks, .opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc2_opt_clks),
.opt_clks_cnt = ARRAY_SIZE(gpio4_opt_clks), .main_clk = "mmchs2_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPIO4_SHIFT, .module_bit = OMAP3430_EN_MMC2_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPIO4_SHIFT, .idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT,
}, },
}, },
.slaves = omap3xxx_gpio4_slaves, .class = &omap34xx_mmc_class,
.slaves_cnt = ARRAY_SIZE(omap3xxx_gpio4_slaves),
.class = &omap3xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
}; };
/* gpio5 */ /* MMC/SD/SDIO3 */
static struct omap_hwmod_irq_info omap3xxx_gpio5_irqs[] = {
{ .irq = 33 }, /* INT_34XX_GPIO_BANK5 */ static struct omap_hwmod_irq_info omap34xx_mmc3_mpu_irqs[] = {
{ .irq = 94, },
{ .irq = -1 } { .irq = -1 }
}; };
static struct omap_hwmod_opt_clk gpio5_opt_clks[] = { static struct omap_hwmod_dma_info omap34xx_mmc3_sdma_reqs[] = {
{ .role = "dbclk", .clk = "gpio5_dbck", }, { .name = "tx", .dma_req = 77, },
{ .name = "rx", .dma_req = 78, },
{ .dma_req = -1 }
}; };
static struct omap_hwmod_ocp_if *omap3xxx_gpio5_slaves[] = { static struct omap_hwmod_opt_clk omap34xx_mmc3_opt_clks[] = {
&omap3xxx_l4_per__gpio5, { .role = "dbck", .clk = "omap_32k_fck", },
}; };
static struct omap_hwmod omap3xxx_gpio5_hwmod = { static struct omap_hwmod omap3xxx_mmc3_hwmod = {
.name = "gpio5", .name = "mmc3",
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, .mpu_irqs = omap34xx_mmc3_mpu_irqs,
.mpu_irqs = omap3xxx_gpio5_irqs, .sdma_reqs = omap34xx_mmc3_sdma_reqs,
.main_clk = "gpio5_ick", .opt_clks = omap34xx_mmc3_opt_clks,
.opt_clks = gpio5_opt_clks, .opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc3_opt_clks),
.opt_clks_cnt = ARRAY_SIZE(gpio5_opt_clks), .main_clk = "mmchs3_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPIO5_SHIFT, .module_bit = OMAP3430_EN_MMC3_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPIO5_SHIFT, .idlest_idle_bit = OMAP3430_ST_MMC3_SHIFT,
}, },
}, },
.slaves = omap3xxx_gpio5_slaves, .class = &omap34xx_mmc_class,
.slaves_cnt = ARRAY_SIZE(omap3xxx_gpio5_slaves),
.class = &omap3xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr,
}; };
/* gpio6 */ /*
static struct omap_hwmod_irq_info omap3xxx_gpio6_irqs[] = { * 'usb_host_hs' class
{ .irq = 34 }, /* INT_34XX_GPIO_BANK6 */ * high-speed multi-port usb host controller
{ .irq = -1 } */
static struct omap_hwmod_class_sysconfig omap3xxx_usb_host_hs_sysc = {
.rev_offs = 0x0000,
.sysc_offs = 0x0010,
.syss_offs = 0x0014,
.sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_opt_clk gpio6_opt_clks[] = { static struct omap_hwmod_class omap3xxx_usb_host_hs_hwmod_class = {
{ .role = "dbclk", .clk = "gpio6_dbck", }, .name = "usb_host_hs",
.sysc = &omap3xxx_usb_host_hs_sysc,
}; };
static struct omap_hwmod_ocp_if *omap3xxx_gpio6_slaves[] = { static struct omap_hwmod_opt_clk omap3xxx_usb_host_hs_opt_clks[] = {
&omap3xxx_l4_per__gpio6, { .role = "ehci_logic_fck", .clk = "usbhost_120m_fck", },
}; };
static struct omap_hwmod omap3xxx_gpio6_hwmod = { static struct omap_hwmod_irq_info omap3xxx_usb_host_hs_irqs[] = {
.name = "gpio6", { .name = "ohci-irq", .irq = 76 },
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, { .name = "ehci-irq", .irq = 77 },
.mpu_irqs = omap3xxx_gpio6_irqs, { .irq = -1 }
.main_clk = "gpio6_ick", };
.opt_clks = gpio6_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(gpio6_opt_clks), static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = {
.prcm = { .name = "usb_host_hs",
.class = &omap3xxx_usb_host_hs_hwmod_class,
.clkdm_name = "l3_init_clkdm",
.mpu_irqs = omap3xxx_usb_host_hs_irqs,
.main_clk = "usbhost_48m_fck",
.prcm = {
.omap2 = { .omap2 = {
.module_offs = OMAP3430ES2_USBHOST_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 1,
.module_bit = OMAP3430_EN_GPIO6_SHIFT, .module_bit = OMAP3430ES2_EN_USBHOST1_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1, .idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_GPIO6_SHIFT, .idlest_idle_bit = OMAP3430ES2_ST_USBHOST_IDLE_SHIFT,
.idlest_stdby_bit = OMAP3430ES2_ST_USBHOST_STDBY_SHIFT,
}, },
}, },
.slaves = omap3xxx_gpio6_slaves, .opt_clks = omap3xxx_usb_host_hs_opt_clks,
.slaves_cnt = ARRAY_SIZE(omap3xxx_gpio6_slaves), .opt_clks_cnt = ARRAY_SIZE(omap3xxx_usb_host_hs_opt_clks),
.class = &omap3xxx_gpio_hwmod_class,
.dev_attr = &gpio_dev_attr, /*
}; * Errata: USBHOST Configured In Smart-Idle Can Lead To a Deadlock
* id: i660
*
* Description:
* In the following configuration :
* - USBHOST module is set to smart-idle mode
* - PRCM asserts idle_req to the USBHOST module ( This typically
* happens when the system is going to a low power mode : all ports
* have been suspended, the master part of the USBHOST module has
* entered the standby state, and SW has cut the functional clocks)
* - an USBHOST interrupt occurs before the module is able to answer
* idle_ack, typically a remote wakeup IRQ.
* Then the USB HOST module will enter a deadlock situation where it
* is no more accessible nor functional.
*
* Workaround:
* Don't use smart idle; use only force idle, hence HWMOD_SWSUP_SIDLE
*/
/*
* Errata: USB host EHCI may stall when entering smart-standby mode
* Id: i571
*
* Description:
* When the USBHOST module is set to smart-standby mode, and when it is
* ready to enter the standby state (i.e. all ports are suspended and
* all attached devices are in suspend mode), then it can wrongly assert
* the Mstandby signal too early while there are still some residual OCP
* transactions ongoing. If this condition occurs, the internal state
* machine may go to an undefined state and the USB link may be stuck
* upon the next resume.
*
* Workaround:
* Don't use smart standby; use only force standby,
* hence HWMOD_SWSUP_MSTANDBY
*/
/* dma_system -> L3 */ /*
static struct omap_hwmod_ocp_if omap3xxx_dma_system__l3 = { * During system boot; If the hwmod framework resets the module
.master = &omap3xxx_dma_system_hwmod, * the module will have smart idle settings; which can lead to deadlock
.slave = &omap3xxx_l3_main_hwmod, * (above Errata Id:i660); so, dont reset the module during boot;
.clk = "core_l3_ick", * Use HWMOD_INIT_NO_RESET.
.user = OCP_USER_MPU | OCP_USER_SDMA, */
};
/* dma attributes */ .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY |
static struct omap_dma_dev_attr dma_dev_attr = { HWMOD_INIT_NO_RESET,
.dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
.lch_count = 32,
}; };
static struct omap_hwmod_class_sysconfig omap3xxx_dma_sysc = { /*
* 'usb_tll_hs' class
* usb_tll_hs module is the adapter on the usb_host_hs ports
*/
static struct omap_hwmod_class_sysconfig omap3xxx_usb_tll_hs_sysc = {
.rev_offs = 0x0000, .rev_offs = 0x0000,
.sysc_offs = 0x002c, .sysc_offs = 0x0010,
.syss_offs = 0x0028, .syss_offs = 0x0014,
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET | .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE | SYSC_HAS_AUTOIDLE),
SYSS_HAS_RESET_STATUS), .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
.sysc_fields = &omap_hwmod_sysc_type1, .sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_class omap3xxx_dma_hwmod_class = { static struct omap_hwmod_class omap3xxx_usb_tll_hs_hwmod_class = {
.name = "dma", .name = "usb_tll_hs",
.sysc = &omap3xxx_dma_sysc, .sysc = &omap3xxx_usb_tll_hs_sysc,
};
/* dma_system */
static struct omap_hwmod_addr_space omap3xxx_dma_system_addrs[] = {
{
.pa_start = 0x48056000,
.pa_end = 0x48056fff,
.flags = ADDR_TYPE_RT
},
{ }
};
/* dma_system master ports */
static struct omap_hwmod_ocp_if *omap3xxx_dma_system_masters[] = {
&omap3xxx_dma_system__l3,
};
/* l4_cfg -> dma_system */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__dma_system = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_dma_system_hwmod,
.clk = "core_l4_ick",
.addr = omap3xxx_dma_system_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* dma_system slave ports */ static struct omap_hwmod_irq_info omap3xxx_usb_tll_hs_irqs[] = {
static struct omap_hwmod_ocp_if *omap3xxx_dma_system_slaves[] = { { .name = "tll-irq", .irq = 78 },
&omap3xxx_l4_core__dma_system, { .irq = -1 }
}; };
static struct omap_hwmod omap3xxx_dma_system_hwmod = { static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = {
.name = "dma", .name = "usb_tll_hs",
.class = &omap3xxx_dma_hwmod_class, .class = &omap3xxx_usb_tll_hs_hwmod_class,
.mpu_irqs = omap2_dma_system_irqs, .clkdm_name = "l3_init_clkdm",
.main_clk = "core_l3_ick", .mpu_irqs = omap3xxx_usb_tll_hs_irqs,
.main_clk = "usbtll_fck",
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
.prcm_reg_id = 1, .prcm_reg_id = 3,
.module_bit = OMAP3430_ST_SDMA_SHIFT, .module_bit = OMAP3430ES2_EN_USBTLL_SHIFT,
.idlest_reg_id = 1, .idlest_reg_id = 3,
.idlest_idle_bit = OMAP3430_ST_SDMA_SHIFT, .idlest_idle_bit = OMAP3430ES2_ST_USBTLL_SHIFT,
}, },
}, },
.slaves = omap3xxx_dma_system_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_dma_system_slaves),
.masters = omap3xxx_dma_system_masters,
.masters_cnt = ARRAY_SIZE(omap3xxx_dma_system_masters),
.dev_attr = &dma_dev_attr,
.flags = HWMOD_NO_IDLEST,
}; };
/* /*
* 'mcbsp' class * interfaces
* multi channel buffered serial port controller
*/ */
static struct omap_hwmod_class_sysconfig omap3xxx_mcbsp_sysc = { /* L3 -> L4_CORE interface */
.sysc_offs = 0x008c, static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = {
.sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_ENAWAKEUP | .master = &omap3xxx_l3_main_hwmod,
SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET), .slave = &omap3xxx_l4_core_hwmod,
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), .user = OCP_USER_MPU | OCP_USER_SDMA,
.sysc_fields = &omap_hwmod_sysc_type1,
.clockact = 0x2,
};
static struct omap_hwmod_class omap3xxx_mcbsp_hwmod_class = {
.name = "mcbsp",
.sysc = &omap3xxx_mcbsp_sysc,
.rev = MCBSP_CONFIG_TYPE3,
}; };
/* mcbsp1 */ /* L3 -> L4_PER interface */
static struct omap_hwmod_irq_info omap3xxx_mcbsp1_irqs[] = { static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_per = {
{ .name = "irq", .irq = 16 }, .master = &omap3xxx_l3_main_hwmod,
{ .name = "tx", .irq = 59 }, .slave = &omap3xxx_l4_per_hwmod,
{ .name = "rx", .irq = 60 }, .user = OCP_USER_MPU | OCP_USER_SDMA,
{ .irq = -1 }
}; };
static struct omap_hwmod_addr_space omap3xxx_mcbsp1_addrs[] = { static struct omap_hwmod_addr_space omap3xxx_l3_main_addrs[] = {
{ {
.name = "mpu", .pa_start = 0x68000000,
.pa_start = 0x48074000, .pa_end = 0x6800ffff,
.pa_end = 0x480740ff, .flags = ADDR_TYPE_RT,
.flags = ADDR_TYPE_RT
}, },
{ } { }
}; };
/* l4_core -> mcbsp1 */ /* MPU -> L3 interface */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp1 = { static struct omap_hwmod_ocp_if omap3xxx_mpu__l3_main = {
.master = &omap3xxx_l4_core_hwmod, .master = &omap3xxx_mpu_hwmod,
.slave = &omap3xxx_mcbsp1_hwmod, .slave = &omap3xxx_l3_main_hwmod,
.clk = "mcbsp1_ick", .addr = omap3xxx_l3_main_addrs,
.addr = omap3xxx_mcbsp1_addrs, .user = OCP_USER_MPU,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mcbsp1 slave ports */ /* DSS -> l3 */
static struct omap_hwmod_ocp_if *omap3xxx_mcbsp1_slaves[] = { static struct omap_hwmod_ocp_if omap3430es1_dss__l3 = {
&omap3xxx_l4_core__mcbsp1, .master = &omap3430es1_dss_core_hwmod,
.slave = &omap3xxx_l3_main_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap3xxx_mcbsp1_hwmod = { static struct omap_hwmod_ocp_if omap3xxx_dss__l3 = {
.name = "mcbsp1", .master = &omap3xxx_dss_core_hwmod,
.class = &omap3xxx_mcbsp_hwmod_class, .slave = &omap3xxx_l3_main_hwmod,
.mpu_irqs = omap3xxx_mcbsp1_irqs, .fw = {
.sdma_reqs = omap2_mcbsp1_sdma_reqs,
.main_clk = "mcbsp1_fck",
.prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .l3_perm_bit = OMAP3_L3_CORE_FW_INIT_ID_DSS,
.module_bit = OMAP3430_EN_MCBSP1_SHIFT, .flags = OMAP_FIREWALL_L3,
.module_offs = CORE_MOD, }
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MCBSP1_SHIFT,
},
}, },
.slaves = omap3xxx_mcbsp1_slaves, .user = OCP_USER_MPU | OCP_USER_SDMA,
.slaves_cnt = ARRAY_SIZE(omap3xxx_mcbsp1_slaves),
};
/* mcbsp2 */
static struct omap_hwmod_irq_info omap3xxx_mcbsp2_irqs[] = {
{ .name = "irq", .irq = 17 },
{ .name = "tx", .irq = 62 },
{ .name = "rx", .irq = 63 },
{ .irq = -1 }
}; };
static struct omap_hwmod_addr_space omap3xxx_mcbsp2_addrs[] = { /* l3_core -> usbhsotg interface */
{ static struct omap_hwmod_ocp_if omap3xxx_usbhsotg__l3 = {
.name = "mpu", .master = &omap3xxx_usbhsotg_hwmod,
.pa_start = 0x49022000, .slave = &omap3xxx_l3_main_hwmod,
.pa_end = 0x490220ff, .clk = "core_l3_ick",
.flags = ADDR_TYPE_RT .user = OCP_USER_MPU,
},
{ }
}; };
/* l4_per -> mcbsp2 */ /* l3_core -> am35xx_usbhsotg interface */
static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp2 = { static struct omap_hwmod_ocp_if am35xx_usbhsotg__l3 = {
.master = &omap3xxx_l4_per_hwmod, .master = &am35xx_usbhsotg_hwmod,
.slave = &omap3xxx_mcbsp2_hwmod, .slave = &omap3xxx_l3_main_hwmod,
.clk = "mcbsp2_ick", .clk = "core_l3_ick",
.addr = omap3xxx_mcbsp2_addrs, .user = OCP_USER_MPU,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* L4_CORE -> L4_WKUP interface */
/* mcbsp2 slave ports */ static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = {
static struct omap_hwmod_ocp_if *omap3xxx_mcbsp2_slaves[] = { .master = &omap3xxx_l4_core_hwmod,
&omap3xxx_l4_per__mcbsp2, .slave = &omap3xxx_l4_wkup_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_mcbsp_dev_attr omap34xx_mcbsp2_dev_attr = { /* L4 CORE -> MMC1 interface */
.sidetone = "mcbsp2_sidetone", static struct omap_hwmod_ocp_if omap3xxx_l4_core__pre_es3_mmc1 = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_pre_es3_mmc1_hwmod,
.clk = "mmchs1_ick",
.addr = omap2430_mmc1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
.flags = OMAP_FIREWALL_L4
}; };
static struct omap_hwmod omap3xxx_mcbsp2_hwmod = { static struct omap_hwmod_ocp_if omap3xxx_l4_core__es3plus_mmc1 = {
.name = "mcbsp2", .master = &omap3xxx_l4_core_hwmod,
.class = &omap3xxx_mcbsp_hwmod_class, .slave = &omap3xxx_es3plus_mmc1_hwmod,
.mpu_irqs = omap3xxx_mcbsp2_irqs, .clk = "mmchs1_ick",
.sdma_reqs = omap2_mcbsp2_sdma_reqs, .addr = omap2430_mmc1_addr_space,
.main_clk = "mcbsp2_fck", .user = OCP_USER_MPU | OCP_USER_SDMA,
.prcm = { .flags = OMAP_FIREWALL_L4
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MCBSP2_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MCBSP2_SHIFT,
},
},
.slaves = omap3xxx_mcbsp2_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_mcbsp2_slaves),
.dev_attr = &omap34xx_mcbsp2_dev_attr,
}; };
/* mcbsp3 */ /* L4 CORE -> MMC2 interface */
static struct omap_hwmod_irq_info omap3xxx_mcbsp3_irqs[] = { static struct omap_hwmod_ocp_if omap3xxx_l4_core__pre_es3_mmc2 = {
{ .name = "irq", .irq = 22 }, .master = &omap3xxx_l4_core_hwmod,
{ .name = "tx", .irq = 89 }, .slave = &omap3xxx_pre_es3_mmc2_hwmod,
{ .name = "rx", .irq = 90 }, .clk = "mmchs2_ick",
{ .irq = -1 } .addr = omap2430_mmc2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
.flags = OMAP_FIREWALL_L4
}; };
static struct omap_hwmod_addr_space omap3xxx_mcbsp3_addrs[] = { static struct omap_hwmod_ocp_if omap3xxx_l4_core__es3plus_mmc2 = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_es3plus_mmc2_hwmod,
.clk = "mmchs2_ick",
.addr = omap2430_mmc2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
.flags = OMAP_FIREWALL_L4
};
/* L4 CORE -> MMC3 interface */
static struct omap_hwmod_addr_space omap3xxx_mmc3_addr_space[] = {
{ {
.name = "mpu", .pa_start = 0x480ad000,
.pa_start = 0x49024000, .pa_end = 0x480ad1ff,
.pa_end = 0x490240ff, .flags = ADDR_TYPE_RT,
.flags = ADDR_TYPE_RT
}, },
{ } { }
}; };
/* l4_per -> mcbsp3 */ static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmc3 = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3 = { .master = &omap3xxx_l4_core_hwmod,
.master = &omap3xxx_l4_per_hwmod, .slave = &omap3xxx_mmc3_hwmod,
.slave = &omap3xxx_mcbsp3_hwmod, .clk = "mmchs3_ick",
.clk = "mcbsp3_ick", .addr = omap3xxx_mmc3_addr_space,
.addr = omap3xxx_mcbsp3_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
.flags = OMAP_FIREWALL_L4
}; };
/* mcbsp3 slave ports */ /* L4 CORE -> UART1 interface */
static struct omap_hwmod_ocp_if *omap3xxx_mcbsp3_slaves[] = { static struct omap_hwmod_addr_space omap3xxx_uart1_addr_space[] = {
&omap3xxx_l4_per__mcbsp3, {
.pa_start = OMAP3_UART1_BASE,
.pa_end = OMAP3_UART1_BASE + SZ_8K - 1,
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
},
{ }
}; };
static struct omap_mcbsp_dev_attr omap34xx_mcbsp3_dev_attr = { static struct omap_hwmod_ocp_if omap3_l4_core__uart1 = {
.sidetone = "mcbsp3_sidetone", .master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_uart1_hwmod,
.clk = "uart1_ick",
.addr = omap3xxx_uart1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap3xxx_mcbsp3_hwmod = { /* L4 CORE -> UART2 interface */
.name = "mcbsp3", static struct omap_hwmod_addr_space omap3xxx_uart2_addr_space[] = {
.class = &omap3xxx_mcbsp_hwmod_class, {
.mpu_irqs = omap3xxx_mcbsp3_irqs, .pa_start = OMAP3_UART2_BASE,
.sdma_reqs = omap2_mcbsp3_sdma_reqs, .pa_end = OMAP3_UART2_BASE + SZ_1K - 1,
.main_clk = "mcbsp3_fck", .flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MCBSP3_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MCBSP3_SHIFT,
},
}, },
.slaves = omap3xxx_mcbsp3_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap3xxx_mcbsp3_slaves),
.dev_attr = &omap34xx_mcbsp3_dev_attr,
};
/* mcbsp4 */
static struct omap_hwmod_irq_info omap3xxx_mcbsp4_irqs[] = {
{ .name = "irq", .irq = 23 },
{ .name = "tx", .irq = 54 },
{ .name = "rx", .irq = 55 },
{ .irq = -1 }
}; };
static struct omap_hwmod_dma_info omap3xxx_mcbsp4_sdma_chs[] = { static struct omap_hwmod_ocp_if omap3_l4_core__uart2 = {
{ .name = "rx", .dma_req = 20 }, .master = &omap3xxx_l4_core_hwmod,
{ .name = "tx", .dma_req = 19 }, .slave = &omap3xxx_uart2_hwmod,
{ .dma_req = -1 } .clk = "uart2_ick",
.addr = omap3xxx_uart2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_addr_space omap3xxx_mcbsp4_addrs[] = { /* L4 PER -> UART3 interface */
static struct omap_hwmod_addr_space omap3xxx_uart3_addr_space[] = {
{ {
.name = "mpu", .pa_start = OMAP3_UART3_BASE,
.pa_start = 0x49026000, .pa_end = OMAP3_UART3_BASE + SZ_1K - 1,
.pa_end = 0x490260ff, .flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
.flags = ADDR_TYPE_RT
}, },
{ } { }
}; };
/* l4_per -> mcbsp4 */ static struct omap_hwmod_ocp_if omap3_l4_per__uart3 = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp4 = {
.master = &omap3xxx_l4_per_hwmod, .master = &omap3xxx_l4_per_hwmod,
.slave = &omap3xxx_mcbsp4_hwmod, .slave = &omap3xxx_uart3_hwmod,
.clk = "mcbsp4_ick", .clk = "uart3_ick",
.addr = omap3xxx_mcbsp4_addrs, .addr = omap3xxx_uart3_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mcbsp4 slave ports */ /* L4 PER -> UART4 interface */
static struct omap_hwmod_ocp_if *omap3xxx_mcbsp4_slaves[] = { static struct omap_hwmod_addr_space omap36xx_uart4_addr_space[] = {
&omap3xxx_l4_per__mcbsp4, {
}; .pa_start = OMAP3_UART4_BASE,
.pa_end = OMAP3_UART4_BASE + SZ_1K - 1,
static struct omap_hwmod omap3xxx_mcbsp4_hwmod = { .flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
.name = "mcbsp4",
.class = &omap3xxx_mcbsp_hwmod_class,
.mpu_irqs = omap3xxx_mcbsp4_irqs,
.sdma_reqs = omap3xxx_mcbsp4_sdma_chs,
.main_clk = "mcbsp4_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MCBSP4_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MCBSP4_SHIFT,
},
}, },
.slaves = omap3xxx_mcbsp4_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap3xxx_mcbsp4_slaves),
};
/* mcbsp5 */
static struct omap_hwmod_irq_info omap3xxx_mcbsp5_irqs[] = {
{ .name = "irq", .irq = 27 },
{ .name = "tx", .irq = 81 },
{ .name = "rx", .irq = 82 },
{ .irq = -1 }
}; };
static struct omap_hwmod_dma_info omap3xxx_mcbsp5_sdma_chs[] = { static struct omap_hwmod_ocp_if omap36xx_l4_per__uart4 = {
{ .name = "rx", .dma_req = 22 }, .master = &omap3xxx_l4_per_hwmod,
{ .name = "tx", .dma_req = 21 }, .slave = &omap36xx_uart4_hwmod,
{ .dma_req = -1 } .clk = "uart4_ick",
.addr = omap36xx_uart4_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_addr_space omap3xxx_mcbsp5_addrs[] = { /* AM35xx: L4 CORE -> UART4 interface */
static struct omap_hwmod_addr_space am35xx_uart4_addr_space[] = {
{ {
.name = "mpu", .pa_start = OMAP3_UART4_AM35XX_BASE,
.pa_start = 0x48096000, .pa_end = OMAP3_UART4_AM35XX_BASE + SZ_1K - 1,
.pa_end = 0x480960ff, .flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
.flags = ADDR_TYPE_RT
}, },
{ }
}; };
/* l4_core -> mcbsp5 */ static struct omap_hwmod_ocp_if am35xx_l4_core__uart4 = {
static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp5 = {
.master = &omap3xxx_l4_core_hwmod, .master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_mcbsp5_hwmod, .slave = &am35xx_uart4_hwmod,
.clk = "mcbsp5_ick", .clk = "uart4_ick",
.addr = omap3xxx_mcbsp5_addrs, .addr = am35xx_uart4_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mcbsp5 slave ports */ /* L4 CORE -> I2C1 interface */
static struct omap_hwmod_ocp_if *omap3xxx_mcbsp5_slaves[] = { static struct omap_hwmod_ocp_if omap3_l4_core__i2c1 = {
&omap3xxx_l4_core__mcbsp5, .master = &omap3xxx_l4_core_hwmod,
}; .slave = &omap3xxx_i2c1_hwmod,
.clk = "i2c1_ick",
static struct omap_hwmod omap3xxx_mcbsp5_hwmod = { .addr = omap2_i2c1_addr_space,
.name = "mcbsp5", .fw = {
.class = &omap3xxx_mcbsp_hwmod_class,
.mpu_irqs = omap3xxx_mcbsp5_irqs,
.sdma_reqs = omap3xxx_mcbsp5_sdma_chs,
.main_clk = "mcbsp5_fck",
.prcm = {
.omap2 = { .omap2 = {
.prcm_reg_id = 1, .l4_fw_region = OMAP3_L4_CORE_FW_I2C1_REGION,
.module_bit = OMAP3430_EN_MCBSP5_SHIFT, .l4_prot_group = 7,
.module_offs = CORE_MOD, .flags = OMAP_FIREWALL_L4,
.idlest_reg_id = 1, }
.idlest_idle_bit = OMAP3430_ST_MCBSP5_SHIFT,
},
}, },
.slaves = omap3xxx_mcbsp5_slaves, .user = OCP_USER_MPU | OCP_USER_SDMA,
.slaves_cnt = ARRAY_SIZE(omap3xxx_mcbsp5_slaves),
};
/* 'mcbsp sidetone' class */
static struct omap_hwmod_class_sysconfig omap3xxx_mcbsp_sidetone_sysc = {
.sysc_offs = 0x0010,
.sysc_flags = SYSC_HAS_AUTOIDLE,
.sysc_fields = &omap_hwmod_sysc_type1,
};
static struct omap_hwmod_class omap3xxx_mcbsp_sidetone_hwmod_class = {
.name = "mcbsp_sidetone",
.sysc = &omap3xxx_mcbsp_sidetone_sysc,
}; };
/* mcbsp2_sidetone */ /* L4 CORE -> I2C2 interface */
static struct omap_hwmod_irq_info omap3xxx_mcbsp2_sidetone_irqs[] = { static struct omap_hwmod_ocp_if omap3_l4_core__i2c2 = {
{ .name = "irq", .irq = 4 }, .master = &omap3xxx_l4_core_hwmod,
{ .irq = -1 } .slave = &omap3xxx_i2c2_hwmod,
.clk = "i2c2_ick",
.addr = omap2_i2c2_addr_space,
.fw = {
.omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_I2C2_REGION,
.l4_prot_group = 7,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_addr_space omap3xxx_mcbsp2_sidetone_addrs[] = { /* L4 CORE -> I2C3 interface */
static struct omap_hwmod_addr_space omap3xxx_i2c3_addr_space[] = {
{ {
.name = "sidetone", .pa_start = 0x48060000,
.pa_start = 0x49028000, .pa_end = 0x48060000 + SZ_128 - 1,
.pa_end = 0x490280ff, .flags = ADDR_TYPE_RT,
.flags = ADDR_TYPE_RT
}, },
{ } { }
}; };
/* l4_per -> mcbsp2_sidetone */ static struct omap_hwmod_ocp_if omap3_l4_core__i2c3 = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp2_sidetone = { .master = &omap3xxx_l4_core_hwmod,
.master = &omap3xxx_l4_per_hwmod, .slave = &omap3xxx_i2c3_hwmod,
.slave = &omap3xxx_mcbsp2_sidetone_hwmod, .clk = "i2c3_ick",
.clk = "mcbsp2_ick", .addr = omap3xxx_i2c3_addr_space,
.addr = omap3xxx_mcbsp2_sidetone_addrs, .fw = {
.user = OCP_USER_MPU, .omap2 = {
}; .l4_fw_region = OMAP3_L4_CORE_FW_I2C3_REGION,
.l4_prot_group = 7,
/* mcbsp2_sidetone slave ports */ .flags = OMAP_FIREWALL_L4,
static struct omap_hwmod_ocp_if *omap3xxx_mcbsp2_sidetone_slaves[] = { }
&omap3xxx_l4_per__mcbsp2_sidetone,
};
static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod = {
.name = "mcbsp2_sidetone",
.class = &omap3xxx_mcbsp_sidetone_hwmod_class,
.mpu_irqs = omap3xxx_mcbsp2_sidetone_irqs,
.main_clk = "mcbsp2_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MCBSP2_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MCBSP2_SHIFT,
},
}, },
.slaves = omap3xxx_mcbsp2_sidetone_slaves, .user = OCP_USER_MPU | OCP_USER_SDMA,
.slaves_cnt = ARRAY_SIZE(omap3xxx_mcbsp2_sidetone_slaves),
};
/* mcbsp3_sidetone */
static struct omap_hwmod_irq_info omap3xxx_mcbsp3_sidetone_irqs[] = {
{ .name = "irq", .irq = 5 },
{ .irq = -1 }
}; };
static struct omap_hwmod_addr_space omap3xxx_mcbsp3_sidetone_addrs[] = { /* L4 CORE -> SR1 interface */
static struct omap_hwmod_addr_space omap3_sr1_addr_space[] = {
{ {
.name = "sidetone", .pa_start = OMAP34XX_SR1_BASE,
.pa_start = 0x4902A000, .pa_end = OMAP34XX_SR1_BASE + SZ_1K - 1,
.pa_end = 0x4902A0ff, .flags = ADDR_TYPE_RT,
.flags = ADDR_TYPE_RT
}, },
{ } { }
}; };
/* l4_per -> mcbsp3_sidetone */ static struct omap_hwmod_ocp_if omap34xx_l4_core__sr1 = {
static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3_sidetone = { .master = &omap3xxx_l4_core_hwmod,
.master = &omap3xxx_l4_per_hwmod, .slave = &omap34xx_sr1_hwmod,
.slave = &omap3xxx_mcbsp3_sidetone_hwmod, .clk = "sr_l4_ick",
.clk = "mcbsp3_ick", .addr = omap3_sr1_addr_space,
.addr = omap3xxx_mcbsp3_sidetone_addrs,
.user = OCP_USER_MPU, .user = OCP_USER_MPU,
}; };
/* mcbsp3_sidetone slave ports */ static struct omap_hwmod_ocp_if omap36xx_l4_core__sr1 = {
static struct omap_hwmod_ocp_if *omap3xxx_mcbsp3_sidetone_slaves[] = { .master = &omap3xxx_l4_core_hwmod,
&omap3xxx_l4_per__mcbsp3_sidetone, .slave = &omap36xx_sr1_hwmod,
.clk = "sr_l4_ick",
.addr = omap3_sr1_addr_space,
.user = OCP_USER_MPU,
}; };
static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod = { /* L4 CORE -> SR1 interface */
.name = "mcbsp3_sidetone", static struct omap_hwmod_addr_space omap3_sr2_addr_space[] = {
.class = &omap3xxx_mcbsp_sidetone_hwmod_class, {
.mpu_irqs = omap3xxx_mcbsp3_sidetone_irqs, .pa_start = OMAP34XX_SR2_BASE,
.main_clk = "mcbsp3_fck", .pa_end = OMAP34XX_SR2_BASE + SZ_1K - 1,
.prcm = { .flags = ADDR_TYPE_RT,
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MCBSP3_SHIFT,
.module_offs = OMAP3430_PER_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MCBSP3_SHIFT,
},
}, },
.slaves = omap3xxx_mcbsp3_sidetone_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap3xxx_mcbsp3_sidetone_slaves),
}; };
static struct omap_hwmod_ocp_if omap34xx_l4_core__sr2 = {
/* SR common */ .master = &omap3xxx_l4_core_hwmod,
static struct omap_hwmod_sysc_fields omap34xx_sr_sysc_fields = { .slave = &omap34xx_sr2_hwmod,
.clkact_shift = 20, .clk = "sr_l4_ick",
.addr = omap3_sr2_addr_space,
.user = OCP_USER_MPU,
}; };
static struct omap_hwmod_class_sysconfig omap34xx_sr_sysc = { static struct omap_hwmod_ocp_if omap36xx_l4_core__sr2 = {
.sysc_offs = 0x24, .master = &omap3xxx_l4_core_hwmod,
.sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_NO_CACHE), .slave = &omap36xx_sr2_hwmod,
.clockact = CLOCKACT_TEST_ICLK, .clk = "sr_l4_ick",
.sysc_fields = &omap34xx_sr_sysc_fields, .addr = omap3_sr2_addr_space,
.user = OCP_USER_MPU,
}; };
static struct omap_hwmod_class omap34xx_smartreflex_hwmod_class = { static struct omap_hwmod_addr_space omap3xxx_usbhsotg_addrs[] = {
.name = "smartreflex", {
.sysc = &omap34xx_sr_sysc, .pa_start = OMAP34XX_HSUSB_OTG_BASE,
.rev = 1, .pa_end = OMAP34XX_HSUSB_OTG_BASE + SZ_4K - 1,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod_sysc_fields omap36xx_sr_sysc_fields = { /* l4_core -> usbhsotg */
.sidle_shift = 24, static struct omap_hwmod_ocp_if omap3xxx_l4_core__usbhsotg = {
.enwkup_shift = 26 .master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_usbhsotg_hwmod,
.clk = "l4_ick",
.addr = omap3xxx_usbhsotg_addrs,
.user = OCP_USER_MPU,
}; };
static struct omap_hwmod_class_sysconfig omap36xx_sr_sysc = { static struct omap_hwmod_addr_space am35xx_usbhsotg_addrs[] = {
.sysc_offs = 0x38, {
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), .pa_start = AM35XX_IPSS_USBOTGSS_BASE,
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP | .pa_end = AM35XX_IPSS_USBOTGSS_BASE + SZ_4K - 1,
SYSC_NO_CACHE), .flags = ADDR_TYPE_RT
.sysc_fields = &omap36xx_sr_sysc_fields, },
{ }
}; };
static struct omap_hwmod_class omap36xx_smartreflex_hwmod_class = { /* l4_core -> usbhsotg */
.name = "smartreflex", static struct omap_hwmod_ocp_if am35xx_l4_core__usbhsotg = {
.sysc = &omap36xx_sr_sysc, .master = &omap3xxx_l4_core_hwmod,
.rev = 2, .slave = &am35xx_usbhsotg_hwmod,
.clk = "l4_ick",
.addr = am35xx_usbhsotg_addrs,
.user = OCP_USER_MPU,
}; };
/* SR1 */ /* L4_WKUP -> L4_SEC interface */
static struct omap_smartreflex_dev_attr sr1_dev_attr = { static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__l4_sec = {
.sensor_voltdm_name = "mpu_iva", .master = &omap3xxx_l4_wkup_hwmod,
.slave = &omap3xxx_l4_sec_hwmod,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_ocp_if *omap3_sr1_slaves[] = { /* IVA2 <- L3 interface */
&omap3_l4_core__sr1, static struct omap_hwmod_ocp_if omap3xxx_l3__iva = {
.master = &omap3xxx_l3_main_hwmod,
.slave = &omap3xxx_iva_hwmod,
.clk = "core_l3_ick",
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap34xx_sr1_hwmod = { static struct omap_hwmod_addr_space omap3xxx_timer1_addrs[] = {
.name = "sr1_hwmod", {
.class = &omap34xx_smartreflex_hwmod_class, .pa_start = 0x48318000,
.main_clk = "sr1_fck", .pa_end = 0x48318000 + SZ_1K - 1,
.prcm = { .flags = ADDR_TYPE_RT
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_SR1_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_SR1_SHIFT,
},
}, },
.slaves = omap3_sr1_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap3_sr1_slaves),
.dev_attr = &sr1_dev_attr,
.mpu_irqs = omap3_smartreflex_mpu_irqs,
.flags = HWMOD_SET_DEFAULT_CLOCKACT,
}; };
static struct omap_hwmod omap36xx_sr1_hwmod = { /* l4_wkup -> timer1 */
.name = "sr1_hwmod", static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__timer1 = {
.class = &omap36xx_smartreflex_hwmod_class, .master = &omap3xxx_l4_wkup_hwmod,
.main_clk = "sr1_fck", .slave = &omap3xxx_timer1_hwmod,
.prcm = { .clk = "gpt1_ick",
.omap2 = { .addr = omap3xxx_timer1_addrs,
.prcm_reg_id = 1, .user = OCP_USER_MPU | OCP_USER_SDMA,
.module_bit = OMAP3430_EN_SR1_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_SR1_SHIFT,
},
},
.slaves = omap3_sr1_slaves,
.slaves_cnt = ARRAY_SIZE(omap3_sr1_slaves),
.dev_attr = &sr1_dev_attr,
.mpu_irqs = omap3_smartreflex_mpu_irqs,
}; };
/* SR2 */ static struct omap_hwmod_addr_space omap3xxx_timer2_addrs[] = {
static struct omap_smartreflex_dev_attr sr2_dev_attr = { {
.sensor_voltdm_name = "core", .pa_start = 0x49032000,
.pa_end = 0x49032000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod_ocp_if *omap3_sr2_slaves[] = { /* l4_per -> timer2 */
&omap3_l4_core__sr2, static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer2 = {
.master = &omap3xxx_l4_per_hwmod,
.slave = &omap3xxx_timer2_hwmod,
.clk = "gpt2_ick",
.addr = omap3xxx_timer2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap34xx_sr2_hwmod = { static struct omap_hwmod_addr_space omap3xxx_timer3_addrs[] = {
.name = "sr2_hwmod", {
.class = &omap34xx_smartreflex_hwmod_class, .pa_start = 0x49034000,
.main_clk = "sr2_fck", .pa_end = 0x49034000 + SZ_1K - 1,
.prcm = { .flags = ADDR_TYPE_RT
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_SR2_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_SR2_SHIFT,
},
}, },
.slaves = omap3_sr2_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap3_sr2_slaves),
.dev_attr = &sr2_dev_attr,
.mpu_irqs = omap3_smartreflex_core_irqs,
.flags = HWMOD_SET_DEFAULT_CLOCKACT,
}; };
static struct omap_hwmod omap36xx_sr2_hwmod = { /* l4_per -> timer3 */
.name = "sr2_hwmod", static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer3 = {
.class = &omap36xx_smartreflex_hwmod_class, .master = &omap3xxx_l4_per_hwmod,
.main_clk = "sr2_fck", .slave = &omap3xxx_timer3_hwmod,
.prcm = { .clk = "gpt3_ick",
.omap2 = { .addr = omap3xxx_timer3_addrs,
.prcm_reg_id = 1, .user = OCP_USER_MPU | OCP_USER_SDMA,
.module_bit = OMAP3430_EN_SR2_SHIFT,
.module_offs = WKUP_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_EN_SR2_SHIFT,
},
},
.slaves = omap3_sr2_slaves,
.slaves_cnt = ARRAY_SIZE(omap3_sr2_slaves),
.dev_attr = &sr2_dev_attr,
.mpu_irqs = omap3_smartreflex_core_irqs,
}; };
/* static struct omap_hwmod_addr_space omap3xxx_timer4_addrs[] = {
* 'mailbox' class {
* mailbox module allowing communication between the on-chip processors .pa_start = 0x49036000,
* using a queued mailbox-interrupt mechanism. .pa_end = 0x49036000 + SZ_1K - 1,
*/ .flags = ADDR_TYPE_RT
},
{ }
};
static struct omap_hwmod_class_sysconfig omap3xxx_mailbox_sysc = { /* l4_per -> timer4 */
.rev_offs = 0x000, static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer4 = {
.sysc_offs = 0x010, .master = &omap3xxx_l4_per_hwmod,
.syss_offs = 0x014, .slave = &omap3xxx_timer4_hwmod,
.sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE | .clk = "gpt4_ick",
SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), .addr = omap3xxx_timer4_addrs,
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), .user = OCP_USER_MPU | OCP_USER_SDMA,
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_class omap3xxx_mailbox_hwmod_class = { static struct omap_hwmod_addr_space omap3xxx_timer5_addrs[] = {
.name = "mailbox", {
.sysc = &omap3xxx_mailbox_sysc, .pa_start = 0x49038000,
.pa_end = 0x49038000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod omap3xxx_mailbox_hwmod; /* l4_per -> timer5 */
static struct omap_hwmod_irq_info omap3xxx_mailbox_irqs[] = { static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer5 = {
{ .irq = 26 }, .master = &omap3xxx_l4_per_hwmod,
{ .irq = -1 } .slave = &omap3xxx_timer5_hwmod,
.clk = "gpt5_ick",
.addr = omap3xxx_timer5_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_addr_space omap3xxx_mailbox_addrs[] = { static struct omap_hwmod_addr_space omap3xxx_timer6_addrs[] = {
{ {
.pa_start = 0x48094000, .pa_start = 0x4903A000,
.pa_end = 0x480941ff, .pa_end = 0x4903A000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT, .flags = ADDR_TYPE_RT
}, },
{ } { }
}; };
/* l4_core -> mailbox */ /* l4_per -> timer6 */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__mailbox = { static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer6 = {
.master = &omap3xxx_l4_core_hwmod, .master = &omap3xxx_l4_per_hwmod,
.slave = &omap3xxx_mailbox_hwmod, .slave = &omap3xxx_timer6_hwmod,
.addr = omap3xxx_mailbox_addrs, .clk = "gpt6_ick",
.addr = omap3xxx_timer6_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mailbox slave ports */ static struct omap_hwmod_addr_space omap3xxx_timer7_addrs[] = {
static struct omap_hwmod_ocp_if *omap3xxx_mailbox_slaves[] = { {
&omap3xxx_l4_core__mailbox, .pa_start = 0x4903C000,
}; .pa_end = 0x4903C000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
static struct omap_hwmod omap3xxx_mailbox_hwmod = {
.name = "mailbox",
.class = &omap3xxx_mailbox_hwmod_class,
.mpu_irqs = omap3xxx_mailbox_irqs,
.main_clk = "mailboxes_ick",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MAILBOXES_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MAILBOXES_SHIFT,
},
}, },
.slaves = omap3xxx_mailbox_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap3xxx_mailbox_slaves),
}; };
/* l4 core -> mcspi1 interface */ /* l4_per -> timer7 */
static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi1 = { static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer7 = {
.master = &omap3xxx_l4_core_hwmod, .master = &omap3xxx_l4_per_hwmod,
.slave = &omap34xx_mcspi1, .slave = &omap3xxx_timer7_hwmod,
.clk = "mcspi1_ick", .clk = "gpt7_ick",
.addr = omap2_mcspi1_addr_space, .addr = omap3xxx_timer7_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* l4 core -> mcspi2 interface */ static struct omap_hwmod_addr_space omap3xxx_timer8_addrs[] = {
static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi2 = { {
.master = &omap3xxx_l4_core_hwmod, .pa_start = 0x4903E000,
.slave = &omap34xx_mcspi2, .pa_end = 0x4903E000 + SZ_1K - 1,
.clk = "mcspi2_ick", .flags = ADDR_TYPE_RT
.addr = omap2_mcspi2_addr_space, },
.user = OCP_USER_MPU | OCP_USER_SDMA, { }
}; };
/* l4 core -> mcspi3 interface */ /* l4_per -> timer8 */
static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi3 = { static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer8 = {
.master = &omap3xxx_l4_core_hwmod, .master = &omap3xxx_l4_per_hwmod,
.slave = &omap34xx_mcspi3, .slave = &omap3xxx_timer8_hwmod,
.clk = "mcspi3_ick", .clk = "gpt8_ick",
.addr = omap2430_mcspi3_addr_space, .addr = omap3xxx_timer8_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* l4 core -> mcspi4 interface */ static struct omap_hwmod_addr_space omap3xxx_timer9_addrs[] = {
static struct omap_hwmod_addr_space omap34xx_mcspi4_addr_space[] = {
{ {
.pa_start = 0x480ba000, .pa_start = 0x49040000,
.pa_end = 0x480ba0ff, .pa_end = 0x49040000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT, .flags = ADDR_TYPE_RT
}, },
{ } { }
}; };
static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi4 = { /* l4_per -> timer9 */
.master = &omap3xxx_l4_core_hwmod, static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer9 = {
.slave = &omap34xx_mcspi4, .master = &omap3xxx_l4_per_hwmod,
.clk = "mcspi4_ick", .slave = &omap3xxx_timer9_hwmod,
.addr = omap34xx_mcspi4_addr_space, .clk = "gpt9_ick",
.addr = omap3xxx_timer9_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* /* l4_core -> timer10 */
* 'mcspi' class static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer10 = {
* multichannel serial port interface (mcspi) / master/slave synchronous serial .master = &omap3xxx_l4_core_hwmod,
* bus .slave = &omap3xxx_timer10_hwmod,
*/ .clk = "gpt10_ick",
.addr = omap2_timer10_addrs,
static struct omap_hwmod_class_sysconfig omap34xx_mcspi_sysc = { .user = OCP_USER_MPU | OCP_USER_SDMA,
.rev_offs = 0x0000,
.sysc_offs = 0x0010,
.syss_offs = 0x0014,
.sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_class omap34xx_mcspi_class = { /* l4_core -> timer11 */
.name = "mcspi", static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer11 = {
.sysc = &omap34xx_mcspi_sysc, .master = &omap3xxx_l4_core_hwmod,
.rev = OMAP3_MCSPI_REV, .slave = &omap3xxx_timer11_hwmod,
.clk = "gpt11_ick",
.addr = omap2_timer11_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* mcspi1 */ static struct omap_hwmod_addr_space omap3xxx_timer12_addrs[] = {
static struct omap_hwmod_ocp_if *omap34xx_mcspi1_slaves[] = { {
&omap34xx_l4_core__mcspi1, .pa_start = 0x48304000,
.pa_end = 0x48304000 + SZ_1K - 1,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap2_mcspi_dev_attr omap_mcspi1_dev_attr = { /* l4_core -> timer12 */
.num_chipselect = 4, static struct omap_hwmod_ocp_if omap3xxx_l4_sec__timer12 = {
.master = &omap3xxx_l4_sec_hwmod,
.slave = &omap3xxx_timer12_hwmod,
.clk = "gpt12_ick",
.addr = omap3xxx_timer12_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap34xx_mcspi1 = { /* l4_wkup -> wd_timer2 */
.name = "mcspi1", static struct omap_hwmod_addr_space omap3xxx_wd_timer2_addrs[] = {
.mpu_irqs = omap2_mcspi1_mpu_irqs, {
.sdma_reqs = omap2_mcspi1_sdma_reqs, .pa_start = 0x48314000,
.main_clk = "mcspi1_fck", .pa_end = 0x4831407f,
.prcm = { .flags = ADDR_TYPE_RT
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MCSPI1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MCSPI1_SHIFT,
},
}, },
.slaves = omap34xx_mcspi1_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap34xx_mcspi1_slaves),
.class = &omap34xx_mcspi_class,
.dev_attr = &omap_mcspi1_dev_attr,
}; };
/* mcspi2 */ static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__wd_timer2 = {
static struct omap_hwmod_ocp_if *omap34xx_mcspi2_slaves[] = { .master = &omap3xxx_l4_wkup_hwmod,
&omap34xx_l4_core__mcspi2, .slave = &omap3xxx_wd_timer2_hwmod,
.clk = "wdt2_ick",
.addr = omap3xxx_wd_timer2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap2_mcspi_dev_attr omap_mcspi2_dev_attr = { /* l4_core -> dss */
.num_chipselect = 2, static struct omap_hwmod_ocp_if omap3430es1_l4_core__dss = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3430es1_dss_core_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP3ES1_L4_CORE_FW_DSS_CORE_REGION,
.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap34xx_mcspi2 = { static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss = {
.name = "mcspi2", .master = &omap3xxx_l4_core_hwmod,
.mpu_irqs = omap2_mcspi2_mpu_irqs, .slave = &omap3xxx_dss_core_hwmod,
.sdma_reqs = omap2_mcspi2_sdma_reqs, .clk = "dss_ick",
.main_clk = "mcspi2_fck", .addr = omap2_dss_addrs,
.prcm = { .fw = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .l4_fw_region = OMAP3_L4_CORE_FW_DSS_CORE_REGION,
.prcm_reg_id = 1, .l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
.module_bit = OMAP3430_EN_MCSPI2_SHIFT, .flags = OMAP_FIREWALL_L4,
.idlest_reg_id = 1, }
.idlest_idle_bit = OMAP3430_ST_MCSPI2_SHIFT,
},
}, },
.slaves = omap34xx_mcspi2_slaves, .user = OCP_USER_MPU | OCP_USER_SDMA,
.slaves_cnt = ARRAY_SIZE(omap34xx_mcspi2_slaves),
.class = &omap34xx_mcspi_class,
.dev_attr = &omap_mcspi2_dev_attr,
}; };
/* mcspi3 */ /* l4_core -> dss_dispc */
static struct omap_hwmod_irq_info omap34xx_mcspi3_mpu_irqs[] = { static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dispc = {
{ .name = "irq", .irq = 91 }, /* 91 */ .master = &omap3xxx_l4_core_hwmod,
{ .irq = -1 } .slave = &omap3xxx_dss_dispc_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_dispc_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_DSS_DISPC_REGION,
.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_dma_info omap34xx_mcspi3_sdma_reqs[] = { static struct omap_hwmod_addr_space omap3xxx_dss_dsi1_addrs[] = {
{ .name = "tx0", .dma_req = 15 }, {
{ .name = "rx0", .dma_req = 16 }, .pa_start = 0x4804FC00,
{ .name = "tx1", .dma_req = 23 }, .pa_end = 0x4804FFFF,
{ .name = "rx1", .dma_req = 24 }, .flags = ADDR_TYPE_RT
{ .dma_req = -1 } },
{ }
}; };
static struct omap_hwmod_ocp_if *omap34xx_mcspi3_slaves[] = { /* l4_core -> dss_dsi1 */
&omap34xx_l4_core__mcspi3, static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dsi1 = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_dss_dsi1_hwmod,
.clk = "dss_ick",
.addr = omap3xxx_dss_dsi1_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_DSS_DSI_REGION,
.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap2_mcspi_dev_attr omap_mcspi3_dev_attr = { /* l4_core -> dss_rfbi */
.num_chipselect = 2, static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_rfbi = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_dss_rfbi_hwmod,
.clk = "dss_ick",
.addr = omap2_dss_rfbi_addrs,
.fw = {
.omap2 = {
.l4_fw_region = OMAP3_L4_CORE_FW_DSS_RFBI_REGION,
.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP ,
.flags = OMAP_FIREWALL_L4,
}
},
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap34xx_mcspi3 = { /* l4_core -> dss_venc */
.name = "mcspi3", static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_venc = {
.mpu_irqs = omap34xx_mcspi3_mpu_irqs, .master = &omap3xxx_l4_core_hwmod,
.sdma_reqs = omap34xx_mcspi3_sdma_reqs, .slave = &omap3xxx_dss_venc_hwmod,
.main_clk = "mcspi3_fck", .clk = "dss_ick",
.prcm = { .addr = omap2_dss_venc_addrs,
.fw = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .l4_fw_region = OMAP3_L4_CORE_FW_DSS_VENC_REGION,
.prcm_reg_id = 1, .l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
.module_bit = OMAP3430_EN_MCSPI3_SHIFT, .flags = OMAP_FIREWALL_L4,
.idlest_reg_id = 1, }
.idlest_idle_bit = OMAP3430_ST_MCSPI3_SHIFT,
},
}, },
.slaves = omap34xx_mcspi3_slaves, .flags = OCPIF_SWSUP_IDLE,
.slaves_cnt = ARRAY_SIZE(omap34xx_mcspi3_slaves), .user = OCP_USER_MPU | OCP_USER_SDMA,
.class = &omap34xx_mcspi_class,
.dev_attr = &omap_mcspi3_dev_attr,
}; };
/* SPI4 */ /* l4_wkup -> gpio1 */
static struct omap_hwmod_irq_info omap34xx_mcspi4_mpu_irqs[] = { static struct omap_hwmod_addr_space omap3xxx_gpio1_addrs[] = {
{ .name = "irq", .irq = INT_34XX_SPI4_IRQ }, /* 48 */ {
{ .irq = -1 } .pa_start = 0x48310000,
.pa_end = 0x483101ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod_dma_info omap34xx_mcspi4_sdma_reqs[] = { static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__gpio1 = {
{ .name = "tx0", .dma_req = 70 }, /* DMA_SPI4_TX0 */ .master = &omap3xxx_l4_wkup_hwmod,
{ .name = "rx0", .dma_req = 71 }, /* DMA_SPI4_RX0 */ .slave = &omap3xxx_gpio1_hwmod,
{ .dma_req = -1 } .addr = omap3xxx_gpio1_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_ocp_if *omap34xx_mcspi4_slaves[] = { /* l4_per -> gpio2 */
&omap34xx_l4_core__mcspi4, static struct omap_hwmod_addr_space omap3xxx_gpio2_addrs[] = {
{
.pa_start = 0x49050000,
.pa_end = 0x490501ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap2_mcspi_dev_attr omap_mcspi4_dev_attr = { static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio2 = {
.num_chipselect = 1, .master = &omap3xxx_l4_per_hwmod,
.slave = &omap3xxx_gpio2_hwmod,
.addr = omap3xxx_gpio2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap34xx_mcspi4 = { /* l4_per -> gpio3 */
.name = "mcspi4", static struct omap_hwmod_addr_space omap3xxx_gpio3_addrs[] = {
.mpu_irqs = omap34xx_mcspi4_mpu_irqs, {
.sdma_reqs = omap34xx_mcspi4_sdma_reqs, .pa_start = 0x49052000,
.main_clk = "mcspi4_fck", .pa_end = 0x490521ff,
.prcm = { .flags = ADDR_TYPE_RT
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MCSPI4_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MCSPI4_SHIFT,
},
}, },
.slaves = omap34xx_mcspi4_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap34xx_mcspi4_slaves),
.class = &omap34xx_mcspi_class,
.dev_attr = &omap_mcspi4_dev_attr,
}; };
/* static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio3 = {
* usbhsotg .master = &omap3xxx_l4_per_hwmod,
*/ .slave = &omap3xxx_gpio3_hwmod,
static struct omap_hwmod_class_sysconfig omap3xxx_usbhsotg_sysc = { .addr = omap3xxx_gpio3_addrs,
.rev_offs = 0x0400, .user = OCP_USER_MPU | OCP_USER_SDMA,
.sysc_offs = 0x0404,
.syss_offs = 0x0408,
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE|
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_AUTOIDLE),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_class usbotg_class = { /* l4_per -> gpio4 */
.name = "usbotg", static struct omap_hwmod_addr_space omap3xxx_gpio4_addrs[] = {
.sysc = &omap3xxx_usbhsotg_sysc, {
.pa_start = 0x49054000,
.pa_end = 0x490541ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
/* usb_otg_hs */
static struct omap_hwmod_irq_info omap3xxx_usbhsotg_mpu_irqs[] = {
{ .name = "mc", .irq = 92 }, static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio4 = {
{ .name = "dma", .irq = 93 }, .master = &omap3xxx_l4_per_hwmod,
{ .irq = -1 } .slave = &omap3xxx_gpio4_hwmod,
.addr = omap3xxx_gpio4_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap3xxx_usbhsotg_hwmod = { /* l4_per -> gpio5 */
.name = "usb_otg_hs", static struct omap_hwmod_addr_space omap3xxx_gpio5_addrs[] = {
.mpu_irqs = omap3xxx_usbhsotg_mpu_irqs, {
.main_clk = "hsotgusb_ick", .pa_start = 0x49056000,
.prcm = { .pa_end = 0x490561ff,
.omap2 = { .flags = ADDR_TYPE_RT
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_HSOTGUSB_SHIFT,
.module_offs = CORE_MOD,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT,
.idlest_stdby_bit = OMAP3430ES2_ST_HSOTGUSB_STDBY_SHIFT
},
}, },
.masters = omap3xxx_usbhsotg_masters, { }
.masters_cnt = ARRAY_SIZE(omap3xxx_usbhsotg_masters),
.slaves = omap3xxx_usbhsotg_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_usbhsotg_slaves),
.class = &usbotg_class,
/*
* Erratum ID: i479 idle_req / idle_ack mechanism potentially
* broken when autoidle is enabled
* workaround is to disable the autoidle bit at module level.
*/
.flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
| HWMOD_SWSUP_MSTANDBY,
}; };
/* usb_otg_hs */ static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio5 = {
static struct omap_hwmod_irq_info am35xx_usbhsotg_mpu_irqs[] = { .master = &omap3xxx_l4_per_hwmod,
.slave = &omap3xxx_gpio5_hwmod,
{ .name = "mc", .irq = 71 }, .addr = omap3xxx_gpio5_addrs,
{ .irq = -1 } .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_class am35xx_usbotg_class = { /* l4_per -> gpio6 */
.name = "am35xx_usbotg", static struct omap_hwmod_addr_space omap3xxx_gpio6_addrs[] = {
.sysc = NULL, {
.pa_start = 0x49058000,
.pa_end = 0x490581ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod am35xx_usbhsotg_hwmod = { static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio6 = {
.name = "am35x_otg_hs", .master = &omap3xxx_l4_per_hwmod,
.mpu_irqs = am35xx_usbhsotg_mpu_irqs, .slave = &omap3xxx_gpio6_hwmod,
.main_clk = NULL, .addr = omap3xxx_gpio6_addrs,
.prcm = { .user = OCP_USER_MPU | OCP_USER_SDMA,
.omap2 = {
},
},
.masters = am35xx_usbhsotg_masters,
.masters_cnt = ARRAY_SIZE(am35xx_usbhsotg_masters),
.slaves = am35xx_usbhsotg_slaves,
.slaves_cnt = ARRAY_SIZE(am35xx_usbhsotg_slaves),
.class = &am35xx_usbotg_class,
}; };
/* MMC/SD/SDIO common */ /* dma_system -> L3 */
static struct omap_hwmod_ocp_if omap3xxx_dma_system__l3 = {
.master = &omap3xxx_dma_system_hwmod,
.slave = &omap3xxx_l3_main_hwmod,
.clk = "core_l3_ick",
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
static struct omap_hwmod_class_sysconfig omap34xx_mmc_sysc = { static struct omap_hwmod_addr_space omap3xxx_dma_system_addrs[] = {
.rev_offs = 0x1fc, {
.sysc_offs = 0x10, .pa_start = 0x48056000,
.syss_offs = 0x14, .pa_end = 0x48056fff,
.sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE | .flags = ADDR_TYPE_RT
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | },
SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), { }
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
}; };
static struct omap_hwmod_class omap34xx_mmc_class = { /* l4_cfg -> dma_system */
.name = "mmc", static struct omap_hwmod_ocp_if omap3xxx_l4_core__dma_system = {
.sysc = &omap34xx_mmc_sysc, .master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_dma_system_hwmod,
.clk = "core_l4_ick",
.addr = omap3xxx_dma_system_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
/* MMC/SD/SDIO1 */ static struct omap_hwmod_addr_space omap3xxx_mcbsp1_addrs[] = {
{
static struct omap_hwmod_irq_info omap34xx_mmc1_mpu_irqs[] = { .name = "mpu",
{ .irq = 83, }, .pa_start = 0x48074000,
{ .irq = -1 } .pa_end = 0x480740ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod_dma_info omap34xx_mmc1_sdma_reqs[] = { /* l4_core -> mcbsp1 */
{ .name = "tx", .dma_req = 61, }, static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp1 = {
{ .name = "rx", .dma_req = 62, }, .master = &omap3xxx_l4_core_hwmod,
{ .dma_req = -1 } .slave = &omap3xxx_mcbsp1_hwmod,
.clk = "mcbsp1_ick",
.addr = omap3xxx_mcbsp1_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_opt_clk omap34xx_mmc1_opt_clks[] = { static struct omap_hwmod_addr_space omap3xxx_mcbsp2_addrs[] = {
{ .role = "dbck", .clk = "omap_32k_fck", }, {
.name = "mpu",
.pa_start = 0x49022000,
.pa_end = 0x490220ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod_ocp_if *omap3xxx_mmc1_slaves[] = { /* l4_per -> mcbsp2 */
&omap3xxx_l4_core__mmc1, static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp2 = {
.master = &omap3xxx_l4_per_hwmod,
.slave = &omap3xxx_mcbsp2_hwmod,
.clk = "mcbsp2_ick",
.addr = omap3xxx_mcbsp2_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_mmc_dev_attr mmc1_dev_attr = { static struct omap_hwmod_addr_space omap3xxx_mcbsp3_addrs[] = {
.flags = OMAP_HSMMC_SUPPORTS_DUAL_VOLT, {
.name = "mpu",
.pa_start = 0x49024000,
.pa_end = 0x490240ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
/* See 35xx errata 2.1.1.128 in SPRZ278F */ /* l4_per -> mcbsp3 */
static struct omap_mmc_dev_attr mmc1_pre_es3_dev_attr = { static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3 = {
.flags = (OMAP_HSMMC_SUPPORTS_DUAL_VOLT | .master = &omap3xxx_l4_per_hwmod,
OMAP_HSMMC_BROKEN_MULTIBLOCK_READ), .slave = &omap3xxx_mcbsp3_hwmod,
.clk = "mcbsp3_ick",
.addr = omap3xxx_mcbsp3_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod omap3xxx_pre_es3_mmc1_hwmod = { static struct omap_hwmod_addr_space omap3xxx_mcbsp4_addrs[] = {
.name = "mmc1", {
.mpu_irqs = omap34xx_mmc1_mpu_irqs, .name = "mpu",
.sdma_reqs = omap34xx_mmc1_sdma_reqs, .pa_start = 0x49026000,
.opt_clks = omap34xx_mmc1_opt_clks, .pa_end = 0x490260ff,
.opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc1_opt_clks), .flags = ADDR_TYPE_RT
.main_clk = "mmchs1_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MMC1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT,
},
}, },
.dev_attr = &mmc1_pre_es3_dev_attr, { }
.slaves = omap3xxx_mmc1_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_mmc1_slaves),
.class = &omap34xx_mmc_class,
}; };
static struct omap_hwmod omap3xxx_es3plus_mmc1_hwmod = { /* l4_per -> mcbsp4 */
.name = "mmc1", static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp4 = {
.mpu_irqs = omap34xx_mmc1_mpu_irqs, .master = &omap3xxx_l4_per_hwmod,
.sdma_reqs = omap34xx_mmc1_sdma_reqs, .slave = &omap3xxx_mcbsp4_hwmod,
.opt_clks = omap34xx_mmc1_opt_clks, .clk = "mcbsp4_ick",
.opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc1_opt_clks), .addr = omap3xxx_mcbsp4_addrs,
.main_clk = "mmchs1_fck", .user = OCP_USER_MPU | OCP_USER_SDMA,
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MMC1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT,
},
},
.dev_attr = &mmc1_dev_attr,
.slaves = omap3xxx_mmc1_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_mmc1_slaves),
.class = &omap34xx_mmc_class,
}; };
/* MMC/SD/SDIO2 */ static struct omap_hwmod_addr_space omap3xxx_mcbsp5_addrs[] = {
{
static struct omap_hwmod_irq_info omap34xx_mmc2_mpu_irqs[] = { .name = "mpu",
{ .irq = INT_24XX_MMC2_IRQ, }, .pa_start = 0x48096000,
{ .irq = -1 } .pa_end = 0x480960ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod_dma_info omap34xx_mmc2_sdma_reqs[] = { /* l4_core -> mcbsp5 */
{ .name = "tx", .dma_req = 47, }, static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp5 = {
{ .name = "rx", .dma_req = 48, }, .master = &omap3xxx_l4_core_hwmod,
{ .dma_req = -1 } .slave = &omap3xxx_mcbsp5_hwmod,
.clk = "mcbsp5_ick",
.addr = omap3xxx_mcbsp5_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_opt_clk omap34xx_mmc2_opt_clks[] = { static struct omap_hwmod_addr_space omap3xxx_mcbsp2_sidetone_addrs[] = {
{ .role = "dbck", .clk = "omap_32k_fck", }, {
.name = "sidetone",
.pa_start = 0x49028000,
.pa_end = 0x490280ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod_ocp_if *omap3xxx_mmc2_slaves[] = { /* l4_per -> mcbsp2_sidetone */
&omap3xxx_l4_core__mmc2, static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp2_sidetone = {
.master = &omap3xxx_l4_per_hwmod,
.slave = &omap3xxx_mcbsp2_sidetone_hwmod,
.clk = "mcbsp2_ick",
.addr = omap3xxx_mcbsp2_sidetone_addrs,
.user = OCP_USER_MPU,
}; };
/* See 35xx errata 2.1.1.128 in SPRZ278F */ static struct omap_hwmod_addr_space omap3xxx_mcbsp3_sidetone_addrs[] = {
static struct omap_mmc_dev_attr mmc2_pre_es3_dev_attr = { {
.flags = OMAP_HSMMC_BROKEN_MULTIBLOCK_READ, .name = "sidetone",
.pa_start = 0x4902A000,
.pa_end = 0x4902A0ff,
.flags = ADDR_TYPE_RT
},
{ }
}; };
static struct omap_hwmod omap3xxx_pre_es3_mmc2_hwmod = { /* l4_per -> mcbsp3_sidetone */
.name = "mmc2", static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3_sidetone = {
.mpu_irqs = omap34xx_mmc2_mpu_irqs, .master = &omap3xxx_l4_per_hwmod,
.sdma_reqs = omap34xx_mmc2_sdma_reqs, .slave = &omap3xxx_mcbsp3_sidetone_hwmod,
.opt_clks = omap34xx_mmc2_opt_clks, .clk = "mcbsp3_ick",
.opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc2_opt_clks), .addr = omap3xxx_mcbsp3_sidetone_addrs,
.main_clk = "mmchs2_fck", .user = OCP_USER_MPU,
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MMC2_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT,
},
},
.dev_attr = &mmc2_pre_es3_dev_attr,
.slaves = omap3xxx_mmc2_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_mmc2_slaves),
.class = &omap34xx_mmc_class,
}; };
static struct omap_hwmod omap3xxx_es3plus_mmc2_hwmod = { static struct omap_hwmod_addr_space omap3xxx_mailbox_addrs[] = {
.name = "mmc2", {
.mpu_irqs = omap34xx_mmc2_mpu_irqs, .pa_start = 0x48094000,
.sdma_reqs = omap34xx_mmc2_sdma_reqs, .pa_end = 0x480941ff,
.opt_clks = omap34xx_mmc2_opt_clks, .flags = ADDR_TYPE_RT,
.opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc2_opt_clks),
.main_clk = "mmchs2_fck",
.prcm = {
.omap2 = {
.module_offs = CORE_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MMC2_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT,
},
}, },
.slaves = omap3xxx_mmc2_slaves, { }
.slaves_cnt = ARRAY_SIZE(omap3xxx_mmc2_slaves),
.class = &omap34xx_mmc_class,
}; };
/* MMC/SD/SDIO3 */ /* l4_core -> mailbox */
static struct omap_hwmod_ocp_if omap3xxx_l4_core__mailbox = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap3xxx_mailbox_hwmod,
.addr = omap3xxx_mailbox_addrs,
.user = OCP_USER_MPU | OCP_USER_SDMA,
};
static struct omap_hwmod_irq_info omap34xx_mmc3_mpu_irqs[] = { /* l4 core -> mcspi1 interface */
{ .irq = 94, }, static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi1 = {
{ .irq = -1 } .master = &omap3xxx_l4_core_hwmod,
.slave = &omap34xx_mcspi1,
.clk = "mcspi1_ick",
.addr = omap2_mcspi1_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_dma_info omap34xx_mmc3_sdma_reqs[] = { /* l4 core -> mcspi2 interface */
{ .name = "tx", .dma_req = 77, }, static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi2 = {
{ .name = "rx", .dma_req = 78, }, .master = &omap3xxx_l4_core_hwmod,
{ .dma_req = -1 } .slave = &omap34xx_mcspi2,
.clk = "mcspi2_ick",
.addr = omap2_mcspi2_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_opt_clk omap34xx_mmc3_opt_clks[] = { /* l4 core -> mcspi3 interface */
{ .role = "dbck", .clk = "omap_32k_fck", }, static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi3 = {
.master = &omap3xxx_l4_core_hwmod,
.slave = &omap34xx_mcspi3,
.clk = "mcspi3_ick",
.addr = omap2430_mcspi3_addr_space,
.user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_ocp_if *omap3xxx_mmc3_slaves[] = { /* l4 core -> mcspi4 interface */
&omap3xxx_l4_core__mmc3, static struct omap_hwmod_addr_space omap34xx_mcspi4_addr_space[] = {
{
.pa_start = 0x480ba000,
.pa_end = 0x480ba0ff,
.flags = ADDR_TYPE_RT,
},
{ }
}; };
static struct omap_hwmod omap3xxx_mmc3_hwmod = { static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi4 = {
.name = "mmc3", .master = &omap3xxx_l4_core_hwmod,
.mpu_irqs = omap34xx_mmc3_mpu_irqs, .slave = &omap34xx_mcspi4,
.sdma_reqs = omap34xx_mmc3_sdma_reqs, .clk = "mcspi4_ick",
.opt_clks = omap34xx_mmc3_opt_clks, .addr = omap34xx_mcspi4_addr_space,
.opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc3_opt_clks), .user = OCP_USER_MPU | OCP_USER_SDMA,
.main_clk = "mmchs3_fck",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
.module_bit = OMAP3430_EN_MMC3_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430_ST_MMC3_SHIFT,
},
},
.slaves = omap3xxx_mmc3_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_mmc3_slaves),
.class = &omap34xx_mmc_class,
}; };
/*
* 'usb_host_hs' class
* high-speed multi-port usb host controller
*/
static struct omap_hwmod_ocp_if omap3xxx_usb_host_hs__l3_main_2 = { static struct omap_hwmod_ocp_if omap3xxx_usb_host_hs__l3_main_2 = {
.master = &omap3xxx_usb_host_hs_hwmod, .master = &omap3xxx_usb_host_hs_hwmod,
.slave = &omap3xxx_l3_main_hwmod, .slave = &omap3xxx_l3_main_hwmod,
...@@ -3341,27 +3013,6 @@ static struct omap_hwmod_ocp_if omap3xxx_usb_host_hs__l3_main_2 = { ...@@ -3341,27 +3013,6 @@ static struct omap_hwmod_ocp_if omap3xxx_usb_host_hs__l3_main_2 = {
.user = OCP_USER_MPU, .user = OCP_USER_MPU,
}; };
static struct omap_hwmod_class_sysconfig omap3xxx_usb_host_hs_sysc = {
.rev_offs = 0x0000,
.sysc_offs = 0x0010,
.syss_offs = 0x0014,
.sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
};
static struct omap_hwmod_class omap3xxx_usb_host_hs_hwmod_class = {
.name = "usb_host_hs",
.sysc = &omap3xxx_usb_host_hs_sysc,
};
static struct omap_hwmod_ocp_if *omap3xxx_usb_host_hs_masters[] = {
&omap3xxx_usb_host_hs__l3_main_2,
};
static struct omap_hwmod_addr_space omap3xxx_usb_host_hs_addrs[] = { static struct omap_hwmod_addr_space omap3xxx_usb_host_hs_addrs[] = {
{ {
.name = "uhh", .name = "uhh",
...@@ -3390,117 +3041,6 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_host_hs = { ...@@ -3390,117 +3041,6 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_host_hs = {
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_ocp_if *omap3xxx_usb_host_hs_slaves[] = {
&omap3xxx_l4_core__usb_host_hs,
};
static struct omap_hwmod_opt_clk omap3xxx_usb_host_hs_opt_clks[] = {
{ .role = "ehci_logic_fck", .clk = "usbhost_120m_fck", },
};
static struct omap_hwmod_irq_info omap3xxx_usb_host_hs_irqs[] = {
{ .name = "ohci-irq", .irq = 76 },
{ .name = "ehci-irq", .irq = 77 },
{ .irq = -1 }
};
static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = {
.name = "usb_host_hs",
.class = &omap3xxx_usb_host_hs_hwmod_class,
.clkdm_name = "l3_init_clkdm",
.mpu_irqs = omap3xxx_usb_host_hs_irqs,
.main_clk = "usbhost_48m_fck",
.prcm = {
.omap2 = {
.module_offs = OMAP3430ES2_USBHOST_MOD,
.prcm_reg_id = 1,
.module_bit = OMAP3430ES2_EN_USBHOST1_SHIFT,
.idlest_reg_id = 1,
.idlest_idle_bit = OMAP3430ES2_ST_USBHOST_IDLE_SHIFT,
.idlest_stdby_bit = OMAP3430ES2_ST_USBHOST_STDBY_SHIFT,
},
},
.opt_clks = omap3xxx_usb_host_hs_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(omap3xxx_usb_host_hs_opt_clks),
.slaves = omap3xxx_usb_host_hs_slaves,
.slaves_cnt = ARRAY_SIZE(omap3xxx_usb_host_hs_slaves),
.masters = omap3xxx_usb_host_hs_masters,
.masters_cnt = ARRAY_SIZE(omap3xxx_usb_host_hs_masters),
/*
* Errata: USBHOST Configured In Smart-Idle Can Lead To a Deadlock
* id: i660
*
* Description:
* In the following configuration :
* - USBHOST module is set to smart-idle mode
* - PRCM asserts idle_req to the USBHOST module ( This typically
* happens when the system is going to a low power mode : all ports
* have been suspended, the master part of the USBHOST module has
* entered the standby state, and SW has cut the functional clocks)
* - an USBHOST interrupt occurs before the module is able to answer
* idle_ack, typically a remote wakeup IRQ.
* Then the USB HOST module will enter a deadlock situation where it
* is no more accessible nor functional.
*
* Workaround:
* Don't use smart idle; use only force idle, hence HWMOD_SWSUP_SIDLE
*/
/*
* Errata: USB host EHCI may stall when entering smart-standby mode
* Id: i571
*
* Description:
* When the USBHOST module is set to smart-standby mode, and when it is
* ready to enter the standby state (i.e. all ports are suspended and
* all attached devices are in suspend mode), then it can wrongly assert
* the Mstandby signal too early while there are still some residual OCP
* transactions ongoing. If this condition occurs, the internal state
* machine may go to an undefined state and the USB link may be stuck
* upon the next resume.
*
* Workaround:
* Don't use smart standby; use only force standby,
* hence HWMOD_SWSUP_MSTANDBY
*/
/*
* During system boot; If the hwmod framework resets the module
* the module will have smart idle settings; which can lead to deadlock
* (above Errata Id:i660); so, dont reset the module during boot;
* Use HWMOD_INIT_NO_RESET.
*/
.flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY |
HWMOD_INIT_NO_RESET,
};
/*
* 'usb_tll_hs' class
* usb_tll_hs module is the adapter on the usb_host_hs ports
*/
static struct omap_hwmod_class_sysconfig omap3xxx_usb_tll_hs_sysc = {
.rev_offs = 0x0000,
.sysc_offs = 0x0010,
.syss_offs = 0x0014,
.sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
SYSC_HAS_AUTOIDLE),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
.sysc_fields = &omap_hwmod_sysc_type1,
};
static struct omap_hwmod_class omap3xxx_usb_tll_hs_hwmod_class = {
.name = "usb_tll_hs",
.sysc = &omap3xxx_usb_tll_hs_sysc,
};
static struct omap_hwmod_irq_info omap3xxx_usb_tll_hs_irqs[] = {
{ .name = "tll-irq", .irq = 78 },
{ .irq = -1 }
};
static struct omap_hwmod_addr_space omap3xxx_usb_tll_hs_addrs[] = { static struct omap_hwmod_addr_space omap3xxx_usb_tll_hs_addrs[] = {
{ {
.name = "tll", .name = "tll",
...@@ -3519,183 +3059,156 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_tll_hs = { ...@@ -3519,183 +3059,156 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_tll_hs = {
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };
static struct omap_hwmod_ocp_if *omap3xxx_usb_tll_hs_slaves[] = { static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {
&omap3xxx_l4_core__usb_tll_hs, &omap3xxx_l3_main__l4_core,
}; &omap3xxx_l3_main__l4_per,
&omap3xxx_mpu__l3_main,
static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = { &omap3xxx_l4_core__l4_wkup,
.name = "usb_tll_hs", &omap3xxx_l4_core__mmc3,
.class = &omap3xxx_usb_tll_hs_hwmod_class, &omap3_l4_core__uart1,
.clkdm_name = "l3_init_clkdm", &omap3_l4_core__uart2,
.mpu_irqs = omap3xxx_usb_tll_hs_irqs, &omap3_l4_per__uart3,
.main_clk = "usbtll_fck", &omap3_l4_core__i2c1,
.prcm = { &omap3_l4_core__i2c2,
.omap2 = { &omap3_l4_core__i2c3,
.module_offs = CORE_MOD, &omap3xxx_l4_wkup__l4_sec,
.prcm_reg_id = 3, &omap3xxx_l4_wkup__timer1,
.module_bit = OMAP3430ES2_EN_USBTLL_SHIFT, &omap3xxx_l4_per__timer2,
.idlest_reg_id = 3, &omap3xxx_l4_per__timer3,
.idlest_idle_bit = OMAP3430ES2_ST_USBTLL_SHIFT, &omap3xxx_l4_per__timer4,
}, &omap3xxx_l4_per__timer5,
}, &omap3xxx_l4_per__timer6,
.slaves = omap3xxx_usb_tll_hs_slaves, &omap3xxx_l4_per__timer7,
.slaves_cnt = ARRAY_SIZE(omap3xxx_usb_tll_hs_slaves), &omap3xxx_l4_per__timer8,
}; &omap3xxx_l4_per__timer9,
&omap3xxx_l4_core__timer10,
static __initdata struct omap_hwmod *omap3xxx_hwmods[] = { &omap3xxx_l4_core__timer11,
&omap3xxx_l3_main_hwmod, &omap3xxx_l4_wkup__wd_timer2,
&omap3xxx_l4_core_hwmod, &omap3xxx_l4_wkup__gpio1,
&omap3xxx_l4_per_hwmod, &omap3xxx_l4_per__gpio2,
&omap3xxx_l4_wkup_hwmod, &omap3xxx_l4_per__gpio3,
&omap3xxx_mmc3_hwmod, &omap3xxx_l4_per__gpio4,
&omap3xxx_mpu_hwmod, &omap3xxx_l4_per__gpio5,
&omap3xxx_l4_per__gpio6,
&omap3xxx_timer1_hwmod, &omap3xxx_dma_system__l3,
&omap3xxx_timer2_hwmod, &omap3xxx_l4_core__dma_system,
&omap3xxx_timer3_hwmod, &omap3xxx_l4_core__mcbsp1,
&omap3xxx_timer4_hwmod, &omap3xxx_l4_per__mcbsp2,
&omap3xxx_timer5_hwmod, &omap3xxx_l4_per__mcbsp3,
&omap3xxx_timer6_hwmod, &omap3xxx_l4_per__mcbsp4,
&omap3xxx_timer7_hwmod, &omap3xxx_l4_core__mcbsp5,
&omap3xxx_timer8_hwmod, &omap3xxx_l4_per__mcbsp2_sidetone,
&omap3xxx_timer9_hwmod, &omap3xxx_l4_per__mcbsp3_sidetone,
&omap3xxx_timer10_hwmod, &omap34xx_l4_core__mcspi1,
&omap3xxx_timer11_hwmod, &omap34xx_l4_core__mcspi2,
&omap34xx_l4_core__mcspi3,
&omap3xxx_wd_timer2_hwmod, &omap34xx_l4_core__mcspi4,
&omap3xxx_uart1_hwmod,
&omap3xxx_uart2_hwmod,
&omap3xxx_uart3_hwmod,
/* i2c class */
&omap3xxx_i2c1_hwmod,
&omap3xxx_i2c2_hwmod,
&omap3xxx_i2c3_hwmod,
/* gpio class */
&omap3xxx_gpio1_hwmod,
&omap3xxx_gpio2_hwmod,
&omap3xxx_gpio3_hwmod,
&omap3xxx_gpio4_hwmod,
&omap3xxx_gpio5_hwmod,
&omap3xxx_gpio6_hwmod,
/* dma_system class*/
&omap3xxx_dma_system_hwmod,
/* mcbsp class */
&omap3xxx_mcbsp1_hwmod,
&omap3xxx_mcbsp2_hwmod,
&omap3xxx_mcbsp3_hwmod,
&omap3xxx_mcbsp4_hwmod,
&omap3xxx_mcbsp5_hwmod,
&omap3xxx_mcbsp2_sidetone_hwmod,
&omap3xxx_mcbsp3_sidetone_hwmod,
/* mcspi class */
&omap34xx_mcspi1,
&omap34xx_mcspi2,
&omap34xx_mcspi3,
&omap34xx_mcspi4,
NULL, NULL,
}; };
/* GP-only hwmods */ /* GP-only hwmod links */
static __initdata struct omap_hwmod *omap3xxx_gp_hwmods[] = { static struct omap_hwmod_ocp_if *omap3xxx_gp_hwmod_ocp_ifs[] __initdata = {
&omap3xxx_timer12_hwmod, &omap3xxx_l4_sec__timer12,
NULL NULL
}; };
/* 3430ES1-only hwmods */ /* 3430ES1-only hwmod links */
static __initdata struct omap_hwmod *omap3430es1_hwmods[] = { static struct omap_hwmod_ocp_if *omap3430es1_hwmod_ocp_ifs[] __initdata = {
&omap3430es1_dss_core_hwmod, &omap3430es1_dss__l3,
&omap3430es1_l4_core__dss,
NULL NULL
}; };
/* 3430ES2+-only hwmods */ /* 3430ES2+-only hwmod links */
static __initdata struct omap_hwmod *omap3430es2plus_hwmods[] = { static struct omap_hwmod_ocp_if *omap3430es2plus_hwmod_ocp_ifs[] __initdata = {
&omap3xxx_dss_core_hwmod, &omap3xxx_dss__l3,
&omap3xxx_usbhsotg_hwmod, &omap3xxx_l4_core__dss,
&omap3xxx_usb_host_hs_hwmod, &omap3xxx_usbhsotg__l3,
&omap3xxx_usb_tll_hs_hwmod, &omap3xxx_l4_core__usbhsotg,
&omap3xxx_usb_host_hs__l3_main_2,
&omap3xxx_l4_core__usb_host_hs,
&omap3xxx_l4_core__usb_tll_hs,
NULL NULL
}; };
/* <= 3430ES3-only hwmods */ /* <= 3430ES3-only hwmod links */
static struct omap_hwmod *omap3430_pre_es3_hwmods[] __initdata = { static struct omap_hwmod_ocp_if *omap3430_pre_es3_hwmod_ocp_ifs[] __initdata = {
&omap3xxx_pre_es3_mmc1_hwmod, &omap3xxx_l4_core__pre_es3_mmc1,
&omap3xxx_pre_es3_mmc2_hwmod, &omap3xxx_l4_core__pre_es3_mmc2,
NULL NULL
}; };
/* 3430ES3+-only hwmods */ /* 3430ES3+-only hwmod links */
static struct omap_hwmod *omap3430_es3plus_hwmods[] __initdata = { static struct omap_hwmod_ocp_if *omap3430_es3plus_hwmod_ocp_ifs[] __initdata = {
&omap3xxx_es3plus_mmc1_hwmod, &omap3xxx_l4_core__es3plus_mmc1,
&omap3xxx_es3plus_mmc2_hwmod, &omap3xxx_l4_core__es3plus_mmc2,
NULL NULL
}; };
/* 34xx-only hwmods (all ES revisions) */ /* 34xx-only hwmod links (all ES revisions) */
static __initdata struct omap_hwmod *omap34xx_hwmods[] = { static struct omap_hwmod_ocp_if *omap34xx_hwmod_ocp_ifs[] __initdata = {
&omap3xxx_iva_hwmod, &omap3xxx_l3__iva,
&omap34xx_sr1_hwmod, &omap34xx_l4_core__sr1,
&omap34xx_sr2_hwmod, &omap34xx_l4_core__sr2,
&omap3xxx_mailbox_hwmod, &omap3xxx_l4_core__mailbox,
NULL NULL
}; };
/* 36xx-only hwmods (all ES revisions) */ /* 36xx-only hwmod links (all ES revisions) */
static __initdata struct omap_hwmod *omap36xx_hwmods[] = { static struct omap_hwmod_ocp_if *omap36xx_hwmod_ocp_ifs[] __initdata = {
&omap3xxx_iva_hwmod, &omap3xxx_l3__iva,
&omap3xxx_uart4_hwmod, &omap36xx_l4_per__uart4,
&omap3xxx_dss_core_hwmod, &omap3xxx_dss__l3,
&omap36xx_sr1_hwmod, &omap3xxx_l4_core__dss,
&omap36xx_sr2_hwmod, &omap36xx_l4_core__sr1,
&omap3xxx_usbhsotg_hwmod, &omap36xx_l4_core__sr2,
&omap3xxx_mailbox_hwmod, &omap3xxx_usbhsotg__l3,
&omap3xxx_usb_host_hs_hwmod, &omap3xxx_l4_core__usbhsotg,
&omap3xxx_usb_tll_hs_hwmod, &omap3xxx_l4_core__mailbox,
&omap3xxx_es3plus_mmc1_hwmod, &omap3xxx_usb_host_hs__l3_main_2,
&omap3xxx_es3plus_mmc2_hwmod, &omap3xxx_l4_core__usb_host_hs,
&omap3xxx_l4_core__usb_tll_hs,
&omap3xxx_l4_core__es3plus_mmc1,
&omap3xxx_l4_core__es3plus_mmc2,
NULL NULL
}; };
static __initdata struct omap_hwmod *am35xx_hwmods[] = { static struct omap_hwmod_ocp_if *am35xx_hwmod_ocp_ifs[] __initdata = {
&omap3xxx_dss_core_hwmod, /* XXX ??? */ &omap3xxx_dss__l3,
&am35xx_usbhsotg_hwmod, &omap3xxx_l4_core__dss,
&am35xx_uart4_hwmod, &am35xx_usbhsotg__l3,
&omap3xxx_usb_host_hs_hwmod, &am35xx_l4_core__usbhsotg,
&omap3xxx_usb_tll_hs_hwmod, &am35xx_l4_core__uart4,
&omap3xxx_es3plus_mmc1_hwmod, &omap3xxx_usb_host_hs__l3_main_2,
&omap3xxx_es3plus_mmc2_hwmod, &omap3xxx_l4_core__usb_host_hs,
&omap3xxx_l4_core__usb_tll_hs,
&omap3xxx_l4_core__es3plus_mmc1,
&omap3xxx_l4_core__es3plus_mmc2,
NULL NULL
}; };
static __initdata struct omap_hwmod *omap3xxx_dss_hwmods[] = { static struct omap_hwmod_ocp_if *omap3xxx_dss_hwmod_ocp_ifs[] __initdata = {
/* dss class */ &omap3xxx_l4_core__dss_dispc,
&omap3xxx_dss_dispc_hwmod, &omap3xxx_l4_core__dss_dsi1,
&omap3xxx_dss_dsi1_hwmod, &omap3xxx_l4_core__dss_rfbi,
&omap3xxx_dss_rfbi_hwmod, &omap3xxx_l4_core__dss_venc,
&omap3xxx_dss_venc_hwmod,
NULL NULL
}; };
int __init omap3xxx_hwmod_init(void) int __init omap3xxx_hwmod_init(void)
{ {
int r; int r;
struct omap_hwmod **h = NULL; struct omap_hwmod_ocp_if **h = NULL;
unsigned int rev; unsigned int rev;
/* Register hwmods common to all OMAP3 */ /* Register hwmod links common to all OMAP3 */
r = omap_hwmod_register(omap3xxx_hwmods); r = omap_hwmod_register_links(omap3xxx_hwmod_ocp_ifs);
if (r < 0) if (r < 0)
return r; return r;
/* Register GP-only hwmods. */ /* Register GP-only hwmod links. */
if (omap_type() == OMAP2_DEVICE_TYPE_GP) { if (omap_type() == OMAP2_DEVICE_TYPE_GP) {
r = omap_hwmod_register(omap3xxx_gp_hwmods); r = omap_hwmod_register_links(omap3xxx_gp_hwmod_ocp_ifs);
if (r < 0) if (r < 0)
return r; return r;
} }
...@@ -3703,43 +3216,43 @@ int __init omap3xxx_hwmod_init(void) ...@@ -3703,43 +3216,43 @@ int __init omap3xxx_hwmod_init(void)
rev = omap_rev(); rev = omap_rev();
/* /*
* Register hwmods common to individual OMAP3 families, all * Register hwmod links common to individual OMAP3 families, all
* silicon revisions (e.g., 34xx, or AM3505/3517, or 36xx) * silicon revisions (e.g., 34xx, or AM3505/3517, or 36xx)
* All possible revisions should be included in this conditional. * All possible revisions should be included in this conditional.
*/ */
if (rev == OMAP3430_REV_ES1_0 || rev == OMAP3430_REV_ES2_0 || if (rev == OMAP3430_REV_ES1_0 || rev == OMAP3430_REV_ES2_0 ||
rev == OMAP3430_REV_ES2_1 || rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES2_1 || rev == OMAP3430_REV_ES3_0 ||
rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2) { rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2) {
h = omap34xx_hwmods; h = omap34xx_hwmod_ocp_ifs;
} else if (rev == OMAP3517_REV_ES1_0 || rev == OMAP3517_REV_ES1_1) { } else if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) {
h = am35xx_hwmods; h = am35xx_hwmod_ocp_ifs;
} else if (rev == OMAP3630_REV_ES1_0 || rev == OMAP3630_REV_ES1_1 || } else if (rev == OMAP3630_REV_ES1_0 || rev == OMAP3630_REV_ES1_1 ||
rev == OMAP3630_REV_ES1_2) { rev == OMAP3630_REV_ES1_2) {
h = omap36xx_hwmods; h = omap36xx_hwmod_ocp_ifs;
} else { } else {
WARN(1, "OMAP3 hwmod family init: unknown chip type\n"); WARN(1, "OMAP3 hwmod family init: unknown chip type\n");
return -EINVAL; return -EINVAL;
}; };
r = omap_hwmod_register(h); r = omap_hwmod_register_links(h);
if (r < 0) if (r < 0)
return r; return r;
/* /*
* Register hwmods specific to certain ES levels of a * Register hwmod links specific to certain ES levels of a
* particular family of silicon (e.g., 34xx ES1.0) * particular family of silicon (e.g., 34xx ES1.0)
*/ */
h = NULL; h = NULL;
if (rev == OMAP3430_REV_ES1_0) { if (rev == OMAP3430_REV_ES1_0) {
h = omap3430es1_hwmods; h = omap3430es1_hwmod_ocp_ifs;
} else if (rev == OMAP3430_REV_ES2_0 || rev == OMAP3430_REV_ES2_1 || } else if (rev == OMAP3430_REV_ES2_0 || rev == OMAP3430_REV_ES2_1 ||
rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES3_1 ||
rev == OMAP3430_REV_ES3_1_2) { rev == OMAP3430_REV_ES3_1_2) {
h = omap3430es2plus_hwmods; h = omap3430es2plus_hwmod_ocp_ifs;
}; };
if (h) { if (h) {
r = omap_hwmod_register(h); r = omap_hwmod_register_links(h);
if (r < 0) if (r < 0)
return r; return r;
} }
...@@ -3747,29 +3260,29 @@ int __init omap3xxx_hwmod_init(void) ...@@ -3747,29 +3260,29 @@ int __init omap3xxx_hwmod_init(void)
h = NULL; h = NULL;
if (rev == OMAP3430_REV_ES1_0 || rev == OMAP3430_REV_ES2_0 || if (rev == OMAP3430_REV_ES1_0 || rev == OMAP3430_REV_ES2_0 ||
rev == OMAP3430_REV_ES2_1) { rev == OMAP3430_REV_ES2_1) {
h = omap3430_pre_es3_hwmods; h = omap3430_pre_es3_hwmod_ocp_ifs;
} else if (rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES3_1 || } else if (rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES3_1 ||
rev == OMAP3430_REV_ES3_1_2) { rev == OMAP3430_REV_ES3_1_2) {
h = omap3430_es3plus_hwmods; h = omap3430_es3plus_hwmod_ocp_ifs;
}; };
if (h) if (h)
r = omap_hwmod_register(h); r = omap_hwmod_register_links(h);
if (r < 0) if (r < 0)
return r; return r;
/* /*
* DSS code presumes that dss_core hwmod is handled first, * DSS code presumes that dss_core hwmod is handled first,
* _before_ any other DSS related hwmods so register common * _before_ any other DSS related hwmods so register common
* DSS hwmods last to ensure that dss_core is already registered. * DSS hwmod links last to ensure that dss_core is already
* Otherwise some change things may happen, for ex. if dispc * registered. Otherwise some change things may happen, for
* is handled before dss_core and DSS is enabled in bootloader * ex. if dispc is handled before dss_core and DSS is enabled
* DIPSC will be reset with outputs enabled which sometimes leads * in bootloader DISPC will be reset with outputs enabled
* to unrecoverable L3 error. * which sometimes leads to unrecoverable L3 error. XXX The
* XXX The long-term fix to this is to ensure modules are set up * long-term fix to this is to ensure hwmods are set up in
* in dependency order in the hwmod core code. * dependency order in the hwmod core code.
*/ */
r = omap_hwmod_register(omap3xxx_dss_hwmods); r = omap_hwmod_register_links(omap3xxx_dss_hwmod_ocp_ifs);
return r; return r;
} }
因为 它太大了无法显示 source diff 。你可以改为 查看blob
...@@ -19,18 +19,6 @@ ...@@ -19,18 +19,6 @@
#include "display.h" #include "display.h"
/* Common address space across OMAP2xxx */ /* Common address space across OMAP2xxx */
extern struct omap_hwmod_addr_space omap2xxx_uart1_addr_space[];
extern struct omap_hwmod_addr_space omap2xxx_uart2_addr_space[];
extern struct omap_hwmod_addr_space omap2xxx_uart3_addr_space[];
extern struct omap_hwmod_addr_space omap2xxx_timer2_addrs[];
extern struct omap_hwmod_addr_space omap2xxx_timer3_addrs[];
extern struct omap_hwmod_addr_space omap2xxx_timer4_addrs[];
extern struct omap_hwmod_addr_space omap2xxx_timer5_addrs[];
extern struct omap_hwmod_addr_space omap2xxx_timer6_addrs[];
extern struct omap_hwmod_addr_space omap2xxx_timer7_addrs[];
extern struct omap_hwmod_addr_space omap2xxx_timer8_addrs[];
extern struct omap_hwmod_addr_space omap2xxx_timer9_addrs[];
extern struct omap_hwmod_addr_space omap2xxx_timer12_addrs[];
extern struct omap_hwmod_addr_space omap2xxx_mcbsp2_addrs[]; extern struct omap_hwmod_addr_space omap2xxx_mcbsp2_addrs[];
/* Common address space across OMAP2xxx/3xxx */ /* Common address space across OMAP2xxx/3xxx */
...@@ -54,6 +42,64 @@ extern struct omap_hwmod_addr_space omap2_mcbsp1_addrs[]; ...@@ -54,6 +42,64 @@ extern struct omap_hwmod_addr_space omap2_mcbsp1_addrs[];
/* Common IP block data across OMAP2xxx */ /* Common IP block data across OMAP2xxx */
extern struct omap_hwmod_irq_info omap2xxx_timer12_mpu_irqs[]; extern struct omap_hwmod_irq_info omap2xxx_timer12_mpu_irqs[];
extern struct omap_hwmod_dma_info omap2xxx_dss_sdma_chs[]; extern struct omap_hwmod_dma_info omap2xxx_dss_sdma_chs[];
extern struct omap_gpio_dev_attr omap2xxx_gpio_dev_attr;
extern struct omap_hwmod omap2xxx_l3_main_hwmod;
extern struct omap_hwmod omap2xxx_l4_core_hwmod;
extern struct omap_hwmod omap2xxx_l4_wkup_hwmod;
extern struct omap_hwmod omap2xxx_mpu_hwmod;
extern struct omap_hwmod omap2xxx_iva_hwmod;
extern struct omap_hwmod omap2xxx_timer1_hwmod;
extern struct omap_hwmod omap2xxx_timer2_hwmod;
extern struct omap_hwmod omap2xxx_timer3_hwmod;
extern struct omap_hwmod omap2xxx_timer4_hwmod;
extern struct omap_hwmod omap2xxx_timer5_hwmod;
extern struct omap_hwmod omap2xxx_timer6_hwmod;
extern struct omap_hwmod omap2xxx_timer7_hwmod;
extern struct omap_hwmod omap2xxx_timer8_hwmod;
extern struct omap_hwmod omap2xxx_timer9_hwmod;
extern struct omap_hwmod omap2xxx_timer10_hwmod;
extern struct omap_hwmod omap2xxx_timer11_hwmod;
extern struct omap_hwmod omap2xxx_timer12_hwmod;
extern struct omap_hwmod omap2xxx_wd_timer2_hwmod;
extern struct omap_hwmod omap2xxx_uart1_hwmod;
extern struct omap_hwmod omap2xxx_uart2_hwmod;
extern struct omap_hwmod omap2xxx_uart3_hwmod;
extern struct omap_hwmod omap2xxx_dss_core_hwmod;
extern struct omap_hwmod omap2xxx_dss_dispc_hwmod;
extern struct omap_hwmod omap2xxx_dss_rfbi_hwmod;
extern struct omap_hwmod omap2xxx_dss_venc_hwmod;
extern struct omap_hwmod omap2xxx_gpio1_hwmod;
extern struct omap_hwmod omap2xxx_gpio2_hwmod;
extern struct omap_hwmod omap2xxx_gpio3_hwmod;
extern struct omap_hwmod omap2xxx_gpio4_hwmod;
extern struct omap_hwmod omap2xxx_mcspi1_hwmod;
extern struct omap_hwmod omap2xxx_mcspi2_hwmod;
/* Common interface data across OMAP2xxx */
extern struct omap_hwmod_ocp_if omap2xxx_l3_main__l4_core;
extern struct omap_hwmod_ocp_if omap2xxx_mpu__l3_main;
extern struct omap_hwmod_ocp_if omap2xxx_dss__l3;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__l4_wkup;
extern struct omap_hwmod_ocp_if omap2_l4_core__uart1;
extern struct omap_hwmod_ocp_if omap2_l4_core__uart2;
extern struct omap_hwmod_ocp_if omap2_l4_core__uart3;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__mcspi1;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__mcspi2;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer2;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer3;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer4;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer5;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer6;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer7;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer8;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer9;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer10;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer11;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__timer12;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__dss;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_dispc;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_rfbi;
extern struct omap_hwmod_ocp_if omap2xxx_l4_core__dss_venc;
/* Common IP block data */ /* Common IP block data */
extern struct omap_hwmod_dma_info omap2_uart1_sdma_reqs[]; extern struct omap_hwmod_dma_info omap2_uart1_sdma_reqs[];
...@@ -94,6 +140,7 @@ extern struct omap_hwmod_irq_info omap2_gpio4_irqs[]; ...@@ -94,6 +140,7 @@ extern struct omap_hwmod_irq_info omap2_gpio4_irqs[];
extern struct omap_hwmod_irq_info omap2_dma_system_irqs[]; extern struct omap_hwmod_irq_info omap2_dma_system_irqs[];
extern struct omap_hwmod_irq_info omap2_mcspi1_mpu_irqs[]; extern struct omap_hwmod_irq_info omap2_mcspi1_mpu_irqs[];
extern struct omap_hwmod_irq_info omap2_mcspi2_mpu_irqs[]; extern struct omap_hwmod_irq_info omap2_mcspi2_mpu_irqs[];
extern struct omap_hwmod_addr_space omap2xxx_timer12_addrs[];
/* OMAP hwmod classes - forward declarations */ /* OMAP hwmod classes - forward declarations */
extern struct omap_hwmod_class l3_hwmod_class; extern struct omap_hwmod_class l3_hwmod_class;
......
...@@ -311,7 +311,7 @@ void __init omap3xxx_powerdomains_init(void) ...@@ -311,7 +311,7 @@ void __init omap3xxx_powerdomains_init(void)
rev == OMAP3430_REV_ES3_0 || rev == OMAP3630_REV_ES1_0) rev == OMAP3430_REV_ES3_0 || rev == OMAP3630_REV_ES1_0)
pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0); pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0);
else if (rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2 || else if (rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2 ||
rev == OMAP3517_REV_ES1_0 || rev == OMAP3517_REV_ES1_1 || rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1 ||
rev == OMAP3630_REV_ES1_1 || rev == OMAP3630_REV_ES1_2) rev == OMAP3630_REV_ES1_1 || rev == OMAP3630_REV_ES1_2)
pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus); pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus);
else else
......
...@@ -145,8 +145,10 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, ...@@ -145,8 +145,10 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
{ {
char name[10]; /* 10 = sizeof("gptXX_Xck0") */ char name[10]; /* 10 = sizeof("gptXX_Xck0") */
struct omap_hwmod *oh; struct omap_hwmod *oh;
struct resource irq_rsrc, mem_rsrc;
size_t size; size_t size;
int res = 0; int res = 0;
int r;
sprintf(name, "timer%d", gptimer_id); sprintf(name, "timer%d", gptimer_id);
omap_hwmod_setup_one(name); omap_hwmod_setup_one(name);
...@@ -154,9 +156,16 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, ...@@ -154,9 +156,16 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
if (!oh) if (!oh)
return -ENODEV; return -ENODEV;
timer->irq = oh->mpu_irqs[0].irq; r = omap_hwmod_get_resource_byname(oh, IORESOURCE_IRQ, NULL, &irq_rsrc);
timer->phys_base = oh->slaves[0]->addr->pa_start; if (r)
size = oh->slaves[0]->addr->pa_end - timer->phys_base; return -ENXIO;
timer->irq = irq_rsrc.start;
r = omap_hwmod_get_resource_byname(oh, IORESOURCE_MEM, NULL, &mem_rsrc);
if (r)
return -ENXIO;
timer->phys_base = mem_rsrc.start;
size = mem_rsrc.end - mem_rsrc.start;
/* Static mapping, never released */ /* Static mapping, never released */
timer->io_base = ioremap(timer->phys_base, size); timer->io_base = ioremap(timer->phys_base, size);
......
...@@ -90,7 +90,7 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data) ...@@ -90,7 +90,7 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data)
musb_plat.mode = board_data->mode; musb_plat.mode = board_data->mode;
musb_plat.extvbus = board_data->extvbus; musb_plat.extvbus = board_data->extvbus;
if (cpu_is_omap3517() || cpu_is_omap3505()) { if (soc_is_am35xx()) {
oh_name = "am35x_otg_hs"; oh_name = "am35x_otg_hs";
name = "musb-am35x"; name = "musb-am35x";
} else if (cpu_is_ti81xx()) { } else if (cpu_is_ti81xx()) {
......
...@@ -118,7 +118,7 @@ void __init omap3xxx_voltagedomains_init(void) ...@@ -118,7 +118,7 @@ void __init omap3xxx_voltagedomains_init(void)
} }
#endif #endif
if (cpu_is_omap3517() || cpu_is_omap3505()) if (soc_is_am35xx())
voltdms = voltagedomains_am35xx; voltdms = voltagedomains_am35xx;
else else
voltdms = voltagedomains_omap3; voltdms = voltagedomains_omap3;
......
...@@ -843,7 +843,7 @@ omap_dma_set_prio_lch(int lch, unsigned char read_prio, ...@@ -843,7 +843,7 @@ omap_dma_set_prio_lch(int lch, unsigned char read_prio,
} }
l = p->dma_read(CCR, lch); l = p->dma_read(CCR, lch);
l &= ~((1 << 6) | (1 << 26)); l &= ~((1 << 6) | (1 << 26));
if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) if (cpu_class_is_omap2() && !cpu_is_omap242x())
l |= ((read_prio & 0x1) << 6) | ((write_prio & 0x1) << 26); l |= ((read_prio & 0x1) << 6) | ((write_prio & 0x1) << 26);
else else
l |= ((read_prio & 0x1) << 6); l |= ((read_prio & 0x1) << 6);
...@@ -2071,7 +2071,7 @@ static int __devinit omap_system_dma_probe(struct platform_device *pdev) ...@@ -2071,7 +2071,7 @@ static int __devinit omap_system_dma_probe(struct platform_device *pdev)
} }
} }
if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) if (cpu_class_is_omap2() && !cpu_is_omap242x())
omap_dma_set_global_params(DMA_DEFAULT_ARB_RATE, omap_dma_set_global_params(DMA_DEFAULT_ARB_RATE,
DMA_DEFAULT_FIFO_DEPTH, 0); DMA_DEFAULT_FIFO_DEPTH, 0);
......
...@@ -82,8 +82,6 @@ static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg, ...@@ -82,8 +82,6 @@ static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg,
static void omap_timer_restore_context(struct omap_dm_timer *timer) static void omap_timer_restore_context(struct omap_dm_timer *timer)
{ {
__raw_writel(timer->context.tiocp_cfg,
timer->io_base + OMAP_TIMER_OCP_CFG_OFFSET);
if (timer->revision == 1) if (timer->revision == 1)
__raw_writel(timer->context.tistat, timer->sys_stat); __raw_writel(timer->context.tistat, timer->sys_stat);
......
...@@ -121,6 +121,7 @@ IS_OMAP_CLASS(16xx, 0x16) ...@@ -121,6 +121,7 @@ IS_OMAP_CLASS(16xx, 0x16)
IS_OMAP_CLASS(24xx, 0x24) IS_OMAP_CLASS(24xx, 0x24)
IS_OMAP_CLASS(34xx, 0x34) IS_OMAP_CLASS(34xx, 0x34)
IS_OMAP_CLASS(44xx, 0x44) IS_OMAP_CLASS(44xx, 0x44)
IS_AM_CLASS(35xx, 0x35)
IS_AM_CLASS(33xx, 0x33) IS_AM_CLASS(33xx, 0x33)
IS_TI_CLASS(81xx, 0x81) IS_TI_CLASS(81xx, 0x81)
...@@ -148,6 +149,7 @@ IS_AM_SUBCLASS(335x, 0x335) ...@@ -148,6 +149,7 @@ IS_AM_SUBCLASS(335x, 0x335)
#define cpu_is_ti81xx() 0 #define cpu_is_ti81xx() 0
#define cpu_is_ti816x() 0 #define cpu_is_ti816x() 0
#define cpu_is_ti814x() 0 #define cpu_is_ti814x() 0
#define soc_is_am35xx() 0
#define cpu_is_am33xx() 0 #define cpu_is_am33xx() 0
#define cpu_is_am335x() 0 #define cpu_is_am335x() 0
#define cpu_is_omap44xx() 0 #define cpu_is_omap44xx() 0
...@@ -357,6 +359,7 @@ IS_OMAP_TYPE(3517, 0x3517) ...@@ -357,6 +359,7 @@ IS_OMAP_TYPE(3517, 0x3517)
# undef cpu_is_ti81xx # undef cpu_is_ti81xx
# undef cpu_is_ti816x # undef cpu_is_ti816x
# undef cpu_is_ti814x # undef cpu_is_ti814x
# undef soc_is_am35xx
# undef cpu_is_am33xx # undef cpu_is_am33xx
# undef cpu_is_am335x # undef cpu_is_am335x
# define cpu_is_omap3430() is_omap3430() # define cpu_is_omap3430() is_omap3430()
...@@ -378,6 +381,7 @@ IS_OMAP_TYPE(3517, 0x3517) ...@@ -378,6 +381,7 @@ IS_OMAP_TYPE(3517, 0x3517)
# define cpu_is_ti81xx() is_ti81xx() # define cpu_is_ti81xx() is_ti81xx()
# define cpu_is_ti816x() is_ti816x() # define cpu_is_ti816x() is_ti816x()
# define cpu_is_ti814x() is_ti814x() # define cpu_is_ti814x() is_ti814x()
# define soc_is_am35xx() is_am35xx()
# define cpu_is_am33xx() is_am33xx() # define cpu_is_am33xx() is_am33xx()
# define cpu_is_am335x() is_am335x() # define cpu_is_am335x() is_am335x()
#endif #endif
...@@ -433,6 +437,10 @@ IS_OMAP_TYPE(3517, 0x3517) ...@@ -433,6 +437,10 @@ IS_OMAP_TYPE(3517, 0x3517)
#define TI8148_REV_ES2_0 (TI814X_CLASS | (0x1 << 8)) #define TI8148_REV_ES2_0 (TI814X_CLASS | (0x1 << 8))
#define TI8148_REV_ES2_1 (TI814X_CLASS | (0x2 << 8)) #define TI8148_REV_ES2_1 (TI814X_CLASS | (0x2 << 8))
#define AM35XX_CLASS 0x35170034
#define AM35XX_REV_ES1_0 AM35XX_CLASS
#define AM35XX_REV_ES1_1 (AM35XX_CLASS | (0x1 << 8))
#define AM335X_CLASS 0x33500034 #define AM335X_CLASS 0x33500034
#define AM335X_REV_ES1_0 AM335X_CLASS #define AM335X_REV_ES1_0 AM335X_CLASS
......
...@@ -312,6 +312,11 @@ ...@@ -312,6 +312,11 @@
#define CLEAR_CSR_ON_READ BIT(0xC) #define CLEAR_CSR_ON_READ BIT(0xC)
#define IS_WORD_16 BIT(0xD) #define IS_WORD_16 BIT(0xD)
/* Defines for DMA Capabilities */
#define DMA_HAS_TRANSPARENT_CAPS (0x1 << 18)
#define DMA_HAS_CONSTANT_FILL_CAPS (0x1 << 19)
#define DMA_HAS_DESCRIPTOR_CAPS (0x3 << 20)
enum omap_reg_offsets { enum omap_reg_offsets {
GCR, GSCR, GRST1, HW_ID, GCR, GSCR, GRST1, HW_ID,
......
...@@ -75,7 +75,6 @@ struct clk; ...@@ -75,7 +75,6 @@ struct clk;
struct timer_regs { struct timer_regs {
u32 tidr; u32 tidr;
u32 tiocp_cfg;
u32 tistat; u32 tistat;
u32 tisr; u32 tisr;
u32 tier; u32 tier;
......
...@@ -213,11 +213,17 @@ struct omap_hwmod_addr_space { ...@@ -213,11 +213,17 @@ struct omap_hwmod_addr_space {
*/ */
#define OCP_USER_MPU (1 << 0) #define OCP_USER_MPU (1 << 0)
#define OCP_USER_SDMA (1 << 1) #define OCP_USER_SDMA (1 << 1)
#define OCP_USER_DSP (1 << 2)
#define OCP_USER_IVA (1 << 3)
/* omap_hwmod_ocp_if.flags bits */ /* omap_hwmod_ocp_if.flags bits */
#define OCPIF_SWSUP_IDLE (1 << 0) #define OCPIF_SWSUP_IDLE (1 << 0)
#define OCPIF_CAN_BURST (1 << 1) #define OCPIF_CAN_BURST (1 << 1)
/* omap_hwmod_ocp_if._int_flags possibilities */
#define _OCPIF_INT_FLAGS_REGISTERED (1 << 0)
/** /**
* struct omap_hwmod_ocp_if - OCP interface data * struct omap_hwmod_ocp_if - OCP interface data
* @master: struct omap_hwmod that initiates OCP transactions on this link * @master: struct omap_hwmod that initiates OCP transactions on this link
...@@ -229,6 +235,7 @@ struct omap_hwmod_addr_space { ...@@ -229,6 +235,7 @@ struct omap_hwmod_addr_space {
* @width: OCP data width * @width: OCP data width
* @user: initiators using this interface (see OCP_USER_* macros above) * @user: initiators using this interface (see OCP_USER_* macros above)
* @flags: OCP interface flags (see OCPIF_* macros above) * @flags: OCP interface flags (see OCPIF_* macros above)
* @_int_flags: internal flags (see _OCPIF_INT_FLAGS* macros above)
* *
* It may also be useful to add a tag_cnt field for OCP2.x devices. * It may also be useful to add a tag_cnt field for OCP2.x devices.
* *
...@@ -247,6 +254,7 @@ struct omap_hwmod_ocp_if { ...@@ -247,6 +254,7 @@ struct omap_hwmod_ocp_if {
u8 width; u8 width;
u8 user; u8 user;
u8 flags; u8 flags;
u8 _int_flags;
}; };
...@@ -327,9 +335,9 @@ struct omap_hwmod_sysc_fields { ...@@ -327,9 +335,9 @@ struct omap_hwmod_sysc_fields {
* then this field has to be populated with the correct offset structure. * then this field has to be populated with the correct offset structure.
*/ */
struct omap_hwmod_class_sysconfig { struct omap_hwmod_class_sysconfig {
u16 rev_offs; u32 rev_offs;
u16 sysc_offs; u32 sysc_offs;
u16 syss_offs; u32 syss_offs;
u16 sysc_flags; u16 sysc_flags;
struct omap_hwmod_sysc_fields *sysc_fields; struct omap_hwmod_sysc_fields *sysc_fields;
u8 srst_udelay; u8 srst_udelay;
...@@ -475,6 +483,16 @@ struct omap_hwmod_class { ...@@ -475,6 +483,16 @@ struct omap_hwmod_class {
int (*reset)(struct omap_hwmod *oh); int (*reset)(struct omap_hwmod *oh);
}; };
/**
* struct omap_hwmod_link - internal structure linking hwmods with ocp_ifs
* @ocp_if: OCP interface structure record pointer
* @node: list_head pointing to next struct omap_hwmod_link in a list
*/
struct omap_hwmod_link {
struct omap_hwmod_ocp_if *ocp_if;
struct list_head node;
};
/** /**
* struct omap_hwmod - integration data for OMAP hardware "modules" (IP blocks) * struct omap_hwmod - integration data for OMAP hardware "modules" (IP blocks)
* @name: name of the hwmod * @name: name of the hwmod
...@@ -487,12 +505,10 @@ struct omap_hwmod_class { ...@@ -487,12 +505,10 @@ struct omap_hwmod_class {
* @_clk: pointer to the main struct clk (filled in at runtime) * @_clk: pointer to the main struct clk (filled in at runtime)
* @opt_clks: other device clocks that drivers can request (0..*) * @opt_clks: other device clocks that drivers can request (0..*)
* @voltdm: pointer to voltage domain (filled in at runtime) * @voltdm: pointer to voltage domain (filled in at runtime)
* @masters: ptr to array of OCP ifs that this hwmod can initiate on
* @slaves: ptr to array of OCP ifs that this hwmod can respond on
* @dev_attr: arbitrary device attributes that can be passed to the driver * @dev_attr: arbitrary device attributes that can be passed to the driver
* @_sysc_cache: internal-use hwmod flags * @_sysc_cache: internal-use hwmod flags
* @_mpu_rt_va: cached register target start address (internal use) * @_mpu_rt_va: cached register target start address (internal use)
* @_mpu_port_index: cached MPU register target slave ID (internal use) * @_mpu_port: cached MPU register target slave (internal use)
* @opt_clks_cnt: number of @opt_clks * @opt_clks_cnt: number of @opt_clks
* @master_cnt: number of @master entries * @master_cnt: number of @master entries
* @slaves_cnt: number of @slave entries * @slaves_cnt: number of @slave entries
...@@ -511,6 +527,8 @@ struct omap_hwmod_class { ...@@ -511,6 +527,8 @@ struct omap_hwmod_class {
* *
* Parameter names beginning with an underscore are managed internally by * Parameter names beginning with an underscore are managed internally by
* the omap_hwmod code and should not be set during initialization. * the omap_hwmod code and should not be set during initialization.
*
* @masters and @slaves are now deprecated.
*/ */
struct omap_hwmod { struct omap_hwmod {
const char *name; const char *name;
...@@ -529,15 +547,15 @@ struct omap_hwmod { ...@@ -529,15 +547,15 @@ struct omap_hwmod {
struct omap_hwmod_opt_clk *opt_clks; struct omap_hwmod_opt_clk *opt_clks;
char *clkdm_name; char *clkdm_name;
struct clockdomain *clkdm; struct clockdomain *clkdm;
struct omap_hwmod_ocp_if **masters; /* connect to *_IA */ struct list_head master_ports; /* connect to *_IA */
struct omap_hwmod_ocp_if **slaves; /* connect to *_TA */ struct list_head slave_ports; /* connect to *_TA */
void *dev_attr; void *dev_attr;
u32 _sysc_cache; u32 _sysc_cache;
void __iomem *_mpu_rt_va; void __iomem *_mpu_rt_va;
spinlock_t _lock; spinlock_t _lock;
struct list_head node; struct list_head node;
struct omap_hwmod_ocp_if *_mpu_port;
u16 flags; u16 flags;
u8 _mpu_port_index;
u8 response_lat; u8 response_lat;
u8 rst_lines_cnt; u8 rst_lines_cnt;
u8 opt_clks_cnt; u8 opt_clks_cnt;
...@@ -549,7 +567,6 @@ struct omap_hwmod { ...@@ -549,7 +567,6 @@ struct omap_hwmod {
u8 _postsetup_state; u8 _postsetup_state;
}; };
int omap_hwmod_register(struct omap_hwmod **ohs);
struct omap_hwmod *omap_hwmod_lookup(const char *name); struct omap_hwmod *omap_hwmod_lookup(const char *name);
int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data), int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
void *data); void *data);
...@@ -581,6 +598,8 @@ int omap_hwmod_softreset(struct omap_hwmod *oh); ...@@ -581,6 +598,8 @@ int omap_hwmod_softreset(struct omap_hwmod *oh);
int omap_hwmod_count_resources(struct omap_hwmod *oh); int omap_hwmod_count_resources(struct omap_hwmod *oh);
int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res); int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res);
int omap_hwmod_get_resource_byname(struct omap_hwmod *oh, unsigned int type,
const char *name, struct resource *res);
struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh); struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh);
void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh); void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh);
...@@ -619,4 +638,6 @@ extern int omap2430_hwmod_init(void); ...@@ -619,4 +638,6 @@ extern int omap2430_hwmod_init(void);
extern int omap3xxx_hwmod_init(void); extern int omap3xxx_hwmod_init(void);
extern int omap44xx_hwmod_init(void); extern int omap44xx_hwmod_init(void);
extern int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois);
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册