mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-01-15 12:25:41 +01:00
drm/amd/display/dm: handle OEM i2c buses in i2c functions
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>
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user