.. | .. |
---|
751 | 751 | return msg->tx_len; |
---|
752 | 752 | } |
---|
753 | 753 | |
---|
754 | | -static int rkx120_mipi_dsi_generic_write(struct rk_serdes *des, u8 remote_id, |
---|
755 | | - const void *payload, size_t size) |
---|
| 754 | +static int rkx120_mipi_dsi_generic_write(struct rk_serdes *des, struct rkx120_dsi_tx *dsi, |
---|
| 755 | + u8 remote_id, const void *payload, size_t size) |
---|
756 | 756 | { |
---|
757 | | - const struct rkx120_dsi_tx *dsi = &des->dsi_tx; |
---|
758 | 757 | struct mipi_dsi_msg msg; |
---|
759 | 758 | |
---|
760 | 759 | memset(&msg, 0, sizeof(msg)); |
---|
.. | .. |
---|
785 | 784 | return rkx120_dsi_tx_transfer(des, remote_id, dsi, &msg); |
---|
786 | 785 | } |
---|
787 | 786 | |
---|
788 | | -static int rkx120_mipi_dsi_dcs_write_buffer(struct rk_serdes *des, u8 remote_id, |
---|
789 | | - const void *data, size_t len) |
---|
| 787 | +static int rkx120_mipi_dsi_dcs_write_buffer(struct rk_serdes *des, struct rkx120_dsi_tx *dsi, |
---|
| 788 | + u8 remote_id, const void *data, size_t len) |
---|
790 | 789 | { |
---|
791 | | - const struct rkx120_dsi_tx *dsi = &des->dsi_tx; |
---|
792 | 790 | struct mipi_dsi_msg msg; |
---|
793 | 791 | |
---|
794 | 792 | memset(&msg, 0, sizeof(msg)); |
---|
.. | .. |
---|
818 | 816 | } |
---|
819 | 817 | |
---|
820 | 818 | static __maybe_unused int |
---|
821 | | -rkx120_mipi_dsi_dcs_read(struct rk_serdes *des, u8 remote_id, |
---|
| 819 | +rkx120_mipi_dsi_dcs_read(struct rk_serdes *des, struct rkx120_dsi_tx *dsi, u8 remote_id, |
---|
822 | 820 | u8 cmd, void *data, size_t len) |
---|
823 | 821 | { |
---|
824 | | - const struct rkx120_dsi_tx *dsi = &des->dsi_tx; |
---|
825 | 822 | struct mipi_dsi_msg msg; |
---|
826 | 823 | |
---|
827 | 824 | memset(&msg, 0, sizeof(msg)); |
---|
.. | .. |
---|
835 | 832 | return rkx120_dsi_tx_transfer(des, remote_id, dsi, &msg); |
---|
836 | 833 | } |
---|
837 | 834 | |
---|
838 | | -int rkx120_dsi_tx_cmd_seq_xfer(struct rk_serdes *des, u8 remote_id, |
---|
| 835 | +int rkx120_dsi_tx_cmd_seq_xfer(struct rk_serdes *des, struct rkx120_dsi_tx *dsi, u8 remote_id, |
---|
839 | 836 | struct panel_cmds *cmds) |
---|
840 | 837 | { |
---|
841 | 838 | u16 i; |
---|
.. | .. |
---|
852 | 849 | case MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM: |
---|
853 | 850 | case MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM: |
---|
854 | 851 | case MIPI_DSI_GENERIC_LONG_WRITE: |
---|
855 | | - err = rkx120_mipi_dsi_generic_write(des, remote_id, cmd->payload, |
---|
| 852 | + err = rkx120_mipi_dsi_generic_write(des, dsi, remote_id, cmd->payload, |
---|
856 | 853 | cmd->dchdr.dlen); |
---|
857 | 854 | break; |
---|
858 | 855 | case MIPI_DSI_DCS_SHORT_WRITE: |
---|
859 | 856 | case MIPI_DSI_DCS_SHORT_WRITE_PARAM: |
---|
860 | 857 | case MIPI_DSI_DCS_LONG_WRITE: |
---|
861 | | - err = rkx120_mipi_dsi_dcs_write_buffer(des, remote_id, cmd->payload, |
---|
| 858 | + err = rkx120_mipi_dsi_dcs_write_buffer(des, dsi, remote_id, cmd->payload, |
---|
862 | 859 | cmd->dchdr.dlen); |
---|
863 | 860 | break; |
---|
864 | 861 | default: |
---|
.. | .. |
---|
901 | 898 | } |
---|
902 | 899 | |
---|
903 | 900 | static void |
---|
904 | | -mipi_dphy_power_on(struct rk_serdes *des, const struct rkx120_dsi_tx *dsi, u8 remote_id) |
---|
| 901 | +mipi_dphy_power_on(struct rk_serdes *des, const struct rkx120_dsi_tx *dsi, |
---|
| 902 | + u8 remote_id) |
---|
905 | 903 | { |
---|
906 | 904 | struct i2c_client *client = des->chip[remote_id].client; |
---|
907 | 905 | u32 val, mask; |
---|
.. | .. |
---|
920 | 918 | dsi_update_bits(des, remote_id, DSI_PHY_RSTZ, PHY_RSTZ, PHY_RSTZ); |
---|
921 | 919 | usleep_range(1500, 2000); |
---|
922 | 920 | |
---|
923 | | - rkx120_combtxphy_power_on(des, remote_id, 0); |
---|
| 921 | + rkx120_combtxphy_power_on(des, dsi->combtxphy, remote_id, 0); |
---|
924 | 922 | |
---|
925 | 923 | ret = read_poll_timeout(des->i2c_read_reg, ret, |
---|
926 | 924 | !(ret < 0) && (val & PHY_LOCK), |
---|
.. | .. |
---|
954 | 952 | //dsi_i2c_write(des, remote_id, CRU_SOFTRST_CON02, 0x400000); |
---|
955 | 953 | } |
---|
956 | 954 | |
---|
957 | | -static void rkx120_dsi_tx_bridge_pre_enable(struct rk_serdes *des, u8 remote_id) |
---|
| 955 | +static void rkx120_dsi_tx_bridge_pre_enable(struct rk_serdes *des, struct rkx120_dsi_tx *dsi, |
---|
| 956 | + u8 remote_id) |
---|
958 | 957 | { |
---|
959 | | - struct rkx120_dsi_tx *dsi = &des->dsi_tx; |
---|
960 | 958 | u32 val; |
---|
961 | 959 | |
---|
962 | 960 | dsi_write(des, remote_id, DSI_PWR_UP, RESET); |
---|
.. | .. |
---|
1064 | 1062 | } |
---|
1065 | 1063 | |
---|
1066 | 1064 | static void |
---|
1067 | | -rkx120_dsi_tx_bridge_enable(struct rk_serdes *des, u8 remote_id) |
---|
| 1065 | +rkx120_dsi_tx_bridge_enable(struct rk_serdes *des, struct rkx120_dsi_tx *dsi, u8 remote_id) |
---|
1068 | 1066 | { |
---|
1069 | | - struct rkx120_dsi_tx *dsi = &des->dsi_tx; |
---|
1070 | 1067 | const struct videomode *vm = dsi->vm; |
---|
1071 | 1068 | u32 val; |
---|
1072 | 1069 | |
---|
.. | .. |
---|
1117 | 1114 | struct rk_serdes_route *route, |
---|
1118 | 1115 | u8 remote_id) |
---|
1119 | 1116 | { |
---|
1120 | | - struct rkx120_dsi_tx *dsi = &des->dsi_tx; |
---|
| 1117 | + struct rk_serdes_panel *sd_panel = container_of(route, struct rk_serdes_panel, route); |
---|
| 1118 | + struct rkx120_dsi_tx *dsi = &sd_panel->dsi_tx; |
---|
1121 | 1119 | u64 rate; |
---|
1122 | 1120 | |
---|
1123 | 1121 | dsi->vm = &route->vm; |
---|
1124 | 1122 | rate = rkx120_dsi_tx_get_lane_rate(dsi); |
---|
1125 | 1123 | |
---|
1126 | | - rkx120_combtxphy_set_mode(des, COMBTX_PHY_MODE_VIDEO_MIPI); |
---|
1127 | | - rkx120_combtxphy_set_rate(des, rate); |
---|
1128 | | - lane_kbps = rkx120_combtxphy_get_rate(des) / MSEC_PER_SEC; |
---|
| 1124 | + rkx120_combtxphy_set_mode(dsi->combtxphy, COMBTX_PHY_MODE_VIDEO_MIPI); |
---|
| 1125 | + rkx120_combtxphy_set_rate(dsi->combtxphy, rate); |
---|
| 1126 | + lane_kbps = rkx120_combtxphy_get_rate(dsi->combtxphy) / MSEC_PER_SEC; |
---|
1129 | 1127 | |
---|
1130 | 1128 | /* rst for dsi */ |
---|
1131 | 1129 | rkx120_dsi_tx_reset_control_assert(des, remote_id); |
---|
.. | .. |
---|
1133 | 1131 | rkx120_dsi_tx_reset_control_deassert(des, remote_id); |
---|
1134 | 1132 | usleep_range(20, 40); |
---|
1135 | 1133 | |
---|
1136 | | - rkx120_dsi_tx_bridge_pre_enable(des, remote_id); |
---|
1137 | | - |
---|
| 1134 | + rkx120_dsi_tx_bridge_pre_enable(des, dsi, remote_id); |
---|
1138 | 1135 | #ifdef DSI_READ_POWER_MODE |
---|
1139 | 1136 | u8 mode; |
---|
1140 | 1137 | |
---|
1141 | | - rkx120_mipi_dsi_dcs_read(des, remote_id, MIPI_DCS_GET_POWER_MODE, |
---|
| 1138 | + rkx120_mipi_dsi_dcs_read(des, dsi, remote_id, MIPI_DCS_GET_POWER_MODE, |
---|
1142 | 1139 | &mode, sizeof(mode)); |
---|
1143 | 1140 | |
---|
1144 | 1141 | dev_info(rkx120->dev, "dsi: mode: 0x%x\n", mode); |
---|
.. | .. |
---|
1149 | 1146 | struct rk_serdes_route *route, |
---|
1150 | 1147 | u8 remote_id) |
---|
1151 | 1148 | { |
---|
1152 | | - struct rkx120_dsi_tx *dsi = &des->dsi_tx; |
---|
| 1149 | + struct rk_serdes_panel *sd_panel = container_of(route, struct rk_serdes_panel, route); |
---|
| 1150 | + struct rkx120_dsi_tx *dsi = &sd_panel->dsi_tx; |
---|
1153 | 1151 | |
---|
1154 | 1152 | #ifdef DSI_READ_POWER_MODE |
---|
1155 | 1153 | u8 mode; |
---|
1156 | 1154 | |
---|
1157 | | - rkx120_mipi_dsi_dcs_read(des, remote_id, MIPI_DCS_GET_POWER_MODE, |
---|
| 1155 | + rkx120_mipi_dsi_dcs_read(des, dsi, remote_id, MIPI_DCS_GET_POWER_MODE, |
---|
1158 | 1156 | &mode, sizeof(mode)); |
---|
1159 | 1157 | |
---|
1160 | 1158 | dev_info(rkx120->dev, "dsi: mode: 0x%x\n", mode); |
---|
1161 | 1159 | #endif |
---|
1162 | | - rkx120_dsi_tx_bridge_enable(des, remote_id); |
---|
| 1160 | + rkx120_dsi_tx_bridge_enable(des, dsi, remote_id); |
---|
1163 | 1161 | |
---|
1164 | 1162 | dev_info(des->dev, "rkx120_dsi_tx final DSI-Link bandwidth: %llu Kbps x %d lanes\n", |
---|
1165 | 1163 | lane_kbps, dsi->lanes); |
---|
.. | .. |
---|
1169 | 1167 | struct rk_serdes_route *route, |
---|
1170 | 1168 | u8 remote_id) |
---|
1171 | 1169 | { |
---|
1172 | | - rkx120_combtxphy_power_off(des, remote_id); |
---|
| 1170 | + struct rk_serdes_panel *sd_panel = container_of(route, struct rk_serdes_panel, route); |
---|
| 1171 | + struct rkx120_dsi_tx *dsi = &sd_panel->dsi_tx; |
---|
| 1172 | + |
---|
| 1173 | + rkx120_combtxphy_power_off(des, dsi->combtxphy, remote_id, 0); |
---|
1173 | 1174 | } |
---|
1174 | 1175 | |
---|
1175 | 1176 | void rkx120_dsi_tx_disable(struct rk_serdes *des, struct rk_serdes_route *route, u8 remote_id) |
---|