Skip to content

Commit ca1adf7

Browse files
thenguyenyfkartben
authored andcommitted
drivers: mipi_dsi: extend support of renesas,ra-mipi-dsi
Extend support for DSI generic write Signed-off-by: The Nguyen <the.nguyen.yf@renesas.com>
1 parent 539d0f6 commit ca1adf7

File tree

1 file changed

+98
-50
lines changed

1 file changed

+98
-50
lines changed

drivers/mipi_dsi/dsi_renesas_ra.c

Lines changed: 98 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ struct mipi_dsi_renesas_ra_config {
5050
struct mipi_dsi_renesas_ra_data {
5151
mipi_dsi_instance_ctrl_t mipi_dsi_ctrl;
5252
mipi_dsi_cfg_t mipi_dsi_cfg;
53-
volatile bool message_sent;
54-
volatile bool fatal_error;
53+
struct k_sem in_transmission;
54+
atomic_t status;
5555
};
5656

5757
void mipi_dsi_seq0(void);
@@ -70,20 +70,9 @@ void mipi_dsi_callback(mipi_dsi_callback_args_t *p_args)
7070
const struct device *dev = (struct device *)p_args->p_context;
7171
struct mipi_dsi_renesas_ra_data *data = dev->data;
7272

73-
switch (p_args->event) {
74-
case MIPI_DSI_EVENT_SEQUENCE_0: {
75-
if (MIPI_DSI_SEQUENCE_STATUS_DESCRIPTORS_FINISHED == p_args->tx_status) {
76-
data->message_sent = true;
77-
}
78-
break;
79-
}
80-
case MIPI_DSI_EVENT_FATAL: {
81-
data->fatal_error = true;
82-
break;
83-
}
84-
default: {
85-
break;
86-
}
73+
if (p_args->event == MIPI_DSI_EVENT_SEQUENCE_0) {
74+
atomic_set(&data->status, p_args->tx_status);
75+
k_sem_give(&data->in_transmission);
8776
}
8877
}
8978

@@ -98,6 +87,12 @@ static int mipi_dsi_renesas_ra_attach(const struct device *dev, uint8_t channel,
9887
LOG_ERR("DSI host supports video mode only!");
9988
return -ENOTSUP;
10089
}
90+
91+
if (channel == 0 && (mdev->mode_flags & MIPI_DSI_MODE_LPM) == 0) {
92+
LOG_ERR("This channel support LP mode transfer only");
93+
return -ENOTSUP;
94+
}
95+
10196
cfg.virtual_channel_id = channel;
10297
cfg.num_lanes = mdev->data_lanes;
10398
if (mdev->pixfmt == MIPI_DSI_PIXFMT_RGB888) {
@@ -130,53 +125,104 @@ static int mipi_dsi_renesas_ra_attach(const struct device *dev, uint8_t channel,
130125
return 0;
131126
}
132127

133-
static ssize_t mipi_dsi_renesas_ra_transfer(const struct device *dev, uint8_t channel,
134-
struct mipi_dsi_msg *msg)
128+
#define MIPI_DSI_SEQUENCE_STATUS_ERROR \
129+
(MIPI_DSI_SEQUENCE_STATUS_DESCRIPTOR_ABORT | MIPI_DSI_SEQUENCE_STATUS_SIZE_ERROR | \
130+
MIPI_DSI_SEQUENCE_STATUS_TX_INTERNAL_BUS_ERROR | \
131+
MIPI_DSI_SEQUENCE_STATUS_RX_FATAL_ERROR | MIPI_DSI_SEQUENCE_STATUS_RX_FAIL | \
132+
MIPI_DSI_SEQUENCE_STATUS_RX_PACKET_DATA_FAIL | \
133+
MIPI_DSI_SEQUENCE_STATUS_RX_CORRECTABLE_ERROR | \
134+
MIPI_DSI_SEQUENCE_STATUS_RX_ACK_AND_ERROR)
135+
136+
static ssize_t mipi_dsi_renesas_ra_dcs_write(const struct device *dev, uint8_t channel,
137+
struct mipi_dsi_msg *msg)
135138
{
136139
struct mipi_dsi_renesas_ra_data *data = dev->data;
137-
ssize_t len;
138-
int ret;
139-
uint8_t combined_tx_buffer[msg->tx_len + 1];
140+
uint8_t payload[msg->tx_len + 1];
141+
mipi_dsi_cmd_t fsp_msg = {.channel = channel,
142+
.cmd_id = msg->type,
143+
.p_tx_buffer = payload,
144+
.tx_len = msg->tx_len + 1,
145+
.flags = (msg->flags & MIPI_DSI_MSG_USE_LPM) != 0
146+
? MIPI_DSI_CMD_FLAG_LOW_POWER
147+
: 0};
140148

141-
combined_tx_buffer[0] = msg->cmd;
142-
memcpy(&combined_tx_buffer[1], msg->tx_buf, msg->tx_len);
149+
payload[0] = msg->cmd;
150+
memcpy(&payload[1], msg->tx_buf, msg->tx_len);
143151

144-
mipi_dsi_cmd_t fsp_msg = {
145-
.channel = channel,
146-
.cmd_id = msg->type,
147-
.flags = MIPI_DSI_CMD_FLAG_LOW_POWER,
148-
.tx_len = msg->tx_len + 1,
149-
.p_tx_buffer = combined_tx_buffer,
150-
};
151-
data->message_sent = false;
152-
data->fatal_error = false;
152+
atomic_clear(&data->status);
153+
k_sem_reset(&data->in_transmission);
153154

154-
switch (msg->type) {
155-
case MIPI_DSI_DCS_READ:
156-
LOG_ERR("DCS Read not yet implemented or used");
155+
if (R_MIPI_DSI_Command(&data->mipi_dsi_ctrl, &fsp_msg) != FSP_SUCCESS) {
156+
LOG_ERR("DSI write fail");
157+
return -EIO;
158+
}
159+
160+
k_sem_take(&data->in_transmission, K_FOREVER);
161+
162+
if ((data->status & MIPI_DSI_SEQUENCE_STATUS_ERROR) != MIPI_DSI_SEQUENCE_STATUS_NONE) {
163+
return -EIO;
164+
}
165+
166+
return (ssize_t)msg->tx_len;
167+
}
168+
169+
static ssize_t mipi_dsi_renesas_ra_generic_write(const struct device *dev, uint8_t channel,
170+
struct mipi_dsi_msg *msg)
171+
{
172+
struct mipi_dsi_renesas_ra_data *data = dev->data;
173+
mipi_dsi_cmd_t fsp_msg = {.channel = channel,
174+
.cmd_id = msg->type,
175+
.p_tx_buffer = msg->tx_buf,
176+
.tx_len = msg->tx_len,
177+
.flags = (msg->flags & MIPI_DSI_MSG_USE_LPM) != 0
178+
? MIPI_DSI_CMD_FLAG_LOW_POWER
179+
: 0};
180+
181+
atomic_clear(&data->status);
182+
k_sem_reset(&data->in_transmission);
183+
184+
if (R_MIPI_DSI_Command(&data->mipi_dsi_ctrl, &fsp_msg) != FSP_SUCCESS) {
185+
LOG_ERR("DSI write fail");
186+
return -EIO;
187+
}
188+
189+
k_sem_take(&data->in_transmission, K_FOREVER);
190+
191+
if ((data->status & MIPI_DSI_SEQUENCE_STATUS_ERROR) != MIPI_DSI_SEQUENCE_STATUS_NONE) {
192+
return -EIO;
193+
}
194+
195+
return (ssize_t)msg->tx_len;
196+
}
197+
198+
static ssize_t mipi_dsi_renesas_ra_transfer(const struct device *dev, uint8_t channel,
199+
struct mipi_dsi_msg *msg)
200+
{
201+
if (channel == 0 && (msg->flags & MIPI_DSI_MSG_USE_LPM) == 0) {
202+
LOG_ERR("This channel support LP mode transfer only");
157203
return -ENOTSUP;
204+
}
205+
206+
switch (msg->type) {
158207
case MIPI_DSI_DCS_SHORT_WRITE:
208+
__fallthrough;
159209
case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
210+
__fallthrough;
160211
case MIPI_DSI_DCS_LONG_WRITE:
161-
ret = R_MIPI_DSI_Command(&data->mipi_dsi_ctrl, &fsp_msg);
162-
if (ret) {
163-
LOG_ERR("DSI write fail: err: (%d)", ret);
164-
return -EIO;
165-
}
166-
while (!(data->message_sent)) {
167-
if (data->fatal_error) {
168-
LOG_ERR("fatal error");
169-
return -EIO;
170-
}
171-
}
172-
len = msg->tx_len;
173-
break;
212+
return mipi_dsi_renesas_ra_dcs_write(dev, channel, msg);
213+
case MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM:
214+
__fallthrough;
215+
case MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM:
216+
__fallthrough;
217+
case MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM:
218+
__fallthrough;
219+
case MIPI_DSI_GENERIC_LONG_WRITE:
220+
return mipi_dsi_renesas_ra_generic_write(dev, channel, msg);
174221
default:
175-
LOG_ERR("Unsupported message type (%d)", msg->type);
176222
return -ENOTSUP;
177223
}
178224

179-
return len;
225+
return 0;
180226
}
181227

182228
static DEVICE_API(mipi_dsi, mipi_dsi_api) = {
@@ -202,6 +248,8 @@ static int mipi_dsi_renesas_ra_init(const struct device *dev)
202248
return ret;
203249
}
204250

251+
k_sem_init(&data->in_transmission, 0, 1);
252+
205253
config->irq_configure();
206254
data->mipi_dsi_cfg.p_context = dev;
207255

0 commit comments

Comments
 (0)