Lines Matching +full:dsi +full:- +full:lanes
1 // SPDX-License-Identifier: GPL-2.0
5 * Author: Guochun Huang <hero.huang@rock-chips.com>
46 /* MIPI DSI Processor-to-Peripheral transaction types */
97 /* MIPI DSI Peripheral-to-Processor transaction types */
164 * struct mipi_dsi_msg - read/write DSI buffer
186 * struct mipi_dsi_packet - represents a MIPI DSI packet in protocol format
200 static inline int dsi_write(struct rk628 *rk628, const struct rk628_dsi *dsi, in dsi_write() argument
205 dsi_base = dsi->id ? DSI1_BASE : DSI0_BASE; in dsi_write()
210 static inline int dsi_read(struct rk628 *rk628, const struct rk628_dsi *dsi, in dsi_read() argument
215 dsi_base = dsi->id ? DSI1_BASE : DSI0_BASE; in dsi_read()
221 const struct rk628_dsi *dsi, in dsi_update_bits() argument
226 dsi_base = dsi->id ? DSI1_BASE : DSI0_BASE; in dsi_update_bits()
238 return -EINVAL; in rk628_dsi_parse()
240 rk628->output_mode = OUTPUT_MODE_DSI; in rk628_dsi_parse()
241 rk628->dsi0.id = 0; in rk628_dsi_parse()
242 rk628->dsi0.channel = 0; in rk628_dsi_parse()
243 rk628->dsi0.rk628 = rk628; in rk628_dsi_parse()
245 if (!of_property_read_u32(dsi_np, "dsi,lanes", &val)) in rk628_dsi_parse()
246 rk628->dsi0.lanes = val; in rk628_dsi_parse()
248 if (of_property_read_bool(dsi_np, "dsi,video-mode")) in rk628_dsi_parse()
249 rk628->dsi0.mode_flags |= MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_VIDEO | in rk628_dsi_parse()
252 rk628->dsi0.mode_flags |= MIPI_DSI_MODE_LPM; in rk628_dsi_parse()
254 if (of_property_read_bool(dsi_np, "dsi,eotp")) in rk628_dsi_parse()
255 rk628->dsi0.mode_flags |= MIPI_DSI_MODE_EOT_PACKET; in rk628_dsi_parse()
257 if (!of_property_read_string(dsi_np, "dsi,format", &string)) { in rk628_dsi_parse()
259 rk628->dsi0.bus_format = MIPI_DSI_FMT_RGB666; in rk628_dsi_parse()
260 rk628->dsi0.bpp = 24; in rk628_dsi_parse()
261 } else if (!strcmp(string, "rgb666-packed")) { in rk628_dsi_parse()
262 rk628->dsi0.bus_format = MIPI_DSI_FMT_RGB666_PACKED; in rk628_dsi_parse()
263 rk628->dsi0.bpp = 18; in rk628_dsi_parse()
265 rk628->dsi0.bus_format = MIPI_DSI_FMT_RGB565; in rk628_dsi_parse()
266 rk628->dsi0.bpp = 16; in rk628_dsi_parse()
268 rk628->dsi0.bus_format = MIPI_DSI_FMT_RGB888; in rk628_dsi_parse()
269 rk628->dsi0.bpp = 24; in rk628_dsi_parse()
273 if (of_property_read_bool(dsi_np, "rockchip,dual-channel")) { in rk628_dsi_parse()
274 rk628->dsi0.master = false; in rk628_dsi_parse()
275 rk628->dsi0.slave = true; in rk628_dsi_parse()
277 memcpy(&rk628->dsi1, &rk628->dsi0, sizeof(struct rk628_dsi)); in rk628_dsi_parse()
278 rk628->dsi1.id = 1; in rk628_dsi_parse()
279 rk628->dsi1.master = true; in rk628_dsi_parse()
280 rk628->dsi1.slave = false; in rk628_dsi_parse()
292 const struct rk628_dsi *dsi) in genif_wait_w_pld_fifo_not_full() argument
299 dev_id = dsi->id ? RK628_DEV_DSI1 : RK628_DEV_DSI0; in genif_wait_w_pld_fifo_not_full()
300 dsi_base = dsi->id ? DSI1_BASE : DSI0_BASE; in genif_wait_w_pld_fifo_not_full()
302 ret = regmap_read_poll_timeout(rk628->regmap[dev_id], in genif_wait_w_pld_fifo_not_full()
307 dev_err(rk628->dev, "generic write payload fifo is full\n"); in genif_wait_w_pld_fifo_not_full()
315 const struct rk628_dsi *dsi) in genif_wait_cmd_fifo_not_full() argument
322 dev_id = dsi->id ? RK628_DEV_DSI1 : RK628_DEV_DSI0; in genif_wait_cmd_fifo_not_full()
323 dsi_base = dsi->id ? DSI1_BASE : DSI0_BASE; in genif_wait_cmd_fifo_not_full()
325 ret = regmap_read_poll_timeout(rk628->regmap[dev_id], in genif_wait_cmd_fifo_not_full()
330 dev_err(rk628->dev, "generic write cmd fifo is full\n"); in genif_wait_cmd_fifo_not_full()
337 static int genif_wait_write_fifo_empty(struct rk628 *rk628, const struct rk628_dsi *dsi) in genif_wait_write_fifo_empty() argument
345 dev_id = dsi->id ? RK628_DEV_DSI1 : RK628_DEV_DSI0; in genif_wait_write_fifo_empty()
346 dsi_base = dsi->id ? DSI1_BASE : DSI0_BASE; in genif_wait_write_fifo_empty()
350 ret = regmap_read_poll_timeout(rk628->regmap[dev_id], in genif_wait_write_fifo_empty()
356 dev_err(rk628->dev, "generic write fifo is full\n"); in genif_wait_write_fifo_empty()
364 const struct rk628_dsi *dsi, in rk628_dsi_read_from_fifo() argument
367 u8 *payload = msg->rx_buf; in rk628_dsi_read_from_fifo()
375 dev_id = dsi->id ? RK628_DEV_DSI1 : RK628_DEV_DSI0; in rk628_dsi_read_from_fifo()
376 dsi_base = dsi->id ? DSI1_BASE : DSI0_BASE; in rk628_dsi_read_from_fifo()
378 ret = regmap_read_poll_timeout(rk628->regmap[dev_id], in rk628_dsi_read_from_fifo()
383 dev_err(rk628->dev, "entire response isn't stored in the FIFO\n"); in rk628_dsi_read_from_fifo()
388 for (length = msg->rx_len; length; length -= 4) { in rk628_dsi_read_from_fifo()
389 dsi_read(rk628, dsi, DSI_CMD_PKT_STATUS, &val); in rk628_dsi_read_from_fifo()
391 ret = -ETIMEDOUT; in rk628_dsi_read_from_fifo()
393 dev_err(rk628->dev, "dsi Read payload FIFO is empty\n"); in rk628_dsi_read_from_fifo()
397 dsi_read(rk628, dsi, DSI_GEN_PLD_DATA, &val); in rk628_dsi_read_from_fifo()
422 * mipi_dsi_packet_format_is_short - check if a packet is of the short format
423 * @type: MIPI DSI data type of the packet
458 * mipi_dsi_packet_format_is_long - check if a packet is of the long format
459 * @type: MIPI DSI data type of the packet
489 * mipi_dsi_create_packet - create a packet from a message according to the
490 * DSI protocol
491 * @packet: pointer to a DSI packet structure
500 return -EINVAL; in mipi_dsi_create_packet()
503 if (!mipi_dsi_packet_format_is_short(msg->type) && in mipi_dsi_create_packet()
504 !mipi_dsi_packet_format_is_long(msg->type)) in mipi_dsi_create_packet()
505 return -EINVAL; in mipi_dsi_create_packet()
507 if (msg->channel > 3) in mipi_dsi_create_packet()
508 return -EINVAL; in mipi_dsi_create_packet()
511 packet->header[0] = ((msg->channel & 0x3) << 6) | (msg->type & 0x3f); in mipi_dsi_create_packet()
522 if (mipi_dsi_packet_format_is_long(msg->type)) { in mipi_dsi_create_packet()
523 packet->header[1] = (msg->tx_len >> 0) & 0xff; in mipi_dsi_create_packet()
524 packet->header[2] = (msg->tx_len >> 8) & 0xff; in mipi_dsi_create_packet()
526 packet->payload_length = msg->tx_len; in mipi_dsi_create_packet()
527 packet->payload = msg->tx_buf; in mipi_dsi_create_packet()
529 const u8 *tx = msg->tx_buf; in mipi_dsi_create_packet()
531 packet->header[1] = (msg->tx_len > 0) ? tx[0] : 0; in mipi_dsi_create_packet()
532 packet->header[2] = (msg->tx_len > 1) ? tx[1] : 0; in mipi_dsi_create_packet()
535 packet->size = sizeof(packet->header) + packet->payload_length; in mipi_dsi_create_packet()
540 static int rk628_dsi_transfer(struct rk628 *rk628, const struct rk628_dsi *dsi, in rk628_dsi_transfer() argument
547 if (msg->flags & MIPI_DSI_MSG_REQ_ACK) in rk628_dsi_transfer()
548 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, in rk628_dsi_transfer()
551 if (msg->flags & MIPI_DSI_MSG_USE_LPM) { in rk628_dsi_transfer()
552 dsi_update_bits(rk628, dsi, DSI_VID_MODE_CFG, in rk628_dsi_transfer()
555 dsi_update_bits(rk628, dsi, DSI_VID_MODE_CFG, LP_CMD_EN, 0); in rk628_dsi_transfer()
556 dsi_update_bits(rk628, dsi, DSI_LPCLK_CTRL, in rk628_dsi_transfer()
560 switch (msg->type) { in rk628_dsi_transfer()
562 //return rk628_dsi_shutdown_peripheral(dsi); in rk628_dsi_transfer()
564 //return rk628_dsi_turn_on_peripheral(dsi); in rk628_dsi_transfer()
566 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, DCS_SW_0P_TX, in rk628_dsi_transfer()
567 msg->flags & MIPI_DSI_MSG_USE_LPM ? in rk628_dsi_transfer()
571 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, DCS_SW_1P_TX, in rk628_dsi_transfer()
572 msg->flags & MIPI_DSI_MSG_USE_LPM ? in rk628_dsi_transfer()
576 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, DCS_LW_TX, in rk628_dsi_transfer()
577 msg->flags & MIPI_DSI_MSG_USE_LPM ? in rk628_dsi_transfer()
581 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, DCS_SR_0P_TX, in rk628_dsi_transfer()
582 msg->flags & MIPI_DSI_MSG_USE_LPM ? in rk628_dsi_transfer()
586 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, MAX_RD_PKT_SIZE, in rk628_dsi_transfer()
587 msg->flags & MIPI_DSI_MSG_USE_LPM ? in rk628_dsi_transfer()
591 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, GEN_SW_0P_TX, in rk628_dsi_transfer()
592 msg->flags & MIPI_DSI_MSG_USE_LPM ? in rk628_dsi_transfer()
596 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, GEN_SW_1P_TX, in rk628_dsi_transfer()
597 msg->flags & MIPI_DSI_MSG_USE_LPM ? in rk628_dsi_transfer()
601 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, GEN_SW_2P_TX, in rk628_dsi_transfer()
602 msg->flags & MIPI_DSI_MSG_USE_LPM ? in rk628_dsi_transfer()
606 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, GEN_LW_TX, in rk628_dsi_transfer()
607 msg->flags & MIPI_DSI_MSG_USE_LPM ? in rk628_dsi_transfer()
611 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, GEN_SR_0P_TX, in rk628_dsi_transfer()
612 msg->flags & MIPI_DSI_MSG_USE_LPM ? GEN_SR_0P_TX : 0); in rk628_dsi_transfer()
615 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, GEN_SR_1P_TX, in rk628_dsi_transfer()
616 msg->flags & MIPI_DSI_MSG_USE_LPM ? GEN_SR_1P_TX : 0); in rk628_dsi_transfer()
619 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, GEN_SR_2P_TX, in rk628_dsi_transfer()
620 msg->flags & MIPI_DSI_MSG_USE_LPM ? GEN_SR_2P_TX : 0); in rk628_dsi_transfer()
623 return -EINVAL; in rk628_dsi_transfer()
626 /* create a packet to the DSI protocol */ in rk628_dsi_transfer()
629 dev_err(rk628->dev, "failed to create packet\n"); in rk628_dsi_transfer()
644 ret = genif_wait_w_pld_fifo_not_full(rk628, dsi); in rk628_dsi_transfer()
650 dsi_write(rk628, dsi, DSI_GEN_PLD_DATA, val); in rk628_dsi_transfer()
654 packet.payload_length -= 4; in rk628_dsi_transfer()
668 dsi_write(rk628, dsi, DSI_GEN_PLD_DATA, val); in rk628_dsi_transfer()
672 ret = genif_wait_cmd_fifo_not_full(rk628, dsi); in rk628_dsi_transfer()
679 dsi_write(rk628, dsi, DSI_GEN_HDR, val); in rk628_dsi_transfer()
681 ret = genif_wait_write_fifo_empty(rk628, dsi); in rk628_dsi_transfer()
685 if (msg->rx_len) { in rk628_dsi_transfer()
686 ret = rk628_dsi_read_from_fifo(rk628, dsi, msg); in rk628_dsi_transfer()
691 if (dsi->slave) { in rk628_dsi_transfer()
692 const struct rk628_dsi *dsi1 = &rk628->dsi1; in rk628_dsi_transfer()
697 return msg->tx_len; in rk628_dsi_transfer()
703 const struct rk628_dsi *dsi = &rk628->dsi0; in rk628_mipi_dsi_generic_write() local
707 msg.channel = dsi->channel; in rk628_mipi_dsi_generic_write()
728 if (dsi->mode_flags & MIPI_DSI_MODE_LPM) in rk628_mipi_dsi_generic_write()
731 return rk628_dsi_transfer(rk628, dsi, &msg); in rk628_mipi_dsi_generic_write()
737 const struct rk628_dsi *dsi = &rk628->dsi0; in rk628_mipi_dsi_dcs_write_buffer() local
741 msg.channel = dsi->channel; in rk628_mipi_dsi_dcs_write_buffer()
748 return -EINVAL; in rk628_mipi_dsi_dcs_write_buffer()
760 if (dsi->mode_flags & MIPI_DSI_MODE_LPM) in rk628_mipi_dsi_dcs_write_buffer()
763 return rk628_dsi_transfer(rk628, dsi, &msg); in rk628_mipi_dsi_dcs_write_buffer()
768 const struct rk628_dsi *dsi = &rk628->dsi0; in rk628_mipi_dsi_dcs_read() local
772 msg.channel = dsi->channel; in rk628_mipi_dsi_dcs_read()
779 return rk628_dsi_transfer(rk628, dsi, &msg); in rk628_mipi_dsi_dcs_read()
791 for (i = 0; i < cmds->cmd_cnt; i++) { in panel_simple_xfer_dsi_cmd_seq()
792 struct cmd_desc *cmd = &cmds->cmds[i]; in panel_simple_xfer_dsi_cmd_seq()
794 switch (cmd->dchdr.dtype) { in panel_simple_xfer_dsi_cmd_seq()
799 err = rk628_mipi_dsi_generic_write(rk628, cmd->payload, in panel_simple_xfer_dsi_cmd_seq()
800 cmd->dchdr.dlen); in panel_simple_xfer_dsi_cmd_seq()
805 err = rk628_mipi_dsi_dcs_write_buffer(rk628, cmd->payload, in panel_simple_xfer_dsi_cmd_seq()
806 cmd->dchdr.dlen); in panel_simple_xfer_dsi_cmd_seq()
809 dev_err(rk628->dev, "panel cmd desc invalid data type\n"); in panel_simple_xfer_dsi_cmd_seq()
810 return -EINVAL; in panel_simple_xfer_dsi_cmd_seq()
814 dev_err(rk628->dev, "failed to write cmd\n"); in panel_simple_xfer_dsi_cmd_seq()
816 if (cmd->dchdr.wait) in panel_simple_xfer_dsi_cmd_seq()
817 mdelay(cmd->dchdr.wait); in panel_simple_xfer_dsi_cmd_seq()
823 static u32 rk628_dsi_get_lane_rate(const struct rk628_dsi *dsi) in rk628_dsi_get_lane_rate() argument
825 const struct rk628_display_mode *mode = &dsi->rk628->dst_mode; in rk628_dsi_get_lane_rate()
828 u8 bpp, lanes; in rk628_dsi_get_lane_rate() local
830 bpp = dsi->bpp; in rk628_dsi_get_lane_rate()
831 lanes = dsi->slave ? dsi->lanes * 2 : dsi->lanes; in rk628_dsi_get_lane_rate()
832 lane_rate = mode->clock / 1000 * bpp / lanes; in rk628_dsi_get_lane_rate()
842 const struct rk628_dsi *dsi) in testif_testclk_assert() argument
844 rk628_i2c_update_bits(rk628, dsi->id ? in testif_testclk_assert()
851 const struct rk628_dsi *dsi) in testif_testclk_deassert() argument
853 rk628_i2c_update_bits(rk628, dsi->id ? in testif_testclk_deassert()
860 const struct rk628_dsi *dsi) in testif_testclr_assert() argument
862 rk628_i2c_update_bits(rk628, dsi->id ? in testif_testclr_assert()
869 const struct rk628_dsi *dsi) in testif_testclr_deassert() argument
871 rk628_i2c_update_bits(rk628, dsi->id ? in testif_testclr_deassert()
878 const struct rk628_dsi *dsi, u8 data) in testif_set_data() argument
880 rk628_i2c_update_bits(rk628, dsi->id ? in testif_set_data()
887 const struct rk628_dsi *dsi) in testif_testen_assert() argument
889 rk628_i2c_update_bits(rk628, dsi->id ? in testif_testen_assert()
896 const struct rk628_dsi *dsi) in testif_testen_deassert() argument
898 rk628_i2c_update_bits(rk628, dsi->id ? in testif_testen_deassert()
905 const struct rk628_dsi *dsi, u8 test_code) in testif_test_code_write() argument
907 testif_testclk_assert(rk628, dsi); in testif_test_code_write()
908 testif_set_data(rk628, dsi, test_code); in testif_test_code_write()
909 testif_testen_assert(rk628, dsi); in testif_test_code_write()
910 testif_testclk_deassert(rk628, dsi); in testif_test_code_write()
911 testif_testen_deassert(rk628, dsi); in testif_test_code_write()
915 const struct rk628_dsi *dsi, u8 test_data) in testif_test_data_write() argument
917 testif_testclk_deassert(rk628, dsi); in testif_test_data_write()
918 testif_set_data(rk628, dsi, test_data); in testif_test_data_write()
919 testif_testclk_assert(rk628, dsi); in testif_test_data_write()
922 static u8 testif_get_data(struct rk628 *rk628, const struct rk628_dsi *dsi) in testif_get_data() argument
926 rk628_i2c_read(rk628, dsi->id ? GRF_DPHY1_STATUS : GRF_DPHY0_STATUS, &data); in testif_get_data()
931 static void testif_write(struct rk628 *rk628, const struct rk628_dsi *dsi, in testif_write() argument
936 testif_test_code_write(rk628, dsi, reg); in testif_write()
937 testif_test_data_write(rk628, dsi, value); in testif_write()
938 monitor_data = testif_get_data(rk628, dsi); in testif_write()
939 dev_info(rk628->dev, "monitor_data: 0x%x\n", monitor_data); in testif_write()
942 static void mipi_dphy_init(struct rk628 *rk628, const struct rk628_dsi *dsi) in mipi_dphy_init() argument
967 --index; in mipi_dphy_init()
970 testif_write(rk628, dsi, 0x44, HSFREQRANGE(hsfreqrange)); in mipi_dphy_init()
973 static void mipi_dphy_power_on(struct rk628 *rk628, const struct rk628_dsi *dsi) in mipi_dphy_power_on() argument
980 dev_id = dsi->id ? RK628_DEV_DSI1 : RK628_DEV_DSI0; in mipi_dphy_power_on()
981 dsi_base = dsi->id ? DSI1_BASE : DSI0_BASE; in mipi_dphy_power_on()
983 dsi_update_bits(rk628, dsi, DSI_PHY_RSTZ, PHY_ENABLECLK, 0); in mipi_dphy_power_on()
984 dsi_update_bits(rk628, dsi, DSI_PHY_RSTZ, PHY_SHUTDOWNZ, 0); in mipi_dphy_power_on()
985 dsi_update_bits(rk628, dsi, DSI_PHY_RSTZ, PHY_RSTZ, 0); in mipi_dphy_power_on()
986 testif_testclr_assert(rk628, dsi); in mipi_dphy_power_on()
989 rk628_i2c_update_bits(rk628, dsi->id ? in mipi_dphy_power_on()
995 testif_testclr_deassert(rk628, dsi); in mipi_dphy_power_on()
997 mipi_dphy_init(rk628, dsi); in mipi_dphy_power_on()
999 dsi_update_bits(rk628, dsi, DSI_PHY_RSTZ, in mipi_dphy_power_on()
1001 dsi_update_bits(rk628, dsi, DSI_PHY_RSTZ, in mipi_dphy_power_on()
1003 dsi_update_bits(rk628, dsi, DSI_PHY_RSTZ, PHY_RSTZ, PHY_RSTZ); in mipi_dphy_power_on()
1008 ret = regmap_read_poll_timeout(rk628->regmap[dev_id], in mipi_dphy_power_on()
1012 dev_err(rk628->dev, "PHY is not locked\n"); in mipi_dphy_power_on()
1017 ret = regmap_read_poll_timeout(rk628->regmap[dev_id], in mipi_dphy_power_on()
1022 dev_err(rk628->dev, "lane module is not in stop state\n"); in mipi_dphy_power_on()
1048 const struct rk628_dsi *dsi) in rk628_dsi_bridge_pre_enable() argument
1052 dsi_write(rk628, dsi, DSI_PWR_UP, RESET); in rk628_dsi_bridge_pre_enable()
1053 dsi_write(rk628, dsi, DSI_MODE_CFG, CMD_VIDEO_MODE(COMMAND_MODE)); in rk628_dsi_bridge_pre_enable()
1056 dsi_write(rk628, dsi, DSI_CLKMGR_CFG, in rk628_dsi_bridge_pre_enable()
1060 if (dsi->mode_flags & MIPI_DSI_MODE_EOT_PACKET) in rk628_dsi_bridge_pre_enable()
1063 dsi_write(rk628, dsi, DSI_PCKHDL_CFG, val); in rk628_dsi_bridge_pre_enable()
1065 dsi_write(rk628, dsi, DSI_TO_CNT_CFG, in rk628_dsi_bridge_pre_enable()
1067 dsi_write(rk628, dsi, DSI_BTA_TO_CNT, 0xd00); in rk628_dsi_bridge_pre_enable()
1068 dsi_write(rk628, dsi, DSI_PHY_TMR_CFG, in rk628_dsi_bridge_pre_enable()
1071 dsi_write(rk628, dsi, DSI_PHY_TMR_LPCLK_CFG, in rk628_dsi_bridge_pre_enable()
1073 dsi_write(rk628, dsi, DSI_PHY_IF_CFG, in rk628_dsi_bridge_pre_enable()
1074 PHY_STOP_WAIT_TIME(0x20) | N_LANES(dsi->lanes - 1)); in rk628_dsi_bridge_pre_enable()
1076 mipi_dphy_power_on(rk628, dsi); in rk628_dsi_bridge_pre_enable()
1078 dsi_write(rk628, dsi, DSI_PWR_UP, POWER_UP); in rk628_dsi_bridge_pre_enable()
1082 const struct rk628_dsi *dsi, in rk628_dsi_set_vid_mode() argument
1086 unsigned int dpipclk = mode->clock; in rk628_dsi_set_vid_mode()
1095 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HFP) in rk628_dsi_set_vid_mode()
1098 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HBP) in rk628_dsi_set_vid_mode()
1101 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in rk628_dsi_set_vid_mode()
1103 else if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in rk628_dsi_set_vid_mode()
1108 dsi_write(rk628, dsi, DSI_VID_MODE_CFG, val); in rk628_dsi_set_vid_mode()
1110 if (dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) in rk628_dsi_set_vid_mode()
1111 dsi_update_bits(rk628, dsi, DSI_LPCLK_CTRL, in rk628_dsi_set_vid_mode()
1114 if (dsi->slave || dsi->master) in rk628_dsi_set_vid_mode()
1115 pkt_size = VID_PKT_SIZE(mode->hdisplay / 2); in rk628_dsi_set_vid_mode()
1117 pkt_size = VID_PKT_SIZE(mode->hdisplay); in rk628_dsi_set_vid_mode()
1119 dsi_write(rk628, dsi, DSI_VID_PKT_SIZE, pkt_size); in rk628_dsi_set_vid_mode()
1121 vactive = mode->vdisplay; in rk628_dsi_set_vid_mode()
1122 vsa = mode->vsync_end - mode->vsync_start; in rk628_dsi_set_vid_mode()
1123 vfp = mode->vsync_start - mode->vdisplay; in rk628_dsi_set_vid_mode()
1124 vbp = mode->vtotal - mode->vsync_end; in rk628_dsi_set_vid_mode()
1125 hsa = mode->hsync_end - mode->hsync_start; in rk628_dsi_set_vid_mode()
1126 hbp = mode->htotal - mode->hsync_end; in rk628_dsi_set_vid_mode()
1127 hline = mode->htotal; in rk628_dsi_set_vid_mode()
1131 dsi_write(rk628, dsi, DSI_VID_HLINE_TIME, in rk628_dsi_set_vid_mode()
1135 dsi_write(rk628, dsi, DSI_VID_HSA_TIME, VID_HSA_TIME(hsa_time)); in rk628_dsi_set_vid_mode()
1138 dsi_write(rk628, dsi, DSI_VID_HBP_TIME, VID_HBP_TIME(hbp_time)); in rk628_dsi_set_vid_mode()
1140 dsi_write(rk628, dsi, DSI_VID_VACTIVE_LINES, vactive); in rk628_dsi_set_vid_mode()
1141 dsi_write(rk628, dsi, DSI_VID_VSA_LINES, vsa); in rk628_dsi_set_vid_mode()
1142 dsi_write(rk628, dsi, DSI_VID_VFP_LINES, vfp); in rk628_dsi_set_vid_mode()
1143 dsi_write(rk628, dsi, DSI_VID_VBP_LINES, vbp); in rk628_dsi_set_vid_mode()
1145 dsi_write(rk628, dsi, DSI_MODE_CFG, CMD_VIDEO_MODE(VIDEO_MODE)); in rk628_dsi_set_vid_mode()
1149 const struct rk628_dsi *dsi, in rk628_dsi_set_cmd_mode() argument
1152 dsi_update_bits(rk628, dsi, DSI_CMD_MODE_CFG, DCS_LW_TX, 0); in rk628_dsi_set_cmd_mode()
1153 dsi_write(rk628, dsi, DSI_EDPI_CMD_SIZE, in rk628_dsi_set_cmd_mode()
1154 EDPI_ALLOWED_CMD_SIZE(mode->hdisplay)); in rk628_dsi_set_cmd_mode()
1155 dsi_write(rk628, dsi, DSI_MODE_CFG, CMD_VIDEO_MODE(COMMAND_MODE)); in rk628_dsi_set_cmd_mode()
1159 const struct rk628_dsi *dsi) in rk628_dsi_bridge_enable() argument
1162 const struct rk628_display_mode *mode = &rk628->dst_mode; in rk628_dsi_bridge_enable()
1164 dsi_write(rk628, dsi, DSI_PWR_UP, RESET); in rk628_dsi_bridge_enable()
1166 switch (dsi->bus_format) { in rk628_dsi_bridge_enable()
1183 dsi_write(rk628, dsi, DSI_DPI_COLOR_CODING, val); in rk628_dsi_bridge_enable()
1186 if (mode->flags & DRM_MODE_FLAG_NVSYNC) in rk628_dsi_bridge_enable()
1188 if (mode->flags & DRM_MODE_FLAG_NHSYNC) in rk628_dsi_bridge_enable()
1191 dsi_write(rk628, dsi, DSI_DPI_CFG_POL, val); in rk628_dsi_bridge_enable()
1193 dsi_write(rk628, dsi, DSI_DPI_VCID, DPI_VID(0)); in rk628_dsi_bridge_enable()
1194 dsi_write(rk628, dsi, DSI_DPI_LP_CMD_TIM, in rk628_dsi_bridge_enable()
1196 dsi_update_bits(rk628, dsi, DSI_LPCLK_CTRL, in rk628_dsi_bridge_enable()
1199 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) in rk628_dsi_bridge_enable()
1200 rk628_dsi_set_vid_mode(rk628, dsi, mode); in rk628_dsi_bridge_enable()
1202 rk628_dsi_set_cmd_mode(rk628, dsi, mode); in rk628_dsi_bridge_enable()
1204 dsi_write(rk628, dsi, DSI_PWR_UP, POWER_UP); in rk628_dsi_bridge_enable()
1209 const struct rk628_dsi *dsi = &rk628->dsi0; in rk628_mipi_dsi_pre_enable() local
1210 const struct rk628_dsi *dsi1 = &rk628->dsi1; in rk628_mipi_dsi_pre_enable()
1211 u32 rate = rk628_dsi_get_lane_rate(dsi); in rk628_mipi_dsi_pre_enable()
1217 dsi->slave ? SW_SPLIT_EN : 0); in rk628_mipi_dsi_pre_enable()
1220 if (dsi->slave) in rk628_mipi_dsi_pre_enable()
1222 else if (dsi->id) in rk628_mipi_dsi_pre_enable()
1231 if (dsi->slave) in rk628_mipi_dsi_pre_enable()
1240 rk628_dsi_bridge_pre_enable(rk628, dsi); in rk628_mipi_dsi_pre_enable()
1242 if (dsi->slave) { in rk628_mipi_dsi_pre_enable()
1253 panel_simple_xfer_dsi_cmd_seq(rk628, rk628->panel->on_cmds); in rk628_mipi_dsi_pre_enable()
1261 dev_info(rk628->dev, "dsi: mode: 0x%x\n", mode); in rk628_mipi_dsi_pre_enable()
1264 dev_info(rk628->dev, "rk628_dsi final DSI-Link bandwidth: %d x %d\n", in rk628_mipi_dsi_pre_enable()
1265 lane_mbps, dsi->slave ? dsi->lanes * 2 : dsi->lanes); in rk628_mipi_dsi_pre_enable()
1270 const struct rk628_dsi *dsi = &rk628->dsi0; in rk628_mipi_dsi_enable() local
1271 const struct rk628_dsi *dsi1 = &rk628->dsi1; in rk628_mipi_dsi_enable()
1273 rk628_dsi_bridge_enable(rk628, dsi); in rk628_mipi_dsi_enable()
1275 if (dsi->slave) in rk628_mipi_dsi_enable()
1283 const struct rk628_dsi *dsi = &rk628->dsi0; in rk628_dsi_disable() local
1284 const struct rk628_dsi *dsi1 = &rk628->dsi1; in rk628_dsi_disable()
1288 dsi_write(rk628, dsi, DSI_PWR_UP, RESET); in rk628_dsi_disable()
1289 dsi_write(rk628, dsi, DSI_LPCLK_CTRL, 0); in rk628_dsi_disable()
1290 dsi_write(rk628, dsi, DSI_EDPI_CMD_SIZE, 0); in rk628_dsi_disable()
1291 dsi_write(rk628, dsi, DSI_MODE_CFG, CMD_VIDEO_MODE(COMMAND_MODE)); in rk628_dsi_disable()
1292 dsi_write(rk628, dsi, DSI_PWR_UP, POWER_UP); in rk628_dsi_disable()
1294 //dsi_write(rk628, dsi, DSI_PHY_RSTZ, 0); in rk628_dsi_disable()
1296 if (dsi->slave) { in rk628_dsi_disable()
1307 panel_simple_xfer_dsi_cmd_seq(rk628, rk628->panel->off_cmds); in rk628_dsi_disable()