提交 e69dc9a9 编写于 作者: S Shawn Guo

video: imxfb: remove cpu_is_xxx by using platform_device_id

It changes the driver to use platform_device_id rather than cpu_is_xxx
to determine the controller type, and updates the platform code
accordingly.

As the result, mach/hardware.h inclusion gets removed from the driver.
Signed-off-by: NShawn Guo <shawn.guo@linaro.org>
Acked-by: NSascha Hauer <s.hauer@pengutronix.de>
Acked-by: NArnd Bergmann <arnd@arndb.de>
Cc: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Cc: linux-fbdev@vger.kernel.org
上级 7f917a8d
...@@ -102,9 +102,9 @@ int __init mx1_clocks_init(unsigned long fref) ...@@ -102,9 +102,9 @@ int __init mx1_clocks_init(unsigned long fref)
clk_register_clkdev(clk[per2], "per", "imx1-cspi.1"); clk_register_clkdev(clk[per2], "per", "imx1-cspi.1");
clk_register_clkdev(clk[dummy], "ipg", "imx1-cspi.1"); clk_register_clkdev(clk[dummy], "ipg", "imx1-cspi.1");
clk_register_clkdev(clk[per2], NULL, "imx-mmc.0"); clk_register_clkdev(clk[per2], NULL, "imx-mmc.0");
clk_register_clkdev(clk[per2], "per", "imx-fb.0"); clk_register_clkdev(clk[per2], "per", "imx1-fb.0");
clk_register_clkdev(clk[dummy], "ipg", "imx-fb.0"); clk_register_clkdev(clk[dummy], "ipg", "imx1-fb.0");
clk_register_clkdev(clk[dummy], "ahb", "imx-fb.0"); clk_register_clkdev(clk[dummy], "ahb", "imx1-fb.0");
clk_register_clkdev(clk[hclk], "mshc", NULL); clk_register_clkdev(clk[hclk], "mshc", NULL);
clk_register_clkdev(clk[per3], "ssi", NULL); clk_register_clkdev(clk[per3], "ssi", NULL);
clk_register_clkdev(clk[clk32], NULL, "imx1-rtc.0"); clk_register_clkdev(clk[clk32], NULL, "imx1-rtc.0");
......
...@@ -157,9 +157,9 @@ int __init mx21_clocks_init(unsigned long lref, unsigned long href) ...@@ -157,9 +157,9 @@ int __init mx21_clocks_init(unsigned long lref, unsigned long href)
clk_register_clkdev(clk[cspi2_ipg_gate], "ipg", "imx21-cspi.1"); clk_register_clkdev(clk[cspi2_ipg_gate], "ipg", "imx21-cspi.1");
clk_register_clkdev(clk[per2], "per", "imx21-cspi.2"); clk_register_clkdev(clk[per2], "per", "imx21-cspi.2");
clk_register_clkdev(clk[cspi3_ipg_gate], "ipg", "imx21-cspi.2"); clk_register_clkdev(clk[cspi3_ipg_gate], "ipg", "imx21-cspi.2");
clk_register_clkdev(clk[per3], "per", "imx-fb.0"); clk_register_clkdev(clk[per3], "per", "imx21-fb.0");
clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx21-fb.0");
clk_register_clkdev(clk[lcdc_hclk_gate], "ahb", "imx-fb.0"); clk_register_clkdev(clk[lcdc_hclk_gate], "ahb", "imx21-fb.0");
clk_register_clkdev(clk[usb_gate], "per", "imx21-hcd.0"); clk_register_clkdev(clk[usb_gate], "per", "imx21-hcd.0");
clk_register_clkdev(clk[usb_hclk_gate], "ahb", "imx21-hcd.0"); clk_register_clkdev(clk[usb_hclk_gate], "ahb", "imx21-hcd.0");
clk_register_clkdev(clk[nfc_gate], NULL, "imx21-nand.0"); clk_register_clkdev(clk[nfc_gate], NULL, "imx21-nand.0");
......
...@@ -219,9 +219,9 @@ int __init mx25_clocks_init(void) ...@@ -219,9 +219,9 @@ int __init mx25_clocks_init(void)
clk_register_clkdev(clk[fec_ipg], "ipg", "imx25-fec.0"); clk_register_clkdev(clk[fec_ipg], "ipg", "imx25-fec.0");
clk_register_clkdev(clk[fec_ahb], "ahb", "imx25-fec.0"); clk_register_clkdev(clk[fec_ahb], "ahb", "imx25-fec.0");
clk_register_clkdev(clk[dryice_ipg], NULL, "imxdi_rtc.0"); clk_register_clkdev(clk[dryice_ipg], NULL, "imxdi_rtc.0");
clk_register_clkdev(clk[lcdc_ipg_per], "per", "imx-fb.0"); clk_register_clkdev(clk[lcdc_ipg_per], "per", "imx21-fb.0");
clk_register_clkdev(clk[lcdc_ipg], "ipg", "imx-fb.0"); clk_register_clkdev(clk[lcdc_ipg], "ipg", "imx21-fb.0");
clk_register_clkdev(clk[lcdc_ahb], "ahb", "imx-fb.0"); clk_register_clkdev(clk[lcdc_ahb], "ahb", "imx21-fb.0");
clk_register_clkdev(clk[wdt_ipg], NULL, "imx2-wdt.0"); clk_register_clkdev(clk[wdt_ipg], NULL, "imx2-wdt.0");
clk_register_clkdev(clk[ssi1_ipg], NULL, "imx-ssi.0"); clk_register_clkdev(clk[ssi1_ipg], NULL, "imx-ssi.0");
clk_register_clkdev(clk[ssi2_ipg], NULL, "imx-ssi.1"); clk_register_clkdev(clk[ssi2_ipg], NULL, "imx-ssi.1");
......
...@@ -221,9 +221,9 @@ int __init mx27_clocks_init(unsigned long fref) ...@@ -221,9 +221,9 @@ int __init mx27_clocks_init(unsigned long fref)
clk_register_clkdev(clk[cspi1_ipg_gate], NULL, "imx27-cspi.0"); clk_register_clkdev(clk[cspi1_ipg_gate], NULL, "imx27-cspi.0");
clk_register_clkdev(clk[cspi2_ipg_gate], NULL, "imx27-cspi.1"); clk_register_clkdev(clk[cspi2_ipg_gate], NULL, "imx27-cspi.1");
clk_register_clkdev(clk[cspi3_ipg_gate], NULL, "imx27-cspi.2"); clk_register_clkdev(clk[cspi3_ipg_gate], NULL, "imx27-cspi.2");
clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0"); clk_register_clkdev(clk[per3_gate], "per", "imx21-fb.0");
clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx21-fb.0");
clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0"); clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx21-fb.0");
clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0"); clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0");
clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc");
clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc");
......
...@@ -108,6 +108,7 @@ struct platform_device *__init imx_add_imxdi_rtc( ...@@ -108,6 +108,7 @@ struct platform_device *__init imx_add_imxdi_rtc(
#include <linux/platform_data/video-imxfb.h> #include <linux/platform_data/video-imxfb.h>
struct imx_imx_fb_data { struct imx_imx_fb_data {
const char *devid;
resource_size_t iobase; resource_size_t iobase;
resource_size_t iosize; resource_size_t iosize;
resource_size_t irq; resource_size_t irq;
......
...@@ -10,8 +10,9 @@ ...@@ -10,8 +10,9 @@
#include <mach/hardware.h> #include <mach/hardware.h>
#include "devices-common.h" #include "devices-common.h"
#define imx_imx_fb_data_entry_single(soc, _size) \ #define imx_imx_fb_data_entry_single(soc, _devid, _size) \
{ \ { \
.devid = _devid, \
.iobase = soc ## _LCDC_BASE_ADDR, \ .iobase = soc ## _LCDC_BASE_ADDR, \
.iosize = _size, \ .iosize = _size, \
.irq = soc ## _INT_LCDC, \ .irq = soc ## _INT_LCDC, \
...@@ -19,22 +20,22 @@ ...@@ -19,22 +20,22 @@
#ifdef CONFIG_SOC_IMX1 #ifdef CONFIG_SOC_IMX1
const struct imx_imx_fb_data imx1_imx_fb_data __initconst = const struct imx_imx_fb_data imx1_imx_fb_data __initconst =
imx_imx_fb_data_entry_single(MX1, SZ_4K); imx_imx_fb_data_entry_single(MX1, "imx1-fb", SZ_4K);
#endif /* ifdef CONFIG_SOC_IMX1 */ #endif /* ifdef CONFIG_SOC_IMX1 */
#ifdef CONFIG_SOC_IMX21 #ifdef CONFIG_SOC_IMX21
const struct imx_imx_fb_data imx21_imx_fb_data __initconst = const struct imx_imx_fb_data imx21_imx_fb_data __initconst =
imx_imx_fb_data_entry_single(MX21, SZ_4K); imx_imx_fb_data_entry_single(MX21, "imx21-fb", SZ_4K);
#endif /* ifdef CONFIG_SOC_IMX21 */ #endif /* ifdef CONFIG_SOC_IMX21 */
#ifdef CONFIG_SOC_IMX25 #ifdef CONFIG_SOC_IMX25
const struct imx_imx_fb_data imx25_imx_fb_data __initconst = const struct imx_imx_fb_data imx25_imx_fb_data __initconst =
imx_imx_fb_data_entry_single(MX25, SZ_16K); imx_imx_fb_data_entry_single(MX25, "imx21-fb", SZ_16K);
#endif /* ifdef CONFIG_SOC_IMX25 */ #endif /* ifdef CONFIG_SOC_IMX25 */
#ifdef CONFIG_SOC_IMX27 #ifdef CONFIG_SOC_IMX27
const struct imx_imx_fb_data imx27_imx_fb_data __initconst = const struct imx_imx_fb_data imx27_imx_fb_data __initconst =
imx_imx_fb_data_entry_single(MX27, SZ_4K); imx_imx_fb_data_entry_single(MX27, "imx21-fb", SZ_4K);
#endif /* ifdef CONFIG_SOC_IMX27 */ #endif /* ifdef CONFIG_SOC_IMX27 */
struct platform_device *__init imx_add_imx_fb( struct platform_device *__init imx_add_imx_fb(
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
#include <linux/math64.h> #include <linux/math64.h>
#include <linux/platform_data/video-imxfb.h> #include <linux/platform_data/video-imxfb.h>
#include <mach/hardware.h>
/* /*
* Complain if VAR is out of range. * Complain if VAR is out of range.
...@@ -53,8 +52,8 @@ ...@@ -53,8 +52,8 @@
#define LCDC_SIZE 0x04 #define LCDC_SIZE 0x04
#define SIZE_XMAX(x) ((((x) >> 4) & 0x3f) << 20) #define SIZE_XMAX(x) ((((x) >> 4) & 0x3f) << 20)
#define YMAX_MASK (cpu_is_mx1() ? 0x1ff : 0x3ff) #define YMAX_MASK_IMX1 0x1ff
#define SIZE_YMAX(y) ((y) & YMAX_MASK) #define YMAX_MASK_IMX21 0x3ff
#define LCDC_VPW 0x08 #define LCDC_VPW 0x08
#define VPW_VPW(x) ((x) & 0x3ff) #define VPW_VPW(x) ((x) & 0x3ff)
...@@ -128,12 +127,18 @@ struct imxfb_rgb { ...@@ -128,12 +127,18 @@ struct imxfb_rgb {
struct fb_bitfield transp; struct fb_bitfield transp;
}; };
enum imxfb_type {
IMX1_FB,
IMX21_FB,
};
struct imxfb_info { struct imxfb_info {
struct platform_device *pdev; struct platform_device *pdev;
void __iomem *regs; void __iomem *regs;
struct clk *clk_ipg; struct clk *clk_ipg;
struct clk *clk_ahb; struct clk *clk_ahb;
struct clk *clk_per; struct clk *clk_per;
enum imxfb_type devtype;
/* /*
* These are the addresses we mapped * These are the addresses we mapped
...@@ -168,6 +173,24 @@ struct imxfb_info { ...@@ -168,6 +173,24 @@ struct imxfb_info {
void (*backlight_power)(int); void (*backlight_power)(int);
}; };
static struct platform_device_id imxfb_devtype[] = {
{
.name = "imx1-fb",
.driver_data = IMX1_FB,
}, {
.name = "imx21-fb",
.driver_data = IMX21_FB,
}, {
/* sentinel */
}
};
MODULE_DEVICE_TABLE(platform, imxfb_devtype);
static inline int is_imx1_fb(struct imxfb_info *fbi)
{
return fbi->devtype == IMX1_FB;
}
#define IMX_NAME "IMX" #define IMX_NAME "IMX"
/* /*
...@@ -366,7 +389,7 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) ...@@ -366,7 +389,7 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
break; break;
case 16: case 16:
default: default:
if (cpu_is_mx1()) if (is_imx1_fb(fbi))
pcr |= PCR_BPIX_12; pcr |= PCR_BPIX_12;
else else
pcr |= PCR_BPIX_16; pcr |= PCR_BPIX_16;
...@@ -596,6 +619,7 @@ static struct fb_ops imxfb_ops = { ...@@ -596,6 +619,7 @@ static struct fb_ops imxfb_ops = {
static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info) static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *info)
{ {
struct imxfb_info *fbi = info->par; struct imxfb_info *fbi = info->par;
u32 ymax_mask = is_imx1_fb(fbi) ? YMAX_MASK_IMX1 : YMAX_MASK_IMX21;
pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n", pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n",
var->xres, var->hsync_len, var->xres, var->hsync_len,
...@@ -617,7 +641,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf ...@@ -617,7 +641,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf
if (var->right_margin > 255) if (var->right_margin > 255)
printk(KERN_ERR "%s: invalid right_margin %d\n", printk(KERN_ERR "%s: invalid right_margin %d\n",
info->fix.id, var->right_margin); info->fix.id, var->right_margin);
if (var->yres < 1 || var->yres > YMAX_MASK) if (var->yres < 1 || var->yres > ymax_mask)
printk(KERN_ERR "%s: invalid yres %d\n", printk(KERN_ERR "%s: invalid yres %d\n",
info->fix.id, var->yres); info->fix.id, var->yres);
if (var->vsync_len > 100) if (var->vsync_len > 100)
...@@ -645,7 +669,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf ...@@ -645,7 +669,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf
VCR_V_WAIT_2(var->upper_margin), VCR_V_WAIT_2(var->upper_margin),
fbi->regs + LCDC_VCR); fbi->regs + LCDC_VCR);
writel(SIZE_XMAX(var->xres) | SIZE_YMAX(var->yres), writel(SIZE_XMAX(var->xres) | (var->yres & ymax_mask),
fbi->regs + LCDC_SIZE); fbi->regs + LCDC_SIZE);
writel(fbi->pcr, fbi->regs + LCDC_PCR); writel(fbi->pcr, fbi->regs + LCDC_PCR);
...@@ -765,6 +789,7 @@ static int __init imxfb_probe(struct platform_device *pdev) ...@@ -765,6 +789,7 @@ static int __init imxfb_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
fbi = info->par; fbi = info->par;
fbi->devtype = pdev->id_entry->driver_data;
if (!fb_mode) if (!fb_mode)
fb_mode = pdata->mode[0].mode.name; fb_mode = pdata->mode[0].mode.name;
...@@ -939,6 +964,7 @@ static struct platform_driver imxfb_driver = { ...@@ -939,6 +964,7 @@ static struct platform_driver imxfb_driver = {
.driver = { .driver = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
}, },
.id_table = imxfb_devtype,
}; };
static int imxfb_setup(void) static int imxfb_setup(void)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册