fbdev changes for v4.15:
- convert timers to use timer_setup() (Kees Cook, Thierry Reding) - fix panels support on iMX boards in mxsfb driver (Stefan Agner) - fix timeout on EDID read in udlfb driver (Ladislav Michl) - add missing modes to fix out of bounds access in controlfb driver (Geert Uytterhoeven) - update initialisation paths in sa1100fb driver to be more robust (Russell King) - fix error handling path of ->probe method in au1200fb driver (Christophe JAILLET) - fix handling of cases when either panel or crt is defined in sm501fb driver (Sudip Mukherjee, Colin Ian King) - add ability to the Goldfish FB driver to be recognized by OS via DT (Aleksandar Markovic) - structures constifications (Bhumika Goyal) - misc fixes (Allen Pais, Gustavo A. R. Silva, Dan Carpenter) - misc cleanups (Colin Ian King, Himanshu Jha, Markus Elfring) - remove dead igafb driver -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJaEto8AAoJEH4ztj+gR8ILrLkP+wcGcsZHGqte7bpwnEpQa/D8 x0nlP3qNdx9pGDhZRZahexSmnLYajwg22iO3HdbuCy7k/WWtv6R+BREKQ1yEIHUP kmH5QMgKunWs36PITuxVRQ9GDwZK1pk+XAR0M3XBUOw8OKoqwiiX8z+5c3YxWQ4X 0VgEBEijnZs9exZgTY0UNVBKzy4GC9HXRjDW7cicOSVX7TW7yURU2wL79ANqW+Ba eelbaPCDD3aPIFRWWKI/BH467Jyqnrol0u08ZZcqzMo92TQHmoYOctVuYlp3WM1j HOi/N/fdhKUPoadkr1av1VUQAIN+Cx+8lFAaihilaAbaIcd515UWu4Jqrt8SjTZ2 xVfitJ58EaR++EJjfrwxyOkSIWlG6mH5y3IYwvV3N6WGiqhy5srue6MzI/ofX+Iz h2HNVXcIlMJmtCmOVUkk2zECyCFPN0S4+eTrRUUdPVQBCWNfqKm6mS2/p39P6mrE HfE4Jav/EXn7p2UBVRt8EYbWcdLCuIPdGc+buA+7z0Nu4AsPUMtkiuLpuKtE0sXs bq0Vv7ac07ZFxTjfnsPPrgBE9aBL5jtC8jnez2IRVMppfTIgah9xm32wQh43WzIM JgH4JxKaQgirmMHE3GGZASh4f9rj5M/Ia0ybQOVbwtxykKaFG8oIYyotJVP7MwDK +fl/CPKXfbpijliE5mDz =afFm -----END PGP SIGNATURE----- Merge tag 'fbdev-v4.15' of git://github.com/bzolnier/linux Pull fbdev updates from Bartlomiej Zolnierkiewicz: "There is nothing really major here (though removal of the dead igafb driver stands out in diffstat). Summary: - convert timers to use timer_setup() (Kees Cook, Thierry Reding) - fix panels support on iMX boards in mxsfb driver (Stefan Agner) - fix timeout on EDID read in udlfb driver (Ladislav Michl) - add missing modes to fix out of bounds access in controlfb driver (Geert Uytterhoeven) - update initialisation paths in sa1100fb driver to be more robust (Russell King) - fix error handling path of ->probe method in au1200fb driver (Christophe JAILLET) - fix handling of cases when either panel or crt is defined in sm501fb driver (Sudip Mukherjee, Colin Ian King) - add ability to the Goldfish FB driver to be recognized by OS via DT (Aleksandar Markovic) - structures constifications (Bhumika Goyal) - misc fixes (Allen Pais, Gustavo A. R. Silva, Dan Carpenter) - misc cleanups (Colin Ian King, Himanshu Jha, Markus Elfring) - remove dead igafb driver" * tag 'fbdev-v4.15' of git://github.com/bzolnier/linux: (42 commits) OMAPFB: prevent buffer underflow in omapfb_parse_vram_param() video: fbdev: sm501fb: fix potential null pointer dereference on fbi fbcon: Initialize ops->info early video: fbdev: Convert timers to use timer_setup() video: fbdev: pxa3xx_gcu: Convert timers to use timer_setup() fbdev: controlfb: Add missing modes to fix out of bounds access video: fbdev: sis_main: mark expected switch fall-throughs video: fbdev: cirrusfb: mark expected switch fall-throughs video: fbdev: aty: radeon_pm: mark expected switch fall-throughs video: fbdev: sm501fb: mark expected switch fall-through in sm501fb_blank_crt video: fbdev: intelfb: remove redundant variables video/fbdev/dnfb: Use common error handling code in dnfb_probe() sm501fb: suspend and resume fb if it exists sm501fb: unregister framebuffer only if registered sm501fb: deallocate colormap only if allocated video: goldfishfb: Add support for device tree bindings Documentation: Add device tree binding for Goldfish FB driver video: udlfb: Fix read EDID timeout video: fbdev: remove dead igafb driver video: fbdev: mxsfb: fix pixelclock polarity ...
This commit is contained in:
Коммит
e1d1ea549b
|
@ -0,0 +1,17 @@
|
|||
Android Goldfish framebuffer
|
||||
|
||||
Android Goldfish framebuffer device used by Android emulator.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should contain "google,goldfish-fb"
|
||||
- reg : <registers mapping>
|
||||
- interrupts : <interrupt mapping>
|
||||
|
||||
Example:
|
||||
|
||||
display-controller@1f008000 {
|
||||
compatible = "google,goldfish-fb";
|
||||
interrupts = <0x10>;
|
||||
reg = <0x1f008000 0x100>;
|
||||
};
|
|
@ -905,16 +905,6 @@ config FB_LEO
|
|||
This is the frame buffer device driver for the SBUS-based Sun ZX
|
||||
(leo) frame buffer cards.
|
||||
|
||||
config FB_IGA
|
||||
bool "IGA 168x display support"
|
||||
depends on (FB = y) && SPARC32
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
help
|
||||
This is the framebuffer device for the INTERGRAPHICS 1680 and
|
||||
successor frame buffer cards.
|
||||
|
||||
config FB_XVR500
|
||||
bool "Sun XVR-500 3DLABS Wildcat support"
|
||||
depends on (FB = y) && PCI && SPARC64
|
||||
|
|
|
@ -65,7 +65,6 @@ obj-$(CONFIG_FB_HGA) += hgafb.o
|
|||
obj-$(CONFIG_FB_XVR500) += sunxvr500.o
|
||||
obj-$(CONFIG_FB_XVR2500) += sunxvr2500.o
|
||||
obj-$(CONFIG_FB_XVR1000) += sunxvr1000.o
|
||||
obj-$(CONFIG_FB_IGA) += igafb.o
|
||||
obj-$(CONFIG_FB_APOLLO) += dnfb.o
|
||||
obj-$(CONFIG_FB_Q40) += q40fb.o
|
||||
obj-$(CONFIG_FB_TGA) += tgafb.o
|
||||
|
|
|
@ -2272,10 +2272,10 @@ static void aty_bl_exit(struct backlight_device *bd)
|
|||
|
||||
static void aty_calc_mem_refresh(struct atyfb_par *par, int xclk)
|
||||
{
|
||||
const int ragepro_tbl[] = {
|
||||
static const int ragepro_tbl[] = {
|
||||
44, 50, 55, 66, 75, 80, 100
|
||||
};
|
||||
const int ragexl_tbl[] = {
|
||||
static const int ragexl_tbl[] = {
|
||||
50, 66, 75, 83, 90, 95, 100, 105,
|
||||
110, 115, 120, 125, 133, 143, 166
|
||||
};
|
||||
|
|
|
@ -1454,9 +1454,9 @@ static void radeon_write_pll_regs(struct radeonfb_info *rinfo, struct radeon_reg
|
|||
/*
|
||||
* Timer function for delayed LVDS panel power up/down
|
||||
*/
|
||||
static void radeon_lvds_timer_func(unsigned long data)
|
||||
static void radeon_lvds_timer_func(struct timer_list *t)
|
||||
{
|
||||
struct radeonfb_info *rinfo = (struct radeonfb_info *)data;
|
||||
struct radeonfb_info *rinfo = from_timer(rinfo, t, lvds_timer);
|
||||
|
||||
radeon_engine_idle();
|
||||
|
||||
|
@ -1534,7 +1534,7 @@ void radeon_write_mode (struct radeonfb_info *rinfo, struct radeon_regs *mode,
|
|||
static void radeon_calc_pll_regs(struct radeonfb_info *rinfo, struct radeon_regs *regs,
|
||||
unsigned long freq)
|
||||
{
|
||||
const struct {
|
||||
static const struct {
|
||||
int divider;
|
||||
int bitvalue;
|
||||
} *post_div,
|
||||
|
@ -2291,9 +2291,7 @@ static int radeonfb_pci_register(struct pci_dev *pdev,
|
|||
rinfo->pdev = pdev;
|
||||
|
||||
spin_lock_init(&rinfo->reg_lock);
|
||||
init_timer(&rinfo->lvds_timer);
|
||||
rinfo->lvds_timer.function = radeon_lvds_timer_func;
|
||||
rinfo->lvds_timer.data = (unsigned long)rinfo;
|
||||
timer_setup(&rinfo->lvds_timer, radeon_lvds_timer_func, 0);
|
||||
|
||||
c1 = ent->device >> 8;
|
||||
c2 = ent->device & 0xff;
|
||||
|
|
|
@ -1208,9 +1208,11 @@ static void radeon_pm_enable_dll_m10(struct radeonfb_info *rinfo)
|
|||
case 1:
|
||||
if (mc & 0x4)
|
||||
break;
|
||||
/* fall through */
|
||||
case 2:
|
||||
dll_sleep_mask |= MDLL_R300_RDCK__MRDCKB_SLEEP;
|
||||
dll_reset_mask |= MDLL_R300_RDCK__MRDCKB_RESET;
|
||||
/* fall through */
|
||||
case 0:
|
||||
dll_sleep_mask |= MDLL_R300_RDCK__MRDCKA_SLEEP;
|
||||
dll_reset_mask |= MDLL_R300_RDCK__MRDCKA_RESET;
|
||||
|
@ -1219,6 +1221,7 @@ static void radeon_pm_enable_dll_m10(struct radeonfb_info *rinfo)
|
|||
case 1:
|
||||
if (!(mc & 0x4))
|
||||
break;
|
||||
/* fall through */
|
||||
case 2:
|
||||
dll_sleep_mask |= MDLL_R300_RDCK__MRDCKD_SLEEP;
|
||||
dll_reset_mask |= MDLL_R300_RDCK__MRDCKD_RESET;
|
||||
|
|
|
@ -1518,7 +1518,7 @@ static irqreturn_t au1200fb_handle_irq(int irq, void* dev_id)
|
|||
static int au1200fb_init_fbinfo(struct au1200fb_device *fbdev)
|
||||
{
|
||||
struct fb_info *fbi = fbdev->fb_info;
|
||||
int bpp;
|
||||
int bpp, ret;
|
||||
|
||||
fbi->fbops = &au1200fb_fb_ops;
|
||||
|
||||
|
@ -1546,15 +1546,14 @@ static int au1200fb_init_fbinfo(struct au1200fb_device *fbdev)
|
|||
}
|
||||
|
||||
fbi->pseudo_palette = kcalloc(16, sizeof(u32), GFP_KERNEL);
|
||||
if (!fbi->pseudo_palette) {
|
||||
if (!fbi->pseudo_palette)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (fb_alloc_cmap(&fbi->cmap, AU1200_LCD_NBR_PALETTE_ENTRIES, 0) < 0) {
|
||||
ret = fb_alloc_cmap(&fbi->cmap, AU1200_LCD_NBR_PALETTE_ENTRIES, 0);
|
||||
if (ret < 0) {
|
||||
print_err("Fail to allocate colormap (%d entries)",
|
||||
AU1200_LCD_NBR_PALETTE_ENTRIES);
|
||||
kfree(fbi->pseudo_palette);
|
||||
return -EFAULT;
|
||||
AU1200_LCD_NBR_PALETTE_ENTRIES);
|
||||
return ret;
|
||||
}
|
||||
|
||||
strncpy(fbi->fix.id, "AU1200", sizeof(fbi->fix.id));
|
||||
|
@ -1668,10 +1667,6 @@ static int au1200fb_drv_probe(struct platform_device *dev)
|
|||
printk(DRIVER_NAME ": Panel %d %s\n", panel_index, panel->name);
|
||||
printk(DRIVER_NAME ": Win %d %s\n", window_index, win->name);
|
||||
|
||||
/* shut gcc up */
|
||||
ret = 0;
|
||||
fbdev = NULL;
|
||||
|
||||
for (plane = 0; plane < device_count; ++plane) {
|
||||
bpp = winbpp(win->w[plane].mode_winctrl1);
|
||||
if (win->w[plane].xres == 0)
|
||||
|
@ -1681,8 +1676,10 @@ static int au1200fb_drv_probe(struct platform_device *dev)
|
|||
|
||||
fbi = framebuffer_alloc(sizeof(struct au1200fb_device),
|
||||
&dev->dev);
|
||||
if (!fbi)
|
||||
if (!fbi) {
|
||||
ret = -ENOMEM;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
_au1200fb_infos[plane] = fbi;
|
||||
fbdev = fbi->par;
|
||||
|
@ -1701,7 +1698,8 @@ static int au1200fb_drv_probe(struct platform_device *dev)
|
|||
if (!fbdev->fb_mem) {
|
||||
print_err("fail to allocate frambuffer (size: %dK))",
|
||||
fbdev->fb_len / 1024);
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1718,7 +1716,8 @@ static int au1200fb_drv_probe(struct platform_device *dev)
|
|||
print_dbg("phys=0x%08x, size=%dK", fbdev->fb_phys, fbdev->fb_len / 1024);
|
||||
|
||||
/* Init FB data */
|
||||
if ((ret = au1200fb_init_fbinfo(fbdev)) < 0)
|
||||
ret = au1200fb_init_fbinfo(fbdev);
|
||||
if (ret < 0)
|
||||
goto failed;
|
||||
|
||||
/* Register new framebuffer */
|
||||
|
@ -1758,21 +1757,26 @@ static int au1200fb_drv_probe(struct platform_device *dev)
|
|||
return 0;
|
||||
|
||||
failed:
|
||||
/* NOTE: This only does the current plane/window that failed; others are still active */
|
||||
if (fbi) {
|
||||
for (plane = 0; plane < device_count; ++plane) {
|
||||
fbi = _au1200fb_infos[plane];
|
||||
if (!fbi)
|
||||
break;
|
||||
|
||||
/* Clean up all probe data */
|
||||
unregister_framebuffer(fbi);
|
||||
if (fbi->cmap.len != 0)
|
||||
fb_dealloc_cmap(&fbi->cmap);
|
||||
kfree(fbi->pseudo_palette);
|
||||
|
||||
framebuffer_release(fbi);
|
||||
_au1200fb_infos[plane] = NULL;
|
||||
}
|
||||
if (plane == 0)
|
||||
free_irq(AU1200_LCD_INT, (void*)dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int au1200fb_drv_remove(struct platform_device *dev)
|
||||
{
|
||||
struct au1200fb_platdata *pd = platform_get_drvdata(dev);
|
||||
struct au1200fb_device *fbdev;
|
||||
struct fb_info *fbi;
|
||||
int plane;
|
||||
|
||||
|
@ -1781,7 +1785,6 @@ static int au1200fb_drv_remove(struct platform_device *dev)
|
|||
|
||||
for (plane = 0; plane < device_count; ++plane) {
|
||||
fbi = _au1200fb_infos[plane];
|
||||
fbdev = fbi->par;
|
||||
|
||||
/* Clean up all probe data */
|
||||
unregister_framebuffer(fbi);
|
||||
|
|
|
@ -1477,10 +1477,12 @@ static void init_vgachip(struct fb_info *info)
|
|||
mdelay(100);
|
||||
/* mode */
|
||||
vga_wgfx(cinfo->regbase, CL_GR31, 0x00);
|
||||
case BT_GD5480: /* fall through */
|
||||
/* fall through */
|
||||
case BT_GD5480:
|
||||
/* from Klaus' NetBSD driver: */
|
||||
vga_wgfx(cinfo->regbase, CL_GR2F, 0x00);
|
||||
case BT_ALPINE: /* fall through */
|
||||
/* fall through */
|
||||
case BT_ALPINE:
|
||||
/* put blitter into 542x compat */
|
||||
vga_wgfx(cinfo->regbase, CL_GR33, 0x00);
|
||||
break;
|
||||
|
|
|
@ -141,5 +141,7 @@ static struct max_cmodes control_mac_modes[] = {
|
|||
{{ 1, 2}}, /* 1152x870, 75Hz */
|
||||
{{ 0, 1}}, /* 1280x960, 75Hz */
|
||||
{{ 0, 1}}, /* 1280x1024, 75Hz */
|
||||
{{ 1, 2}}, /* 1152x768, 60Hz */
|
||||
{{ 0, 1}}, /* 1600x1024, 60Hz */
|
||||
};
|
||||
|
||||
|
|
|
@ -395,10 +395,10 @@ static void fb_flashcursor(struct work_struct *work)
|
|||
console_unlock();
|
||||
}
|
||||
|
||||
static void cursor_timer_handler(unsigned long dev_addr)
|
||||
static void cursor_timer_handler(struct timer_list *t)
|
||||
{
|
||||
struct fb_info *info = (struct fb_info *) dev_addr;
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct fbcon_ops *ops = from_timer(ops, t, cursor_timer);
|
||||
struct fb_info *info = ops->info;
|
||||
|
||||
queue_work(system_power_efficient_wq, &info->queue);
|
||||
mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
|
||||
|
@ -414,8 +414,7 @@ static void fbcon_add_cursor_timer(struct fb_info *info)
|
|||
if (!info->queue.func)
|
||||
INIT_WORK(&info->queue, fb_flashcursor);
|
||||
|
||||
setup_timer(&ops->cursor_timer, cursor_timer_handler,
|
||||
(unsigned long) info);
|
||||
timer_setup(&ops->cursor_timer, cursor_timer_handler, 0);
|
||||
mod_timer(&ops->cursor_timer, jiffies + ops->cur_blink_jiffies);
|
||||
ops->flags |= FBCON_FLAGS_CURSOR_TIMER;
|
||||
}
|
||||
|
@ -714,6 +713,7 @@ static int con2fb_acquire_newinfo(struct vc_data *vc, struct fb_info *info,
|
|||
|
||||
if (!err) {
|
||||
ops->cur_blink_jiffies = HZ / 5;
|
||||
ops->info = info;
|
||||
info->fbcon_par = ops;
|
||||
|
||||
if (vc)
|
||||
|
@ -962,6 +962,7 @@ static const char *fbcon_startup(void)
|
|||
ops->graphics = 1;
|
||||
ops->cur_rotate = -1;
|
||||
ops->cur_blink_jiffies = HZ / 5;
|
||||
ops->info = info;
|
||||
info->fbcon_par = ops;
|
||||
if (initial_rotation != -1)
|
||||
p->con_rotate = initial_rotation;
|
||||
|
|
|
@ -69,6 +69,7 @@ struct fbcon_ops {
|
|||
struct timer_list cursor_timer; /* Cursor timer */
|
||||
struct fb_cursor cursor_state;
|
||||
struct display *p;
|
||||
struct fb_info *info;
|
||||
int currcon; /* Current VC. */
|
||||
int cur_blink_jiffies;
|
||||
int cursor_flash;
|
||||
|
|
|
@ -115,7 +115,7 @@ static struct fb_ops dn_fb_ops = {
|
|||
.fb_imageblit = cfb_imageblit,
|
||||
};
|
||||
|
||||
struct fb_var_screeninfo dnfb_var = {
|
||||
static const struct fb_var_screeninfo dnfb_var = {
|
||||
.xres = 1280,
|
||||
.yres = 1024,
|
||||
.xres_virtual = 2048,
|
||||
|
@ -242,16 +242,13 @@ static int dnfb_probe(struct platform_device *dev)
|
|||
info->screen_base = (u_char *) info->fix.smem_start;
|
||||
|
||||
err = fb_alloc_cmap(&info->cmap, 2, 0);
|
||||
if (err < 0) {
|
||||
framebuffer_release(info);
|
||||
return err;
|
||||
}
|
||||
if (err < 0)
|
||||
goto release_framebuffer;
|
||||
|
||||
err = register_framebuffer(info);
|
||||
if (err < 0) {
|
||||
fb_dealloc_cmap(&info->cmap);
|
||||
framebuffer_release(info);
|
||||
return err;
|
||||
goto release_framebuffer;
|
||||
}
|
||||
platform_set_drvdata(dev, info);
|
||||
|
||||
|
@ -265,6 +262,10 @@ static int dnfb_probe(struct platform_device *dev)
|
|||
|
||||
printk("apollo frame buffer alive and kicking !\n");
|
||||
return err;
|
||||
|
||||
release_framebuffer:
|
||||
framebuffer_release(info);
|
||||
return err;
|
||||
}
|
||||
|
||||
static struct platform_driver dnfb_driver = {
|
||||
|
|
|
@ -304,12 +304,18 @@ static int goldfish_fb_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id goldfish_fb_of_match[] = {
|
||||
{ .compatible = "google,goldfish-fb", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, goldfish_fb_of_match);
|
||||
|
||||
static struct platform_driver goldfish_fb_driver = {
|
||||
.probe = goldfish_fb_probe,
|
||||
.remove = goldfish_fb_remove,
|
||||
.driver = {
|
||||
.name = "goldfish_fb"
|
||||
.name = "goldfish_fb",
|
||||
.of_match_table = goldfish_fb_of_match,
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -1,579 +0,0 @@
|
|||
/*
|
||||
* linux/drivers/video/igafb.c -- Frame buffer device for IGA 1682
|
||||
*
|
||||
* Copyright (C) 1998 Vladimir Roganov and Gleb Raiko
|
||||
*
|
||||
* This driver is partly based on the Frame buffer device for ATI Mach64
|
||||
* and partially on VESA-related code.
|
||||
*
|
||||
* Copyright (C) 1997-1998 Geert Uytterhoeven
|
||||
* Copyright (C) 1998 Bernd Harries
|
||||
* Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be)
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file COPYING in the main directory of this archive for
|
||||
* more details.
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
TODO:
|
||||
Despite of IGA Card has advanced graphic acceleration,
|
||||
initial version is almost dummy and does not support it.
|
||||
Support for video modes and acceleration must be added
|
||||
together with accelerated X-Windows driver implementation.
|
||||
|
||||
Most important thing at this moment is that we have working
|
||||
JavaEngine1 console & X with new console interface.
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/nvram.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#ifdef CONFIG_SPARC
|
||||
#include <asm/prom.h>
|
||||
#include <asm/pcic.h>
|
||||
#endif
|
||||
|
||||
#include <video/iga.h>
|
||||
|
||||
struct pci_mmap_map {
|
||||
unsigned long voff;
|
||||
unsigned long poff;
|
||||
unsigned long size;
|
||||
unsigned long prot_flag;
|
||||
unsigned long prot_mask;
|
||||
};
|
||||
|
||||
struct iga_par {
|
||||
struct pci_mmap_map *mmap_map;
|
||||
unsigned long frame_buffer_phys;
|
||||
unsigned long io_base;
|
||||
};
|
||||
|
||||
struct fb_info fb_info;
|
||||
|
||||
struct fb_fix_screeninfo igafb_fix __initdata = {
|
||||
.id = "IGA 1682",
|
||||
.type = FB_TYPE_PACKED_PIXELS,
|
||||
.mmio_len = 1000
|
||||
};
|
||||
|
||||
struct fb_var_screeninfo default_var = {
|
||||
/* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */
|
||||
.xres = 640,
|
||||
.yres = 480,
|
||||
.xres_virtual = 640,
|
||||
.yres_virtual = 480,
|
||||
.bits_per_pixel = 8,
|
||||
.red = {0, 8, 0 },
|
||||
.green = {0, 8, 0 },
|
||||
.blue = {0, 8, 0 },
|
||||
.height = -1,
|
||||
.width = -1,
|
||||
.accel_flags = FB_ACCEL_NONE,
|
||||
.pixclock = 39722,
|
||||
.left_margin = 48,
|
||||
.right_margin = 16,
|
||||
.upper_margin = 33,
|
||||
.lower_margin = 10,
|
||||
.hsync_len = 96,
|
||||
.vsync_len = 2,
|
||||
.vmode = FB_VMODE_NONINTERLACED
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SPARC
|
||||
struct fb_var_screeninfo default_var_1024x768 __initdata = {
|
||||
/* 1024x768, 75 Hz, Non-Interlaced (78.75 MHz dotclock) */
|
||||
.xres = 1024,
|
||||
.yres = 768,
|
||||
.xres_virtual = 1024,
|
||||
.yres_virtual = 768,
|
||||
.bits_per_pixel = 8,
|
||||
.red = {0, 8, 0 },
|
||||
.green = {0, 8, 0 },
|
||||
.blue = {0, 8, 0 },
|
||||
.height = -1,
|
||||
.width = -1,
|
||||
.accel_flags = FB_ACCEL_NONE,
|
||||
.pixclock = 12699,
|
||||
.left_margin = 176,
|
||||
.right_margin = 16,
|
||||
.upper_margin = 28,
|
||||
.lower_margin = 1,
|
||||
.hsync_len = 96,
|
||||
.vsync_len = 3,
|
||||
.vmode = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
|
||||
};
|
||||
|
||||
struct fb_var_screeninfo default_var_1152x900 __initdata = {
|
||||
/* 1152x900, 76 Hz, Non-Interlaced (110.0 MHz dotclock) */
|
||||
.xres = 1152,
|
||||
.yres = 900,
|
||||
.xres_virtual = 1152,
|
||||
.yres_virtual = 900,
|
||||
.bits_per_pixel = 8,
|
||||
.red = { 0, 8, 0 },
|
||||
.green = { 0, 8, 0 },
|
||||
.blue = { 0, 8, 0 },
|
||||
.height = -1,
|
||||
.width = -1,
|
||||
.accel_flags = FB_ACCEL_NONE,
|
||||
.pixclock = 9091,
|
||||
.left_margin = 234,
|
||||
.right_margin = 24,
|
||||
.upper_margin = 34,
|
||||
.lower_margin = 3,
|
||||
.hsync_len = 100,
|
||||
.vsync_len = 3,
|
||||
.vmode = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
|
||||
};
|
||||
|
||||
struct fb_var_screeninfo default_var_1280x1024 __initdata = {
|
||||
/* 1280x1024, 75 Hz, Non-Interlaced (135.00 MHz dotclock) */
|
||||
.xres = 1280,
|
||||
.yres = 1024,
|
||||
.xres_virtual = 1280,
|
||||
.yres_virtual = 1024,
|
||||
.bits_per_pixel = 8,
|
||||
.red = {0, 8, 0 },
|
||||
.green = {0, 8, 0 },
|
||||
.blue = {0, 8, 0 },
|
||||
.height = -1,
|
||||
.width = -1,
|
||||
.accel_flags = 0,
|
||||
.pixclock = 7408,
|
||||
.left_margin = 248,
|
||||
.right_margin = 16,
|
||||
.upper_margin = 38,
|
||||
.lower_margin = 1,
|
||||
.hsync_len = 144,
|
||||
.vsync_len = 3,
|
||||
.vmode = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
|
||||
};
|
||||
|
||||
/*
|
||||
* Memory-mapped I/O functions for Sparc PCI
|
||||
*
|
||||
* On sparc we happen to access I/O with memory mapped functions too.
|
||||
*/
|
||||
#define pci_inb(par, reg) readb(par->io_base+(reg))
|
||||
#define pci_outb(par, val, reg) writeb(val, par->io_base+(reg))
|
||||
|
||||
static inline unsigned int iga_inb(struct iga_par *par, unsigned int reg,
|
||||
unsigned int idx)
|
||||
{
|
||||
pci_outb(par, idx, reg);
|
||||
return pci_inb(par, reg + 1);
|
||||
}
|
||||
|
||||
static inline void iga_outb(struct iga_par *par, unsigned char val,
|
||||
unsigned int reg, unsigned int idx )
|
||||
{
|
||||
pci_outb(par, idx, reg);
|
||||
pci_outb(par, val, reg+1);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SPARC */
|
||||
|
||||
/*
|
||||
* Very important functionality for the JavaEngine1 computer:
|
||||
* make screen border black (usign special IGA registers)
|
||||
*/
|
||||
static void iga_blank_border(struct iga_par *par)
|
||||
{
|
||||
int i;
|
||||
#if 0
|
||||
/*
|
||||
* PROM does this for us, so keep this code as a reminder
|
||||
* about required read from 0x3DA and writing of 0x20 in the end.
|
||||
*/
|
||||
(void) pci_inb(par, 0x3DA); /* required for every access */
|
||||
pci_outb(par, IGA_IDX_VGA_OVERSCAN, IGA_ATTR_CTL);
|
||||
(void) pci_inb(par, IGA_ATTR_CTL+1);
|
||||
pci_outb(par, 0x38, IGA_ATTR_CTL);
|
||||
pci_outb(par, 0x20, IGA_ATTR_CTL); /* re-enable visual */
|
||||
#endif
|
||||
/*
|
||||
* This does not work as it was designed because the overscan
|
||||
* color is looked up in the palette. Therefore, under X11
|
||||
* overscan changes color.
|
||||
*/
|
||||
for (i=0; i < 3; i++)
|
||||
iga_outb(par, 0, IGA_EXT_CNTRL, IGA_IDX_OVERSCAN_COLOR + i);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPARC
|
||||
static int igafb_mmap(struct fb_info *info,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
struct iga_par *par = (struct iga_par *)info->par;
|
||||
unsigned int size, page, map_size = 0;
|
||||
unsigned long map_offset = 0;
|
||||
int i;
|
||||
|
||||
if (!par->mmap_map)
|
||||
return -ENXIO;
|
||||
|
||||
size = vma->vm_end - vma->vm_start;
|
||||
|
||||
/* Each page, see which map applies */
|
||||
for (page = 0; page < size; ) {
|
||||
map_size = 0;
|
||||
for (i = 0; par->mmap_map[i].size; i++) {
|
||||
unsigned long start = par->mmap_map[i].voff;
|
||||
unsigned long end = start + par->mmap_map[i].size;
|
||||
unsigned long offset = (vma->vm_pgoff << PAGE_SHIFT) + page;
|
||||
|
||||
if (start > offset)
|
||||
continue;
|
||||
if (offset >= end)
|
||||
continue;
|
||||
|
||||
map_size = par->mmap_map[i].size - (offset - start);
|
||||
map_offset = par->mmap_map[i].poff + (offset - start);
|
||||
break;
|
||||
}
|
||||
if (!map_size) {
|
||||
page += PAGE_SIZE;
|
||||
continue;
|
||||
}
|
||||
if (page + map_size > size)
|
||||
map_size = size - page;
|
||||
|
||||
pgprot_val(vma->vm_page_prot) &= ~(par->mmap_map[i].prot_mask);
|
||||
pgprot_val(vma->vm_page_prot) |= par->mmap_map[i].prot_flag;
|
||||
|
||||
if (remap_pfn_range(vma, vma->vm_start + page,
|
||||
map_offset >> PAGE_SHIFT, map_size, vma->vm_page_prot))
|
||||
return -EAGAIN;
|
||||
|
||||
page += map_size;
|
||||
}
|
||||
|
||||
if (!map_size)
|
||||
return -EINVAL;
|
||||
|
||||
vma->vm_flags |= VM_IO;
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_SPARC */
|
||||
|
||||
static int igafb_setcolreg(unsigned regno, unsigned red, unsigned green,
|
||||
unsigned blue, unsigned transp,
|
||||
struct fb_info *info)
|
||||
{
|
||||
/*
|
||||
* Set a single color register. The values supplied are
|
||||
* already rounded down to the hardware's capabilities
|
||||
* (according to the entries in the `var' structure). Return
|
||||
* != 0 for invalid regno.
|
||||
*/
|
||||
struct iga_par *par = (struct iga_par *)info->par;
|
||||
|
||||
if (regno >= info->cmap.len)
|
||||
return 1;
|
||||
|
||||
pci_outb(par, regno, DAC_W_INDEX);
|
||||
pci_outb(par, red, DAC_DATA);
|
||||
pci_outb(par, green, DAC_DATA);
|
||||
pci_outb(par, blue, DAC_DATA);
|
||||
|
||||
if (regno < 16) {
|
||||
switch (info->var.bits_per_pixel) {
|
||||
case 16:
|
||||
((u16*)(info->pseudo_palette))[regno] =
|
||||
(regno << 10) | (regno << 5) | regno;
|
||||
break;
|
||||
case 24:
|
||||
((u32*)(info->pseudo_palette))[regno] =
|
||||
(regno << 16) | (regno << 8) | regno;
|
||||
break;
|
||||
case 32:
|
||||
{ int i;
|
||||
i = (regno << 8) | regno;
|
||||
((u32*)(info->pseudo_palette))[regno] = (i << 16) | i;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Framebuffer option structure
|
||||
*/
|
||||
static struct fb_ops igafb_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.fb_setcolreg = igafb_setcolreg,
|
||||
.fb_fillrect = cfb_fillrect,
|
||||
.fb_copyarea = cfb_copyarea,
|
||||
.fb_imageblit = cfb_imageblit,
|
||||
#ifdef CONFIG_SPARC
|
||||
.fb_mmap = igafb_mmap,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init iga_init(struct fb_info *info, struct iga_par *par)
|
||||
{
|
||||
char vramsz = iga_inb(par, IGA_EXT_CNTRL, IGA_IDX_EXT_BUS_CNTL)
|
||||
& MEM_SIZE_ALIAS;
|
||||
int video_cmap_len;
|
||||
|
||||
switch (vramsz) {
|
||||
case MEM_SIZE_1M:
|
||||
info->fix.smem_len = 0x100000;
|
||||
break;
|
||||
case MEM_SIZE_2M:
|
||||
info->fix.smem_len = 0x200000;
|
||||
break;
|
||||
case MEM_SIZE_4M:
|
||||
case MEM_SIZE_RESERVED:
|
||||
info->fix.smem_len = 0x400000;
|
||||
break;
|
||||
}
|
||||
|
||||
if (info->var.bits_per_pixel > 8)
|
||||
video_cmap_len = 16;
|
||||
else
|
||||
video_cmap_len = 256;
|
||||
|
||||
info->fbops = &igafb_ops;
|
||||
info->flags = FBINFO_DEFAULT;
|
||||
|
||||
fb_alloc_cmap(&info->cmap, video_cmap_len, 0);
|
||||
|
||||
if (register_framebuffer(info) < 0)
|
||||
return 0;
|
||||
|
||||
fb_info(info, "%s frame buffer device at 0x%08lx [%dMB VRAM]\n",
|
||||
info->fix.id, par->frame_buffer_phys, info->fix.smem_len >> 20);
|
||||
|
||||
iga_blank_border(par);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int __init igafb_init(void)
|
||||
{
|
||||
struct fb_info *info;
|
||||
struct pci_dev *pdev;
|
||||
struct iga_par *par;
|
||||
unsigned long addr;
|
||||
int size, iga2000 = 0;
|
||||
|
||||
if (fb_get_options("igafb", NULL))
|
||||
return -ENODEV;
|
||||
|
||||
pdev = pci_get_device(PCI_VENDOR_ID_INTERG,
|
||||
PCI_DEVICE_ID_INTERG_1682, 0);
|
||||
if (pdev == NULL) {
|
||||
/*
|
||||
* XXX We tried to use cyber2000fb.c for IGS 2000.
|
||||
* But it does not initialize the chip in JavaStation-E, alas.
|
||||
*/
|
||||
pdev = pci_get_device(PCI_VENDOR_ID_INTERG, 0x2000, 0);
|
||||
if(pdev == NULL) {
|
||||
return -ENXIO;
|
||||
}
|
||||
iga2000 = 1;
|
||||
}
|
||||
/* We leak a reference here but as it cannot be unloaded this is
|
||||
fine. If you write unload code remember to free it in unload */
|
||||
|
||||
size = sizeof(struct iga_par) + sizeof(u32)*16;
|
||||
|
||||
info = framebuffer_alloc(size, &pdev->dev);
|
||||
if (!info) {
|
||||
printk("igafb_init: can't alloc fb_info\n");
|
||||
pci_dev_put(pdev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
|
||||
if ((addr = pdev->resource[0].start) == 0) {
|
||||
printk("igafb_init: no memory start\n");
|
||||
kfree(info);
|
||||
pci_dev_put(pdev);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
if ((info->screen_base = ioremap(addr, 1024*1024*2)) == 0) {
|
||||
printk("igafb_init: can't remap %lx[2M]\n", addr);
|
||||
kfree(info);
|
||||
pci_dev_put(pdev);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
par->frame_buffer_phys = addr & PCI_BASE_ADDRESS_MEM_MASK;
|
||||
|
||||
#ifdef CONFIG_SPARC
|
||||
/*
|
||||
* The following is sparc specific and this is why:
|
||||
*
|
||||
* IGS2000 has its I/O memory mapped and we want
|
||||
* to generate memory cycles on PCI, e.g. do ioremap(),
|
||||
* then readb/writeb() as in Documentation/io-mapping.txt.
|
||||
*
|
||||
* IGS1682 is more traditional, it responds to PCI I/O
|
||||
* cycles, so we want to access it with inb()/outb().
|
||||
*
|
||||
* On sparc, PCIC converts CPU memory access within
|
||||
* phys window 0x3000xxxx into PCI I/O cycles. Therefore
|
||||
* we may use readb/writeb to access them with IGS1682.
|
||||
*
|
||||
* We do not take io_base_phys from resource[n].start
|
||||
* on IGS1682 because that chip is BROKEN. It does not
|
||||
* have a base register for I/O. We just "know" what its
|
||||
* I/O addresses are.
|
||||
*/
|
||||
if (iga2000) {
|
||||
igafb_fix.mmio_start = par->frame_buffer_phys | 0x00800000;
|
||||
} else {
|
||||
igafb_fix.mmio_start = 0x30000000; /* XXX */
|
||||
}
|
||||
if ((par->io_base = (int) ioremap(igafb_fix.mmio_start, igafb_fix.smem_len)) == 0) {
|
||||
printk("igafb_init: can't remap %lx[4K]\n", igafb_fix.mmio_start);
|
||||
iounmap((void *)info->screen_base);
|
||||
kfree(info);
|
||||
pci_dev_put(pdev);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
/*
|
||||
* Figure mmap addresses from PCI config space.
|
||||
* We need two regions: for video memory and for I/O ports.
|
||||
* Later one can add region for video coprocessor registers.
|
||||
* However, mmap routine loops until size != 0, so we put
|
||||
* one additional region with size == 0.
|
||||
*/
|
||||
|
||||
par->mmap_map = kzalloc(4 * sizeof(*par->mmap_map), GFP_ATOMIC);
|
||||
if (!par->mmap_map) {
|
||||
printk("igafb_init: can't alloc mmap_map\n");
|
||||
iounmap((void *)par->io_base);
|
||||
iounmap(info->screen_base);
|
||||
kfree(info);
|
||||
pci_dev_put(pdev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set default vmode and cmode from PROM properties.
|
||||
*/
|
||||
{
|
||||
struct device_node *dp = pci_device_to_OF_node(pdev);
|
||||
int node = dp->node;
|
||||
int width = prom_getintdefault(node, "width", 1024);
|
||||
int height = prom_getintdefault(node, "height", 768);
|
||||
int depth = prom_getintdefault(node, "depth", 8);
|
||||
switch (width) {
|
||||
case 1024:
|
||||
if (height == 768)
|
||||
default_var = default_var_1024x768;
|
||||
break;
|
||||
case 1152:
|
||||
if (height == 900)
|
||||
default_var = default_var_1152x900;
|
||||
break;
|
||||
case 1280:
|
||||
if (height == 1024)
|
||||
default_var = default_var_1280x1024;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (depth) {
|
||||
case 8:
|
||||
default_var.bits_per_pixel = 8;
|
||||
break;
|
||||
case 16:
|
||||
default_var.bits_per_pixel = 16;
|
||||
break;
|
||||
case 24:
|
||||
default_var.bits_per_pixel = 24;
|
||||
break;
|
||||
case 32:
|
||||
default_var.bits_per_pixel = 32;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
igafb_fix.smem_start = (unsigned long) info->screen_base;
|
||||
igafb_fix.line_length = default_var.xres*(default_var.bits_per_pixel/8);
|
||||
igafb_fix.visual = default_var.bits_per_pixel <= 8 ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
|
||||
|
||||
info->var = default_var;
|
||||
info->fix = igafb_fix;
|
||||
info->pseudo_palette = (void *)(par + 1);
|
||||
|
||||
if (!iga_init(info, par)) {
|
||||
iounmap((void *)par->io_base);
|
||||
iounmap(info->screen_base);
|
||||
kfree(par->mmap_map);
|
||||
kfree(info);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPARC
|
||||
/*
|
||||
* Add /dev/fb mmap values.
|
||||
*/
|
||||
|
||||
/* First region is for video memory */
|
||||
par->mmap_map[0].voff = 0x0;
|
||||
par->mmap_map[0].poff = par->frame_buffer_phys & PAGE_MASK;
|
||||
par->mmap_map[0].size = info->fix.smem_len & PAGE_MASK;
|
||||
par->mmap_map[0].prot_mask = SRMMU_CACHE;
|
||||
par->mmap_map[0].prot_flag = SRMMU_WRITE;
|
||||
|
||||
/* Second region is for I/O ports */
|
||||
par->mmap_map[1].voff = par->frame_buffer_phys & PAGE_MASK;
|
||||
par->mmap_map[1].poff = info->fix.smem_start & PAGE_MASK;
|
||||
par->mmap_map[1].size = PAGE_SIZE * 2; /* X wants 2 pages */
|
||||
par->mmap_map[1].prot_mask = SRMMU_CACHE;
|
||||
par->mmap_map[1].prot_flag = SRMMU_WRITE;
|
||||
#endif /* CONFIG_SPARC */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init igafb_setup(char *options)
|
||||
{
|
||||
char *this_opt;
|
||||
|
||||
if (!options || !*options)
|
||||
return 0;
|
||||
|
||||
while ((this_opt = strsep(&options, ",")) != NULL) {
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(igafb_init);
|
||||
MODULE_LICENSE("GPL");
|
||||
static struct pci_device_id igafb_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_1682,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, igafb_pci_tbl);
|
|
@ -937,15 +937,11 @@ static int calc_pll_params(int index, int clock, u32 *retm1, u32 *retm2,
|
|||
{
|
||||
u32 m1, m2, n, p1, p2, n1, testm;
|
||||
u32 f_vco, p, p_best = 0, m, f_out = 0;
|
||||
u32 err_max, err_target, err_best = 10000000;
|
||||
u32 n_best = 0, m_best = 0, f_best, f_err;
|
||||
u32 err_best = 10000000;
|
||||
u32 n_best = 0, m_best = 0, f_err;
|
||||
u32 p_min, p_max, p_inc, div_max;
|
||||
struct pll_min_max *pll = &plls[index];
|
||||
|
||||
/* Accept 0.5% difference, but aim for 0.1% */
|
||||
err_max = 5 * clock / 1000;
|
||||
err_target = clock / 1000;
|
||||
|
||||
DBG_MSG("Clock is %d\n", clock);
|
||||
|
||||
div_max = pll->max_vco / clock;
|
||||
|
@ -992,7 +988,6 @@ static int calc_pll_params(int index, int clock, u32 *retm1, u32 *retm2,
|
|||
m_best = testm;
|
||||
n_best = n;
|
||||
p_best = p;
|
||||
f_best = f_out;
|
||||
err_best = f_err;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2056,7 +2056,7 @@ static int matroxfb_probe(struct pci_dev* pdev, const struct pci_device_id* dumm
|
|||
|
||||
minfo = kzalloc(sizeof(*minfo), GFP_KERNEL);
|
||||
if (!minfo)
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
|
||||
minfo->pcidev = pdev;
|
||||
minfo->dead = 0;
|
||||
|
|
|
@ -150,7 +150,7 @@
|
|||
#define STMLCDIF_24BIT 3 /** pixel data bus to the display is of 24 bit width */
|
||||
|
||||
#define MXSFB_SYNC_DATA_ENABLE_HIGH_ACT (1 << 6)
|
||||
#define MXSFB_SYNC_DOTCLK_FALLING_ACT (1 << 7) /* negtive edge sampling */
|
||||
#define MXSFB_SYNC_DOTCLK_FALLING_ACT (1 << 7) /* negative edge sampling */
|
||||
|
||||
enum mxsfb_devtype {
|
||||
MXSFB_V3,
|
||||
|
@ -788,7 +788,16 @@ static int mxsfb_init_fbinfo_dt(struct mxsfb_info *host,
|
|||
|
||||
if (vm.flags & DISPLAY_FLAGS_DE_HIGH)
|
||||
host->sync |= MXSFB_SYNC_DATA_ENABLE_HIGH_ACT;
|
||||
if (vm.flags & DISPLAY_FLAGS_PIXDATA_NEGEDGE)
|
||||
|
||||
/*
|
||||
* The PIXDATA flags of the display_flags enum are controller
|
||||
* centric, e.g. NEGEDGE means drive data on negative edge.
|
||||
* However, the drivers flag is display centric: Sample the
|
||||
* data on negative (falling) edge. Therefore, check for the
|
||||
* POSEDGE flag:
|
||||
* drive on positive edge => sample on negative edge
|
||||
*/
|
||||
if (vm.flags & DISPLAY_FLAGS_PIXDATA_POSEDGE)
|
||||
host->sync |= MXSFB_SYNC_DOTCLK_FALLING_ACT;
|
||||
|
||||
put_display_node:
|
||||
|
|
|
@ -474,7 +474,7 @@ static void auto_update_complete(void *data)
|
|||
jiffies + HWA742_AUTO_UPDATE_TIME);
|
||||
}
|
||||
|
||||
static void hwa742_update_window_auto(unsigned long arg)
|
||||
static void hwa742_update_window_auto(struct timer_list *unused)
|
||||
{
|
||||
LIST_HEAD(req_list);
|
||||
struct hwa742_request *last;
|
||||
|
@ -1002,9 +1002,7 @@ static int hwa742_init(struct omapfb_device *fbdev, int ext_mode,
|
|||
hwa742.auto_update_window.height = fbdev->panel->y_res;
|
||||
hwa742.auto_update_window.format = 0;
|
||||
|
||||
init_timer(&hwa742.auto_update_timer);
|
||||
hwa742.auto_update_timer.function = hwa742_update_window_auto;
|
||||
hwa742.auto_update_timer.data = 0;
|
||||
timer_setup(&hwa742.auto_update_timer, hwa742_update_window_auto, 0);
|
||||
|
||||
hwa742.prev_color_mode = -1;
|
||||
hwa742.prev_flags = 0;
|
||||
|
|
|
@ -3988,7 +3988,7 @@ static void dsi_update_screen_dispc(struct platform_device *dsidev)
|
|||
}
|
||||
|
||||
#ifdef DSI_CATCH_MISSING_TE
|
||||
static void dsi_te_timeout(unsigned long arg)
|
||||
static void dsi_te_timeout(struct timer_list *unused)
|
||||
{
|
||||
DSSERR("TE not received for 250ms!\n");
|
||||
}
|
||||
|
@ -5298,9 +5298,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
|
|||
dsi_framedone_timeout_work_callback);
|
||||
|
||||
#ifdef DSI_CATCH_MISSING_TE
|
||||
init_timer(&dsi->te_timer);
|
||||
dsi->te_timer.function = dsi_te_timeout;
|
||||
dsi->te_timer.data = 0;
|
||||
timer_setup(&dsi->te_timer, dsi_te_timeout, 0);
|
||||
#endif
|
||||
|
||||
res = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "proto");
|
||||
|
|
|
@ -1477,7 +1477,7 @@ static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size,
|
|||
static int omapfb_parse_vram_param(const char *param, int max_entries,
|
||||
unsigned long *sizes, unsigned long *paddrs)
|
||||
{
|
||||
int fbnum;
|
||||
unsigned int fbnum;
|
||||
unsigned long size;
|
||||
unsigned long paddr = 0;
|
||||
char *p, *start;
|
||||
|
|
|
@ -512,28 +512,26 @@ pxa3xx_gcu_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
|
||||
#ifdef PXA3XX_GCU_DEBUG_TIMER
|
||||
static struct timer_list pxa3xx_gcu_debug_timer;
|
||||
static struct pxa3xx_gcu_priv *debug_timer_priv;
|
||||
|
||||
static void pxa3xx_gcu_debug_timedout(unsigned long ptr)
|
||||
static void pxa3xx_gcu_debug_timedout(struct timer_list *unused)
|
||||
{
|
||||
struct pxa3xx_gcu_priv *priv = (struct pxa3xx_gcu_priv *) ptr;
|
||||
struct pxa3xx_gcu_priv *priv = debug_timer_priv;
|
||||
|
||||
QERROR("Timer DUMP");
|
||||
|
||||
/* init the timer structure */
|
||||
init_timer(&pxa3xx_gcu_debug_timer);
|
||||
pxa3xx_gcu_debug_timer.function = pxa3xx_gcu_debug_timedout;
|
||||
pxa3xx_gcu_debug_timer.data = ptr;
|
||||
pxa3xx_gcu_debug_timer.expires = jiffies + 5*HZ; /* one second */
|
||||
|
||||
add_timer(&pxa3xx_gcu_debug_timer);
|
||||
mod_timer(&pxa3xx_gcu_debug_timer, jiffies + 5 * HZ);
|
||||
}
|
||||
|
||||
static void pxa3xx_gcu_init_debug_timer(void)
|
||||
static void pxa3xx_gcu_init_debug_timer(struct pxa3xx_gcu_priv *priv)
|
||||
{
|
||||
pxa3xx_gcu_debug_timedout((unsigned long) &pxa3xx_gcu_debug_timer);
|
||||
/* init the timer structure */
|
||||
debug_timer_priv = priv;
|
||||
timer_setup(&pxa3xx_gcu_debug_timer, pxa3xx_gcu_debug_timedout, 0);
|
||||
pxa3xx_gcu_debug_timedout(NULL);
|
||||
}
|
||||
#else
|
||||
static inline void pxa3xx_gcu_init_debug_timer(void) {}
|
||||
static inline void pxa3xx_gcu_init_debug_timer(struct pxa3xx_gcu_priv *priv) {}
|
||||
#endif
|
||||
|
||||
static int
|
||||
|
@ -670,7 +668,7 @@ static int pxa3xx_gcu_probe(struct platform_device *pdev)
|
|||
platform_set_drvdata(pdev, priv);
|
||||
priv->resource_mem = r;
|
||||
pxa3xx_gcu_reset(priv);
|
||||
pxa3xx_gcu_init_debug_timer();
|
||||
pxa3xx_gcu_init_debug_timer(priv);
|
||||
|
||||
dev_info(dev, "registered @0x%p, DMA 0x%p (%d bytes), IRQ %d\n",
|
||||
(void *) r->start, (void *) priv->shared_phys,
|
||||
|
|
|
@ -323,13 +323,11 @@ sa1100fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
|
|||
* according to the RGB bitfield information.
|
||||
*/
|
||||
if (regno < 16) {
|
||||
u32 *pal = fbi->fb.pseudo_palette;
|
||||
|
||||
val = chan_to_field(red, &fbi->fb.var.red);
|
||||
val |= chan_to_field(green, &fbi->fb.var.green);
|
||||
val |= chan_to_field(blue, &fbi->fb.var.blue);
|
||||
|
||||
pal[regno] = val;
|
||||
fbi->pseudo_palette[regno] = val;
|
||||
ret = 0;
|
||||
}
|
||||
break;
|
||||
|
@ -1132,12 +1130,10 @@ static struct sa1100fb_info *sa1100fb_init_fbinfo(struct device *dev)
|
|||
struct sa1100fb_info *fbi;
|
||||
unsigned i;
|
||||
|
||||
fbi = kmalloc(sizeof(struct sa1100fb_info) + sizeof(u32) * 16,
|
||||
GFP_KERNEL);
|
||||
fbi = devm_kzalloc(dev, sizeof(struct sa1100fb_info), GFP_KERNEL);
|
||||
if (!fbi)
|
||||
return NULL;
|
||||
|
||||
memset(fbi, 0, sizeof(struct sa1100fb_info));
|
||||
fbi->dev = dev;
|
||||
|
||||
strcpy(fbi->fb.fix.id, SA1100_NAME);
|
||||
|
@ -1159,7 +1155,7 @@ static struct sa1100fb_info *sa1100fb_init_fbinfo(struct device *dev)
|
|||
fbi->fb.fbops = &sa1100fb_ops;
|
||||
fbi->fb.flags = FBINFO_DEFAULT;
|
||||
fbi->fb.monspecs = monspecs;
|
||||
fbi->fb.pseudo_palette = (fbi + 1);
|
||||
fbi->fb.pseudo_palette = fbi->pseudo_palette;
|
||||
|
||||
fbi->rgb[RGB_4] = &rgb_4;
|
||||
fbi->rgb[RGB_8] = &rgb_8;
|
||||
|
@ -1218,47 +1214,41 @@ static int sa1100fb_probe(struct platform_device *pdev)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0 || !res)
|
||||
if (irq < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (!request_mem_region(res->start, resource_size(res), "LCD"))
|
||||
return -EBUSY;
|
||||
|
||||
fbi = sa1100fb_init_fbinfo(&pdev->dev);
|
||||
ret = -ENOMEM;
|
||||
if (!fbi)
|
||||
goto failed;
|
||||
return -ENOMEM;
|
||||
|
||||
fbi->clk = clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(fbi->clk)) {
|
||||
ret = PTR_ERR(fbi->clk);
|
||||
fbi->clk = NULL;
|
||||
goto failed;
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
fbi->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(fbi->base))
|
||||
return PTR_ERR(fbi->base);
|
||||
|
||||
fbi->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(fbi->clk))
|
||||
return PTR_ERR(fbi->clk);
|
||||
|
||||
ret = devm_request_irq(&pdev->dev, irq, sa1100fb_handle_irq, 0,
|
||||
"LCD", fbi);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "request_irq failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
fbi->base = ioremap(res->start, resource_size(res));
|
||||
if (!fbi->base)
|
||||
goto failed;
|
||||
if (machine_is_shannon()) {
|
||||
ret = devm_gpio_request_one(&pdev->dev, SHANNON_GPIO_DISP_EN,
|
||||
GPIOF_OUT_INIT_LOW, "display enable");
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Initialize video memory */
|
||||
ret = sa1100fb_map_video_memory(fbi);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
ret = request_irq(irq, sa1100fb_handle_irq, 0, "LCD", fbi);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "request_irq failed: %d\n", ret);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (machine_is_shannon()) {
|
||||
ret = gpio_request_one(SHANNON_GPIO_DISP_EN,
|
||||
GPIOF_OUT_INIT_LOW, "display enable");
|
||||
if (ret)
|
||||
goto err_free_irq;
|
||||
}
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* This makes sure that our colour bitfield
|
||||
|
@ -1269,8 +1259,11 @@ static int sa1100fb_probe(struct platform_device *pdev)
|
|||
platform_set_drvdata(pdev, fbi);
|
||||
|
||||
ret = register_framebuffer(&fbi->fb);
|
||||
if (ret < 0)
|
||||
goto err_reg_fb;
|
||||
if (ret < 0) {
|
||||
dma_free_wc(fbi->dev, fbi->map_size, fbi->map_cpu,
|
||||
fbi->map_dma);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
fbi->freq_transition.notifier_call = sa1100fb_freq_transition;
|
||||
|
@ -1281,20 +1274,6 @@ static int sa1100fb_probe(struct platform_device *pdev)
|
|||
|
||||
/* This driver cannot be unloaded at the moment */
|
||||
return 0;
|
||||
|
||||
err_reg_fb:
|
||||
if (machine_is_shannon())
|
||||
gpio_free(SHANNON_GPIO_DISP_EN);
|
||||
err_free_irq:
|
||||
free_irq(irq, fbi);
|
||||
failed:
|
||||
if (fbi)
|
||||
iounmap(fbi->base);
|
||||
if (fbi->clk)
|
||||
clk_put(fbi->clk);
|
||||
kfree(fbi);
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct platform_driver sa1100fb_driver = {
|
||||
|
|
|
@ -69,6 +69,8 @@ struct sa1100fb_info {
|
|||
|
||||
const struct sa1100fb_mach_info *inf;
|
||||
struct clk *clk;
|
||||
|
||||
u32 pseudo_palette[16];
|
||||
};
|
||||
|
||||
#define TO_INF(ptr,member) container_of(ptr,struct sa1100fb_info,member)
|
||||
|
|
|
@ -6486,7 +6486,7 @@ SiS_SetTVSpecial(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
|
|||
|
||||
if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) {
|
||||
if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) {
|
||||
const unsigned char specialtv[] = {
|
||||
static const unsigned char specialtv[] = {
|
||||
0xa7,0x07,0xf2,0x6e,0x17,0x8b,0x73,0x53,
|
||||
0x13,0x40,0x34,0xf4,0x63,0xbb,0xcc,0x7a,
|
||||
0x58,0xe4,0x73,0xda,0x13
|
||||
|
|
|
@ -1702,6 +1702,7 @@ static int sisfb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
if(ivideo->warncount++ < 10)
|
||||
printk(KERN_INFO
|
||||
"sisfb: Deprecated ioctl call received - update your application!\n");
|
||||
/* fall through */
|
||||
case SISFB_GET_INFO: /* For communication with X driver */
|
||||
ivideo->sisfb_infoblock.sisfb_id = SISFB_ID;
|
||||
ivideo->sisfb_infoblock.sisfb_version = VER_MAJOR;
|
||||
|
@ -1755,6 +1756,7 @@ static int sisfb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
if(ivideo->warncount++ < 10)
|
||||
printk(KERN_INFO
|
||||
"sisfb: Deprecated ioctl call received - update your application!\n");
|
||||
/* fall through */
|
||||
case SISFB_GET_VBRSTATUS:
|
||||
if(sisfb_CheckVBRetrace(ivideo))
|
||||
return put_user((u32)1, argp);
|
||||
|
@ -1765,6 +1767,7 @@ static int sisfb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
if(ivideo->warncount++ < 10)
|
||||
printk(KERN_INFO
|
||||
"sisfb: Deprecated ioctl call received - update your application!\n");
|
||||
/* fall through */
|
||||
case SISFB_GET_AUTOMAXIMIZE:
|
||||
if(ivideo->sisfb_max)
|
||||
return put_user((u32)1, argp);
|
||||
|
@ -1775,6 +1778,7 @@ static int sisfb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
if(ivideo->warncount++ < 10)
|
||||
printk(KERN_INFO
|
||||
"sisfb: Deprecated ioctl call received - update your application!\n");
|
||||
/* fall through */
|
||||
case SISFB_SET_AUTOMAXIMIZE:
|
||||
if(get_user(gpu32, argp))
|
||||
return -EFAULT;
|
||||
|
|
|
@ -1008,6 +1008,7 @@ static int sm501fb_blank_crt(int blank_mode, struct fb_info *info)
|
|||
case FB_BLANK_POWERDOWN:
|
||||
ctrl &= ~SM501_DC_CRT_CONTROL_ENABLE;
|
||||
sm501_misc_control(fbi->dev->parent, SM501_MISC_DAC_POWER, 0);
|
||||
/* fall through */
|
||||
|
||||
case FB_BLANK_NORMAL:
|
||||
ctrl |= SM501_DC_CRT_CONTROL_BLANK;
|
||||
|
@ -1889,6 +1890,9 @@ static void sm501_free_init_fb(struct sm501fb_info *info,
|
|||
{
|
||||
struct fb_info *fbi = info->fb[head];
|
||||
|
||||
if (!fbi)
|
||||
return;
|
||||
|
||||
fb_dealloc_cmap(&fbi->cmap);
|
||||
}
|
||||
|
||||
|
@ -2076,8 +2080,10 @@ static int sm501fb_remove(struct platform_device *pdev)
|
|||
sm501_free_init_fb(info, HEAD_CRT);
|
||||
sm501_free_init_fb(info, HEAD_PANEL);
|
||||
|
||||
unregister_framebuffer(fbinfo_crt);
|
||||
unregister_framebuffer(fbinfo_pnl);
|
||||
if (fbinfo_crt)
|
||||
unregister_framebuffer(fbinfo_crt);
|
||||
if (fbinfo_pnl)
|
||||
unregister_framebuffer(fbinfo_pnl);
|
||||
|
||||
sm501fb_stop(info);
|
||||
kfree(info);
|
||||
|
@ -2094,8 +2100,12 @@ static int sm501fb_suspend_fb(struct sm501fb_info *info,
|
|||
enum sm501_controller head)
|
||||
{
|
||||
struct fb_info *fbi = info->fb[head];
|
||||
struct sm501fb_par *par = fbi->par;
|
||||
struct sm501fb_par *par;
|
||||
|
||||
if (!fbi)
|
||||
return 0;
|
||||
|
||||
par = fbi->par;
|
||||
if (par->screen.size == 0)
|
||||
return 0;
|
||||
|
||||
|
@ -2141,8 +2151,12 @@ static void sm501fb_resume_fb(struct sm501fb_info *info,
|
|||
enum sm501_controller head)
|
||||
{
|
||||
struct fb_info *fbi = info->fb[head];
|
||||
struct sm501fb_par *par = fbi->par;
|
||||
struct sm501fb_par *par;
|
||||
|
||||
if (!fbi)
|
||||
return;
|
||||
|
||||
par = fbi->par;
|
||||
if (par->screen.size == 0)
|
||||
return;
|
||||
|
||||
|
|
|
@ -769,11 +769,11 @@ static int dlfb_get_edid(struct dlfb_data *dev, char *edid, int len)
|
|||
|
||||
for (i = 0; i < len; i++) {
|
||||
ret = usb_control_msg(dev->udev,
|
||||
usb_rcvctrlpipe(dev->udev, 0), (0x02),
|
||||
(0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2,
|
||||
HZ);
|
||||
if (ret < 1) {
|
||||
pr_err("Read EDID byte %d failed err %x\n", i, ret);
|
||||
usb_rcvctrlpipe(dev->udev, 0), 0x02,
|
||||
(0x80 | (0x02 << 5)), i << 8, 0xA1,
|
||||
rbuf, 2, USB_CTRL_GET_TIMEOUT);
|
||||
if (ret < 2) {
|
||||
pr_err("Read EDID byte %d failed: %d\n", i, ret);
|
||||
i--;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* $Id: iga.h,v 1.2 1999/09/11 22:56:31 zaitcev Exp $
|
||||
* iga1682.h: Sparc/PCI iga1682 driver constants etc.
|
||||
*
|
||||
* Copyleft 1998 V. Roganov and G. Raiko
|
||||
*/
|
||||
|
||||
#ifndef _IGA1682_H
|
||||
#define _IGA1682_H 1
|
||||
|
||||
#define IGA_ATTR_CTL 0x3C0
|
||||
#define IGA_IDX_VGA_OVERSCAN 0x11
|
||||
#define DAC_W_INDEX 0x03C8
|
||||
#define DAC_DATA 0x03C9
|
||||
#define IGA_EXT_CNTRL 0x3CE
|
||||
#define IGA_IDX_EXT_BUS_CNTL 0x30
|
||||
#define MEM_SIZE_ALIAS 0x3
|
||||
#define MEM_SIZE_1M 0x0
|
||||
#define MEM_SIZE_2M 0x1
|
||||
#define MEM_SIZE_4M 0x2
|
||||
#define MEM_SIZE_RESERVED 0x3
|
||||
#define IGA_IDX_OVERSCAN_COLOR 0x58
|
||||
#define IGA_IDX_EXT_MEM_2 0x72
|
||||
|
||||
#endif /* !(_IGA1682_H) */
|
Загрузка…
Ссылка в новой задаче