efikamx: remove redundant crap from display platform file
[efikamx:linux-kernel.git] / arch / arm / mach-mx5 / mx51_efikamx_display.c
1 /*
2  * Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
3  * Copyright 2009-2010 Pegatron Corporation. All Rights Reserved.
4  * Copyright 2009-2010 Genesi USA, Inc. All Rights Reserved.
5  */
6
7 /*
8  * The code contained herein is licensed under the GNU General Public
9  * License. You may obtain a copy of the GNU General Public License
10  * Version 2 or later at the following locations:
11  *
12  * http://www.opensource.org/licenses/gpl-license.html
13  * http://www.gnu.org/copyleft/gpl.html
14  */
15
16 #include <linux/types.h>
17 #include <linux/delay.h>
18 #include <linux/pm.h>
19 #include <linux/interrupt.h>
20 #include <linux/irq.h>
21 #include <linux/init.h>
22 #include <linux/clk.h>
23 #include <linux/platform_device.h>
24 #include <linux/fsl_devices.h>
25 #include <linux/spi/spi.h>
26 #include <linux/i2c.h>
27 #include <linux/ipu.h>
28 #include <linux/mxcfb.h>
29 #include <mach/common.h>
30 #include <mach/hardware.h>
31 #include <asm/setup.h>
32 #include <asm/mach-types.h>
33 #include <asm/mach/arch.h>
34 #include <mach/gpio.h>
35 #include <mach/mxc_edid.h>
36
37 #include "devices.h"
38 #include "iomux.h"
39 #include "mx51_pins.h"
40
41 #include "mx51_efikamx.h"
42
43 #define VIDEO_MODE_HDMI_DEF     4
44
45 #define MEGA              1000000
46
47 u8 edid[256];
48
49 struct fb_videomode preferred_mode;
50
51 static struct mxc_iomux_pin_cfg __initdata mx51_efikamx_display_iomux_pins[] = {
52         /* display reset pin */
53         {
54          MX51_PIN_DISPB2_SER_DIN, IOMUX_CONFIG_GPIO,
55          0,
56          MUX_IN_GPIO3_IPP_IND_G_IN_5_SELECT_INPUT,
57          INPUT_CTL_PATH1,
58          },
59 };
60
61 int mxcfb_initialized = 0;
62
63 void mx51_efikamx_display_reset(void)
64 {
65         gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0);
66         gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0);
67         msleep(50);
68
69         /* do reset */
70         gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 1);
71         msleep(20);             /* tRES >= 50us */
72
73         gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0);
74 }
75
76
77 static struct resource mxcfb_resources[] = {
78         [0] = {
79                 .flags = IORESOURCE_MEM,
80                 },
81 };
82
83 static struct mxc_fb_platform_data mxcfb_data[] = {
84         {
85                 .interface_pix_fmt = IPU_PIX_FMT_RGB24, /* physical pixel format (to transmitter */
86                 .mode_str = "800x600-16@60", // safe default for HDMI
87         },
88 };
89
90 extern void mx5_ipu_reset(void);
91 static struct mxc_ipu_config mxc_ipu_data = {
92         .rev = 2,
93         .reset = mx5_ipu_reset,
94 };
95
96 extern void mx5_vpu_reset(void);
97 static struct mxc_vpu_platform_data mxc_vpu_data = {
98         .reset = mx5_vpu_reset,
99 };
100
101 void __init mx51_efikamx_init_display(void)
102 {
103         CONFIG_IOMUX(mx51_efikamx_display_iomux_pins);
104
105         /* HDMI Reset - Assert for i2c disabled mode */
106         gpio_request(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), "hdmi:reset");
107         gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIN), 0);
108
109         /* HDMI Interrupt pin (plug detect etc.)  */
110         gpio_request(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIO), "hdmi:irq");
111         gpio_direction_input(IOMUX_TO_GPIO(MX51_PIN_DISPB2_SER_DIO));
112
113         mxc_ipu_data.di_clk[0] = clk_get(NULL, "ipu_di0_clk");
114         mxc_ipu_data.csi_clk[0] = clk_get(NULL, "csi_mclk1");
115
116         mxc_register_device(&mxc_ipu_device, &mxc_ipu_data);
117         mxc_register_device(&mxcvpu_device, &mxc_vpu_data);
118         mxc_register_device(&gpu_device, NULL);
119         mxc_register_device(&mxc_v4l2out_device, NULL);
120 }
121
122 /* name is not my choice but.... */
123 int mxc_init_fb(void)
124 {
125         if ( mxcfb_initialized )
126                 return 0;
127
128         mxcfb_initialized = 1;
129
130         mxc_fb_devices[0].num_resources = ARRAY_SIZE(mxcfb_resources);
131         mxc_fb_devices[0].resource = mxcfb_resources;
132         printk(KERN_INFO "registering framebuffer for HDMI\n");
133         mxc_register_device(&mxc_fb_devices[0], &mxcfb_data[0]);        // HDMI
134
135         printk(KERN_INFO "registering framebuffer for VPU overlay\n");
136         mxc_register_device(&mxc_fb_devices[2], NULL);          // Overlay for VPU
137
138         return 0;
139 }
140 device_initcall(mxc_init_fb);
141
142 void mx51_efikamx_display_adjust_mem(int gpu_start, int gpu_mem, int fb_mem)
143 {
144                 /*reserve memory for gpu*/
145                 gpu_device.resource[5].start = gpu_start;
146                 gpu_device.resource[5].end =
147                                 gpu_device.resource[5].start + gpu_mem - 1;
148                 if (fb_mem) {
149                         mxcfb_resources[0].start =
150                                 gpu_device.resource[5].end + 1;
151                         mxcfb_resources[0].end =
152                                 mxcfb_resources[0].start + fb_mem - 1;
153                 } else {
154                         mxcfb_resources[0].start = 0;
155                         mxcfb_resources[0].end = 0;
156                 }
157 }