Commit 5763a474 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Wolfram Sang
Browse files

i2c: core: Unify the firmware node type check



OF and ACPI currently are using asymmetrical APIs to check
for the firmware node type. Unify them by using is_*_node()
against struct fwnode_handle pointer.

Tested-by: default avatarTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
parent a7de3fb3
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -490,6 +490,7 @@ static int i2c_smbus_host_notify_to_irq(const struct i2c_client *client)

static int i2c_device_probe(struct device *dev)
{
	struct fwnode_handle	*fwnode = dev_fwnode(dev);
	struct i2c_client	*client = i2c_verify_client(dev);
	struct i2c_driver	*driver;
	bool do_power_on;
@@ -508,11 +509,11 @@ static int i2c_device_probe(struct device *dev)
			/* Keep adapter active when Host Notify is required */
			pm_runtime_get_sync(&client->adapter->dev);
			irq = i2c_smbus_host_notify_to_irq(client);
		} else if (dev->of_node) {
		} else if (is_of_node(fwnode)) {
			irq = of_irq_get_byname(dev->of_node, "irq");
			if (irq == -EINVAL || irq == -ENODATA)
				irq = of_irq_get(dev->of_node, 0);
		} else if (ACPI_COMPANION(dev)) {
		} else if (is_acpi_device_node(fwnode)) {
			bool wake_capable;

			irq = i2c_acpi_get_irq(client, &wake_capable);
@@ -1054,16 +1055,18 @@ EXPORT_SYMBOL_GPL(i2c_new_client_device);
 */
void i2c_unregister_device(struct i2c_client *client)
{
	struct fwnode_handle *fwnode;

	if (IS_ERR_OR_NULL(client))
		return;

	if (client->dev.of_node) {
	fwnode = dev_fwnode(&client->dev);
	if (is_of_node(fwnode)) {
		of_node_clear_flag(client->dev.of_node, OF_POPULATED);
		of_node_put(client->dev.of_node);
	}

	if (ACPI_COMPANION(&client->dev))
	} else if (is_acpi_device_node(fwnode)) {
		acpi_device_clear_enumerated(ACPI_COMPANION(&client->dev));
	}

	device_remove_software_node(&client->dev);
	device_unregister(&client->dev);
+8 −4
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/of.h>
#include <linux/property.h>

#include "i2c-core.h"

@@ -108,15 +109,18 @@ EXPORT_SYMBOL_GPL(i2c_slave_event);
 */
bool i2c_detect_slave_mode(struct device *dev)
{
	if (IS_BUILTIN(CONFIG_OF) && dev->of_node) {
	struct fwnode_handle *fwnode = dev_fwnode(dev);

	if (is_of_node(fwnode)) {
		struct fwnode_handle *child __free(fwnode_handle) = NULL;
		u32 reg;

		for_each_child_of_node_scoped(dev->of_node, child) {
			of_property_read_u32(child, "reg", &reg);
		fwnode_for_each_child_node(fwnode, child) {
			fwnode_property_read_u32(child, "reg", &reg);
			if (reg & I2C_OWN_SLAVE_ADDRESS)
				return true;
		}
	} else if (IS_BUILTIN(CONFIG_ACPI) && ACPI_HANDLE(dev)) {
	} else if (is_acpi_device_node(fwnode)) {
		dev_dbg(dev, "ACPI slave is not supported yet\n");
	}
	return false;