summaryrefslogtreecommitdiffstats
path: root/drivers/i2c/i2c-core.c
diff options
context:
space:
mode:
authorWolfram Sang <wsa@the-dreams.de>2016-07-19 05:54:56 +0200
committerWolfram Sang <wsa@the-dreams.de>2016-07-19 05:57:23 +0200
commit38d0fc4662474c6219166505d0a68b45a583fcfb (patch)
treefb014e8392c9b575e4bd656c36e603dd144d0ab1 /drivers/i2c/i2c-core.c
parentd380a20486b84895223d17a31d811a1195f6c50d (diff)
downloadlinux-stable-38d0fc4662474c6219166505d0a68b45a583fcfb.tar.gz
linux-stable-38d0fc4662474c6219166505d0a68b45a583fcfb.tar.bz2
linux-stable-38d0fc4662474c6219166505d0a68b45a583fcfb.zip
Revert "i2c: core: Add function for finding the bus speed from ACPI"
This reverts commit 55d38d060e999ca1a3ea6eb132105a0301e4cd04. There were too heavy merge conflicts and the driver code making use of this was not ready yet anyhow. So, we wait one cycle. Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r--drivers/i2c/i2c-core.c74
1 files changed, 15 insertions, 59 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index 347494a8750e..abe41369eec1 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -105,13 +105,11 @@ struct gsb_buffer {
struct i2c_acpi_lookup {
struct i2c_board_info *info;
- struct i2c_adapter *adapter; /* set only when registering slaves */
acpi_handle adapter_handle;
acpi_handle device_handle;
- u32 min_speed;
};
-static int i2c_acpi_find_resource(struct acpi_resource *ares, void *data)
+static int i2c_acpi_find_address(struct acpi_resource *ares, void *data)
{
struct i2c_acpi_lookup *lookup = data;
struct i2c_board_info *info = lookup->info;
@@ -137,20 +135,17 @@ static int i2c_acpi_find_resource(struct acpi_resource *ares, void *data)
info->addr = sb->slave_address;
if (sb->access_mode == ACPI_I2C_10BIT_MODE)
info->flags |= I2C_CLIENT_TEN;
- /* Save speed of the slowest device */
- if (sb->connection_speed < lookup->min_speed)
- lookup->min_speed = sb->connection_speed;
}
return 1;
}
-static acpi_status i2c_acpi_slave_lookup(acpi_handle handle, u32 level,
- void *data, void **return_value)
+static acpi_status i2c_acpi_add_device(acpi_handle handle, u32 level,
+ void *data, void **return_value)
{
- struct i2c_acpi_lookup *lookup = data;
- struct i2c_adapter *adapter = lookup->adapter;
+ struct i2c_adapter *adapter = data;
struct list_head resource_list;
+ struct i2c_acpi_lookup lookup;
struct resource_entry *entry;
struct i2c_board_info info;
struct acpi_device *adev;
@@ -164,8 +159,10 @@ static acpi_status i2c_acpi_slave_lookup(acpi_handle handle, u32 level,
memset(&info, 0, sizeof(info));
info.fwnode = acpi_fwnode_handle(adev);
- lookup->device_handle = handle;
- lookup->info = &info;
+ memset(&lookup, 0, sizeof(lookup));
+ lookup.adapter_handle = ACPI_HANDLE(&adapter->dev);
+ lookup.device_handle = handle;
+ lookup.info = &info;
/*
* Look up for I2cSerialBus resource with ResourceSource that
@@ -173,10 +170,10 @@ static acpi_status i2c_acpi_slave_lookup(acpi_handle handle, u32 level,
*/
INIT_LIST_HEAD(&resource_list);
ret = acpi_dev_get_resources(adev, &resource_list,
- i2c_acpi_find_resource, lookup);
+ i2c_acpi_find_address, &lookup);
acpi_dev_free_resource_list(&resource_list);
- if (ret < 0 || !info.addr || !lookup->adapter)
+ if (ret < 0 || !info.addr)
return AE_OK;
/* Then fill IRQ number if any */
@@ -207,14 +204,6 @@ static acpi_status i2c_acpi_slave_lookup(acpi_handle handle, u32 level,
#define I2C_ACPI_MAX_SCAN_DEPTH 32
-static acpi_status i2c_acpi_walk(struct i2c_acpi_lookup *lookup)
-{
- return acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
- I2C_ACPI_MAX_SCAN_DEPTH,
- i2c_acpi_slave_lookup, NULL,
- lookup, NULL);
-}
-
/**
* i2c_acpi_register_devices - enumerate I2C slave devices behind adapter
* @adap: pointer to adapter
@@ -225,52 +214,19 @@ static acpi_status i2c_acpi_walk(struct i2c_acpi_lookup *lookup)
*/
static void i2c_acpi_register_devices(struct i2c_adapter *adap)
{
- struct i2c_acpi_lookup lookup;
acpi_status status;
if (!has_acpi_companion(&adap->dev))
return;
- memset(&lookup, 0, sizeof(lookup));
- lookup.adapter = adap;
- lookup.adapter_handle = ACPI_HANDLE(&adap->dev);
-
- status = i2c_acpi_walk(&lookup);
+ status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
+ I2C_ACPI_MAX_SCAN_DEPTH,
+ i2c_acpi_add_device, NULL,
+ adap, NULL);
if (ACPI_FAILURE(status))
dev_warn(&adap->dev, "failed to enumerate I2C slaves\n");
}
-/**
- * i2c_acpi_find_bus_speed - find I2C bus speed from ACPI
- * @dev: The device owning the bus
- *
- * Find the I2C bus speed by walking the ACPI namespace for all I2C slaves
- * devices connected to this bus and use the speed of slowest device.
- *
- * Returns the speed in Hz or zero
- */
-u32 i2c_acpi_find_bus_speed(struct device *dev)
-{
- struct i2c_acpi_lookup lookup;
- acpi_status status;
-
- if (!has_acpi_companion(dev))
- return 0;
-
- memset(&lookup, 0, sizeof(lookup));
- lookup.adapter_handle = ACPI_HANDLE(dev);
- lookup.min_speed = UINT_MAX;
-
- status = i2c_acpi_walk(&lookup);
- if (ACPI_FAILURE(status)) {
- dev_warn(dev, "unable to find I2C bus speed from ACPI\n");
- return 0;
- }
-
- return lookup.min_speed != UINT_MAX ? lookup.min_speed : 0;
-}
-EXPORT_SYMBOL_GPL(i2c_acpi_find_bus_speed);
-
#else /* CONFIG_ACPI */
static inline void i2c_acpi_register_devices(struct i2c_adapter *adap) { }
#endif /* CONFIG_ACPI */