| 
									
										
										
										
											2013-11-30 14:58:23 -05:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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 __MDP_KMS_H__
 | 
					
						
							|  |  |  | #define __MDP_KMS_H__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/clk.h>
 | 
					
						
							|  |  |  | #include <linux/platform_device.h>
 | 
					
						
							|  |  |  | #include <linux/regulator/consumer.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "msm_drv.h"
 | 
					
						
							| 
									
										
										
										
											2013-11-30 17:24:22 -05:00
										 |  |  | #include "msm_kms.h"
 | 
					
						
							| 
									
										
										
										
											2013-11-30 14:58:23 -05:00
										 |  |  | #include "mdp_common.xml.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-30 17:24:22 -05:00
										 |  |  | struct mdp_kms; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct mdp_kms_funcs { | 
					
						
							|  |  |  | 	struct msm_kms_funcs base; | 
					
						
							|  |  |  | 	void (*set_irqmask)(struct mdp_kms *mdp_kms, uint32_t irqmask); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct mdp_kms { | 
					
						
							|  |  |  | 	struct msm_kms base; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const struct mdp_kms_funcs *funcs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* irq handling: */ | 
					
						
							|  |  |  | 	bool in_irq; | 
					
						
							|  |  |  | 	struct list_head irq_list;    /* list of mdp4_irq */ | 
					
						
							|  |  |  | 	uint32_t vblank_mask;         /* irq bits set for userspace vblank */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | #define to_mdp_kms(x) container_of(x, struct mdp_kms, base)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void mdp_kms_init(struct mdp_kms *mdp_kms, | 
					
						
							|  |  |  | 		const struct mdp_kms_funcs *funcs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	mdp_kms->funcs = funcs; | 
					
						
							|  |  |  | 	INIT_LIST_HEAD(&mdp_kms->irq_list); | 
					
						
							|  |  |  | 	msm_kms_init(&mdp_kms->base, &funcs->base); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * irq helpers: | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* For transiently registering for different MDP irqs that various parts
 | 
					
						
							|  |  |  |  * of the KMS code need during setup/configuration.  These are not | 
					
						
							|  |  |  |  * necessarily the same as what drm_vblank_get/put() are requesting, and | 
					
						
							|  |  |  |  * the hysteresis in drm_vblank_put() is not necessarily desirable for | 
					
						
							|  |  |  |  * internal housekeeping related irq usage. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct mdp_irq { | 
					
						
							|  |  |  | 	struct list_head node; | 
					
						
							|  |  |  | 	uint32_t irqmask; | 
					
						
							|  |  |  | 	bool registered; | 
					
						
							|  |  |  | 	void (*irq)(struct mdp_irq *irq, uint32_t irqstatus); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void mdp_dispatch_irqs(struct mdp_kms *mdp_kms, uint32_t status); | 
					
						
							|  |  |  | void mdp_update_vblank_mask(struct mdp_kms *mdp_kms, uint32_t mask, bool enable); | 
					
						
							|  |  |  | void mdp_irq_wait(struct mdp_kms *mdp_kms, uint32_t irqmask); | 
					
						
							|  |  |  | void mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq); | 
					
						
							|  |  |  | void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * pixel format helpers: | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-30 14:58:23 -05:00
										 |  |  | struct mdp_format { | 
					
						
							|  |  |  | 	struct msm_format base; | 
					
						
							|  |  |  | 	enum mdp_bpc bpc_r, bpc_g, bpc_b; | 
					
						
							|  |  |  | 	enum mdp_bpc_alpha bpc_a; | 
					
						
							|  |  |  | 	uint8_t unpack[4]; | 
					
						
							|  |  |  | 	bool alpha_enable, unpack_tight; | 
					
						
							|  |  |  | 	uint8_t cpp, unpack_count; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | #define to_mdp_format(x) container_of(x, struct mdp_format, base)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uint32_t mdp_get_formats(uint32_t *formats, uint32_t max_formats); | 
					
						
							|  |  |  | const struct msm_format *mdp_get_format(struct msm_kms *kms, uint32_t format); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* __MDP_KMS_H__ */
 |