On Monday 08 June 2009 16:59:36 Kevin Hilman wrote: > Jean Pihet <jpihet@xxxxxxxxxx> 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@xxxxxxxxxx> > > 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@xxxxxxxxxx> > > --- > > 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@xxxxxxxxx> > >> > >> > Thanks & regards, > >> > Jean -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html