[Intel-gfx] [PATCH] drm/i915: Get the i2c bus number from the ACPI
Deepak M
m.deepak at intel.com
Fri Feb 19 13:55:57 UTC 2016
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 at intel.com>
---
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
More information about the Intel-gfx
mailing list