2008-05-20 03:53:02 +04:00
/*
2005-04-17 02:20:36 +04:00
* init . c : Initialize internal variables used by the PROM
* library functions .
*
* Copyright ( C ) 1995 David S . Miller ( davem @ caip . rutgers . edu )
* Copyright ( C ) 1998 Jakub Jelinek ( jj @ sunsite . mff . cuni . cz )
*/
# include <linux/kernel.h>
# include <linux/init.h>
2009-01-09 03:58:05 +03:00
# include <linux/module.h>
2005-04-17 02:20:36 +04:00
# include <asm/openprom.h>
# include <asm/oplib.h>
struct linux_romvec * romvec ;
2009-01-09 03:58:05 +03:00
EXPORT_SYMBOL ( romvec ) ;
2005-04-17 02:20:36 +04:00
enum prom_major_version prom_vers ;
unsigned int prom_rev , prom_prev ;
/* The root node of the prom device tree. */
2010-10-09 01:18:11 +04:00
phandle prom_root_node ;
2009-01-09 03:58:05 +03:00
EXPORT_SYMBOL ( prom_root_node ) ;
2005-04-17 02:20:36 +04:00
/* Pointer to the device tree operations structure. */
struct linux_nodeops * prom_nodeops ;
/* You must call prom_init() before you attempt to use any of the
2012-06-20 10:58:06 +04:00
* routines in the prom library .
* It gets passed the pointer to the PROM vector .
2005-04-17 02:20:36 +04:00
*/
void __init prom_init ( struct linux_romvec * rp )
{
romvec = rp ;
switch ( romvec - > pv_romvers ) {
case 0 :
prom_vers = PROM_V0 ;
break ;
case 2 :
prom_vers = PROM_V2 ;
break ;
case 3 :
prom_vers = PROM_V3 ;
break ;
default :
prom_printf ( " PROMLIB: Bad PROM version %d \n " ,
romvec - > pv_romvers ) ;
prom_halt ( ) ;
break ;
2011-06-03 18:45:23 +04:00
}
2005-04-17 02:20:36 +04:00
prom_rev = romvec - > pv_plugin_revision ;
prom_prev = romvec - > pv_printrev ;
prom_nodeops = romvec - > pv_nodeops ;
prom_root_node = prom_getsibling ( 0 ) ;
2010-11-12 09:42:06 +03:00
if ( ( prom_root_node = = 0 ) | | ( ( s32 ) prom_root_node = = - 1 ) )
2005-04-17 02:20:36 +04:00
prom_halt ( ) ;
if ( ( ( ( unsigned long ) prom_nodeops ) = = 0 ) | |
( ( ( unsigned long ) prom_nodeops ) = = - 1 ) )
prom_halt ( ) ;
prom_meminit ( ) ;
prom_ranges_init ( ) ;
printk ( " PROMLIB: Sun Boot Prom Version %d Revision %d \n " ,
romvec - > pv_romvers , prom_rev ) ;
/* Initialization successful. */
}