[Intel-gfx] [PATCH] drm/i915: Get the i2c bus number from the ACPI
Deepak, M
m.deepak at intel.com
Fri Feb 19 14:04:26 UTC 2016
This patch reads the i2c bus number from the _CRS table of the display module of the ACPI, which will be updated by the BIOS with the i2c info which is used for this module.
> -----Original Message-----
> From: Deepak, M
> Sent: Friday, February 19, 2016 7:26 PM
> To: intel-gfx at lists.freedesktop.org
> Cc: Deepak, M <m.deepak at intel.com>
> Subject: [PATCH] drm/i915: Get the i2c bus number from the ACPI
>
> 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