@ -11,6 +11,7 @@
* published by the Free Software Foundation .
*/
# include <linux/acpi.h>
# include <linux/bcd.h>
# include <linux/i2c.h>
# include <linux/init.h>
@ -191,6 +192,26 @@ static const struct i2c_device_id ds1307_id[] = {
} ;
MODULE_DEVICE_TABLE ( i2c , ds1307_id ) ;
# ifdef CONFIG_ACPI
static const struct acpi_device_id ds1307_acpi_ids [ ] = {
{ . id = " DS1307 " , . driver_data = ds_1307 } ,
{ . id = " DS1337 " , . driver_data = ds_1337 } ,
{ . id = " DS1338 " , . driver_data = ds_1338 } ,
{ . id = " DS1339 " , . driver_data = ds_1339 } ,
{ . id = " DS1388 " , . driver_data = ds_1388 } ,
{ . id = " DS1340 " , . driver_data = ds_1340 } ,
{ . id = " DS3231 " , . driver_data = ds_3231 } ,
{ . id = " M41T00 " , . driver_data = m41t00 } ,
{ . id = " MCP7940X " , . driver_data = mcp794xx } ,
{ . id = " MCP7941X " , . driver_data = mcp794xx } ,
{ . id = " PT7C4338 " , . driver_data = ds_1307 } ,
{ . id = " RX8025 " , . driver_data = rx_8025 } ,
{ . id = " ISL12057 " , . driver_data = ds_1337 } ,
{ }
} ;
MODULE_DEVICE_TABLE ( acpi , ds1307_acpi_ids ) ;
# endif
/*----------------------------------------------------------------------*/
# define BLOCK_DATA_MAX_TRIES 10
@ -874,17 +895,17 @@ static u8 do_trickle_setup_ds1339(struct i2c_client *client,
return setup ;
}
static void ds1307_trickle_of_ init ( struct i2c_client * client ,
struct chip_desc * chip )
static void ds1307_trickle_init ( struct i2c_client * client ,
struct chip_desc * chip )
{
uint32_t ohms = 0 ;
bool diode = true ;
if ( ! chip - > do_trickle_setup )
goto out ;
if ( of_property_read_u32 ( client - > dev . of_node , " trickle-resistor-ohms " , & ohms ) )
if ( device_property_read_u32 ( & client - > dev , " trickle-resistor-ohms " , & ohms ) )
goto out ;
if ( of_property_read_bool ( client - > dev . of_node , " trickle-diode-disable " ) )
if ( device_property_read_bool ( & client - > dev , " trickle-diode-disable " ) )
diode = false ;
chip - > trickle_charger_setup = chip - > do_trickle_setup ( client ,
ohms , diode ) ;
@ -1268,7 +1289,7 @@ static int ds1307_probe(struct i2c_client *client,
struct ds1307 * ds1307 ;
int err = - ENODEV ;
int tmp , wday ;
struct chip_desc * chip = & chips [ id - > driver_data ] ;
struct chip_desc * chip ;
struct i2c_adapter * adapter = to_i2c_adapter ( client - > dev . parent ) ;
bool want_irq = false ;
bool ds1307_can_wakeup_device = false ;
@ -1297,11 +1318,23 @@ static int ds1307_probe(struct i2c_client *client,
i2c_set_clientdata ( client , ds1307 ) ;
ds1307 - > client = client ;
ds1307 - > type = id - > driver_data ;
if ( id ) {
chip = & chips [ id - > driver_data ] ;
ds1307 - > type = id - > driver_data ;
} else {
const struct acpi_device_id * acpi_id ;
acpi_id = acpi_match_device ( ACPI_PTR ( ds1307_acpi_ids ) ,
& client - > dev ) ;
if ( ! acpi_id )
return - ENODEV ;
chip = & chips [ acpi_id - > driver_data ] ;
ds1307 - > type = acpi_id - > driver_data ;
}
if ( ! pdata & & client - > dev . of_node )
ds1307_trickle_of_init ( client , chip ) ;
else if ( pdata & & pdata - > trickle_charger_setup )
if ( ! pdata )
ds1307_trickle_init ( client , chip ) ;
else if ( pdata - > trickle_charger_setup )
chip - > trickle_charger_setup = pdata - > trickle_charger_setup ;
if ( chip - > trickle_charger_setup & & chip - > trickle_charger_reg ) {
@ -1678,6 +1711,7 @@ static int ds1307_remove(struct i2c_client *client)
static struct i2c_driver ds1307_driver = {
. driver = {
. name = " rtc-ds1307 " ,
. acpi_match_table = ACPI_PTR ( ds1307_acpi_ids ) ,
} ,
. probe = ds1307_probe ,
. remove = ds1307_remove ,