2008-05-28 22:02:14 -06:00
|
|
|
/*
|
|
|
|
* Copyright © 2006 Keith Packard
|
|
|
|
* Copyright © 2007 Intel Corporation
|
|
|
|
* Jesse Barnes <jesse.barnes@intel.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The DRM mode setting helper functions are common code for drivers to use if they wish.
|
|
|
|
* Drivers are not forced to use this code in their implementations but it would be useful
|
|
|
|
* if they code they do use at least provides a consistent interface and operation to userspace
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __DRM_CRTC_HELPER_H__
|
|
|
|
#define __DRM_CRTC_HELPER_H__
|
|
|
|
|
|
|
|
#include <linux/i2c.h>
|
|
|
|
#include <linux/spinlock.h>
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <linux/idr.h>
|
|
|
|
|
|
|
|
#include <linux/fb.h>
|
|
|
|
|
|
|
|
struct drm_crtc_helper_funcs {
|
2008-06-01 18:05:54 -06:00
|
|
|
/*
|
|
|
|
* Control power levels on the CRTC. If the mode passed in is
|
|
|
|
* unsupported, the provider must use the next lowest power level.
|
|
|
|
*/
|
|
|
|
void (*dpms)(struct drm_crtc *crtc, int mode);
|
2008-05-28 22:02:14 -06:00
|
|
|
void (*prepare)(struct drm_crtc *crtc);
|
|
|
|
void (*commit)(struct drm_crtc *crtc);
|
|
|
|
|
|
|
|
/* Provider can fixup or change mode timings before modeset occurs */
|
|
|
|
bool (*mode_fixup)(struct drm_crtc *crtc,
|
|
|
|
struct drm_display_mode *mode,
|
|
|
|
struct drm_display_mode *adjusted_mode);
|
|
|
|
/* Actually set the mode */
|
|
|
|
void (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
|
|
|
struct drm_display_mode *adjusted_mode, int x, int y);
|
|
|
|
|
|
|
|
/* Move the crtc on the current fb to the given position *optional* */
|
|
|
|
void (*mode_set_base)(struct drm_crtc *crtc, int x, int y);
|
|
|
|
};
|
|
|
|
|
2008-06-01 18:05:54 -06:00
|
|
|
struct drm_encoder_helper_funcs {
|
|
|
|
void (*dpms)(struct drm_encoder *encoder, int mode);
|
|
|
|
void (*save)(struct drm_encoder *encoder);
|
|
|
|
void (*restore)(struct drm_encoder *encoder);
|
|
|
|
|
|
|
|
bool (*mode_fixup)(struct drm_encoder *encoder,
|
2008-05-28 22:02:14 -06:00
|
|
|
struct drm_display_mode *mode,
|
|
|
|
struct drm_display_mode *adjusted_mode);
|
2008-06-01 18:05:54 -06:00
|
|
|
void (*prepare)(struct drm_encoder *encoder);
|
|
|
|
void (*commit)(struct drm_encoder *encoder);
|
|
|
|
void (*mode_set)(struct drm_encoder *encoder,
|
2008-05-29 20:03:36 -06:00
|
|
|
struct drm_display_mode *mode,
|
|
|
|
struct drm_display_mode *adjusted_mode);
|
2008-07-25 16:56:23 -06:00
|
|
|
/* detect for DAC style encoders */
|
|
|
|
enum drm_connector_status (*detect)(struct drm_encoder *encoder, struct drm_connector *connector);
|
2008-05-29 20:03:36 -06:00
|
|
|
};
|
|
|
|
|
2008-06-01 19:12:28 -06:00
|
|
|
struct drm_connector_helper_funcs {
|
|
|
|
int (*get_modes)(struct drm_connector *connector);
|
|
|
|
int (*mode_valid)(struct drm_connector *connector,
|
|
|
|
struct drm_display_mode *mode);
|
2008-06-01 19:44:35 -06:00
|
|
|
struct drm_encoder *(*best_encoder)(struct drm_connector *connector);
|
2008-06-01 19:12:28 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
extern void drm_helper_probe_single_connector_modes(struct drm_connector *connector, uint32_t maxX, uint32_t maxY);
|
2008-06-01 18:05:54 -06:00
|
|
|
extern void drm_helper_disable_unused_functions(struct drm_device *dev);
|
2008-06-05 18:38:35 -06:00
|
|
|
extern int drm_helper_hotplug_stage_two(struct drm_device *dev);
|
2008-05-28 22:02:14 -06:00
|
|
|
extern bool drm_helper_initial_config(struct drm_device *dev, bool can_grow);
|
|
|
|
extern int drm_crtc_helper_set_config(struct drm_mode_set *set);
|
|
|
|
extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
|
|
|
int x, int y);
|
2008-06-01 19:12:28 -06:00
|
|
|
extern bool drm_helper_crtc_in_use(struct drm_crtc *crtc);
|
2008-06-03 19:59:28 -06:00
|
|
|
|
|
|
|
extern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
|
2008-11-02 16:36:03 -07:00
|
|
|
struct drm_mode_fb_cmd *mode_cmd);
|
2008-06-03 19:59:28 -06:00
|
|
|
|
2008-05-28 22:02:14 -06:00
|
|
|
static inline void drm_crtc_helper_add(struct drm_crtc *crtc, const struct drm_crtc_helper_funcs *funcs)
|
|
|
|
{
|
|
|
|
crtc->helper_private = (void *)funcs;
|
|
|
|
}
|
|
|
|
|
2008-06-01 18:05:54 -06:00
|
|
|
static inline void drm_encoder_helper_add(struct drm_encoder *encoder, const struct drm_encoder_helper_funcs *funcs)
|
2008-05-28 22:02:14 -06:00
|
|
|
{
|
2008-06-01 18:05:54 -06:00
|
|
|
encoder->helper_private = (void *)funcs;
|
2008-05-28 22:02:14 -06:00
|
|
|
}
|
|
|
|
|
2008-06-01 19:12:28 -06:00
|
|
|
static inline void drm_connector_helper_add(struct drm_connector *connector, const struct drm_connector_helper_funcs *funcs)
|
|
|
|
{
|
|
|
|
connector->helper_private = (void *)funcs;
|
|
|
|
}
|
|
|
|
|
2008-09-17 17:59:08 -06:00
|
|
|
extern int drm_helper_resume_force_mode(struct drm_device *dev);
|
2008-11-09 22:37:16 -07:00
|
|
|
extern void drm_helper_set_connector_dpms(struct drm_connector *connector,
|
|
|
|
int dpms_mode);
|
2008-05-28 22:02:14 -06:00
|
|
|
#endif
|