fbdev fixes and updates for kernel v5.20-rc1
The two major changes in this patchset corrects VGA modes, color handling and various other smaller fixes in the Atari framebuffer (by Geert Uytterhoeven), and devm_* conversion, platform data fixes and header cleanups in the imxfb driver (by Uwe Kleine-König). Other small patches clean up code in sa1100fb, cirrusfb and omapfb, fix a refcount leak in amba-clcd (by Liang He), and adds parameter checks to arkfb, i740fb, vt8623fb and s3fb (by Zheyu Ma). -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCYu7IyAAKCRD3ErUQojoP X2jtAP961tA3uP7AdRkQj5jXzChAsDajkrA9vBf3Ihn1M73SHwEA/A6JOgPQAlp6 NGIwUlHEUikgylU9da2C0jzesstmJwU= =+7rt -----END PGP SIGNATURE----- Merge tag 'for-5.20/fbdev-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev Pull fbdev updates from Helge Deller: "The two major changes in this patchset corrects VGA modes, color handling and various other smaller fixes in the Atari framebuffer (by Geert Uytterhoeven), and devm_* conversion, platform data fixes and header cleanups in the imxfb driver (by Uwe Kleine-König). Other small patches clean up code in sa1100fb, cirrusfb and omapfb, fix a refcount leak in amba-clcd (by Liang He), and adds parameter checks to arkfb, i740fb, vt8623fb and s3fb (by Zheyu Ma)" * tag 'for-5.20/fbdev-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev: (27 commits) video: fbdev: s3fb: Check the size of screen before memset_io() video: fbdev: arkfb: Check the size of screen before memset_io() video: fbdev: vt8623fb: Check the size of screen before memset_io() video: fbdev: i740fb: Check the argument of i740_calc_vclk() video: fbdev: arkfb: Fix a divide-by-zero bug in ark_set_pixclock() video: fbdev: imxfb: fix return value check in imxfb_probe() video: fbdev: sis: fix typos in SiS_GetModeID() video: fbdev: imxfb: Convert request_mem_region + ioremap to devm_ioremap_resource video: fbdev: imxfb: Fold <linux/platform_data/video-imxfb.h> into only user video: fbdev: imxfb: Drop unused symbols from header video: fbdev: imxfb: Drop platform data support video: fbdev: amba-clcd: Fix refcount leak bugs video: fbdev: omapfb: Unexport omap*_update_window_async() video: fbdev: atari: Remove backward bug-compatibility video: fbdev: atari: Remove unused definitions and variables video: fbdev: atari: Fix VGA modes video: fbdev: atari: Fix TT High video mode vertical refresh video: fbdev: atari: Remove unneeded casts to void * video: fbdev: atari: Remove unneeded casts from void * video: fbdev: atari: Fix ext_setcolreg() ...
This commit is contained in:
commit
b5a8466d37
@ -367,8 +367,8 @@ activated by a "external:" sub-option.
|
|||||||
4.1.2) inverse
|
4.1.2) inverse
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Invert the display. This affects both, text (consoles) and graphics
|
Invert the display. This affects only text consoles.
|
||||||
(X) display. Usually, the background is chosen to be black. With this
|
Usually, the background is chosen to be black. With this
|
||||||
option, you can make the background white.
|
option, you can make the background white.
|
||||||
|
|
||||||
4.1.3) font
|
4.1.3) font
|
||||||
|
@ -8139,7 +8139,6 @@ L: linux-fbdev@vger.kernel.org
|
|||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/video/fbdev/imxfb.c
|
F: drivers/video/fbdev/imxfb.c
|
||||||
F: include/linux/platform_data/video-imxfb.h
|
|
||||||
|
|
||||||
FREESCALE IMX DDR PMU DRIVER
|
FREESCALE IMX DDR PMU DRIVER
|
||||||
M: Frank Li <Frank.li@nxp.com>
|
M: Frank Li <Frank.li@nxp.com>
|
||||||
|
@ -84,9 +84,6 @@ static const struct fb_fix_screeninfo mc68x328fb_fix __initconst = {
|
|||||||
/*
|
/*
|
||||||
* Interface used by the world
|
* Interface used by the world
|
||||||
*/
|
*/
|
||||||
int mc68x328fb_init(void);
|
|
||||||
int mc68x328fb_setup(char *);
|
|
||||||
|
|
||||||
static int mc68x328fb_check_var(struct fb_var_screeninfo *var,
|
static int mc68x328fb_check_var(struct fb_var_screeninfo *var,
|
||||||
struct fb_info *info);
|
struct fb_info *info);
|
||||||
static int mc68x328fb_set_par(struct fb_info *info);
|
static int mc68x328fb_set_par(struct fb_info *info);
|
||||||
@ -403,7 +400,7 @@ static int mc68x328fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init mc68x328fb_setup(char *options)
|
static int __init mc68x328fb_setup(char *options)
|
||||||
{
|
{
|
||||||
if (!options || !*options)
|
if (!options || !*options)
|
||||||
return 1;
|
return 1;
|
||||||
@ -414,7 +411,7 @@ int __init mc68x328fb_setup(char *options)
|
|||||||
* Initialisation
|
* Initialisation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int __init mc68x328fb_init(void)
|
static int __init mc68x328fb_init(void)
|
||||||
{
|
{
|
||||||
#ifndef MODULE
|
#ifndef MODULE
|
||||||
char *option = NULL;
|
char *option = NULL;
|
||||||
|
@ -698,16 +698,18 @@ static int clcdfb_of_init_display(struct clcd_fb *fb)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
panel = of_graph_get_remote_port_parent(endpoint);
|
panel = of_graph_get_remote_port_parent(endpoint);
|
||||||
if (!panel)
|
if (!panel) {
|
||||||
return -ENODEV;
|
err = -ENODEV;
|
||||||
|
goto out_endpoint_put;
|
||||||
|
}
|
||||||
|
|
||||||
err = clcdfb_of_get_backlight(&fb->dev->dev, fb->panel);
|
err = clcdfb_of_get_backlight(&fb->dev->dev, fb->panel);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
goto out_panel_put;
|
||||||
|
|
||||||
err = clcdfb_of_get_mode(&fb->dev->dev, panel, fb->panel);
|
err = clcdfb_of_get_mode(&fb->dev->dev, panel, fb->panel);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
goto out_panel_put;
|
||||||
|
|
||||||
err = of_property_read_u32(fb->dev->dev.of_node, "max-memory-bandwidth",
|
err = of_property_read_u32(fb->dev->dev.of_node, "max-memory-bandwidth",
|
||||||
&max_bandwidth);
|
&max_bandwidth);
|
||||||
@ -736,11 +738,21 @@ static int clcdfb_of_init_display(struct clcd_fb *fb)
|
|||||||
|
|
||||||
if (of_property_read_u32_array(endpoint,
|
if (of_property_read_u32_array(endpoint,
|
||||||
"arm,pl11x,tft-r0g0b0-pads",
|
"arm,pl11x,tft-r0g0b0-pads",
|
||||||
tft_r0b0g0, ARRAY_SIZE(tft_r0b0g0)) != 0)
|
tft_r0b0g0, ARRAY_SIZE(tft_r0b0g0)) != 0) {
|
||||||
return -ENOENT;
|
err = -ENOENT;
|
||||||
|
goto out_panel_put;
|
||||||
|
}
|
||||||
|
|
||||||
|
of_node_put(panel);
|
||||||
|
of_node_put(endpoint);
|
||||||
|
|
||||||
return clcdfb_of_init_tft_panel(fb, tft_r0b0g0[0],
|
return clcdfb_of_init_tft_panel(fb, tft_r0b0g0[0],
|
||||||
tft_r0b0g0[1], tft_r0b0g0[2]);
|
tft_r0b0g0[1], tft_r0b0g0[2]);
|
||||||
|
out_panel_put:
|
||||||
|
of_node_put(panel);
|
||||||
|
out_endpoint_put:
|
||||||
|
of_node_put(endpoint);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int clcdfb_of_vram_setup(struct clcd_fb *fb)
|
static int clcdfb_of_vram_setup(struct clcd_fb *fb)
|
||||||
|
@ -2540,27 +2540,16 @@ static int amifb_blank(int blank, struct fb_info *info)
|
|||||||
static int amifb_pan_display(struct fb_var_screeninfo *var,
|
static int amifb_pan_display(struct fb_var_screeninfo *var,
|
||||||
struct fb_info *info)
|
struct fb_info *info)
|
||||||
{
|
{
|
||||||
if (var->vmode & FB_VMODE_YWRAP) {
|
if (!(var->vmode & FB_VMODE_YWRAP)) {
|
||||||
if (var->yoffset < 0 ||
|
|
||||||
var->yoffset >= info->var.yres_virtual || var->xoffset)
|
|
||||||
return -EINVAL;
|
|
||||||
} else {
|
|
||||||
/*
|
/*
|
||||||
* TODO: There will be problems when xpan!=1, so some columns
|
* TODO: There will be problems when xpan!=1, so some columns
|
||||||
* on the right side will never be seen
|
* on the right side will never be seen
|
||||||
*/
|
*/
|
||||||
if (var->xoffset + info->var.xres >
|
if (var->xoffset + info->var.xres >
|
||||||
upx(16 << maxfmode, info->var.xres_virtual) ||
|
upx(16 << maxfmode, info->var.xres_virtual))
|
||||||
var->yoffset + info->var.yres > info->var.yres_virtual)
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
ami_pan_var(var, info);
|
ami_pan_var(var, info);
|
||||||
info->var.xoffset = var->xoffset;
|
|
||||||
info->var.yoffset = var->yoffset;
|
|
||||||
if (var->vmode & FB_VMODE_YWRAP)
|
|
||||||
info->var.vmode |= FB_VMODE_YWRAP;
|
|
||||||
else
|
|
||||||
info->var.vmode &= ~FB_VMODE_YWRAP;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -781,7 +781,12 @@ static int arkfb_set_par(struct fb_info *info)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ark_set_pixclock(info, (hdiv * info->var.pixclock) / hmul);
|
value = (hdiv * info->var.pixclock) / hmul;
|
||||||
|
if (!value) {
|
||||||
|
fb_dbg(info, "invalid pixclock\n");
|
||||||
|
value = 1;
|
||||||
|
}
|
||||||
|
ark_set_pixclock(info, value);
|
||||||
svga_set_timings(par->state.vgabase, &ark_timing_regs, &(info->var), hmul, hdiv,
|
svga_set_timings(par->state.vgabase, &ark_timing_regs, &(info->var), hmul, hdiv,
|
||||||
(info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1,
|
(info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1,
|
||||||
(info->var.vmode & FB_VMODE_INTERLACED) ? 2 : 1,
|
(info->var.vmode & FB_VMODE_INTERLACED) ? 2 : 1,
|
||||||
@ -792,6 +797,8 @@ static int arkfb_set_par(struct fb_info *info)
|
|||||||
value = ((value * hmul / hdiv) / 8) - 5;
|
value = ((value * hmul / hdiv) / 8) - 5;
|
||||||
vga_wcrt(par->state.vgabase, 0x42, (value + 1) / 2);
|
vga_wcrt(par->state.vgabase, 0x42, (value + 1) / 2);
|
||||||
|
|
||||||
|
if (screen_size > info->screen_size)
|
||||||
|
screen_size = info->screen_size;
|
||||||
memset_io(info->screen_base, 0x00, screen_size);
|
memset_io(info->screen_base, 0x00, screen_size);
|
||||||
/* Device and screen back on */
|
/* Device and screen back on */
|
||||||
svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80);
|
svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80);
|
||||||
|
@ -236,8 +236,6 @@ static int *MV300_reg = MV300_reg_8bit;
|
|||||||
#endif /* ATAFB_EXT */
|
#endif /* ATAFB_EXT */
|
||||||
|
|
||||||
|
|
||||||
static int inverse;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* struct fb_ops {
|
* struct fb_ops {
|
||||||
* * open/release and usage marking
|
* * open/release and usage marking
|
||||||
@ -467,27 +465,27 @@ static struct fb_videomode atafb_modedb[] __initdata = {
|
|||||||
{
|
{
|
||||||
/* 320x200, 15 kHz, 60 Hz (ST low) */
|
/* 320x200, 15 kHz, 60 Hz (ST low) */
|
||||||
"st-low", 60, 320, 200, 32000, 32, 16, 31, 14, 96, 4,
|
"st-low", 60, 320, 200, 32000, 32, 16, 31, 14, 96, 4,
|
||||||
0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
|
0, FB_VMODE_NONINTERLACED
|
||||||
}, {
|
}, {
|
||||||
/* 640x200, 15 kHz, 60 Hz (ST medium) */
|
/* 640x200, 15 kHz, 60 Hz (ST medium) */
|
||||||
"st-mid", 60, 640, 200, 32000, 32, 16, 31, 14, 96, 4,
|
"st-mid", 60, 640, 200, 32000, 32, 16, 31, 14, 96, 4,
|
||||||
0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
|
0, FB_VMODE_NONINTERLACED
|
||||||
}, {
|
}, {
|
||||||
/* 640x400, 30.25 kHz, 63.5 Hz (ST high) */
|
/* 640x400, 30.25 kHz, 63.5 Hz (ST high) */
|
||||||
"st-high", 63, 640, 400, 32000, 128, 0, 40, 14, 128, 4,
|
"st-high", 63, 640, 400, 32000, 128, 0, 40, 14, 128, 4,
|
||||||
0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
|
0, FB_VMODE_NONINTERLACED
|
||||||
}, {
|
}, {
|
||||||
/* 320x480, 15 kHz, 60 Hz (TT low) */
|
/* 320x480, 15 kHz, 60 Hz (TT low) */
|
||||||
"tt-low", 60, 320, 480, 31041, 120, 100, 8, 16, 140, 30,
|
"tt-low", 60, 320, 480, 31041, 120, 100, 8, 16, 140, 30,
|
||||||
0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
|
0, FB_VMODE_NONINTERLACED
|
||||||
}, {
|
}, {
|
||||||
/* 640x480, 29 kHz, 57 Hz (TT medium) */
|
/* 640x480, 29 kHz, 57 Hz (TT medium) */
|
||||||
"tt-mid", 60, 640, 480, 31041, 120, 100, 8, 16, 140, 30,
|
"tt-mid", 60, 640, 480, 31041, 120, 100, 8, 16, 140, 30,
|
||||||
0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
|
0, FB_VMODE_NONINTERLACED
|
||||||
}, {
|
}, {
|
||||||
/* 1280x960, 72 kHz, 72 Hz (TT high) */
|
/* 1280x960, 72 kHz, 72 Hz (TT high) */
|
||||||
"tt-high", 57, 1280, 960, 7760, 260, 60, 36, 4, 192, 4,
|
"tt-high", 72, 1280, 960, 7760, 260, 60, 36, 4, 192, 4,
|
||||||
0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
|
0, FB_VMODE_NONINTERLACED
|
||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -496,12 +494,12 @@ static struct fb_videomode atafb_modedb[] __initdata = {
|
|||||||
|
|
||||||
{
|
{
|
||||||
/* 640x480, 31 kHz, 60 Hz (VGA) */
|
/* 640x480, 31 kHz, 60 Hz (VGA) */
|
||||||
"vga", 63.5, 640, 480, 32000, 18, 42, 31, 11, 96, 3,
|
"vga", 60, 640, 480, 39721, 42, 18, 31, 11, 100, 3,
|
||||||
0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
|
0, FB_VMODE_NONINTERLACED
|
||||||
}, {
|
}, {
|
||||||
/* 640x400, 31 kHz, 70 Hz (VGA) */
|
/* 640x400, 31 kHz, 70 Hz (VGA) */
|
||||||
"vga70", 70, 640, 400, 32000, 18, 42, 31, 11, 96, 3,
|
"vga70", 70, 640, 400, 39721, 42, 18, 31, 11, 100, 3,
|
||||||
FB_SYNC_VERT_HIGH_ACT | FB_SYNC_COMP_HIGH_ACT, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
|
FB_SYNC_VERT_HIGH_ACT | FB_SYNC_COMP_HIGH_ACT, FB_VMODE_NONINTERLACED
|
||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -511,7 +509,7 @@ static struct fb_videomode atafb_modedb[] __initdata = {
|
|||||||
{
|
{
|
||||||
/* 896x608, 31 kHz, 60 Hz (Falcon High) */
|
/* 896x608, 31 kHz, 60 Hz (Falcon High) */
|
||||||
"falh", 60, 896, 608, 32000, 18, 42, 31, 1, 96,3,
|
"falh", 60, 896, 608, 32000, 18, 42, 31, 1, 96,3,
|
||||||
0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
|
0, FB_VMODE_NONINTERLACED
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1010,10 +1008,6 @@ static int falcon_decode_var(struct fb_var_screeninfo *var,
|
|||||||
else if (yres_virtual < yres)
|
else if (yres_virtual < yres)
|
||||||
yres_virtual = yres;
|
yres_virtual = yres;
|
||||||
|
|
||||||
/* backward bug-compatibility */
|
|
||||||
if (var->pixclock > 1)
|
|
||||||
var->pixclock -= 1;
|
|
||||||
|
|
||||||
par->hw.falcon.line_width = bpp * xres / 16;
|
par->hw.falcon.line_width = bpp * xres / 16;
|
||||||
par->hw.falcon.line_offset = bpp * (xres_virtual - xres) / 16;
|
par->hw.falcon.line_offset = bpp * (xres_virtual - xres) / 16;
|
||||||
|
|
||||||
@ -1072,8 +1066,6 @@ static int falcon_decode_var(struct fb_var_screeninfo *var,
|
|||||||
xstretch = 2; /* Double pixel width only for hicolor */
|
xstretch = 2; /* Double pixel width only for hicolor */
|
||||||
/* Default values are used for vert./hor. timing if no pixelclock given. */
|
/* Default values are used for vert./hor. timing if no pixelclock given. */
|
||||||
if (var->pixclock == 0) {
|
if (var->pixclock == 0) {
|
||||||
int linesize;
|
|
||||||
|
|
||||||
/* Choose master pixelclock depending on hor. timing */
|
/* Choose master pixelclock depending on hor. timing */
|
||||||
plen = 1 * xstretch;
|
plen = 1 * xstretch;
|
||||||
if ((plen * xres + f25.right + f25.hsync + f25.left) *
|
if ((plen * xres + f25.right + f25.hsync + f25.left) *
|
||||||
@ -1092,7 +1084,6 @@ static int falcon_decode_var(struct fb_var_screeninfo *var,
|
|||||||
left_margin = pclock->left / plen;
|
left_margin = pclock->left / plen;
|
||||||
right_margin = pclock->right / plen;
|
right_margin = pclock->right / plen;
|
||||||
hsync_len = pclock->hsync / plen;
|
hsync_len = pclock->hsync / plen;
|
||||||
linesize = left_margin + xres + right_margin + hsync_len;
|
|
||||||
upper_margin = 31;
|
upper_margin = 31;
|
||||||
lower_margin = 11;
|
lower_margin = 11;
|
||||||
vsync_len = 3;
|
vsync_len = 3;
|
||||||
@ -1641,7 +1632,7 @@ static irqreturn_t falcon_vbl_switcher(int irq, void *dummy)
|
|||||||
static int falcon_pan_display(struct fb_var_screeninfo *var,
|
static int falcon_pan_display(struct fb_var_screeninfo *var,
|
||||||
struct fb_info *info)
|
struct fb_info *info)
|
||||||
{
|
{
|
||||||
struct atafb_par *par = (struct atafb_par *)info->par;
|
struct atafb_par *par = info->par;
|
||||||
|
|
||||||
int xoffset;
|
int xoffset;
|
||||||
int bpp = info->var.bits_per_pixel;
|
int bpp = info->var.bits_per_pixel;
|
||||||
@ -2208,6 +2199,10 @@ static int ext_setcolreg(unsigned int regno, unsigned int red,
|
|||||||
if (regno > 255)
|
if (regno > 255)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
red >>= 8;
|
||||||
|
green >>= 8;
|
||||||
|
blue >>= 8;
|
||||||
|
|
||||||
switch (external_card_type) {
|
switch (external_card_type) {
|
||||||
case IS_VGA:
|
case IS_VGA:
|
||||||
OUTB(0x3c8, regno);
|
OUTB(0x3c8, regno);
|
||||||
@ -2261,7 +2256,7 @@ static void set_screen_base(void *s_base)
|
|||||||
|
|
||||||
static int pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
|
static int pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||||
{
|
{
|
||||||
struct atafb_par *par = (struct atafb_par *)info->par;
|
struct atafb_par *par = info->par;
|
||||||
|
|
||||||
if (!fbhw->set_screen_base ||
|
if (!fbhw->set_screen_base ||
|
||||||
(!ATARIHW_PRESENT(EXTD_SHIFTER) && var->xoffset))
|
(!ATARIHW_PRESENT(EXTD_SHIFTER) && var->xoffset))
|
||||||
@ -2407,55 +2402,19 @@ static void atafb_set_disp(struct fb_info *info)
|
|||||||
static int
|
static int
|
||||||
atafb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
|
atafb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||||
{
|
{
|
||||||
int xoffset = var->xoffset;
|
if (!fbhw->pan_display)
|
||||||
int yoffset = var->yoffset;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (var->vmode & FB_VMODE_YWRAP) {
|
|
||||||
if (yoffset < 0 || yoffset >= info->var.yres_virtual || xoffset)
|
|
||||||
return -EINVAL;
|
|
||||||
} else {
|
|
||||||
if (xoffset + info->var.xres > info->var.xres_virtual ||
|
|
||||||
yoffset + info->var.yres > info->var.yres_virtual)
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fbhw->pan_display) {
|
|
||||||
err = fbhw->pan_display(var, info);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
} else
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
info->var.xoffset = xoffset;
|
return fbhw->pan_display(var, info);
|
||||||
info->var.yoffset = yoffset;
|
|
||||||
|
|
||||||
if (var->vmode & FB_VMODE_YWRAP)
|
|
||||||
info->var.vmode |= FB_VMODE_YWRAP;
|
|
||||||
else
|
|
||||||
info->var.vmode &= ~FB_VMODE_YWRAP;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* generic drawing routines; imageblit needs updating for image depth > 1
|
* generic drawing routines; imageblit needs updating for image depth > 1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if BITS_PER_LONG == 32
|
|
||||||
#define BYTES_PER_LONG 4
|
|
||||||
#define SHIFT_PER_LONG 5
|
|
||||||
#elif BITS_PER_LONG == 64
|
|
||||||
#define BYTES_PER_LONG 8
|
|
||||||
#define SHIFT_PER_LONG 6
|
|
||||||
#else
|
|
||||||
#define Please update me
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void atafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
|
static void atafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
|
||||||
{
|
{
|
||||||
struct atafb_par *par = (struct atafb_par *)info->par;
|
struct atafb_par *par = info->par;
|
||||||
int x2, y2;
|
int x2, y2;
|
||||||
u32 width, height;
|
u32 width, height;
|
||||||
|
|
||||||
@ -2498,7 +2457,7 @@ static void atafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
|
|||||||
|
|
||||||
static void atafb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
|
static void atafb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
|
||||||
{
|
{
|
||||||
struct atafb_par *par = (struct atafb_par *)info->par;
|
struct atafb_par *par = info->par;
|
||||||
int x2, y2;
|
int x2, y2;
|
||||||
u32 dx, dy, sx, sy, width, height;
|
u32 dx, dy, sx, sy, width, height;
|
||||||
int rev_copy = 0;
|
int rev_copy = 0;
|
||||||
@ -2552,10 +2511,8 @@ static void atafb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
|
|||||||
|
|
||||||
static void atafb_imageblit(struct fb_info *info, const struct fb_image *image)
|
static void atafb_imageblit(struct fb_info *info, const struct fb_image *image)
|
||||||
{
|
{
|
||||||
struct atafb_par *par = (struct atafb_par *)info->par;
|
struct atafb_par *par = info->par;
|
||||||
int x2, y2;
|
int x2, y2;
|
||||||
unsigned long *dst;
|
|
||||||
int dst_idx;
|
|
||||||
const char *src;
|
const char *src;
|
||||||
u32 dx, dy, width, height, pitch;
|
u32 dx, dy, width, height, pitch;
|
||||||
|
|
||||||
@ -2582,10 +2539,6 @@ static void atafb_imageblit(struct fb_info *info, const struct fb_image *image)
|
|||||||
|
|
||||||
if (image->depth == 1) {
|
if (image->depth == 1) {
|
||||||
// used for font data
|
// used for font data
|
||||||
dst = (unsigned long *)
|
|
||||||
((unsigned long)info->screen_base & ~(BYTES_PER_LONG - 1));
|
|
||||||
dst_idx = ((unsigned long)info->screen_base & (BYTES_PER_LONG - 1)) * 8;
|
|
||||||
dst_idx += dy * par->next_line * 8 + dx;
|
|
||||||
src = image->data;
|
src = image->data;
|
||||||
pitch = (image->width + 7) / 8;
|
pitch = (image->width + 7) / 8;
|
||||||
while (height--) {
|
while (height--) {
|
||||||
@ -2622,14 +2575,14 @@ atafb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
|
|||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
#ifdef FBCMD_GET_CURRENTPAR
|
#ifdef FBCMD_GET_CURRENTPAR
|
||||||
case FBCMD_GET_CURRENTPAR:
|
case FBCMD_GET_CURRENTPAR:
|
||||||
if (copy_to_user((void *)arg, (void *)¤t_par,
|
if (copy_to_user((void *)arg, ¤t_par,
|
||||||
sizeof(struct atafb_par)))
|
sizeof(struct atafb_par)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
#ifdef FBCMD_SET_CURRENTPAR
|
#ifdef FBCMD_SET_CURRENTPAR
|
||||||
case FBCMD_SET_CURRENTPAR:
|
case FBCMD_SET_CURRENTPAR:
|
||||||
if (copy_from_user((void *)¤t_par, (void *)arg,
|
if (copy_from_user(¤t_par, (void *)arg,
|
||||||
sizeof(struct atafb_par)))
|
sizeof(struct atafb_par)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
ata_set_par(¤t_par);
|
ata_set_par(¤t_par);
|
||||||
@ -2695,7 +2648,7 @@ static int atafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
|||||||
* hw par just decoded */
|
* hw par just decoded */
|
||||||
static int atafb_set_par(struct fb_info *info)
|
static int atafb_set_par(struct fb_info *info)
|
||||||
{
|
{
|
||||||
struct atafb_par *par = (struct atafb_par *)info->par;
|
struct atafb_par *par = info->par;
|
||||||
|
|
||||||
/* Decode wanted screen parameters */
|
/* Decode wanted screen parameters */
|
||||||
fbhw->decode_var(&info->var, par);
|
fbhw->decode_var(&info->var, par);
|
||||||
@ -2981,7 +2934,7 @@ static void __init atafb_setup_user(char *spec)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init atafb_setup(char *options)
|
static int __init atafb_setup(char *options)
|
||||||
{
|
{
|
||||||
char *this_opt;
|
char *this_opt;
|
||||||
int temp;
|
int temp;
|
||||||
@ -2996,7 +2949,7 @@ int __init atafb_setup(char *options)
|
|||||||
default_par = temp;
|
default_par = temp;
|
||||||
mode_option = this_opt;
|
mode_option = this_opt;
|
||||||
} else if (!strcmp(this_opt, "inverse"))
|
} else if (!strcmp(this_opt, "inverse"))
|
||||||
inverse = 1;
|
fb_invert_cmaps();
|
||||||
else if (!strncmp(this_opt, "hwscroll_", 9)) {
|
else if (!strncmp(this_opt, "hwscroll_", 9)) {
|
||||||
hwscroll = simple_strtoul(this_opt + 9, NULL, 10);
|
hwscroll = simple_strtoul(this_opt + 9, NULL, 10);
|
||||||
if (hwscroll < 0)
|
if (hwscroll < 0)
|
||||||
|
@ -2301,7 +2301,7 @@ err_release_fb:
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cirrusfb_zorro_unregister(struct zorro_dev *z)
|
static void cirrusfb_zorro_unregister(struct zorro_dev *z)
|
||||||
{
|
{
|
||||||
struct fb_info *info = zorro_get_drvdata(z);
|
struct fb_info *info = zorro_get_drvdata(z);
|
||||||
|
|
||||||
|
@ -280,7 +280,7 @@ static struct platform_device dnfb_device = {
|
|||||||
.name = "dnfb",
|
.name = "dnfb",
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init dnfb_init(void)
|
static int __init dnfb_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -293,7 +293,7 @@ static int fm2fb_probe(struct zorro_dev *z, const struct zorro_device_id *id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init fm2fb_setup(char *options)
|
static int __init fm2fb_setup(char *options)
|
||||||
{
|
{
|
||||||
char *this_opt;
|
char *this_opt;
|
||||||
|
|
||||||
@ -309,7 +309,7 @@ int __init fm2fb_setup(char *options)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init fm2fb_init(void)
|
static int __init fm2fb_init(void)
|
||||||
{
|
{
|
||||||
char *option = NULL;
|
char *option = NULL;
|
||||||
|
|
||||||
|
@ -375,7 +375,7 @@ static struct dio_driver hpfb_driver = {
|
|||||||
.remove = hpfb_remove_one,
|
.remove = hpfb_remove_one,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init hpfb_init(void)
|
static int __init hpfb_init(void)
|
||||||
{
|
{
|
||||||
unsigned int sid;
|
unsigned int sid;
|
||||||
unsigned char i;
|
unsigned char i;
|
||||||
@ -415,7 +415,7 @@ int __init hpfb_init(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __exit hpfb_cleanup_module(void)
|
static void __exit hpfb_cleanup_module(void)
|
||||||
{
|
{
|
||||||
dio_unregister_driver(&hpfb_driver);
|
dio_unregister_driver(&hpfb_driver);
|
||||||
}
|
}
|
||||||
|
@ -400,7 +400,7 @@ static int i740fb_decode_var(const struct fb_var_screeninfo *var,
|
|||||||
u32 xres, right, hslen, left, xtotal;
|
u32 xres, right, hslen, left, xtotal;
|
||||||
u32 yres, lower, vslen, upper, ytotal;
|
u32 yres, lower, vslen, upper, ytotal;
|
||||||
u32 vxres, xoffset, vyres, yoffset;
|
u32 vxres, xoffset, vyres, yoffset;
|
||||||
u32 bpp, base, dacspeed24, mem;
|
u32 bpp, base, dacspeed24, mem, freq;
|
||||||
u8 r7;
|
u8 r7;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -643,7 +643,12 @@ static int i740fb_decode_var(const struct fb_var_screeninfo *var,
|
|||||||
par->atc[VGA_ATC_OVERSCAN] = 0;
|
par->atc[VGA_ATC_OVERSCAN] = 0;
|
||||||
|
|
||||||
/* Calculate VCLK that most closely matches the requested dot clock */
|
/* Calculate VCLK that most closely matches the requested dot clock */
|
||||||
i740_calc_vclk((((u32)1e9) / var->pixclock) * (u32)(1e3), par);
|
freq = (((u32)1e9) / var->pixclock) * (u32)(1e3);
|
||||||
|
if (freq < I740_RFREQ_FIX) {
|
||||||
|
fb_dbg(info, "invalid pixclock\n");
|
||||||
|
freq = I740_RFREQ_FIX;
|
||||||
|
}
|
||||||
|
i740_calc_vclk(freq, par);
|
||||||
|
|
||||||
/* Since we program the clocks ourselves, always use VCLK2. */
|
/* Since we program the clocks ourselves, always use VCLK2. */
|
||||||
par->misc |= 0x0C;
|
par->misc |= 0x0C;
|
||||||
|
@ -41,7 +41,18 @@
|
|||||||
#include <video/of_videomode.h>
|
#include <video/of_videomode.h>
|
||||||
#include <video/videomode.h>
|
#include <video/videomode.h>
|
||||||
|
|
||||||
#include <linux/platform_data/video-imxfb.h>
|
#define PCR_TFT (1 << 31)
|
||||||
|
#define PCR_BPIX_8 (3 << 25)
|
||||||
|
#define PCR_BPIX_12 (4 << 25)
|
||||||
|
#define PCR_BPIX_16 (5 << 25)
|
||||||
|
#define PCR_BPIX_18 (6 << 25)
|
||||||
|
|
||||||
|
struct imx_fb_videomode {
|
||||||
|
struct fb_videomode mode;
|
||||||
|
u32 pcr;
|
||||||
|
bool aus_mode;
|
||||||
|
unsigned char bpp;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Complain if VAR is out of range.
|
* Complain if VAR is out of range.
|
||||||
@ -656,7 +667,6 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf
|
|||||||
|
|
||||||
static int imxfb_init_fbinfo(struct platform_device *pdev)
|
static int imxfb_init_fbinfo(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct imx_fb_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
|
||||||
struct fb_info *info = platform_get_drvdata(pdev);
|
struct fb_info *info = platform_get_drvdata(pdev);
|
||||||
struct imxfb_info *fbi = info->par;
|
struct imxfb_info *fbi = info->par;
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
@ -690,25 +700,20 @@ static int imxfb_init_fbinfo(struct platform_device *pdev)
|
|||||||
info->fbops = &imxfb_ops;
|
info->fbops = &imxfb_ops;
|
||||||
info->flags = FBINFO_FLAG_DEFAULT |
|
info->flags = FBINFO_FLAG_DEFAULT |
|
||||||
FBINFO_READS_FAST;
|
FBINFO_READS_FAST;
|
||||||
if (pdata) {
|
|
||||||
fbi->lscr1 = pdata->lscr1;
|
|
||||||
fbi->dmacr = pdata->dmacr;
|
|
||||||
fbi->pwmr = pdata->pwmr;
|
|
||||||
} else {
|
|
||||||
np = pdev->dev.of_node;
|
|
||||||
info->var.grayscale = of_property_read_bool(np,
|
|
||||||
"cmap-greyscale");
|
|
||||||
fbi->cmap_inverse = of_property_read_bool(np, "cmap-inverse");
|
|
||||||
fbi->cmap_static = of_property_read_bool(np, "cmap-static");
|
|
||||||
|
|
||||||
fbi->lscr1 = IMXFB_LSCR1_DEFAULT;
|
np = pdev->dev.of_node;
|
||||||
|
info->var.grayscale = of_property_read_bool(np,
|
||||||
|
"cmap-greyscale");
|
||||||
|
fbi->cmap_inverse = of_property_read_bool(np, "cmap-inverse");
|
||||||
|
fbi->cmap_static = of_property_read_bool(np, "cmap-static");
|
||||||
|
|
||||||
of_property_read_u32(np, "fsl,lpccr", &fbi->pwmr);
|
fbi->lscr1 = IMXFB_LSCR1_DEFAULT;
|
||||||
|
|
||||||
of_property_read_u32(np, "fsl,lscr1", &fbi->lscr1);
|
of_property_read_u32(np, "fsl,lpccr", &fbi->pwmr);
|
||||||
|
|
||||||
of_property_read_u32(np, "fsl,dmacr", &fbi->dmacr);
|
of_property_read_u32(np, "fsl,lscr1", &fbi->lscr1);
|
||||||
}
|
|
||||||
|
of_property_read_u32(np, "fsl,dmacr", &fbi->dmacr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -863,10 +868,10 @@ static int imxfb_probe(struct platform_device *pdev)
|
|||||||
struct imxfb_info *fbi;
|
struct imxfb_info *fbi;
|
||||||
struct lcd_device *lcd;
|
struct lcd_device *lcd;
|
||||||
struct fb_info *info;
|
struct fb_info *info;
|
||||||
struct imx_fb_platform_data *pdata;
|
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
struct imx_fb_videomode *m;
|
struct imx_fb_videomode *m;
|
||||||
const struct of_device_id *of_id;
|
const struct of_device_id *of_id;
|
||||||
|
struct device_node *display_np;
|
||||||
int ret, i;
|
int ret, i;
|
||||||
int bytes_per_pixel;
|
int bytes_per_pixel;
|
||||||
|
|
||||||
@ -884,8 +889,6 @@ static int imxfb_probe(struct platform_device *pdev)
|
|||||||
if (!res)
|
if (!res)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
pdata = dev_get_platdata(&pdev->dev);
|
|
||||||
|
|
||||||
info = framebuffer_alloc(sizeof(struct imxfb_info), &pdev->dev);
|
info = framebuffer_alloc(sizeof(struct imxfb_info), &pdev->dev);
|
||||||
if (!info)
|
if (!info)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -898,43 +901,34 @@ static int imxfb_probe(struct platform_device *pdev)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto failed_init;
|
goto failed_init;
|
||||||
|
|
||||||
if (pdata) {
|
fb_mode = NULL;
|
||||||
if (!fb_mode)
|
|
||||||
fb_mode = pdata->mode[0].mode.name;
|
|
||||||
|
|
||||||
fbi->mode = pdata->mode;
|
display_np = of_parse_phandle(pdev->dev.of_node, "display", 0);
|
||||||
fbi->num_modes = pdata->num_modes;
|
if (!display_np) {
|
||||||
} else {
|
dev_err(&pdev->dev, "No display defined in devicetree\n");
|
||||||
struct device_node *display_np;
|
ret = -EINVAL;
|
||||||
fb_mode = NULL;
|
goto failed_of_parse;
|
||||||
|
|
||||||
display_np = of_parse_phandle(pdev->dev.of_node, "display", 0);
|
|
||||||
if (!display_np) {
|
|
||||||
dev_err(&pdev->dev, "No display defined in devicetree\n");
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto failed_of_parse;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* imxfb does not support more modes, we choose only the native
|
|
||||||
* mode.
|
|
||||||
*/
|
|
||||||
fbi->num_modes = 1;
|
|
||||||
|
|
||||||
fbi->mode = devm_kzalloc(&pdev->dev,
|
|
||||||
sizeof(struct imx_fb_videomode), GFP_KERNEL);
|
|
||||||
if (!fbi->mode) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
of_node_put(display_np);
|
|
||||||
goto failed_of_parse;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = imxfb_of_read_mode(&pdev->dev, display_np, fbi->mode);
|
|
||||||
of_node_put(display_np);
|
|
||||||
if (ret)
|
|
||||||
goto failed_of_parse;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* imxfb does not support more modes, we choose only the native
|
||||||
|
* mode.
|
||||||
|
*/
|
||||||
|
fbi->num_modes = 1;
|
||||||
|
|
||||||
|
fbi->mode = devm_kzalloc(&pdev->dev,
|
||||||
|
sizeof(struct imx_fb_videomode), GFP_KERNEL);
|
||||||
|
if (!fbi->mode) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
of_node_put(display_np);
|
||||||
|
goto failed_of_parse;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = imxfb_of_read_mode(&pdev->dev, display_np, fbi->mode);
|
||||||
|
of_node_put(display_np);
|
||||||
|
if (ret)
|
||||||
|
goto failed_of_parse;
|
||||||
|
|
||||||
/* Calculate maximum bytes used per pixel. In most cases this should
|
/* Calculate maximum bytes used per pixel. In most cases this should
|
||||||
* be the same as m->bpp/8 */
|
* be the same as m->bpp/8 */
|
||||||
m = &fbi->mode[0];
|
m = &fbi->mode[0];
|
||||||
@ -943,13 +937,6 @@ static int imxfb_probe(struct platform_device *pdev)
|
|||||||
info->fix.smem_len = max_t(size_t, info->fix.smem_len,
|
info->fix.smem_len = max_t(size_t, info->fix.smem_len,
|
||||||
m->mode.xres * m->mode.yres * bytes_per_pixel);
|
m->mode.xres * m->mode.yres * bytes_per_pixel);
|
||||||
|
|
||||||
res = request_mem_region(res->start, resource_size(res),
|
|
||||||
DRIVER_NAME);
|
|
||||||
if (!res) {
|
|
||||||
ret = -EBUSY;
|
|
||||||
goto failed_req;
|
|
||||||
}
|
|
||||||
|
|
||||||
fbi->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
|
fbi->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
|
||||||
if (IS_ERR(fbi->clk_ipg)) {
|
if (IS_ERR(fbi->clk_ipg)) {
|
||||||
ret = PTR_ERR(fbi->clk_ipg);
|
ret = PTR_ERR(fbi->clk_ipg);
|
||||||
@ -983,10 +970,10 @@ static int imxfb_probe(struct platform_device *pdev)
|
|||||||
goto failed_getclock;
|
goto failed_getclock;
|
||||||
}
|
}
|
||||||
|
|
||||||
fbi->regs = ioremap(res->start, resource_size(res));
|
fbi->regs = devm_ioremap_resource(&pdev->dev, res);
|
||||||
if (fbi->regs == NULL) {
|
if (IS_ERR(fbi->regs)) {
|
||||||
dev_err(&pdev->dev, "Cannot map frame buffer registers\n");
|
dev_err(&pdev->dev, "Cannot map frame buffer registers\n");
|
||||||
ret = -ENOMEM;
|
ret = PTR_ERR(fbi->regs);
|
||||||
goto failed_ioremap;
|
goto failed_ioremap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1001,13 +988,6 @@ static int imxfb_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
info->fix.smem_start = fbi->map_dma;
|
info->fix.smem_start = fbi->map_dma;
|
||||||
|
|
||||||
if (pdata && pdata->init) {
|
|
||||||
ret = pdata->init(fbi->pdev);
|
|
||||||
if (ret)
|
|
||||||
goto failed_platform_init;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
INIT_LIST_HEAD(&info->modelist);
|
INIT_LIST_HEAD(&info->modelist);
|
||||||
for (i = 0; i < fbi->num_modes; i++)
|
for (i = 0; i < fbi->num_modes; i++)
|
||||||
fb_add_videomode(&fbi->mode[i].mode, &info->modelist);
|
fb_add_videomode(&fbi->mode[i].mode, &info->modelist);
|
||||||
@ -1059,17 +1039,12 @@ failed_lcd:
|
|||||||
failed_register:
|
failed_register:
|
||||||
fb_dealloc_cmap(&info->cmap);
|
fb_dealloc_cmap(&info->cmap);
|
||||||
failed_cmap:
|
failed_cmap:
|
||||||
if (pdata && pdata->exit)
|
|
||||||
pdata->exit(fbi->pdev);
|
|
||||||
failed_platform_init:
|
|
||||||
dma_free_wc(&pdev->dev, fbi->map_size, info->screen_buffer,
|
dma_free_wc(&pdev->dev, fbi->map_size, info->screen_buffer,
|
||||||
fbi->map_dma);
|
fbi->map_dma);
|
||||||
failed_map:
|
failed_map:
|
||||||
iounmap(fbi->regs);
|
|
||||||
failed_ioremap:
|
failed_ioremap:
|
||||||
failed_getclock:
|
failed_getclock:
|
||||||
release_mem_region(res->start, resource_size(res));
|
release_mem_region(res->start, resource_size(res));
|
||||||
failed_req:
|
|
||||||
failed_of_parse:
|
failed_of_parse:
|
||||||
kfree(info->pseudo_palette);
|
kfree(info->pseudo_palette);
|
||||||
failed_init:
|
failed_init:
|
||||||
@ -1079,26 +1054,15 @@ failed_init:
|
|||||||
|
|
||||||
static int imxfb_remove(struct platform_device *pdev)
|
static int imxfb_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct imx_fb_platform_data *pdata;
|
|
||||||
struct fb_info *info = platform_get_drvdata(pdev);
|
struct fb_info *info = platform_get_drvdata(pdev);
|
||||||
struct imxfb_info *fbi = info->par;
|
struct imxfb_info *fbi = info->par;
|
||||||
struct resource *res;
|
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
||||||
if (!res)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
imxfb_disable_controller(fbi);
|
imxfb_disable_controller(fbi);
|
||||||
|
|
||||||
unregister_framebuffer(info);
|
unregister_framebuffer(info);
|
||||||
fb_dealloc_cmap(&info->cmap);
|
fb_dealloc_cmap(&info->cmap);
|
||||||
pdata = dev_get_platdata(&pdev->dev);
|
|
||||||
if (pdata && pdata->exit)
|
|
||||||
pdata->exit(fbi->pdev);
|
|
||||||
dma_free_wc(&pdev->dev, fbi->map_size, info->screen_buffer,
|
dma_free_wc(&pdev->dev, fbi->map_size, info->screen_buffer,
|
||||||
fbi->map_dma);
|
fbi->map_dma);
|
||||||
iounmap(fbi->regs);
|
|
||||||
release_mem_region(res->start, resource_size(res));
|
|
||||||
kfree(info->pseudo_palette);
|
kfree(info->pseudo_palette);
|
||||||
framebuffer_release(info);
|
framebuffer_release(info);
|
||||||
|
|
||||||
|
@ -489,7 +489,7 @@ static void hwa742_update_window_auto(struct timer_list *unused)
|
|||||||
__hwa742_update_window_auto(false);
|
__hwa742_update_window_auto(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int hwa742_update_window_async(struct fb_info *fbi,
|
static int hwa742_update_window_async(struct fb_info *fbi,
|
||||||
struct omapfb_update_window *win,
|
struct omapfb_update_window *win,
|
||||||
void (*complete_callback)(void *arg),
|
void (*complete_callback)(void *arg),
|
||||||
void *complete_callback_data)
|
void *complete_callback_data)
|
||||||
@ -522,7 +522,6 @@ int hwa742_update_window_async(struct fb_info *fbi,
|
|||||||
out:
|
out:
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(hwa742_update_window_async);
|
|
||||||
|
|
||||||
static int hwa742_setup_plane(int plane, int channel_out,
|
static int hwa742_setup_plane(int plane, int channel_out,
|
||||||
unsigned long offset, int screen_width,
|
unsigned long offset, int screen_width,
|
||||||
|
@ -227,13 +227,4 @@ extern int omapfb_register_client(struct omapfb_notifier_block *nb,
|
|||||||
omapfb_notifier_callback_t callback,
|
omapfb_notifier_callback_t callback,
|
||||||
void *callback_data);
|
void *callback_data);
|
||||||
extern int omapfb_unregister_client(struct omapfb_notifier_block *nb);
|
extern int omapfb_unregister_client(struct omapfb_notifier_block *nb);
|
||||||
extern int omapfb_update_window_async(struct fb_info *fbi,
|
|
||||||
struct omapfb_update_window *win,
|
|
||||||
void (*callback)(void *),
|
|
||||||
void *callback_data);
|
|
||||||
extern int hwa742_update_window_async(struct fb_info *fbi,
|
|
||||||
struct omapfb_update_window *win,
|
|
||||||
void (*callback)(void *),
|
|
||||||
void *callback_data);
|
|
||||||
|
|
||||||
#endif /* __OMAPFB_H */
|
#endif /* __OMAPFB_H */
|
||||||
|
@ -668,7 +668,7 @@ static int omapfb_set_par(struct fb_info *fbi)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int omapfb_update_window_async(struct fb_info *fbi,
|
static int omapfb_update_window_async(struct fb_info *fbi,
|
||||||
struct omapfb_update_window *win,
|
struct omapfb_update_window *win,
|
||||||
void (*callback)(void *),
|
void (*callback)(void *),
|
||||||
void *callback_data)
|
void *callback_data)
|
||||||
@ -714,7 +714,6 @@ int omapfb_update_window_async(struct fb_info *fbi,
|
|||||||
|
|
||||||
return fbdev->ctrl->update_window(fbi, win, callback, callback_data);
|
return fbdev->ctrl->update_window(fbi, win, callback, callback_data);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(omapfb_update_window_async);
|
|
||||||
|
|
||||||
static int omapfb_update_win(struct fb_info *fbi,
|
static int omapfb_update_win(struct fb_info *fbi,
|
||||||
struct omapfb_update_window *win)
|
struct omapfb_update_window *win)
|
||||||
|
@ -133,7 +133,7 @@ static struct platform_device q40fb_device = {
|
|||||||
.name = "q40fb",
|
.name = "q40fb",
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init q40fb_init(void)
|
static int __init q40fb_init(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
@ -905,6 +905,8 @@ static int s3fb_set_par(struct fb_info *info)
|
|||||||
value = clamp((htotal + hsstart + 1) / 2 + 2, hsstart + 4, htotal + 1);
|
value = clamp((htotal + hsstart + 1) / 2 + 2, hsstart + 4, htotal + 1);
|
||||||
svga_wcrt_multi(par->state.vgabase, s3_dtpc_regs, value);
|
svga_wcrt_multi(par->state.vgabase, s3_dtpc_regs, value);
|
||||||
|
|
||||||
|
if (screen_size > info->screen_size)
|
||||||
|
screen_size = info->screen_size;
|
||||||
memset_io(info->screen_base, 0x00, screen_size);
|
memset_io(info->screen_base, 0x00, screen_size);
|
||||||
/* Device and screen back on */
|
/* Device and screen back on */
|
||||||
svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80);
|
svga_wcrt_mask(par->state.vgabase, 0x17, 0x80, 0x80);
|
||||||
|
@ -1224,47 +1224,6 @@ int __init sa1100fb_init(void)
|
|||||||
return platform_driver_register(&sa1100fb_driver);
|
return platform_driver_register(&sa1100fb_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init sa1100fb_setup(char *options)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
char *this_opt;
|
|
||||||
|
|
||||||
if (!options || !*options)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
while ((this_opt = strsep(&options, ",")) != NULL) {
|
|
||||||
|
|
||||||
if (!strncmp(this_opt, "bpp:", 4))
|
|
||||||
current_par.max_bpp =
|
|
||||||
simple_strtoul(this_opt + 4, NULL, 0);
|
|
||||||
|
|
||||||
if (!strncmp(this_opt, "lccr0:", 6))
|
|
||||||
lcd_shadow.lccr0 =
|
|
||||||
simple_strtoul(this_opt + 6, NULL, 0);
|
|
||||||
if (!strncmp(this_opt, "lccr1:", 6)) {
|
|
||||||
lcd_shadow.lccr1 =
|
|
||||||
simple_strtoul(this_opt + 6, NULL, 0);
|
|
||||||
current_par.max_xres =
|
|
||||||
(lcd_shadow.lccr1 & 0x3ff) + 16;
|
|
||||||
}
|
|
||||||
if (!strncmp(this_opt, "lccr2:", 6)) {
|
|
||||||
lcd_shadow.lccr2 =
|
|
||||||
simple_strtoul(this_opt + 6, NULL, 0);
|
|
||||||
current_par.max_yres =
|
|
||||||
(lcd_shadow.
|
|
||||||
lccr0 & LCCR0_SDS) ? ((lcd_shadow.
|
|
||||||
lccr2 & 0x3ff) +
|
|
||||||
1) *
|
|
||||||
2 : ((lcd_shadow.lccr2 & 0x3ff) + 1);
|
|
||||||
}
|
|
||||||
if (!strncmp(this_opt, "lccr3:", 6))
|
|
||||||
lcd_shadow.lccr3 =
|
|
||||||
simple_strtoul(this_opt + 6, NULL, 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
module_init(sa1100fb_init);
|
module_init(sa1100fb_init);
|
||||||
MODULE_DESCRIPTION("StrongARM-1100/1110 framebuffer driver");
|
MODULE_DESCRIPTION("StrongARM-1100/1110 framebuffer driver");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
@ -355,12 +355,12 @@ SiS_GetModeID(int VGAEngine, unsigned int VBFlags, int HDisplay, int VDisplay,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 400:
|
case 400:
|
||||||
if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 800) && (LCDwidth >= 600))) {
|
if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 800) && (LCDheight >= 600))) {
|
||||||
if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth];
|
if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 512:
|
case 512:
|
||||||
if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 1024) && (LCDwidth >= 768))) {
|
if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 1024) && (LCDheight >= 768))) {
|
||||||
if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth];
|
if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -131,8 +131,6 @@ static struct fb_info info;
|
|||||||
*/
|
*/
|
||||||
static struct xxx_par __initdata current_par;
|
static struct xxx_par __initdata current_par;
|
||||||
|
|
||||||
int xxxfb_init(void);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xxxfb_open - Optional function. Called when the framebuffer is
|
* xxxfb_open - Optional function. Called when the framebuffer is
|
||||||
* first accessed.
|
* first accessed.
|
||||||
@ -886,7 +884,7 @@ static struct pci_driver xxxfb_driver = {
|
|||||||
|
|
||||||
MODULE_DEVICE_TABLE(pci, xxxfb_id_table);
|
MODULE_DEVICE_TABLE(pci, xxxfb_id_table);
|
||||||
|
|
||||||
int __init xxxfb_init(void)
|
static int __init xxxfb_init(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* For kernel boot options (in 'video=xxxfb:<options>' format)
|
* For kernel boot options (in 'video=xxxfb:<options>' format)
|
||||||
@ -967,7 +965,7 @@ static struct platform_device *xxxfb_device;
|
|||||||
* Only necessary if your driver takes special options,
|
* Only necessary if your driver takes special options,
|
||||||
* otherwise we fall back on the generic fb_setup().
|
* otherwise we fall back on the generic fb_setup().
|
||||||
*/
|
*/
|
||||||
int __init xxxfb_setup(char *options)
|
static int __init xxxfb_setup(char *options)
|
||||||
{
|
{
|
||||||
/* Parse user specified options (`video=xxxfb:') */
|
/* Parse user specified options (`video=xxxfb:') */
|
||||||
}
|
}
|
||||||
|
@ -90,11 +90,7 @@ struct fb_info_valkyrie {
|
|||||||
u32 pseudo_palette[16];
|
u32 pseudo_palette[16];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
static int valkyriefb_setup(char*);
|
||||||
* Exported functions
|
|
||||||
*/
|
|
||||||
int valkyriefb_init(void);
|
|
||||||
int valkyriefb_setup(char*);
|
|
||||||
|
|
||||||
static int valkyriefb_check_var(struct fb_var_screeninfo *var,
|
static int valkyriefb_check_var(struct fb_var_screeninfo *var,
|
||||||
struct fb_info *info);
|
struct fb_info *info);
|
||||||
@ -302,7 +298,7 @@ static void __init valkyrie_choose_mode(struct fb_info_valkyrie *p)
|
|||||||
default_vmode, default_cmode);
|
default_vmode, default_cmode);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init valkyriefb_init(void)
|
static int __init valkyriefb_init(void)
|
||||||
{
|
{
|
||||||
struct fb_info_valkyrie *p;
|
struct fb_info_valkyrie *p;
|
||||||
unsigned long frame_buffer_phys, cmap_regs_phys;
|
unsigned long frame_buffer_phys, cmap_regs_phys;
|
||||||
@ -549,7 +545,7 @@ static int __init valkyrie_init_info(struct fb_info *info,
|
|||||||
/*
|
/*
|
||||||
* Parse user specified options (`video=valkyriefb:')
|
* Parse user specified options (`video=valkyriefb:')
|
||||||
*/
|
*/
|
||||||
int __init valkyriefb_setup(char *options)
|
static int __init valkyriefb_setup(char *options)
|
||||||
{
|
{
|
||||||
char *this_opt;
|
char *this_opt;
|
||||||
|
|
||||||
|
@ -507,6 +507,8 @@ static int vt8623fb_set_par(struct fb_info *info)
|
|||||||
(info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1, 1,
|
(info->var.vmode & FB_VMODE_DOUBLE) ? 2 : 1, 1,
|
||||||
1, info->node);
|
1, info->node);
|
||||||
|
|
||||||
|
if (screen_size > info->screen_size)
|
||||||
|
screen_size = info->screen_size;
|
||||||
memset_io(info->screen_base, 0x00, screen_size);
|
memset_io(info->screen_base, 0x00, screen_size);
|
||||||
|
|
||||||
/* Device and screen back on */
|
/* Device and screen back on */
|
||||||
|
@ -1,70 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
/*
|
|
||||||
* This structure describes the machine which we are running on.
|
|
||||||
*/
|
|
||||||
#ifndef __MACH_IMXFB_H__
|
|
||||||
#define __MACH_IMXFB_H__
|
|
||||||
|
|
||||||
#include <linux/fb.h>
|
|
||||||
|
|
||||||
#define PCR_TFT (1 << 31)
|
|
||||||
#define PCR_COLOR (1 << 30)
|
|
||||||
#define PCR_PBSIZ_1 (0 << 28)
|
|
||||||
#define PCR_PBSIZ_2 (1 << 28)
|
|
||||||
#define PCR_PBSIZ_4 (2 << 28)
|
|
||||||
#define PCR_PBSIZ_8 (3 << 28)
|
|
||||||
#define PCR_BPIX_1 (0 << 25)
|
|
||||||
#define PCR_BPIX_2 (1 << 25)
|
|
||||||
#define PCR_BPIX_4 (2 << 25)
|
|
||||||
#define PCR_BPIX_8 (3 << 25)
|
|
||||||
#define PCR_BPIX_12 (4 << 25)
|
|
||||||
#define PCR_BPIX_16 (5 << 25)
|
|
||||||
#define PCR_BPIX_18 (6 << 25)
|
|
||||||
#define PCR_PIXPOL (1 << 24)
|
|
||||||
#define PCR_FLMPOL (1 << 23)
|
|
||||||
#define PCR_LPPOL (1 << 22)
|
|
||||||
#define PCR_CLKPOL (1 << 21)
|
|
||||||
#define PCR_OEPOL (1 << 20)
|
|
||||||
#define PCR_SCLKIDLE (1 << 19)
|
|
||||||
#define PCR_END_SEL (1 << 18)
|
|
||||||
#define PCR_END_BYTE_SWAP (1 << 17)
|
|
||||||
#define PCR_REV_VS (1 << 16)
|
|
||||||
#define PCR_ACD_SEL (1 << 15)
|
|
||||||
#define PCR_ACD(x) (((x) & 0x7f) << 8)
|
|
||||||
#define PCR_SCLK_SEL (1 << 7)
|
|
||||||
#define PCR_SHARP (1 << 6)
|
|
||||||
#define PCR_PCD(x) ((x) & 0x3f)
|
|
||||||
|
|
||||||
#define PWMR_CLS(x) (((x) & 0x1ff) << 16)
|
|
||||||
#define PWMR_LDMSK (1 << 15)
|
|
||||||
#define PWMR_SCR1 (1 << 10)
|
|
||||||
#define PWMR_SCR0 (1 << 9)
|
|
||||||
#define PWMR_CC_EN (1 << 8)
|
|
||||||
#define PWMR_PW(x) ((x) & 0xff)
|
|
||||||
|
|
||||||
#define LSCR1_PS_RISE_DELAY(x) (((x) & 0x7f) << 26)
|
|
||||||
#define LSCR1_CLS_RISE_DELAY(x) (((x) & 0x3f) << 16)
|
|
||||||
#define LSCR1_REV_TOGGLE_DELAY(x) (((x) & 0xf) << 8)
|
|
||||||
#define LSCR1_GRAY2(x) (((x) & 0xf) << 4)
|
|
||||||
#define LSCR1_GRAY1(x) (((x) & 0xf))
|
|
||||||
|
|
||||||
struct imx_fb_videomode {
|
|
||||||
struct fb_videomode mode;
|
|
||||||
u32 pcr;
|
|
||||||
bool aus_mode;
|
|
||||||
unsigned char bpp;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct imx_fb_platform_data {
|
|
||||||
struct imx_fb_videomode *mode;
|
|
||||||
int num_modes;
|
|
||||||
|
|
||||||
u_int pwmr;
|
|
||||||
u_int lscr1;
|
|
||||||
u_int dmacr;
|
|
||||||
|
|
||||||
int (*init)(struct platform_device *);
|
|
||||||
void (*exit)(struct platform_device *);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* ifndef __MACH_IMXFB_H__ */
|
|
Loading…
Reference in New Issue
Block a user