@@ -220,12 +220,29 @@ int rk_board_late_init(void)
220220 return 0 ;
221221}
222222
223+ static int __dtoverlay_apply (void * fdt , ulong dtbo , struct blk_desc * dev_desc , char * buf )
224+ {
225+ int ret ;
226+
227+ if (dev_desc )
228+ ret = load_from_mmc (dtbo , dev_desc -> devnum , 1 , buf );
229+ else
230+ ret = load_from_cramfs (dtbo , buf );
231+
232+ if (!ret ) {
233+ fdt_increase_size (fdt , fdt_totalsize (dtbo ));
234+ fdt_overlay_apply_verbose (fdt , (void * )dtbo );
235+ }
236+
237+ return ret ;
238+ }
239+
223240int dtoverlay_apply (void * fdt , const char * dtoverlay , struct blk_desc * dev_desc ,
224- const char * root )
241+ const char * root , char * * path )
225242{
226243 char * paths [] = {
227244 "overlays/" CONFIG_BOARDNAME "/" ,
228- "rockchip/overlays/ " CONFIG_BOARDNAME "/" ,
245+ "" CONFIG_BOARDNAME "/" ,
229246 };
230247 char buf [1024 ];
231248 int ret ;
@@ -236,17 +253,19 @@ int dtoverlay_apply(void *fdt, const char *dtoverlay, struct blk_desc *dev_desc,
236253
237254 ulong fdt_dtbo = env_get_ulong ("loadaddr" , 16 , 0 );
238255
256+ if (* path ) {
257+ snprintf (buf , sizeof (buf ), "%s%s%s.dtbo" , root ? root : "" , * path , dtoverlay );
258+
259+ return __dtoverlay_apply (fdt , fdt_dtbo , dev_desc , buf );
260+ }
261+
239262 for (i = 0 ; i < ARRAY_SIZE (paths ); i ++ ) {
240263 snprintf (buf , sizeof (buf ), "%s%s%s.dtbo" , root ? root : "" , paths [i ], dtoverlay );
241264
242- if (dev_desc )
243- ret = load_from_mmc (fdt_dtbo , dev_desc -> devnum , 1 , buf );
244- else
245- ret = load_from_cramfs (fdt_dtbo , buf );
246-
265+ ret = __dtoverlay_apply (fdt , fdt_dtbo , dev_desc , buf );
247266 if (!ret ) {
248- fdt_increase_size ( fdt , fdt_totalsize ( fdt_dtbo ));
249- fdt_overlay_apply_verbose ( fdt , ( void * ) fdt_dtbo );
267+ if ( path )
268+ * path = strdup ( paths [ i ] );
250269
251270 return 0 ;
252271 }
@@ -274,34 +293,23 @@ static int load_boot_config(struct blk_desc *dev_desc, char *config)
274293 run_command (buf , 0 );
275294 }
276295
277- char * overlays = env_get ("overlays" );
278- const char * token = strtok (overlays , " " );
279- while (token != NULL ) {
280- if (!strncmp (token , "display_" , 8 )) {
281- ret = set_panel_name (token );
282- break ;
283- }
284- token = strtok (NULL , " " );
285- }
286-
287296 return ret ;
288297}
289298
290299int board_read_dtb_file (void * fdt_addr )
291300{
292- char * paths [] = {
293- "dtb" ,
294- "rockchip/" CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH ,
295- } ;
301+ struct blk_desc * dev_desc = rockchip_get_bootdev ();
302+ char root [ 1024 ];
303+ char * rootptr = NULL ;
304+ char * dir = NULL ;
296305 int ret ;
297306
298307 ret = load_from_cramfs ((unsigned long )fdt_addr , CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH );
299- if (!ret ) {
300- if (panel )
301- dtoverlay_apply (fdt_addr , panel , NULL , NULL );
302- } else {
303- struct blk_desc * dev_desc = rockchip_get_bootdev ();
304- char root [1024 ];
308+ if (ret ) {
309+ char * paths [] = {
310+ "dtb" ,
311+ "rockchip/" CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH ,
312+ };
305313 char buf [1024 ];
306314 int i ;
307315
@@ -320,16 +328,37 @@ int board_read_dtb_file(void *fdt_addr)
320328 for (i = 0 ; i < ARRAY_SIZE (paths ); i ++ ) {
321329 ret = load_from_mmc ((unsigned long )fdt_addr ,
322330 dev_desc -> devnum , 1 , paths [i ]);
323- if (!ret ) {
324- if (panel ) {
325- dtoverlay_apply (fdt_addr ,
326- panel , dev_desc , root );
327- }
331+ if (!ret )
328332 break ;
329- }
330333 }
334+
335+ if (ret )
336+ return - ENOENT ;
337+
338+ rootptr = kvers ? root : NULL ;
331339 }
332340
341+ char * overlays = env_get ("overlays" );
342+ if (overlays ) {
343+ char * token = strtok (overlays , " " );
344+ int offset = 0 ;
345+
346+ while (token != NULL ) {
347+ dtoverlay_apply (fdt_addr , token , dev_desc , rootptr , & dir );
348+ offset += strlen (token ) + 1 ;
349+ token = strtok (overlays + offset , " " );
350+
351+ if (panel && !strcmp (token , panel ))
352+ panel = NULL ;
353+ }
354+ }
355+
356+ if (panel )
357+ dtoverlay_apply (fdt_addr , panel , dev_desc , rootptr , & dir );
358+
359+ if (dir )
360+ free (dir );
361+
333362 return fdt_check_header (fdt_addr );
334363}
335364
0 commit comments