16ee73861SBen Skeggs /*
26ee73861SBen Skeggs  * Copyright (C) 2008 Maarten Maathuis.
36ee73861SBen Skeggs  * All Rights Reserved.
46ee73861SBen Skeggs  *
56ee73861SBen Skeggs  * Permission is hereby granted, free of charge, to any person obtaining
66ee73861SBen Skeggs  * a copy of this software and associated documentation files (the
76ee73861SBen Skeggs  * "Software"), to deal in the Software without restriction, including
86ee73861SBen Skeggs  * without limitation the rights to use, copy, modify, merge, publish,
96ee73861SBen Skeggs  * distribute, sublicense, and/or sell copies of the Software, and to
106ee73861SBen Skeggs  * permit persons to whom the Software is furnished to do so, subject to
116ee73861SBen Skeggs  * the following conditions:
126ee73861SBen Skeggs  *
136ee73861SBen Skeggs  * The above copyright notice and this permission notice (including the
146ee73861SBen Skeggs  * next paragraph) shall be included in all copies or substantial
156ee73861SBen Skeggs  * portions of the Software.
166ee73861SBen Skeggs  *
176ee73861SBen Skeggs  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
186ee73861SBen Skeggs  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
196ee73861SBen Skeggs  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
206ee73861SBen Skeggs  * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
216ee73861SBen Skeggs  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
226ee73861SBen Skeggs  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
236ee73861SBen Skeggs  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
246ee73861SBen Skeggs  *
256ee73861SBen Skeggs  */
266ee73861SBen Skeggs 
276ee73861SBen Skeggs #ifndef __NOUVEAU_ENCODER_H__
286ee73861SBen Skeggs #define __NOUVEAU_ENCODER_H__
296ee73861SBen Skeggs 
3051a3d342SBen Skeggs #include <subdev/bios/dcb.h>
3151a3d342SBen Skeggs 
32760285e7SDavid Howells #include <drm/drm_encoder_slave.h>
331a646342SBen Skeggs #include "dispnv04/disp.h"
346ee73861SBen Skeggs 
356ee73861SBen Skeggs #define NV_DPMS_CLEARED 0x80
366ee73861SBen Skeggs 
37be83cd4eSBen Skeggs struct nvkm_i2c_port;
384196faa8SBen Skeggs 
396ee73861SBen Skeggs struct nouveau_encoder {
406ee73861SBen Skeggs 	struct drm_encoder_slave base;
416ee73861SBen Skeggs 
42cb75d97eSBen Skeggs 	struct dcb_output *dcb;
436ee73861SBen Skeggs 	int or;
442aa5eac5SBen Skeggs 
452aa5eac5SBen Skeggs 	struct i2c_adapter *i2c;
462aa5eac5SBen Skeggs 	struct nvkm_i2c_aux *aux;
476ee73861SBen Skeggs 
48ec7fc4a1SBen Skeggs 	/* different to drm_encoder.crtc, this reflects what's
49ec7fc4a1SBen Skeggs 	 * actually programmed on the hw, not the proposed crtc */
50ec7fc4a1SBen Skeggs 	struct drm_crtc *crtc;
51e84a35a8SBen Skeggs 	u32 ctrl;
52ec7fc4a1SBen Skeggs 
536ee73861SBen Skeggs 	struct drm_display_mode mode;
546ee73861SBen Skeggs 	int last_dpms;
556ee73861SBen Skeggs 
566ee73861SBen Skeggs 	struct nv04_output_reg restore;
576ee73861SBen Skeggs 
586ee73861SBen Skeggs 	union {
596ee73861SBen Skeggs 		struct {
6052e0d0ecSBen Skeggs 			u8  dpcd[8];
616ee73861SBen Skeggs 			int link_nr;
626ee73861SBen Skeggs 			int link_bw;
63a002feceSBen Skeggs 			u32 datarate;
646ee73861SBen Skeggs 		} dp;
656ee73861SBen Skeggs 	};
66129b7820SDaniel Vetter 
67129b7820SDaniel Vetter 	void (*enc_save)(struct drm_encoder *encoder);
68129b7820SDaniel Vetter 	void (*enc_restore)(struct drm_encoder *encoder);
696ee73861SBen Skeggs };
706ee73861SBen Skeggs 
7110b461e4SBen Skeggs struct nouveau_encoder *
7210b461e4SBen Skeggs find_encoder(struct drm_connector *connector, int type);
7310b461e4SBen Skeggs 
746ee73861SBen Skeggs static inline struct nouveau_encoder *nouveau_encoder(struct drm_encoder *enc)
756ee73861SBen Skeggs {
766ee73861SBen Skeggs 	struct drm_encoder_slave *slave = to_encoder_slave(enc);
776ee73861SBen Skeggs 
786ee73861SBen Skeggs 	return container_of(slave, struct nouveau_encoder, base);
796ee73861SBen Skeggs }
806ee73861SBen Skeggs 
816ee73861SBen Skeggs static inline struct drm_encoder *to_drm_encoder(struct nouveau_encoder *enc)
826ee73861SBen Skeggs {
836ee73861SBen Skeggs 	return &enc->base.base;
846ee73861SBen Skeggs }
856ee73861SBen Skeggs 
8616c3719cSVille Syrjälä static inline const struct drm_encoder_slave_funcs *
874a9f822fSFrancisco Jerez get_slave_funcs(struct drm_encoder *enc)
884a9f822fSFrancisco Jerez {
894a9f822fSFrancisco Jerez 	return to_encoder_slave(enc)->slave_funcs;
904a9f822fSFrancisco Jerez }
914a9f822fSFrancisco Jerez 
928663bc7cSBen Skeggs /* nouveau_dp.c */
938777c5c1SBen Skeggs int nouveau_dp_detect(struct nouveau_encoder *);
948663bc7cSBen Skeggs 
956ee73861SBen Skeggs struct nouveau_connector *
966ee73861SBen Skeggs nouveau_encoder_connector_get(struct nouveau_encoder *encoder);
978663bc7cSBen Skeggs 
986ee73861SBen Skeggs #endif /* __NOUVEAU_ENCODER_H__ */
99