diff mbox series

drm/i915/dsi: Lookup the i2c bus from ACPI NS only if CONFIG_ACPI=y (v3)

Message ID 20200115205704.22674-1-vivek.kasireddy@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915/dsi: Lookup the i2c bus from ACPI NS only if CONFIG_ACPI=y (v3) | expand

Commit Message

Vivek Kasireddy Jan. 15, 2020, 8:57 p.m. UTC
Perform the i2c bus/adapter lookup from ACPI Namespace only if
ACPI is enabled in the kernel config. If ACPI is not enabled or if
the lookup fails, we'll fallback to using the VBT for identiying
the i2c bus.

v2: Clearly identify the commit this patch is fixing (Jani)

v3: Remove the i2c_bus_num >= 0 check from the adapter lookup function
as this would prevent ACPI bus number override. This check was mainly
there to return early if the bus number has already been found but we
anyway return in the next line if the slave address does not match.

Fixes: 8cbf89db2941 ("drm/i915/dsi: Parse the I2C element from the VBT MIPI sequence block (v3)")
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Nabendu Maiti <nabendu.bikash.maiti@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Cc: Bob Paauwe <bob.j.paauwe@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
Reported-by: Hulk Robot <hulkci@huawei.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dsi_vbt.c | 50 +++++++++++++-------
 1 file changed, 32 insertions(+), 18 deletions(-)

Comments

Jani Nikula Jan. 17, 2020, 11:24 a.m. UTC | #1
On Wed, 15 Jan 2020, Vivek Kasireddy <vivek.kasireddy@intel.com> wrote:
> Perform the i2c bus/adapter lookup from ACPI Namespace only if
> ACPI is enabled in the kernel config. If ACPI is not enabled or if
> the lookup fails, we'll fallback to using the VBT for identiying
> the i2c bus.
>
> v2: Clearly identify the commit this patch is fixing (Jani)
>
> v3: Remove the i2c_bus_num >= 0 check from the adapter lookup function
> as this would prevent ACPI bus number override. This check was mainly
> there to return early if the bus number has already been found but we
> anyway return in the next line if the slave address does not match.
>
> Fixes: 8cbf89db2941 ("drm/i915/dsi: Parse the I2C element from the VBT MIPI sequence block (v3)")
> Cc: Hans de Goede <hdegoede@redhat.com>
> Cc: Nabendu Maiti <nabendu.bikash.maiti@intel.com>
> Cc: Matt Roper <matthew.d.roper@intel.com>
> Cc: Bob Paauwe <bob.j.paauwe@intel.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Jani Nikula <jani.nikula@intel.com>
> Cc: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
> Reported-by: Hulk Robot <hulkci@huawei.com>
> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dsi_vbt.c | 50 +++++++++++++-------
>  1 file changed, 32 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c
> index 89fb0d90b694..04f953ba8f00 100644
> --- a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c
> +++ b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c
> @@ -384,6 +384,7 @@ static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data)
>  	return data;
>  }
>  
> +#ifdef CONFIG_ACPI
>  static int i2c_adapter_lookup(struct acpi_resource *ares, void *data)
>  {
>  	struct i2c_adapter_lookup *lookup = data;
> @@ -393,8 +394,7 @@ static int i2c_adapter_lookup(struct acpi_resource *ares, void *data)
>  	acpi_handle adapter_handle;
>  	acpi_status status;
>  
> -	if (intel_dsi->i2c_bus_num >= 0 ||
> -	    !i2c_acpi_get_i2c_resource(ares, &sb))
> +	if (!i2c_acpi_get_i2c_resource(ares, &sb))
>  		return 1;

The above hunk turns v3 of the patch from a straightforward build fix
into a functional change. They *must* be separate.

I've pushed v2 into drm-intel-next-queued, please send the above change
as a standalone fix that it rightly is, with its own commit message and
rationale.

BR,
Jani.



>  
>  	if (lookup->slave_addr != sb->slave_address)
> @@ -413,14 +413,41 @@ static int i2c_adapter_lookup(struct acpi_resource *ares, void *data)
>  	return 1;
>  }
>  
> -static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)
> +static void i2c_acpi_find_adapter(struct intel_dsi *intel_dsi,
> +				  const u16 slave_addr)
>  {
>  	struct drm_device *drm_dev = intel_dsi->base.base.dev;
>  	struct device *dev = &drm_dev->pdev->dev;
> -	struct i2c_adapter *adapter;
>  	struct acpi_device *acpi_dev;
>  	struct list_head resource_list;
>  	struct i2c_adapter_lookup lookup;
> +
> +	acpi_dev = ACPI_COMPANION(dev);
> +	if (acpi_dev) {
> +		memset(&lookup, 0, sizeof(lookup));
> +		lookup.slave_addr = slave_addr;
> +		lookup.intel_dsi = intel_dsi;
> +		lookup.dev_handle = acpi_device_handle(acpi_dev);
> +
> +		INIT_LIST_HEAD(&resource_list);
> +		acpi_dev_get_resources(acpi_dev, &resource_list,
> +				       i2c_adapter_lookup,
> +				       &lookup);
> +		acpi_dev_free_resource_list(&resource_list);
> +	}
> +}
> +#else
> +static inline void i2c_acpi_find_adapter(struct intel_dsi *intel_dsi,
> +					 const u16 slave_addr)
> +{
> +}
> +#endif
> +
> +static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)
> +{
> +	struct drm_device *drm_dev = intel_dsi->base.base.dev;
> +	struct device *dev = &drm_dev->pdev->dev;
> +	struct i2c_adapter *adapter;
>  	struct i2c_msg msg;
>  	int ret;
>  	u8 vbt_i2c_bus_num = *(data + 2);
> @@ -431,20 +458,7 @@ static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)
>  
>  	if (intel_dsi->i2c_bus_num < 0) {
>  		intel_dsi->i2c_bus_num = vbt_i2c_bus_num;
> -
> -		acpi_dev = ACPI_COMPANION(dev);
> -		if (acpi_dev) {
> -			memset(&lookup, 0, sizeof(lookup));
> -			lookup.slave_addr = slave_addr;
> -			lookup.intel_dsi = intel_dsi;
> -			lookup.dev_handle = acpi_device_handle(acpi_dev);
> -
> -			INIT_LIST_HEAD(&resource_list);
> -			acpi_dev_get_resources(acpi_dev, &resource_list,
> -					       i2c_adapter_lookup,
> -					       &lookup);
> -			acpi_dev_free_resource_list(&resource_list);
> -		}
> +		i2c_acpi_find_adapter(intel_dsi, slave_addr);
>  	}
>  
>  	adapter = i2c_get_adapter(intel_dsi->i2c_bus_num);
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c
index 89fb0d90b694..04f953ba8f00 100644
--- a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c
+++ b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c
@@ -384,6 +384,7 @@  static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data)
 	return data;
 }
 
