OMAP: DSS2: Use MIPI DSI enums from include/video/mipi_display.h
MIPI DSI Transaction types and DCS commands are currently defined as macros in dsi.c and panel-taal.c, remove these and replace them with enum members defined in include/video/mipi_display.h. Signed-off-by: Archit Taneja <archit@ti.com> [tomi.valkeinen@ti.com: reformatted the commit message] Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
This commit is contained in:
parent
cc11aaf867
commit
7a7c48f9ab
@ -35,26 +35,12 @@
|
|||||||
|
|
||||||
#include <video/omapdss.h>
|
#include <video/omapdss.h>
|
||||||
#include <video/omap-panel-nokia-dsi.h>
|
#include <video/omap-panel-nokia-dsi.h>
|
||||||
|
#include <video/mipi_display.h>
|
||||||
|
|
||||||
/* DSI Virtual channel. Hardcoded for now. */
|
/* DSI Virtual channel. Hardcoded for now. */
|
||||||
#define TCH 0
|
#define TCH 0
|
||||||
|
|
||||||
#define DCS_READ_NUM_ERRORS 0x05
|
#define DCS_READ_NUM_ERRORS 0x05
|
||||||
#define DCS_READ_POWER_MODE 0x0a
|
|
||||||
#define DCS_READ_MADCTL 0x0b
|
|
||||||
#define DCS_READ_PIXEL_FORMAT 0x0c
|
|
||||||
#define DCS_RDDSDR 0x0f
|
|
||||||
#define DCS_SLEEP_IN 0x10
|
|
||||||
#define DCS_SLEEP_OUT 0x11
|
|
||||||
#define DCS_DISPLAY_OFF 0x28
|
|
||||||
#define DCS_DISPLAY_ON 0x29
|
|
||||||
#define DCS_COLUMN_ADDR 0x2a
|
|
||||||
#define DCS_PAGE_ADDR 0x2b
|
|
||||||
#define DCS_MEMORY_WRITE 0x2c
|
|
||||||
#define DCS_TEAR_OFF 0x34
|
|
||||||
#define DCS_TEAR_ON 0x35
|
|
||||||
#define DCS_MEM_ACC_CTRL 0x36
|
|
||||||
#define DCS_PIXEL_FORMAT 0x3a
|
|
||||||
#define DCS_BRIGHTNESS 0x51
|
#define DCS_BRIGHTNESS 0x51
|
||||||
#define DCS_CTRL_DISPLAY 0x53
|
#define DCS_CTRL_DISPLAY 0x53
|
||||||
#define DCS_WRITE_CABC 0x55
|
#define DCS_WRITE_CABC 0x55
|
||||||
@ -302,7 +288,7 @@ static int taal_sleep_in(struct taal_data *td)
|
|||||||
|
|
||||||
hw_guard_wait(td);
|
hw_guard_wait(td);
|
||||||
|
|
||||||
cmd = DCS_SLEEP_IN;
|
cmd = MIPI_DCS_ENTER_SLEEP_MODE;
|
||||||
r = dsi_vc_dcs_write_nosync(td->dssdev, td->channel, &cmd, 1);
|
r = dsi_vc_dcs_write_nosync(td->dssdev, td->channel, &cmd, 1);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
@ -321,7 +307,7 @@ static int taal_sleep_out(struct taal_data *td)
|
|||||||
|
|
||||||
hw_guard_wait(td);
|
hw_guard_wait(td);
|
||||||
|
|
||||||
r = taal_dcs_write_0(td, DCS_SLEEP_OUT);
|
r = taal_dcs_write_0(td, MIPI_DCS_EXIT_SLEEP_MODE);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
@ -356,7 +342,7 @@ static int taal_set_addr_mode(struct taal_data *td, u8 rotate, bool mirror)
|
|||||||
u8 mode;
|
u8 mode;
|
||||||
int b5, b6, b7;
|
int b5, b6, b7;
|
||||||
|
|
||||||
r = taal_dcs_read_1(td, DCS_READ_MADCTL, &mode);
|
r = taal_dcs_read_1(td, MIPI_DCS_GET_ADDRESS_MODE, &mode);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
@ -390,7 +376,7 @@ static int taal_set_addr_mode(struct taal_data *td, u8 rotate, bool mirror)
|
|||||||
mode &= ~((1<<7) | (1<<6) | (1<<5));
|
mode &= ~((1<<7) | (1<<6) | (1<<5));
|
||||||
mode |= (b7 << 7) | (b6 << 6) | (b5 << 5);
|
mode |= (b7 << 7) | (b6 << 6) | (b5 << 5);
|
||||||
|
|
||||||
return taal_dcs_write_1(td, DCS_MEM_ACC_CTRL, mode);
|
return taal_dcs_write_1(td, MIPI_DCS_SET_ADDRESS_MODE, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int taal_set_update_window(struct taal_data *td,
|
static int taal_set_update_window(struct taal_data *td,
|
||||||
@ -403,7 +389,7 @@ static int taal_set_update_window(struct taal_data *td,
|
|||||||
u16 y2 = y + h - 1;
|
u16 y2 = y + h - 1;
|
||||||
|
|
||||||
u8 buf[5];
|
u8 buf[5];
|
||||||
buf[0] = DCS_COLUMN_ADDR;
|
buf[0] = MIPI_DCS_SET_COLUMN_ADDRESS;
|
||||||
buf[1] = (x1 >> 8) & 0xff;
|
buf[1] = (x1 >> 8) & 0xff;
|
||||||
buf[2] = (x1 >> 0) & 0xff;
|
buf[2] = (x1 >> 0) & 0xff;
|
||||||
buf[3] = (x2 >> 8) & 0xff;
|
buf[3] = (x2 >> 8) & 0xff;
|
||||||
@ -413,7 +399,7 @@ static int taal_set_update_window(struct taal_data *td,
|
|||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
buf[0] = DCS_PAGE_ADDR;
|
buf[0] = MIPI_DCS_SET_PAGE_ADDRESS;
|
||||||
buf[1] = (y1 >> 8) & 0xff;
|
buf[1] = (y1 >> 8) & 0xff;
|
||||||
buf[2] = (y1 >> 0) & 0xff;
|
buf[2] = (y1 >> 0) & 0xff;
|
||||||
buf[3] = (y2 >> 8) & 0xff;
|
buf[3] = (y2 >> 8) & 0xff;
|
||||||
@ -1195,7 +1181,8 @@ static int taal_power_on(struct omap_dss_device *dssdev)
|
|||||||
if (r)
|
if (r)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
r = taal_dcs_write_1(td, DCS_PIXEL_FORMAT, 0x7); /* 24bit/pixel */
|
r = taal_dcs_write_1(td, MIPI_DCS_SET_PIXEL_FORMAT,
|
||||||
|
MIPI_DCS_PIXEL_FMT_24BIT);
|
||||||
if (r)
|
if (r)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
@ -1209,7 +1196,7 @@ static int taal_power_on(struct omap_dss_device *dssdev)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = taal_dcs_write_0(td, DCS_DISPLAY_ON);
|
r = taal_dcs_write_0(td, MIPI_DCS_SET_DISPLAY_ON);
|
||||||
if (r)
|
if (r)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
@ -1246,7 +1233,7 @@ static void taal_power_off(struct omap_dss_device *dssdev)
|
|||||||
struct taal_data *td = dev_get_drvdata(&dssdev->dev);
|
struct taal_data *td = dev_get_drvdata(&dssdev->dev);
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
r = taal_dcs_write_0(td, DCS_DISPLAY_OFF);
|
r = taal_dcs_write_0(td, MIPI_DCS_SET_DISPLAY_OFF);
|
||||||
if (!r)
|
if (!r)
|
||||||
r = taal_sleep_in(td);
|
r = taal_sleep_in(td);
|
||||||
|
|
||||||
@ -1529,9 +1516,9 @@ static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable)
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (enable)
|
if (enable)
|
||||||
r = taal_dcs_write_1(td, DCS_TEAR_ON, 0);
|
r = taal_dcs_write_1(td, MIPI_DCS_SET_TEAR_ON, 0);
|
||||||
else
|
else
|
||||||
r = taal_dcs_write_0(td, DCS_TEAR_OFF);
|
r = taal_dcs_write_0(td, MIPI_DCS_SET_TEAR_OFF);
|
||||||
|
|
||||||
if (!panel_data->use_ext_te)
|
if (!panel_data->use_ext_te)
|
||||||
omapdss_dsi_enable_te(dssdev, enable);
|
omapdss_dsi_enable_te(dssdev, enable);
|
||||||
@ -1851,7 +1838,7 @@ static void taal_esd_work(struct work_struct *work)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = taal_dcs_read_1(td, DCS_RDDSDR, &state1);
|
r = taal_dcs_read_1(td, MIPI_DCS_GET_DIAGNOSTIC_RESULT, &state1);
|
||||||
if (r) {
|
if (r) {
|
||||||
dev_err(&dssdev->dev, "failed to read Taal status\n");
|
dev_err(&dssdev->dev, "failed to read Taal status\n");
|
||||||
goto err;
|
goto err;
|
||||||
@ -1864,7 +1851,7 @@ static void taal_esd_work(struct work_struct *work)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = taal_dcs_read_1(td, DCS_RDDSDR, &state2);
|
r = taal_dcs_read_1(td, MIPI_DCS_GET_DIAGNOSTIC_RESULT, &state2);
|
||||||
if (r) {
|
if (r) {
|
||||||
dev_err(&dssdev->dev, "failed to read Taal status\n");
|
dev_err(&dssdev->dev, "failed to read Taal status\n");
|
||||||
goto err;
|
goto err;
|
||||||
@ -1880,7 +1867,7 @@ static void taal_esd_work(struct work_struct *work)
|
|||||||
/* Self-diagnostics result is also shown on TE GPIO line. We need
|
/* Self-diagnostics result is also shown on TE GPIO line. We need
|
||||||
* to re-enable TE after self diagnostics */
|
* to re-enable TE after self diagnostics */
|
||||||
if (td->te_enabled && panel_data->use_ext_te) {
|
if (td->te_enabled && panel_data->use_ext_te) {
|
||||||
r = taal_dcs_write_1(td, DCS_TEAR_ON, 0);
|
r = taal_dcs_write_1(td, MIPI_DCS_SET_TEAR_ON, 0);
|
||||||
if (r)
|
if (r)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
|
|
||||||
#include <video/omapdss.h>
|
#include <video/omapdss.h>
|
||||||
|
#include <video/mipi_display.h>
|
||||||
#include <plat/clock.h>
|
#include <plat/clock.h>
|
||||||
|
|
||||||
#include "dss.h"
|
#include "dss.h"
|
||||||
@ -198,18 +199,6 @@ struct dsi_reg { u16 idx; };
|
|||||||
DSI_CIO_IRQ_ERRCONTENTIONLP0_4 | DSI_CIO_IRQ_ERRCONTENTIONLP1_4 | \
|
DSI_CIO_IRQ_ERRCONTENTIONLP0_4 | DSI_CIO_IRQ_ERRCONTENTIONLP1_4 | \
|
||||||
DSI_CIO_IRQ_ERRCONTENTIONLP0_5 | DSI_CIO_IRQ_ERRCONTENTIONLP1_5)
|
DSI_CIO_IRQ_ERRCONTENTIONLP0_5 | DSI_CIO_IRQ_ERRCONTENTIONLP1_5)
|
||||||
|
|
||||||
#define DSI_DT_DCS_SHORT_WRITE_0 0x05
|
|
||||||
#define DSI_DT_DCS_SHORT_WRITE_1 0x15
|
|
||||||
#define DSI_DT_DCS_READ 0x06
|
|
||||||
#define DSI_DT_SET_MAX_RET_PKG_SIZE 0x37
|
|
||||||
#define DSI_DT_NULL_PACKET 0x09
|
|
||||||
#define DSI_DT_DCS_LONG_WRITE 0x39
|
|
||||||
|
|
||||||
#define DSI_DT_RX_ACK_WITH_ERR 0x02
|
|
||||||
#define DSI_DT_RX_DCS_LONG_READ 0x1c
|
|
||||||
#define DSI_DT_RX_SHORT_READ_1 0x21
|
|
||||||
#define DSI_DT_RX_SHORT_READ_2 0x22
|
|
||||||
|
|
||||||
typedef void (*omap_dsi_isr_t) (void *arg, u32 mask);
|
typedef void (*omap_dsi_isr_t) (void *arg, u32 mask);
|
||||||
|
|
||||||
#define DSI_MAX_NR_ISRS 2
|
#define DSI_MAX_NR_ISRS 2
|
||||||
@ -2887,16 +2876,16 @@ static u16 dsi_vc_flush_receive_data(struct platform_device *dsidev,
|
|||||||
val = dsi_read_reg(dsidev, DSI_VC_SHORT_PACKET_HEADER(channel));
|
val = dsi_read_reg(dsidev, DSI_VC_SHORT_PACKET_HEADER(channel));
|
||||||
DSSERR("\trawval %#08x\n", val);
|
DSSERR("\trawval %#08x\n", val);
|
||||||
dt = FLD_GET(val, 5, 0);
|
dt = FLD_GET(val, 5, 0);
|
||||||
if (dt == DSI_DT_RX_ACK_WITH_ERR) {
|
if (dt == MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT) {
|
||||||
u16 err = FLD_GET(val, 23, 8);
|
u16 err = FLD_GET(val, 23, 8);
|
||||||
dsi_show_rx_ack_with_err(err);
|
dsi_show_rx_ack_with_err(err);
|
||||||
} else if (dt == DSI_DT_RX_SHORT_READ_1) {
|
} else if (dt == MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE) {
|
||||||
DSSERR("\tDCS short response, 1 byte: %#x\n",
|
DSSERR("\tDCS short response, 1 byte: %#x\n",
|
||||||
FLD_GET(val, 23, 8));
|
FLD_GET(val, 23, 8));
|
||||||
} else if (dt == DSI_DT_RX_SHORT_READ_2) {
|
} else if (dt == MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_2BYTE) {
|
||||||
DSSERR("\tDCS short response, 2 byte: %#x\n",
|
DSSERR("\tDCS short response, 2 byte: %#x\n",
|
||||||
FLD_GET(val, 23, 8));
|
FLD_GET(val, 23, 8));
|
||||||
} else if (dt == DSI_DT_RX_DCS_LONG_READ) {
|
} 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(dsidev, channel);
|
dsi_vc_flush_long_data(dsidev, channel);
|
||||||
@ -3101,7 +3090,7 @@ int dsi_vc_send_null(struct omap_dss_device *dssdev, int channel)
|
|||||||
struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
|
struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
|
||||||
u8 nullpkg[] = {0, 0, 0, 0};
|
u8 nullpkg[] = {0, 0, 0, 0};
|
||||||
|
|
||||||
return dsi_vc_send_long(dsidev, channel, DSI_DT_NULL_PACKET, nullpkg,
|
return dsi_vc_send_long(dsidev, channel, MIPI_DSI_NULL_PACKET, nullpkg,
|
||||||
4, 0);
|
4, 0);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dsi_vc_send_null);
|
EXPORT_SYMBOL(dsi_vc_send_null);
|
||||||
@ -3115,14 +3104,15 @@ int dsi_vc_dcs_write_nosync(struct omap_dss_device *dssdev, int channel,
|
|||||||
BUG_ON(len == 0);
|
BUG_ON(len == 0);
|
||||||
|
|
||||||
if (len == 1) {
|
if (len == 1) {
|
||||||
r = dsi_vc_send_short(dsidev, channel, DSI_DT_DCS_SHORT_WRITE_0,
|
r = dsi_vc_send_short(dsidev, channel,
|
||||||
data[0], 0);
|
MIPI_DSI_DCS_SHORT_WRITE, data[0], 0);
|
||||||
} else if (len == 2) {
|
} else if (len == 2) {
|
||||||
r = dsi_vc_send_short(dsidev, channel, DSI_DT_DCS_SHORT_WRITE_1,
|
r = dsi_vc_send_short(dsidev, channel,
|
||||||
|
MIPI_DSI_DCS_SHORT_WRITE_PARAM,
|
||||||
data[0] | (data[1] << 8), 0);
|
data[0] | (data[1] << 8), 0);
|
||||||
} else {
|
} else {
|
||||||
/* 0x39 = DCS Long Write */
|
/* 0x39 = DCS Long Write */
|
||||||
r = dsi_vc_send_long(dsidev, channel, DSI_DT_DCS_LONG_WRITE,
|
r = dsi_vc_send_long(dsidev, channel, MIPI_DSI_DCS_LONG_WRITE,
|
||||||
data, len, 0);
|
data, len, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3188,7 +3178,7 @@ int dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
|
|||||||
if (dsi->debug_read)
|
if (dsi->debug_read)
|
||||||
DSSDBG("dsi_vc_dcs_read(ch%d, dcs_cmd %x)\n", channel, dcs_cmd);
|
DSSDBG("dsi_vc_dcs_read(ch%d, dcs_cmd %x)\n", channel, dcs_cmd);
|
||||||
|
|
||||||
r = dsi_vc_send_short(dsidev, channel, DSI_DT_DCS_READ, dcs_cmd, 0);
|
r = dsi_vc_send_short(dsidev, channel, MIPI_DSI_DCS_READ, dcs_cmd, 0);
|
||||||
if (r)
|
if (r)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
@ -3207,13 +3197,13 @@ int dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
|
|||||||
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);
|
||||||
if (dt == DSI_DT_RX_ACK_WITH_ERR) {
|
if (dt == MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT) {
|
||||||
u16 err = FLD_GET(val, 23, 8);
|
u16 err = FLD_GET(val, 23, 8);
|
||||||
dsi_show_rx_ack_with_err(err);
|
dsi_show_rx_ack_with_err(err);
|
||||||
r = -EIO;
|
r = -EIO;
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
} else if (dt == DSI_DT_RX_SHORT_READ_1) {
|
} else if (dt == MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE) {
|
||||||
u8 data = FLD_GET(val, 15, 8);
|
u8 data = FLD_GET(val, 15, 8);
|
||||||
if (dsi->debug_read)
|
if (dsi->debug_read)
|
||||||
DSSDBG("\tDCS short response, 1 byte: %02x\n", data);
|
DSSDBG("\tDCS short response, 1 byte: %02x\n", data);
|
||||||
@ -3226,7 +3216,7 @@ int dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
|
|||||||
buf[0] = data;
|
buf[0] = data;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
} else if (dt == DSI_DT_RX_SHORT_READ_2) {
|
} else if (dt == MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_2BYTE) {
|
||||||
u16 data = FLD_GET(val, 23, 8);
|
u16 data = FLD_GET(val, 23, 8);
|
||||||
if (dsi->debug_read)
|
if (dsi->debug_read)
|
||||||
DSSDBG("\tDCS short response, 2 byte: %04x\n", data);
|
DSSDBG("\tDCS short response, 2 byte: %04x\n", data);
|
||||||
@ -3240,7 +3230,7 @@ int dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
|
|||||||
buf[1] = (data >> 8) & 0xff;
|
buf[1] = (data >> 8) & 0xff;
|
||||||
|
|
||||||
return 2;
|
return 2;
|
||||||
} else if (dt == DSI_DT_RX_DCS_LONG_READ) {
|
} else if (dt == MIPI_DSI_RX_DCS_LONG_READ_RESPONSE) {
|
||||||
int w;
|
int w;
|
||||||
int len = FLD_GET(val, 23, 8);
|
int len = FLD_GET(val, 23, 8);
|
||||||
if (dsi->debug_read)
|
if (dsi->debug_read)
|
||||||
@ -3330,8 +3320,8 @@ int dsi_vc_set_max_rx_packet_size(struct omap_dss_device *dssdev, int channel,
|
|||||||
{
|
{
|
||||||
struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
|
struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
|
||||||
|
|
||||||
return dsi_vc_send_short(dsidev, channel, DSI_DT_SET_MAX_RET_PKG_SIZE,
|
return dsi_vc_send_short(dsidev, channel,
|
||||||
len, 0);
|
MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE, len, 0);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dsi_vc_set_max_rx_packet_size);
|
EXPORT_SYMBOL(dsi_vc_set_max_rx_packet_size);
|
||||||
|
|
||||||
@ -3690,7 +3680,7 @@ static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
|
|||||||
l = FLD_VAL(total_len, 23, 0); /* TE_SIZE */
|
l = FLD_VAL(total_len, 23, 0); /* TE_SIZE */
|
||||||
dsi_write_reg(dsidev, DSI_VC_TE(channel), l);
|
dsi_write_reg(dsidev, DSI_VC_TE(channel), l);
|
||||||
|
|
||||||
dsi_vc_write_long_header(dsidev, channel, DSI_DT_DCS_LONG_WRITE,
|
dsi_vc_write_long_header(dsidev, channel, MIPI_DSI_DCS_LONG_WRITE,
|
||||||
packet_len, 0);
|
packet_len, 0);
|
||||||
|
|
||||||
if (dsi->te_enabled)
|
if (dsi->te_enabled)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user