 20ea6adbf1
			
		
	
	20ea6adbf1
	
	
	
		
			
			Build system: x86_64 Build-tested: bcm2708, bcm2709, bcm2710, bcm2711 Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B Signed-off-by: Marty Jones <mj8263788@gmail.com> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From e664a91ea54b3488d6c08dd82dac2af1239c3275 Mon Sep 17 00:00:00 2001
 | |
| From: Dave Stevenson <dave.stevenson@raspberrypi.com>
 | |
| Date: Thu, 2 Dec 2021 18:21:46 +0000
 | |
| Subject: [PATCH] drm/vc4: dpi: Add option for inverting pixel clock
 | |
|  and output enable
 | |
| 
 | |
| DRM provides flags for inverting pixel clock and output enable
 | |
| signals, but these were not mapped to the relevant registers.
 | |
| 
 | |
| Add those mappings.
 | |
| 
 | |
| Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
 | |
| ---
 | |
|  drivers/gpu/drm/vc4/vc4_dpi.c | 89 ++++++++++++++++++++---------------
 | |
|  1 file changed, 51 insertions(+), 38 deletions(-)
 | |
| 
 | |
| --- a/drivers/gpu/drm/vc4/vc4_dpi.c
 | |
| +++ b/drivers/gpu/drm/vc4/vc4_dpi.c
 | |
| @@ -148,45 +148,58 @@ static void vc4_dpi_encoder_enable(struc
 | |
|  	}
 | |
|  	drm_connector_list_iter_end(&conn_iter);
 | |
|  
 | |
| -	if (connector && connector->display_info.num_bus_formats) {
 | |
| -		u32 bus_format = connector->display_info.bus_formats[0];
 | |
| +	if (connector) {
 | |
| +		if (connector->display_info.num_bus_formats) {
 | |
| +			u32 bus_format = connector->display_info.bus_formats[0];
 | |
|  
 | |
| -		switch (bus_format) {
 | |
| -		case MEDIA_BUS_FMT_RGB888_1X24:
 | |
| -			dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
 | |
| -					       DPI_FORMAT);
 | |
| -			break;
 | |
| -		case MEDIA_BUS_FMT_BGR888_1X24:
 | |
| -			dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
 | |
| -					       DPI_FORMAT);
 | |
| -			dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
 | |
| -			break;
 | |
| -		case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
 | |
| -			dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
 | |
| -					       DPI_FORMAT);
 | |
| -			break;
 | |
| -		case MEDIA_BUS_FMT_BGR666_1X24_CPADHI:
 | |
| -			dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
 | |
| -					       DPI_FORMAT);
 | |
| -			dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
 | |
| -			break;
 | |
| -		case MEDIA_BUS_FMT_RGB666_1X18:
 | |
| -			dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
 | |
| -					       DPI_FORMAT);
 | |
| -			break;
 | |
| -		case MEDIA_BUS_FMT_BGR666_1X18:
 | |
| -			dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
 | |
| -					       DPI_FORMAT);
 | |
| -			dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
 | |
| -			break;
 | |
| -		case MEDIA_BUS_FMT_RGB565_1X16:
 | |
| -			dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
 | |
| -					       DPI_FORMAT);
 | |
| -			break;
 | |
| -		default:
 | |
| -			DRM_ERROR("Unknown media bus format %d\n", bus_format);
 | |
| -			break;
 | |
| +			switch (bus_format) {
 | |
| +			case MEDIA_BUS_FMT_RGB888_1X24:
 | |
| +				dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
 | |
| +						       DPI_FORMAT);
 | |
| +				break;
 | |
| +			case MEDIA_BUS_FMT_BGR888_1X24:
 | |
| +				dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
 | |
| +						       DPI_FORMAT);
 | |
| +				dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR,
 | |
| +						       DPI_ORDER);
 | |
| +				break;
 | |
| +			case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
 | |
| +				dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
 | |
| +						       DPI_FORMAT);
 | |
| +				break;
 | |
| +			case MEDIA_BUS_FMT_BGR666_1X24_CPADHI:
 | |
| +				dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
 | |
| +						       DPI_FORMAT);
 | |
| +				dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR,
 | |
| +						       DPI_ORDER);
 | |
| +				break;
 | |
| +			case MEDIA_BUS_FMT_RGB666_1X18:
 | |
| +				dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
 | |
| +						       DPI_FORMAT);
 | |
| +				break;
 | |
| +			case MEDIA_BUS_FMT_BGR666_1X18:
 | |
| +				dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
 | |
| +						       DPI_FORMAT);
 | |
| +				dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR,
 | |
| +						       DPI_ORDER);
 | |
| +				break;
 | |
| +			case MEDIA_BUS_FMT_RGB565_1X16:
 | |
| +				dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
 | |
| +						       DPI_FORMAT);
 | |
| +				break;
 | |
| +			default:
 | |
| +				DRM_ERROR("Unknown media bus format %d\n",
 | |
| +					  bus_format);
 | |
| +				break;
 | |
| +			}
 | |
|  		}
 | |
| +
 | |
| +		if (connector->display_info.bus_flags &
 | |
| +					DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
 | |
| +			dpi_c |= DPI_PIXEL_CLK_INVERT;
 | |
| +
 | |
| +		if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW)
 | |
| +			dpi_c |= DPI_OUTPUT_ENABLE_INVERT;
 | |
|  	} else {
 | |
|  		/* Default to 18bit if no connector found. */
 | |
|  		dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1, DPI_FORMAT);
 |