+#ifdef CONFIG_ACPI
 static int i2c_adapter_lookup(struct acpi_resource *ares, void *data)
 {
 	struct i2c_adapter_lookup *lookup = data;
@@ -393,8 +394,7 @@  static int i2c_adapter_lookup(struct acpi_resource *ares, void *data)
 	acpi_handle adapter_handle;
 	acpi_status status;
 
-	if (intel_dsi->i2c_bus_num >= 0 ||
-	    !i2c_acpi_get_i2c_resource(ares, &sb))
+	if (!i2c_acpi_get_i2c_resource(ares, &sb))
 		return 1;
 
 	if (lookup->slave_addr != sb->slave_address)
@@ -413,14 +413,41 @@  static int i2c_adapter_lookup(struct acpi_resource *ares, void *data)
 	return 1;
 }
 
-static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)
+static void i2c_acpi_find_adapter(struct intel_dsi *intel_dsi,
+				  const u16 slave_addr)
 {
 	struct drm_device *drm_dev = intel_dsi->base.base.dev;
 	struct device *dev = &drm_dev->pdev->dev;
-	struct i2c_adapter *adapter;
 	struct acpi_device *acpi_dev;
 	struct list_head resource_list;
 	struct i2c_adapter_lookup lookup;
+
+	acpi_dev = ACPI_COMPANION(dev);
+	if (acpi_dev) {
+		memset(&lookup, 0, sizeof(lookup));
+		lookup.slave_addr = slave_addr;
+		lookup.intel_dsi = intel_dsi;
+		lookup.dev_handle = acpi_device_handle(acpi_dev);
+
+		INIT_LIST_HEAD(&resource_list);
+		acpi_dev_get_resources(acpi_dev, &resource_list,
+				       i2c_adapter_lookup,
+				       &lookup);
+		acpi_dev_free_resource_list(&resource_list);
+	}
+}
+#else
+static inline void i2c_acpi_find_adapter(struct intel_dsi *intel_dsi,
+					 const u16 slave_addr)
+{
+}
+#endif
+
+static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)
+{
+	struct drm_device *drm_dev = intel_dsi->base.base.dev;
+	struct device *dev = &drm_dev->pdev->dev;
+	struct i2c_adapter *adapter;
 	struct i2c_msg msg;
 	int ret;
 	u8 vbt_i2c_bus_num = *(data + 2);
@@ -431,20 +458,7 @@  static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)
 
 	if (intel_dsi->i2c_bus_num < 0) {
 		intel_dsi->i2c_bus_num = vbt_i2c_bus_num;
-
-		acpi_dev = ACPI_COMPANION(dev);
-		if (acpi_dev) {
-			memset(&lookup, 0, sizeof(lookup));
-			lookup.slave_addr = slave_addr;
-			lookup.intel_dsi = intel_dsi;
-			lookup.dev_handle = acpi_device_handle(acpi_dev);
-
-			INIT_LIST_HEAD(&resource_list);
-			acpi_dev_get_resources(acpi_dev, &resource_list,
-					       i2c_adapter_lookup,
-					       &lookup);
-			acpi_dev_free_resource_list(&resource_list);
-		}
+		i2c_acpi_find_adapter(intel_dsi, slave_addr);
 	}
 
 	adapter = i2c_get_adapter(intel_dsi->i2c_bus_num);