Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,23 +4,19 @@
$id: http://devicetree.org/schemas/display/bridge/lontium,lt9611.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Lontium LT9611(UXC/C/EX/UXD) 2 Port MIPI DSI to HDMI Bridge
title: Lontium LT9611(UXC) 2 Port MIPI to HDMI Bridge

maintainers:
- Vinod Koul <vkoul@kernel.org>

description: |
The LT9611、LT9611UXC、LT9611C、LT9611EX and LT9611UXD
are bridge devices which convert DSI to HDMI
The LT9611 and LT9611UXC are bridge devices which convert DSI to HDMI

properties:
compatible:
enum:
- lontium,lt9611
- lontium,lt9611c
- lontium,lt9611ex
- lontium,lt9611uxc
- lontium,lt9611uxd

reg:
maxItems: 1
Expand All@@ -41,17 +37,6 @@ properties:
vcc-supply:
description: Regulator for 3.3V IO power.

lontium,port-select:
$ref: /schemas/types.yaml#/definitions/uint32
enum: [0, 1, 2]
default: 0
description: |
Selects which DSI input port(s) the bridge uses. Only relevant for
the lontium,lt9611c compatible.
0 = PORT_SELECT_A - single DSI port A (default)
1 = PORT_SELECT_B - single DSI port B
2 = PORT_SELECT_AB - dual DSI ports A and B

ports:
$ref: /schemas/graph.yaml#/properties/ports

Expand DownExpand Up@@ -108,8 +93,6 @@ examples:
vdd-supply = <&lt9611_1v8>;
vcc-supply = <&lt9611_3v3>;

lontium,port-select = <1>;

ports {
#address-cells = <1>;
#size-cells = <0>;
Expand Down
1 change: 0 additions & 1 deletion arch/arm64/configs/defconfig
Original file line numberDiff line numberDiff line change
Expand Up@@ -971,7 +971,6 @@ CONFIG_DRM_LONTIUM_LT8713SX=m
CONFIG_DRM_LONTIUM_LT8912B=m
CONFIG_DRM_LONTIUM_LT9211=m
CONFIG_DRM_LONTIUM_LT9611=m
CONFIG_DRM_LONTIUM_LT9611C=m
CONFIG_DRM_LONTIUM_LT9611UXC=m
CONFIG_DRM_ITE_IT66121=m
CONFIG_DRM_NWL_MIPI_DSI=m
Expand Down
18 changes: 0 additions & 18 deletions drivers/gpu/drm/bridge/Kconfig
Original file line numberDiff line numberDiff line change
Expand Up@@ -170,24 +170,6 @@ config DRM_LONTIUM_LT9611
HDMI signals
Please say Y if you have such hardware.

config DRM_LONTIUM_LT9611C
tristate "Lontium LT9611C DSI/HDMI bridge"
select SND_SOC_HDMI_CODEC if SND_SOC
depends on OF
select CRC8
select FW_LOADER
select DRM_PANEL_BRIDGE
select DRM_KMS_HELPER
select DRM_MIPI_DSI
select DRM_DISPLAY_HELPER
select DRM_DISPLAY_HDMI_STATE_HELPER
select REGMAP_I2C
help
Driver for Lontium DSI to HDMI bridge
chip driver that converts dual DSI and I2S to
HDMI signals
Please say Y if you have such hardware.

config DRM_LONTIUM_LT9611UXC
tristate "Lontium LT9611UXC DSI/HDMI bridge"
select SND_SOC_HDMI_CODEC if SND_SOC
Expand Down
1 change: 0 additions & 1 deletion drivers/gpu/drm/bridge/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,6 @@ obj-$(CONFIG_DRM_ITE_IT6505) += ite-it6505.o
obj-$(CONFIG_DRM_LONTIUM_LT8912B) += lontium-lt8912b.o
obj-$(CONFIG_DRM_LONTIUM_LT9211) += lontium-lt9211.o
obj-$(CONFIG_DRM_LONTIUM_LT9611) += lontium-lt9611.o
obj-$(CONFIG_DRM_LONTIUM_LT9611C) += lontium-lt9611c.o
obj-$(CONFIG_DRM_LONTIUM_LT9611UXC) += lontium-lt9611uxc.o
obj-$(CONFIG_DRM_LONTIUM_LT8713SX) += lontium-lt8713sx.o
obj-$(CONFIG_DRM_LVDS_CODEC) += lvds-codec.o
Expand Down
180 changes: 75 additions & 105 deletions drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -887,111 +887,88 @@ static const struct drm_edid *adv7511_bridge_edid_read(struct drm_bridge *bridge
return adv7511_edid_read(adv, connector);
}

static int adv7511_bridge_hdmi_clear_audio_infoframe(struct drm_bridge *bridge)
static int adv7511_bridge_hdmi_clear_infoframe(struct drm_bridge *bridge,
enum hdmi_infoframe_type type)
{
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);

adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME);

return 0;
}

static int adv7511_bridge_hdmi_clear_avi_infoframe(struct drm_bridge *bridge)
{
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);

adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME);

return 0;
}

static int adv7511_bridge_hdmi_clear_spd_infoframe(struct drm_bridge *bridge)
{
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);

adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPD);

return 0;
}

static int adv7511_bridge_hdmi_clear_hdmi_infoframe(struct drm_bridge *bridge)
{
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);

adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPARE1);

return 0;
}

static int adv7511_bridge_hdmi_write_audio_infoframe(struct drm_bridge *bridge,
const u8 *buffer, size_t len)
{
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);

