Commit d8171145 authored by Tomi Valkeinen's avatar Tomi Valkeinen

drm/omap: dsi: rename 'channel' to 'vc'

The "channel" usage in omap dsi driver is confusing. We have three
different "channels":

1) DSI virtual channel ID. This is a number from 0 to 3, included in the
packet payload.

2) VC. This is a register block in the DSI IP. There are four of those
blocks. A VC is a DSI "pipeline", with defined fifo settings, data
source (cpu or dispc), and some other settings. It has no relation to
the 1).

3) dispc channel. It's the "pipeline" number dispc uses to send pixel
data.

The previous patch handled the third case.

 To start fixing 1) and 2), we first rename all uses of 'channel' to
'vc', as in most of the cases that is the correct thing to use.

However, in some places 1) and 2) have gotten mixed up (i.e. the code
uses msg->channel when it should use vc), which will be fixed in the
following patch.

Note that mixing 1) and 2) currently is "fine", as at the moment we only
support DSI peripherals with DSI virtual channel 0, and we always use
VC0 to send data. So both 1) and 2) are always 0.
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201215104657.802264-66-tomi.valkeinen@ti.com
parent f408600f
...@@ -214,7 +214,7 @@ static void dsi_set_ulps_auto(struct dsi_data *dsi, bool enable); ...@@ -214,7 +214,7 @@ static void dsi_set_ulps_auto(struct dsi_data *dsi, bool enable);
static int dsi_display_init_dispc(struct dsi_data *dsi); static int dsi_display_init_dispc(struct dsi_data *dsi);
static void dsi_display_uninit_dispc(struct dsi_data *dsi); static void dsi_display_uninit_dispc(struct dsi_data *dsi);
static int dsi_vc_send_null(struct dsi_data *dsi, int channel); static int dsi_vc_send_null(struct dsi_data *dsi, int vc);
static ssize_t _omap_dsi_host_transfer(struct dsi_data *dsi, static ssize_t _omap_dsi_host_transfer(struct dsi_data *dsi,
const struct mipi_dsi_msg *msg); const struct mipi_dsi_msg *msg);
...@@ -376,7 +376,7 @@ struct dsi_data { ...@@ -376,7 +376,7 @@ struct dsi_data {
/* space for a copy used by the interrupt handler */ /* space for a copy used by the interrupt handler */
struct dsi_isr_tables isr_tables_copy; struct dsi_isr_tables isr_tables_copy;
int update_channel; int update_vc;
#ifdef DSI_PERF_MEASURE #ifdef DSI_PERF_MEASURE
unsigned int update_bytes; unsigned int update_bytes;
#endif #endif
...@@ -639,7 +639,7 @@ static void print_irq_status(u32 status) ...@@ -639,7 +639,7 @@ static void print_irq_status(u32 status)
#undef PIS #undef PIS
} }
static void print_irq_status_vc(int channel, u32 status) static void print_irq_status_vc(int vc, u32 status)
{ {
if (status == 0) if (status == 0)
return; return;
...@@ -650,7 +650,7 @@ static void print_irq_status_vc(int channel, u32 status) ...@@ -650,7 +650,7 @@ static void print_irq_status_vc(int channel, u32 status)
#define PIS(x) (status & DSI_VC_IRQ_##x) ? (#x " ") : "" #define PIS(x) (status & DSI_VC_IRQ_##x) ? (#x " ") : ""
pr_debug("DSI VC(%d) IRQ 0x%x: %s%s%s%s%s%s%s%s%s\n", pr_debug("DSI VC(%d) IRQ 0x%x: %s%s%s%s%s%s%s%s%s\n",
channel, vc,
status, status,
PIS(CS), PIS(CS),
PIS(ECC_CORR), PIS(ECC_CORR),
...@@ -1031,7 +1031,7 @@ static int dsi_unregister_isr(struct dsi_data *dsi, omap_dsi_isr_t isr, ...@@ -1031,7 +1031,7 @@ static int dsi_unregister_isr(struct dsi_data *dsi, omap_dsi_isr_t isr,
return r; return r;
} }
static int dsi_register_isr_vc(struct dsi_data *dsi, int channel, static int dsi_register_isr_vc(struct dsi_data *dsi, int vc,
omap_dsi_isr_t isr, void *arg, u32 mask) omap_dsi_isr_t isr, void *arg, u32 mask)
{ {
unsigned long flags; unsigned long flags;
...@@ -1040,18 +1040,18 @@ static int dsi_register_isr_vc(struct dsi_data *dsi, int channel, ...@@ -1040,18 +1040,18 @@ static int dsi_register_isr_vc(struct dsi_data *dsi, int channel,
spin_lock_irqsave(&dsi->irq_lock, flags); spin_lock_irqsave(&dsi->irq_lock, flags);
r = _dsi_register_isr(isr, arg, mask, r = _dsi_register_isr(isr, arg, mask,
dsi->isr_tables.isr_table_vc[channel], dsi->isr_tables.isr_table_vc[vc],
ARRAY_SIZE(dsi->isr_tables.isr_table_vc[channel])); ARRAY_SIZE(dsi->isr_tables.isr_table_vc[vc]));
if (r == 0) if (r == 0)
_omap_dsi_set_irqs_vc(dsi, channel); _omap_dsi_set_irqs_vc(dsi, vc);
spin_unlock_irqrestore(&dsi->irq_lock, flags); spin_unlock_irqrestore(&dsi->irq_lock, flags);
return r; return r;
} }
static int dsi_unregister_isr_vc(struct dsi_data *dsi, int channel, static int dsi_unregister_isr_vc(struct dsi_data *dsi, int vc,
omap_dsi_isr_t isr, void *arg, u32 mask) omap_dsi_isr_t isr, void *arg, u32 mask)
{ {
unsigned long flags; unsigned long flags;
...@@ -1060,11 +1060,11 @@ static int dsi_unregister_isr_vc(struct dsi_data *dsi, int channel, ...@@ -1060,11 +1060,11 @@ static int dsi_unregister_isr_vc(struct dsi_data *dsi, int channel,
spin_lock_irqsave(&dsi->irq_lock, flags); spin_lock_irqsave(&dsi->irq_lock, flags);
r = _dsi_unregister_isr(isr, arg, mask, r = _dsi_unregister_isr(isr, arg, mask,
dsi->isr_tables.isr_table_vc[channel], dsi->isr_tables.isr_table_vc[vc],
ARRAY_SIZE(dsi->isr_tables.isr_table_vc[channel])); ARRAY_SIZE(dsi->isr_tables.isr_table_vc[vc]));
if (r == 0) if (r == 0)
_omap_dsi_set_irqs_vc(dsi, channel); _omap_dsi_set_irqs_vc(dsi, vc);
spin_unlock_irqrestore(&dsi->irq_lock, flags); spin_unlock_irqrestore(&dsi->irq_lock, flags);
...@@ -2234,9 +2234,9 @@ static int dsi_force_tx_stop_mode_io(struct dsi_data *dsi) ...@@ -2234,9 +2234,9 @@ static int dsi_force_tx_stop_mode_io(struct dsi_data *dsi)
return 0; return 0;
} }
static bool dsi_vc_is_enabled(struct dsi_data *dsi, int channel) static bool dsi_vc_is_enabled(struct dsi_data *dsi, int vc)
{ {
return REG_GET(dsi, DSI_VC_CTRL(channel), 0, 0); return REG_GET(dsi, DSI_VC_CTRL(vc), 0, 0);
} }
static void dsi_packet_sent_handler_vp(void *data, u32 mask) static void dsi_packet_sent_handler_vp(void *data, u32 mask)
...@@ -2244,14 +2244,14 @@ static void dsi_packet_sent_handler_vp(void *data, u32 mask) ...@@ -2244,14 +2244,14 @@ static void dsi_packet_sent_handler_vp(void *data, u32 mask)
struct dsi_packet_sent_handler_data *vp_data = struct dsi_packet_sent_handler_data *vp_data =
(struct dsi_packet_sent_handler_data *) data; (struct dsi_packet_sent_handler_data *) data;
struct dsi_data *dsi = vp_data->dsi; struct dsi_data *dsi = vp_data->dsi;
const int channel = dsi->update_channel; const int vc = dsi->update_vc;
u8 bit = dsi->te_enabled ? 30 : 31; u8 bit = dsi->te_enabled ? 30 : 31;
if (REG_GET(dsi, DSI_VC_TE(channel), bit, bit) == 0) if (REG_GET(dsi, DSI_VC_TE(vc), bit, bit) == 0)
complete(vp_data->completion); complete(vp_data->completion);
} }
static int dsi_sync_vc_vp(struct dsi_data *dsi, int channel) static int dsi_sync_vc_vp(struct dsi_data *dsi, int vc)
{ {
DECLARE_COMPLETION_ONSTACK(completion); DECLARE_COMPLETION_ONSTACK(completion);
struct dsi_packet_sent_handler_data vp_data = { struct dsi_packet_sent_handler_data vp_data = {
...@@ -2263,13 +2263,13 @@ static int dsi_sync_vc_vp(struct dsi_data *dsi, int channel) ...@@ -2263,13 +2263,13 @@ static int dsi_sync_vc_vp(struct dsi_data *dsi, int channel)
bit = dsi->te_enabled ? 30 : 31; bit = dsi->te_enabled ? 30 : 31;
r = dsi_register_isr_vc(dsi, channel, dsi_packet_sent_handler_vp, r = dsi_register_isr_vc(dsi, vc, dsi_packet_sent_handler_vp,
&vp_data, DSI_VC_IRQ_PACKET_SENT); &vp_data, DSI_VC_IRQ_PACKET_SENT);
if (r) if (r)
goto err0; goto err0;
/* Wait for completion only if TE_EN/TE_START is still set */ /* Wait for completion only if TE_EN/TE_START is still set */
if (REG_GET(dsi, DSI_VC_TE(channel), bit, bit)) { if (REG_GET(dsi, DSI_VC_TE(vc), bit, bit)) {
if (wait_for_completion_timeout(&completion, if (wait_for_completion_timeout(&completion,
msecs_to_jiffies(10)) == 0) { msecs_to_jiffies(10)) == 0) {
DSSERR("Failed to complete previous frame transfer\n"); DSSERR("Failed to complete previous frame transfer\n");
...@@ -2278,12 +2278,12 @@ static int dsi_sync_vc_vp(struct dsi_data *dsi, int channel) ...@@ -2278,12 +2278,12 @@ static int dsi_sync_vc_vp(struct dsi_data *dsi, int channel)
} }
} }
dsi_unregister_isr_vc(dsi, channel, dsi_packet_sent_handler_vp, dsi_unregister_isr_vc(dsi, vc, dsi_packet_sent_handler_vp,
&vp_data, DSI_VC_IRQ_PACKET_SENT); &vp_data, DSI_VC_IRQ_PACKET_SENT);
return 0; return 0;
err1: err1:
dsi_unregister_isr_vc(dsi, channel, dsi_packet_sent_handler_vp, dsi_unregister_isr_vc(dsi, vc, dsi_packet_sent_handler_vp,
&vp_data, DSI_VC_IRQ_PACKET_SENT); &vp_data, DSI_VC_IRQ_PACKET_SENT);
err0: err0:
return r; return r;
...@@ -2294,13 +2294,13 @@ static void dsi_packet_sent_handler_l4(void *data, u32 mask) ...@@ -2294,13 +2294,13 @@ static void dsi_packet_sent_handler_l4(void *data, u32 mask)
struct dsi_packet_sent_handler_data *l4_data = struct dsi_packet_sent_handler_data *l4_data =
(struct dsi_packet_sent_handler_data *) data; (struct dsi_packet_sent_handler_data *) data;
struct dsi_data *dsi = l4_data->dsi; struct dsi_data *dsi = l4_data->dsi;
const int channel = dsi->update_channel; const int vc = dsi->update_vc;
if (REG_GET(dsi, DSI_VC_CTRL(channel), 5, 5) == 0) if (REG_GET(dsi, DSI_VC_CTRL(vc), 5, 5) == 0)
complete(l4_data->completion); complete(l4_data->completion);
} }
static int dsi_sync_vc_l4(struct dsi_data *dsi, int channel) static int dsi_sync_vc_l4(struct dsi_data *dsi, int vc)
{ {
DECLARE_COMPLETION_ONSTACK(completion); DECLARE_COMPLETION_ONSTACK(completion);
struct dsi_packet_sent_handler_data l4_data = { struct dsi_packet_sent_handler_data l4_data = {
...@@ -2309,13 +2309,13 @@ static int dsi_sync_vc_l4(struct dsi_data *dsi, int channel) ...@@ -2309,13 +2309,13 @@ static int dsi_sync_vc_l4(struct dsi_data *dsi, int channel)
}; };
int r = 0; int r = 0;
r = dsi_register_isr_vc(dsi, channel, dsi_packet_sent_handler_l4, r = dsi_register_isr_vc(dsi, vc, dsi_packet_sent_handler_l4,
&l4_data, DSI_VC_IRQ_PACKET_SENT); &l4_data, DSI_VC_IRQ_PACKET_SENT);
if (r) if (r)
goto err0; goto err0;
/* Wait for completion only if TX_FIFO_NOT_EMPTY is still set */ /* Wait for completion only if TX_FIFO_NOT_EMPTY is still set */
if (REG_GET(dsi, DSI_VC_CTRL(channel), 5, 5)) { if (REG_GET(dsi, DSI_VC_CTRL(vc), 5, 5)) {
if (wait_for_completion_timeout(&completion, if (wait_for_completion_timeout(&completion,
msecs_to_jiffies(10)) == 0) { msecs_to_jiffies(10)) == 0) {
DSSERR("Failed to complete previous l4 transfer\n"); DSSERR("Failed to complete previous l4 transfer\n");
...@@ -2324,47 +2324,47 @@ static int dsi_sync_vc_l4(struct dsi_data *dsi, int channel) ...@@ -2324,47 +2324,47 @@ static int dsi_sync_vc_l4(struct dsi_data *dsi, int channel)
} }
} }
dsi_unregister_isr_vc(dsi, channel, dsi_packet_sent_handler_l4, dsi_unregister_isr_vc(dsi, vc, dsi_packet_sent_handler_l4,
&l4_data, DSI_VC_IRQ_PACKET_SENT); &l4_data, DSI_VC_IRQ_PACKET_SENT);
return 0; return 0;
err1: err1:
dsi_unregister_isr_vc(dsi, channel, dsi_packet_sent_handler_l4, dsi_unregister_isr_vc(dsi, vc, dsi_packet_sent_handler_l4,
&l4_data, DSI_VC_IRQ_PACKET_SENT); &l4_data, DSI_VC_IRQ_PACKET_SENT);
err0: err0:
return r; return r;
} }
static int dsi_sync_vc(struct dsi_data *dsi, int channel) static int dsi_sync_vc(struct dsi_data *dsi, int vc)
{ {
WARN_ON(!dsi_bus_is_locked(dsi)); WARN_ON(!dsi_bus_is_locked(dsi));
WARN_ON(in_interrupt()); WARN_ON(in_interrupt());
if (!dsi_vc_is_enabled(dsi, channel)) if (!dsi_vc_is_enabled(dsi, vc))
return 0; return 0;
switch (dsi->vc[channel].source) { switch (dsi->vc[vc].source) {
case DSI_VC_SOURCE_VP: case DSI_VC_SOURCE_VP:
return dsi_sync_vc_vp(dsi, channel); return dsi_sync_vc_vp(dsi, vc);
case DSI_VC_SOURCE_L4: case DSI_VC_SOURCE_L4:
return dsi_sync_vc_l4(dsi, channel); return dsi_sync_vc_l4(dsi, vc);
default: default:
BUG(); BUG();
return -EINVAL; return -EINVAL;
} }
} }
static int dsi_vc_enable(struct dsi_data *dsi, int channel, bool enable) static int dsi_vc_enable(struct dsi_data *dsi, int vc, bool enable)
{ {
DSSDBG("dsi_vc_enable channel %d, enable %d\n", DSSDBG("dsi_vc_enable vc %d, enable %d\n",
channel, enable); vc, enable);
enable = enable ? 1 : 0; enable = enable ? 1 : 0;
REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), enable, 0, 0); REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), enable, 0, 0);
if (!wait_for_bit_change(dsi, DSI_VC_CTRL(channel), 0, enable)) { if (!wait_for_bit_change(dsi, DSI_VC_CTRL(vc), 0, enable)) {
DSSERR("Failed to set dsi_vc_enable to %d\n", enable); DSSERR("Failed to set dsi_vc_enable to %d\n", enable);
return -EIO; return -EIO;
} }
...@@ -2372,17 +2372,17 @@ static int dsi_vc_enable(struct dsi_data *dsi, int channel, bool enable) ...@@ -2372,17 +2372,17 @@ static int dsi_vc_enable(struct dsi_data *dsi, int channel, bool enable)
return 0; return 0;
} }
static void dsi_vc_initial_config(struct dsi_data *dsi, int channel) static void dsi_vc_initial_config(struct dsi_data *dsi, int vc)
{ {
u32 r; u32 r;
DSSDBG("Initial config of virtual channel %d", channel); DSSDBG("Initial config of VC %d", vc);
r = dsi_read_reg(dsi, DSI_VC_CTRL(channel)); r = dsi_read_reg(dsi, DSI_VC_CTRL(vc));
if (FLD_GET(r, 15, 15)) /* VC_BUSY */ if (FLD_GET(r, 15, 15)) /* VC_BUSY */
DSSERR("VC(%d) busy when trying to configure it!\n", DSSERR("VC(%d) busy when trying to configure it!\n",
channel); vc);
r = FLD_MOD(r, 0, 1, 1); /* SOURCE, 0 = L4 */ r = FLD_MOD(r, 0, 1, 1); /* SOURCE, 0 = L4 */
r = FLD_MOD(r, 0, 2, 2); /* BTA_SHORT_EN */ r = FLD_MOD(r, 0, 2, 2); /* BTA_SHORT_EN */
...@@ -2397,76 +2397,76 @@ static void dsi_vc_initial_config(struct dsi_data *dsi, int channel) ...@@ -2397,76 +2397,76 @@ static void dsi_vc_initial_config(struct dsi_data *dsi, int channel)
r = FLD_MOD(r, 4, 29, 27); /* DMA_RX_REQ_NB = no dma */ r = FLD_MOD(r, 4, 29, 27); /* DMA_RX_REQ_NB = no dma */
r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */ r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */
dsi_write_reg(dsi, DSI_VC_CTRL(channel), r); dsi_write_reg(dsi, DSI_VC_CTRL(vc), r);
dsi->vc[channel].source = DSI_VC_SOURCE_L4; dsi->vc[vc].source = DSI_VC_SOURCE_L4;
} }
static int dsi_vc_config_source(struct dsi_data *dsi, int channel, static int dsi_vc_config_source(struct dsi_data *dsi, int vc,
enum dsi_vc_source source) enum dsi_vc_source source)
{ {
if (dsi->vc[channel].source == source) if (dsi->vc[vc].source == source)
return 0; return 0;
DSSDBG("Source config of virtual channel %d", channel); DSSDBG("Source config of VC %d", vc);
dsi_sync_vc(dsi, channel); dsi_sync_vc(dsi, vc);
dsi_vc_enable(dsi, channel, 0); dsi_vc_enable(dsi, vc, 0);
/* VC_BUSY */ /* VC_BUSY */
if (!wait_for_bit_change(dsi, DSI_VC_CTRL(channel), 15, 0)) { if (!wait_for_bit_change(dsi, DSI_VC_CTRL(vc), 15, 0)) {
DSSERR("vc(%d) busy when trying to config for VP\n", channel); DSSERR("vc(%d) busy when trying to config for VP\n", vc);
return -EIO; return -EIO;
} }
/* SOURCE, 0 = L4, 1 = video port */ /* SOURCE, 0 = L4, 1 = video port */
REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), source, 1, 1); REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), source, 1, 1);
/* DCS_CMD_ENABLE */ /* DCS_CMD_ENABLE */
if (dsi->data->quirks & DSI_QUIRK_DCS_CMD_CONFIG_VC) { if (dsi->data->quirks & DSI_QUIRK_DCS_CMD_CONFIG_VC) {
bool enable = source == DSI_VC_SOURCE_VP; bool enable = source == DSI_VC_SOURCE_VP;
REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), enable, 30, 30); REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), enable, 30, 30);
} }
dsi_vc_enable(dsi, channel, 1); dsi_vc_enable(dsi, vc, 1);
dsi->vc[channel].source = source; dsi->vc[vc].source = source;
return 0; return 0;
} }
static void dsi_vc_enable_hs(struct omap_dss_device *dssdev, int channel, static void dsi_vc_enable_hs(struct omap_dss_device *dssdev, int vc,
bool enable) bool enable)
{ {
struct dsi_data *dsi = to_dsi_data(dssdev); struct dsi_data *dsi = to_dsi_data(dssdev);
DSSDBG("dsi_vc_enable_hs(%d, %d)\n", channel, enable); DSSDBG("dsi_vc_enable_hs(%d, %d)\n", vc, enable);
WARN_ON(!dsi_bus_is_locked(dsi)); WARN_ON(!dsi_bus_is_locked(dsi));
dsi_vc_enable(dsi, channel, 0); dsi_vc_enable(dsi, vc, 0);
dsi_if_enable(dsi, 0); dsi_if_enable(dsi, 0);
REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), enable, 9, 9); REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), enable, 9, 9);
dsi_vc_enable(dsi, channel, 1); dsi_vc_enable(dsi, vc, 1);
dsi_if_enable(dsi, 1); dsi_if_enable(dsi, 1);
dsi_force_tx_stop_mode_io(dsi); dsi_force_tx_stop_mode_io(dsi);
/* start the DDR clock by sending a NULL packet */ /* start the DDR clock by sending a NULL packet */
if (dsi->vm_timings.ddr_clk_always_on && enable) if (dsi->vm_timings.ddr_clk_always_on && enable)
dsi_vc_send_null(dsi, channel); dsi_vc_send_null(dsi, vc);
dsi->in_lp_mode = !enable; dsi->in_lp_mode = !enable;
} }
static void dsi_vc_flush_long_data(struct dsi_data *dsi, int channel) static void dsi_vc_flush_long_data(struct dsi_data *dsi, int vc)
{ {
while (REG_GET(dsi, DSI_VC_CTRL(channel), 20, 20)) { while (REG_GET(dsi, DSI_VC_CTRL(vc), 20, 20)) {
u32 val; u32 val;
val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(channel)); val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(vc));
DSSDBG("\t\tb1 %#02x b2 %#02x b3 %#02x b4 %#02x\n", DSSDBG("\t\tb1 %#02x b2 %#02x b3 %#02x b4 %#02x\n",
(val >> 0) & 0xff, (val >> 0) & 0xff,
(val >> 8) & 0xff, (val >> 8) & 0xff,
...@@ -2512,13 +2512,13 @@ static void dsi_show_rx_ack_with_err(u16 err) ...@@ -2512,13 +2512,13 @@ static void dsi_show_rx_ack_with_err(u16 err)
DSSERR("\t\tDSI Protocol Violation\n"); DSSERR("\t\tDSI Protocol Violation\n");
} }
static u16 dsi_vc_flush_receive_data(struct dsi_data *dsi, int channel) static u16 dsi_vc_flush_receive_data(struct dsi_data *dsi, int vc)
{ {
/* RX_FIFO_NOT_EMPTY */ /* RX_FIFO_NOT_EMPTY */
while (REG_GET(dsi, DSI_VC_CTRL(channel), 20, 20)) { while (REG_GET(dsi, DSI_VC_CTRL(vc), 20, 20)) {
u32 val; u32 val;
u8 dt; u8 dt;
val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(channel)); val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(vc));
DSSERR("\trawval %#08x\n", val); DSSERR("\trawval %#08x\n", val);
dt = FLD_GET(val, 5, 0); dt = FLD_GET(val, 5, 0);
if (dt == MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT) { if (dt == MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT) {
...@@ -2533,7 +2533,7 @@ static u16 dsi_vc_flush_receive_data(struct dsi_data *dsi, int channel) ...@@ -2533,7 +2533,7 @@ static u16 dsi_vc_flush_receive_data(struct dsi_data *dsi, int channel)
} else if (dt == MIPI_DSI_RX_DCS_LONG_READ_RESPONSE) { } else if (dt == MIPI_DSI_RX_DCS_LONG_READ_RESPONSE) {
DSSERR("\tDCS long response, len %d\n", DSSERR("\tDCS long response, len %d\n",
FLD_GET(val, 23, 8)); FLD_GET(val, 23, 8));
dsi_vc_flush_long_data(dsi, channel); dsi_vc_flush_long_data(dsi, vc);
} else { } else {
DSSERR("\tunknown datatype 0x%02x\n", dt); DSSERR("\tunknown datatype 0x%02x\n", dt);
} }
...@@ -2541,35 +2541,35 @@ static u16 dsi_vc_flush_receive_data(struct dsi_data *dsi, int channel) ...@@ -2541,35 +2541,35 @@ static u16 dsi_vc_flush_receive_data(struct dsi_data *dsi, int channel)
return 0; return 0;
} }
static int dsi_vc_send_bta(struct dsi_data *dsi, int channel) static int dsi_vc_send_bta(struct dsi_data *dsi, int vc)
{ {
if (dsi->debug_write || dsi->debug_read) if (dsi->debug_write || dsi->debug_read)
DSSDBG("dsi_vc_send_bta %d\n", channel); DSSDBG("dsi_vc_send_bta %d\n", vc);
WARN_ON(!dsi_bus_is_locked(dsi)); WARN_ON(!dsi_bus_is_locked(dsi));
/* RX_FIFO_NOT_EMPTY */ /* RX_FIFO_NOT_EMPTY */
if (REG_GET(dsi, DSI_VC_CTRL(channel), 20, 20)) { if (REG_GET(dsi, DSI_VC_CTRL(vc), 20, 20)) {
DSSERR("rx fifo not empty when sending BTA, dumping data:\n"); DSSERR("rx fifo not empty when sending BTA, dumping data:\n");
dsi_vc_flush_receive_data(dsi, channel); dsi_vc_flush_receive_data(dsi, vc);
} }
REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), 1, 6, 6); /* BTA_EN */ REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), 1, 6, 6); /* BTA_EN */
/* flush posted write */ /* flush posted write */
dsi_read_reg(dsi, DSI_VC_CTRL(channel)); dsi_read_reg(dsi, DSI_VC_CTRL(vc));
return 0; return 0;
} }
static int dsi_vc_send_bta_sync(struct omap_dss_device *dssdev, int channel) static int dsi_vc_send_bta_sync(struct omap_dss_device *dssdev, int vc)
{ {
struct dsi_data *dsi = to_dsi_data(dssdev); struct dsi_data *dsi = to_dsi_data(dssdev);
DECLARE_COMPLETION_ONSTACK(completion); DECLARE_COMPLETION_ONSTACK(completion);
int r = 0; int r = 0;
u32 err; u32 err;
r = dsi_register_isr_vc(dsi, channel, dsi_completion_handler, r = dsi_register_isr_vc(dsi, vc, dsi_completion_handler,
&completion, DSI_VC_IRQ_BTA); &completion, DSI_VC_IRQ_BTA);
if (r) if (r)
goto err0; goto err0;
...@@ -2579,7 +2579,7 @@ static int dsi_vc_send_bta_sync(struct omap_dss_device *dssdev, int channel) ...@@ -2579,7 +2579,7 @@ static int dsi_vc_send_bta_sync(struct omap_dss_device *dssdev, int channel)
if (r) if (r)
goto err1; goto err1;
r = dsi_vc_send_bta(dsi, channel); r = dsi_vc_send_bta(dsi, vc);
if (r) if (r)
goto err2; goto err2;
...@@ -2600,13 +2600,13 @@ static int dsi_vc_send_bta_sync(struct omap_dss_device *dssdev, int channel) ...@@ -2600,13 +2600,13 @@ static int dsi_vc_send_bta_sync(struct omap_dss_device *dssdev, int channel)
dsi_unregister_isr(dsi, dsi_completion_handler, &completion, dsi_unregister_isr(dsi, dsi_completion_handler, &completion,
DSI_IRQ_ERROR_MASK); DSI_IRQ_ERROR_MASK);
err1: err1:
dsi_unregister_isr_vc(dsi, channel, dsi_completion_handler, dsi_unregister_isr_vc(dsi, vc, dsi_completion_handler,
&completion, DSI_VC_IRQ_BTA); &completion, DSI_VC_IRQ_BTA);
err0: err0:
return r; return r;
} }
static inline void dsi_vc_write_long_header(struct dsi_data *dsi, int channel, static inline void dsi_vc_write_long_header(struct dsi_data *dsi, int vc,
u8 data_type, u16 len, u8 ecc) u8 data_type, u16 len, u8 ecc)
{ {
u32 val; u32 val;
...@@ -2614,15 +2614,15 @@ static inline void dsi_vc_write_long_header(struct dsi_data *dsi, int channel, ...@@ -2614,15 +2614,15 @@ static inline void dsi_vc_write_long_header(struct dsi_data *dsi, int channel,
WARN_ON(!dsi_bus_is_locked(dsi)); WARN_ON(!dsi_bus_is_locked(dsi));
data_id = data_type | channel << 6; data_id = data_type | vc << 6;
val = FLD_VAL(data_id, 7, 0) | FLD_VAL(len, 23, 8) | val = FLD_VAL(data_id, 7, 0) | FLD_VAL(len, 23, 8) |
FLD_VAL(ecc, 31, 24); FLD_VAL(ecc, 31, 24);
dsi_write_reg(dsi, DSI_VC_LONG_PACKET_HEADER(channel), val); dsi_write_reg(dsi, DSI_VC_LONG_PACKET_HEADER(vc), val);
} }
static inline void dsi_vc_write_long_payload(struct dsi_data *dsi, int channel, static inline void dsi_vc_write_long_payload(struct dsi_data *dsi, int vc,
u8 b1, u8 b2, u8 b3, u8 b4) u8 b1, u8 b2, u8 b3, u8 b4)
{ {
u32 val; u32 val;
...@@ -2632,7 +2632,7 @@ static inline void dsi_vc_write_long_payload(struct dsi_data *dsi, int channel, ...@@ -2632,7 +2632,7 @@ static inline void dsi_vc_write_long_payload(struct dsi_data *dsi, int channel,
/* DSSDBG("\twriting %02x, %02x, %02x, %02x (%#010x)\n", /* DSSDBG("\twriting %02x, %02x, %02x, %02x (%#010x)\n",
b1, b2, b3, b4, val); */ b1, b2, b3, b4, val); */
dsi_write_reg(dsi, DSI_VC_LONG_PACKET_PAYLOAD(channel), val); dsi_write_reg(dsi, DSI_VC_LONG_PACKET_PAYLOAD(vc), val);
} }
static int dsi_vc_send_long(struct dsi_data *dsi, static int dsi_vc_send_long(struct dsi_data *dsi,
...@@ -2729,10 +2729,10 @@ static int dsi_vc_send_short(struct dsi_data *dsi, ...@@ -2729,10 +2729,10 @@ static int dsi_vc_send_short(struct dsi_data *dsi,
return 0; return 0;
} }
static int dsi_vc_send_null(struct dsi_data *dsi, int channel) static int dsi_vc_send_null(struct dsi_data *dsi, int vc)
{ {
const struct mipi_dsi_msg msg = { const struct mipi_dsi_msg msg = {
.channel = channel, .channel = vc,
.type = MIPI_DSI_NULL_PACKET, .type = MIPI_DSI_NULL_PACKET,
}; };
...@@ -2776,7 +2776,7 @@ static int dsi_vc_write_common(struct omap_dss_device *dssdev, ...@@ -2776,7 +2776,7 @@ static int dsi_vc_write_common(struct omap_dss_device *dssdev,
return 0; return 0;
} }
static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int channel, u8 *buf, static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int vc, u8 *buf,
int buflen, enum dss_dsi_content_type type) int buflen, enum dss_dsi_content_type type)
{ {
u32 val; u32 val;
...@@ -2784,13 +2784,13 @@ static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int channel, u8 *buf, ...@@ -2784,13 +2784,13 @@ static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int channel, u8 *buf,
int r; int r;
/* RX_FIFO_NOT_EMPTY */ /* RX_FIFO_NOT_EMPTY */
if (REG_GET(dsi, DSI_VC_CTRL(channel), 20, 20) == 0) { if (REG_GET(dsi, DSI_VC_CTRL(vc), 20, 20) == 0) {
DSSERR("RX fifo empty when trying to read.\n"); DSSERR("RX fifo empty when trying to read.\n");
r = -EIO; r = -EIO;
goto err; goto err;
} }
val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(channel)); val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(vc));
if (dsi->debug_read) if (dsi->debug_read)
DSSDBG("\theader: %08x\n", val); DSSDBG("\theader: %08x\n", val);
dt = FLD_GET(val, 5, 0); dt = FLD_GET(val, 5, 0);
...@@ -2854,7 +2854,7 @@ static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int channel, u8 *buf, ...@@ -2854,7 +2854,7 @@ static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int channel, u8 *buf,
for (w = 0; w < len + 2;) { for (w = 0; w < len + 2;) {
int b; int b;
val = dsi_read_reg(dsi, val = dsi_read_reg(dsi,
DSI_VC_SHORT_PACKET_HEADER(channel)); DSI_VC_SHORT_PACKET_HEADER(vc));
if (dsi->debug_read) if (dsi->debug_read)
DSSDBG("\t\t%02x %02x %02x %02x\n", DSSDBG("\t\t%02x %02x %02x %02x\n",
(val >> 0) & 0xff, (val >> 0) & 0xff,
...@@ -2878,7 +2878,7 @@ static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int channel, u8 *buf, ...@@ -2878,7 +2878,7 @@ static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int channel, u8 *buf,
} }
err: err:
DSSERR("dsi_vc_read_rx_fifo(ch %d type %s) failed\n", channel, DSSERR("dsi_vc_read_rx_fifo(vc %d type %s) failed\n", vc,
type == DSS_DSI_CONTENT_GENERIC ? "GENERIC" : "DCS"); type == DSS_DSI_CONTENT_GENERIC ? "GENERIC" : "DCS");
return r; return r;
...@@ -3633,7 +3633,7 @@ static int dsi_configure_pins(struct dsi_data *dsi, ...@@ -3633,7 +3633,7 @@ static int dsi_configure_pins(struct dsi_data *dsi,
return 0; return 0;
} }
static void dsi_enable_video_output(struct omap_dss_device *dssdev, int channel) static void dsi_enable_video_output(struct omap_dss_device *dssdev, int vc)
{ {
struct dsi_data *dsi = to_dsi_data(dssdev); struct dsi_data *dsi = to_dsi_data(dssdev);
int bpp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt); int bpp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt);
...@@ -3667,17 +3667,17 @@ static void dsi_enable_video_output(struct omap_dss_device *dssdev, int channel) ...@@ -3667,17 +3667,17 @@ static void dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
} }
dsi_if_enable(dsi, false); dsi_if_enable(dsi, false);
dsi_vc_enable(dsi, channel, false); dsi_vc_enable(dsi, vc, false);
/* MODE, 1 = video mode */ /* MODE, 1 = video mode */
REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), 1, 4, 4); REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), 1, 4, 4);
word_count = DIV_ROUND_UP(dsi->vm.hactive * bpp, 8); word_count = DIV_ROUND_UP(dsi->vm.hactive * bpp, 8);
dsi_vc_write_long_header(dsi, channel, data_type, dsi_vc_write_long_header(dsi, vc, data_type,
word_count, 0); word_count, 0);
dsi_vc_enable(dsi, channel, true); dsi_vc_enable(dsi, vc, true);
dsi_if_enable(dsi, true); dsi_if_enable(dsi, true);
} }
...@@ -3690,7 +3690,7 @@ static void dsi_enable_video_output(struct omap_dss_device *dssdev, int channel) ...@@ -3690,7 +3690,7 @@ static void dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
err_mgr_enable: err_mgr_enable:
if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {
dsi_if_enable(dsi, false); dsi_if_enable(dsi, false);
dsi_vc_enable(dsi, channel, false); dsi_vc_enable(dsi, vc, false);
} }
err_pix_fmt: err_pix_fmt:
dsi_display_uninit_dispc(dsi); dsi_display_uninit_dispc(dsi);
...@@ -3698,18 +3698,18 @@ static void dsi_enable_video_output(struct omap_dss_device *dssdev, int channel) ...@@ -3698,18 +3698,18 @@ static void dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
return; return;
} }
static void dsi_disable_video_output(struct omap_dss_device *dssdev, int channel) static void dsi_disable_video_output(struct omap_dss_device *dssdev, int vc)
{ {
struct dsi_data *dsi = to_dsi_data(dssdev); struct dsi_data *dsi = to_dsi_data(dssdev);
if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {
dsi_if_enable(dsi, false); dsi_if_enable(dsi, false);
dsi_vc_enable(dsi, channel, false); dsi_vc_enable(dsi, vc, false);
/* MODE, 0 = command mode */ /* MODE, 0 = command mode */
REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), 0, 4, 4); REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), 0, 4, 4);
dsi_vc_enable(dsi, channel, true); dsi_vc_enable(dsi, vc, true);
dsi_if_enable(dsi, true); dsi_if_enable(dsi, true);
} }
...@@ -3742,14 +3742,14 @@ static void dsi_update_screen_dispc(struct dsi_data *dsi) ...@@ -3742,14 +3742,14 @@ static void dsi_update_screen_dispc(struct dsi_data *dsi)
unsigned int packet_len; unsigned int packet_len;
u32 l; u32 l;
int r; int r;
const unsigned channel = dsi->update_channel; const unsigned vc = dsi->update_vc;
const unsigned int line_buf_size = dsi->line_buffer_size; const unsigned int line_buf_size = dsi->line_buffer_size;
u16 w = dsi->vm.hactive; u16 w = dsi->vm.hactive;
u16 h = dsi->vm.vactive; u16 h = dsi->vm.vactive;
DSSDBG("dsi_update_screen_dispc(%dx%d)\n", w, h); DSSDBG("dsi_update_screen_dispc(%dx%d)\n", w, h);
dsi_vc_config_source(dsi, channel, DSI_VC_SOURCE_VP); dsi_vc_config_source(dsi, vc, DSI_VC_SOURCE_VP);
bytespp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt) / 8; bytespp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt) / 8;
bytespl = w * bytespp; bytespl = w * bytespp;
...@@ -3770,16 +3770,16 @@ static void dsi_update_screen_dispc(struct dsi_data *dsi) ...@@ -3770,16 +3770,16 @@ static void dsi_update_screen_dispc(struct dsi_data *dsi)
total_len += (bytespf % packet_payload) + 1; total_len += (bytespf % packet_payload) + 1;
l = FLD_VAL(total_len, 23, 0); /* TE_SIZE */ l = FLD_VAL(total_len, 23, 0); /* TE_SIZE */
dsi_write_reg(dsi, DSI_VC_TE(channel), l); dsi_write_reg(dsi, DSI_VC_TE(vc), l);
dsi_vc_write_long_header(dsi, channel, MIPI_DSI_DCS_LONG_WRITE, dsi_vc_write_long_header(dsi, vc, MIPI_DSI_DCS_LONG_WRITE,
packet_len, 0); packet_len, 0);
if (dsi->te_enabled) if (dsi->te_enabled)
l = FLD_MOD(l, 1, 30, 30); /* TE_EN */ l = FLD_MOD(l, 1, 30, 30); /* TE_EN */
else else
l = FLD_MOD(l, 1, 31, 31); /* TE_START */ l = FLD_MOD(l, 1, 31, 31); /* TE_START */
dsi_write_reg(dsi, DSI_VC_TE(channel), l); dsi_write_reg(dsi, DSI_VC_TE(vc), l);
/* We put SIDLEMODE to no-idle for the duration of the transfer, /* We put SIDLEMODE to no-idle for the duration of the transfer,
* because DSS interrupts are not capable of waking up the CPU and the * because DSS interrupts are not capable of waking up the CPU and the
...@@ -3802,7 +3802,7 @@ static void dsi_update_screen_dispc(struct dsi_data *dsi) ...@@ -3802,7 +3802,7 @@ static void dsi_update_screen_dispc(struct dsi_data *dsi)
* for TE is longer than the timer allows */ * for TE is longer than the timer allows */
REG_FLD_MOD(dsi, DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */ REG_FLD_MOD(dsi, DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */
dsi_vc_send_bta(dsi, channel); dsi_vc_send_bta(dsi, vc);
#ifdef DSI_CATCH_MISSING_TE #ifdef DSI_CATCH_MISSING_TE
mod_timer(&dsi->te_timer, jiffies + msecs_to_jiffies(250)); mod_timer(&dsi->te_timer, jiffies + msecs_to_jiffies(250));
...@@ -3894,7 +3894,7 @@ static int _dsi_send_nop(struct dsi_data *dsi, int channel) ...@@ -3894,7 +3894,7 @@ static int _dsi_send_nop(struct dsi_data *dsi, int channel)
return _omap_dsi_host_transfer(dsi, &msg); return _omap_dsi_host_transfer(dsi, &msg);
} }
static int dsi_update_channel(struct omap_dss_device *dssdev, int channel) static int dsi_update_channel(struct omap_dss_device *dssdev, int vc)
{ {
struct dsi_data *dsi = to_dsi_data(dssdev); struct dsi_data *dsi = to_dsi_data(dssdev);
int r; int r;
...@@ -3911,7 +3911,7 @@ static int dsi_update_channel(struct omap_dss_device *dssdev, int channel) ...@@ -3911,7 +3911,7 @@ static int dsi_update_channel(struct omap_dss_device *dssdev, int channel)
goto err; goto err;
} }
DSSDBG("dsi_update_channel: %d", channel); DSSDBG("dsi_update_channel: %d", vc);
dsi_set_ulps_auto(dsi, false); dsi_set_ulps_auto(dsi, false);
...@@ -3920,13 +3920,13 @@ static int dsi_update_channel(struct omap_dss_device *dssdev, int channel) ...@@ -3920,13 +3920,13 @@ static int dsi_update_channel(struct omap_dss_device *dssdev, int channel)
* updates stop working. This is probably related to DSI spec stating * updates stop working. This is probably related to DSI spec stating
* that the DSI host should transition to LP at least once per frame. * that the DSI host should transition to LP at least once per frame.
*/ */
r = _dsi_send_nop(dsi, channel); r = _dsi_send_nop(dsi, vc);
if (r < 0) { if (r < 0) {
DSSWARN("failed to send nop between frames: %d\n", r); DSSWARN("failed to send nop between frames: %d\n", r);
goto err; goto err;
} }
dsi->update_channel = channel; dsi->update_vc = vc;
if (dsi->te_enabled && dsi->te_gpio) { if (dsi->te_enabled && dsi->te_gpio) {
schedule_delayed_work(&dsi->te_timeout_work, schedule_delayed_work(&dsi->te_timeout_work,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment