/*
 * Copyright (C) 2012 Russell King
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#ifndef ARMADA_CONNETOR_H
#define ARMADA_CONNETOR_H

#define encoder_helper_funcs(encoder) \
	((const struct drm_encoder_helper_funcs *)encoder->helper_private)

struct armada_output_type {
	int connector_type;
	enum drm_connector_status (*detect)(struct drm_connector *, bool);
	int (*create)(struct drm_connector *, const void *);
	int (*set_property)(struct drm_connector *, struct drm_property *,
			    uint64_t);
};

struct drm_encoder *armada_drm_connector_encoder(struct drm_connector *conn);

void armada_drm_encoder_prepare(struct drm_encoder *encoder);
void armada_drm_encoder_commit(struct drm_encoder *encoder);

bool armada_drm_encoder_mode_fixup(struct drm_encoder *encoder,
	const struct drm_display_mode *mode, struct drm_display_mode *adj);

int armada_drm_slave_encoder_mode_valid(struct drm_connector *conn,
	struct drm_display_mode *mode);

int armada_drm_slave_encoder_set_property(struct drm_connector *conn,
	struct drm_property *property, uint64_t value);

int armada_output_create(struct drm_device *dev,
	const struct armada_output_type *type, const void *data);

#endif
