From: Jean Pihet <jpihet@mvista.com>
To: Kevin Hilman <khilman@deeprootsystems.com>
Cc: Paul Walmsley <paul@pwsan.com>,
tero.kristo@nokia.com, linux-omap <linux-omap@vger.kernel.org>
Subject: Re: [RFC][PATCH] OMAP3: add support for 2 SDRAM chip selects (was: Re: Beagleboard rev C memory timings & suspend/resume)
Date: Mon, 8 Jun 2009 19:08:40 +0200 [thread overview]
Message-ID: <200906081908.40649.jpihet@mvista.com> (raw)
In-Reply-To: <87y6s26aav.fsf@deeprootsystems.com>
On Monday 08 June 2009 16:59:36 Kevin Hilman wrote:
> Jean Pihet <jpihet@mvista.com> writes:
> > Paul,
> >
> > Here is the updated patch that fixes the Overo build as well.
> > Can you check it?
> >
> > Kevin, can you push it if it is correct?
>
> Can you run it through checkpatch, fix the errors and also merge Tero's
> RX51 patch if it looks good to you.
Ok. I will check. The cause might be the mailer.
I think we need the omap_cfg_reg calls in the RX51 board file as well, even if
the bootloader has the mux setting already right. That way a warning will be
issued in case of a faulty bootloader. Do you agree?
>
> Below are the checkpatch errors I get: looks lik your mailer is
> probably wrapping the patch and there is also one error to fix.
>
> Kevin
Regards,
Jean
>
> ERROR: patch seems to be corrupt (line wrapped?)
> #306: FILE: arch/arm/mach-omap2/clock34xx.c:477:
> unsigned long rate)
>
> ERROR: trailing whitespace
> #494: FILE: arch/arm/mach-omap2/sdrc.c:128:
> + * @sdrc_cs[01]: pointers to a null-terminated list of struct $
>
> total: 2 errors, 0 warnings, 648 lines checked
>
> Your patch has style problems, please review. If any of these errors
> are false positives report them to the maintainer, see
> CHECKPATCH in MAINTAINERS.
>
> > Regards,
> > Jean
> >
> > From ebe57354b04444de059e1f042e0c488f761853f0 Mon Sep 17 00:00:00 2001
> > From: Jean Pihet <jpihet@mvista.com>
> > Date: Fri, 5 Jun 2009 17:19:00 +0200
> > Subject: OMAP3: add support for 2 SDRAM chip selects
> >
> > Some boards (Beagle Cx, Overo) have 2 SDRAM parts
> > connected to the SDRC.
> >
> > This patch adds the following:
> > - ensure that the CKE signals mux settings are correct
> > - add a new argument of type omap_sdrc_params struct*
> > to omap2_init_common_hw and omap2_sdrc_init for the 2nd CS params
> > - adapted the OMAP boards files to the new prototype of
> > omap2_init_common_hw. Only Beagle and Overo are using the 2 CS'es
> > - adapt the sram sleep code to configure the SDRC for the 2nd CS
> >
> > Note: If the 2nd param to omap2_init_common_hw is NULL, then the
> > parameters are not programmed into the SDRC CS1 registers
> >
> > Tested on 3430 SDP and Beagleboard rev C2 and B5, with
> > suspend/resume and frequency changes (cpufreq).
> >
> > Thanks to Paul Walmsley and Kevin Hilman for the suggestions
> > and code reviews.
> >
> > Signed-off-by: Jean Pihet <jpihet@mvista.com>
> > ---
> > arch/arm/mach-omap2/board-2430sdp.c | 2 +-
> > arch/arm/mach-omap2/board-3430sdp.c | 6 +-
> > arch/arm/mach-omap2/board-apollon.c | 2 +-
> > arch/arm/mach-omap2/board-generic.c | 2 +-
> > arch/arm/mach-omap2/board-h4.c | 2 +-
> > arch/arm/mach-omap2/board-ldp.c | 2 +-
> > arch/arm/mach-omap2/board-n800.c | 2 +-
> > arch/arm/mach-omap2/board-omap2evm.c | 2 +-
> > arch/arm/mach-omap2/board-omap3beagle.c | 11 ++-
> > arch/arm/mach-omap2/board-omap3evm.c | 6 +-
> > arch/arm/mach-omap2/board-omap3pandora.c | 3 +-
> > arch/arm/mach-omap2/board-overo.c | 9 ++-
> > arch/arm/mach-omap2/board-rx51.c | 6 +-
> > arch/arm/mach-omap2/clock34xx.c | 37 ++++++--
> > arch/arm/mach-omap2/io.c | 5 +-
> > arch/arm/mach-omap2/mux.c | 6 ++
> > arch/arm/mach-omap2/sdrc.c | 63 +++++++++-----
> > arch/arm/mach-omap2/sram34xx.S | 137
> > +++++++++++++++++++++++-------
> > arch/arm/plat-omap/include/mach/io.h | 3 +-
> > arch/arm/plat-omap/include/mach/mux.h | 4 +
> > arch/arm/plat-omap/include/mach/sdrc.h | 8 +-
> > arch/arm/plat-omap/include/mach/sram.h | 23 +++--
> > arch/arm/plat-omap/sram.c | 34 +++++---
> > 23 files changed, 267 insertions(+), 108 deletions(-)
> >
> > diff --git a/arch/arm/mach-omap2/board-2430sdp.c
> > b/arch/arm/mach-omap2/board-2430sdp.c
> > index aa5df72..4cb7bc5 100644
> > --- a/arch/arm/mach-omap2/board-2430sdp.c
> > +++ b/arch/arm/mach-omap2/board-2430sdp.c
> > @@ -322,7 +322,7 @@ out:
> >
> > static void __init omap_2430sdp_init_irq(void)
> > {
> > - omap2_init_common_hw(NULL);
> > + omap2_init_common_hw(NULL, NULL, NULL, NULL, NULL);
> > omap_init_irq();
> > omap_gpio_init();
> > sdp2430_init_smc91x();
> > diff --git a/arch/arm/mach-omap2/board-3430sdp.c
> > b/arch/arm/mach-omap2/board-3430sdp.c
> > index 195b749..24e2728 100644
> > --- a/arch/arm/mach-omap2/board-3430sdp.c
> > +++ b/arch/arm/mach-omap2/board-3430sdp.c
> > @@ -302,8 +302,10 @@ static inline void __init sdp3430_init_smc91x(void)
> >
> > static void __init omap_3430sdp_init_irq(void)
> > {
> > - omap2_init_common_hw(hyb18m512160af6_sdrc_params, omap3_mpu_rate_table,
> > - omap3_dsp_rate_table, omap3_l3_rate_table);
> > + omap2_init_common_hw(hyb18m512160af6_sdrc_params, NULL,
> > + omap3_mpu_rate_table,
> > + omap3_dsp_rate_table,
> > + omap3_l3_rate_table);
> > omap_init_irq();
> > omap_gpio_init();
> > sdp3430_init_smc91x();
> > diff --git a/arch/arm/mach-omap2/board-apollon.c
> > b/arch/arm/mach-omap2/board-apollon.c
> > index 2e24812..2dd1350 100644
> > --- a/arch/arm/mach-omap2/board-apollon.c
> > +++ b/arch/arm/mach-omap2/board-apollon.c
> > @@ -323,7 +323,7 @@ out:
> >
> > static void __init omap_apollon_init_irq(void)
> > {
> > - omap2_init_common_hw(NULL, NULL, NULL, NULL);
> > + omap2_init_common_hw(NULL, NULL, NULL, NULL, NULL);
> > omap_init_irq();
> > omap_gpio_init();
> > apollon_init_smc91x();
> > diff --git a/arch/arm/mach-omap2/board-generic.c
> > b/arch/arm/mach-omap2/board-generic.c
> > index be763a9..763329b 100644
> > --- a/arch/arm/mach-omap2/board-generic.c
> > +++ b/arch/arm/mach-omap2/board-generic.c
> > @@ -33,7 +33,7 @@
> >
> > static void __init omap_generic_init_irq(void)
> > {
> > - omap2_init_common_hw(NULL, NULL, NULL, NULL);
> > + omap2_init_common_hw(NULL, NULL, NULL, NULL, NULL);
> > omap_init_irq();
> > }
> >
> > diff --git a/arch/arm/mach-omap2/board-h4.c
> > b/arch/arm/mach-omap2/board-h4.c index 8f54939..17c3599 100644
> > --- a/arch/arm/mach-omap2/board-h4.c
> > +++ b/arch/arm/mach-omap2/board-h4.c
> > @@ -348,7 +348,7 @@ static void __init h4_init_flash(void)
> >
> > static void __init omap_h4_init_irq(void)
> > {
> > - omap2_init_common_hw(NULL, NULL, NULL, NULL);
> > + omap2_init_common_hw(NULL, NULL, NULL, NULL, NULL);
> > omap_init_irq();
> > omap_gpio_init();
> > h4_init_flash();
> > diff --git a/arch/arm/mach-omap2/board-ldp.c
> > b/arch/arm/mach-omap2/board-ldp.c index 9f41dc9..b012806 100644
> > --- a/arch/arm/mach-omap2/board-ldp.c
> > +++ b/arch/arm/mach-omap2/board-ldp.c
> > @@ -344,7 +344,7 @@ static inline void __init ldp_init_smc911x(void)
> >
> > static void __init omap_ldp_init_irq(void)
> > {
> > - omap2_init_common_hw(NULL, NULL, NULL, NULL);
> > + omap2_init_common_hw(NULL, NULL, NULL, NULL, NULL);
> > omap_init_irq();
> > omap_gpio_init();
> > ldp_init_smc911x();
> > diff --git a/arch/arm/mach-omap2/board-n800.c
> > b/arch/arm/mach-omap2/board-n800.c
> > index ac7cf3f..ad53f4a 100644
> > --- a/arch/arm/mach-omap2/board-n800.c
> > +++ b/arch/arm/mach-omap2/board-n800.c
> > @@ -127,7 +127,7 @@ static struct lm8323_platform_data lm8323_pdata = {
> >
> > void __init nokia_n800_init_irq(void)
> > {
> > - omap2_init_common_hw(NULL, NULL, NULL, NULL);
> > + omap2_init_common_hw(NULL, NULL, NULL, NULL, NULL);
> > omap_init_irq();
> > omap_gpio_init();
> >
> > diff --git a/arch/arm/mach-omap2/board-omap2evm.c
> > b/arch/arm/mach-omap2/board-omap2evm.c
> > index 4fac1be..56a26d4 100644
> > --- a/arch/arm/mach-omap2/board-omap2evm.c
> > +++ b/arch/arm/mach-omap2/board-omap2evm.c
> > @@ -276,7 +276,7 @@ static struct twl4030_keypad_data omap2evm_kp_data =
> > {
> >
> > static void __init omap2_evm_init_irq(void)
> > {
> > - omap2_init_common_hw(NULL, NULL, NULL, NULL);
> > + omap2_init_common_hw(NULL, NULL, NULL, NULL, NULL);
> > omap_init_irq();
> > omap_gpio_init();
> > omap2evm_init_smc911x();
> > diff --git a/arch/arm/mach-omap2/board-omap3beagle.c
> > b/arch/arm/mach-omap2/board-omap3beagle.c
> > index 7294dbf..872beb6 100644
> > --- a/arch/arm/mach-omap2/board-omap3beagle.c
> > +++ b/arch/arm/mach-omap2/board-omap3beagle.c
> > @@ -312,8 +312,11 @@ static int __init omap3_beagle_i2c_init(void)
> >
> > static void __init omap3_beagle_init_irq(void)
> > {
> > - omap2_init_common_hw(mt46h32m32lf6_sdrc_params, omap3_mpu_rate_table,
> > - omap3_dsp_rate_table, omap3_l3_rate_table);
> > + omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
> > + mt46h32m32lf6_sdrc_params,
> > + omap3_mpu_rate_table,
> > + omap3_dsp_rate_table,
> > + omap3_l3_rate_table);
> > omap_init_irq();
> > omap_gpio_init();
> > }
> > @@ -441,6 +444,10 @@ static void __init omap3_beagle_init(void)
> > usb_musb_init();
> > usb_ehci_init();
> > omap3beagle_flash_init();
> > +
> > + /* Ensure SDRC pins are mux'd for self-refresh */
> > + omap_cfg_reg(H16_34XX_SDRC_CKE0);
> > + omap_cfg_reg(H17_34XX_SDRC_CKE1);
> > }
> >
> > static void __init omap3_beagle_map_io(void)
> > diff --git a/arch/arm/mach-omap2/board-omap3evm.c
> > b/arch/arm/mach-omap2/board-omap3evm.c
> > index f017f0d..3b9c96a 100644
> > --- a/arch/arm/mach-omap2/board-omap3evm.c
> > +++ b/arch/arm/mach-omap2/board-omap3evm.c
> > @@ -276,8 +276,10 @@ struct spi_board_info omap3evm_spi_board_info[] = {
> >
> > static void __init omap3_evm_init_irq(void)
> > {
> > - omap2_init_common_hw(mt46h32m32lf6_sdrc_params, omap3_mpu_rate_table,
> > - omap3_dsp_rate_table, omap3_l3_rate_table);
> > + omap2_init_common_hw(mt46h32m32lf6_sdrc_params, NULL,
> > + omap3_mpu_rate_table,
> > + omap3_dsp_rate_table,
> > + omap3_l3_rate_table);
> > omap_init_irq();
> > omap_gpio_init();
> > omap3evm_init_smc911x();
> > diff --git a/arch/arm/mach-omap2/board-omap3pandora.c
> > b/arch/arm/mach-omap2/board-omap3pandora.c
> > index c67f62f..05ab99e 100644
> > --- a/arch/arm/mach-omap2/board-omap3pandora.c
> > +++ b/arch/arm/mach-omap2/board-omap3pandora.c
> > @@ -220,7 +220,8 @@ static int __init omap3pandora_i2c_init(void)
> >
> > static void __init omap3pandora_init_irq(void)
> > {
> > - omap2_init_common_hw(mt46h32m32lf6_sdrc_params);
> > + omap2_init_common_hw(mt46h32m32lf6_sdrc_params, NULL,
> > + NULL, NULL, NULL);
> > omap_init_irq();
> > omap_gpio_init();
> > }
> > diff --git a/arch/arm/mach-omap2/board-overo.c
> > b/arch/arm/mach-omap2/board-overo.c
> > index 9eae608..50902d4 100644
> > --- a/arch/arm/mach-omap2/board-overo.c
> > +++ b/arch/arm/mach-omap2/board-overo.c
> > @@ -45,6 +45,7 @@
> > #include <mach/gpmc.h>
> > #include <mach/hardware.h>
> > #include <mach/nand.h>
> > +#include <mach/mux.h>
> > #include <mach/usb.h>
> >
> > #include "sdram-micron-mt46h32m32lf-6.h"
> > @@ -355,7 +356,9 @@ static int __init overo_i2c_init(void)
> >
> > static void __init overo_init_irq(void)
> > {
> > - omap2_init_common_hw(mt46h32m32lf6_sdrc_params, NULL, NULL, NULL);
> > + omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
> > + mt46h32m32lf6_sdrc_params,
> > + NULL, NULL, NULL);
> > omap_init_irq();
> > omap_gpio_init();
> > }
> > @@ -391,6 +394,10 @@ static void __init overo_init(void)
> > overo_init_smsc911x();
> > overo_ads7846_init();
> >
> > + /* Ensure SDRC pins are mux'd for self-refresh */
> > + omap_cfg_reg(H16_34XX_SDRC_CKE0);
> > + omap_cfg_reg(H17_34XX_SDRC_CKE1);
> > +
> > if ((gpio_request(OVERO_GPIO_W2W_NRESET,
> > "OVERO_GPIO_W2W_NRESET") == 0) &&
> > (gpio_direction_output(OVERO_GPIO_W2W_NRESET, 1) == 0)) {
> > diff --git a/arch/arm/mach-omap2/board-rx51.c
> > b/arch/arm/mach-omap2/board-rx51.c
> > index 09035b0..d48459f 100644
> > --- a/arch/arm/mach-omap2/board-rx51.c
> > +++ b/arch/arm/mach-omap2/board-rx51.c
> > @@ -64,8 +64,10 @@ static struct omap_board_config_kernel rx51_config[] =
> > {
> >
> > static void __init rx51_init_irq(void)
> > {
> > - omap2_init_common_hw(rx51_get_sdram_timings(), omap3_mpu_rate_table,
> > - omap3_dsp_rate_table, omap3_l3_rate_table);
> > + omap2_init_common_hw(rx51_get_sdram_timings(), NULL,
> > + omap3_mpu_rate_table,
> > + omap3_dsp_rate_table,
> > + omap3_l3_rate_table);
> > omap_init_irq();
> > omap_gpio_init();
> > }
> > diff --git a/arch/arm/mach-omap2/clock34xx.c
> > b/arch/arm/mach-omap2/clock34xx.c index 3cee6b4..f262787 100644
> > --- a/arch/arm/mach-omap2/clock34xx.c
> > +++ b/arch/arm/mach-omap2/clock34xx.c
> > @@ -478,7 +478,9 @@ static int omap3_core_dpll_m2_set_rate(struct clk
> > *clk, unsigned long rate)
> > u32 unlock_dll = 0;
> > u32 c;
> > unsigned long validrate, sdrcrate, mpurate;
> > - struct omap_sdrc_params *sp;
> > + struct omap_sdrc_params *sdrc_cs0;
> > + struct omap_sdrc_params *sdrc_cs1;
> > + int ret;
> >
> > if (!clk || !rate)
> > return -EINVAL;
> > @@ -496,8 +498,8 @@ static int omap3_core_dpll_m2_set_rate(struct clk
> > *clk, unsigned long rate)
> > else
> > sdrcrate >>= ((clk->rate / rate) >> 1);
> >
> > - sp = omap2_sdrc_get_params(sdrcrate);
> > - if (!sp)
> > + ret = omap2_sdrc_get_params(sdrcrate, &sdrc_cs0, &sdrc_cs1);
> > + if (ret)
> > return -EINVAL;
> >
> > if (sdrcrate < MIN_SDRC_DLL_LOCK_FREQ) {
> > @@ -518,12 +520,29 @@ static int omap3_core_dpll_m2_set_rate(struct clk
> > *clk, unsigned long rate)
> >
> > pr_debug("clock: changing CORE DPLL rate from %lu to %lu\n", clk->rate,
> > validrate);
> > - pr_debug("clock: SDRC timing params used: %08x %08x %08x\n",
> > - sp->rfr_ctrl, sp->actim_ctrla, sp->actim_ctrlb);
> > -
> > - omap3_configure_core_dpll(sp->rfr_ctrl, sp->actim_ctrla,
> > - sp->actim_ctrlb, new_div, unlock_dll, c,
> > - sp->mr, rate > clk->rate);
> > + pr_debug("clock: SDRC CS0 timing params used:"
> > + " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
> > + sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
> > + sdrc_cs0->actim_ctrlb, sdrc_cs0->mr);
> > + if (sdrc_cs1)
> > + pr_debug("clock: SDRC CS1 timing params used: "
> > + " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
> > + sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
> > + sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
> > +
> > + if (sdrc_cs1)
> > + omap3_configure_core_dpll(
> > + new_div, unlock_dll, c, rate > clk->rate,
> > + sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
> > + sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
> > + sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
> > + sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
> > + else
> > + omap3_configure_core_dpll(
> > + new_div, unlock_dll, c, rate > clk->rate,
> > + sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
> > + sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
> > + 0, 0, 0, 0);
> >
> > return 0;
> > }
> > diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
> > index 6fb6c29..aa000b4 100644
> > --- a/arch/arm/mach-omap2/io.c
> > +++ b/arch/arm/mach-omap2/io.c
> > @@ -231,7 +231,8 @@ static int __init _omap2_init_reprogram_sdrc(void)
> > return v;
> > }
> >
> > -void __init omap2_init_common_hw(struct omap_sdrc_params *sp,
> > +void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
> > + struct omap_sdrc_params *sdrc_cs1,
> > struct omap_opp *mpu_opps,
> > struct omap_opp *dsp_opps,
> > struct omap_opp *l3_opps)
> > @@ -244,7 +245,7 @@ void __init omap2_init_common_hw(struct
> > omap_sdrc_params *sp,
> > omapdev_init(omapdevs);
> > omap2_clk_init();
> > omap_pm_if_init();
> > - omap2_sdrc_init(sp);
> > + omap2_sdrc_init(sdrc_cs0, sdrc_cs1);
> >
> > _omap2_init_reprogram_sdrc();
> >
> > diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
> > index 026c4fc..43d6b92 100644
> > --- a/arch/arm/mach-omap2/mux.c
> > +++ b/arch/arm/mach-omap2/mux.c
> > @@ -486,6 +486,12 @@ MUX_CFG_34XX("H19_34XX_GPIO164_OUT", 0x19c,
> > OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
> > MUX_CFG_34XX("J25_34XX_GPIO170", 0x1c6,
> > OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
> > +
> > +/* OMAP3 SDRC CKE signals to SDR/DDR ram chips */
> > +MUX_CFG_34XX("H16_34XX_SDRC_CKE0", 0x262,
> > + OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
> > +MUX_CFG_34XX("H17_34XX_SDRC_CKE1", 0x264,
> > + OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
> > };
> >
> > #define OMAP34XX_PINS_SZ ARRAY_SIZE(omap34xx_pins)
> > diff --git a/arch/arm/mach-omap2/sdrc.c b/arch/arm/mach-omap2/sdrc.c
> > index c832d83..b42f5ae 100644
> > --- a/arch/arm/mach-omap2/sdrc.c
> > +++ b/arch/arm/mach-omap2/sdrc.c
> > @@ -32,7 +32,7 @@
> > #include <mach/sdrc.h>
> > #include "sdrc.h"
> >
> > -static struct omap_sdrc_params *sdrc_init_params;
> > +static struct omap_sdrc_params *sdrc_init_params_cs0,
> > *sdrc_init_params_cs1;
> >
> > void __iomem *omap2_sdrc_base;
> > void __iomem *omap2_sms_base;
> > @@ -71,33 +71,49 @@ void omap2_sms_restore_context(void)
> > /**
> > * omap2_sdrc_get_params - return SDRC register values for a given clock
> > rate * @r: SDRC clock rate (in Hz)
> > + * @sdrc_cs0: chip select 0 ram timings **
> > + * @sdrc_cs1: chip select 1 ram timings **
> > *
> > * Return pre-calculated values for the SDRC_ACTIM_CTRLA,
> > - * SDRC_ACTIM_CTRLB, SDRC_RFR_CTRL, and SDRC_MR registers, for a given
> > - * SDRC clock rate 'r'. These parameters control various timing
> > - * delays in the SDRAM controller that are expressed in terms of the
> > - * number of SDRC clock cycles to wait; hence the clock rate
> > - * dependency. Note that sdrc_init_params must be sorted rate
> > - * descending. Also assumes that both chip-selects use the same
> > - * timing parameters. Returns a struct omap_sdrc_params * upon
> > - * success, or NULL upon failure.
> > + * SDRC_ACTIM_CTRLB, SDRC_RFR_CTRL and SDRC_MR registers in sdrc_cs[01]
> > + * structs,for a given SDRC clock rate 'r'.
> > + * These parameters control various timing delays in the SDRAM
> > controller + * that are expressed in terms of the number of SDRC clock
> > cycles to + * wait; hence the clock rate dependency.
> > + *
> > + * Supports 2 different timing parameters for both chip selects.
> > + *
> > + * Note 1: the sdrc_init_params_cs[01] must be sorted rate descending.
> > + * Note 2: If sdrc_init_params_cs_1 is not NULL it must be of same size
> > + * as sdrc_init_params_cs_0.
> > + *
> > + * Fills in the struct omap_sdrc_params * for each chip select.
> > + * Returns 0 upon success or -1 upon failure.
> > */
> > -struct omap_sdrc_params *omap2_sdrc_get_params(unsigned long r)
> > +int omap2_sdrc_get_params(unsigned long r,
> > + struct omap_sdrc_params **sdrc_cs0,
> > + struct omap_sdrc_params **sdrc_cs1)
> > {
> > - struct omap_sdrc_params *sp;
> > + struct omap_sdrc_params *sp0, *sp1;
> >
> > - if (!sdrc_init_params)
> > - return NULL;
> > + if (!sdrc_init_params_cs0)
> > + return -1;
> >
> > - sp = sdrc_init_params;
> > + sp0 = sdrc_init_params_cs0;
> > + sp1 = sdrc_init_params_cs1;
> >
> > - while (sp->rate && sp->rate != r)
> > - sp++;
> > + while (sp0->rate && sp0->rate != r) {
> > + sp0++;
> > + if (sdrc_init_params_cs1)
> > + sp1++;
> > + }
> >
> > - if (!sp->rate)
> > - return NULL;
> > + if (!sp0->rate)
> > + return -1;
> >
> > - return sp;
> > + *sdrc_cs0 = sp0;
> > + *sdrc_cs1 = sp1;
> > + return 0;
> > }
> >
> >
> > @@ -109,13 +125,15 @@ void __init omap2_set_globals_sdrc(struct
> > omap_globals *omap2_globals)
> >
> > /**
> > * omap2_sdrc_init - initialize SMS, SDRC devices on boot
> > - * @sp: pointer to a null-terminated list of struct omap_sdrc_params
> > + * @sdrc_cs[01]: pointers to a null-terminated list of struct
> > omap_sdrc_params
> > + * Support for 2 chip selects timings
> > *
> > * Turn on smart idle modes for SDRAM scheduler and controller.
> > * Program a known-good configuration for the SDRC to deal with buggy
> > * bootloaders.
> > */
> > -void __init omap2_sdrc_init(struct omap_sdrc_params *sp)
> > +void __init omap2_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
> > + struct omap_sdrc_params *sdrc_cs1)
> > {
> > u32 l;
> >
> > @@ -129,7 +147,8 @@ void __init omap2_sdrc_init(struct omap_sdrc_params
> > *sp) l |= (0x2 << 3);
> > sdrc_write_reg(l, SDRC_SYSCONFIG);
> >
> > - sdrc_init_params = sp;
> > + sdrc_init_params_cs0 = sdrc_cs0;
> > + sdrc_init_params_cs1 = sdrc_cs1;
> >
> > /* XXX Enable SRFRONIDLEREQ here also? */
> > l = (1 << SDRC_POWER_EXTCLKDIS_SHIFT) |
> > diff --git a/arch/arm/mach-omap2/sram34xx.S
> > b/arch/arm/mach-omap2/sram34xx.S index f41f8d9..3aef744 100644
> > --- a/arch/arm/mach-omap2/sram34xx.S
> > +++ b/arch/arm/mach-omap2/sram34xx.S
> > @@ -36,7 +36,7 @@
> >
> > .text
> >
> > -/* r4 parameters */
> > +/* r1 parameters */
> > #define SDRC_NO_UNLOCK_DLL 0x0
> > #define SDRC_UNLOCK_DLL 0x1
> >
> > @@ -71,40 +71,71 @@
> >
> > /*
> > * omap3_sram_configure_core_dpll - change DPLL3 M2 divider
> > - * r0 = new SDRC_RFR_CTRL register contents
> > - * r1 = new SDRC_ACTIM_CTRLA register contents
> > - * r2 = new SDRC_ACTIM_CTRLB register contents
> > - * r3 = new M2 divider setting (only 1 and 2 supported right now)
> > - * r4 = unlock SDRC DLL? (1 = yes, 0 = no). Only unlock DLL for
> > + *
> > + * Params passed in registers:
> > + * r0 = new M2 divider setting (only 1 and 2 supported right now)
> > + * r1 = unlock SDRC DLL? (1 = yes, 0 = no). Only unlock DLL for
> > * SDRC rates < 83MHz
> > - * r5 = number of MPU cycles to wait for SDRC to stabilize after
> > + * r2 = number of MPU cycles to wait for SDRC to stabilize after
> > * reprogramming the SDRC when switching to a slower MPU speed
> > - * r6 = new SDRC_MR_0 register value
> > - * r7 = increasing SDRC rate? (1 = yes, 0 = no)
> > + * r3 = increasing SDRC rate? (1 = yes, 0 = no)
> > + *
> > + * Params passed via the stack. The needed params will be copied in SRAM
> > + * before use by the code in SRAM (SDRAM is not accessible during SDRC
> > + * reconfiguration):
> > + * new SDRC_RFR_CTRL_0 register contents
> > + * new SDRC_ACTIM_CTRL_A_0 register contents
> > + * new SDRC_ACTIM_CTRL_B_0 register contents
> > + * new SDRC_MR_0 register value
> > + * new SDRC_RFR_CTRL_1 register contents
> > + * new SDRC_ACTIM_CTRL_A_1 register contents
> > + * new SDRC_ACTIM_CTRL_B_1 register contents
> > + * new SDRC_MR_1 register value
> > *
> > + * If the param SDRC_RFR_CTRL_1 is 0, the parameters
> > + * are not programmed into the SDRC CS1 registers
> > */
> > ENTRY(omap3_sram_configure_core_dpll)
> > stmfd sp!, {r1-r12, lr} @ store regs to stack
> > - ldr r4, [sp, #52] @ pull extra args off the stack
> > - ldr r5, [sp, #56] @ load extra args from the stack
> > - ldr r6, [sp, #60] @ load extra args from the stack
> > - ldr r7, [sp, #64] @ load extra args from the stack
> > +
> > + @ pull the extra args off the stack
> > + @ and store them in SRAM
> > + ldr r4, [sp, #52]
> > + str r4, omap_sdrc_rfr_ctrl_0_val
> > + ldr r4, [sp, #56]
> > + str r4, omap_sdrc_actim_ctrl_a_0_val
> > + ldr r4, [sp, #60]
> > + str r4, omap_sdrc_actim_ctrl_b_0_val
> > + ldr r4, [sp, #64]
> > + str r4, omap_sdrc_mr_0_val
> > + ldr r4, [sp, #68]
> > + str r4, omap_sdrc_rfr_ctrl_1_val
> > + cmp r4, #0 @ if SDRC_RFR_CTRL_1 is 0,
> > + beq skip_cs1_params @ do not use cs1 params
> > + ldr r4, [sp, #72]
> > + str r4, omap_sdrc_actim_ctrl_a_1_val
> > + ldr r4, [sp, #76]
> > + str r4, omap_sdrc_actim_ctrl_b_1_val
> > + ldr r4, [sp, #80]
> > + str r4, omap_sdrc_mr_1_val
> > +skip_cs1_params:
> > dsb @ flush buffered writes to interconnect
> > - cmp r7, #1 @ if increasing SDRC clk rate,
> > +
> > + cmp r3, #1 @ if increasing SDRC clk rate,
> > bleq configure_sdrc @ program the SDRC regs early (for RFR)
> > - cmp r4, #SDRC_UNLOCK_DLL @ set the intended DLL state
> > + cmp r1, #SDRC_UNLOCK_DLL @ set the intended DLL state
> > bleq unlock_dll
> > blne lock_dll
> > bl sdram_in_selfrefresh @ put SDRAM in self refresh, idle SDRC
> > bl configure_core_dpll @ change the DPLL3 M2 divider
> > bl enable_sdrc @ take SDRC out of idle
> > - cmp r4, #SDRC_UNLOCK_DLL @ wait for DLL status to change
> > + cmp r1, #SDRC_UNLOCK_DLL @ wait for DLL status to change
> > bleq wait_dll_unlock
> > blne wait_dll_lock
> > - cmp r7, #1 @ if increasing SDRC clk rate,
> > + cmp r3, #1 @ if increasing SDRC clk rate,
> > beq return_to_sdram @ return to SDRAM code, otherwise,
> > bl configure_sdrc @ reprogram SDRC regs now
> > - mov r12, r5
> > + mov r12, r2
> > bl wait_clk_stable @ wait for SDRC to stabilize
> > return_to_sdram:
> > isb @ prevent speculative exec past here
> > @@ -149,7 +180,7 @@ configure_core_dpll:
> > ldr r12, [r11]
> > ldr r10, core_m2_mask_val @ modify m2 for core dpll
> > and r12, r12, r10
> > - orr r12, r12, r3, lsl #CORE_DPLL_CLKOUT_DIV_SHIFT
> > + orr r12, r12, r0, lsl #CORE_DPLL_CLKOUT_DIV_SHIFT
> > str r12, [r11]
> > ldr r12, [r11] @ posted-write barrier for CM
> > bx lr
> > @@ -187,15 +218,34 @@ wait_dll_unlock:
> > bne wait_dll_unlock
> > bx lr
> > configure_sdrc:
> > - ldr r11, omap3_sdrc_rfr_ctrl
> > - str r0, [r11]
> > - ldr r11, omap3_sdrc_actim_ctrla
> > - str r1, [r11]
> > - ldr r11, omap3_sdrc_actim_ctrlb
> > - str r2, [r11]
> > + ldr r12, omap_sdrc_rfr_ctrl_0_val @ fetch value from SRAM
> > + ldr r11, omap3_sdrc_rfr_ctrl_0 @ fetch addr from SRAM
> > + str r12, [r11] @ store
> > + ldr r12, omap_sdrc_actim_ctrl_a_0_val
> > + ldr r11, omap3_sdrc_actim_ctrl_a_0
> > + str r12, [r11]
> > + ldr r12, omap_sdrc_actim_ctrl_b_0_val
> > + ldr r11, omap3_sdrc_actim_ctrl_b_0
> > + str r12, [r11]
> > + ldr r12, omap_sdrc_mr_0_val
> > ldr r11, omap3_sdrc_mr_0
> > - str r6, [r11]
> > - ldr r6, [r11] @ posted-write barrier for SDRC
> > + str r12, [r11]
> > + ldr r12, omap_sdrc_rfr_ctrl_1_val
> > + cmp r12, #0 @ if SDRC_RFR_CTRL_1 is 0,
> > + beq skip_cs1_prog @ do not program cs1 params
> > + ldr r11, omap3_sdrc_rfr_ctrl_1
> > + str r12, [r11]
> > + ldr r12, omap_sdrc_actim_ctrl_a_1_val
> > + ldr r11, omap3_sdrc_actim_ctrl_a_1
> > + str r12, [r11]
> > + ldr r12, omap_sdrc_actim_ctrl_b_1_val
> > + ldr r11, omap3_sdrc_actim_ctrl_b_1
> > + str r12, [r11]
> > + ldr r12, omap_sdrc_mr_1_val
> > + ldr r11, omap3_sdrc_mr_1
> > + str r12, [r11]
> > +skip_cs1_prog:
> > + ldr r12, [r11] @ posted-write barrier for SDRC
> > bx lr
> >
> > omap3_sdrc_power:
> > @@ -206,14 +256,40 @@ omap3_cm_idlest1_core:
> > .word OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST)
> > omap3_cm_iclken1_core:
> > .word OMAP34XX_CM_REGADDR(CORE_MOD, CM_ICLKEN1)
> > -omap3_sdrc_rfr_ctrl:
> > +
> > +omap3_sdrc_rfr_ctrl_0:
> > .word OMAP34XX_SDRC_REGADDR(SDRC_RFR_CTRL_0)
> > -omap3_sdrc_actim_ctrla:
> > +omap3_sdrc_rfr_ctrl_1:
> > + .word OMAP34XX_SDRC_REGADDR(SDRC_RFR_CTRL_1)
> > +omap3_sdrc_actim_ctrl_a_0:
> > .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_0)
> > -omap3_sdrc_actim_ctrlb:
> > +omap3_sdrc_actim_ctrl_a_1:
> > + .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_1)
> > +omap3_sdrc_actim_ctrl_b_0:
> > .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_0)
> > +omap3_sdrc_actim_ctrl_b_1:
> > + .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_1)
> > omap3_sdrc_mr_0:
> > .word OMAP34XX_SDRC_REGADDR(SDRC_MR_0)
> > +omap3_sdrc_mr_1:
> > + .word OMAP34XX_SDRC_REGADDR(SDRC_MR_1)
> > +omap_sdrc_rfr_ctrl_0_val:
> > + .word 0xDEADBEEF
> > +omap_sdrc_rfr_ctrl_1_val:
> > + .word 0xDEADBEEF
> > +omap_sdrc_actim_ctrl_a_0_val:
> > + .word 0xDEADBEEF
> > +omap_sdrc_actim_ctrl_a_1_val:
> > + .word 0xDEADBEEF
> > +omap_sdrc_actim_ctrl_b_0_val:
> > + .word 0xDEADBEEF
> > +omap_sdrc_actim_ctrl_b_1_val:
> > + .word 0xDEADBEEF
> > +omap_sdrc_mr_0_val:
> > + .word 0xDEADBEEF
> > +omap_sdrc_mr_1_val:
> > + .word 0xDEADBEEF
> > +
> > omap3_sdrc_dlla_status:
> > .word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
> > omap3_sdrc_dlla_ctrl:
> > @@ -223,3 +299,4 @@ core_m2_mask_val:
> >
> > ENTRY(omap3_sram_configure_core_dpll_sz)
> > .word . - omap3_sram_configure_core_dpll
> > +
> > diff --git a/arch/arm/plat-omap/include/mach/io.h
> > b/arch/arm/plat-omap/include/mach/io.h
> > index 54c159b..d4c78b4 100644
> > --- a/arch/arm/plat-omap/include/mach/io.h
> > +++ b/arch/arm/plat-omap/include/mach/io.h
> > @@ -192,7 +192,8 @@ extern void omap1_map_common_io(void);
> > extern void omap1_init_common_hw(void);
> >
> > extern void omap2_map_common_io(void);
> > -extern void omap2_init_common_hw(struct omap_sdrc_params *sp,
> > +extern void omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
> > + struct omap_sdrc_params *sdrc_cs1,
> > struct omap_opp *mpu_opps,
> > struct omap_opp *dsp_opps,
> > struct omap_opp *l3_opps);
> > diff --git a/arch/arm/plat-omap/include/mach/mux.h
> > b/arch/arm/plat-omap/include/mach/mux.h
> > index f7e298a..7368aba 100644
> > --- a/arch/arm/plat-omap/include/mach/mux.h
> > +++ b/arch/arm/plat-omap/include/mach/mux.h
> > @@ -803,6 +803,10 @@ enum omap34xx_index {
> > AE5_34XX_GPIO143,
> > H19_34XX_GPIO164_OUT,
> > J25_34XX_GPIO170,
> > +
> > + /* OMAP3 SDRC CKE signals to SDR/DDR ram chips */
> > + H16_34XX_SDRC_CKE0,
> > + H17_34XX_SDRC_CKE1,
> > };
> >
> > struct omap_mux_cfg {
> > diff --git a/arch/arm/plat-omap/include/mach/sdrc.h
> > b/arch/arm/plat-omap/include/mach/sdrc.h
> > index a678bc8..7e22143 100644
> > --- a/arch/arm/plat-omap/include/mach/sdrc.h
> > +++ b/arch/arm/plat-omap/include/mach/sdrc.h
> > @@ -114,9 +114,11 @@ struct omap_sdrc_params {
> >
> > void omap2_sms_save_context(void);
> > void omap2_sms_restore_context(void);
> > -void __init omap2_sdrc_init(struct omap_sdrc_params *);
> > -struct omap_sdrc_params *omap2_sdrc_get_params(unsigned long r);
> > -
> > +void __init omap2_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
> > + struct omap_sdrc_params *sdrc_cs1);
> > +int omap2_sdrc_get_params(unsigned long r,
> > + struct omap_sdrc_params **sdrc_cs0,
> > + struct omap_sdrc_params **sdrc_cs1);
> > #ifdef CONFIG_ARCH_OMAP2
> >
> > struct memory_timings {
> > diff --git a/arch/arm/plat-omap/include/mach/sram.h
> > b/arch/arm/plat-omap/include/mach/sram.h
> > index ad0a600..98906ea 100644
> > --- a/arch/arm/plat-omap/include/mach/sram.h
> > +++ b/arch/arm/plat-omap/include/mach/sram.h
> > @@ -21,11 +21,13 @@ extern void omap2_sram_reprogram_sdrc(u32 perf_level,
> > u32 dll_val,
> > u32 mem_type);
> > extern u32 omap2_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int
> > bypass);
> >
> > -extern u32 omap3_configure_core_dpll(u32 sdrc_rfr_ctrl,
> > - u32 sdrc_actim_ctrla,
> > - u32 sdrc_actim_ctrlb, u32 m2,
> > - u32 unlock_dll, u32 f, u32 sdrc_mr,
> > - u32 inc);
> > +extern u32 omap3_configure_core_dpll(
> > + u32 m2, u32 unlock_dll, u32 f, u32 inc,
> > + u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0,
> > + u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0,
> > + u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1,
> > + u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1);
> > +
> > extern void omap3_sram_restore_context(void);
> >
> > /* Do not use these */
> > @@ -61,11 +63,12 @@ extern void omap243x_sram_reprogram_sdrc(u32
> > perf_level, u32 dll_val,
> > extern unsigned long omap243x_sram_reprogram_sdrc_sz;
> >
> >
> > -extern u32 omap3_sram_configure_core_dpll(u32 sdrc_rfr_ctrl,
> > - u32 sdrc_actim_ctrla,
> > - u32 sdrc_actim_ctrlb, u32 m2,
> > - u32 unlock_dll, u32 f, u32 sdrc_mr,
> > - u32 inc);
> > +extern u32 omap3_sram_configure_core_dpll(
> > + u32 m2, u32 unlock_dll, u32 f, u32 inc,
> > + u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0,
> > + u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0,
> > + u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1,
> > + u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1);
> > extern unsigned long omap3_sram_configure_core_dpll_sz;
> >
> > #ifdef CONFIG_PM
> > diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c
> > index a2e60e7..517f45b 100644
> > --- a/arch/arm/plat-omap/sram.c
> > +++ b/arch/arm/plat-omap/sram.c
> > @@ -368,23 +368,29 @@ static inline int omap243x_sram_init(void)
> >
> > #ifdef CONFIG_ARCH_OMAP3
> >
> > -static u32 (*_omap3_sram_configure_core_dpll)(u32 sdrc_rfr_ctrl,
> > - u32 sdrc_actim_ctrla,
> > - u32 sdrc_actim_ctrlb,
> > - u32 m2, u32 unlock_dll,
> > - u32 f, u32 sdrc_mr, u32 inc);
> > -u32 omap3_configure_core_dpll(u32 sdrc_rfr_ctrl, u32 sdrc_actim_ctrla,
> > - u32 sdrc_actim_ctrlb, u32 m2, u32 unlock_dll,
> > - u32 f, u32 sdrc_mr, u32 inc)
> > - {
> > +static u32 (*_omap3_sram_configure_core_dpll)(
> > + u32 m2, u32 unlock_dll, u32 f, u32 inc,
> > + u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0,
> > + u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0,
> > + u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1,
> > + u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1);
> > +
> > +u32 omap3_configure_core_dpll(u32 m2, u32 unlock_dll, u32 f, u32 inc,
> > + u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0,
> > + u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0,
> > + u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1,
> > + u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1)
> > +{
> > if (!_omap3_sram_configure_core_dpll)
> > omap_sram_error();
> >
> > - return _omap3_sram_configure_core_dpll(sdrc_rfr_ctrl,
> > - sdrc_actim_ctrla,
> > - sdrc_actim_ctrlb, m2,
> > - unlock_dll, f, sdrc_mr, inc);
> > - }
> > + return _omap3_sram_configure_core_dpll(
> > + m2, unlock_dll, f, inc,
> > + sdrc_rfr_ctrl_0, sdrc_actim_ctrl_a_0,
> > + sdrc_actim_ctrl_b_0, sdrc_mr_0,
> > + sdrc_rfr_ctrl_1, sdrc_actim_ctrl_a_1,
> > + sdrc_actim_ctrl_b_1, sdrc_mr_1);
> > +}
> >
> > #ifdef CONFIG_PM
> > void omap3_sram_restore_context(void)
> > --
> > 1.6.2.5.168.g3823
> >
> > On Friday 05 June 2009 20:10:40 Paul Walmsley wrote:
> >> Hi Jean,
> >>
> >> On Fri, 5 Jun 2009, Jean Pihet wrote:
> >> > Here is the new patch that includes all the remarks and suggestion.
> >> > The description is here below.
> >> >
> >> > Some notes:
> >> > - all calls to omap2_init_common_hw have been adapted in the board
> >> > files. it looks like 2430SDP and Pandora board files are broken since
> >> > they use only one param. Can that be checked on those boards?
> >> > - it is assumed that RX51 only uses 1 CS. Is that correct?
> >> >
> >> > Can you review it and possibly merge?
> >>
> >> Looks great.
> >>
> >> Tero, does RX51 use two SDRC chipselects!
> >>
> >> Acked-by: Paul Walmsley <paul@pwsan.com>
> >>
> >> > Thanks & regards,
> >> > Jean
next prev parent reply other threads:[~2009-06-08 17:08 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-29 13:53 Beagleboard rev C memory timings & suspend/resume Jean Pihet
2009-05-06 23:39 ` Paul Walmsley
2009-05-07 11:18 ` Jean Pihet
2009-05-07 16:44 ` Jean Pihet
2009-05-07 18:59 ` Paul Walmsley
2009-05-08 7:05 ` Jean Pihet
2009-05-08 22:43 ` Paul Walmsley
2009-05-11 19:10 ` Jean Pihet
2009-05-11 20:27 ` Paul Walmsley
2009-05-26 13:27 ` [RFC][PATCH] OMAP3: add support for 2 SDRAM chip selects (was: Re: Beagleboard rev C memory timings & suspend/resume) Jean Pihet
2009-06-02 23:40 ` Paul Walmsley
2009-06-03 7:03 ` Jean Pihet
2009-06-05 15:35 ` Jean Pihet
2009-06-05 18:10 ` Paul Walmsley
2009-06-08 7:37 ` Tero.Kristo
2009-06-08 8:59 ` Jean Pihet
2009-06-08 14:59 ` Kevin Hilman
2009-06-08 17:08 ` Jean Pihet [this message]
2009-06-08 17:23 ` [RFC][PATCH] OMAP3: add support for 2 SDRAM chip selects Kevin Hilman
2009-06-09 8:14 ` Tero.Kristo
2009-06-09 8:23 ` Jean Pihet
2009-06-09 8:29 ` Tero.Kristo
2009-06-09 7:26 ` [RFC][PATCH] OMAP3: add support for 2 SDRAM chip selects (was: Re: Beagleboard rev C memory timings & suspend/resume) Paul Walmsley
2009-06-05 19:14 ` Paul Walmsley
2009-06-06 10:50 ` Grazvydas Ignotas
2009-06-08 9:02 ` Jean Pihet
2009-06-08 11:01 ` Grazvydas Ignotas
2009-06-08 17:11 ` Jean Pihet
2009-06-08 17:28 ` [RFC][PATCH] OMAP3: add support for 2 SDRAM chip selects Kevin Hilman
2009-05-07 19:18 ` Beagleboard rev C memory timings & suspend/resume Paul Walmsley
2009-05-08 8:13 ` Jean Pihet
2009-05-08 22:51 ` Paul Walmsley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200906081908.40649.jpihet@mvista.com \
--to=jpihet@mvista.com \
--cc=khilman@deeprootsystems.com \
--cc=linux-omap@vger.kernel.org \
--cc=paul@pwsan.com \
--cc=tero.kristo@nokia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox