Skip to content

Commit 0971a10

Browse files
drm: atmel-hlcdc: add support for DSI output formats
Add support for the following DPI mode if the encoder type is DSI as per the XLCDC IP datasheet: - 16BPPCFG1 - 16BPPCFG2 - 16BPPCFG3 - 18BPPCFG1 - 18BPPCFG2 - 24BPP Signed-off-by: Manikandan Muralidharan <manikandan.m@microchip.com> [durai.manickamkr@microchip.com: update output format using is_xlcdc flag] Signed-off-by: Durai Manickam KR <durai.manickamkr@microchip.com>
1 parent c1b8e67 commit 0971a10

1 file changed

Lines changed: 88 additions & 35 deletions

File tree

drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c

Lines changed: 88 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -295,11 +295,18 @@ static void atmel_hlcdc_crtc_atomic_enable(struct drm_crtc *c,
295295

296296
}
297297

298-
#define ATMEL_HLCDC_RGB444_OUTPUT BIT(0)
299-
#define ATMEL_HLCDC_RGB565_OUTPUT BIT(1)
300-
#define ATMEL_HLCDC_RGB666_OUTPUT BIT(2)
301-
#define ATMEL_HLCDC_RGB888_OUTPUT BIT(3)
302-
#define ATMEL_HLCDC_OUTPUT_MODE_MASK GENMASK(3, 0)
298+
#define ATMEL_HLCDC_RGB444_OUTPUT BIT(0)
299+
#define ATMEL_HLCDC_RGB565_OUTPUT BIT(1)
300+
#define ATMEL_HLCDC_RGB666_OUTPUT BIT(2)
301+
#define ATMEL_HLCDC_RGB888_OUTPUT BIT(3)
302+
#define ATMEL_HLCDC_DPI_RGB565C1_OUTPUT BIT(4)
303+
#define ATMEL_HLCDC_DPI_RGB565C2_OUTPUT BIT(5)
304+
#define ATMEL_HLCDC_DPI_RGB565C3_OUTPUT BIT(6)
305+
#define ATMEL_HLCDC_DPI_RGB666C1_OUTPUT BIT(7)
306+
#define ATMEL_HLCDC_DPI_RGB666C2_OUTPUT BIT(8)
307+
#define ATMEL_HLCDC_DPI_RGB888_OUTPUT BIT(9)
308+
#define ATMEL_HLCDC_OUTPUT_MODE_MASK GENMASK(3, 0)
309+
#define ATMEL_XLCDC_OUTPUT_MODE_MASK GENMASK(9, 0)
303310

