mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 04:48:04 +09:00
drm/rockchip: dsi: Send turnaround request after a read request for dsi1
dphy_tx1 need to manually handle turn around request to generate the BTA. Test on RK3288 Change-Id: I0f552e57d1bea26aec3431f870773fbee3a705b9 Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
This commit is contained in:
@@ -596,6 +596,46 @@ static int dw_mipi_dsi_shutdown_peripheral(struct dw_mipi_dsi *dsi)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int dw_mipi_dsi_turn_around_request(struct dw_mipi_dsi *dsi)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* assign dphy_tx1_phyturnrequest = grf_dphy_tx1rx1_basedir ?
|
||||||
|
* dphy_tx1_phyturnrequest_i : grf_dphy_tx1rx1_turnrequest[0]
|
||||||
|
*/
|
||||||
|
if (!IS_DSI1(dsi))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Set TURNREQUEST_N = 1'b1 */
|
||||||
|
grf_field_write(dsi, TURNREQUEST, 1);
|
||||||
|
|
||||||
|
/* Wait until DIRECTION_N output is set to 1'b1 */
|
||||||
|
ret = regmap_read_poll_timeout(dsi->regmap, DSI_PHY_STATUS,
|
||||||
|
val, val & PHY_DIRECTION, 0, 5000);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dsi->dev, "wait direction asserted timeout\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set TURNREQUEST_N = 1'b0 */
|
||||||
|
grf_field_write(dsi, TURNREQUEST, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait until STOPSTATEDATA_N is asserted
|
||||||
|
* (turnaround procedure is completed)
|
||||||
|
*/
|
||||||
|
ret = regmap_read_poll_timeout(dsi->regmap, DSI_PHY_STATUS,
|
||||||
|
val, val & PHY_STOPSTATE0LANE, 0, 5000);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dsi->dev, "wait stopstatedata0 asserted timeout\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void dw_mipi_dsi_host_power_on(struct dw_mipi_dsi *dsi)
|
static void dw_mipi_dsi_host_power_on(struct dw_mipi_dsi *dsi)
|
||||||
{
|
{
|
||||||
regmap_write(dsi->regmap, DSI_PWR_UP, POWERUP);
|
regmap_write(dsi->regmap, DSI_PWR_UP, POWERUP);
|
||||||
@@ -994,6 +1034,13 @@ static ssize_t dw_mipi_dsi_transfer(struct dw_mipi_dsi *dsi,
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (msg->rx_len) {
|
if (msg->rx_len) {
|
||||||
|
ret = dw_mipi_dsi_turn_around_request(dsi);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dsi->dev,
|
||||||
|
"failed to send turn around request\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = dw_mipi_dsi_read_from_fifo(dsi, msg);
|
ret = dw_mipi_dsi_read_from_fifo(dsi, msg);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user