2008-04-12 05:22:35 +10:00
/*
* OF helpers for the I2C API
*
* Copyright ( c ) 2008 Jochen Friedrich < jochen @ scram . de >
*
* Based on a previous patch from Jon Smirl < jonsmirl @ gmail . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*/
# include <linux/i2c.h>
# include <linux/of.h>
2008-07-08 06:38:24 -04:00
# include <linux/of_i2c.h>
2008-04-23 19:51:34 +10:00
# include <linux/module.h>
2008-04-12 05:22:35 +10:00
void of_register_i2c_devices ( struct i2c_adapter * adap ,
struct device_node * adap_node )
{
void * result ;
struct device_node * node ;
for_each_child_of_node ( adap_node , node ) {
struct i2c_board_info info = { } ;
const u32 * addr ;
int len ;
2008-07-25 22:25:13 -04:00
if ( of_modalias_node ( node , info . type , sizeof ( info . type ) ) < 0 )
continue ;
2008-04-12 05:22:35 +10:00
addr = of_get_property ( node , " reg " , & len ) ;
if ( ! addr | | len < sizeof ( int ) | | * addr > ( 1 < < 10 ) - 1 ) {
printk ( KERN_ERR
" of-i2c: invalid i2c device entry \n " ) ;
continue ;
}
info . irq = irq_of_parse_and_map ( node , 0 ) ;
info . addr = * addr ;
2008-10-20 02:13:15 +00:00
request_module ( " %s " , info . type ) ;
2008-04-12 05:22:35 +10:00
result = i2c_new_device ( adap , & info ) ;
if ( result = = NULL ) {
printk ( KERN_ERR
" of-i2c: Failed to load driver for %s \n " ,
info . type ) ;
irq_dispose_mapping ( info . irq ) ;
continue ;
}
}
}
EXPORT_SYMBOL ( of_register_i2c_devices ) ;
2008-04-23 19:51:34 +10:00
MODULE_LICENSE ( " GPL " ) ;