@@ -212,10 +212,10 @@ int rk_board_late_init(void)
212212 return 0 ;
213213}
214214
215- int dtoverlay_apply (void * fdt , const char * dtoverlay , struct blk_desc * dev_desc )
215+ int dtoverlay_apply (void * fdt , const char * dtoverlay , struct blk_desc * dev_desc ,
216+ const char * root )
216217{
217218 char * paths [] = {
218- "" ,
219219 "overlays/" CONFIG_BOARDNAME "/" ,
220220 "rockchip/overlays/" CONFIG_BOARDNAME "/" ,
221221 };
@@ -229,7 +229,7 @@ int dtoverlay_apply(void *fdt, const char *dtoverlay, struct blk_desc *dev_desc)
229229 ulong fdt_dtbo = env_get_ulong ("loadaddr" , 16 , 0 );
230230
231231 for (i = 0 ; i < ARRAY_SIZE (paths ); i ++ ) {
232- snprintf (buf , sizeof (buf ), "%s%s.dtbo" , paths [i ], dtoverlay );
232+ snprintf (buf , sizeof (buf ), "%s%s%s .dtbo" , root , paths [i ], dtoverlay );
233233
234234 if (dev_desc )
235235 ret = load_from_mmc (fdt_dtbo , dev_desc -> devnum , 1 , buf );
@@ -247,49 +247,78 @@ int dtoverlay_apply(void *fdt, const char *dtoverlay, struct blk_desc *dev_desc)
247247 return -1 ;
248248}
249249
250+ static int load_boot_config (void )
251+ {
252+ int ret = - EINVAL ;
253+
254+ run_command_list (
255+ "load mmc 0:1 $loadaddr config.ini;"
256+ "ini generic $loadaddr" ,
257+ -1 , 0 );
258+
259+ char * overlay_profile = env_get ("overlay_profile" );
260+ if (overlay_profile ) {
261+ char buf [32 ];
262+ snprintf (buf , sizeof (buf ), "ini overlay_%s $loadaddr" , overlay_profile );
263+ run_command (buf , 0 );
264+ }
265+
266+ char * overlays = env_get ("overlays" );
267+ const char * token = strtok (overlays , " " );
268+ while (token != NULL ) {
269+ if (!strncmp (token , "display_" , 8 )) {
270+ ret = set_panel_name (token );
271+ break ;
272+ }
273+ token = strtok (NULL , " " );
274+ }
275+
276+ return ret ;
277+ }
278+
250279int board_read_dtb_file (void * fdt_addr )
251280{
252281 int ret ;
253282
254283 ret = load_from_cramfs ((unsigned long )fdt_addr , CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH );
255284 if (!ret ) {
256285 if (panel )
257- ret = dtoverlay_apply (fdt_addr , panel , NULL );
286+ ret = dtoverlay_apply (fdt_addr , panel , NULL , NULL );
258287 } else {
288+ load_boot_config ();
289+
259290 char * paths [] = {
260291 "dtb" ,
261292 "rockchip/" CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH ,
262293 };
263294 struct blk_desc * dev_desc = rockchip_get_bootdev ();
264295 int i ;
296+ char buf [1024 ];
297+ char root [1024 ];
298+
299+ char * kvers = env_get ("fk_kvers" );
300+ if (!kvers ) {
301+ /* Try to get kernel version from 'dtb' which must
302+ * be symbol link of device tree file in Linux
303+ */
304+ load_from_mmc ((unsigned long )fdt_addr , dev_desc -> devnum , 1 , "dtb" );
305+ }
306+
307+ kvers = env_get ("fk_kvers" );
308+ if (kvers ) {
309+ /* Set default device tree file with given kernel version */
310+ snprintf (root , sizeof (root ), "dtbs/%s/rockchip/" , kvers );
311+ strcpy (buf , root );
312+ strcat (buf , CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH );
313+
314+ paths [0 ] = buf ;
315+ }
265316
266317 for (i = 0 ; i < ARRAY_SIZE (paths ); i ++ ) {
267318 ret = load_from_mmc ((unsigned long )fdt_addr , dev_desc -> devnum , 1 , paths [i ]);
268319 if (!ret ) {
269- run_command_list (
270- "load mmc 0:1 $loadaddr config.ini;"
271- "ini generic $loadaddr" ,
272- -1 , 0 );
273-
274- char * overlay_profile = env_get ("overlay_profile" );
275- if (overlay_profile ) {
276- char buf [32 ];
277- snprintf (buf , sizeof (buf ), "ini overlay_%s $loadaddr" , overlay_profile );
278- run_command (buf , 0 );
279- }
280-
281- char * overlays = env_get ("overlays" );
282- const char * token = strtok (overlays , " " );
283- while (token != NULL ) {
284- if (!strncmp (token , "display_" , 8 )) {
285- set_panel_name (token );
286- break ;
287- }
288- token = strtok (NULL , " " );
289- }
290-
291320 if (panel )
292- ret = dtoverlay_apply (fdt_addr , panel , dev_desc );
321+ ret = dtoverlay_apply (fdt_addr , panel , dev_desc , root );
293322 break ;
294323 }
295324 }
0 commit comments