304311
static int atmel_hlcdc_connector_output_mode(struct drm_connector_state *state)
305312
{
@@ -313,53 +320,99 @@ static int atmel_hlcdc_connector_output_mode(struct drm_connector_state *state)
313320
if (!encoder)
314321
encoder = connector->encoder;
315322

316-
switch (atmel_hlcdc_encoder_get_bus_fmt(encoder)) {
317-
case 0:
318-
break;
319-
case MEDIA_BUS_FMT_RGB444_1X12:
320-
return ATMEL_HLCDC_RGB444_OUTPUT;
321-
case MEDIA_BUS_FMT_RGB565_1X16:
322-
return ATMEL_HLCDC_RGB565_OUTPUT;
323-
case MEDIA_BUS_FMT_RGB666_1X18:
324-
return ATMEL_HLCDC_RGB666_OUTPUT;
325-
case MEDIA_BUS_FMT_RGB888_1X24:
326-
return ATMEL_HLCDC_RGB888_OUTPUT;
327-
default:
328-
return -EINVAL;
329-
}
330-
331-
for (j = 0; j < info->num_bus_formats; j++) {
332-
switch (info->bus_formats[j]) {
333-
case MEDIA_BUS_FMT_RGB444_1X12:
334-
supported_fmts |= ATMEL_HLCDC_RGB444_OUTPUT;
323+
if (encoder->encoder_type == DRM_MODE_ENCODER_DSI) {
324+
/*
325+
* atmel-hlcdc to support DSI formats with DSI video pipeline
326+
* when DRM_MODE_ENCODER_DSI type is set by
327+
* connector driver component.
328+
*/
329+
switch (atmel_hlcdc_encoder_get_bus_fmt(encoder)) {
330+
case 0:
335331
break;
336332
case MEDIA_BUS_FMT_RGB565_1X16:
337-
supported_fmts |= ATMEL_HLCDC_RGB565_OUTPUT;
338-
break;
333+
return ATMEL_HLCDC_DPI_RGB565C1_OUTPUT;
339334
case MEDIA_BUS_FMT_RGB666_1X18:
340-
supported_fmts |= ATMEL_HLCDC_RGB666_OUTPUT;
341-
break;
335+
return ATMEL_HLCDC_DPI_RGB666C1_OUTPUT;
336+
case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
337+
return ATMEL_HLCDC_DPI_RGB666C2_OUTPUT;
342338
case MEDIA_BUS_FMT_RGB888_1X24:
343-
supported_fmts |= ATMEL_HLCDC_RGB888_OUTPUT;
344-
break;
339+
return ATMEL_HLCDC_DPI_RGB888_OUTPUT;
345340
default:
341+
return -EINVAL;
342+
}
343+
344+
for (j = 0; j < info->num_bus_formats; j++) {
345+
switch (info->bus_formats[j]) {
346+
case MEDIA_BUS_FMT_RGB565_1X16:
347+
supported_fmts |=
348+
ATMEL_HLCDC_DPI_RGB565C1_OUTPUT;
349+
break;
350+
case MEDIA_BUS_FMT_RGB666_1X18:
351+
supported_fmts |=
352+
ATMEL_HLCDC_DPI_RGB666C1_OUTPUT;
353+
break;
354+
case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
355+
supported_fmts |=
356+
ATMEL_HLCDC_DPI_RGB666C2_OUTPUT;
357+
break;
358+
case MEDIA_BUS_FMT_RGB888_1X24:
359+
supported_fmts |=
360+
ATMEL_HLCDC_DPI_RGB888_OUTPUT;
361+
break;
362+
default:
363+
break;
364+
}
365+
}
366+
} else {
367+
switch (atmel_hlcdc_encoder_get_bus_fmt(encoder)) {
368+
case 0:
346369
break;
370+
case MEDIA_BUS_FMT_RGB444_1X12:
371+
return ATMEL_HLCDC_RGB444_OUTPUT;
372+
case MEDIA_BUS_FMT_RGB565_1X16:
373+
return ATMEL_HLCDC_RGB565_OUTPUT;
374+
case MEDIA_BUS_FMT_RGB666_1X18:
375+
return ATMEL_HLCDC_RGB666_OUTPUT;
376+
case MEDIA_BUS_FMT_RGB888_1X24:
377+
return ATMEL_HLCDC_RGB888_OUTPUT;
378+
default:
379+
return -EINVAL;
347380
}
348-
}
349381

382+
for (j = 0; j < info->num_bus_formats; j++) {
383+
switch (info->bus_formats[j]) {
384+
case MEDIA_BUS_FMT_RGB444_1X12:
385+
supported_fmts |= ATMEL_HLCDC_RGB444_OUTPUT;
386+
break;
387+
case MEDIA_BUS_FMT_RGB565_1X16:
388+
supported_fmts |= ATMEL_HLCDC_RGB565_OUTPUT;
389+
break;
390+
case MEDIA_BUS_FMT_RGB666_1X18:
391+
supported_fmts |= ATMEL_HLCDC_RGB666_OUTPUT;
392+
break;
393+
case MEDIA_BUS_FMT_RGB888_1X24:
394+
supported_fmts |= ATMEL_HLCDC_RGB888_OUTPUT;
395+
break;
396+
default:
397+
break;
398+
}
399+
}
400+
}
350401
return supported_fmts;
351402
}
352403

353404
static int atmel_hlcdc_crtc_select_output_mode(struct drm_crtc_state *state)
354405
{
355-
unsigned int output_fmts = ATMEL_HLCDC_OUTPUT_MODE_MASK;
406+
unsigned int output_fmts;
356407
struct atmel_hlcdc_crtc_state *hstate;
357408
struct drm_connector_state *cstate;
358409
struct drm_connector *connector;
359-
struct atmel_hlcdc_crtc *crtc;
410+
struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(state->crtc);
360411
int i;
412+
bool is_xlcdc = crtc->dc->desc->is_xlcdc;
361413

362-
crtc = drm_crtc_to_atmel_hlcdc_crtc(state->crtc);
414+
output_fmts = is_xlcdc ? ATMEL_XLCDC_OUTPUT_MODE_MASK :
415+
ATMEL_HLCDC_OUTPUT_MODE_MASK;
363416

364417
for_each_new_connector_in_state(state->state, connector, cstate, i) {
365418
unsigned int supported_fmts = 0;
@@ -380,7 +433,7 @@ static int atmel_hlcdc_crtc_select_output_mode(struct drm_crtc_state *state)
380433

381434
hstate = drm_crtc_state_to_atmel_hlcdc_crtc_state(state);
382435
hstate->output_mode = fls(output_fmts) - 1;
383-
if (crtc->dc->desc->is_xlcdc) {
436+
if (is_xlcdc) {
384437
/* check if MIPI DPI bit needs to be set */
385438
if (fls(output_fmts) > 3) {
386439
hstate->output_mode -= 4;

0 commit comments

Comments
 (0)