| .. | .. |
|---|
| 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) |
|---|