diff options
Diffstat (limited to 'drivers/rtc/rtc-ds1307.c')
| -rw-r--r-- | drivers/rtc/rtc-ds1307.c | 52 | 
1 files changed, 43 insertions, 9 deletions
| diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 4e31036ee259..4ad97be48043 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -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, |