/*
 * rcar_du.h  --  R-Car Display Unit DRM driver
 *
 * Copyright (C) 2013 Renesas Corporation
 *
 * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#ifndef __RCAR_DU_H__
#define __RCAR_DU_H__

#include <drm/drm_mode.h>

enum rcar_du_output {
	RCAR_DU_OUTPUT_DPAD0,
	RCAR_DU_OUTPUT_DPAD1,
	RCAR_DU_OUTPUT_LVDS0,
	RCAR_DU_OUTPUT_LVDS1,
	RCAR_DU_OUTPUT_TCON,
	RCAR_DU_OUTPUT_MAX,
};

enum rcar_du_encoder_type {
	RCAR_DU_ENCODER_UNUSED = 0,
	RCAR_DU_ENCODER_NONE,
	RCAR_DU_ENCODER_VGA,
	RCAR_DU_ENCODER_LVDS,
};

struct rcar_du_panel_data {
	unsigned int width_mm;		/* Panel width in mm */
	unsigned int height_mm;		/* Panel height in mm */
	struct drm_mode_modeinfo mode;
};

struct rcar_du_connector_lvds_data {
	struct rcar_du_panel_data panel;
};

struct rcar_du_connector_vga_data {
	/* TODO: Add DDC information for EDID retrieval */
};

/*
 * struct rcar_du_encoder_data - Encoder platform data
 * @type: the encoder type (RCAR_DU_ENCODER_*)
 * @output: the DU output the connector is connected to (RCAR_DU_OUTPUT_*)
 * @connector.lvds: platform data for LVDS connectors
 * @connector.vga: platform data for VGA connectors
 *
 * Encoder platform data describes an on-board encoder, its associated DU SoC
 * output, and the connector.
 */
struct rcar_du_encoder_data {
	enum rcar_du_encoder_type type;
	enum rcar_du_output output;

	union {
		struct rcar_du_connector_lvds_data lvds;
		struct rcar_du_connector_vga_data vga;
	} connector;
};

struct rcar_du_platform_data {
	struct rcar_du_encoder_data *encoders;
	unsigned int num_encoders;
};

#endif /* __RCAR_DU_H__ */
