aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--MAINTAINERS22
-rw-r--r--arch/arm/mach-omap2/clock44xx_data.c9
-rw-r--r--arch/arm/mach-omap2/omap_hwmod.c98
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_3xxx_data.c14
-rw-r--r--arch/arm/mach-omap2/voltagedomains3xxx_data.c40
-rw-r--r--arch/arm/mach-pxa/balloon3.c1
-rw-r--r--arch/arm/plat-omap/dma.c22
7 files changed, 134 insertions, 72 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index 78b078e8e0af..ba6bd97976b0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5297,7 +5297,10 @@ F: drivers/media/video/pvrusb2/
5297PXA2xx/PXA3xx SUPPORT 5297PXA2xx/PXA3xx SUPPORT
5298M: Eric Miao <eric.y.miao@gmail.com> 5298M: Eric Miao <eric.y.miao@gmail.com>
5299M: Russell King <linux@arm.linux.org.uk> 5299M: Russell King <linux@arm.linux.org.uk>
5300M: Haojian Zhuang <haojian.zhuang@marvell.com>
5300L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) 5301L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
5302T: git git://github.com/hzhuang1/linux.git
5303T: git git://git.linaro.org/people/ycmiao/pxa-linux.git
5301S: Maintained 5304S: Maintained
5302F: arch/arm/mach-pxa/ 5305F: arch/arm/mach-pxa/
5303F: drivers/pcmcia/pxa2xx* 5306F: drivers/pcmcia/pxa2xx*
@@ -5307,25 +5310,14 @@ F: include/sound/pxa2xx-lib.h
5307F: sound/arm/pxa* 5310F: sound/arm/pxa*
5308F: sound/soc/pxa 5311F: sound/soc/pxa
5309 5312
5310PXA168 SUPPORT 5313MMP SUPPORT
5311M: Eric Miao <eric.y.miao@gmail.com>
5312M: Jason Chagas <jason.chagas@marvell.com>
5313L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
5314T: git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git
5315S: Maintained
5316
5317PXA910 SUPPORT
5318M: Eric Miao <eric.y.miao@gmail.com> 5314M: Eric Miao <eric.y.miao@gmail.com>
5319L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
5320T: git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git
5321S: Maintained
5322
5323MMP2 SUPPORT (aka ARMADA610)
5324M: Haojian Zhuang <haojian.zhuang@marvell.com> 5315M: Haojian Zhuang <haojian.zhuang@marvell.com>
5325M: Eric Miao <eric.y.miao@gmail.com>
5326L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) 5316L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
5327T: git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git 5317T: git git://github.com/hzhuang1/linux.git
5318T: git git://git.linaro.org/people/ycmiao/pxa-linux.git
5328S: Maintained 5319S: Maintained
5320F: arch/arm/mach-mmp/
5329 5321
5330PXA MMCI DRIVER 5322PXA MMCI DRIVER
5331S: Orphan 5323S: Orphan
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c
index 0798a802497a..730097ee0f23 100644
--- a/arch/arm/mach-omap2/clock44xx_data.c
+++ b/arch/arm/mach-omap2/clock44xx_data.c
@@ -1206,6 +1206,14 @@ static const struct clksel ocp_abe_iclk_div[] = {
1206 { .parent = NULL }, 1206 { .parent = NULL },
1207}; 1207};
1208 1208
1209static struct clk mpu_periphclk = {
1210 .name = "mpu_periphclk",
1211 .parent = &dpll_mpu_ck,
1212 .ops = &clkops_null,
1213 .fixed_div = 2,
1214 .recalc = &omap_fixed_divisor_recalc,
1215};
1216
1209static struct clk ocp_abe_iclk = { 1217static struct clk ocp_abe_iclk = {
1210 .name = "ocp_abe_iclk", 1218 .name = "ocp_abe_iclk",
1211 .parent = &aess_fclk, 1219 .parent = &aess_fclk,
@@ -3189,6 +3197,7 @@ static struct omap_clk omap44xx_clks[] = {
3189 CLK(NULL, "l4_div_ck", &l4_div_ck, CK_443X), 3197 CLK(NULL, "l4_div_ck", &l4_div_ck, CK_443X),
3190 CLK(NULL, "lp_clk_div_ck", &lp_clk_div_ck, CK_443X), 3198 CLK(NULL, "lp_clk_div_ck", &lp_clk_div_ck, CK_443X),
3191 CLK(NULL, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck, CK_443X), 3199 CLK(NULL, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck, CK_443X),
3200 CLK("smp_twd", NULL, &mpu_periphclk, CK_443X),
3192 CLK(NULL, "ocp_abe_iclk", &ocp_abe_iclk, CK_443X), 3201 CLK(NULL, "ocp_abe_iclk", &ocp_abe_iclk, CK_443X),
3193 CLK(NULL, "per_abe_24m_fclk", &per_abe_24m_fclk, CK_443X), 3202 CLK(NULL, "per_abe_24m_fclk", &per_abe_24m_fclk, CK_443X),
3194 CLK(NULL, "per_abe_nc_fclk", &per_abe_nc_fclk, CK_443X), 3203 CLK(NULL, "per_abe_nc_fclk", &per_abe_nc_fclk, CK_443X),
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 529142aff766..373d1f15c4eb 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -706,27 +706,65 @@ static void _enable_module(struct omap_hwmod *oh)
706} 706}
707 707
708/** 708/**
709 * _disable_module - enable CLKCTRL modulemode on OMAP4 709 * _omap4_wait_target_disable - wait for a module to be disabled on OMAP4
710 * @oh: struct omap_hwmod *
711 *
712 * Wait for a module @oh to enter slave idle. Returns 0 if the module
713 * does not have an IDLEST bit or if the module successfully enters
714 * slave idle; otherwise, pass along the return value of the
715 * appropriate *_cm*_wait_module_idle() function.
716 */
717static int _omap4_wait_target_disable(struct omap_hwmod *oh)
718{
719 if (!cpu_is_omap44xx())
720 return 0;
721
722 if (!oh)
723 return -EINVAL;
724
725 if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
726 return 0;
727
728 if (oh->flags & HWMOD_NO_IDLEST)
729 return 0;
730
731 return omap4_cminst_wait_module_idle(oh->clkdm->prcm_partition,
732 oh->clkdm->cm_inst,
733 oh->clkdm->clkdm_offs,
734 oh->prcm.omap4.clkctrl_offs);
735}
736
737/**
738 * _omap4_disable_module - enable CLKCTRL modulemode on OMAP4
710 * @oh: struct omap_hwmod * 739 * @oh: struct omap_hwmod *
711 * 740 *
712 * Disable the PRCM module mode related to the hwmod @oh. 741 * Disable the PRCM module mode related to the hwmod @oh.
713 * No return value. 742 * Return EINVAL if the modulemode is not supported and 0 in case of success.
714 */ 743 */
715static void _disable_module(struct omap_hwmod *oh) 744static int _omap4_disable_module(struct omap_hwmod *oh)
716{ 745{
746 int v;
747
717 /* The module mode does not exist prior OMAP4 */ 748 /* The module mode does not exist prior OMAP4 */
718 if (cpu_is_omap24xx() || cpu_is_omap34xx()) 749 if (!cpu_is_omap44xx())
719 return; 750 return -EINVAL;
720 751
721 if (!oh->clkdm || !oh->prcm.omap4.modulemode) 752 if (!oh->clkdm || !oh->prcm.omap4.modulemode)
722 return; 753 return -EINVAL;
723 754
724 pr_debug("omap_hwmod: %s: _disable_module\n", oh->name); 755 pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__);
725 756
726 omap4_cminst_module_disable(oh->clkdm->prcm_partition, 757 omap4_cminst_module_disable(oh->clkdm->prcm_partition,
727 oh->clkdm->cm_inst, 758 oh->clkdm->cm_inst,
728 oh->clkdm->clkdm_offs, 759 oh->clkdm->clkdm_offs,
729 oh->prcm.omap4.clkctrl_offs); 760 oh->prcm.omap4.clkctrl_offs);
761
762 v = _omap4_wait_target_disable(oh);
763 if (v)
764 pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
765 oh->name);
766
767 return 0;
730} 768}
731 769
732/** 770/**
@@ -1153,36 +1191,6 @@ static int _wait_target_ready(struct omap_hwmod *oh)
1153} 1191}
1154 1192
1155/** 1193/**
1156 * _wait_target_disable - wait for a module to be disabled
1157 * @oh: struct omap_hwmod *
1158 *
1159 * Wait for a module @oh to enter slave idle. Returns 0 if the module
1160 * does not have an IDLEST bit or if the module successfully enters
1161 * slave idle; otherwise, pass along the return value of the
1162 * appropriate *_cm*_wait_module_idle() function.
1163 */
1164static int _wait_target_disable(struct omap_hwmod *oh)
1165{
1166 /* TODO: For now just handle OMAP4+ */
1167 if (cpu_is_omap24xx() || cpu_is_omap34xx())
1168 return 0;
1169
1170 if (!oh)
1171 return -EINVAL;
1172
1173 if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
1174 return 0;
1175
1176 if (oh->flags & HWMOD_NO_IDLEST)
1177 return 0;
1178
1179 return omap4_cminst_wait_module_idle(oh->clkdm->prcm_partition,
1180 oh->clkdm->cm_inst,
1181 oh->clkdm->clkdm_offs,
1182 oh->prcm.omap4.clkctrl_offs);
1183}
1184
1185/**
1186 * _lookup_hardreset - fill register bit info for this hwmod/reset line 1194 * _lookup_hardreset - fill register bit info for this hwmod/reset line
1187 * @oh: struct omap_hwmod * 1195 * @oh: struct omap_hwmod *
1188 * @name: name of the reset line in the context of this hwmod 1196 * @name: name of the reset line in the context of this hwmod
@@ -1524,8 +1532,6 @@ static int _enable(struct omap_hwmod *oh)
1524 */ 1532 */
1525static int _idle(struct omap_hwmod *oh) 1533static int _idle(struct omap_hwmod *oh)
1526{ 1534{
1527 int ret;
1528
1529 pr_debug("omap_hwmod: %s: idling\n", oh->name); 1535 pr_debug("omap_hwmod: %s: idling\n", oh->name);
1530 1536
1531 if (oh->_state != _HWMOD_STATE_ENABLED) { 1537 if (oh->_state != _HWMOD_STATE_ENABLED) {
@@ -1537,11 +1543,9 @@ static int _idle(struct omap_hwmod *oh)
1537 if (oh->class->sysc) 1543 if (oh->class->sysc)
1538 _idle_sysc(oh); 1544 _idle_sysc(oh);
1539 _del_initiator_dep(oh, mpu_oh); 1545 _del_initiator_dep(oh, mpu_oh);
1540 _disable_module(oh); 1546
1541 ret = _wait_target_disable(oh); 1547 _omap4_disable_module(oh);
1542 if (ret) 1548
1543 pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
1544 oh->name);
1545 /* 1549 /*
1546 * The module must be in idle mode before disabling any parents 1550 * The module must be in idle mode before disabling any parents
1547 * clocks. Otherwise, the parent clock might be disabled before 1551 * clocks. Otherwise, the parent clock might be disabled before
@@ -1642,11 +1646,7 @@ static int _shutdown(struct omap_hwmod *oh)
1642 if (oh->_state == _HWMOD_STATE_ENABLED) { 1646 if (oh->_state == _HWMOD_STATE_ENABLED) {
1643 _del_initiator_dep(oh, mpu_oh); 1647 _del_initiator_dep(oh, mpu_oh);
1644 /* XXX what about the other system initiators here? dma, dsp */ 1648 /* XXX what about the other system initiators here? dma, dsp */
1645 _disable_module(oh); 1649 _omap4_disable_module(oh);
1646 ret = _wait_target_disable(oh);
1647 if (ret)
1648 pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
1649 oh->name);
1650 _disable_clocks(oh); 1650 _disable_clocks(oh);
1651 if (oh->clkdm) 1651 if (oh->clkdm)
1652 clkdm_hwmod_disable(oh->clkdm, oh); 1652 clkdm_hwmod_disable(oh->clkdm, oh);
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
index eef43e2e163e..126cb49c0de7 100644
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -3198,7 +3198,6 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
3198 &omap3xxx_timer9_hwmod, 3198 &omap3xxx_timer9_hwmod,
3199 &omap3xxx_timer10_hwmod, 3199 &omap3xxx_timer10_hwmod,
3200 &omap3xxx_timer11_hwmod, 3200 &omap3xxx_timer11_hwmod,
3201 &omap3xxx_timer12_hwmod,
3202 3201
3203 &omap3xxx_wd_timer2_hwmod, 3202 &omap3xxx_wd_timer2_hwmod,
3204 &omap3xxx_uart1_hwmod, 3203 &omap3xxx_uart1_hwmod,
@@ -3245,6 +3244,12 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
3245 NULL, 3244 NULL,
3246}; 3245};
3247 3246
3247/* GP-only hwmods */
3248static __initdata struct omap_hwmod *omap3xxx_gp_hwmods[] = {
3249 &omap3xxx_timer12_hwmod,
3250 NULL
3251};
3252
3248/* 3430ES1-only hwmods */ 3253/* 3430ES1-only hwmods */
3249static __initdata struct omap_hwmod *omap3430es1_hwmods[] = { 3254static __initdata struct omap_hwmod *omap3430es1_hwmods[] = {
3250 &omap3430es1_dss_core_hwmod, 3255 &omap3430es1_dss_core_hwmod,
@@ -3296,6 +3301,13 @@ int __init omap3xxx_hwmod_init(void)
3296 if (r < 0) 3301 if (r < 0)
3297 return r; 3302 return r;
3298 3303
3304 /* Register GP-only hwmods. */
3305 if (omap_type() == OMAP2_DEVICE_TYPE_GP) {
3306 r = omap_hwmod_register(omap3xxx_gp_hwmods);
3307 if (r < 0)
3308 return r;
3309 }
3310
3299 rev = omap_rev(); 3311 rev = omap_rev();
3300 3312
3301 /* 3313 /*
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
index 474559d5b072..c005e2f5e383 100644
--- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
@@ -31,6 +31,14 @@
31 * VDD data 31 * VDD data
32 */ 32 */
33 33
34/* OMAP3-common voltagedomain data */
35
36static struct voltagedomain omap3_voltdm_wkup = {
37 .name = "wakeup",
38};
39
40/* 34xx/36xx voltagedomain data */
41
34static const struct omap_vfsm_instance omap3_vdd1_vfsm = { 42static const struct omap_vfsm_instance omap3_vdd1_vfsm = {
35 .voltsetup_reg = OMAP3_PRM_VOLTSETUP1_OFFSET, 43 .voltsetup_reg = OMAP3_PRM_VOLTSETUP1_OFFSET,
36 .voltsetup_mask = OMAP3430_SETUP_TIME1_MASK, 44 .voltsetup_mask = OMAP3430_SETUP_TIME1_MASK,
@@ -63,10 +71,6 @@ static struct voltagedomain omap3_voltdm_core = {
63 .vp = &omap3_vp_core, 71 .vp = &omap3_vp_core,
64}; 72};
65 73
66static struct voltagedomain omap3_voltdm_wkup = {
67 .name = "wakeup",
68};
69
70static struct voltagedomain *voltagedomains_omap3[] __initdata = { 74static struct voltagedomain *voltagedomains_omap3[] __initdata = {
71 &omap3_voltdm_mpu, 75 &omap3_voltdm_mpu,
72 &omap3_voltdm_core, 76 &omap3_voltdm_core,
@@ -74,11 +78,30 @@ static struct voltagedomain *voltagedomains_omap3[] __initdata = {
74 NULL, 78 NULL,
75}; 79};
76 80
81/* AM35xx voltagedomain data */
82
83static struct voltagedomain am35xx_voltdm_mpu = {
84 .name = "mpu_iva",
85};
86
87static struct voltagedomain am35xx_voltdm_core = {
88 .name = "core",
89};
90
91static struct voltagedomain *voltagedomains_am35xx[] __initdata = {
92 &am35xx_voltdm_mpu,
93 &am35xx_voltdm_core,
94 &omap3_voltdm_wkup,
95 NULL,
96};
97
98
77static const char *sys_clk_name __initdata = "sys_ck"; 99static const char *sys_clk_name __initdata = "sys_ck";
78 100
79void __init omap3xxx_voltagedomains_init(void) 101void __init omap3xxx_voltagedomains_init(void)
80{ 102{
81 struct voltagedomain *voltdm; 103 struct voltagedomain *voltdm;
104 struct voltagedomain **voltdms;
82 int i; 105 int i;
83 106
84 /* 107 /*
@@ -93,8 +116,13 @@ void __init omap3xxx_voltagedomains_init(void)
93 omap3_voltdm_core.volt_data = omap34xx_vddcore_volt_data; 116 omap3_voltdm_core.volt_data = omap34xx_vddcore_volt_data;
94 } 117 }
95 118
96 for (i = 0; voltdm = voltagedomains_omap3[i], voltdm; i++) 119 if (cpu_is_omap3517() || cpu_is_omap3505())
120 voltdms = voltagedomains_am35xx;
121 else
122 voltdms = voltagedomains_omap3;
123
124 for (i = 0; voltdm = voltdms[i], voltdm; i++)
97 voltdm->sys_clk.name = sys_clk_name; 125 voltdm->sys_clk.name = sys_clk_name;
98 126
99 voltdm_init(voltagedomains_omap3); 127 voltdm_init(voltdms);
100}; 128};
diff --git a/arch/arm/mach-pxa/balloon3.c b/arch/arm/mach-pxa/balloon3.c
index 82514f5c38f1..a34de9a0d5e5 100644
--- a/arch/arm/mach-pxa/balloon3.c
+++ b/arch/arm/mach-pxa/balloon3.c
@@ -13,6 +13,7 @@
13 * published by the Free Software Foundation. 13 * published by the Free Software Foundation.
14 */ 14 */
15 15
16#include <linux/export.h>
16#include <linux/init.h> 17#include <linux/init.h>
17#include <linux/platform_device.h> 18#include <linux/platform_device.h>
18#include <linux/interrupt.h> 19#include <linux/interrupt.h>
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
index c22217c2ee5f..002fb4d96bbc 100644
--- a/arch/arm/plat-omap/dma.c
+++ b/arch/arm/plat-omap/dma.c
@@ -1034,6 +1034,18 @@ dma_addr_t omap_get_dma_src_pos(int lch)
1034 if (IS_DMA_ERRATA(DMA_ERRATA_3_3) && offset == 0) 1034 if (IS_DMA_ERRATA(DMA_ERRATA_3_3) && offset == 0)
1035 offset = p->dma_read(CSAC, lch); 1035 offset = p->dma_read(CSAC, lch);
1036 1036
1037 if (!cpu_is_omap15xx()) {
1038 /*
1039 * CDAC == 0 indicates that the DMA transfer on the channel has
1040 * not been started (no data has been transferred so far).
1041 * Return the programmed source start address in this case.
1042 */
1043 if (likely(p->dma_read(CDAC, lch)))
1044 offset = p->dma_read(CSAC, lch);
1045 else
1046 offset = p->dma_read(CSSA, lch);
1047 }
1048
1037 if (cpu_class_is_omap1()) 1049 if (cpu_class_is_omap1())
1038 offset |= (p->dma_read(CSSA, lch) & 0xFFFF0000); 1050 offset |= (p->dma_read(CSSA, lch) & 0xFFFF0000);
1039 1051
@@ -1062,8 +1074,16 @@ dma_addr_t omap_get_dma_dst_pos(int lch)
1062 * omap 3.2/3.3 erratum: sometimes 0 is returned if CSAC/CDAC is 1074 * omap 3.2/3.3 erratum: sometimes 0 is returned if CSAC/CDAC is
1063 * read before the DMA controller finished disabling the channel. 1075 * read before the DMA controller finished disabling the channel.
1064 */ 1076 */
1065 if (!cpu_is_omap15xx() && offset == 0) 1077 if (!cpu_is_omap15xx() && offset == 0) {
1066 offset = p->dma_read(CDAC, lch); 1078 offset = p->dma_read(CDAC, lch);
1079 /*
1080 * CDAC == 0 indicates that the DMA transfer on the channel has
1081 * not been started (no data has been transferred so far).
1082 * Return the programmed destination start address in this case.
1083 */
1084 if (unlikely(!offset))
1085 offset = p->dma_read(CDSA, lch);
1086 }
1067 1087
1068 if (cpu_class_is_omap1()) 1088 if (cpu_class_is_omap1())
1069 offset |= (p->dma_read(CDSA, lch) & 0xFFFF0000); 1089 offset |= (p->dma_read(CDSA, lch) & 0xFFFF0000);