mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drm/bridge: it66121: Use vid/pid to detect the type of chip
The driver knows exactly which version of the chip is present since the vid/pid is used to enforce a compatibility. Given that some devices like IT66121 has potentially been replaced with IT66122 mid production for many platforms, it makes no sense to use the vid/pid as an enforcement for compatibility. Instead, detect the ID of the actual chip in use by matching the corresponding vid/pid and drop the compatible specific lookup table. Signed-off-by: Nishanth Menon <nm@ti.com> Reviewed-by: Andrew Davis <afd@ti.com> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> Link: https://patch.msgid.link/20251029150636.3118628-5-nm@ti.com
This commit is contained in:
committed by
Neil Armstrong
parent
a1df28b5f4
commit
a8811c0bb7
@@ -312,7 +312,7 @@ struct it66121_ctx {
|
||||
u8 swl;
|
||||
bool auto_cts;
|
||||
} audio;
|
||||
const struct it66121_chip_info *info;
|
||||
enum chip_id id;
|
||||
};
|
||||
|
||||
static const struct regmap_range_cfg it66121_regmap_banks[] = {
|
||||
@@ -402,7 +402,7 @@ static int it66121_configure_afe(struct it66121_ctx *ctx,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ctx->info->id == ID_IT66121) {
|
||||
if (ctx->id == ID_IT66121) {
|
||||
ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG,
|
||||
IT66121_AFE_IP_EC1, 0);
|
||||
if (ret)
|
||||
@@ -428,7 +428,7 @@ static int it66121_configure_afe(struct it66121_ctx *ctx,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ctx->info->id == ID_IT66121) {
|
||||
if (ctx->id == ID_IT66121) {
|
||||
ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG,
|
||||
IT66121_AFE_IP_EC1,
|
||||
IT66121_AFE_IP_EC1);
|
||||
@@ -449,7 +449,7 @@ static int it66121_configure_afe(struct it66121_ctx *ctx,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ctx->info->id == ID_IT6610) {
|
||||
if (ctx->id == ID_IT6610) {
|
||||
ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG,
|
||||
IT6610_AFE_XP_BYPASS,
|
||||
IT6610_AFE_XP_BYPASS);
|
||||
@@ -599,7 +599,7 @@ static int it66121_bridge_attach(struct drm_bridge *bridge,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ctx->info->id == ID_IT66121) {
|
||||
if (ctx->id == ID_IT66121) {
|
||||
ret = regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG,
|
||||
IT66121_CLK_BANK_PWROFF_RCLK, 0);
|
||||
if (ret)
|
||||
@@ -748,7 +748,7 @@ static int it66121_bridge_check(struct drm_bridge *bridge,
|
||||
{
|
||||
struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge);
|
||||
|
||||
if (ctx->info->id == ID_IT6610) {
|
||||
if (ctx->id == ID_IT6610) {
|
||||
/* The IT6610 only supports these settings */
|
||||
bridge_state->input_bus_cfg.flags |= DRM_BUS_FLAG_DE_HIGH |
|
||||
DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE;
|
||||
@@ -802,7 +802,7 @@ void it66121_bridge_mode_set(struct drm_bridge *bridge,
|
||||
if (regmap_write(ctx->regmap, IT66121_HDMI_MODE_REG, IT66121_HDMI_MODE_HDMI))
|
||||
goto unlock;
|
||||
|
||||
if (ctx->info->id == ID_IT66121 &&
|
||||
if (ctx->id == ID_IT66121 &&
|
||||
regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG,
|
||||
IT66121_CLK_BANK_PWROFF_TXCLK,
|
||||
IT66121_CLK_BANK_PWROFF_TXCLK)) {
|
||||
@@ -815,7 +815,7 @@ void it66121_bridge_mode_set(struct drm_bridge *bridge,
|
||||
if (it66121_configure_afe(ctx, adjusted_mode))
|
||||
goto unlock;
|
||||
|
||||
if (ctx->info->id == ID_IT66121 &&
|
||||
if (ctx->id == ID_IT66121 &&
|
||||
regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG,
|
||||
IT66121_CLK_BANK_PWROFF_TXCLK, 0)) {
|
||||
goto unlock;
|
||||
@@ -1498,13 +1498,19 @@ static const char * const it66121_supplies[] = {
|
||||
"vcn33", "vcn18", "vrf12"
|
||||
};
|
||||
|
||||
static const struct it66121_chip_info it66xx_chip_info[] = {
|
||||
{.id = ID_IT6610, .vid = 0xca00, .pid = 0x0611 },
|
||||
{.id = ID_IT66121, .vid = 0x4954, .pid = 0x0612 },
|
||||
};
|
||||
|
||||
static int it66121_probe(struct i2c_client *client)
|
||||
{
|
||||
u32 revision_id, vendor_ids[2] = { 0 }, device_ids[2] = { 0 };
|
||||
struct device_node *ep;
|
||||
int ret;
|
||||
int ret, i;
|
||||
struct it66121_ctx *ctx;
|
||||
struct device *dev = &client->dev;
|
||||
const struct it66121_chip_info *chip_info;
|
||||
|
||||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
||||
dev_err(dev, "I2C check functionality failed.\n");
|
||||
@@ -1522,7 +1528,6 @@ static int it66121_probe(struct i2c_client *client)
|
||||
|
||||
ctx->dev = dev;
|
||||
ctx->client = client;
|
||||
ctx->info = i2c_get_match_data(client);
|
||||
|
||||
of_property_read_u32(ep, "bus-width", &ctx->bus_width);
|
||||
of_node_put(ep);
|
||||
@@ -1568,11 +1573,18 @@ static int it66121_probe(struct i2c_client *client)
|
||||
revision_id = FIELD_GET(IT66121_REVISION_MASK, device_ids[1]);
|
||||
device_ids[1] &= IT66121_DEVICE_ID1_MASK;
|
||||
|
||||
if ((vendor_ids[1] << 8 | vendor_ids[0]) != ctx->info->vid ||
|
||||
(device_ids[1] << 8 | device_ids[0]) != ctx->info->pid) {
|
||||
return -ENODEV;
|
||||
for (i = 0; i < ARRAY_SIZE(it66xx_chip_info); i++) {
|
||||
chip_info = &it66xx_chip_info[i];
|
||||
if ((vendor_ids[1] << 8 | vendor_ids[0]) == chip_info->vid &&
|
||||
(device_ids[1] << 8 | device_ids[0]) == chip_info->pid) {
|
||||
ctx->id = chip_info->id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == ARRAY_SIZE(it66xx_chip_info))
|
||||
return -ENODEV;
|
||||
|
||||
ctx->bridge.of_node = dev->of_node;
|
||||
ctx->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
|
||||
ctx->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID;
|
||||
@@ -1606,28 +1618,16 @@ static void it66121_remove(struct i2c_client *client)
|
||||
mutex_destroy(&ctx->lock);
|
||||
}
|
||||
|
||||
static const struct it66121_chip_info it66121_chip_info = {
|
||||
.id = ID_IT66121,
|
||||
.vid = 0x4954,
|
||||
.pid = 0x0612,
|
||||
};
|
||||
|
||||
static const struct it66121_chip_info it6610_chip_info = {
|
||||
.id = ID_IT6610,
|
||||
.vid = 0xca00,
|
||||
.pid = 0x0611,
|
||||
};
|
||||
|
||||
static const struct of_device_id it66121_dt_match[] = {
|
||||
{ .compatible = "ite,it6610", &it6610_chip_info },
|
||||
{ .compatible = "ite,it66121", &it66121_chip_info },
|
||||
{ .compatible = "ite,it6610" },
|
||||
{ .compatible = "ite,it66121" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, it66121_dt_match);
|
||||
|
||||
static const struct i2c_device_id it66121_id[] = {
|
||||
{ "it6610", (kernel_ulong_t)&it6610_chip_info },
|
||||
{ "it66121", (kernel_ulong_t)&it66121_chip_info },
|
||||
{ .name = "it6610" },
|
||||
{ .name = "it66121" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, it66121_id);
|
||||
|
||||
Reference in New Issue
Block a user