/* send current Audio infoframe values while updating */
regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(5), BIT(5));

/* The Audio infoframe id is not configurable */
regmap_bulk_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME_VERSION,
buffer + 1, len - 1);

/* use Audio infoframe updated info */
regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(5), 0);

adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME);

return 0;
}

static int adv7511_bridge_hdmi_write_avi_infoframe(struct drm_bridge *bridge,
const u8 *buffer, size_t len)
{
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);

/* send current AVI infoframe values while updating */
regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(6), BIT(6));

/* The AVI infoframe id is not configurable */
regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION,
buffer + 1, len - 1);

regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME_LENGTH, 0x2);
regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME(1), 0x1);

/* use AVI infoframe updated info */
regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(6), 0);

adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME);

return 0;
}

static int adv7511_bridge_hdmi_write_spd_infoframe(struct drm_bridge *bridge,
const u8 *buffer, size_t len)
{
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);

adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPD);
regmap_bulk_write(adv7511->regmap_packet, ADV7511_PACKET_SPD(0),
buffer, len);
adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_SPD);
switch (type) {
case HDMI_INFOFRAME_TYPE_AUDIO:
adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME);
break;
case HDMI_INFOFRAME_TYPE_AVI:
adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME);
break;
case HDMI_INFOFRAME_TYPE_SPD:
adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPD);
break;
case HDMI_INFOFRAME_TYPE_VENDOR:
adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPARE1);
break;
default:
drm_dbg_driver(adv7511->bridge.dev, "Unsupported HDMI InfoFrame %x\n", type);
break;
}

return 0;
}

static int adv7511_bridge_hdmi_write_hdmi_infoframe(struct drm_bridge *bridge,
const u8 *buffer, size_t len)
static int adv7511_bridge_hdmi_write_infoframe(struct drm_bridge *bridge,
enum hdmi_infoframe_type type,
const u8 *buffer, size_t len)
{
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);

adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPARE1);
regmap_bulk_write(adv7511->regmap_packet, ADV7511_PACKET_SPARE1(0),
buffer, len);
adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_SPARE1);
switch (type) {
case HDMI_INFOFRAME_TYPE_AUDIO:
/* send current Audio infoframe values while updating */
regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(5), BIT(5));

/* The Audio infoframe id is not configurable */
regmap_bulk_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME_VERSION,
buffer + 1, len - 1);

/* use Audio infoframe updated info */
regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(5), 0);

adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME);
break;
case HDMI_INFOFRAME_TYPE_AVI:
/* send current AVI infoframe values while updating */
regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(6), BIT(6));

/* The AVI infoframe id is not configurable */
regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION,
buffer + 1, len - 1);

regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME_LENGTH, 0x2);
regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME(1), 0x1);

/* use AVI infoframe updated info */
regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(6), 0);

adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME);
break;
case HDMI_INFOFRAME_TYPE_SPD:
adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPD);
regmap_bulk_write(adv7511->regmap_packet, ADV7511_PACKET_SPD(0),
buffer, len);
adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_SPD);
break;
case HDMI_INFOFRAME_TYPE_VENDOR:
adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPARE1);
regmap_bulk_write(adv7511->regmap_packet, ADV7511_PACKET_SPARE1(0),
buffer, len);
adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_SPARE1);
break;
default:
drm_dbg_driver(adv7511->bridge.dev, "Unsupported HDMI InfoFrame %x\n", type);
break;
}

return 0;
}
Expand All@@ -1009,14 +986,8 @@ static const struct drm_bridge_funcs adv7511_bridge_funcs = {
.atomic_reset = drm_atomic_helper_bridge_reset,

.hdmi_tmds_char_rate_valid = adv7511_bridge_hdmi_tmds_char_rate_valid,
.hdmi_clear_audio_infoframe = adv7511_bridge_hdmi_clear_audio_infoframe,
.hdmi_write_audio_infoframe = adv7511_bridge_hdmi_write_audio_infoframe,
.hdmi_clear_avi_infoframe = adv7511_bridge_hdmi_clear_avi_infoframe,
.hdmi_write_avi_infoframe = adv7511_bridge_hdmi_write_avi_infoframe,
.hdmi_clear_spd_infoframe = adv7511_bridge_hdmi_clear_spd_infoframe,
.hdmi_write_spd_infoframe = adv7511_bridge_hdmi_write_spd_infoframe,
.hdmi_clear_hdmi_infoframe = adv7511_bridge_hdmi_clear_hdmi_infoframe,
.hdmi_write_hdmi_infoframe = adv7511_bridge_hdmi_write_hdmi_infoframe,
.hdmi_clear_infoframe = adv7511_bridge_hdmi_clear_infoframe,
.hdmi_write_infoframe = adv7511_bridge_hdmi_write_infoframe,

.hdmi_audio_startup = adv7511_hdmi_audio_startup,
.hdmi_audio_prepare = adv7511_hdmi_audio_prepare,
Expand DownExpand Up@@ -1351,8 +1322,7 @@ static int adv7511_probe(struct i2c_client *i2c)

adv7511->bridge.ops = DRM_BRIDGE_OP_DETECT |
DRM_BRIDGE_OP_EDID |
DRM_BRIDGE_OP_HDMI |
DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME;
DRM_BRIDGE_OP_HDMI;
if (adv7511->i2c_main->irq)
adv7511->bridge.ops |= DRM_BRIDGE_OP_HPD;

Expand Down
Loading