forked from Minki/linux
9c9f6f8d47
The mdp5 kms driver currently sets up multiple encoders per interface (INTF), one for each kind of mode of operation it supports. We create 2 drm_encoders for DSI, one for Video Mode and the other for Command Mode operation. The reason behind this approach could have been that we aren't aware of the DSI device's mode of operation when we create the encoders. This makes things a bit complicated, since these encoders have to be further attached to the same DSI bridge. The easier way out is to create a single encoder, and make the DSI driver set its mode of operation when we know what the DSI device's mode flags are. Start with providing a way to set the mdp5_intf_mode using a kms func that sets the encoder's mode of operation. When constructing a DSI encoder, we set the mode of operation to Video Mode as default. When the DSI device is attached to the host, we probe the DSI mode flags and set the corresponding mode of operation. Signed-off-by: Archit Taneja <architt@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
102 lines
3.4 KiB
C
102 lines
3.4 KiB
C
/*
|
|
* Copyright (C) 2013 Red Hat
|
|
* Author: Rob Clark <robdclark@gmail.com>
|
|
*
|
|
* 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.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __MSM_KMS_H__
|
|
#define __MSM_KMS_H__
|
|
|
|
#include <linux/clk.h>
|
|
#include <linux/regulator/consumer.h>
|
|
|
|
#include "msm_drv.h"
|
|
|
|
#define MAX_PLANE 4
|
|
|
|
/* As there are different display controller blocks depending on the
|
|
* snapdragon version, the kms support is split out and the appropriate
|
|
* implementation is loaded at runtime. The kms module is responsible
|
|
* for constructing the appropriate planes/crtcs/encoders/connectors.
|
|
*/
|
|
struct msm_kms_funcs {
|
|
/* hw initialization: */
|
|
int (*hw_init)(struct msm_kms *kms);
|
|
/* irq handling: */
|
|
void (*irq_preinstall)(struct msm_kms *kms);
|
|
int (*irq_postinstall)(struct msm_kms *kms);
|
|
void (*irq_uninstall)(struct msm_kms *kms);
|
|
irqreturn_t (*irq)(struct msm_kms *kms);
|
|
int (*enable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
|
|
void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
|
|
/* swap global atomic state: */
|
|
void (*swap_state)(struct msm_kms *kms, struct drm_atomic_state *state);
|
|
/* modeset, bracketing atomic_commit(): */
|
|
void (*prepare_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
|
|
void (*complete_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
|
|
/* functions to wait for atomic commit completed on each CRTC */
|
|
void (*wait_for_crtc_commit_done)(struct msm_kms *kms,
|
|
struct drm_crtc *crtc);
|
|
/* misc: */
|
|
const struct msm_format *(*get_format)(struct msm_kms *kms, uint32_t format);
|
|
long (*round_pixclk)(struct msm_kms *kms, unsigned long rate,
|
|
struct drm_encoder *encoder);
|
|
int (*set_split_display)(struct msm_kms *kms,
|
|
struct drm_encoder *encoder,
|
|
struct drm_encoder *slave_encoder,
|
|
bool is_cmd_mode);
|
|
void (*set_encoder_mode)(struct msm_kms *kms,
|
|
struct drm_encoder *encoder,
|
|
bool cmd_mode);
|
|
/* cleanup: */
|
|
void (*destroy)(struct msm_kms *kms);
|
|
#ifdef CONFIG_DEBUG_FS
|
|
/* debugfs: */
|
|
int (*debugfs_init)(struct msm_kms *kms, struct drm_minor *minor);
|
|
void (*debugfs_cleanup)(struct msm_kms *kms, struct drm_minor *minor);
|
|
#endif
|
|
};
|
|
|
|
struct msm_kms {
|
|
const struct msm_kms_funcs *funcs;
|
|
|
|
/* irq number to be passed on to drm_irq_install */
|
|
int irq;
|
|
};
|
|
|
|
/**
|
|
* Subclass of drm_atomic_state, to allow kms backend to have driver
|
|
* private global state. The kms backend can do whatever it wants
|
|
* with the ->state ptr. On ->atomic_state_clear() the ->state ptr
|
|
* is kfree'd and set back to NULL.
|
|
*/
|
|
struct msm_kms_state {
|
|
struct drm_atomic_state base;
|
|
void *state;
|
|
};
|
|
#define to_kms_state(x) container_of(x, struct msm_kms_state, base)
|
|
|
|
static inline void msm_kms_init(struct msm_kms *kms,
|
|
const struct msm_kms_funcs *funcs)
|
|
{
|
|
kms->funcs = funcs;
|
|
}
|
|
|
|
struct msm_kms *mdp4_kms_init(struct drm_device *dev);
|
|
struct msm_kms *mdp5_kms_init(struct drm_device *dev);
|
|
int msm_mdss_init(struct drm_device *dev);
|
|
void msm_mdss_destroy(struct drm_device *dev);
|
|
|
|
#endif /* __MSM_KMS_H__ */
|