Skip to content
This repository was archived by the owner on Apr 9, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
60 changes: 20 additions & 40 deletions drivers/gpu/drm/bridge/ti/fpd_dp_ser_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,9 @@

#include "fpd_dp_ser_drv.h"

#define PAD_CFG_DW0_GPPC_A_16 0xfd6e0AA0
static struct platform_device *pdev;
struct fpd_dp_ser_priv *fpd_dp_priv;
struct i2c_adapter *i2c_adap_mcu;
int deser_reset;

static struct i2c_board_info fpd_dp_i2c_board_info[] = {
{
Expand Down Expand Up @@ -256,10 +254,6 @@ void fpd_dp_ser_reset(struct i2c_client *client)
*/
void fpd_dp_ser_set_up_variables(struct i2c_client *client)
{
/* i2c 400k */
fpd_dp_ser_write_reg(client, 0x2b, 0x0a);
fpd_dp_ser_write_reg(client, 0x2c, 0x0b);

fpd_dp_ser_write_reg(client, 0x70, FPD_DP_SER_RX_ADD_A);
fpd_dp_ser_write_reg(client, 0x78, FPD_DP_SER_RX_ADD_A);
fpd_dp_ser_write_reg(client, 0x88, 0x0);
Expand Down Expand Up @@ -516,7 +510,6 @@ int fpd_dp_deser_soft_reset(struct i2c_client *client)

if (fpd_dp_priv->priv_dp_client[1] != NULL) {
fpd_dp_ser_write_reg(fpd_dp_priv->priv_dp_client[1], 0x01, 0x01);
usleep_range(20000, 22000);
fpd_dp_ser_read_reg(fpd_dp_priv->priv_dp_client[1], 0x1, &des_read);
des_read = 0;
fpd_dp_ser_read_reg(fpd_dp_priv->priv_dp_client[1], 0x2, &des_read);
Expand All @@ -526,6 +519,8 @@ int fpd_dp_deser_soft_reset(struct i2c_client *client)

}

usleep_range(20000, 22000);

/* Select write to port0 reg */
fpd_dp_ser_write_reg(fpd_dp_priv->priv_dp_client[0], 0x2d, 0x01);
return 0;
Expand Down Expand Up @@ -591,9 +586,6 @@ int fpd_dp_ser_set_dp_config(struct i2c_client *client)
fpd_dp_ser_write_reg(client, 0x4d, 0x0);
fpd_dp_ser_write_reg(client, 0x4e, 0x0);

/* Allow time after HPD is pulled high for the source to train and provide video */
msleep(500);

return 0;
}

Expand Down Expand Up @@ -1262,10 +1254,6 @@ int fpd_dp_deser_984_override_efuse(struct i2c_client *client)
pr_debug("[FPD_DP] Error - no DES detected\n");
else
pr_debug("[FPD_DP] Deserializer detected successfully\n");
/* i2c 400k */
fpd_dp_ser_write_reg(client, 0x2b, 0x0a);
fpd_dp_ser_write_reg(client, 0x2c, 0x0b);

fpd_dp_ser_write_reg(client, 0x49, 0xc);
fpd_dp_ser_write_reg(client, 0x4a, 0x0);
fpd_dp_ser_write_reg(client, 0x48, 0x1b);
Expand Down Expand Up @@ -1477,7 +1465,7 @@ int fpd_dp_deser_984_override_efuse(struct i2c_client *client)
fpd_dp_ser_write_reg(client, 0x42, 0x26);
/* Soft Reset DES */
fpd_dp_ser_write_reg(client, 0x1, 0x1);
usleep_range(30000, 32000);
usleep_range(20000, 22000);
}

return 0;
Expand Down Expand Up @@ -1672,6 +1660,9 @@ void fpd_dp_deser_984_enable_output(struct i2c_client *client)
fpd_dp_ser_write_reg(client, 0x4e, 0x0);
/* Enable INTB_IN */
fpd_dp_ser_write_reg(client, 0x44, 0x81);
/* i2c 400k */
fpd_dp_ser_write_reg(client, 0x2b, 0x0a);
fpd_dp_ser_write_reg(client, 0x2c, 0x0b);
}

void fpd_dp_deser_984_enable(void)
Expand Down Expand Up @@ -1812,8 +1803,6 @@ bool fpd_dp_ser_init(void)
/* Check if VP is synchronized to DP input */
fpd_poll_984_training();

deser_reset = 0;

fpd_dp_ser_set_up_mcu(fpd_dp_priv->priv_dp_client[0]);

if (!fpd_dp_priv->priv_dp_client[2])
Expand All @@ -1830,8 +1819,6 @@ static int fpd_dp_ser_probe(struct platform_device *pdev)
struct fpd_dp_ser_priv *priv;
int bus_number = 0;
int ret = 0;
unsigned char __iomem *gpio_cfg;
unsigned char data;

