drm/amd/display/dm: handle OEM i2c buses in i2c functions
authorAlex Deucher <alexander.deucher@amd.com>
Tue, 17 Dec 2024 14:28:25 +0000 (09:28 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 13 Feb 2025 02:02:54 +0000 (21:02 -0500)
Allow the creation of an OEM i2c bus and use the proper
DC helpers for that case.

Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 5e3faefc5510914e8865147b9788e7093517eeb7..6da4f946cac008ac865cd6d8a06fb0bd84d646d5 100644 (file)
@@ -609,6 +609,7 @@ struct amdgpu_i2c_adapter {
        struct i2c_adapter base;
 
        struct ddc_service *ddc_service;
+       bool oem;
 };
 
 #define TO_DM_AUX(x) container_of((x), struct amdgpu_dm_dp_aux, aux)
index 1bbc512345ba2fdbd042f928716f3db58ebb2437..03c6be289bb553941240c998d23f9d2b5c9e5227 100644 (file)
@@ -8301,11 +8301,18 @@ static int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap,
                cmd.payloads[i].data = msgs[i].buf;
        }
 
-       if (dc_submit_i2c(
-                       ddc_service->ctx->dc,
-                       ddc_service->link->link_index,
-                       &cmd))
-               result = num;
+       if (i2c->oem) {
+               if (dc_submit_i2c_oem(
+                           ddc_service->ctx->dc,
+                           &cmd))
+                       result = num;
+       } else {
+               if (dc_submit_i2c(
+                           ddc_service->ctx->dc,
+                           ddc_service->link->link_index,
+                           &cmd))
+                       result = num;
+       }
 
        kfree(cmd.payloads);
        return result;
@@ -8322,7 +8329,7 @@ static const struct i2c_algorithm amdgpu_dm_i2c_algo = {
 };
 
 static struct amdgpu_i2c_adapter *
-create_i2c(struct ddc_service *ddc_service)
+create_i2c(struct ddc_service *ddc_service, bool oem)
 {
        struct amdgpu_device *adev = ddc_service->ctx->driver_context;
        struct amdgpu_i2c_adapter *i2c;
@@ -8333,10 +8340,14 @@ create_i2c(struct ddc_service *ddc_service)
        i2c->base.owner = THIS_MODULE;
        i2c->base.dev.parent = &adev->pdev->dev;
        i2c->base.algo = &amdgpu_dm_i2c_algo;
-       snprintf(i2c->base.name, sizeof(i2c->base.name), "AMDGPU DM i2c hw bus %d",
-                ddc_service->link->link_index);
+       if (oem)
+               snprintf(i2c->base.name, sizeof(i2c->base.name), "AMDGPU DM i2c OEM bus");
+       else
+               snprintf(i2c->base.name, sizeof(i2c->base.name), "AMDGPU DM i2c hw bus %d",
+                        ddc_service->link->link_index);
        i2c_set_adapdata(&i2c->base, i2c);
        i2c->ddc_service = ddc_service;
+       i2c->oem = oem;
 
        return i2c;
 }
@@ -8382,7 +8393,7 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
        link->priv = aconnector;
 
 
-       i2c = create_i2c(link->ddc);
+       i2c = create_i2c(link->ddc, false);
        if (!i2c) {
                DRM_ERROR("Failed to create i2c adapter data\n");
                return -ENOMEM;