aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-imx/clk-imx1.c6
-rw-r--r--arch/arm/mach-imx/clk-imx21.c6
-rw-r--r--arch/arm/mach-imx/clk-imx25.c6
-rw-r--r--arch/arm/mach-imx/clk-imx27.c6
-rw-r--r--arch/arm/mach-imx/devices/devices-common.h1
-rw-r--r--arch/arm/mach-imx/devices/platform-imx-fb.c11
-rw-r--r--drivers/video/imxfb.c38
7 files changed, 51 insertions, 23 deletions
diff --git a/arch/arm/mach-imx/clk-imx1.c b/arch/arm/mach-imx/clk-imx1.c
index 49a74440bc48..796d8b86e8b6 100644
--- a/arch/arm/mach-imx/clk-imx1.c
+++ b/arch/arm/mach-imx/clk-imx1.c
@@ -102,9 +102,9 @@ int __init mx1_clocks_init(unsigned long fref)
102 clk_register_clkdev(clk[per2], "per", "imx1-cspi.1"); 102 clk_register_clkdev(clk[per2], "per", "imx1-cspi.1");
103 clk_register_clkdev(clk[dummy], "ipg", "imx1-cspi.1"); 103 clk_register_clkdev(clk[dummy], "ipg", "imx1-cspi.1");
104 clk_register_clkdev(clk[per2], NULL, "imx-mmc.0"); 104 clk_register_clkdev(clk[per2], NULL, "imx-mmc.0");
105 clk_register_clkdev(clk[per2], "per", "imx-fb.0"); 105 clk_register_clkdev(clk[per2], "per", "imx1-fb.0");
106 clk_register_clkdev(clk[dummy], "ipg", "imx-fb.0"); 106 clk_register_clkdev(clk[dummy], "ipg", "imx1-fb.0");
107 clk_register_clkdev(clk[dummy], "ahb", "imx-fb.0"); 107 clk_register_clkdev(clk[dummy], "ahb", "imx1-fb.0");
108 clk_register_clkdev(clk[hclk], "mshc", NULL); 108 clk_register_clkdev(clk[hclk], "mshc", NULL);
109 clk_register_clkdev(clk[per3], "ssi", NULL); 109 clk_register_clkdev(clk[per3], "ssi", NULL);
110 clk_register_clkdev(clk[clk32], NULL, "imx1-rtc.0"); 110 clk_register_clkdev(clk[clk32], NULL, "imx1-rtc.0");
diff --git a/arch/arm/mach-imx/clk-imx21.c b/arch/arm/mach-imx/clk-imx21.c
index 8aec572f84fe..fcdaa9b9cec7 100644
--- a/arch/arm/mach-imx/clk-imx21.c
+++ b/arch/arm/mach-imx/clk-imx21.c
@@ -157,9 +157,9 @@ int __init mx21_clocks_init(unsigned long lref, unsigned long href)
157 clk_register_clkdev(clk[cspi2_ipg_gate], "ipg", "imx21-cspi.1"); 157 clk_register_clkdev(clk[cspi2_ipg_gate], "ipg", "imx21-cspi.1");
158 clk_register_clkdev(clk[per2], "per", "imx21-cspi.2"); 158 clk_register_clkdev(clk[per2], "per", "imx21-cspi.2");
159 clk_register_clkdev(clk[cspi3_ipg_gate], "ipg", "imx21-cspi.2"); 159 clk_register_clkdev(clk[cspi3_ipg_gate], "ipg", "imx21-cspi.2");
160 clk_register_clkdev(clk[per3], "per", "imx-fb.0"); 160 clk_register_clkdev(clk[per3], "per", "imx21-fb.0");
161 clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); 161 clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx21-fb.0");
162 clk_register_clkdev(clk[lcdc_hclk_gate], "ahb", "imx-fb.0"); 162 clk_register_clkdev(clk[lcdc_hclk_gate], "ahb", "imx21-fb.0");
163 clk_register_clkdev(clk[usb_gate], "per", "imx21-hcd.0"); 163 clk_register_clkdev(clk[usb_gate], "per", "imx21-hcd.0");
164 clk_register_clkdev(clk[usb_hclk_gate], "ahb", "imx21-hcd.0"); 164 clk_register_clkdev(clk[usb_hclk_gate], "ahb", "imx21-hcd.0");
165 clk_register_clkdev(clk[nfc_gate], NULL, "imx21-nand.0"); 165 clk_register_clkdev(clk[nfc_gate], NULL, "imx21-nand.0");
diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c
index 2add1ea22d44..08d98030e02f 100644
--- a/arch/arm/mach-imx/clk-imx25.c
+++ b/arch/arm/mach-imx/clk-imx25.c
@@ -219,9 +219,9 @@ int __init mx25_clocks_init(void)
219 clk_register_clkdev(clk[fec_ipg], "ipg", "imx25-fec.0"); 219 clk_register_clkdev(clk[fec_ipg], "ipg", "imx25-fec.0");
220 clk_register_clkdev(clk[fec_ahb], "ahb", "imx25-fec.0"); 220 clk_register_clkdev(clk[fec_ahb], "ahb", "imx25-fec.0");
221 clk_register_clkdev(clk[dryice_ipg], NULL, "imxdi_rtc.0"); 221 clk_register_clkdev(clk[dryice_ipg], NULL, "imxdi_rtc.0");
222 clk_register_clkdev(clk[lcdc_ipg_per], "per", "imx-fb.0"); 222 clk_register_clkdev(clk[lcdc_ipg_per], "per", "imx21-fb.0");
223 clk_register_clkdev(clk[lcdc_ipg], "ipg", "imx-fb.0"); 223 clk_register_clkdev(clk[lcdc_ipg], "ipg", "imx21-fb.0");
224 clk_register_clkdev(clk[lcdc_ahb], "ahb", "imx-fb.0"); 224 clk_register_clkdev(clk[lcdc_ahb], "ahb", "imx21-fb.0");
225 clk_register_clkdev(clk[wdt_ipg], NULL, "imx2-wdt.0"); 225 clk_register_clkdev(clk[wdt_ipg], NULL, "imx2-wdt.0");
226 clk_register_clkdev(clk[ssi1_ipg], NULL, "imx-ssi.0"); 226 clk_register_clkdev(clk[ssi1_ipg], NULL, "imx-ssi.0");
227 clk_register_clkdev(clk[ssi2_ipg], NULL, "imx-ssi.1"); 227 clk_register_clkdev(clk[ssi2_ipg], NULL, "imx-ssi.1");
diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c
index 46764d864232..4204092ab64a 100644
--- a/arch/arm/mach-imx/clk-imx27.c
+++ b/arch/arm/mach-imx/clk-imx27.c
@@ -221,9 +221,9 @@ int __init mx27_clocks_init(unsigned long fref)
221 clk_register_clkdev(clk[cspi1_ipg_gate], NULL, "imx27-cspi.0"); 221 clk_register_clkdev(clk[cspi1_ipg_gate], NULL, "imx27-cspi.0");
222 clk_register_clkdev(clk[cspi2_ipg_gate], NULL, "imx27-cspi.1"); 222 clk_register_clkdev(clk[cspi2_ipg_gate], NULL, "imx27-cspi.1");
223 clk_register_clkdev(clk[cspi3_ipg_gate], NULL, "imx27-cspi.2"); 223 clk_register_clkdev(clk[cspi3_ipg_gate], NULL, "imx27-cspi.2");
224 clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0"); 224 clk_register_clkdev(clk[per3_gate], "per", "imx21-fb.0");
225 clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); 225 clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx21-fb.0");
226 clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0"); 226 clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx21-fb.0");
227 clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0"); 227 clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0");
228 clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); 228 clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc");
229 clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); 229 clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc");
diff --git a/arch/arm/mach-imx/devices/devices-common.h b/arch/arm/mach-imx/devices/devices-common.h
index 4caf1c61e350..e4b790b9e2aa 100644
--- a/arch/arm/mach-imx/devices/devices-common.h
+++ b/arch/arm/mach-imx/devices/devices-common.h
@@ -108,6 +108,7 @@ struct platform_device *__init imx_add_imxdi_rtc(
108 108
109#include <linux/platform_data/video-imxfb.h> 109#include <linux/platform_data/video-imxfb.h>
110struct imx_imx_fb_data { 110struct imx_imx_fb_data {
111 const char *devid;
111 resource_size_t iobase; 112 resource_size_t iobase;
112 resource_size_t iosize; 113 resource_size_t iosize;
113 resource_size_t irq; 114 resource_size_t irq;
diff --git a/arch/arm/mach-imx/devices/platform-imx-fb.c b/arch/arm/mach-imx/devices/platform-imx-fb.c
index 4e6f85703918..abea28bea282 100644
--- a/arch/arm/mach-imx/devices/platform-imx-fb.c
+++ b/arch/arm/mach-imx/devices/platform-imx-fb.c
@@ -10,8 +10,9 @@
10#include <mach/hardware.h> 10#include <mach/hardware.h>
11#include "devices-common.h" 11#include "devices-common.h"
12 12
13#define imx_imx_fb_data_entry_single(soc, _size) \ 13#define imx_imx_fb_data_entry_single(soc, _devid, _size) \
14 { \ 14 { \
15 .devid = _devid, \
15 .iobase = soc ## _LCDC_BASE_ADDR, \ 16 .iobase = soc ## _LCDC_BASE_ADDR, \
16 .iosize = _size, \ 17 .iosize = _size, \
17 .irq = soc ## _INT_LCDC, \ 18 .irq = soc ## _INT_LCDC, \
@@ -19,22 +20,22 @@
19 20
20#ifdef CONFIG_SOC_IMX1 21#ifdef CONFIG_SOC_IMX1
21const struct imx_imx_fb_data imx1_imx_fb_data __initconst = 22const struct imx_imx_fb_data imx1_imx_fb_data __initconst =
22 imx_imx_fb_data_entry_single(MX1, SZ_4K); 23 imx_imx_fb_data_entry_single(MX1, "imx1-fb", SZ_4K);
23#endif /* ifdef CONFIG_SOC_IMX1 */ 24#endif /* ifdef CONFIG_SOC_IMX1 */
24 25
25#ifdef CONFIG_SOC_IMX21 26#ifdef CONFIG_SOC_IMX21
26const struct imx_imx_fb_data imx21_imx_fb_data __initconst = 27const struct imx_imx_fb_data imx21_imx_fb_data __initconst =
27 imx_imx_fb_data_entry_single(MX21, SZ_4K); 28 imx_imx_fb_data_entry_single(MX21, "imx21-fb", SZ_4K);
28#endif /* ifdef CONFIG_SOC_IMX21 */ 29#endif /* ifdef CONFIG_SOC_IMX21 */
29 30
30#ifdef CONFIG_SOC_IMX25 31#ifdef CONFIG_SOC_IMX25
31const struct imx_imx_fb_data imx25_imx_fb_data __initconst = 32const struct imx_imx_fb_data imx25_imx_fb_data __initconst =
32 imx_imx_fb_data_entry_single(MX25, SZ_16K); 33 imx_imx_fb_data_entry_single(MX25, "imx21-fb", SZ_16K);
33#endif /* ifdef CONFIG_SOC_IMX25 */ 34#endif /* ifdef CONFIG_SOC_IMX25 */
34 35
35#ifdef CONFIG_SOC_IMX27 36#ifdef CONFIG_SOC_IMX27
36const struct imx_imx_fb_data imx27_imx_fb_data __initconst = 37const struct imx_imx_fb_data imx27_imx_fb_data __initconst =
37 imx_imx_fb_data_entry_single(MX27, SZ_4K); 38 imx_imx_fb_data_entry_single(MX27, "imx21-fb", SZ_4K);
38#endif /* ifdef CONFIG_SOC_IMX27 */ 39#endif /* ifdef CONFIG_SOC_IMX27 */
39 40
40struct platform_device *__init imx_add_imx_fb( 41struct platform_device *__init imx_add_imx_fb(
diff --git a/drivers/video/imxfb.c b/drivers/video/imxfb.c
index cf2688de0832..e501dbc966b3 100644
--- a/drivers/video/imxfb.c
+++ b/drivers/video/imxfb.c
@@ -33,7 +33,6 @@
33#include <linux/math64.h> 33#include <linux/math64.h>
34 34
35#include <linux/platform_data/video-imxfb.h> 35#include <linux/platform_data/video-imxfb.h>
36#include <mach/hardware.h>
37 36
38/* 37/*
39 * Complain if VAR is out of range. 38 * Complain if VAR is out of range.
@@ -53,8 +52,8 @@
53#define LCDC_SIZE 0x04 52#define LCDC_SIZE 0x04
54#define SIZE_XMAX(x) ((((x) >> 4) & 0x3f) << 20) 53#define SIZE_XMAX(x) ((((x) >> 4) & 0x3f) << 20)
55 54
56#define YMAX_MASK (cpu_is_mx1() ? 0x1ff : 0x3ff) 55#define YMAX_MASK_IMX1 0x1ff
57#define SIZE_YMAX(y) ((y) & YMAX_MASK) 56#define YMAX_MASK_IMX21 0x3ff
58 57
59#define LCDC_VPW 0x08 58#define LCDC_VPW 0x08
60#define VPW_VPW(x) ((x) & 0x3ff) 59#define VPW_VPW(x) ((x) & 0x3ff)
@@ -128,12 +127,18 @@ struct imxfb_rgb {
128 struct fb_bitfield transp; 127 struct fb_bitfield transp;
129}; 128};
130 129
130enum imxfb_type {
131 IMX1_FB,
132 IMX21_FB,
133};
134
131struct imxfb_info { 135struct imxfb_info {
132 struct platform_device *pdev; 136 struct platform_device *pdev;
133 void __iomem *regs; 137 void __iomem *regs;
134 struct clk *clk_ipg; 138 struct clk *clk_ipg;
135 struct clk *clk_ahb; 139 struct clk *clk_ahb;
136 struct clk *clk_per; 140 struct clk *clk_per;
141 enum imxfb_type devtype;
137 142
138 /* 143 /*
139 * These are the addresses we mapped 144 * These are the addresses we mapped
@@ -168,6 +173,24 @@ struct imxfb_info {
168 void (*backlight_power)(int); 173 void (*backlight_power)(int);
169}; 174};
170 175
176static struct platform_device_id imxfb_devtype[] = {
177 {
178 .name = "imx1-fb",
179 .driver_data = IMX1_FB,
180 }, {
181 .name = "imx21-fb",
182 .driver_data = IMX21_FB,
183 }, {
184 /* sentinel */
185 }
186};
187MODULE_DEVICE_TABLE(platform, imxfb_devtype);
188
189static inline int is_imx1_fb(struct imxfb_info *fbi)
190{
191 return fbi->devtype == IMX1_FB;
192}
193
171#define IMX_NAME "IMX" 194#define IMX_NAME "IMX"
172 195
173/* 196/*
@@ -366,7 +389,7 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
366 break; 389 break;
367 case 16: 390 case 16:
368 default: 391 default:
369 if (cpu_is_mx1()) 392 if (is_imx1_fb(fbi))
370 pcr |= PCR_BPIX_12; 393 pcr |= PCR_BPIX_12;
371 else 394 else
372 pcr |= PCR_BPIX_16; 395 pcr |= PCR_BPIX_16;
@@ -596,6 +619,7 @@ static struct fb_ops imxfb_ops = {
596static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info) 619static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info)
597{ 620{
598 struct imxfb_info *fbi = info->par; 621 struct imxfb_info *fbi = info->par;
622 u32 ymax_mask = is_imx1_fb(fbi) ? YMAX_MASK_IMX1 : YMAX_MASK_IMX21;
599 623
600 pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n", 624 pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n",
601 var->xres, var->hsync_len, 625 var->xres, var->hsync_len,
@@ -617,7 +641,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf
617 if (var->right_margin > 255) 641 if (var->right_margin > 255)
618 printk(KERN_ERR "%s: invalid right_margin %d\n", 642 printk(KERN_ERR "%s: invalid right_margin %d\n",
619 info->fix.id, var->right_margin); 643 info->fix.id, var->right_margin);
620 if (var->yres < 1 || var->yres > YMAX_MASK) 644 if (var->yres < 1 || var->yres > ymax_mask)
621 printk(KERN_ERR "%s: invalid yres %d\n", 645 printk(KERN_ERR "%s: invalid yres %d\n",
622 info->fix.id, var->yres); 646 info->fix.id, var->yres);
623 if (var->vsync_len > 100) 647 if (var->vsync_len > 100)
@@ -645,7 +669,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf
645 VCR_V_WAIT_2(var->upper_margin), 669 VCR_V_WAIT_2(var->upper_margin),
646 fbi->regs + LCDC_VCR); 670 fbi->regs + LCDC_VCR);
647 671
648 writel(SIZE_XMAX(var->xres) | SIZE_YMAX(var->yres), 672 writel(SIZE_XMAX(var->xres) | (var->yres & ymax_mask),
649 fbi->regs + LCDC_SIZE); 673 fbi->regs + LCDC_SIZE);
650 674
651 writel(fbi->pcr, fbi->regs + LCDC_PCR); 675 writel(fbi->pcr, fbi->regs + LCDC_PCR);
@@ -765,6 +789,7 @@ static int __init imxfb_probe(struct platform_device *pdev)
765 return -ENOMEM; 789 return -ENOMEM;
766 790
767 fbi = info->par; 791 fbi = info->par;
792 fbi->devtype = pdev->id_entry->driver_data;
768 793
769 if (!fb_mode) 794 if (!fb_mode)
770 fb_mode = pdata->mode[0].mode.name; 795 fb_mode = pdata->mode[0].mode.name;
@@ -939,6 +964,7 @@ static struct platform_driver imxfb_driver = {
939 .driver = { 964 .driver = {
940 .name = DRIVER_NAME, 965 .name = DRIVER_NAME,
941 }, 966 },
967 .id_table = imxfb_devtype,
942}; 968};
943 969
944static int imxfb_setup(void) 970static int imxfb_setup(void)