diff options
-rw-r--r-- | arch/arm/mach-imx/clk-imx1.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-imx/clk-imx21.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-imx/clk-imx25.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-imx/clk-imx27.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-imx/devices/devices-common.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-imx/devices/platform-imx-fb.c | 11 | ||||
-rw-r--r-- | drivers/video/imxfb.c | 38 |
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> |
110 | struct imx_imx_fb_data { | 110 | struct 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 |
21 | const struct imx_imx_fb_data imx1_imx_fb_data __initconst = | 22 | const 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 |
26 | const struct imx_imx_fb_data imx21_imx_fb_data __initconst = | 27 | const 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 |
31 | const struct imx_imx_fb_data imx25_imx_fb_data __initconst = | 32 | const 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 |
36 | const struct imx_imx_fb_data imx27_imx_fb_data __initconst = | 37 | const 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 | ||
40 | struct platform_device *__init imx_add_imx_fb( | 41 | struct 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 | ||
130 | enum imxfb_type { | ||
131 | IMX1_FB, | ||
132 | IMX21_FB, | ||
133 | }; | ||
134 | |||
131 | struct imxfb_info { | 135 | struct 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 | ||
176 | static 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 | }; | ||
187 | MODULE_DEVICE_TABLE(platform, imxfb_devtype); | ||
188 | |||
189 | static 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 = { | |||
596 | static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info) | 619 | static 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 | ||
944 | static int imxfb_setup(void) | 970 | static int imxfb_setup(void) |