priv = devm_kzalloc(&pdev->dev, sizeof(struct fpd_dp_ser_priv),
GFP_KERNEL);
Expand All @@ -1852,10 +1839,6 @@ static int fpd_dp_ser_probe(struct platform_device *pdev)
pr_debug("Cannot find a valid i2c bus for max serdes\n");
return -ENOMEM;
}

/* retiries when i2c timeout */
i2c_adap->retries = 5;
i2c_adap->timeout = msecs_to_jiffies(5 * 10);
i2c_put_adapter(i2c_adap);
priv->i2c_adap = i2c_adap;

Expand All @@ -1879,14 +1862,6 @@ static int fpd_dp_ser_probe(struct platform_device *pdev)

fpd_dp_priv->count = 0;

gpio_cfg = (unsigned char *)ioremap(PAD_CFG_DW0_GPPC_A_16, 0x1);
data = ioread8(gpio_cfg);
data = data | 1;
iowrite8(data, gpio_cfg);
iounmap(gpio_cfg);
/* Delay for VPs to sync to DP source */
usleep_range(5000, 5200);

fpd_dp_ser_init();

return ret;
Expand All @@ -1904,7 +1879,7 @@ static int fpd_dp_ser_remove(struct platform_device *pdev) {
if (i == 0)
fpd_dp_ser_reset(client);
else
fpd_dp_ser_write_reg(client, 0x01, 0x01);
fpd_dp_deser_soft_reset(client);
if (client != NULL) {
if (i == 2)
fpd_dp_ser_motor_close(client);
Expand All @@ -1925,23 +1900,20 @@ static int fpd_dp_ser_suspend(struct device *dev)
#if 1
int i = 0;
struct fpd_dp_ser_priv *priv = dev_get_drvdata(dev);

/* first des reset, and then ser reset */
for (i = 1; i > -1; i--) {
for (i = 0; i < NUM_DEVICE; i++) {
struct i2c_client *client= priv->priv_dp_client[i];
if (i == 0)
fpd_dp_ser_reset(client);
else
fpd_dp_ser_write_reg(client, 0x01, 0x01);

/* after reset, wait 20ms to avoid ser/des read/write fail */
usleep_range(20000, 22000);
fpd_dp_deser_soft_reset(client);
}
#endif
pr_debug("[FPD_DP] [-%s-%s-%d-]\n", __FILE__, __func__, __LINE__);
return 0;
}

#define PAD_CFG_DW0_GPPC_A_16 0xfd6e0AA0

static int fpd_dp_ser_resume(struct device *dev)
{
bool result;
Expand Down Expand Up @@ -2037,9 +2009,18 @@ int __init fpd_dp_ser_module_init(void)
{
int ret = 0;

unsigned char __iomem *gpio_cfg;
unsigned char data;

pdev = platform_device_register_simple(DEV_NAME, -1, NULL, 0);
pr_debug("[FPD_DP] [-%s-%s-%d-]\n", __FILE__, __func__, __LINE__);

gpio_cfg = (unsigned char *)ioremap(PAD_CFG_DW0_GPPC_A_16, 0x1);
data = ioread8(gpio_cfg);
data = data | 1;
iowrite8(data, gpio_cfg);
iounmap(gpio_cfg);

if (!IS_ERR(pdev)) {
ret = platform_driver_probe(&fpd_dp_ser_driver,
fpd_dp_ser_probe);
Expand All @@ -2061,7 +2042,6 @@ void __exit fpd_dp_ser_module_exit(void)
}

EXPORT_SYMBOL(i2c_adap_mcu);
EXPORT_SYMBOL(deser_reset);

#ifdef MODULE
module_init(fpd_dp_ser_module_init);
Expand Down
8 changes: 3 additions & 5 deletions drivers/gpu/drm/i915/display/intel_dp.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,6 @@

#define I2C_MCU_ADDRESS 0x78

extern int deser_reset;

/* Constants for DP DSC configurations */
static const u8 valid_dsc_bpp[] = {6, 8, 10, 12, 15};

Expand Down Expand Up @@ -5609,15 +5607,15 @@ static void mcu_set_backlight(const struct drm_connector_state *conn_state, u32
struct drm_device *dev = to_intel_connector(conn_state->connector)->base.dev;

u16 data = 0;
static int count = 0;

if (deser_reset == 0) {
if (count == 0) {
/* TODO: 984 reset to avoid serdes panel black screen,
* the following should handle 984 reset accoding to panel
* status
*/
intel_dp_ser_write_reg(dev, i2c_adap_mcu, 0x01, 0x01);
usleep_range(20000, 22000);
deser_reset = 1;
count = 1;
drm_dbg_kms(dev, "[FPD_DP] 984 reset");
}

Expand Down