@ -143,50 +143,12 @@ struct lm78_data {
} ;
static int lm78_i2c_detect ( struct i2c_client * client ,
struct i2c_board_info * info ) ;
static int lm78_i2c_probe ( struct i2c_client * client ,
const struct i2c_device_id * id ) ;
static int lm78_i2c_remove ( struct i2c_client * client ) ;
static int __devinit lm78_isa_probe ( struct platform_device * pdev ) ;
static int __devexit lm78_isa_remove ( struct platform_device * pdev ) ;
static int lm78_read_value ( struct lm78_data * data , u8 reg ) ;
static int lm78_write_value ( struct lm78_data * data , u8 reg , u8 value ) ;
static struct lm78_data * lm78_update_device ( struct device * dev ) ;
static void lm78_init_device ( struct lm78_data * data ) ;
static const struct i2c_device_id lm78_i2c_id [ ] = {
{ " lm78 " , lm78 } ,
{ " lm79 " , lm79 } ,
{ }
} ;
MODULE_DEVICE_TABLE ( i2c , lm78_i2c_id ) ;
static struct i2c_driver lm78_driver = {
. class = I2C_CLASS_HWMON ,
. driver = {
. name = " lm78 " ,
} ,
. probe = lm78_i2c_probe ,
. remove = lm78_i2c_remove ,
. id_table = lm78_i2c_id ,
. detect = lm78_i2c_detect ,
. address_list = normal_i2c ,
} ;
static struct platform_driver lm78_isa_driver = {
. driver = {
. owner = THIS_MODULE ,
. name = " lm78 " ,
} ,
. probe = lm78_isa_probe ,
. remove = __devexit_p ( lm78_isa_remove ) ,
} ;
/* 7 Voltages */
static ssize_t show_in ( struct device * dev , struct device_attribute * da ,
char * buf )
@ -663,76 +625,24 @@ static int lm78_i2c_remove(struct i2c_client *client)
return 0 ;
}
static int __devinit lm78_isa_probe ( struct platform_device * pdev )
{
int err ;
struct lm78_data * data ;
struct resource * res ;
/* Reserve the ISA region */
res = platform_get_resource ( pdev , IORESOURCE_IO , 0 ) ;
if ( ! request_region ( res - > start + LM78_ADDR_REG_OFFSET , 2 , " lm78 " ) ) {
err = - EBUSY ;
goto exit ;
}
if ( ! ( data = kzalloc ( sizeof ( struct lm78_data ) , GFP_KERNEL ) ) ) {
err = - ENOMEM ;
goto exit_release_region ;
}
mutex_init ( & data - > lock ) ;
data - > isa_addr = res - > start ;
platform_set_drvdata ( pdev , data ) ;
if ( lm78_read_value ( data , LM78_REG_CHIPID ) & 0x80 ) {
data - > type = lm79 ;
data - > name = " lm79 " ;
} else {
data - > type = lm78 ;
data - > name = " lm78 " ;
}
/* Initialize the LM78 chip */
lm78_init_device ( data ) ;
/* Register sysfs hooks */
if ( ( err = sysfs_create_group ( & pdev - > dev . kobj , & lm78_group ) )
| | ( err = device_create_file ( & pdev - > dev , & dev_attr_name ) ) )
goto exit_remove_files ;
data - > hwmon_dev = hwmon_device_register ( & pdev - > dev ) ;
if ( IS_ERR ( data - > hwmon_dev ) ) {
err = PTR_ERR ( data - > hwmon_dev ) ;
goto exit_remove_files ;
}
return 0 ;
exit_remove_files :
sysfs_remove_group ( & pdev - > dev . kobj , & lm78_group ) ;
device_remove_file ( & pdev - > dev , & dev_attr_name ) ;
kfree ( data ) ;
exit_release_region :
release_region ( res - > start + LM78_ADDR_REG_OFFSET , 2 ) ;
exit :
return err ;
}
static int __devexit lm78_isa_remove ( struct platform_device * pdev )
{
struct lm78_data * data = platform_get_drvdata ( pdev ) ;
struct resource * res ;
hwmon_device_unregister ( data - > hwmon_dev ) ;
sysfs_remove_group ( & pdev - > dev . kobj , & lm78_group ) ;
device_remove_file ( & pdev - > dev , & dev_attr_name ) ;
kfree ( data ) ;
res = platform_get_resource ( pdev , IORESOURCE_IO , 0 ) ;
release_region ( res - > start + LM78_ADDR_REG_OFFSET , 2 ) ;
static const struct i2c_device_id lm78_i2c_id [ ] = {
{ " lm78 " , lm78 } ,
{ " lm79 " , lm79 } ,
{ }
} ;
MODULE_DEVICE_TABLE ( i2c , lm78_i2c_id ) ;
return 0 ;
}
static struct i2c_driver lm78_driver = {
. class = I2C_CLASS_HWMON ,
. driver = {
. name = " lm78 " ,
} ,
. probe = lm78_i2c_probe ,
. remove = lm78_i2c_remove ,
. id_table = lm78_i2c_id ,
. detect = lm78_i2c_detect ,
. address_list = normal_i2c ,
} ;
/* The SMBus locks itself, but ISA access must be locked explicitly!
We don ' t want to lock the whole ISA bus , so we lock each client
@ -849,6 +759,87 @@ static struct lm78_data *lm78_update_device(struct device *dev)
return data ;
}
static int __devinit lm78_isa_probe ( struct platform_device * pdev )
{
int err ;
struct lm78_data * data ;
struct resource * res ;
/* Reserve the ISA region */
res = platform_get_resource ( pdev , IORESOURCE_IO , 0 ) ;
if ( ! request_region ( res - > start + LM78_ADDR_REG_OFFSET , 2 , " lm78 " ) ) {
err = - EBUSY ;
goto exit ;
}
data = kzalloc ( sizeof ( struct lm78_data ) , GFP_KERNEL ) ;
if ( ! data ) {
err = - ENOMEM ;
goto exit_release_region ;
}
mutex_init ( & data - > lock ) ;
data - > isa_addr = res - > start ;
platform_set_drvdata ( pdev , data ) ;
if ( lm78_read_value ( data , LM78_REG_CHIPID ) & 0x80 ) {
data - > type = lm79 ;
data - > name = " lm79 " ;
} else {
data - > type = lm78 ;
data - > name = " lm78 " ;
}
/* Initialize the LM78 chip */
lm78_init_device ( data ) ;
/* Register sysfs hooks */
if ( ( err = sysfs_create_group ( & pdev - > dev . kobj , & lm78_group ) )
| | ( err = device_create_file ( & pdev - > dev , & dev_attr_name ) ) )
goto exit_remove_files ;
data - > hwmon_dev = hwmon_device_register ( & pdev - > dev ) ;
if ( IS_ERR ( data - > hwmon_dev ) ) {
err = PTR_ERR ( data - > hwmon_dev ) ;
goto exit_remove_files ;
}
return 0 ;
exit_remove_files :
sysfs_remove_group ( & pdev - > dev . kobj , & lm78_group ) ;
device_remove_file ( & pdev - > dev , & dev_attr_name ) ;
kfree ( data ) ;
exit_release_region :
release_region ( res - > start + LM78_ADDR_REG_OFFSET , 2 ) ;
exit :
return err ;
}
static int __devexit lm78_isa_remove ( struct platform_device * pdev )
{
struct lm78_data * data = platform_get_drvdata ( pdev ) ;
struct resource * res ;
hwmon_device_unregister ( data - > hwmon_dev ) ;
sysfs_remove_group ( & pdev - > dev . kobj , & lm78_group ) ;
device_remove_file ( & pdev - > dev , & dev_attr_name ) ;
kfree ( data ) ;
res = platform_get_resource ( pdev , IORESOURCE_IO , 0 ) ;
release_region ( res - > start + LM78_ADDR_REG_OFFSET , 2 ) ;
return 0 ;
}
static struct platform_driver lm78_isa_driver = {
. driver = {
. owner = THIS_MODULE ,
. name = " lm78 " ,
} ,
. probe = lm78_isa_probe ,
. remove = __devexit_p ( lm78_isa_remove ) ,
} ;
/* return 1 if a supported chip is found, 0 otherwise */
static int __init lm78_isa_found ( unsigned short address )
{