Skip to content

Commit 9f1d10d

Browse files
bivvyJosephChen2017
authored andcommitted
video/drm: dsi: rework dual channel mode
Change-Id: If119532a057d731f523a7ec8b035e9addc76d1e1 Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
1 parent 1c3c799 commit 9f1d10d

1 file changed

Lines changed: 83 additions & 117 deletions

File tree

drivers/video/drm/rockchip-dw-mipi-dsi.c

Lines changed: 83 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
#include <config.h>
88
#include <common.h>
99
#include <errno.h>
10-
#include <malloc.h>
1110
#include <asm/unaligned.h>
1211
#include <asm/io.h>
1312
#include <asm/hardware.h>
14-
#include <linux/list.h>
1513
#include <dm/device.h>
1614
#include <dm/read.h>
1715
#include <dm/of_access.h>
@@ -21,12 +19,10 @@
2119
#include "rockchip_display.h"
2220
#include "rockchip_crtc.h"
2321
#include "rockchip_connector.h"
22+
#include "rockchip_panel.h"
2423
#include "rockchip_phy.h"
2524
#include "rockchip_mipi_dsi.h"
2625

27-
#define MSEC_PER_SEC 1000L
28-
#define USEC_PER_SEC 1000000L
29-
3026
#define DSI_VERSION 0x00
3127
#define DSI_PWR_UP 0x04
3228
#define RESET 0
@@ -232,11 +228,9 @@ struct dw_mipi_dsi {
232228
struct udevice *dev;
233229
void *base;
234230
void *grf;
235-
const void *blob;
236-
ofnode node;
237231
int id;
238232

239-
/* dual-channel */
233+
/* for dual-channel */
240234
struct dw_mipi_dsi *master;
241235
struct dw_mipi_dsi *slave;
242236

@@ -855,10 +849,8 @@ static ssize_t dw_mipi_dsi_transfer(struct dw_mipi_dsi *dsi,
855849

856850
if (dsi->slave) {
857851
ret = dw_mipi_dsi_transfer(dsi->slave, msg);
858-
if (ret) {
859-
printf("failed to send command through dsi slave, ret = %d\n", ret);
852+
if (ret < 0)
860853
return ret;
861-
}
862854
}
863855

864856
return msg->rx_len ? msg->rx_len : msg->tx_len;
@@ -868,7 +860,7 @@ static ssize_t dw_mipi_dsi_connector_transfer(struct display_state *state,
868860
const struct mipi_dsi_msg *msg)
869861
{
870862
struct connector_state *conn_state = &state->conn_state;
871-
struct dw_mipi_dsi *dsi = conn_state->private;
863+
struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
872864

873865
return dw_mipi_dsi_transfer(dsi, msg);
874866
}
@@ -1091,109 +1083,36 @@ static void dw_mipi_dsi_clear_err(struct dw_mipi_dsi *dsi)
10911083
dsi_write(dsi, DSI_INT_MSK1, 0);
10921084
}
10931085

1094-
static int dw_mipi_dsi_dual_channel_probe(struct dw_mipi_dsi *master)
1095-
{
1096-
int phandle;
1097-
struct device_node *np;
1098-
struct dw_mipi_dsi *slave = NULL;
1099-
1100-
phandle = ofnode_read_u32_default(master->node, "rockchip,dual-channel", -1);
1101-
if (phandle < 0)
1102-
return 0;
1103-
1104-
np = of_find_node_by_phandle(phandle);
1105-
if (ofnode_valid(np_to_ofnode(np))) {
1106-
printf("failed to find dsi slave node\n");
1107-
return -ENODEV;
1108-
}
1109-
1110-
if (!of_device_is_available(np)) {
1111-
printf("dsi slave node is not available\n");
1112-
return -ENODEV;
1113-
}
1114-
1115-
slave = malloc(sizeof(*slave));
1116-
if (!slave)
1117-
return -ENOMEM;
1118-
1119-
memset(slave, 0, sizeof(*slave));
1120-
1121-
master->lanes /= 2;
1122-
master->slave = slave;
1123-
slave->master = master;
1124-
1125-
slave->blob = master->blob;
1126-
slave->node = np_to_ofnode(np);
1127-
slave->base = (u32 *)ofnode_get_addr_index(slave->node, 0);
1128-
slave->pdata = master->pdata;
1129-
slave->id = 1;
1130-
slave->dphy.phy = master->dphy.phy;
1131-
slave->lanes = master->lanes;
1132-
slave->format = master->format;
1133-
slave->mode_flags = master->mode_flags;
1134-
slave->channel = master->channel;
1135-
1136-
return 0;
1137-
}
1138-
11391086
static int dw_mipi_dsi_connector_init(struct display_state *state)
11401087
{
11411088
struct connector_state *conn_state = &state->conn_state;
1142-
const struct rockchip_connector *connector = conn_state->connector;
1143-
const struct dw_mipi_dsi_plat_data *pdata = connector->data;
1144-
ofnode mipi_node = conn_state->node;
11451089
struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
1146-
ofnode panel;
1147-
int id;
1148-
int ret;
1090+
struct rockchip_panel *panel = state_get_panel(state);
11491091

1150-
dsi->base = dev_read_addr_ptr(conn_state->dev);
1151-
dsi->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1152-
if (dsi->grf <= 0) {
1153-
printf("%s: Get syscon grf failed (ret=%p)\n",
1154-
__func__, dsi->grf);
1155-
return -ENXIO;
1156-
}
1157-
1158-
id = of_alias_get_id(ofnode_to_np(mipi_node), "dsi");
1159-
if (id < 0)
1160-
id = 0;
1161-
1162-
dsi->pdata = pdata;
1163-
dsi->id = id;
1164-
dsi->blob = state->blob;
1165-
dsi->node = mipi_node;
11661092
dsi->dphy.phy = conn_state->phy;
11671093

1168-
conn_state->private = dsi;
1094+
dsi->lanes = dev_read_u32_default(panel->dev, "dsi,lanes", 4);
1095+
dsi->format = dev_read_u32_default(panel->dev, "dsi,format",
1096+
MIPI_DSI_FMT_RGB888);
1097+
dsi->mode_flags = dev_read_u32_default(panel->dev, "dsi,flags",
1098+
MIPI_DSI_MODE_VIDEO |
1099+
MIPI_DSI_MODE_VIDEO_BURST |
1100+
MIPI_DSI_MODE_LPM |
1101+
MIPI_DSI_MODE_EOT_PACKET);
1102+
dsi->channel = dev_read_u32_default(panel->dev, "reg", 0);
1103+
11691104
conn_state->output_mode = ROCKCHIP_OUT_MODE_P888;
11701105
conn_state->color_space = V4L2_COLORSPACE_DEFAULT;
1171-
1172-
panel = dev_read_subnode(conn_state->dev, "panel");
1173-
if (!ofnode_valid(panel)) {
1174-
printf("failed to find panel node\n");
1175-
return -1;
1176-
}
1177-
1178-
#define FDT_GET_INT(val, name) \
1179-
val = ofnode_read_s32_default(panel, name, -1); \
1180-
if (val < 0) { \
1181-
printf("Can't get %s\n", name); \
1182-
return -1; \
1183-
}
1184-
1185-
FDT_GET_INT(dsi->lanes, "dsi,lanes");
1186-
FDT_GET_INT(dsi->format, "dsi,format");
1187-
FDT_GET_INT(dsi->mode_flags, "dsi,flags");
1188-
FDT_GET_INT(dsi->channel, "reg");
1189-
1190-
ret = dw_mipi_dsi_dual_channel_probe(dsi);
1191-
if (ret)
1192-
return ret;
1193-
11941106
conn_state->type = DRM_MODE_CONNECTOR_DSI;
1195-
if (dsi->slave)
1107+
1108+
if (dsi->slave) {
1109+
dsi->lanes /= 2;
1110+
dsi->slave->lanes = dsi->lanes;
1111+
dsi->slave->format = dsi->format;
1112+
dsi->slave->mode_flags = dsi->mode_flags;
1113+
dsi->slave->channel = dsi->channel;
11961114
conn_state->output_type = ROCKCHIP_OUTPUT_DSI_DUAL_CHANNEL;
1115+
}
11971116

11981117
return 0;
11991118
}
@@ -1279,7 +1198,7 @@ static int dw_mipi_dsi_connector_prepare(struct display_state *state)
12791198
{
12801199
struct connector_state *conn_state = &state->conn_state;
12811200
struct crtc_state *crtc_state = &state->crtc_state;
1282-
struct dw_mipi_dsi *dsi = conn_state->private;
1201+
struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
12831202
unsigned long lane_rate;
12841203

12851204
dsi->mode = &conn_state->mode;
@@ -1304,15 +1223,15 @@ static int dw_mipi_dsi_connector_prepare(struct display_state *state)
13041223
static void dw_mipi_dsi_connector_unprepare(struct display_state *state)
13051224
{
13061225
struct connector_state *conn_state = &state->conn_state;
1307-
struct dw_mipi_dsi *dsi = conn_state->private;
1226+
struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
13081227

13091228
dw_mipi_dsi_post_disable(dsi);
13101229
}
13111230

13121231
static int dw_mipi_dsi_connector_enable(struct display_state *state)
13131232
{
13141233
struct connector_state *conn_state = &state->conn_state;
1315-
struct dw_mipi_dsi *dsi = conn_state->private;
1234+
struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
13161235

13171236
dw_mipi_dsi_enable(dsi);
13181237

@@ -1322,7 +1241,7 @@ static int dw_mipi_dsi_connector_enable(struct display_state *state)
13221241
static int dw_mipi_dsi_connector_disable(struct display_state *state)
13231242
{
13241243
struct connector_state *conn_state = &state->conn_state;
1325-
struct dw_mipi_dsi *dsi = conn_state->private;
1244+
struct dw_mipi_dsi *dsi = dev_get_priv(conn_state->dev);
13261245

13271246
dw_mipi_dsi_disable(dsi);
13281247

@@ -1338,6 +1257,61 @@ static const struct rockchip_connector_funcs dw_mipi_dsi_connector_funcs = {
13381257
.transfer = dw_mipi_dsi_connector_transfer,
13391258
};
13401259

1260+
static int dw_mipi_dsi_dual_channel_probe(struct dw_mipi_dsi *master)
1261+
{
1262+
struct udevice *dev;
1263+
struct dw_mipi_dsi *slave;
1264+
int ret;
1265+
1266+
ret = uclass_get_device_by_phandle(UCLASS_DISPLAY, master->dev,
1267+
"rockchip,dual-channel", &dev);
1268+
if (ret == -ENOENT) {
1269+
return 0;
1270+
} else if (ret) {
1271+
dev_err(dev, "failed to find slave device: %d\n", ret);
1272+
return ret;
1273+
}
1274+
1275+
slave = dev_get_priv(dev);
1276+
if (!slave) {
1277+
dev_err(dev, "failed to get slave channel\n");
1278+
return -ENODEV;
1279+
}
1280+
1281+
master->slave = slave;
1282+
slave->master = master;
1283+
1284+
return 0;
1285+
}
1286+
1287+
static int dw_mipi_dsi_probe(struct udevice *dev)
1288+
{
1289+
struct dw_mipi_dsi *dsi = dev_get_priv(dev);
1290+
const struct rockchip_connector *connector =
1291+
(const struct rockchip_connector *)dev_get_driver_data(dev);
1292+
const struct dw_mipi_dsi_plat_data *pdata = connector->data;
1293+
int id, ret;
1294+
1295+
dsi->base = dev_read_addr_ptr(dev);
1296+
dsi->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1297+
if (IS_ERR(dsi->grf))
1298+
return PTR_ERR(dsi->grf);
1299+
1300+
id = of_alias_get_id(ofnode_to_np(dev->node), "dsi");
1301+
if (id < 0)
1302+
id = 0;
1303+
1304+
dsi->dev = dev;
1305+
dsi->pdata = pdata;
1306+
dsi->id = id;
1307+
1308+
ret = dw_mipi_dsi_dual_channel_probe(dsi);
1309+
if (ret)
1310+
return ret;
1311+
1312+
return 0;
1313+
}
1314+
13411315
static const u32 px30_dsi_grf_reg_fields[MAX_FIELDS] = {
13421316
[DPIUPDATECFG] = GRF_REG_FIELD(0x0434, 7, 7),
13431317
[DPICOLORM] = GRF_REG_FIELD(0x0434, 3, 3),
@@ -1469,6 +1443,7 @@ static const u32 rk3399_dsi1_grf_reg_fields[MAX_FIELDS] = {
14691443
[DPICOLORM] = GRF_REG_FIELD(0x6250, 1, 1),
14701444
[TURNDISABLE] = GRF_REG_FIELD(0x625c, 12, 15),
14711445
[FORCETXSTOPMODE] = GRF_REG_FIELD(0x625c, 8, 11),
1446+
[FORCERXMODE] = GRF_REG_FIELD(0x625c, 4, 7),
14721447
[ENABLE_N] = GRF_REG_FIELD(0x625c, 0, 3),
14731448
[MASTERSLAVEZ] = GRF_REG_FIELD(0x6260, 7, 7),
14741449
[ENABLECLK] = GRF_REG_FIELD(0x6260, 6, 6),
@@ -1538,15 +1513,6 @@ static const struct udevice_id dw_mipi_dsi_ids[] = {
15381513
{}
15391514
};
15401515

1541-
static int dw_mipi_dsi_probe(struct udevice *dev)
1542-
{
1543-
struct dw_mipi_dsi *dsi = dev_get_priv(dev);
1544-
1545-
dsi->dev = dev;
1546-
1547-
return 0;
1548-
}
1549-
15501516
U_BOOT_DRIVER(dw_mipi_dsi) = {
15511517
.name = "dw_mipi_dsi",
15521518
.id = UCLASS_DISPLAY,

0 commit comments

Comments
 (0)