Currently for executing the i2c MIPI sequence, we are relaying on the i2c bus bunmber which is specified in the VBT. Signed-off-by: Deepak M <m.deepak@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_dma.c | 2 ++ drivers/gpu/drm/i915/i915_drv.h | 7 ++++++ drivers/gpu/drm/i915/intel_acpi.c | 49 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 1c6d227..8cd1d9d 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -387,6 +387,8 @@ static int i915_load_modeset_init(struct drm_device *dev) intel_register_dsm_handler(); + intel_acpi_find_i2c(dev_priv); + ret = vga_switcheroo_register_client(dev->pdev, &i915_switcheroo_ops, false); if (ret) goto cleanup_vga_client; diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 6644c2e..6fe8b64 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -47,6 +47,7 @@ #include <drm/intel-gtt.h> #include <drm/drm_legacy.h> /* for struct drm_dma_handle */ #include <drm/drm_gem.h> +#include <linux/acpi.h> #include <linux/backlight.h> #include <linux/hashtable.h> #include <linux/intel-iommu.h> @@ -1880,6 +1881,11 @@ struct drm_i915_private { struct i915_workarounds workarounds; + struct { + int i2c_bus_number; + int i2c_slave_address; + } acpi_data; + /* Reclocking support */ bool render_reclock_avail; @@ -3426,6 +3432,7 @@ intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state) #ifdef CONFIG_ACPI extern void intel_register_dsm_handler(void); extern void intel_unregister_dsm_handler(void); +extern acpi_status intel_acpi_find_i2c(struct drm_i915_private *dev_priv); #else static inline void intel_register_dsm_handler(void) { return; } static inline void intel_unregister_dsm_handler(void) { return; } diff --git a/drivers/gpu/drm/i915/intel_acpi.c b/drivers/gpu/drm/i915/intel_acpi.c index eb638a1..f62be5c 100644 --- a/drivers/gpu/drm/i915/intel_acpi.c +++ b/drivers/gpu/drm/i915/intel_acpi.c @@ -110,6 +110,55 @@ static void intel_dsm_platform_mux_info(void) ACPI_FREE(pkg); } +static int i2c_acpi_get_name(struct acpi_resource *ares, void *data) +{ + struct drm_i915_private *dev_priv = data; + struct acpi_resource_i2c_serialbus *sb; + unsigned int val; + char *resource; + int error; + + if (ares->type == ACPI_RESOURCE_TYPE_SERIAL_BUS) { + sb = &ares->data.i2c_serial_bus; + + if (sb->type == ACPI_RESOURCE_SERIAL_TYPE_I2C) { + resource = sb->resource_source.string_ptr; + resource = strstr(resource, "I2C"); + error = kstrtouint(resource+3, 0, &val); + if (error) + return error; + dev_priv->acpi_data.i2c_bus_number = val; + dev_priv->acpi_data.i2c_slave_address = + sb->slave_address; + } + } + return 1; +} + +acpi_status intel_acpi_find_i2c(struct drm_i915_private *dev_priv) +{ + struct pci_dev *pdev = dev_priv->dev->pdev; + struct list_head resource_list; + struct acpi_device *adev; + acpi_handle dhandle; + + dhandle = ACPI_HANDLE(&pdev->dev); + if (!dhandle) + return false; + + if (acpi_bus_get_device(dhandle, &adev)) + return AE_OK; + if (acpi_bus_get_status(adev) || !adev->status.present) + return AE_OK; + + INIT_LIST_HEAD(&resource_list); + acpi_dev_get_resources(adev, &resource_list, + i2c_acpi_get_name, dev_priv); + acpi_dev_free_resource_list(&resource_list); + + return AE_OK; +} + static bool intel_dsm_pci_probe(struct pci_dev *pdev) { acpi_handle dhandle; -- 1.9.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx