/*
 *
 * (C) COPYRIGHT 2012-2013 ARM Limited. All rights reserved.
 *
 * This program is free software and is provided to you under the terms of the
 * GNU General Public License version 2 as published by the Free Software
 * Foundation, and any use by you of this program is subject to the terms
 * of such GNU licence.
 *
 * A copy of the licence is included with the program, and can also be obtained
 * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA  02110-1301, USA.
 *
 */



/**
 * pl111_drm_encoder.c
 * Implementation of the encoder functions for PL111 DRM
 */
#include <linux/amba/bus.h>
#include <linux/amba/clcd.h>
#include <linux/version.h>
#include <linux/shmem_fs.h>
#include <linux/dma-buf.h>
#include <linux/module.h>

#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>

#include "pl111_drm.h"

bool pl111_encoder_helper_mode_fixup(struct drm_encoder *encoder,
					struct drm_display_mode *mode,
					struct drm_display_mode *adjusted_mode)
{
	DRM_DEBUG_KMS("DRM %s on encoder=%p\n", __func__, encoder);
	return true;
}

void pl111_encoder_helper_prepare(struct drm_encoder *encoder)
{
	DRM_DEBUG_KMS("DRM %s on encoder=%p\n", __func__, encoder);
}

void pl111_encoder_helper_commit(struct drm_encoder *encoder)
{
	DRM_DEBUG_KMS("DRM %s on encoder=%p\n", __func__, encoder);
}

void pl111_encoder_helper_mode_set(struct drm_encoder *encoder,
				struct drm_display_mode *mode,
				struct drm_display_mode *adjusted_mode)
{
	DRM_DEBUG_KMS("DRM %s on encoder=%p\n", __func__, encoder);
}

void pl111_encoder_helper_disable(struct drm_encoder *encoder)
{
	DRM_DEBUG_KMS("DRM %s on encoder=%p\n", __func__, encoder);
}

void pl111_encoder_destroy(struct drm_encoder *encoder)
{
	struct pl111_drm_encoder *pl111_encoder =
					PL111_ENCODER_FROM_ENCODER(encoder);

	DRM_DEBUG_KMS("DRM %s on encoder=%p\n", __func__, encoder);

	drm_encoder_cleanup(encoder);
	kfree(pl111_encoder);
}

const struct drm_encoder_funcs encoder_funcs = {
	.destroy = pl111_encoder_destroy,
};

const struct drm_encoder_helper_funcs encoder_helper_funcs = {
	.mode_fixup = pl111_encoder_helper_mode_fixup,
	.prepare = pl111_encoder_helper_prepare,
	.commit = pl111_encoder_helper_commit,
	.mode_set = pl111_encoder_helper_mode_set,
	.disable = pl111_encoder_helper_disable,
};

struct pl111_drm_encoder *pl111_encoder_create(struct drm_device *dev,
						int possible_crtcs)
{
	struct pl111_drm_encoder *pl111_encoder;

	pl111_encoder = kzalloc(sizeof(struct pl111_drm_encoder), GFP_KERNEL);
	if (pl111_encoder == NULL) {
		pr_err("Failed to allocated pl111_drm_encoder\n");
		return NULL;
	}

	drm_encoder_init(dev, &pl111_encoder->encoder, &encoder_funcs,
				DRM_MODE_ENCODER_DAC);

	drm_encoder_helper_add(&pl111_encoder->encoder, &encoder_helper_funcs);

	pl111_encoder->encoder.possible_crtcs = possible_crtcs;

	return pl111_encoder;
}

