Hi Daniel, > Somehow detecting the RAM size in common/setup.c doesn't work here, it always > detects 64M and then crashes on devices with less RAM.
Strange. Probably memory aliasing has not been implemented in the SoC. > Probably using MEMC_REG_SDRAM_CFG1 to know the RAM size is how it could be, > for > now I use the mem=32M kernel parameter to get stuff working. Did you verify that the MEMC_REG_SDRAM_CFG1 contain sane values on your board? I saw several boards on other platforms where the register values related to the RAM size were bogus. That is one of the reasons why the current memory size detection has been implemented. More comments inline... > > Signed-off-by: Daniel Golle <[email protected]> > > diff --git > a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x.h > b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x.h > index 0afbb2f..c59135c 100644 > --- a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x.h > +++ b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x.h > @@ -22,6 +22,7 @@ enum rt305x_soc_type { > RT305X_SOC_RT3052, > RT305X_SOC_RT3350, > RT305X_SOC_RT3352, > + RT305X_SOC_RT5350, > }; > > extern enum rt305x_soc_type rt305x_soc; > @@ -51,6 +52,11 @@ static inline int soc_is_rt3352(void) > return rt305x_soc == RT305X_SOC_RT3352; > } > > +static inline int soc_is_rt5350(void) > +{ > + return rt305x_soc == RT305X_SOC_RT5350; > +} > + > #define RT305X_MEM_SIZE_MIN (2 * 1024 * 1024) > #define RT305X_MEM_SIZE_MAX (64 * 1024 * 1024) > > diff --git > a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_regs.h > b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_regs.h > index db037a5..930b333 100644 > --- > a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_regs.h > +++ > b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_regs.h > @@ -76,6 +76,9 @@ > #define RT3352_CHIP_NAME0 0x33335452 > #define RT3352_CHIP_NAME1 0x20203235 > > +#define RT5350_CHIP_NAME0 0x33355452 > +#define RT5350_CHIP_NAME1 0x20203035 > + > #define CHIP_ID_ID_MASK 0xff > #define CHIP_ID_ID_SHIFT 8 > #define CHIP_ID_REV_MASK 0xff > @@ -95,6 +98,12 @@ > #define RT3352_SYSCFG0_CPUCLK_LOW 0x0 > #define RT3352_SYSCFG0_CPUCLK_HIGH 0x1 > > +#define RT5350_SYSCFG0_CPUCLK_SHIFT 8 > +#define RT5350_SYSCFG0_CPUCLK_MASK 0x3 > +#define RT5350_SYSCFG0_CPUCLK_360 0x0 > +#define RT5350_SYSCFG0_CPUCLK_320 0x2 > +#define RT5350_SYSCFG0_CPUCLK_300 0x3 > + > #define RT3352_SYSCFG1_USB0_HOST_MODE BIT(10) > > #define RT3352_CLKCFG1_UPHY0_CLK_EN BIT(18) > diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/clock.c > b/target/linux/ramips/files/arch/mips/ralink/rt305x/clock.c > index 9585476..79b5a79 100644 > --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/clock.c > +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/clock.c > @@ -62,10 +62,28 @@ void __init rt305x_clocks_init(void) > rt305x_sys_clk.rate = rt305x_cpu_clk.rate / 3; > rt305x_uart_clk.rate = 40000000; > rt305x_wdt_clk.rate = rt305x_sys_clk.rate; > + } else if (soc_is_rt5350()) { > + t = (t >> RT5350_SYSCFG0_CPUCLK_SHIFT) & > + RT5350_SYSCFG0_CPUCLK_MASK; > + switch (t) { > + case RT5350_SYSCFG0_CPUCLK_360: > + rt305x_cpu_clk.rate = 360000000; > + rt305x_sys_clk.rate = rt305x_cpu_clk.rate / 3; > + break; > + case RT5350_SYSCFG0_CPUCLK_320: > + rt305x_cpu_clk.rate = 320000000; > + rt305x_sys_clk.rate = rt305x_cpu_clk.rate / 4; > + break; > + case RT5350_SYSCFG0_CPUCLK_300: > + rt305x_cpu_clk.rate = 300000000; > + rt305x_sys_clk.rate = rt305x_cpu_clk.rate / 3; > + break; There should be a default case, with a panic message. It would help to catch invalid values. > + } > + rt305x_uart_clk.rate = 40000000; > + rt305x_wdt_clk.rate = rt305x_sys_clk.rate; > } else { > BUG(); > } > - > } > > /* > diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c > b/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c > index 07e950a..a45564b 100644 > --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c > +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c > @@ -404,7 +404,7 @@ void __init rt305x_register_usb(void) > { > if (soc_is_rt305x() || soc_is_rt3350()) { > platform_device_register(&rt305x_dwc_otg_device); > - } else if (soc_is_rt3352()) { > + } else if (soc_is_rt3352() | soc_is_rt5350()) { This should be a '||' operand. > platform_device_register(&rt3352_ehci_device); > platform_device_register(&rt3352_ohci_device); > } else { > diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/rt305x.c > b/target/linux/ramips/files/arch/mips/ralink/rt305x/rt305x.c > index 179f9b7..856d869 100644 > --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/rt305x.c > +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/rt305x.c > @@ -54,6 +54,9 @@ void __init ramips_soc_prom_init(void) > } else if (n0 == RT3352_CHIP_NAME0 && n1 == RT3352_CHIP_NAME1) { > rt305x_soc = RT305X_SOC_RT3352; > name = "RT3352"; > + } else if (n0 == RT5350_CHIP_NAME0 && n1 == RT5350_CHIP_NAME1) { > + rt305x_soc = RT305X_SOC_RT5350; > + name = "RT5350"; > } else { > panic("rt305x: unknown SoC, n0:%08x n1:%08x\n", n0, n1); > } > @@ -68,7 +71,7 @@ void __init ramips_soc_prom_init(void) > > ramips_mem_base = RT305X_SDRAM_BASE; > > - if (soc_is_rt305x() || soc_is_rt3350()) { > + if (soc_is_rt305x() || soc_is_rt3350() || soc_is_rt5350()) { > ramips_mem_size_min = RT305X_MEM_SIZE_MIN; > ramips_mem_size_max = RT305X_MEM_SIZE_MAX; > } else if (soc_is_rt3352()) { > > > > _______________________________________________ > openwrt-devel mailing list > [email protected] > https://lists.openwrt.org/mailman/listinfo/openwrt-devel > _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/mailman/listinfo/openwrt-devel
