fbdev changes for v5.3:
- remove fbdev notifier usage for fbcon (as prep work to clean up the fbcon locking), add locking checks in vt/console code and make assorted cleanups in fbdev and backlight code (Daniel Vetter) - add COMPILE_TEST support to atmel_lcdfb, da8xx-fb, gbefb, imxfb, pvr2fb and pxa168fb drivers (me) - fix DMA API abuse in au1200fb and jz4740_fb drivers (Christoph Hellwig) - add check for new BGRT status field rotation bits in efifb driver (Hans de Goede) - mark expected switch fall-throughs in s3c-fb driver (Gustavo A. R. Silva) - remove fbdev mxsfb driver in favour of the drm version (Fabio Estevam) - remove broken rfbi code from omap2fb driver (me) - misc fixes (Arnd Bergmann, Shobhit Kukreti, Wei Yongjun, me) - misc cleanups (Gustavo A. R. Silva, Colin Ian King, me) -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJdJIqIAAoJEH4ztj+gR8IL3vAP/2brrEw/t42O2IPj35rgzjKX IPLw60Z3Q5jPaXbeJfeBgjesHWp0E/Cx1V4Yhh/5m4skhKg3lScJ7HV1Yra3SxbF ZDmpvFoHrdTw2V6I3IuSfmOqRCLo7ws9E3gfBWdmpg32FQbVCOAFBeGp1AAjXigL IBuc73B4jXVWU4IejMHpP5DssK2UBdmmXCGjnRR1OpPcBjDs2vCx6QtyBZtAm032 3Ol/T4f1KrAyUEfRtwxVTDdVmUoViT6914fbcRkSjjNDy1St4hngnfFGSRX/A9TC mr6VH4o/J7OAev0clnmp/8SxXXsu4CXubrPSP0TbNujHP0CudA8L/XefrMGxZlyu eLAWzQMv0qoiFQQEAlayw2aOKx77ed3Zay71SHbopbYSLXfTwHMa6CFxsvNSR/WY 67tDw6/wqqMNCjB8U8B5EFddtiRQrDeykEInS9QTIJ3lJzl77kmFnmbdq+Pi6rAs y+M5UzyWCnChIPezb0Ix2HLEjyhy0e942Hu9BtUJa9YPskxDY3RkyaZ/YcfB8bGW +wmcVnBQfTJIn+BVlvHGhRcxGLhYqNs5JyzJbFWB/UhsGleFAsjBWgkoYjgg9oWG qvcP0m6n96ozrpoExhX6osJoHZ7uRZpllP2whQpYCJ1VyQcgrQbV0dcJd2uh26CD w3ne+HXsIjiStDxbeAIS =W1AD -----END PGP SIGNATURE----- Merge tag 'fbdev-v5.3' of git://github.com/bzolnier/linux Pull fbdev updates from Bartlomiej Zolnierkiewicz: - remove fbdev notifier usage for fbcon (as prep work to clean up the fbcon locking), add locking checks in vt/console code and make assorted cleanups in fbdev and backlight code (Daniel Vetter) - add COMPILE_TEST support to atmel_lcdfb, da8xx-fb, gbefb, imxfb, pvr2fb and pxa168fb drivers (me) - fix DMA API abuse in au1200fb and jz4740_fb drivers (Christoph Hellwig) - add check for new BGRT status field rotation bits in efifb driver (Hans de Goede) - mark expected switch fall-throughs in s3c-fb driver (Gustavo A. R. Silva) - remove fbdev mxsfb driver in favour of the drm version (Fabio Estevam) - remove broken rfbi code from omap2fb driver (me) - misc fixes (Arnd Bergmann, Shobhit Kukreti, Wei Yongjun, me) - misc cleanups (Gustavo A. R. Silva, Colin Ian King, me) * tag 'fbdev-v5.3' of git://github.com/bzolnier/linux: (62 commits) video: fbdev: imxfb: fix a typo in imxfb_probe() video: fbdev: s3c-fb: Mark expected switch fall-throughs video: fbdev: s3c-fb: fix sparse warnings about using incorrect types video: fbdev: don't print error message on framebuffer_alloc() failure video: fbdev: intelfb: return -ENOMEM on framebuffer_alloc() failure video: fbdev: s3c-fb: return -ENOMEM on framebuffer_alloc() failure vga_switcheroo: Depend upon fbcon being built-in, if enabled video: fbdev: omap2: remove rfbi video: fbdev: atmel_lcdfb: remove redundant initialization to variable ret video: fbdev-MMP: Use struct_size() in devm_kzalloc() video: fbdev: controlfb: fix warnings about comparing pointer to 0 efifb: BGRT: Add check for new BGRT status field rotation bits jz4740_fb: fix DMA API abuse video: fbdev: pvr2fb: fix link error for pvr2fb_pci_exit video: fbdev: s3c-fb: add COMPILE_TEST support video: fbdev: imxfb: fix sparse warnings about using incorrect types video: fbdev: pvr2fb: fix build warning when compiling as module fbcon: Export fbcon_update_vcs backlight: simplify lcd notifier staging/olpc_dcon: Add drm conversion to TODO ...
This commit is contained in:
commit
2d41ef5432
|
@ -347,8 +347,17 @@ int __init am200_init(void)
|
|||
{
|
||||
int ret;
|
||||
|
||||
/* before anything else, we request notification for any fb
|
||||
* creation events */
|
||||
/*
|
||||
* Before anything else, we request notification for any fb
|
||||
* creation events.
|
||||
*
|
||||
* FIXME: This is terrible and needs to be nuked. The notifier is used
|
||||
* to get at the fb base address from the boot splash fb driver, which
|
||||
* is then passed to metronomefb. Instaed of metronomfb or this board
|
||||
* support file here figuring this out on their own.
|
||||
*
|
||||
* See also the #ifdef in fbmem.c.
|
||||
*/
|
||||
fb_register_client(&am200_fb_notif);
|
||||
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(am200_pin_config));
|
||||
|
|
|
@ -23,6 +23,7 @@ config VGA_SWITCHEROO
|
|||
depends on X86
|
||||
depends on ACPI
|
||||
depends on PCI
|
||||
depends on (FRAMEBUFFER_CONSOLE=n || FB=y)
|
||||
select VGA_ARB
|
||||
help
|
||||
Many laptops released in 2008/9/10 have two GPUs with a multiplexer
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <linux/debugfs.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/fbcon.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pm_domain.h>
|
||||
|
@ -736,14 +737,8 @@ static int vga_switchto_stage2(struct vga_switcheroo_client *new_client)
|
|||
if (!active->driver_power_control)
|
||||
set_audio_state(active->id, VGA_SWITCHEROO_OFF);
|
||||
|
||||
if (new_client->fb_info) {
|
||||
struct fb_event event;
|
||||
|
||||
console_lock();
|
||||
event.info = new_client->fb_info;
|
||||
fb_notifier_call_chain(FB_EVENT_REMAP_ALL_CONSOLE, &event);
|
||||
console_unlock();
|
||||
}
|
||||
if (new_client->fb_info)
|
||||
fbcon_remap_all(new_client->fb_info);
|
||||
|
||||
mutex_lock(&vgasr_priv.mux_hw_lock);
|
||||
ret = vgasr_priv.handler->switchto(new_client->id);
|
||||
|
|
|
@ -512,10 +512,8 @@ int picolcd_init_framebuffer(struct picolcd_data *data)
|
|||
sizeof(struct fb_deferred_io) +
|
||||
sizeof(struct picolcd_fb_data) +
|
||||
PICOLCDFB_SIZE, dev);
|
||||
if (info == NULL) {
|
||||
dev_err(dev, "failed to allocate a framebuffer\n");
|
||||
if (!info)
|
||||
goto err_nomem;
|
||||
}
|
||||
|
||||
info->fbdefio = info->par;
|
||||
*info->fbdefio = picolcd_fb_defio;
|
||||
|
|
|
@ -1256,11 +1256,7 @@ static int ivtvfb_callback_cleanup(struct device *dev, void *p)
|
|||
itv->streams[IVTV_DEC_STREAM_TYPE_MPG].vdev.device_caps &=
|
||||
~V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
|
||||
itv->v4l2_cap &= ~V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
|
||||
if (unregister_framebuffer(&itv->osd_info->ivtvfb_info)) {
|
||||
IVTVFB_WARN("Framebuffer %d is in use, cannot unload\n",
|
||||
itv->instance);
|
||||
return 0;
|
||||
}
|
||||
unregister_framebuffer(&itv->osd_info->ivtvfb_info);
|
||||
IVTVFB_INFO("Unregister framebuffer %d\n", itv->instance);
|
||||
itv->ivtvfb_restore = NULL;
|
||||
ivtvfb_blank(FB_BLANK_VSYNC_SUSPEND, &oi->ivtvfb_info);
|
||||
|
|
|
@ -891,7 +891,9 @@ int fbtft_unregister_framebuffer(struct fb_info *fb_info)
|
|||
if (par->fbtftops.unregister_backlight)
|
||||
par->fbtftops.unregister_backlight(par);
|
||||
fbtft_sysfs_exit(par);
|
||||
return unregister_framebuffer(fb_info);
|
||||
unregister_framebuffer(fb_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(fbtft_unregister_framebuffer);
|
||||
|
||||
|
|
|
@ -1,4 +1,11 @@
|
|||
TODO:
|
||||
- complete rewrite:
|
||||
1. The underlying fbdev drivers need to be converted into drm kernel
|
||||
modesetting drivers.
|
||||
2. The dcon low-power display mode can then be integrated using the
|
||||
drm damage tracking and self-refresh helpers.
|
||||
This bolted-on self-refresh support that digs around in fbdev
|
||||
internals, but isn't properly integrated, is not the correct solution.
|
||||
- see if vx855 gpio API can be made similar enough to cs5535 so we can
|
||||
share more code
|
||||
- convert all uses of the old GPIO API from <linux/gpio.h> to the
|
||||
|
|
|
@ -250,11 +250,7 @@ static bool dcon_blank_fb(struct dcon_priv *dcon, bool blank)
|
|||
int err;
|
||||
|
||||
console_lock();
|
||||
if (!lock_fb_info(dcon->fbinfo)) {
|
||||
console_unlock();
|
||||
dev_err(&dcon->client->dev, "unable to lock framebuffer\n");
|
||||
return false;
|
||||
}
|
||||
lock_fb_info(dcon->fbinfo);
|
||||
|
||||
dcon->ignore_fb_events = true;
|
||||
err = fb_blank(dcon->fbinfo,
|
||||
|
|
|
@ -3822,6 +3822,8 @@ int con_is_bound(const struct consw *csw)
|
|||
{
|
||||
int i, bound = 0;
|
||||
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
|
||||
for (i = 0; i < MAX_NR_CONSOLES; i++) {
|
||||
if (con_driver_map[i] == csw) {
|
||||
bound = 1;
|
||||
|
@ -3833,6 +3835,20 @@ int con_is_bound(const struct consw *csw)
|
|||
}
|
||||
EXPORT_SYMBOL(con_is_bound);
|
||||
|
||||
/**
|
||||
* con_is_visible - checks whether the current console is visible
|
||||
* @vc: virtual console
|
||||
*
|
||||
* RETURNS: zero if not visible, nonzero if visible
|
||||
*/
|
||||
bool con_is_visible(const struct vc_data *vc)
|
||||
{
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
|
||||
return *vc->vc_display_fg == vc;
|
||||
}
|
||||
EXPORT_SYMBOL(con_is_visible);
|
||||
|
||||
/**
|
||||
* con_debug_enter - prepare the console for the kernel debugger
|
||||
* @sw: console driver
|
||||
|
@ -4166,6 +4182,8 @@ void do_blank_screen(int entering_gfx)
|
|||
struct vc_data *vc = vc_cons[fg_console].d;
|
||||
int i;
|
||||
|
||||
might_sleep();
|
||||
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
|
||||
if (console_blanked) {
|
||||
|
|
|
@ -47,7 +47,7 @@ static int fb_notifier_callback(struct notifier_block *self,
|
|||
int fb_blank = 0;
|
||||
|
||||
/* If we aren't interested in this event, skip it immediately ... */
|
||||
if (event != FB_EVENT_BLANK && event != FB_EVENT_CONBLANK)
|
||||
if (event != FB_EVENT_BLANK)
|
||||
return 0;
|
||||
|
||||
bd = container_of(self, struct backlight_device, fb_notif);
|
||||
|
|
|
@ -30,18 +30,6 @@ static int fb_notifier_callback(struct notifier_block *self,
|
|||
struct lcd_device *ld;
|
||||
struct fb_event *evdata = data;
|
||||
|
||||
/* If we aren't interested in this event, skip it immediately ... */
|
||||
switch (event) {
|
||||
case FB_EVENT_BLANK:
|
||||
case FB_EVENT_MODE_CHANGE:
|
||||
case FB_EVENT_MODE_CHANGE_ALL:
|
||||
case FB_EARLY_EVENT_BLANK:
|
||||
case FB_R_EARLY_EVENT_BLANK:
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
ld = container_of(self, struct lcd_device, fb_notif);
|
||||
if (!ld->ops)
|
||||
return 0;
|
||||
|
|
|
@ -34,6 +34,8 @@ static bool dummycon_putc_called;
|
|||
|
||||
void dummycon_register_output_notifier(struct notifier_block *nb)
|
||||
{
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
|
||||
raw_notifier_chain_register(&dummycon_output_nh, nb);
|
||||
|
||||
if (dummycon_putc_called)
|
||||
|
@ -42,11 +44,15 @@ void dummycon_register_output_notifier(struct notifier_block *nb)
|
|||
|
||||
void dummycon_unregister_output_notifier(struct notifier_block *nb)
|
||||
{
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
|
||||
raw_notifier_chain_unregister(&dummycon_output_nh, nb);
|
||||
}
|
||||
|
||||
static void dummycon_putc(struct vc_data *vc, int c, int ypos, int xpos)
|
||||
{
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
|
||||
dummycon_putc_called = true;
|
||||
raw_notifier_call_chain(&dummycon_output_nh, 0, NULL);
|
||||
}
|
||||
|
|
|
@ -332,7 +332,8 @@ config FB_SA1100
|
|||
|
||||
config FB_IMX
|
||||
tristate "Freescale i.MX1/21/25/27 LCD support"
|
||||
depends on FB && ARCH_MXC
|
||||
depends on FB && HAVE_CLK && HAS_IOMEM
|
||||
depends on ARCH_MXC || COMPILE_TEST
|
||||
select LCD_CLASS_DEVICE
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
|
@ -670,7 +671,8 @@ config FB_HGA
|
|||
|
||||
config FB_GBE
|
||||
bool "SGI Graphics Backend frame buffer support"
|
||||
depends on (FB = y) && SGI_IP32
|
||||
depends on (FB = y) && HAS_IOMEM
|
||||
depends on SGI_IP32 || COMPILE_TEST
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
|
@ -808,7 +810,8 @@ config FB_XVR1000
|
|||
|
||||
config FB_PVR2
|
||||
tristate "NEC PowerVR 2 display support"
|
||||
depends on FB && SH_DREAMCAST
|
||||
depends on FB && HAS_IOMEM
|
||||
depends on SH_DREAMCAST || COMPILE_TEST
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
|
@ -856,7 +859,8 @@ config FB_S1D13XXX
|
|||
|
||||
config FB_ATMEL
|
||||
tristate "AT91 LCD Controller support"
|
||||
depends on FB && OF && HAVE_FB_ATMEL
|
||||
depends on FB && OF && HAVE_CLK && HAS_IOMEM
|
||||
depends on HAVE_FB_ATMEL || COMPILE_TEST
|
||||
select FB_BACKLIGHT
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
|
@ -1729,7 +1733,8 @@ config FB_68328
|
|||
|
||||
config FB_PXA168
|
||||
tristate "PXA168/910 LCD framebuffer support"
|
||||
depends on FB && (CPU_PXA168 || CPU_PXA910)
|
||||
depends on FB && HAVE_CLK && HAS_IOMEM
|
||||
depends on CPU_PXA168 || CPU_PXA910 || COMPILE_TEST
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
|
@ -1873,7 +1878,8 @@ config FB_TMIO_ACCELL
|
|||
|
||||
config FB_S3C
|
||||
tristate "Samsung S3C framebuffer support"
|
||||
depends on FB && (CPU_S3C2416 || ARCH_S3C64XX)
|
||||
depends on FB && HAVE_CLK && HAS_IOMEM
|
||||
depends on (CPU_S3C2416 || ARCH_S3C64XX) || COMPILE_TEST
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
|
@ -2055,7 +2061,8 @@ config FB_SH7760
|
|||
|
||||
config FB_DA8XX
|
||||
tristate "DA8xx/OMAP-L1xx/AM335x Framebuffer support"
|
||||
depends on FB && (ARCH_DAVINCI_DA8XX || SOC_AM33XX)
|
||||
depends on FB && HAVE_CLK && HAS_IOMEM
|
||||
depends on ARCH_DAVINCI_DA8XX || SOC_AM33XX || COMPILE_TEST
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
|
@ -2172,7 +2179,7 @@ config FB_EP93XX
|
|||
|
||||
config FB_PRE_INIT_FB
|
||||
bool "Don't reinitialize, use bootloader's GDC/Display configuration"
|
||||
depends on FB && (FB_MB862XX_LIME || FB_MXS)
|
||||
depends on FB && FB_MB862XX_LIME
|
||||
---help---
|
||||
Select this option if display contents should be inherited as set by
|
||||
the bootloader.
|
||||
|
@ -2213,17 +2220,6 @@ config FB_JZ4740
|
|||
help
|
||||
Framebuffer support for the JZ4740 SoC.
|
||||
|
||||
config FB_MXS
|
||||
tristate "MXS LCD framebuffer support"
|
||||
depends on FB && (ARCH_MXS || ARCH_MXC)
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
select FB_MODE_HELPERS
|
||||
select VIDEOMODE_HELPERS
|
||||
help
|
||||
Framebuffer support for the MXS SoC.
|
||||
|
||||
config FB_PUV3_UNIGFX
|
||||
tristate "PKUnity v3 Unigfx framebuffer support"
|
||||
depends on FB && UNICORE32 && ARCH_PUV3
|
||||
|
|
|
@ -131,7 +131,6 @@ obj-$(CONFIG_FB_VGA16) += vga16fb.o
|
|||
obj-$(CONFIG_FB_OF) += offb.o
|
||||
obj-$(CONFIG_FB_MX3) += mx3fb.o
|
||||
obj-$(CONFIG_FB_DA8XX) += da8xx-fb.o
|
||||
obj-$(CONFIG_FB_MXS) += mxsfb.o
|
||||
obj-$(CONFIG_FB_SSD1307) += ssd1307fb.o
|
||||
obj-$(CONFIG_FB_SIMPLE) += simplefb.o
|
||||
|
||||
|
|
|
@ -3554,10 +3554,8 @@ static int __init amifb_probe(struct platform_device *pdev)
|
|||
custom.dmacon = DMAF_ALL | DMAF_MASTER;
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct amifb_par), &pdev->dev);
|
||||
if (!info) {
|
||||
dev_err(&pdev->dev, "framebuffer_alloc failed\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
strcpy(info->fix.id, "Amiga ");
|
||||
info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
|
||||
|
|
|
@ -954,10 +954,8 @@ static int ark_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
|
||||
/* Allocate and fill driver data structure */
|
||||
info = framebuffer_alloc(sizeof(struct arkfb_info), &(dev->dev));
|
||||
if (! info) {
|
||||
dev_err(&(dev->dev), "cannot allocate memory\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
mutex_init(&par->open_lock);
|
||||
|
|
|
@ -77,29 +77,8 @@
|
|||
#define SWITCH_SND7 0x80
|
||||
#define SWITCH_NONE 0x00
|
||||
|
||||
|
||||
#define up(x, r) (((x) + (r) - 1) & ~((r)-1))
|
||||
|
||||
/*
|
||||
* Interface to the world
|
||||
*/
|
||||
|
||||
static int atafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info);
|
||||
static int atafb_set_par(struct fb_info *info);
|
||||
static int atafb_setcolreg(unsigned int regno, unsigned int red, unsigned int green,
|
||||
unsigned int blue, unsigned int transp,
|
||||
struct fb_info *info);
|
||||
static int atafb_blank(int blank, struct fb_info *info);
|
||||
static int atafb_pan_display(struct fb_var_screeninfo *var,
|
||||
struct fb_info *info);
|
||||
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 *region);
|
||||
static void atafb_imageblit(struct fb_info *info, const struct fb_image *image);
|
||||
static int atafb_ioctl(struct fb_info *info, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
|
||||
|
||||
static int default_par; /* default resolution (0=none) */
|
||||
|
||||
|
|
|
@ -673,7 +673,7 @@ static int atmel_lcdfb_set_par(struct fb_info *info)
|
|||
lcdc_writel(sinfo, ATMEL_LCDC_MVAL, 0);
|
||||
|
||||
/* Disable all interrupts */
|
||||
lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0UL);
|
||||
lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0U);
|
||||
/* Enable FIFO & DMA errors */
|
||||
lcdc_writel(sinfo, ATMEL_LCDC_IER, ATMEL_LCDC_UFLWI | ATMEL_LCDC_OWRI | ATMEL_LCDC_MERI);
|
||||
|
||||
|
@ -950,7 +950,7 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo)
|
|||
struct fb_videomode fb_vm;
|
||||
struct gpio_desc *gpiod;
|
||||
struct videomode vm;
|
||||
int ret = -ENOENT;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
sinfo->config = (struct atmel_lcdfb_config*)
|
||||
|
@ -1053,10 +1053,8 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
|
|||
|
||||
ret = -ENOMEM;
|
||||
info = framebuffer_alloc(sizeof(struct atmel_lcdfb_info), dev);
|
||||
if (!info) {
|
||||
dev_err(dev, "cannot allocate memory\n");
|
||||
if (!info)
|
||||
goto out;
|
||||
}
|
||||
|
||||
sinfo = info->par;
|
||||
sinfo->pdev = pdev;
|
||||
|
@ -1291,7 +1289,7 @@ static int atmel_lcdfb_suspend(struct platform_device *pdev, pm_message_t mesg)
|
|||
* We don't want to handle interrupts while the clock is
|
||||
* stopped. It may take forever.
|
||||
*/
|
||||
lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0UL);
|
||||
lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0U);
|
||||
|
||||
sinfo->saved_lcdcon = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_CTR);
|
||||
lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, 0);
|
||||
|
|
|
@ -2103,10 +2103,9 @@ static int aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
|
||||
/* We have the resources. Now virtualize them */
|
||||
info = framebuffer_alloc(sizeof(struct aty128fb_par), &pdev->dev);
|
||||
if (info == NULL) {
|
||||
printk(KERN_ERR "aty128fb: can't alloc fb_info_aty128\n");
|
||||
if (!info)
|
||||
goto err_free_mmio;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
|
||||
info->pseudo_palette = par->pseudo_palette;
|
||||
|
@ -2350,70 +2349,6 @@ static int aty128fb_ioctl(struct fb_info *info, u_int cmd, u_long arg)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Accelerated functions
|
||||
*/
|
||||
|
||||
static inline void aty128_rectcopy(int srcx, int srcy, int dstx, int dsty,
|
||||
u_int width, u_int height,
|
||||
struct fb_info_aty128 *par)
|
||||
{
|
||||
u32 save_dp_datatype, save_dp_cntl, dstval;
|
||||
|
||||
if (!width || !height)
|
||||
return;
|
||||
|
||||
dstval = depth_to_dst(par->current_par.crtc.depth);
|
||||
if (dstval == DST_24BPP) {
|
||||
srcx *= 3;
|
||||
dstx *= 3;
|
||||
width *= 3;
|
||||
} else if (dstval == -EINVAL) {
|
||||
printk("aty128fb: invalid depth or RGBA\n");
|
||||
return;
|
||||
}
|
||||
|
||||
wait_for_fifo(2, par);
|
||||
save_dp_datatype = aty_ld_le32(DP_DATATYPE);
|
||||
save_dp_cntl = aty_ld_le32(DP_CNTL);
|
||||
|
||||
wait_for_fifo(6, par);
|
||||
aty_st_le32(SRC_Y_X, (srcy << 16) | srcx);
|
||||
aty_st_le32(DP_MIX, ROP3_SRCCOPY | DP_SRC_RECT);
|
||||
aty_st_le32(DP_CNTL, DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM);
|
||||
aty_st_le32(DP_DATATYPE, save_dp_datatype | dstval | SRC_DSTCOLOR);
|
||||
|
||||
aty_st_le32(DST_Y_X, (dsty << 16) | dstx);
|
||||
aty_st_le32(DST_HEIGHT_WIDTH, (height << 16) | width);
|
||||
|
||||
par->blitter_may_be_busy = 1;
|
||||
|
||||
wait_for_fifo(2, par);
|
||||
aty_st_le32(DP_DATATYPE, save_dp_datatype);
|
||||
aty_st_le32(DP_CNTL, save_dp_cntl);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Text mode accelerated functions
|
||||
*/
|
||||
|
||||
static void fbcon_aty128_bmove(struct display *p, int sy, int sx, int dy,
|
||||
int dx, int height, int width)
|
||||
{
|
||||
sx *= fontwidth(p);
|
||||
sy *= fontheight(p);
|
||||
dx *= fontwidth(p);
|
||||
dy *= fontheight(p);
|
||||
width *= fontwidth(p);
|
||||
height *= fontheight(p);
|
||||
|
||||
aty128_rectcopy(sx, sy, dx, dy, width, height,
|
||||
(struct fb_info_aty128 *)p->fb_info);
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
static void aty128_set_suspend(struct aty128fb_par *par, int suspend)
|
||||
{
|
||||
u32 pmgt;
|
||||
|
|
|
@ -3550,10 +3550,9 @@ static int atyfb_pci_probe(struct pci_dev *pdev,
|
|||
|
||||
/* Allocate framebuffer */
|
||||
info = framebuffer_alloc(sizeof(struct atyfb_par), &pdev->dev);
|
||||
if (!info) {
|
||||
PRINTKE("atyfb_pci_probe() can't alloc fb_info\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
par->bus_type = PCI;
|
||||
info->fix = atyfb_fix;
|
||||
|
@ -3643,10 +3642,9 @@ static int __init atyfb_atari_probe(void)
|
|||
}
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct atyfb_par), NULL);
|
||||
if (!info) {
|
||||
PRINTKE("atyfb_atari_probe() can't alloc fb_info\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
|
||||
info->fix = atyfb_fix;
|
||||
|
@ -3916,8 +3914,7 @@ static int atyfb_reboot_notify(struct notifier_block *nb,
|
|||
if (!reboot_info)
|
||||
goto out;
|
||||
|
||||
if (!lock_fb_info(reboot_info))
|
||||
goto out;
|
||||
lock_fb_info(reboot_info);
|
||||
|
||||
par = reboot_info->par;
|
||||
|
||||
|
|
|
@ -2294,8 +2294,6 @@ static int radeonfb_pci_register(struct pci_dev *pdev,
|
|||
|
||||
info = framebuffer_alloc(sizeof(struct radeonfb_info), &pdev->dev);
|
||||
if (!info) {
|
||||
printk (KERN_ERR "radeonfb (%s): could not allocate memory\n",
|
||||
pci_name(pdev));
|
||||
ret = -ENOMEM;
|
||||
goto err_disable;
|
||||
}
|
||||
|
|
|
@ -147,6 +147,7 @@ struct au1200_lcd_iodata_t {
|
|||
struct au1200fb_device {
|
||||
struct fb_info *fb_info; /* FB driver info record */
|
||||
struct au1200fb_platdata *pd;
|
||||
struct device *dev;
|
||||
|
||||
int plane;
|
||||
unsigned char* fb_mem; /* FrameBuffer memory map */
|
||||
|
@ -1232,10 +1233,8 @@ static int au1200fb_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
|||
{
|
||||
struct au1200fb_device *fbdev = info->par;
|
||||
|
||||
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
||||
pgprot_val(vma->vm_page_prot) |= _CACHE_MASK; /* CCA=7 */
|
||||
|
||||
return vm_iomap_memory(vma, fbdev->fb_phys, fbdev->fb_len);
|
||||
return dma_mmap_attrs(fbdev->dev, vma, fbdev->fb_mem, fbdev->fb_phys,
|
||||
fbdev->fb_len, DMA_ATTR_NON_CONSISTENT);
|
||||
}
|
||||
|
||||
static void set_global(u_int cmd, struct au1200_lcd_global_regs_t *pdata)
|
||||
|
@ -1647,7 +1646,6 @@ static int au1200fb_drv_probe(struct platform_device *dev)
|
|||
struct au1200fb_device *fbdev;
|
||||
struct au1200fb_platdata *pd;
|
||||
struct fb_info *fbi = NULL;
|
||||
unsigned long page;
|
||||
int bpp, plane, ret, irq;
|
||||
|
||||
print_info("" DRIVER_DESC "");
|
||||
|
@ -1685,6 +1683,7 @@ static int au1200fb_drv_probe(struct platform_device *dev)
|
|||
fbdev = fbi->par;
|
||||
fbdev->fb_info = fbi;
|
||||
fbdev->pd = pd;
|
||||
fbdev->dev = &dev->dev;
|
||||
|
||||
fbdev->plane = plane;
|
||||
|
||||
|
@ -1702,16 +1701,6 @@ static int au1200fb_drv_probe(struct platform_device *dev)
|
|||
goto failed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set page reserved so that mmap will work. This is necessary
|
||||
* since we'll be remapping normal memory.
|
||||
*/
|
||||
for (page = (unsigned long)fbdev->fb_phys;
|
||||
page < PAGE_ALIGN((unsigned long)fbdev->fb_phys +
|
||||
fbdev->fb_len);
|
||||
page += PAGE_SIZE) {
|
||||
SetPageReserved(pfn_to_page(page >> PAGE_SHIFT)); /* LCD DMA is NOT coherent on Au1200 */
|
||||
}
|
||||
print_dbg("Framebuffer memory map at %p", fbdev->fb_mem);
|
||||
print_dbg("phys=0x%08x, size=%dK", fbdev->fb_phys, fbdev->fb_len / 1024);
|
||||
|
||||
|
|
|
@ -366,7 +366,6 @@ static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent)
|
|||
|
||||
p = framebuffer_alloc(0, &dp->dev);
|
||||
if (p == NULL) {
|
||||
dev_err(&dp->dev, "Cannot allocate framebuffer structure\n");
|
||||
rc = -ENOMEM;
|
||||
goto err_disable;
|
||||
}
|
||||
|
|
|
@ -2093,7 +2093,6 @@ static int cirrusfb_pci_register(struct pci_dev *pdev,
|
|||
|
||||
info = framebuffer_alloc(sizeof(struct cirrusfb_info), &pdev->dev);
|
||||
if (!info) {
|
||||
printk(KERN_ERR "cirrusfb: could not allocate memory\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_out;
|
||||
}
|
||||
|
@ -2206,10 +2205,8 @@ static int cirrusfb_zorro_register(struct zorro_dev *z,
|
|||
struct cirrusfb_info *cinfo;
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct cirrusfb_info), &z->dev);
|
||||
if (!info) {
|
||||
printk(KERN_ERR "cirrusfb: could not allocate memory\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
zcl = (const struct zorrocl *)ent->driver_data;
|
||||
btype = zcl->type;
|
||||
|
|
|
@ -182,7 +182,7 @@ int init_module(void)
|
|||
int ret = -ENXIO;
|
||||
|
||||
dp = of_find_node_by_name(NULL, "control");
|
||||
if (dp != 0 && !control_of_init(dp))
|
||||
if (dp && !control_of_init(dp))
|
||||
ret = 0;
|
||||
of_node_put(dp);
|
||||
|
||||
|
@ -580,7 +580,7 @@ static int __init control_init(void)
|
|||
control_setup(option);
|
||||
|
||||
dp = of_find_node_by_name(NULL, "control");
|
||||
if (dp != 0 && !control_of_init(dp))
|
||||
if (dp && !control_of_init(dp))
|
||||
ret = 0;
|
||||
of_node_put(dp);
|
||||
|
||||
|
@ -683,8 +683,8 @@ static int __init control_of_init(struct device_node *dp)
|
|||
return -ENXIO;
|
||||
}
|
||||
p = kzalloc(sizeof(*p), GFP_KERNEL);
|
||||
if (p == 0)
|
||||
return -ENXIO;
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
control_fb = p; /* save it for cleanups */
|
||||
|
||||
/* Map in frame buffer and registers */
|
||||
|
|
|
@ -285,11 +285,7 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info)
|
|||
goto out;
|
||||
}
|
||||
umap.start = cmap->start;
|
||||
if (!lock_fb_info(info)) {
|
||||
rc = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
lock_fb_info(info);
|
||||
rc = fb_set_cmap(&umap, info);
|
||||
unlock_fb_info(info);
|
||||
out:
|
||||
|
|
|
@ -76,6 +76,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/crc32.h> /* For counting font checksums */
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/fb.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
|
@ -87,13 +88,32 @@
|
|||
# define DPRINTK(fmt, args...)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* FIXME: Locking
|
||||
*
|
||||
* - fbcon state itself is protected by the console_lock, and the code does a
|
||||
* pretty good job at making sure that lock is held everywhere it's needed.
|
||||
*
|
||||
* - access to the registered_fb array is entirely unprotected. This should use
|
||||
* proper object lifetime handling, i.e. get/put_fb_info. This also means
|
||||
* switching from indices to proper pointers for fb_info everywhere.
|
||||
*
|
||||
* - fbcon doesn't bother with fb_lock/unlock at all. This is buggy, since it
|
||||
* means concurrent access to the same fbdev from both fbcon and userspace
|
||||
* will blow up. To fix this all fbcon calls from fbmem.c need to be moved out
|
||||
* of fb_lock/unlock protected sections, since otherwise we'll recurse and
|
||||
* deadlock eventually. Aside: Due to these deadlock issues the fbdev code in
|
||||
* fbmem.c cannot use locking asserts, and there's lots of callers which get
|
||||
* the rules wrong, e.g. fbsysfs.c entirely missed fb_lock/unlock calls too.
|
||||
*/
|
||||
|
||||
enum {
|
||||
FBCON_LOGO_CANSHOW = -1, /* the logo can be shown */
|
||||
FBCON_LOGO_DRAW = -2, /* draw the logo to a console */
|
||||
FBCON_LOGO_DONTSHOW = -3 /* do not show the logo */
|
||||
};
|
||||
|
||||
static struct display fb_display[MAX_NR_CONSOLES];
|
||||
static struct fbcon_display fb_display[MAX_NR_CONSOLES];
|
||||
|
||||
static signed char con2fb_map[MAX_NR_CONSOLES];
|
||||
static signed char con2fb_map_boot[MAX_NR_CONSOLES];
|
||||
|
@ -112,7 +132,6 @@ static int softback_lines;
|
|||
static int first_fb_vc;
|
||||
static int last_fb_vc = MAX_NR_CONSOLES - 1;
|
||||
static int fbcon_is_default = 1;
|
||||
static int fbcon_has_exited;
|
||||
static int primary_device = -1;
|
||||
static int fbcon_has_console_bind;
|
||||
|
||||
|
@ -185,11 +204,11 @@ static __inline__ void ywrap_up(struct vc_data *vc, int count);
|
|||
static __inline__ void ywrap_down(struct vc_data *vc, int count);
|
||||
static __inline__ void ypan_up(struct vc_data *vc, int count);
|
||||
static __inline__ void ypan_down(struct vc_data *vc, int count);
|
||||
static void fbcon_bmove_rec(struct vc_data *vc, struct display *p, int sy, int sx,
|
||||
static void fbcon_bmove_rec(struct vc_data *vc, struct fbcon_display *p, int sy, int sx,
|
||||
int dy, int dx, int height, int width, u_int y_break);
|
||||
static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
|
||||
int unit);
|
||||
static void fbcon_redraw_move(struct vc_data *vc, struct display *p,
|
||||
static void fbcon_redraw_move(struct vc_data *vc, struct fbcon_display *p,
|
||||
int line, int count, int dy);
|
||||
static void fbcon_modechanged(struct fb_info *info);
|
||||
static void fbcon_set_all_vcs(struct fb_info *info);
|
||||
|
@ -220,7 +239,7 @@ static void fbcon_rotate(struct fb_info *info, u32 rotate)
|
|||
fb_info = registered_fb[con2fb_map[ops->currcon]];
|
||||
|
||||
if (info == fb_info) {
|
||||
struct display *p = &fb_display[ops->currcon];
|
||||
struct fbcon_display *p = &fb_display[ops->currcon];
|
||||
|
||||
if (rotate < 4)
|
||||
p->con_rotate = rotate;
|
||||
|
@ -235,7 +254,7 @@ static void fbcon_rotate_all(struct fb_info *info, u32 rotate)
|
|||
{
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct vc_data *vc;
|
||||
struct display *p;
|
||||
struct fbcon_display *p;
|
||||
int i;
|
||||
|
||||
if (!ops || ops->currcon < 0 || rotate > 3)
|
||||
|
@ -900,7 +919,7 @@ static int set_con2fb_map(int unit, int newidx, int user)
|
|||
* Low Level Operations
|
||||
*/
|
||||
/* NOTE: fbcon cannot be __init: it may be called from do_take_over_console later */
|
||||
static int var_to_display(struct display *disp,
|
||||
static int var_to_display(struct fbcon_display *disp,
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_info *info)
|
||||
{
|
||||
|
@ -925,7 +944,7 @@ static int var_to_display(struct display *disp,
|
|||
}
|
||||
|
||||
static void display_to_var(struct fb_var_screeninfo *var,
|
||||
struct display *disp)
|
||||
struct fbcon_display *disp)
|
||||
{
|
||||
fb_videomode_to_var(var, disp->mode);
|
||||
var->xres_virtual = disp->xres_virtual;
|
||||
|
@ -946,7 +965,7 @@ static void display_to_var(struct fb_var_screeninfo *var,
|
|||
static const char *fbcon_startup(void)
|
||||
{
|
||||
const char *display_desc = "frame buffer device";
|
||||
struct display *p = &fb_display[fg_console];
|
||||
struct fbcon_display *p = &fb_display[fg_console];
|
||||
struct vc_data *vc = vc_cons[fg_console].d;
|
||||
const struct font_desc *font = NULL;
|
||||
struct module *owner;
|
||||
|
@ -1050,23 +1069,26 @@ static const char *fbcon_startup(void)
|
|||
info->var.bits_per_pixel);
|
||||
|
||||
fbcon_add_cursor_timer(info);
|
||||
fbcon_has_exited = 0;
|
||||
return display_desc;
|
||||
}
|
||||
|
||||
static void fbcon_init(struct vc_data *vc, int init)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fb_info *info;
|
||||
struct fbcon_ops *ops;
|
||||
struct vc_data **default_mode = vc->vc_display_fg;
|
||||
struct vc_data *svc = *default_mode;
|
||||
struct display *t, *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *t, *p = &fb_display[vc->vc_num];
|
||||
int logo = 1, new_rows, new_cols, rows, cols, charcnt = 256;
|
||||
int cap, ret;
|
||||
|
||||
if (info_idx == -1 || info == NULL)
|
||||
if (WARN_ON(info_idx == -1))
|
||||
return;
|
||||
|
||||
if (con2fb_map[vc->vc_num] == -1)
|
||||
con2fb_map[vc->vc_num] = info_idx;
|
||||
|
||||
info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
cap = info->flags;
|
||||
|
||||
if (logo_shown < 0 && console_loglevel <= CONSOLE_LOGLEVEL_QUIET)
|
||||
|
@ -1203,7 +1225,7 @@ static void fbcon_init(struct vc_data *vc, int init)
|
|||
ops->p = &fb_display[fg_console];
|
||||
}
|
||||
|
||||
static void fbcon_free_font(struct display *p, bool freefont)
|
||||
static void fbcon_free_font(struct fbcon_display *p, bool freefont)
|
||||
{
|
||||
if (freefont && p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0))
|
||||
kfree(p->fontdata - FONT_EXTRA_WORDS * sizeof(int));
|
||||
|
@ -1215,7 +1237,7 @@ static void set_vc_hi_font(struct vc_data *vc, bool set);
|
|||
|
||||
static void fbcon_deinit(struct vc_data *vc)
|
||||
{
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
struct fb_info *info;
|
||||
struct fbcon_ops *ops;
|
||||
int idx;
|
||||
|
@ -1288,7 +1310,7 @@ static void fbcon_clear(struct vc_data *vc, int sy, int sx, int height,
|
|||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
u_int y_break;
|
||||
|
||||
if (fbcon_is_inactive(vc, info))
|
||||
|
@ -1324,7 +1346,7 @@ static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
|
|||
int count, int ypos, int xpos)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
|
||||
if (!fbcon_is_inactive(vc, info))
|
||||
|
@ -1388,7 +1410,7 @@ static int scrollback_current = 0;
|
|||
static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
|
||||
int unit)
|
||||
{
|
||||
struct display *p, *t;
|
||||
struct fbcon_display *p, *t;
|
||||
struct vc_data **default_mode, *vc;
|
||||
struct vc_data *svc;
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
|
@ -1457,7 +1479,7 @@ static __inline__ void ywrap_up(struct vc_data *vc, int count)
|
|||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
|
||||
p->yscroll += count;
|
||||
if (p->yscroll >= p->vrows) /* Deal with wrap */
|
||||
|
@ -1476,7 +1498,7 @@ static __inline__ void ywrap_down(struct vc_data *vc, int count)
|
|||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
|
||||
p->yscroll -= count;
|
||||
if (p->yscroll < 0) /* Deal with wrap */
|
||||
|
@ -1494,7 +1516,7 @@ static __inline__ void ywrap_down(struct vc_data *vc, int count)
|
|||
static __inline__ void ypan_up(struct vc_data *vc, int count)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
|
||||
p->yscroll += count;
|
||||
|
@ -1519,7 +1541,7 @@ static __inline__ void ypan_up_redraw(struct vc_data *vc, int t, int count)
|
|||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
|
||||
p->yscroll += count;
|
||||
|
||||
|
@ -1542,7 +1564,7 @@ static __inline__ void ypan_up_redraw(struct vc_data *vc, int t, int count)
|
|||
static __inline__ void ypan_down(struct vc_data *vc, int count)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
|
||||
p->yscroll -= count;
|
||||
|
@ -1567,7 +1589,7 @@ static __inline__ void ypan_down_redraw(struct vc_data *vc, int t, int count)
|
|||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
|
||||
p->yscroll -= count;
|
||||
|
||||
|
@ -1587,7 +1609,7 @@ static __inline__ void ypan_down_redraw(struct vc_data *vc, int t, int count)
|
|||
scrollback_current = 0;
|
||||
}
|
||||
|
||||
static void fbcon_redraw_softback(struct vc_data *vc, struct display *p,
|
||||
static void fbcon_redraw_softback(struct vc_data *vc, struct fbcon_display *p,
|
||||
long delta)
|
||||
{
|
||||
int count = vc->vc_rows;
|
||||
|
@ -1680,7 +1702,7 @@ static void fbcon_redraw_softback(struct vc_data *vc, struct display *p,
|
|||
}
|
||||
}
|
||||
|
||||
static void fbcon_redraw_move(struct vc_data *vc, struct display *p,
|
||||
static void fbcon_redraw_move(struct vc_data *vc, struct fbcon_display *p,
|
||||
int line, int count, int dy)
|
||||
{
|
||||
unsigned short *s = (unsigned short *)
|
||||
|
@ -1715,7 +1737,7 @@ static void fbcon_redraw_move(struct vc_data *vc, struct display *p,
|
|||
}
|
||||
|
||||
static void fbcon_redraw_blit(struct vc_data *vc, struct fb_info *info,
|
||||
struct display *p, int line, int count, int ycount)
|
||||
struct fbcon_display *p, int line, int count, int ycount)
|
||||
{
|
||||
int offset = ycount * vc->vc_cols;
|
||||
unsigned short *d = (unsigned short *)
|
||||
|
@ -1764,7 +1786,7 @@ static void fbcon_redraw_blit(struct vc_data *vc, struct fb_info *info,
|
|||
}
|
||||
}
|
||||
|
||||
static void fbcon_redraw(struct vc_data *vc, struct display *p,
|
||||
static void fbcon_redraw(struct vc_data *vc, struct fbcon_display *p,
|
||||
int line, int count, int offset)
|
||||
{
|
||||
unsigned short *d = (unsigned short *)
|
||||
|
@ -1848,7 +1870,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
|
|||
enum con_scroll dir, unsigned int count)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK;
|
||||
|
||||
if (fbcon_is_inactive(vc, info))
|
||||
|
@ -2052,7 +2074,7 @@ static void fbcon_bmove(struct vc_data *vc, int sy, int sx, int dy, int dx,
|
|||
int height, int width)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
|
||||
if (fbcon_is_inactive(vc, info))
|
||||
return;
|
||||
|
@ -2071,7 +2093,7 @@ static void fbcon_bmove(struct vc_data *vc, int sy, int sx, int dy, int dx,
|
|||
p->vrows - p->yscroll);
|
||||
}
|
||||
|
||||
static void fbcon_bmove_rec(struct vc_data *vc, struct display *p, int sy, int sx,
|
||||
static void fbcon_bmove_rec(struct vc_data *vc, struct fbcon_display *p, int sy, int sx,
|
||||
int dy, int dx, int height, int width, u_int y_break)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
|
@ -2113,7 +2135,7 @@ static void fbcon_bmove_rec(struct vc_data *vc, struct display *p, int sy, int s
|
|||
height, width);
|
||||
}
|
||||
|
||||
static void updatescrollmode(struct display *p,
|
||||
static void updatescrollmode(struct fbcon_display *p,
|
||||
struct fb_info *info,
|
||||
struct vc_data *vc)
|
||||
{
|
||||
|
@ -2165,7 +2187,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
|
|||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
struct fb_var_screeninfo var = info->var;
|
||||
int x_diff, y_diff, virt_w, virt_h, virt_fw, virt_fh;
|
||||
|
||||
|
@ -2210,7 +2232,7 @@ static int fbcon_switch(struct vc_data *vc)
|
|||
{
|
||||
struct fb_info *info, *old_info = NULL;
|
||||
struct fbcon_ops *ops;
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
struct fb_var_screeninfo var;
|
||||
int i, ret, prev_console, charcnt = 256;
|
||||
|
||||
|
@ -2348,8 +2370,6 @@ static int fbcon_switch(struct vc_data *vc)
|
|||
static void fbcon_generic_blank(struct vc_data *vc, struct fb_info *info,
|
||||
int blank)
|
||||
{
|
||||
struct fb_event event;
|
||||
|
||||
if (blank) {
|
||||
unsigned short charmask = vc->vc_hi_font_mask ?
|
||||
0x1ff : 0xff;
|
||||
|
@ -2360,14 +2380,6 @@ static void fbcon_generic_blank(struct vc_data *vc, struct fb_info *info,
|
|||
fbcon_clear(vc, 0, 0, vc->vc_rows, vc->vc_cols);
|
||||
vc->vc_video_erase_char = oldc;
|
||||
}
|
||||
|
||||
|
||||
if (!lock_fb_info(info))
|
||||
return;
|
||||
event.info = info;
|
||||
event.data = ␣
|
||||
fb_notifier_call_chain(FB_EVENT_CONBLANK, &event);
|
||||
unlock_fb_info(info);
|
||||
}
|
||||
|
||||
static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
|
||||
|
@ -2394,9 +2406,8 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
|
|||
fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW);
|
||||
ops->cursor_flash = (!blank);
|
||||
|
||||
if (!(info->flags & FBINFO_MISC_USEREVENT))
|
||||
if (fb_blank(info, blank))
|
||||
fbcon_generic_blank(vc, info, blank);
|
||||
if (fb_blank(info, blank))
|
||||
fbcon_generic_blank(vc, info, blank);
|
||||
}
|
||||
|
||||
if (!blank)
|
||||
|
@ -2553,7 +2564,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
|||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||
int resize;
|
||||
int cnt;
|
||||
char *old_data = NULL;
|
||||
|
@ -2601,7 +2612,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
|||
|
||||
static int fbcon_copy_font(struct vc_data *vc, int con)
|
||||
{
|
||||
struct display *od = &fb_display[con];
|
||||
struct fbcon_display *od = &fb_display[con];
|
||||
struct console_font *f = &vc->vc_font;
|
||||
|
||||
if (od->fontdata == f->data)
|
||||
|
@ -2826,7 +2837,7 @@ static void fbcon_scrolldelta(struct vc_data *vc, int lines)
|
|||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[fg_console]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct display *disp = &fb_display[fg_console];
|
||||
struct fbcon_display *disp = &fb_display[fg_console];
|
||||
int offset, limit, scrollback_old;
|
||||
|
||||
if (softback_top) {
|
||||
|
@ -2918,7 +2929,7 @@ static int fbcon_set_origin(struct vc_data *vc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void fbcon_suspended(struct fb_info *info)
|
||||
void fbcon_suspended(struct fb_info *info)
|
||||
{
|
||||
struct vc_data *vc = NULL;
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
|
@ -2931,7 +2942,7 @@ static void fbcon_suspended(struct fb_info *info)
|
|||
fbcon_cursor(vc, CM_ERASE);
|
||||
}
|
||||
|
||||
static void fbcon_resumed(struct fb_info *info)
|
||||
void fbcon_resumed(struct fb_info *info)
|
||||
{
|
||||
struct vc_data *vc;
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
|
@ -2947,7 +2958,7 @@ static void fbcon_modechanged(struct fb_info *info)
|
|||
{
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct vc_data *vc;
|
||||
struct display *p;
|
||||
struct fbcon_display *p;
|
||||
int rows, cols;
|
||||
|
||||
if (!ops || ops->currcon < 0)
|
||||
|
@ -2987,7 +2998,7 @@ static void fbcon_set_all_vcs(struct fb_info *info)
|
|||
{
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct vc_data *vc;
|
||||
struct display *p;
|
||||
struct fbcon_display *p;
|
||||
int i, rows, cols, fg = -1;
|
||||
|
||||
if (!ops || ops->currcon < 0)
|
||||
|
@ -3018,11 +3029,21 @@ static void fbcon_set_all_vcs(struct fb_info *info)
|
|||
fbcon_modechanged(info);
|
||||
}
|
||||
|
||||
static int fbcon_mode_deleted(struct fb_info *info,
|
||||
struct fb_videomode *mode)
|
||||
|
||||
void fbcon_update_vcs(struct fb_info *info, bool all)
|
||||
{
|
||||
if (all)
|
||||
fbcon_set_all_vcs(info);
|
||||
else
|
||||
fbcon_modechanged(info);
|
||||
}
|
||||
EXPORT_SYMBOL(fbcon_update_vcs);
|
||||
|
||||
int fbcon_mode_deleted(struct fb_info *info,
|
||||
struct fb_videomode *mode)
|
||||
{
|
||||
struct fb_info *fb_info;
|
||||
struct display *p;
|
||||
struct fbcon_display *p;
|
||||
int i, j, found = 0;
|
||||
|
||||
/* before deletion, ensure that mode is not in use */
|
||||
|
@ -3045,7 +3066,7 @@ static int fbcon_mode_deleted(struct fb_info *info,
|
|||
}
|
||||
|
||||
#ifdef CONFIG_VT_HW_CONSOLE_BINDING
|
||||
static int fbcon_unbind(void)
|
||||
static void fbcon_unbind(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -3054,25 +3075,21 @@ static int fbcon_unbind(void)
|
|||
|
||||
if (!ret)
|
||||
fbcon_has_console_bind = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
static inline int fbcon_unbind(void)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline void fbcon_unbind(void) {}
|
||||
#endif /* CONFIG_VT_HW_CONSOLE_BINDING */
|
||||
|
||||
/* called with console_lock held */
|
||||
static int fbcon_fb_unbind(int idx)
|
||||
void fbcon_fb_unbind(struct fb_info *info)
|
||||
{
|
||||
int i, new_idx = -1, ret = 0;
|
||||
int idx = info->node;
|
||||
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
|
||||
if (!fbcon_has_console_bind)
|
||||
return 0;
|
||||
return;
|
||||
|
||||
for (i = first_fb_vc; i <= last_fb_vc; i++) {
|
||||
if (con2fb_map[i] != idx &&
|
||||
|
@ -3105,26 +3122,24 @@ static int fbcon_fb_unbind(int idx)
|
|||
idx, 0);
|
||||
if (ret) {
|
||||
con2fb_map[i] = idx;
|
||||
return ret;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ret = fbcon_unbind();
|
||||
fbcon_unbind();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* called with console_lock held */
|
||||
static int fbcon_fb_unregistered(struct fb_info *info)
|
||||
void fbcon_fb_unregistered(struct fb_info *info)
|
||||
{
|
||||
int i, idx;
|
||||
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
|
||||
if (deferred_takeover)
|
||||
return 0;
|
||||
return;
|
||||
|
||||
idx = info->node;
|
||||
for (i = first_fb_vc; i <= last_fb_vc; i++) {
|
||||
|
@ -3153,21 +3168,18 @@ static int fbcon_fb_unregistered(struct fb_info *info)
|
|||
|
||||
if (!num_registered_fb)
|
||||
do_unregister_con_driver(&fb_con);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* called with console_lock held */
|
||||
static void fbcon_remap_all(int idx)
|
||||
void fbcon_remap_all(struct fb_info *info)
|
||||
{
|
||||
int i;
|
||||
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
int i, idx = info->node;
|
||||
|
||||
console_lock();
|
||||
if (deferred_takeover) {
|
||||
for (i = first_fb_vc; i <= last_fb_vc; i++)
|
||||
con2fb_map_boot[i] = idx;
|
||||
fbcon_map_override();
|
||||
console_unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3180,6 +3192,7 @@ static void fbcon_remap_all(int idx)
|
|||
first_fb_vc + 1, last_fb_vc + 1);
|
||||
info_idx = idx;
|
||||
}
|
||||
console_unlock();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY
|
||||
|
@ -3213,7 +3226,7 @@ static inline void fbcon_select_primary(struct fb_info *info)
|
|||
#endif /* CONFIG_FRAMEBUFFER_DETECT_PRIMARY */
|
||||
|
||||
/* called with console_lock held */
|
||||
static int fbcon_fb_registered(struct fb_info *info)
|
||||
int fbcon_fb_registered(struct fb_info *info)
|
||||
{
|
||||
int ret = 0, i, idx;
|
||||
|
||||
|
@ -3247,7 +3260,7 @@ static int fbcon_fb_registered(struct fb_info *info)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void fbcon_fb_blanked(struct fb_info *info, int blank)
|
||||
void fbcon_fb_blanked(struct fb_info *info, int blank)
|
||||
{
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct vc_data *vc;
|
||||
|
@ -3269,7 +3282,7 @@ static void fbcon_fb_blanked(struct fb_info *info, int blank)
|
|||
ops->blank_state = blank;
|
||||
}
|
||||
|
||||
static void fbcon_new_modelist(struct fb_info *info)
|
||||
void fbcon_new_modelist(struct fb_info *info)
|
||||
{
|
||||
int i;
|
||||
struct vc_data *vc;
|
||||
|
@ -3290,11 +3303,11 @@ static void fbcon_new_modelist(struct fb_info *info)
|
|||
}
|
||||
}
|
||||
|
||||
static void fbcon_get_requirement(struct fb_info *info,
|
||||
struct fb_blit_caps *caps)
|
||||
void fbcon_get_requirement(struct fb_info *info,
|
||||
struct fb_blit_caps *caps)
|
||||
{
|
||||
struct vc_data *vc;
|
||||
struct display *p;
|
||||
struct fbcon_display *p;
|
||||
|
||||
if (caps->flags) {
|
||||
int i, charcnt;
|
||||
|
@ -3326,80 +3339,47 @@ static void fbcon_get_requirement(struct fb_info *info,
|
|||
}
|
||||
}
|
||||
|
||||
static int fbcon_event_notify(struct notifier_block *self,
|
||||
unsigned long action, void *data)
|
||||
int fbcon_set_con2fb_map_ioctl(void __user *argp)
|
||||
{
|
||||
struct fb_event *event = data;
|
||||
struct fb_info *info = event->info;
|
||||
struct fb_videomode *mode;
|
||||
struct fb_con2fbmap *con2fb;
|
||||
struct fb_blit_caps *caps;
|
||||
int idx, ret = 0;
|
||||
struct fb_con2fbmap con2fb;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* ignore all events except driver registration and deregistration
|
||||
* if fbcon is not active
|
||||
*/
|
||||
if (fbcon_has_exited && !(action == FB_EVENT_FB_REGISTERED ||
|
||||
action == FB_EVENT_FB_UNREGISTERED))
|
||||
goto done;
|
||||
|
||||
switch(action) {
|
||||
case FB_EVENT_SUSPEND:
|
||||
fbcon_suspended(info);
|
||||
break;
|
||||
case FB_EVENT_RESUME:
|
||||
fbcon_resumed(info);
|
||||
break;
|
||||
case FB_EVENT_MODE_CHANGE:
|
||||
fbcon_modechanged(info);
|
||||
break;
|
||||
case FB_EVENT_MODE_CHANGE_ALL:
|
||||
fbcon_set_all_vcs(info);
|
||||
break;
|
||||
case FB_EVENT_MODE_DELETE:
|
||||
mode = event->data;
|
||||
ret = fbcon_mode_deleted(info, mode);
|
||||
break;
|
||||
case FB_EVENT_FB_UNBIND:
|
||||
idx = info->node;
|
||||
ret = fbcon_fb_unbind(idx);
|
||||
break;
|
||||
case FB_EVENT_FB_REGISTERED:
|
||||
ret = fbcon_fb_registered(info);
|
||||
break;
|
||||
case FB_EVENT_FB_UNREGISTERED:
|
||||
ret = fbcon_fb_unregistered(info);
|
||||
break;
|
||||
case FB_EVENT_SET_CONSOLE_MAP:
|
||||
/* called with console lock held */
|
||||
con2fb = event->data;
|
||||
ret = set_con2fb_map(con2fb->console - 1,
|
||||
con2fb->framebuffer, 1);
|
||||
break;
|
||||
case FB_EVENT_GET_CONSOLE_MAP:
|
||||
con2fb = event->data;
|
||||
con2fb->framebuffer = con2fb_map[con2fb->console - 1];
|
||||
break;
|
||||
case FB_EVENT_BLANK:
|
||||
fbcon_fb_blanked(info, *(int *)event->data);
|
||||
break;
|
||||
case FB_EVENT_NEW_MODELIST:
|
||||
fbcon_new_modelist(info);
|
||||
break;
|
||||
case FB_EVENT_GET_REQ:
|
||||
caps = event->data;
|
||||
fbcon_get_requirement(info, caps);
|
||||
break;
|
||||
case FB_EVENT_REMAP_ALL_CONSOLE:
|
||||
idx = info->node;
|
||||
fbcon_remap_all(idx);
|
||||
break;
|
||||
if (copy_from_user(&con2fb, argp, sizeof(con2fb)))
|
||||
return -EFAULT;
|
||||
if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
|
||||
return -EINVAL;
|
||||
if (con2fb.framebuffer >= FB_MAX)
|
||||
return -EINVAL;
|
||||
if (!registered_fb[con2fb.framebuffer])
|
||||
request_module("fb%d", con2fb.framebuffer);
|
||||
if (!registered_fb[con2fb.framebuffer]) {
|
||||
return -EINVAL;
|
||||
}
|
||||
done:
|
||||
|
||||
console_lock();
|
||||
ret = set_con2fb_map(con2fb.console - 1,
|
||||
con2fb.framebuffer, 1);
|
||||
console_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int fbcon_get_con2fb_map_ioctl(void __user *argp)
|
||||
{
|
||||
struct fb_con2fbmap con2fb;
|
||||
|
||||
if (copy_from_user(&con2fb, argp, sizeof(con2fb)))
|
||||
return -EFAULT;
|
||||
if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
|
||||
return -EINVAL;
|
||||
|
||||
console_lock();
|
||||
con2fb.framebuffer = con2fb_map[con2fb.console - 1];
|
||||
console_unlock();
|
||||
|
||||
return copy_to_user(argp, &con2fb, sizeof(con2fb)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The console `switch' structure for the frame buffer based console
|
||||
*/
|
||||
|
@ -3431,10 +3411,6 @@ static const struct consw fb_con = {
|
|||
.con_debug_leave = fbcon_debug_leave,
|
||||
};
|
||||
|
||||
static struct notifier_block fbcon_event_notifier = {
|
||||
.notifier_call = fbcon_event_notify,
|
||||
};
|
||||
|
||||
static ssize_t store_rotate(struct device *device,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
|
@ -3443,9 +3419,6 @@ static ssize_t store_rotate(struct device *device,
|
|||
int rotate, idx;
|
||||
char **last = NULL;
|
||||
|
||||
if (fbcon_has_exited)
|
||||
return count;
|
||||
|
||||
console_lock();
|
||||
idx = con2fb_map[fg_console];
|
||||
|
||||
|
@ -3468,9 +3441,6 @@ static ssize_t store_rotate_all(struct device *device,
|
|||
int rotate, idx;
|
||||
char **last = NULL;
|
||||
|
||||
if (fbcon_has_exited)
|
||||
return count;
|
||||
|
||||
console_lock();
|
||||
idx = con2fb_map[fg_console];
|
||||
|
||||
|
@ -3491,9 +3461,6 @@ static ssize_t show_rotate(struct device *device,
|
|||
struct fb_info *info;
|
||||
int rotate = 0, idx;
|
||||
|
||||
if (fbcon_has_exited)
|
||||
return 0;
|
||||
|
||||
console_lock();
|
||||
idx = con2fb_map[fg_console];
|
||||
|
||||
|
@ -3514,9 +3481,6 @@ static ssize_t show_cursor_blink(struct device *device,
|
|||
struct fbcon_ops *ops;
|
||||
int idx, blink = -1;
|
||||
|
||||
if (fbcon_has_exited)
|
||||
return 0;
|
||||
|
||||
console_lock();
|
||||
idx = con2fb_map[fg_console];
|
||||
|
||||
|
@ -3543,9 +3507,6 @@ static ssize_t store_cursor_blink(struct device *device,
|
|||
int blink, idx;
|
||||
char **last = NULL;
|
||||
|
||||
if (fbcon_has_exited)
|
||||
return count;
|
||||
|
||||
console_lock();
|
||||
idx = con2fb_map[fg_console];
|
||||
|
||||
|
@ -3668,9 +3629,6 @@ static void fbcon_exit(void)
|
|||
struct fb_info *info;
|
||||
int i, j, mapped;
|
||||
|
||||
if (fbcon_has_exited)
|
||||
return;
|
||||
|
||||
#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
|
||||
if (deferred_takeover) {
|
||||
dummycon_unregister_output_notifier(&fbcon_output_nb);
|
||||
|
@ -3695,7 +3653,7 @@ static void fbcon_exit(void)
|
|||
for (j = first_fb_vc; j <= last_fb_vc; j++) {
|
||||
if (con2fb_map[j] == i) {
|
||||
mapped = 1;
|
||||
break;
|
||||
con2fb_map[j] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3718,8 +3676,6 @@ static void fbcon_exit(void)
|
|||
info->queue.func = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
fbcon_has_exited = 1;
|
||||
}
|
||||
|
||||
void __init fb_console_init(void)
|
||||
|
@ -3727,7 +3683,6 @@ void __init fb_console_init(void)
|
|||
int i;
|
||||
|
||||
console_lock();
|
||||
fb_register_client(&fbcon_event_notifier);
|
||||
fbcon_device = device_create(fb_class, NULL, MKDEV(0, 0), NULL,
|
||||
"fbcon");
|
||||
|
||||
|
@ -3763,7 +3718,6 @@ static void __exit fbcon_deinit_device(void)
|
|||
void __exit fb_console_exit(void)
|
||||
{
|
||||
console_lock();
|
||||
fb_unregister_client(&fbcon_event_notifier);
|
||||
fbcon_deinit_device();
|
||||
device_destroy(fb_class, MKDEV(0, 0));
|
||||
fbcon_exit();
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
* low-level frame buffer device
|
||||
*/
|
||||
|
||||
struct display {
|
||||
struct fbcon_display {
|
||||
/* Filled in by the low-level console driver */
|
||||
const u_char *fontdata;
|
||||
int userfont; /* != 0 if fontdata kmalloc()ed */
|
||||
|
@ -68,7 +68,7 @@ struct fbcon_ops {
|
|||
struct fb_var_screeninfo var; /* copy of the current fb_var_screeninfo */
|
||||
struct timer_list cursor_timer; /* Cursor timer */
|
||||
struct fb_cursor cursor_state;
|
||||
struct display *p;
|
||||
struct fbcon_display *p;
|
||||
struct fb_info *info;
|
||||
int currcon; /* Current VC. */
|
||||
int cur_blink_jiffies;
|
||||
|
@ -225,7 +225,7 @@ extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor);
|
|||
#define FBCON_ATTRIBUTE_REVERSE 2
|
||||
#define FBCON_ATTRIBUTE_BOLD 4
|
||||
|
||||
static inline int real_y(struct display *p, int ypos)
|
||||
static inline int real_y(struct fbcon_display *p, int ypos)
|
||||
{
|
||||
int rows = p->vrows;
|
||||
|
||||
|
|
|
@ -80,17 +80,6 @@ static void put_fb_info(struct fb_info *fb_info)
|
|||
fb_info->fbops->fb_destroy(fb_info);
|
||||
}
|
||||
|
||||
int lock_fb_info(struct fb_info *info)
|
||||
{
|
||||
mutex_lock(&info->lock);
|
||||
if (!info->fbops) {
|
||||
mutex_unlock(&info->lock);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(lock_fb_info);
|
||||
|
||||
/*
|
||||
* Helpers
|
||||
*/
|
||||
|
@ -943,16 +932,13 @@ EXPORT_SYMBOL(fb_pan_display);
|
|||
static int fb_check_caps(struct fb_info *info, struct fb_var_screeninfo *var,
|
||||
u32 activate)
|
||||
{
|
||||
struct fb_event event;
|
||||
struct fb_blit_caps caps, fbcaps;
|
||||
int err = 0;
|
||||
|
||||
memset(&caps, 0, sizeof(caps));
|
||||
memset(&fbcaps, 0, sizeof(fbcaps));
|
||||
caps.flags = (activate & FB_ACTIVATE_ALL) ? 1 : 0;
|
||||
event.info = info;
|
||||
event.data = ∩︀
|
||||
fb_notifier_call_chain(FB_EVENT_GET_REQ, &event);
|
||||
fbcon_get_requirement(info, &caps);
|
||||
info->fbops->fb_get_caps(info, &fbcaps, var);
|
||||
|
||||
if (((fbcaps.x ^ caps.x) & caps.x) ||
|
||||
|
@ -968,6 +954,10 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
|
|||
{
|
||||
int flags = info->flags;
|
||||
int ret = 0;
|
||||
u32 activate;
|
||||
struct fb_var_screeninfo old_var;
|
||||
struct fb_videomode mode;
|
||||
struct fb_event event;
|
||||
|
||||
if (var->activate & FB_ACTIVATE_INV_MODE) {
|
||||
struct fb_videomode mode1, mode2;
|
||||
|
@ -977,100 +967,90 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
|
|||
/* make sure we don't delete the videomode of current var */
|
||||
ret = fb_mode_is_equal(&mode1, &mode2);
|
||||
|
||||
if (!ret) {
|
||||
struct fb_event event;
|
||||
|
||||
event.info = info;
|
||||
event.data = &mode1;
|
||||
ret = fb_notifier_call_chain(FB_EVENT_MODE_DELETE, &event);
|
||||
}
|
||||
if (!ret)
|
||||
fbcon_mode_deleted(info, &mode1);
|
||||
|
||||
if (!ret)
|
||||
fb_delete_videomode(&mode1, &info->modelist);
|
||||
fb_delete_videomode(&mode1, &info->modelist);
|
||||
|
||||
|
||||
ret = (ret) ? -EINVAL : 0;
|
||||
goto done;
|
||||
return ret ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
if ((var->activate & FB_ACTIVATE_FORCE) ||
|
||||
memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) {
|
||||
u32 activate = var->activate;
|
||||
if (!(var->activate & FB_ACTIVATE_FORCE) &&
|
||||
!memcmp(&info->var, var, sizeof(struct fb_var_screeninfo)))
|
||||
return 0;
|
||||
|
||||
/* When using FOURCC mode, make sure the red, green, blue and
|
||||
* transp fields are set to 0.
|
||||
*/
|
||||
if ((info->fix.capabilities & FB_CAP_FOURCC) &&
|
||||
var->grayscale > 1) {
|
||||
if (var->red.offset || var->green.offset ||
|
||||
var->blue.offset || var->transp.offset ||
|
||||
var->red.length || var->green.length ||
|
||||
var->blue.length || var->transp.length ||
|
||||
var->red.msb_right || var->green.msb_right ||
|
||||
var->blue.msb_right || var->transp.msb_right)
|
||||
return -EINVAL;
|
||||
}
|
||||
activate = var->activate;
|
||||
|
||||
if (!info->fbops->fb_check_var) {
|
||||
*var = info->var;
|
||||
goto done;
|
||||
}
|
||||
/* When using FOURCC mode, make sure the red, green, blue and
|
||||
* transp fields are set to 0.
|
||||
*/
|
||||
if ((info->fix.capabilities & FB_CAP_FOURCC) &&
|
||||
var->grayscale > 1) {
|
||||
if (var->red.offset || var->green.offset ||
|
||||
var->blue.offset || var->transp.offset ||
|
||||
var->red.length || var->green.length ||
|
||||
var->blue.length || var->transp.length ||
|
||||
var->red.msb_right || var->green.msb_right ||
|
||||
var->blue.msb_right || var->transp.msb_right)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = info->fbops->fb_check_var(var, info);
|
||||
if (!info->fbops->fb_check_var) {
|
||||
*var = info->var;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = info->fbops->fb_check_var(var, info);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW)
|
||||
return 0;
|
||||
|
||||
if (info->fbops->fb_get_caps) {
|
||||
ret = fb_check_caps(info, var, activate);
|
||||
|
||||
if (ret)
|
||||
goto done;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
|
||||
struct fb_var_screeninfo old_var;
|
||||
struct fb_videomode mode;
|
||||
old_var = info->var;
|
||||
info->var = *var;
|
||||
|
||||
if (info->fbops->fb_get_caps) {
|
||||
ret = fb_check_caps(info, var, activate);
|
||||
if (info->fbops->fb_set_par) {
|
||||
ret = info->fbops->fb_set_par(info);
|
||||
|
||||
if (ret)
|
||||
goto done;
|
||||
}
|
||||
|
||||
old_var = info->var;
|
||||
info->var = *var;
|
||||
|
||||
if (info->fbops->fb_set_par) {
|
||||
ret = info->fbops->fb_set_par(info);
|
||||
|
||||
if (ret) {
|
||||
info->var = old_var;
|
||||
printk(KERN_WARNING "detected "
|
||||
"fb_set_par error, "
|
||||
"error code: %d\n", ret);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
fb_pan_display(info, &info->var);
|
||||
fb_set_cmap(&info->cmap, info);
|
||||
fb_var_to_videomode(&mode, &info->var);
|
||||
|
||||
if (info->modelist.prev && info->modelist.next &&
|
||||
!list_empty(&info->modelist))
|
||||
ret = fb_add_videomode(&mode, &info->modelist);
|
||||
|
||||
if (!ret && (flags & FBINFO_MISC_USEREVENT)) {
|
||||
struct fb_event event;
|
||||
int evnt = (activate & FB_ACTIVATE_ALL) ?
|
||||
FB_EVENT_MODE_CHANGE_ALL :
|
||||
FB_EVENT_MODE_CHANGE;
|
||||
|
||||
info->flags &= ~FBINFO_MISC_USEREVENT;
|
||||
event.info = info;
|
||||
event.data = &mode;
|
||||
fb_notifier_call_chain(evnt, &event);
|
||||
}
|
||||
if (ret) {
|
||||
info->var = old_var;
|
||||
printk(KERN_WARNING "detected "
|
||||
"fb_set_par error, "
|
||||
"error code: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
return ret;
|
||||
fb_pan_display(info, &info->var);
|
||||
fb_set_cmap(&info->cmap, info);
|
||||
fb_var_to_videomode(&mode, &info->var);
|
||||
|
||||
if (info->modelist.prev && info->modelist.next &&
|
||||
!list_empty(&info->modelist))
|
||||
ret = fb_add_videomode(&mode, &info->modelist);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
event.info = info;
|
||||
event.data = &mode;
|
||||
fb_notifier_call_chain(FB_EVENT_MODE_CHANGE, &event);
|
||||
|
||||
if (flags & FBINFO_MISC_USEREVENT)
|
||||
fbcon_update_vcs(info, activate & FB_ACTIVATE_ALL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(fb_set_var);
|
||||
|
||||
|
@ -1112,17 +1092,14 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
struct fb_ops *fb;
|
||||
struct fb_var_screeninfo var;
|
||||
struct fb_fix_screeninfo fix;
|
||||
struct fb_con2fbmap con2fb;
|
||||
struct fb_cmap cmap_from;
|
||||
struct fb_cmap_user cmap;
|
||||
struct fb_event event;
|
||||
void __user *argp = (void __user *)arg;
|
||||
long ret = 0;
|
||||
|
||||
switch (cmd) {
|
||||
case FBIOGET_VSCREENINFO:
|
||||
if (!lock_fb_info(info))
|
||||
return -ENODEV;
|
||||
lock_fb_info(info);
|
||||
var = info->var;
|
||||
unlock_fb_info(info);
|
||||
|
||||
|
@ -1132,10 +1109,7 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
if (copy_from_user(&var, argp, sizeof(var)))
|
||||
return -EFAULT;
|
||||
console_lock();
|
||||
if (!lock_fb_info(info)) {
|
||||
console_unlock();
|
||||
return -ENODEV;
|
||||
}
|
||||
lock_fb_info(info);
|
||||
info->flags |= FBINFO_MISC_USEREVENT;
|
||||
ret = fb_set_var(info, &var);
|
||||
info->flags &= ~FBINFO_MISC_USEREVENT;
|
||||
|
@ -1145,8 +1119,7 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
ret = -EFAULT;
|
||||
break;
|
||||
case FBIOGET_FSCREENINFO:
|
||||
if (!lock_fb_info(info))
|
||||
return -ENODEV;
|
||||
lock_fb_info(info);
|
||||
fix = info->fix;
|
||||
if (info->flags & FBINFO_HIDE_SMEM_START)
|
||||
fix.smem_start = 0;
|
||||
|
@ -1162,8 +1135,7 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
case FBIOGETCMAP:
|
||||
if (copy_from_user(&cmap, argp, sizeof(cmap)))
|
||||
return -EFAULT;
|
||||
if (!lock_fb_info(info))
|
||||
return -ENODEV;
|
||||
lock_fb_info(info);
|
||||
cmap_from = info->cmap;
|
||||
unlock_fb_info(info);
|
||||
ret = fb_cmap_to_user(&cmap_from, &cmap);
|
||||
|
@ -1172,10 +1144,7 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
if (copy_from_user(&var, argp, sizeof(var)))
|
||||
return -EFAULT;
|
||||
console_lock();
|
||||
if (!lock_fb_info(info)) {
|
||||
console_unlock();
|
||||
return -ENODEV;
|
||||
}
|
||||
lock_fb_info(info);
|
||||
ret = fb_pan_display(info, &var);
|
||||
unlock_fb_info(info);
|
||||
console_unlock();
|
||||
|
@ -1186,58 +1155,22 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
|||
ret = -EINVAL;
|
||||
break;
|
||||
case FBIOGET_CON2FBMAP:
|
||||
if (copy_from_user(&con2fb, argp, sizeof(con2fb)))
|
||||
return -EFAULT;
|
||||
if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
|
||||
return -EINVAL;
|
||||
con2fb.framebuffer = -1;
|
||||
event.data = &con2fb;
|
||||
if (!lock_fb_info(info))
|
||||
return -ENODEV;
|
||||
event.info = info;
|
||||
fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP, &event);
|
||||
unlock_fb_info(info);
|
||||
ret = copy_to_user(argp, &con2fb, sizeof(con2fb)) ? -EFAULT : 0;
|
||||
ret = fbcon_get_con2fb_map_ioctl(argp);
|
||||
break;
|
||||
case FBIOPUT_CON2FBMAP:
|
||||
if (copy_from_user(&con2fb, argp, sizeof(con2fb)))
|
||||
return -EFAULT;
|
||||
if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
|
||||
return -EINVAL;
|
||||
if (con2fb.framebuffer >= FB_MAX)
|
||||
return -EINVAL;
|
||||
if (!registered_fb[con2fb.framebuffer])
|
||||
request_module("fb%d", con2fb.framebuffer);
|
||||
if (!registered_fb[con2fb.framebuffer]) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
event.data = &con2fb;
|
||||
console_lock();
|
||||
if (!lock_fb_info(info)) {
|
||||
console_unlock();
|
||||
return -ENODEV;
|
||||
}
|
||||
event.info = info;
|
||||
ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, &event);
|
||||
unlock_fb_info(info);
|
||||
console_unlock();
|
||||
ret = fbcon_set_con2fb_map_ioctl(argp);
|
||||
break;
|
||||
case FBIOBLANK:
|
||||
console_lock();
|
||||
if (!lock_fb_info(info)) {
|
||||
console_unlock();
|
||||
return -ENODEV;
|
||||
}
|
||||
info->flags |= FBINFO_MISC_USEREVENT;
|
||||
lock_fb_info(info);
|
||||
ret = fb_blank(info, arg);
|
||||
info->flags &= ~FBINFO_MISC_USEREVENT;
|
||||
/* might again call into fb_blank */
|
||||
fbcon_fb_blanked(info, arg);
|
||||
unlock_fb_info(info);
|
||||
console_unlock();
|
||||
break;
|
||||
default:
|
||||
if (!lock_fb_info(info))
|
||||
return -ENODEV;
|
||||
lock_fb_info(info);
|
||||
fb = info->fbops;
|
||||
if (fb->fb_ioctl)
|
||||
ret = fb->fb_ioctl(info, cmd, arg);
|
||||
|
@ -1357,8 +1290,7 @@ static int fb_get_fscreeninfo(struct fb_info *info, unsigned int cmd,
|
|||
{
|
||||
struct fb_fix_screeninfo fix;
|
||||
|
||||
if (!lock_fb_info(info))
|
||||
return -ENODEV;
|
||||
lock_fb_info(info);
|
||||
fix = info->fix;
|
||||
if (info->flags & FBINFO_HIDE_SMEM_START)
|
||||
fix.smem_start = 0;
|
||||
|
@ -1418,8 +1350,6 @@ fb_mmap(struct file *file, struct vm_area_struct * vma)
|
|||
if (!info)
|
||||
return -ENODEV;
|
||||
fb = info->fbops;
|
||||
if (!fb)
|
||||
return -ENODEV;
|
||||
mutex_lock(&info->mm_lock);
|
||||
if (fb->fb_mmap) {
|
||||
int res;
|
||||
|
@ -1483,7 +1413,7 @@ __releases(&info->lock)
|
|||
if (IS_ERR(info))
|
||||
return PTR_ERR(info);
|
||||
|
||||
mutex_lock(&info->lock);
|
||||
lock_fb_info(info);
|
||||
if (!try_module_get(info->fbops->owner)) {
|
||||
res = -ENODEV;
|
||||
goto out;
|
||||
|
@ -1499,7 +1429,7 @@ __releases(&info->lock)
|
|||
fb_deferred_io_open(info, inode, file);
|
||||
#endif
|
||||
out:
|
||||
mutex_unlock(&info->lock);
|
||||
unlock_fb_info(info);
|
||||
if (res)
|
||||
put_fb_info(info);
|
||||
return res;
|
||||
|
@ -1512,11 +1442,11 @@ __releases(&info->lock)
|
|||
{
|
||||
struct fb_info * const info = file->private_data;
|
||||
|
||||
mutex_lock(&info->lock);
|
||||
lock_fb_info(info);
|
||||
if (info->fbops->fb_release)
|
||||
info->fbops->fb_release(info,1);
|
||||
module_put(info->fbops->owner);
|
||||
mutex_unlock(&info->lock);
|
||||
unlock_fb_info(info);
|
||||
put_fb_info(info);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1621,13 +1551,13 @@ static bool fb_do_apertures_overlap(struct apertures_struct *gena,
|
|||
return false;
|
||||
}
|
||||
|
||||
static int do_unregister_framebuffer(struct fb_info *fb_info);
|
||||
static void do_unregister_framebuffer(struct fb_info *fb_info);
|
||||
|
||||
#define VGA_FB_PHYS 0xA0000
|
||||
static int do_remove_conflicting_framebuffers(struct apertures_struct *a,
|
||||
const char *name, bool primary)
|
||||
static void do_remove_conflicting_framebuffers(struct apertures_struct *a,
|
||||
const char *name, bool primary)
|
||||
{
|
||||
int i, ret;
|
||||
int i;
|
||||
|
||||
/* check all firmware fbs and kick off if the base addr overlaps */
|
||||
for_each_registered_fb(i) {
|
||||
|
@ -1643,13 +1573,9 @@ static int do_remove_conflicting_framebuffers(struct apertures_struct *a,
|
|||
|
||||
printk(KERN_INFO "fb%d: switching to %s from %s\n",
|
||||
i, name, registered_fb[i]->fix.id);
|
||||
ret = do_unregister_framebuffer(registered_fb[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
do_unregister_framebuffer(registered_fb[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool lockless_register_fb;
|
||||
|
@ -1660,17 +1586,14 @@ MODULE_PARM_DESC(lockless_register_fb,
|
|||
static int do_register_framebuffer(struct fb_info *fb_info)
|
||||
{
|
||||
int i, ret;
|
||||
struct fb_event event;
|
||||
struct fb_videomode mode;
|
||||
|
||||
if (fb_check_foreignness(fb_info))
|
||||
return -ENOSYS;
|
||||
|
||||
ret = do_remove_conflicting_framebuffers(fb_info->apertures,
|
||||
fb_info->fix.id,
|
||||
fb_is_primary_device(fb_info));
|
||||
if (ret)
|
||||
return ret;
|
||||
do_remove_conflicting_framebuffers(fb_info->apertures,
|
||||
fb_info->fix.id,
|
||||
fb_is_primary_device(fb_info));
|
||||
|
||||
if (num_registered_fb == FB_MAX)
|
||||
return -ENXIO;
|
||||
|
@ -1723,20 +1646,22 @@ static int do_register_framebuffer(struct fb_info *fb_info)
|
|||
fb_add_videomode(&mode, &fb_info->modelist);
|
||||
registered_fb[i] = fb_info;
|
||||
|
||||
event.info = fb_info;
|
||||
#ifdef CONFIG_GUMSTIX_AM200EPD
|
||||
{
|
||||
struct fb_event event;
|
||||
event.info = fb_info;
|
||||
fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!lockless_register_fb)
|
||||
console_lock();
|
||||
else
|
||||
atomic_inc(&ignore_console_lock_warning);
|
||||
if (!lock_fb_info(fb_info)) {
|
||||
ret = -ENODEV;
|
||||
goto unlock_console;
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);
|
||||
lock_fb_info(fb_info);
|
||||
ret = fbcon_fb_registered(fb_info);
|
||||
unlock_fb_info(fb_info);
|
||||
unlock_console:
|
||||
|
||||
if (!lockless_register_fb)
|
||||
console_unlock();
|
||||
else
|
||||
|
@ -1744,44 +1669,44 @@ unlock_console:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int unbind_console(struct fb_info *fb_info)
|
||||
static void unbind_console(struct fb_info *fb_info)
|
||||
{
|
||||
struct fb_event event;
|
||||
int ret;
|
||||
int i = fb_info->node;
|
||||
|
||||
if (i < 0 || i >= FB_MAX || registered_fb[i] != fb_info)
|
||||
return -EINVAL;
|
||||
if (WARN_ON(i < 0 || i >= FB_MAX || registered_fb[i] != fb_info))
|
||||
return;
|
||||
|
||||
console_lock();
|
||||
if (!lock_fb_info(fb_info)) {
|
||||
console_unlock();
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
event.info = fb_info;
|
||||
ret = fb_notifier_call_chain(FB_EVENT_FB_UNBIND, &event);
|
||||
lock_fb_info(fb_info);
|
||||
fbcon_fb_unbind(fb_info);
|
||||
unlock_fb_info(fb_info);
|
||||
console_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __unlink_framebuffer(struct fb_info *fb_info);
|
||||
|
||||
static int do_unregister_framebuffer(struct fb_info *fb_info)
|
||||
void unlink_framebuffer(struct fb_info *fb_info)
|
||||
{
|
||||
struct fb_event event;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
ret = unbind_console(fb_info);
|
||||
i = fb_info->node;
|
||||
if (WARN_ON(i < 0 || i >= FB_MAX || registered_fb[i] != fb_info))
|
||||
return;
|
||||
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
if (!fb_info->dev)
|
||||
return;
|
||||
|
||||
device_destroy(fb_class, MKDEV(FB_MAJOR, i));
|
||||
|
||||
pm_vt_switch_unregister(fb_info->dev);
|
||||
|
||||
__unlink_framebuffer(fb_info);
|
||||
unbind_console(fb_info);
|
||||
|
||||
fb_info->dev = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(unlink_framebuffer);
|
||||
|
||||
static void do_unregister_framebuffer(struct fb_info *fb_info)
|
||||
{
|
||||
unlink_framebuffer(fb_info);
|
||||
if (fb_info->pixmap.addr &&
|
||||
(fb_info->pixmap.flags & FB_PIXMAP_DEFAULT))
|
||||
kfree(fb_info->pixmap.addr);
|
||||
|
@ -1789,46 +1714,21 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)
|
|||
registered_fb[fb_info->node] = NULL;
|
||||
num_registered_fb--;
|
||||
fb_cleanup_device(fb_info);
|
||||
event.info = fb_info;
|
||||
#ifdef CONFIG_GUMSTIX_AM200EPD
|
||||
{
|
||||
struct fb_event event;
|
||||
event.info = fb_info;
|
||||
fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event);
|
||||
}
|
||||
#endif
|
||||
console_lock();
|
||||
fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event);
|
||||
fbcon_fb_unregistered(fb_info);
|
||||
console_unlock();
|
||||
|
||||
/* this may free fb info */
|
||||
put_fb_info(fb_info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __unlink_framebuffer(struct fb_info *fb_info)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = fb_info->node;
|
||||
if (i < 0 || i >= FB_MAX || registered_fb[i] != fb_info)
|
||||
return -EINVAL;
|
||||
|
||||
if (fb_info->dev) {
|
||||
device_destroy(fb_class, MKDEV(FB_MAJOR, i));
|
||||
fb_info->dev = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int unlink_framebuffer(struct fb_info *fb_info)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = __unlink_framebuffer(fb_info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
unbind_console(fb_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(unlink_framebuffer);
|
||||
|
||||
/**
|
||||
* remove_conflicting_framebuffers - remove firmware-configured framebuffers
|
||||
* @a: memory range, users of which are to be removed
|
||||
|
@ -1842,7 +1742,6 @@ EXPORT_SYMBOL(unlink_framebuffer);
|
|||
int remove_conflicting_framebuffers(struct apertures_struct *a,
|
||||
const char *name, bool primary)
|
||||
{
|
||||
int ret;
|
||||
bool do_free = false;
|
||||
|
||||
if (!a) {
|
||||
|
@ -1856,13 +1755,13 @@ int remove_conflicting_framebuffers(struct apertures_struct *a,
|
|||
}
|
||||
|
||||
mutex_lock(®istration_lock);
|
||||
ret = do_remove_conflicting_framebuffers(a, name, primary);
|
||||
do_remove_conflicting_framebuffers(a, name, primary);
|
||||
mutex_unlock(®istration_lock);
|
||||
|
||||
if (do_free)
|
||||
kfree(a);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(remove_conflicting_framebuffers);
|
||||
|
||||
|
@ -1959,16 +1858,12 @@ EXPORT_SYMBOL(register_framebuffer);
|
|||
* that the driver implements fb_open() and fb_release() to
|
||||
* check that no processes are using the device.
|
||||
*/
|
||||
int
|
||||
void
|
||||
unregister_framebuffer(struct fb_info *fb_info)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(®istration_lock);
|
||||
ret = do_unregister_framebuffer(fb_info);
|
||||
do_unregister_framebuffer(fb_info);
|
||||
mutex_unlock(®istration_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(unregister_framebuffer);
|
||||
|
||||
|
@ -1983,15 +1878,14 @@ EXPORT_SYMBOL(unregister_framebuffer);
|
|||
*/
|
||||
void fb_set_suspend(struct fb_info *info, int state)
|
||||
{
|
||||
struct fb_event event;
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
|
||||
event.info = info;
|
||||
if (state) {
|
||||
fb_notifier_call_chain(FB_EVENT_SUSPEND, &event);
|
||||
fbcon_suspended(info);
|
||||
info->state = FBINFO_STATE_SUSPENDED;
|
||||
} else {
|
||||
info->state = FBINFO_STATE_RUNNING;
|
||||
fb_notifier_call_chain(FB_EVENT_RESUME, &event);
|
||||
fbcon_resumed(info);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(fb_set_suspend);
|
||||
|
@ -2059,7 +1953,6 @@ subsys_initcall(fbmem_init);
|
|||
|
||||
int fb_new_modelist(struct fb_info *info)
|
||||
{
|
||||
struct fb_event event;
|
||||
struct fb_var_screeninfo var = info->var;
|
||||
struct list_head *pos, *n;
|
||||
struct fb_modelist *modelist;
|
||||
|
@ -2079,14 +1972,12 @@ int fb_new_modelist(struct fb_info *info)
|
|||
}
|
||||
}
|
||||
|
||||
err = 1;
|
||||
if (list_empty(&info->modelist))
|
||||
return 1;
|
||||
|
||||
if (!list_empty(&info->modelist)) {
|
||||
event.info = info;
|
||||
err = fb_notifier_call_chain(FB_EVENT_NEW_MODELIST, &event);
|
||||
}
|
||||
fbcon_new_modelist(info);
|
||||
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/fbcon.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
|
@ -175,10 +176,7 @@ static ssize_t store_modes(struct device *device,
|
|||
return -EINVAL;
|
||||
|
||||
console_lock();
|
||||
if (!lock_fb_info(fb_info)) {
|
||||
console_unlock();
|
||||
return -ENODEV;
|
||||
}
|
||||
lock_fb_info(fb_info);
|
||||
|
||||
list_splice(&fb_info->modelist, &old_list);
|
||||
fb_videomode_to_modelist((const struct fb_videomode *)buf, i,
|
||||
|
@ -304,12 +302,13 @@ static ssize_t store_blank(struct device *device,
|
|||
{
|
||||
struct fb_info *fb_info = dev_get_drvdata(device);
|
||||
char *last = NULL;
|
||||
int err;
|
||||
int err, arg;
|
||||
|
||||
arg = simple_strtoul(buf, &last, 0);
|
||||
console_lock();
|
||||
fb_info->flags |= FBINFO_MISC_USEREVENT;
|
||||
err = fb_blank(fb_info, simple_strtoul(buf, &last, 0));
|
||||
fb_info->flags &= ~FBINFO_MISC_USEREVENT;
|
||||
err = fb_blank(fb_info, arg);
|
||||
/* might again call into fb_blank */
|
||||
fbcon_fb_blanked(fb_info, arg);
|
||||
console_unlock();
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
@ -405,10 +404,7 @@ static ssize_t store_fbstate(struct device *device,
|
|||
state = simple_strtoul(buf, &last, 0);
|
||||
|
||||
console_lock();
|
||||
if (!lock_fb_info(fb_info)) {
|
||||
console_unlock();
|
||||
return -ENODEV;
|
||||
}
|
||||
lock_fb_info(fb_info);
|
||||
|
||||
fb_set_suspend(fb_info, (int)state);
|
||||
|
||||
|
|
|
@ -58,7 +58,6 @@
|
|||
struct cfb_info {
|
||||
struct fb_info fb;
|
||||
struct display_switch *dispsw;
|
||||
struct display *display;
|
||||
unsigned char __iomem *region;
|
||||
unsigned char __iomem *regs;
|
||||
u_int id;
|
||||
|
@ -1638,10 +1637,6 @@ static void cyberpro_common_resume(struct cfb_info *cfb)
|
|||
cyber2000fb_set_par(&cfb->fb);
|
||||
}
|
||||
|
||||
/*
|
||||
* PCI specific support.
|
||||
*/
|
||||
#ifdef CONFIG_PCI
|
||||
/*
|
||||
* We need to wake up the CyberPro, and make sure its in linear memory
|
||||
* mode. Unfortunately, this is specific to the platform and card that
|
||||
|
@ -1858,7 +1853,6 @@ static struct pci_driver cyberpro_driver = {
|
|||
.resume = cyberpro_pci_resume,
|
||||
.id_table = cyberpro_pci_table
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* I don't think we can use the "module_init" stuff here because
|
||||
|
|
|
@ -1387,7 +1387,6 @@ static int fb_probe(struct platform_device *device)
|
|||
da8xx_fb_info = framebuffer_alloc(sizeof(struct da8xx_fb_par),
|
||||
&device->dev);
|
||||
if (!da8xx_fb_info) {
|
||||
dev_dbg(&device->dev, "Memory allocation failed for fb_info\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_pm_runtime_disable;
|
||||
}
|
||||
|
|
|
@ -169,6 +169,11 @@ static void efifb_show_boot_graphics(struct fb_info *info)
|
|||
return;
|
||||
}
|
||||
|
||||
if (bgrt_tab.status & 0x06) {
|
||||
pr_info("efifb: BGRT rotation bits set, not showing boot graphics\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Avoid flashing the logo if we're going to print std probe messages */
|
||||
if (console_loglevel > CONSOLE_LOGLEVEL_QUIET)
|
||||
return;
|
||||
|
@ -448,7 +453,6 @@ static int efifb_probe(struct platform_device *dev)
|
|||
|
||||
info = framebuffer_alloc(sizeof(u32) * 16, &dev->dev);
|
||||
if (!info) {
|
||||
pr_err("efifb: cannot allocate framebuffer\n");
|
||||
err = -ENOMEM;
|
||||
goto err_release_mem;
|
||||
}
|
||||
|
|
|
@ -39,9 +39,7 @@ struct gbefb_par {
|
|||
int valid;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SGI_IP32
|
||||
#define GBE_BASE 0x16000000 /* SGI O2 */
|
||||
#endif
|
||||
|
||||
/* macro for fastest write-though access to the framebuffer */
|
||||
#ifdef CONFIG_MIPS
|
||||
|
@ -51,10 +49,6 @@ struct gbefb_par {
|
|||
#define pgprot_fb(_prot) (((_prot) & (~_CACHE_MASK)) | _CACHE_CACHABLE_NO_WA)
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_X86
|
||||
#define pgprot_fb(_prot) (((_prot) & ~_PAGE_CACHE_MASK) | \
|
||||
cachemode2protval(_PAGE_CACHE_MODE_UC_MINUS))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* RAM we reserve for the frame buffer. This defines the maximum screen
|
||||
|
@ -279,7 +273,7 @@ static void gbe_turn_off(void)
|
|||
val = 0;
|
||||
SET_GBE_FIELD(VT_XY, FREEZE, val, 1);
|
||||
gbe->vt_xy = val;
|
||||
udelay(10000);
|
||||
mdelay(10);
|
||||
for (i = 0; i < 10000; i++) {
|
||||
val = gbe->vt_xy;
|
||||
if (GET_GBE_FIELD(VT_XY, FREEZE, val) != 1)
|
||||
|
@ -294,7 +288,7 @@ static void gbe_turn_off(void)
|
|||
val = gbe->dotclock;
|
||||
SET_GBE_FIELD(DOTCLK, RUN, val, 0);
|
||||
gbe->dotclock = val;
|
||||
udelay(10000);
|
||||
mdelay(10);
|
||||
for (i = 0; i < 10000; i++) {
|
||||
val = gbe->dotclock;
|
||||
if (GET_GBE_FIELD(DOTCLK, RUN, val))
|
||||
|
@ -331,7 +325,7 @@ static void gbe_turn_on(void)
|
|||
val = gbe->dotclock;
|
||||
SET_GBE_FIELD(DOTCLK, RUN, val, 1);
|
||||
gbe->dotclock = val;
|
||||
udelay(10000);
|
||||
mdelay(10);
|
||||
for (i = 0; i < 10000; i++) {
|
||||
val = gbe->dotclock;
|
||||
if (GET_GBE_FIELD(DOTCLK, RUN, val) != 1)
|
||||
|
@ -346,7 +340,7 @@ static void gbe_turn_on(void)
|
|||
val = 0;
|
||||
SET_GBE_FIELD(VT_XY, FREEZE, val, 0);
|
||||
gbe->vt_xy = val;
|
||||
udelay(10000);
|
||||
mdelay(10);
|
||||
for (i = 0; i < 10000; i++) {
|
||||
val = gbe->vt_xy;
|
||||
if (GET_GBE_FIELD(VT_XY, FREEZE, val))
|
||||
|
@ -547,7 +541,7 @@ static void gbe_set_timing_info(struct gbe_timing_info *timing)
|
|||
SET_GBE_FIELD(DOTCLK, P, val, timing->pll_p);
|
||||
SET_GBE_FIELD(DOTCLK, RUN, val, 0); /* do not start yet */
|
||||
gbe->dotclock = val;
|
||||
udelay(10000);
|
||||
mdelay(10);
|
||||
|
||||
/* setup pixel counter */
|
||||
val = 0;
|
||||
|
@ -1018,9 +1012,10 @@ static int gbefb_mmap(struct fb_info *info,
|
|||
|
||||
/* remap using the fastest write-through mode on architecture */
|
||||
/* try not polluting the cache when possible */
|
||||
#ifdef CONFIG_MIPS
|
||||
pgprot_val(vma->vm_page_prot) =
|
||||
pgprot_fb(pgprot_val(vma->vm_page_prot));
|
||||
|
||||
#endif
|
||||
/* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by remap_pfn_range() */
|
||||
|
||||
/* look for the starting tile */
|
||||
|
|
|
@ -336,10 +336,8 @@ static int grvga_probe(struct platform_device *dev)
|
|||
char *options = NULL, *mode_opt = NULL;
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct grvga_par), &dev->dev);
|
||||
if (!info) {
|
||||
dev_err(&dev->dev, "framebuffer_alloc failed\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Expecting: "grvga: modestring, [addr:<framebuffer physical address>], [size:<framebuffer size>]
|
||||
*
|
||||
|
|
|
@ -643,10 +643,9 @@ static int gxt4500_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
}
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct gxt4500_par), &pdev->dev);
|
||||
if (!info) {
|
||||
dev_err(&pdev->dev, "gxt4500: cannot alloc FB info record\n");
|
||||
if (!info)
|
||||
goto err_free_fb;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
cardtype = ent->driver_data;
|
||||
par->refclk_ps = cardinfo[cardtype].refclk_ps;
|
||||
|
|
|
@ -762,10 +762,8 @@ static int hvfb_probe(struct hv_device *hdev,
|
|||
int ret;
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct hvfb_par), &hdev->device);
|
||||
if (!info) {
|
||||
pr_err("No memory for framebuffer info\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
par->info = info;
|
||||
|
|
|
@ -1006,10 +1006,8 @@ static int i740fb_probe(struct pci_dev *dev, const struct pci_device_id *ent)
|
|||
u8 *edid;
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct i740fb_par), &(dev->dev));
|
||||
if (!info) {
|
||||
dev_err(&(dev->dev), "cannot allocate framebuffer\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
mutex_init(&par->open_lock);
|
||||
|
|
|
@ -1477,11 +1477,8 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
printk(KERN_ERR "imsttfb: no OF node for pci device\n");
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct imstt_par), &pdev->dev);
|
||||
|
||||
if (!info) {
|
||||
printk(KERN_ERR "imsttfb: Can't allocate memory\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
|
||||
|
|
|
@ -974,10 +974,9 @@ static int imxfb_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
fbi->map_size = PAGE_ALIGN(info->fix.smem_len);
|
||||
info->screen_base = dma_alloc_wc(&pdev->dev, fbi->map_size,
|
||||
&fbi->map_dma, GFP_KERNEL);
|
||||
|
||||
if (!info->screen_base) {
|
||||
info->screen_buffer = dma_alloc_wc(&pdev->dev, fbi->map_size,
|
||||
&fbi->map_dma, GFP_KERNEL);
|
||||
if (!info->screen_buffer) {
|
||||
dev_err(&pdev->dev, "Failed to allocate video RAM: %d\n", ret);
|
||||
ret = -ENOMEM;
|
||||
goto failed_map;
|
||||
|
@ -1046,7 +1045,7 @@ failed_cmap:
|
|||
if (pdata && pdata->exit)
|
||||
pdata->exit(fbi->pdev);
|
||||
failed_platform_init:
|
||||
dma_free_wc(&pdev->dev, fbi->map_size, info->screen_base,
|
||||
dma_free_wc(&pdev->dev, fbi->map_size, info->screen_buffer,
|
||||
fbi->map_dma);
|
||||
failed_map:
|
||||
iounmap(fbi->regs);
|
||||
|
@ -1077,7 +1076,7 @@ static int imxfb_remove(struct platform_device *pdev)
|
|||
pdata = dev_get_platdata(&pdev->dev);
|
||||
if (pdata && pdata->exit)
|
||||
pdata->exit(fbi->pdev);
|
||||
dma_free_wc(&pdev->dev, fbi->map_size, info->screen_base,
|
||||
dma_free_wc(&pdev->dev, fbi->map_size, info->screen_buffer,
|
||||
fbi->map_dma);
|
||||
iounmap(fbi->regs);
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
|
|
|
@ -491,10 +491,9 @@ static int intelfb_pci_register(struct pci_dev *pdev,
|
|||
}
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct intelfb_info), &pdev->dev);
|
||||
if (!info) {
|
||||
ERR_MSG("Could not allocate memory for intelfb_info.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
|
||||
if (fb_alloc_cmap(&info->cmap, 256, 1) < 0) {
|
||||
ERR_MSG("Could not allocate cmap for intelfb_info.\n");
|
||||
goto err_out_cmap;
|
||||
|
|
|
@ -457,7 +457,6 @@ static int jzfb_alloc_devmem(struct jzfb *jzfb)
|
|||
{
|
||||
int max_videosize = 0;
|
||||
struct fb_videomode *mode = jzfb->pdata->modes;
|
||||
void *page;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < jzfb->pdata->num_modes; ++mode, ++i) {
|
||||
|
@ -482,12 +481,6 @@ static int jzfb_alloc_devmem(struct jzfb *jzfb)
|
|||
if (!jzfb->vidmem)
|
||||
goto err_free_framedesc;
|
||||
|
||||
for (page = jzfb->vidmem;
|
||||
page < jzfb->vidmem + PAGE_ALIGN(jzfb->vidmem_size);
|
||||
page += PAGE_SIZE) {
|
||||
SetPageReserved(virt_to_page(page));
|
||||
}
|
||||
|
||||
jzfb->framedesc->next = jzfb->framedesc_phys;
|
||||
jzfb->framedesc->addr = jzfb->vidmem_phys;
|
||||
jzfb->framedesc->id = 0xdeafbead;
|
||||
|
@ -535,10 +528,8 @@ static int jzfb_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
fb = framebuffer_alloc(sizeof(struct jzfb), &pdev->dev);
|
||||
if (!fb) {
|
||||
dev_err(&pdev->dev, "Failed to allocate framebuffer device\n");
|
||||
if (!fb)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
fb->fbops = &jzfb_ops;
|
||||
fb->flags = FBINFO_DEFAULT;
|
||||
|
|
|
@ -680,10 +680,8 @@ static int of_platform_mb862xx_probe(struct platform_device *ofdev)
|
|||
}
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct mb862xxfb_par), dev);
|
||||
if (info == NULL) {
|
||||
dev_err(dev, "cannot allocate framebuffer\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
par->info = info;
|
||||
|
@ -1005,7 +1003,6 @@ static int mb862xx_pci_probe(struct pci_dev *pdev,
|
|||
|
||||
info = framebuffer_alloc(sizeof(struct mb862xxfb_par), dev);
|
||||
if (!info) {
|
||||
dev_err(dev, "framebuffer alloc failed\n");
|
||||
ret = -ENOMEM;
|
||||
goto dis_dev;
|
||||
}
|
||||
|
|
|
@ -899,10 +899,8 @@ static int mbxfb_probe(struct platform_device *dev)
|
|||
}
|
||||
|
||||
fbi = framebuffer_alloc(sizeof(struct mbxfb_info), &dev->dev);
|
||||
if (fbi == NULL) {
|
||||
dev_err(&dev->dev, "framebuffer_alloc failed\n");
|
||||
if (!fbi)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mfbi = fbi->par;
|
||||
fbi->pseudo_palette = mfbi->pseudo_palette;
|
||||
|
|
|
@ -433,7 +433,7 @@ static int mmphw_probe(struct platform_device *pdev)
|
|||
{
|
||||
struct mmp_mach_plat_info *mi;
|
||||
struct resource *res;
|
||||
int ret, i, size, irq;
|
||||
int ret, i, irq;
|
||||
struct mmphw_path_plat *path_plat;
|
||||
struct mmphw_ctrl *ctrl = NULL;
|
||||
|
||||
|
@ -461,9 +461,9 @@ static int mmphw_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* allocate */
|
||||
size = sizeof(struct mmphw_ctrl) + sizeof(struct mmphw_path_plat) *
|
||||
mi->path_num;
|
||||
ctrl = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
|
||||
ctrl = devm_kzalloc(&pdev->dev,
|
||||
struct_size(ctrl, path_plats, mi->path_num),
|
||||
GFP_KERNEL);
|
||||
if (!ctrl) {
|
||||
ret = -ENOMEM;
|
||||
goto failed;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -2122,14 +2122,7 @@ static void neofb_remove(struct pci_dev *dev)
|
|||
DBG("neofb_remove");
|
||||
|
||||
if (info) {
|
||||
/*
|
||||
* If unregister_framebuffer fails, then
|
||||
* we will be leaving hooks that could cause
|
||||
* oopsen laying around.
|
||||
*/
|
||||
if (unregister_framebuffer(info))
|
||||
printk(KERN_WARNING
|
||||
"neofb: danger danger! Oopsen imminent!\n");
|
||||
unregister_framebuffer(info);
|
||||
|
||||
neo_unmap_video(info);
|
||||
fb_destroy_modedb(info->monspecs.modedb);
|
||||
|
|
|
@ -1502,8 +1502,6 @@ static int planes_init(struct omapfb_device *fbdev)
|
|||
fbi = framebuffer_alloc(sizeof(struct omapfb_plane_struct),
|
||||
fbdev->dev);
|
||||
if (fbi == NULL) {
|
||||
dev_err(fbdev->dev,
|
||||
"unable to allocate memory for plane info\n");
|
||||
planes_cleanup(fbdev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
|
@ -39,18 +39,6 @@ config FB_OMAP2_DSS_DPI
|
|||
help
|
||||
DPI Interface. This is the Parallel Display Interface.
|
||||
|
||||
config FB_OMAP2_DSS_RFBI
|
||||
bool "RFBI support"
|
||||
depends on BROKEN
|
||||
help
|
||||
MIPI DBI support (RFBI, Remote Framebuffer Interface, in Texas
|
||||
Instrument's terminology).
|
||||
|
||||
DBI is a bus between the host processor and a peripheral,
|
||||
such as a display or a framebuffer chip.
|
||||
|
||||
See http://www.mipi.org/ for DBI specifications.
|
||||
|
||||
config FB_OMAP2_DSS_VENC
|
||||
bool "VENC support"
|
||||
default y
|
||||
|
|
|
@ -8,7 +8,6 @@ omapdss-y := core.o dss.o dss_features.o dispc.o dispc_coefs.o display.o \
|
|||
omapdss-y += manager.o manager-sysfs.o overlay.o overlay-sysfs.o apply.o \
|
||||
dispc-compat.o display-sysfs.o
|
||||
omapdss-$(CONFIG_FB_OMAP2_DSS_DPI) += dpi.o
|
||||
omapdss-$(CONFIG_FB_OMAP2_DSS_RFBI) += rfbi.o
|
||||
omapdss-$(CONFIG_FB_OMAP2_DSS_VENC) += venc.o
|
||||
omapdss-$(CONFIG_FB_OMAP2_DSS_SDI) += sdi.o
|
||||
omapdss-$(CONFIG_FB_OMAP2_DSS_DSI) += dsi.o
|
||||
|
|
|
@ -207,9 +207,6 @@ static int (*dss_output_drv_reg_funcs[])(void) __initdata = {
|
|||
#ifdef CONFIG_FB_OMAP2_DSS_SDI
|
||||
sdi_init_platform_driver,
|
||||
#endif
|
||||
#ifdef CONFIG_FB_OMAP2_DSS_RFBI
|
||||
rfbi_init_platform_driver,
|
||||
#endif
|
||||
#ifdef CONFIG_FB_OMAP2_DSS_VENC
|
||||
venc_init_platform_driver,
|
||||
#endif
|
||||
|
@ -231,9 +228,6 @@ static void (*dss_output_drv_unreg_funcs[])(void) = {
|
|||
#ifdef CONFIG_FB_OMAP2_DSS_VENC
|
||||
venc_uninit_platform_driver,
|
||||
#endif
|
||||
#ifdef CONFIG_FB_OMAP2_DSS_RFBI
|
||||
rfbi_uninit_platform_driver,
|
||||
#endif
|
||||
#ifdef CONFIG_FB_OMAP2_DSS_SDI
|
||||
sdi_uninit_platform_driver,
|
||||
#endif
|
||||
|
|
|
@ -461,10 +461,6 @@ void hdmi4_uninit_platform_driver(void);
|
|||
int hdmi5_init_platform_driver(void) __init;
|
||||
void hdmi5_uninit_platform_driver(void);
|
||||
|
||||
/* RFBI */
|
||||
int rfbi_init_platform_driver(void) __init;
|
||||
void rfbi_uninit_platform_driver(void);
|
||||
|
||||
|
||||
#ifdef CONFIG_FB_OMAP2_DSS_COLLECT_IRQ_STATS
|
||||
static inline void dss_collect_irq_stats(u32 irqstatus, unsigned *irq_arr)
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1881,12 +1881,8 @@ static int omapfb_create_framebuffers(struct omapfb2_device *fbdev)
|
|||
|
||||
fbi = framebuffer_alloc(sizeof(struct omapfb_info),
|
||||
fbdev->dev);
|
||||
|
||||
if (fbi == NULL) {
|
||||
dev_err(fbdev->dev,
|
||||
"unable to allocate memory for plane info\n");
|
||||
if (!fbi)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
clear_fb_info(fbi);
|
||||
|
||||
|
|
|
@ -49,8 +49,7 @@ static ssize_t store_rotate_type(struct device *dev,
|
|||
if (rot_type != OMAP_DSS_ROT_DMA && rot_type != OMAP_DSS_ROT_VRFB)
|
||||
return -EINVAL;
|
||||
|
||||
if (!lock_fb_info(fbi))
|
||||
return -ENODEV;
|
||||
lock_fb_info(fbi);
|
||||
|
||||
r = 0;
|
||||
if (rot_type == ofbi->rotation_type)
|
||||
|
@ -101,8 +100,7 @@ static ssize_t store_mirror(struct device *dev,
|
|||
if (r)
|
||||
return r;
|
||||
|
||||
if (!lock_fb_info(fbi))
|
||||
return -ENODEV;
|
||||
lock_fb_info(fbi);
|
||||
|
||||
ofbi->mirror = mirror;
|
||||
|
||||
|
@ -138,8 +136,7 @@ static ssize_t show_overlays(struct device *dev,
|
|||
ssize_t l = 0;
|
||||
int t;
|
||||
|
||||
if (!lock_fb_info(fbi))
|
||||
return -ENODEV;
|
||||
lock_fb_info(fbi);
|
||||
omapfb_lock(fbdev);
|
||||
|
||||
for (t = 0; t < ofbi->num_overlays; t++) {
|
||||
|
@ -197,8 +194,7 @@ static ssize_t store_overlays(struct device *dev, struct device_attribute *attr,
|
|||
if (buf[len - 1] == '\n')
|
||||
len = len - 1;
|
||||
|
||||
if (!lock_fb_info(fbi))
|
||||
return -ENODEV;
|
||||
lock_fb_info(fbi);
|
||||
omapfb_lock(fbdev);
|
||||
|
||||
if (len > 0) {
|
||||
|
@ -329,8 +325,7 @@ static ssize_t show_overlays_rotate(struct device *dev,
|
|||
ssize_t l = 0;
|
||||
int t;
|
||||
|
||||
if (!lock_fb_info(fbi))
|
||||
return -ENODEV;
|
||||
lock_fb_info(fbi);
|
||||
|
||||
for (t = 0; t < ofbi->num_overlays; t++) {
|
||||
l += snprintf(buf + l, PAGE_SIZE - l, "%s%d",
|
||||
|
@ -358,8 +353,7 @@ static ssize_t store_overlays_rotate(struct device *dev,
|
|||
if (buf[len - 1] == '\n')
|
||||
len = len - 1;
|
||||
|
||||
if (!lock_fb_info(fbi))
|
||||
return -ENODEV;
|
||||
lock_fb_info(fbi);
|
||||
|
||||
if (len > 0) {
|
||||
char *p = (char *)buf;
|
||||
|
@ -442,8 +436,7 @@ static ssize_t store_size(struct device *dev, struct device_attribute *attr,
|
|||
|
||||
size = PAGE_ALIGN(size);
|
||||
|
||||
if (!lock_fb_info(fbi))
|
||||
return -ENODEV;
|
||||
lock_fb_info(fbi);
|
||||
|
||||
if (display && display->driver->sync)
|
||||
display->driver->sync(display);
|
||||
|
|
|
@ -538,10 +538,9 @@ static int platinumfb_probe(struct platform_device* odev)
|
|||
dev_info(&odev->dev, "Found Apple Platinum video hardware\n");
|
||||
|
||||
info = framebuffer_alloc(sizeof(*pinfo), &odev->dev);
|
||||
if (info == NULL) {
|
||||
dev_err(&odev->dev, "Failed to allocate fbdev !\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pinfo = info->par;
|
||||
|
||||
if (of_address_to_resource(dp, 0, &pinfo->rsrc_reg) ||
|
||||
|
|
|
@ -165,10 +165,8 @@ static int pmagaafb_probe(struct device *dev)
|
|||
int err;
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct aafb_par), dev);
|
||||
if (!info) {
|
||||
printk(KERN_ERR "%s: Cannot allocate memory\n", dev_name(dev));
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
dev_set_drvdata(dev, info);
|
||||
|
|
|
@ -150,10 +150,8 @@ static int pmagbafb_probe(struct device *dev)
|
|||
int err;
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct pmagbafb_par), dev);
|
||||
if (!info) {
|
||||
printk(KERN_ERR "%s: Cannot allocate memory\n", dev_name(dev));
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
dev_set_drvdata(dev, info);
|
||||
|
|
|
@ -257,10 +257,8 @@ static int pmagbbfb_probe(struct device *dev)
|
|||
int err;
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct pmagbbfb_par), dev);
|
||||
if (!info) {
|
||||
printk(KERN_ERR "%s: Cannot allocate memory\n", dev_name(dev));
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
dev_set_drvdata(dev, info);
|
||||
|
|
|
@ -140,7 +140,7 @@ static struct pvr2fb_par {
|
|||
unsigned char is_doublescan; /* Are scanlines output twice? (doublescan) */
|
||||
unsigned char is_lowres; /* Is horizontal pixel-doubling enabled? */
|
||||
|
||||
unsigned long mmio_base; /* MMIO base */
|
||||
void __iomem *mmio_base; /* MMIO base */
|
||||
u32 palette[16];
|
||||
} *currentpar;
|
||||
|
||||
|
@ -194,39 +194,6 @@ static unsigned int shdma = PVR2_CASCADE_CHAN;
|
|||
static unsigned int pvr2dma = ONCHIP_NR_DMA_CHANNELS;
|
||||
#endif
|
||||
|
||||
static int pvr2fb_setcolreg(unsigned int regno, unsigned int red, unsigned int green, unsigned int blue,
|
||||
unsigned int transp, struct fb_info *info);
|
||||
static int pvr2fb_blank(int blank, struct fb_info *info);
|
||||
static unsigned long get_line_length(int xres_virtual, int bpp);
|
||||
static void set_color_bitfields(struct fb_var_screeninfo *var);
|
||||
static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info);
|
||||
static int pvr2fb_set_par(struct fb_info *info);
|
||||
static void pvr2_update_display(struct fb_info *info);
|
||||
static void pvr2_init_display(struct fb_info *info);
|
||||
static void pvr2_do_blank(void);
|
||||
static irqreturn_t pvr2fb_interrupt(int irq, void *dev_id);
|
||||
static int pvr2_init_cable(void);
|
||||
static int pvr2_get_param(const struct pvr2_params *p, const char *s,
|
||||
int val, int size);
|
||||
#ifdef CONFIG_PVR2_DMA
|
||||
static ssize_t pvr2fb_write(struct fb_info *info, const char *buf,
|
||||
size_t count, loff_t *ppos);
|
||||
#endif
|
||||
|
||||
static struct fb_ops pvr2fb_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.fb_setcolreg = pvr2fb_setcolreg,
|
||||
.fb_blank = pvr2fb_blank,
|
||||
.fb_check_var = pvr2fb_check_var,
|
||||
.fb_set_par = pvr2fb_set_par,
|
||||
#ifdef CONFIG_PVR2_DMA
|
||||
.fb_write = pvr2fb_write,
|
||||
#endif
|
||||
.fb_fillrect = cfb_fillrect,
|
||||
.fb_copyarea = cfb_copyarea,
|
||||
.fb_imageblit = cfb_imageblit,
|
||||
};
|
||||
|
||||
static struct fb_videomode pvr2_modedb[] = {
|
||||
/*
|
||||
* Broadcast video modes (PAL and NTSC). I'm unfamiliar with
|
||||
|
@ -354,6 +321,36 @@ static int pvr2fb_setcolreg(unsigned int regno, unsigned int red,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine the cable type and initialize the cable output format. Don't do
|
||||
* anything if the cable type has been overidden (via "cable:XX").
|
||||
*/
|
||||
|
||||
#define PCTRA ((void __iomem *)0xff80002c)
|
||||
#define PDTRA ((void __iomem *)0xff800030)
|
||||
#define VOUTC ((void __iomem *)0xa0702c00)
|
||||
|
||||
static int pvr2_init_cable(void)
|
||||
{
|
||||
if (cable_type < 0) {
|
||||
fb_writel((fb_readl(PCTRA) & 0xfff0ffff) | 0x000a0000,
|
||||
PCTRA);
|
||||
cable_type = (fb_readw(PDTRA) >> 8) & 3;
|
||||
}
|
||||
|
||||
/* Now select the output format (either composite or other) */
|
||||
/* XXX: Save the previous val first, as this reg is also AICA
|
||||
related */
|
||||
if (cable_type == CT_COMPOSITE)
|
||||
fb_writel(3 << 8, VOUTC);
|
||||
else if (cable_type == CT_RGB)
|
||||
fb_writel(1 << 9, VOUTC);
|
||||
else
|
||||
fb_writel(0, VOUTC);
|
||||
|
||||
return cable_type;
|
||||
}
|
||||
|
||||
static int pvr2fb_set_par(struct fb_info *info)
|
||||
{
|
||||
struct pvr2fb_par *par = (struct pvr2fb_par *)info->par;
|
||||
|
@ -623,7 +620,7 @@ static void pvr2_do_blank(void)
|
|||
is_blanked = do_blank > 0 ? do_blank : 0;
|
||||
}
|
||||
|
||||
static irqreturn_t pvr2fb_interrupt(int irq, void *dev_id)
|
||||
static irqreturn_t __maybe_unused pvr2fb_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct fb_info *info = dev_id;
|
||||
|
||||
|
@ -642,36 +639,6 @@ static irqreturn_t pvr2fb_interrupt(int irq, void *dev_id)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine the cable type and initialize the cable output format. Don't do
|
||||
* anything if the cable type has been overidden (via "cable:XX").
|
||||
*/
|
||||
|
||||
#define PCTRA 0xff80002c
|
||||
#define PDTRA 0xff800030
|
||||
#define VOUTC 0xa0702c00
|
||||
|
||||
static int pvr2_init_cable(void)
|
||||
{
|
||||
if (cable_type < 0) {
|
||||
fb_writel((fb_readl(PCTRA) & 0xfff0ffff) | 0x000a0000,
|
||||
PCTRA);
|
||||
cable_type = (fb_readw(PDTRA) >> 8) & 3;
|
||||
}
|
||||
|
||||
/* Now select the output format (either composite or other) */
|
||||
/* XXX: Save the previous val first, as this reg is also AICA
|
||||
related */
|
||||
if (cable_type == CT_COMPOSITE)
|
||||
fb_writel(3 << 8, VOUTC);
|
||||
else if (cable_type == CT_RGB)
|
||||
fb_writel(1 << 9, VOUTC);
|
||||
else
|
||||
fb_writel(0, VOUTC);
|
||||
|
||||
return cable_type;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PVR2_DMA
|
||||
static ssize_t pvr2fb_write(struct fb_info *info, const char *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
|
@ -742,6 +709,46 @@ out_unmap:
|
|||
}
|
||||
#endif /* CONFIG_PVR2_DMA */
|
||||
|
||||
static struct fb_ops pvr2fb_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.fb_setcolreg = pvr2fb_setcolreg,
|
||||
.fb_blank = pvr2fb_blank,
|
||||
.fb_check_var = pvr2fb_check_var,
|
||||
.fb_set_par = pvr2fb_set_par,
|
||||
#ifdef CONFIG_PVR2_DMA
|
||||
.fb_write = pvr2fb_write,
|
||||
#endif
|
||||
.fb_fillrect = cfb_fillrect,
|
||||
.fb_copyarea = cfb_copyarea,
|
||||
.fb_imageblit = cfb_imageblit,
|
||||
};
|
||||
|
||||
#ifndef MODULE
|
||||
static int pvr2_get_param_val(const struct pvr2_params *p, const char *s,
|
||||
int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
if (!strncasecmp(p[i].name, s, strlen(s)))
|
||||
return p[i].val;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static char *pvr2_get_param_name(const struct pvr2_params *p, int val,
|
||||
int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
if (p[i].val == val)
|
||||
return p[i].name;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* pvr2fb_common_init
|
||||
*
|
||||
|
@ -760,7 +767,7 @@ out_unmap:
|
|||
* in for flexibility anyways. Who knows, maybe someone has tv-out on a
|
||||
* PCI-based version of these things ;-)
|
||||
*/
|
||||
static int pvr2fb_common_init(void)
|
||||
static int __maybe_unused pvr2fb_common_init(void)
|
||||
{
|
||||
struct pvr2fb_par *par = currentpar;
|
||||
unsigned long modememused, rev;
|
||||
|
@ -773,8 +780,8 @@ static int pvr2fb_common_init(void)
|
|||
goto out_err;
|
||||
}
|
||||
|
||||
par->mmio_base = (unsigned long)ioremap_nocache(pvr2_fix.mmio_start,
|
||||
pvr2_fix.mmio_len);
|
||||
par->mmio_base = ioremap_nocache(pvr2_fix.mmio_start,
|
||||
pvr2_fix.mmio_len);
|
||||
if (!par->mmio_base) {
|
||||
printk(KERN_ERR "pvr2fb: Failed to remap mmio space\n");
|
||||
goto out_err;
|
||||
|
@ -822,8 +829,8 @@ static int pvr2fb_common_init(void)
|
|||
fb_info->var.xres, fb_info->var.yres,
|
||||
fb_info->var.bits_per_pixel,
|
||||
get_line_length(fb_info->var.xres, fb_info->var.bits_per_pixel),
|
||||
(char *)pvr2_get_param(cables, NULL, cable_type, 3),
|
||||
(char *)pvr2_get_param(outputs, NULL, video_output, 3));
|
||||
pvr2_get_param_name(cables, cable_type, 3),
|
||||
pvr2_get_param_name(outputs, video_output, 3));
|
||||
|
||||
#ifdef CONFIG_SH_STORE_QUEUES
|
||||
fb_notice(fb_info, "registering with SQ API\n");
|
||||
|
@ -841,7 +848,7 @@ out_err:
|
|||
if (fb_info->screen_base)
|
||||
iounmap(fb_info->screen_base);
|
||||
if (par->mmio_base)
|
||||
iounmap((void *)par->mmio_base);
|
||||
iounmap(par->mmio_base);
|
||||
|
||||
return -ENXIO;
|
||||
}
|
||||
|
@ -901,15 +908,15 @@ static int __init pvr2fb_dc_init(void)
|
|||
return pvr2fb_common_init();
|
||||
}
|
||||
|
||||
static void __exit pvr2fb_dc_exit(void)
|
||||
static void pvr2fb_dc_exit(void)
|
||||
{
|
||||
if (fb_info->screen_base) {
|
||||
iounmap(fb_info->screen_base);
|
||||
fb_info->screen_base = NULL;
|
||||
}
|
||||
if (currentpar->mmio_base) {
|
||||
iounmap((void *)currentpar->mmio_base);
|
||||
currentpar->mmio_base = 0;
|
||||
iounmap(currentpar->mmio_base);
|
||||
currentpar->mmio_base = NULL;
|
||||
}
|
||||
|
||||
free_irq(HW_EVENT_VSYNC, fb_info);
|
||||
|
@ -958,8 +965,8 @@ static void pvr2fb_pci_remove(struct pci_dev *pdev)
|
|||
fb_info->screen_base = NULL;
|
||||
}
|
||||
if (currentpar->mmio_base) {
|
||||
iounmap((void *)currentpar->mmio_base);
|
||||
currentpar->mmio_base = 0;
|
||||
iounmap(currentpar->mmio_base);
|
||||
currentpar->mmio_base = NULL;
|
||||
}
|
||||
|
||||
pci_release_regions(pdev);
|
||||
|
@ -985,29 +992,12 @@ static int __init pvr2fb_pci_init(void)
|
|||
return pci_register_driver(&pvr2fb_pci_driver);
|
||||
}
|
||||
|
||||
static void __exit pvr2fb_pci_exit(void)
|
||||
static void pvr2fb_pci_exit(void)
|
||||
{
|
||||
pci_unregister_driver(&pvr2fb_pci_driver);
|
||||
}
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
static int pvr2_get_param(const struct pvr2_params *p, const char *s, int val,
|
||||
int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < size ; i++ ) {
|
||||
if (s != NULL) {
|
||||
if (!strncasecmp(p[i].name, s, strlen(s)))
|
||||
return p[i].val;
|
||||
} else {
|
||||
if (p[i].val == val)
|
||||
return (int)p[i].name;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse command arguments. Supported arguments are:
|
||||
* inverse Use inverse color maps
|
||||
|
@ -1047,9 +1037,9 @@ static int __init pvr2fb_setup(char *options)
|
|||
}
|
||||
|
||||
if (*cable_arg)
|
||||
cable_type = pvr2_get_param(cables, cable_arg, 0, 3);
|
||||
cable_type = pvr2_get_param_val(cables, cable_arg, 3);
|
||||
if (*output_arg)
|
||||
video_output = pvr2_get_param(outputs, output_arg, 0, 3);
|
||||
video_output = pvr2_get_param_val(outputs, output_arg, 3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1082,12 +1072,8 @@ static int __init pvr2fb_init(void)
|
|||
#endif
|
||||
|
||||
fb_info = framebuffer_alloc(sizeof(struct pvr2fb_par), NULL);
|
||||
|
||||
if (!fb_info) {
|
||||
printk(KERN_ERR "Failed to allocate memory for fb_info\n");
|
||||
if (!fb_info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
currentpar = fb_info->par;
|
||||
|
||||
|
|
|
@ -1902,7 +1902,6 @@ static int rivafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
|
|||
|
||||
info = framebuffer_alloc(sizeof(struct riva_par), &pd->dev);
|
||||
if (!info) {
|
||||
printk (KERN_ERR PFX "could not allocate memory\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_ret;
|
||||
}
|
||||
|
|
|
@ -284,7 +284,7 @@ static int s3c_fb_check_var(struct fb_var_screeninfo *var,
|
|||
/* 666 with one bit alpha/transparency */
|
||||
var->transp.offset = 18;
|
||||
var->transp.length = 1;
|
||||
/* drop through */
|
||||
/* fall through */
|
||||
case 18:
|
||||
var->bits_per_pixel = 32;
|
||||
|
||||
|
@ -312,7 +312,7 @@ static int s3c_fb_check_var(struct fb_var_screeninfo *var,
|
|||
case 25:
|
||||
var->transp.length = var->bits_per_pixel - 24;
|
||||
var->transp.offset = 24;
|
||||
/* drop through */
|
||||
/* fall through */
|
||||
case 24:
|
||||
/* our 24bpp is unpacked, so 32bpp */
|
||||
var->bits_per_pixel = 32;
|
||||
|
@ -809,7 +809,7 @@ static int s3c_fb_blank(int blank_mode, struct fb_info *info)
|
|||
case FB_BLANK_POWERDOWN:
|
||||
wincon &= ~WINCONx_ENWIN;
|
||||
sfb->enabled &= ~(1 << index);
|
||||
/* fall through to FB_BLANK_NORMAL */
|
||||
/* fall through - to FB_BLANK_NORMAL */
|
||||
|
||||
case FB_BLANK_NORMAL:
|
||||
/* disable the DMA and display 0x0 (black) */
|
||||
|
@ -1102,14 +1102,14 @@ static int s3c_fb_alloc_memory(struct s3c_fb *sfb, struct s3c_fb_win *win)
|
|||
|
||||
dev_dbg(sfb->dev, "want %u bytes for window\n", size);
|
||||
|
||||
fbi->screen_base = dma_alloc_wc(sfb->dev, size, &map_dma, GFP_KERNEL);
|
||||
if (!fbi->screen_base)
|
||||
fbi->screen_buffer = dma_alloc_wc(sfb->dev, size, &map_dma, GFP_KERNEL);
|
||||
if (!fbi->screen_buffer)
|
||||
return -ENOMEM;
|
||||
|
||||
dev_dbg(sfb->dev, "mapped %x to %p\n",
|
||||
(unsigned int)map_dma, fbi->screen_base);
|
||||
(unsigned int)map_dma, fbi->screen_buffer);
|
||||
|
||||
memset(fbi->screen_base, 0x0, size);
|
||||
memset(fbi->screen_buffer, 0x0, size);
|
||||
fbi->fix.smem_start = map_dma;
|
||||
|
||||
return 0;
|
||||
|
@ -1126,9 +1126,9 @@ static void s3c_fb_free_memory(struct s3c_fb *sfb, struct s3c_fb_win *win)
|
|||
{
|
||||
struct fb_info *fbi = win->fbinfo;
|
||||
|
||||
if (fbi->screen_base)
|
||||
if (fbi->screen_buffer)
|
||||
dma_free_wc(sfb->dev, PAGE_ALIGN(fbi->fix.smem_len),
|
||||
fbi->screen_base, fbi->fix.smem_start);
|
||||
fbi->screen_buffer, fbi->fix.smem_start);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1186,10 +1186,8 @@ static int s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no,
|
|||
|
||||
fbinfo = framebuffer_alloc(sizeof(struct s3c_fb_win) +
|
||||
palette_size * sizeof(u32), sfb->dev);
|
||||
if (!fbinfo) {
|
||||
dev_err(sfb->dev, "failed to allocate framebuffer\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
if (!fbinfo)
|
||||
return -ENOMEM;
|
||||
|
||||
windata = sfb->pdata->win[win_no];
|
||||
initmode = *sfb->pdata->vtiming;
|
||||
|
|
|
@ -1128,10 +1128,8 @@ static int s3_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
|
||||
/* Allocate and fill driver data structure */
|
||||
info = framebuffer_alloc(sizeof(struct s3fb_info), &(dev->dev));
|
||||
if (!info) {
|
||||
dev_err(&(dev->dev), "cannot allocate memory\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
mutex_init(&par->open_lock);
|
||||
|
|
|
@ -974,35 +974,10 @@ static void sa1100fb_task(struct work_struct *w)
|
|||
*/
|
||||
static unsigned int sa1100fb_min_dma_period(struct sa1100fb_info *fbi)
|
||||
{
|
||||
#if 0
|
||||
unsigned int min_period = (unsigned int)-1;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_NR_CONSOLES; i++) {
|
||||
struct display *disp = &fb_display[i];
|
||||
unsigned int period;
|
||||
|
||||
/*
|
||||
* Do we own this display?
|
||||
*/
|
||||
if (disp->fb_info != &fbi->fb)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Ok, calculate its DMA period
|
||||
*/
|
||||
period = sa1100fb_display_dma_period(&disp->var);
|
||||
if (period < min_period)
|
||||
min_period = period;
|
||||
}
|
||||
|
||||
return min_period;
|
||||
#else
|
||||
/*
|
||||
* FIXME: we need to verify _all_ consoles.
|
||||
*/
|
||||
return sa1100fb_display_dma_period(&fbi->fb.var);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -2333,14 +2333,7 @@ static void savagefb_remove(struct pci_dev *dev)
|
|||
DBG("savagefb_remove");
|
||||
|
||||
if (info) {
|
||||
/*
|
||||
* If unregister_framebuffer fails, then
|
||||
* we will be leaving hooks that could cause
|
||||
* oopsen laying around.
|
||||
*/
|
||||
if (unregister_framebuffer(info))
|
||||
printk(KERN_WARNING "savagefb: danger danger! "
|
||||
"Oopsen imminent!\n");
|
||||
unregister_framebuffer(info);
|
||||
|
||||
#ifdef CONFIG_FB_SAVAGE_I2C
|
||||
savagefb_delete_i2c_busses(info);
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/ctype.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/fbcon.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -213,7 +214,6 @@ struct sh_mobile_lcdc_priv {
|
|||
struct sh_mobile_lcdc_chan ch[2];
|
||||
struct sh_mobile_lcdc_overlay overlays[4];
|
||||
|
||||
struct notifier_block notifier;
|
||||
int started;
|
||||
int forced_fourcc; /* 2 channel LCDC must share fourcc setting */
|
||||
};
|
||||
|
@ -534,89 +534,9 @@ static void sh_mobile_lcdc_display_off(struct sh_mobile_lcdc_chan *ch)
|
|||
ch->tx_dev->ops->display_off(ch->tx_dev);
|
||||
}
|
||||
|
||||
static bool
|
||||
sh_mobile_lcdc_must_reconfigure(struct sh_mobile_lcdc_chan *ch,
|
||||
const struct fb_videomode *new_mode)
|
||||
{
|
||||
dev_dbg(ch->info->dev, "Old %ux%u, new %ux%u\n",
|
||||
ch->display.mode.xres, ch->display.mode.yres,
|
||||
new_mode->xres, new_mode->yres);
|
||||
|
||||
/* It can be a different monitor with an equal video-mode */
|
||||
if (fb_mode_is_equal(&ch->display.mode, new_mode))
|
||||
return false;
|
||||
|
||||
dev_dbg(ch->info->dev, "Switching %u -> %u lines\n",
|
||||
ch->display.mode.yres, new_mode->yres);
|
||||
ch->display.mode = *new_mode;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int sh_mobile_lcdc_check_var(struct fb_var_screeninfo *var,
|
||||
struct fb_info *info);
|
||||
|
||||
static int sh_mobile_lcdc_display_notify(struct sh_mobile_lcdc_chan *ch,
|
||||
enum sh_mobile_lcdc_entity_event event,
|
||||
const struct fb_videomode *mode,
|
||||
const struct fb_monspecs *monspec)
|
||||
{
|
||||
struct fb_info *info = ch->info;
|
||||
struct fb_var_screeninfo var;
|
||||
int ret = 0;
|
||||
|
||||
switch (event) {
|
||||
case SH_MOBILE_LCDC_EVENT_DISPLAY_CONNECT:
|
||||
/* HDMI plug in */
|
||||
console_lock();
|
||||
if (lock_fb_info(info)) {
|
||||
|
||||
|
||||
ch->display.width = monspec->max_x * 10;
|
||||
ch->display.height = monspec->max_y * 10;
|
||||
|
||||
if (!sh_mobile_lcdc_must_reconfigure(ch, mode) &&
|
||||
info->state == FBINFO_STATE_RUNNING) {
|
||||
/* First activation with the default monitor.
|
||||
* Just turn on, if we run a resume here, the
|
||||
* logo disappears.
|
||||
*/
|
||||
info->var.width = ch->display.width;
|
||||
info->var.height = ch->display.height;
|
||||
sh_mobile_lcdc_display_on(ch);
|
||||
} else {
|
||||
/* New monitor or have to wake up */
|
||||
fb_set_suspend(info, 0);
|
||||
}
|
||||
|
||||
|
||||
unlock_fb_info(info);
|
||||
}
|
||||
console_unlock();
|
||||
break;
|
||||
|
||||
case SH_MOBILE_LCDC_EVENT_DISPLAY_DISCONNECT:
|
||||
/* HDMI disconnect */
|
||||
console_lock();
|
||||
if (lock_fb_info(info)) {
|
||||
fb_set_suspend(info, 1);
|
||||
unlock_fb_info(info);
|
||||
}
|
||||
console_unlock();
|
||||
break;
|
||||
|
||||
case SH_MOBILE_LCDC_EVENT_DISPLAY_MODE:
|
||||
/* Validate a proposed new mode */
|
||||
fb_videomode_to_var(&var, mode);
|
||||
var.bits_per_pixel = info->var.bits_per_pixel;
|
||||
var.grayscale = info->var.grayscale;
|
||||
ret = sh_mobile_lcdc_check_var(&var, info);
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Format helpers
|
||||
*/
|
||||
|
@ -1644,10 +1564,8 @@ sh_mobile_lcdc_overlay_fb_init(struct sh_mobile_lcdc_overlay *ovl)
|
|||
|
||||
/* Allocate and initialize the frame buffer device. */
|
||||
info = framebuffer_alloc(0, priv->dev);
|
||||
if (info == NULL) {
|
||||
dev_err(priv->dev, "unable to allocate fb_info\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ovl->info = info;
|
||||
|
||||
|
@ -1838,8 +1756,6 @@ static void sh_mobile_fb_reconfig(struct fb_info *info)
|
|||
struct sh_mobile_lcdc_chan *ch = info->par;
|
||||
struct fb_var_screeninfo var;
|
||||
struct fb_videomode mode;
|
||||
struct fb_event event;
|
||||
int evnt = FB_EVENT_MODE_CHANGE_ALL;
|
||||
|
||||
if (ch->use_count > 1 || (ch->use_count == 1 && !info->fbcon_par))
|
||||
/* More framebuffer users are active */
|
||||
|
@ -1861,14 +1777,7 @@ static void sh_mobile_fb_reconfig(struct fb_info *info)
|
|||
/* Couldn't reconfigure, hopefully, can continue as before */
|
||||
return;
|
||||
|
||||
/*
|
||||
* fb_set_var() calls the notifier change internally, only if
|
||||
* FBINFO_MISC_USEREVENT flag is set. Since we do not want to fake a
|
||||
* user event, we have to call the chain ourselves.
|
||||
*/
|
||||
event.info = info;
|
||||
event.data = &ch->display.mode;
|
||||
fb_notifier_call_chain(evnt, &event);
|
||||
fbcon_update_vcs(info, true);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2138,10 +2047,8 @@ sh_mobile_lcdc_channel_fb_init(struct sh_mobile_lcdc_chan *ch,
|
|||
* list and allocate the color map.
|
||||
*/
|
||||
info = framebuffer_alloc(0, priv->dev);
|
||||
if (info == NULL) {
|
||||
dev_err(priv->dev, "unable to allocate fb_info\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ch->info = info;
|
||||
|
||||
|
@ -2319,37 +2226,6 @@ static const struct dev_pm_ops sh_mobile_lcdc_dev_pm_ops = {
|
|||
* Framebuffer notifier
|
||||
*/
|
||||
|
||||
/* locking: called with info->lock held */
|
||||
static int sh_mobile_lcdc_notify(struct notifier_block *nb,
|
||||
unsigned long action, void *data)
|
||||
{
|
||||
struct fb_event *event = data;
|
||||
struct fb_info *info = event->info;
|
||||
struct sh_mobile_lcdc_chan *ch = info->par;
|
||||
|
||||
if (&ch->lcdc->notifier != nb)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
dev_dbg(info->dev, "%s(): action = %lu, data = %p\n",
|
||||
__func__, action, event->data);
|
||||
|
||||
switch(action) {
|
||||
case FB_EVENT_SUSPEND:
|
||||
sh_mobile_lcdc_display_off(ch);
|
||||
sh_mobile_lcdc_stop(ch->lcdc);
|
||||
break;
|
||||
case FB_EVENT_RESUME:
|
||||
mutex_lock(&ch->open_lock);
|
||||
sh_mobile_fb_reconfig(info);
|
||||
mutex_unlock(&ch->open_lock);
|
||||
|
||||
sh_mobile_lcdc_display_on(ch);
|
||||
sh_mobile_lcdc_start(ch->lcdc);
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Probe/remove and driver init/exit
|
||||
*/
|
||||
|
@ -2377,8 +2253,6 @@ static int sh_mobile_lcdc_remove(struct platform_device *pdev)
|
|||
struct sh_mobile_lcdc_priv *priv = platform_get_drvdata(pdev);
|
||||
unsigned int i;
|
||||
|
||||
fb_unregister_client(&priv->notifier);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(priv->overlays); i++)
|
||||
sh_mobile_lcdc_overlay_fb_unregister(&priv->overlays[i]);
|
||||
for (i = 0; i < ARRAY_SIZE(priv->ch); i++)
|
||||
|
@ -2540,8 +2414,6 @@ sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_chan *ch)
|
|||
unsigned int max_size;
|
||||
unsigned int i;
|
||||
|
||||
ch->notify = sh_mobile_lcdc_display_notify;
|
||||
|
||||
/* Validate the format. */
|
||||
format = sh_mobile_format_info(cfg->fourcc);
|
||||
if (format == NULL) {
|
||||
|
@ -2770,10 +2642,6 @@ static int sh_mobile_lcdc_probe(struct platform_device *pdev)
|
|||
goto err1;
|
||||
}
|
||||
|
||||
/* Failure ignored */
|
||||
priv->notifier.notifier_call = sh_mobile_lcdc_notify;
|
||||
fb_register_client(&priv->notifier);
|
||||
|
||||
return 0;
|
||||
err1:
|
||||
sh_mobile_lcdc_remove(pdev);
|
||||
|
|
|
@ -87,11 +87,6 @@ struct sh_mobile_lcdc_chan {
|
|||
unsigned long base_addr_c;
|
||||
unsigned int line_size;
|
||||
|
||||
int (*notify)(struct sh_mobile_lcdc_chan *ch,
|
||||
enum sh_mobile_lcdc_entity_event event,
|
||||
const struct fb_videomode *mode,
|
||||
const struct fb_monspecs *monspec);
|
||||
|
||||
/* Backlight */
|
||||
struct backlight_device *bl;
|
||||
unsigned int bl_brightness;
|
||||
|
|
|
@ -1865,10 +1865,8 @@ static int sm501fb_probe_one(struct sm501fb_info *info,
|
|||
}
|
||||
|
||||
fbi = framebuffer_alloc(sizeof(struct sm501fb_par), info->dev);
|
||||
if (fbi == NULL) {
|
||||
dev_err(info->dev, "cannot allocate %s framebuffer\n", name);
|
||||
if (!fbi)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = fbi->par;
|
||||
par->info = info;
|
||||
|
|
|
@ -1538,7 +1538,6 @@ static int smtcfb_pci_probe(struct pci_dev *pdev,
|
|||
|
||||
info = framebuffer_alloc(sizeof(*sfb), &pdev->dev);
|
||||
if (!info) {
|
||||
dev_err(&pdev->dev, "framebuffer_alloc failed\n");
|
||||
err = -ENOMEM;
|
||||
goto failed_free;
|
||||
}
|
||||
|
|
|
@ -1650,10 +1650,8 @@ static int ufx_usb_probe(struct usb_interface *interface,
|
|||
|
||||
/* allocates framebuffer driver structure, not framebuffer memory */
|
||||
info = framebuffer_alloc(0, &usbdev->dev);
|
||||
if (!info) {
|
||||
dev_err(dev->gdev, "framebuffer_alloc failed\n");
|
||||
if (!info)
|
||||
goto e_nomem;
|
||||
}
|
||||
|
||||
dev->info = info;
|
||||
info->par = dev;
|
||||
|
|
|
@ -555,10 +555,8 @@ static int ssd1307fb_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
info = framebuffer_alloc(sizeof(struct ssd1307fb_par), &client->dev);
|
||||
if (!info) {
|
||||
dev_err(&client->dev, "Couldn't allocate framebuffer.\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
par->info = info;
|
||||
|
|
|
@ -121,7 +121,6 @@ static int gfb_probe(struct platform_device *op)
|
|||
|
||||
info = framebuffer_alloc(sizeof(struct gfb_info), &op->dev);
|
||||
if (!info) {
|
||||
printk(KERN_ERR "gfb: Cannot allocate fb_info\n");
|
||||
err = -ENOMEM;
|
||||
goto err_out;
|
||||
}
|
||||
|
|
|
@ -132,7 +132,6 @@ static int s3d_pci_register(struct pci_dev *pdev,
|
|||
|
||||
info = framebuffer_alloc(sizeof(struct s3d_info), &pdev->dev);
|
||||
if (!info) {
|
||||
printk(KERN_ERR "s3d: Cannot allocate fb_info\n");
|
||||
err = -ENOMEM;
|
||||
goto err_disable;
|
||||
}
|
||||
|
|
|
@ -272,7 +272,6 @@ static int e3d_pci_register(struct pci_dev *pdev,
|
|||
|
||||
info = framebuffer_alloc(sizeof(struct e3d_info), &pdev->dev);
|
||||
if (!info) {
|
||||
printk(KERN_ERR "e3d: Cannot allocate fb_info\n");
|
||||
err = -ENOMEM;
|
||||
goto err_disable;
|
||||
}
|
||||
|
|
|
@ -1416,10 +1416,8 @@ static int tgafb_register(struct device *dev)
|
|||
|
||||
/* Allocate the fb and par structures. */
|
||||
info = framebuffer_alloc(sizeof(struct tga_par), dev);
|
||||
if (!info) {
|
||||
printk(KERN_ERR "tgafb: Cannot allocate memory\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
dev_set_drvdata(dev, info);
|
||||
|
|
|
@ -1686,10 +1686,8 @@ static int dlfb_usb_probe(struct usb_interface *intf,
|
|||
|
||||
/* allocates framebuffer driver structure, not framebuffer memory */
|
||||
info = framebuffer_alloc(0, &dlfb->udev->dev);
|
||||
if (!info) {
|
||||
dev_err(&dlfb->udev->dev, "framebuffer_alloc failed\n");
|
||||
if (!info)
|
||||
goto error;
|
||||
}
|
||||
|
||||
dlfb->info = info;
|
||||
info->par = dlfb;
|
||||
|
|
|
@ -1742,10 +1742,8 @@ int via_fb_pci_probe(struct viafb_dev *vdev)
|
|||
viafbinfo = framebuffer_alloc(viafb_par_length +
|
||||
ALIGN(sizeof(struct viafb_shared), BITS_PER_LONG/8),
|
||||
&vdev->pdev->dev);
|
||||
if (!viafbinfo) {
|
||||
printk(KERN_ERR"Could not allocate memory for viafb_info.\n");
|
||||
if (!viafbinfo)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
viaparinfo = (struct viafb_par *)viafbinfo->par;
|
||||
viaparinfo->shared = viafbinfo->par + viafb_par_length;
|
||||
|
@ -1820,8 +1818,6 @@ int via_fb_pci_probe(struct viafb_dev *vdev)
|
|||
viafbinfo1 = framebuffer_alloc(viafb_par_length,
|
||||
&vdev->pdev->dev);
|
||||
if (!viafbinfo1) {
|
||||
printk(KERN_ERR
|
||||
"allocate the second framebuffer struct error\n");
|
||||
rc = -ENOMEM;
|
||||
goto out_fb_release;
|
||||
}
|
||||
|
|
|
@ -669,10 +669,8 @@ static int vt8623_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
|
||||
/* Allocate and fill driver data structure */
|
||||
info = framebuffer_alloc(sizeof(struct vt8623fb_info), &(dev->dev));
|
||||
if (! info) {
|
||||
dev_err(&(dev->dev), "cannot allocate memory\n");
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
par = info->par;
|
||||
mutex_init(&par->open_lock);
|
||||
|
|
|
@ -168,9 +168,6 @@ extern void vc_SAK(struct work_struct *work);
|
|||
|
||||
#define CUR_DEFAULT CUR_UNDERLINE
|
||||
|
||||
static inline bool con_is_visible(const struct vc_data *vc)
|
||||
{
|
||||
return *vc->vc_display_fg == vc;
|
||||
}
|
||||
bool con_is_visible(const struct vc_data *vc);
|
||||
|
||||
#endif /* _LINUX_CONSOLE_STRUCT_H */
|
||||
|
|
|
@ -126,39 +126,15 @@ struct fb_cursor_user {
|
|||
|
||||
/* The resolution of the passed in fb_info about to change */
|
||||
#define FB_EVENT_MODE_CHANGE 0x01
|
||||
/* The display on this fb_info is being suspended, no access to the
|
||||
* framebuffer is allowed any more after that call returns
|
||||
*/
|
||||
#define FB_EVENT_SUSPEND 0x02
|
||||
/* The display on this fb_info was resumed, you can restore the display
|
||||
* if you own it
|
||||
*/
|
||||
#define FB_EVENT_RESUME 0x03
|
||||
/* An entry from the modelist was removed */
|
||||
#define FB_EVENT_MODE_DELETE 0x04
|
||||
/* A driver registered itself */
|
||||
|
||||
#ifdef CONFIG_GUMSTIX_AM200EPD
|
||||
/* only used by mach-pxa/am200epd.c */
|
||||
#define FB_EVENT_FB_REGISTERED 0x05
|
||||
/* A driver unregistered itself */
|
||||
#define FB_EVENT_FB_UNREGISTERED 0x06
|
||||
/* CONSOLE-SPECIFIC: get console to framebuffer mapping */
|
||||
#define FB_EVENT_GET_CONSOLE_MAP 0x07
|
||||
/* CONSOLE-SPECIFIC: set console to framebuffer mapping */
|
||||
#define FB_EVENT_SET_CONSOLE_MAP 0x08
|
||||
/* A hardware display blank change occurred */
|
||||
#endif
|
||||
|
||||
/* A display blank is requested */
|
||||
#define FB_EVENT_BLANK 0x09
|
||||
/* Private modelist is to be replaced */
|
||||
#define FB_EVENT_NEW_MODELIST 0x0A
|
||||
/* The resolution of the passed in fb_info about to change and
|
||||
all vc's should be changed */
|
||||
#define FB_EVENT_MODE_CHANGE_ALL 0x0B
|
||||
/* A software display blank change occurred */
|
||||
#define FB_EVENT_CONBLANK 0x0C
|
||||
/* Get drawing requirements */
|
||||
#define FB_EVENT_GET_REQ 0x0D
|
||||
/* Unbind from the console if possible */
|
||||
#define FB_EVENT_FB_UNBIND 0x0E
|
||||
/* CONSOLE-SPECIFIC: remap all consoles to new fb - for vga_switcheroo */
|
||||
#define FB_EVENT_REMAP_ALL_CONSOLE 0x0F
|
||||
/* A hardware display blank early change occurred */
|
||||
#define FB_EARLY_EVENT_BLANK 0x10
|
||||
/* A hardware display blank revert early change occurred */
|
||||
|
@ -633,8 +609,8 @@ extern ssize_t fb_sys_write(struct fb_info *info, const char __user *buf,
|
|||
|
||||
/* drivers/video/fbmem.c */
|
||||
extern int register_framebuffer(struct fb_info *fb_info);
|
||||
extern int unregister_framebuffer(struct fb_info *fb_info);
|
||||
extern int unlink_framebuffer(struct fb_info *fb_info);
|
||||
extern void unregister_framebuffer(struct fb_info *fb_info);
|
||||
extern void unlink_framebuffer(struct fb_info *fb_info);
|
||||
extern int remove_conflicting_pci_framebuffers(struct pci_dev *pdev, int res_id,
|
||||
const char *name);
|
||||
extern int remove_conflicting_framebuffers(struct apertures_struct *a,
|
||||
|
@ -660,7 +636,10 @@ extern struct class *fb_class;
|
|||
for (i = 0; i < FB_MAX; i++) \
|
||||
if (!registered_fb[i]) {} else
|
||||
|
||||
extern int lock_fb_info(struct fb_info *info);
|
||||
static inline void lock_fb_info(struct fb_info *info)
|
||||
{
|
||||
mutex_lock(&info->lock);
|
||||
}
|
||||
|
||||
static inline void unlock_fb_info(struct fb_info *info)
|
||||
{
|
||||
|
|
|
@ -4,9 +4,39 @@
|
|||
#ifdef CONFIG_FRAMEBUFFER_CONSOLE
|
||||
void __init fb_console_init(void);
|
||||
void __exit fb_console_exit(void);
|
||||
int fbcon_fb_registered(struct fb_info *info);
|
||||
void fbcon_fb_unregistered(struct fb_info *info);
|
||||
void fbcon_fb_unbind(struct fb_info *info);
|
||||
void fbcon_suspended(struct fb_info *info);
|
||||
void fbcon_resumed(struct fb_info *info);
|
||||
int fbcon_mode_deleted(struct fb_info *info,
|
||||
struct fb_videomode *mode);
|
||||
void fbcon_new_modelist(struct fb_info *info);
|
||||
void fbcon_get_requirement(struct fb_info *info,
|
||||
struct fb_blit_caps *caps);
|
||||
void fbcon_fb_blanked(struct fb_info *info, int blank);
|
||||
void fbcon_update_vcs(struct fb_info *info, bool all);
|
||||
void fbcon_remap_all(struct fb_info *info);
|
||||
int fbcon_set_con2fb_map_ioctl(void __user *argp);
|
||||
int fbcon_get_con2fb_map_ioctl(void __user *argp);
|
||||
#else
|
||||
static inline void fb_console_init(void) {}
|
||||
static inline void fb_console_exit(void) {}
|
||||
static inline int fbcon_fb_registered(struct fb_info *info) { return 0; }
|
||||
static inline void fbcon_fb_unregistered(struct fb_info *info) {}
|
||||
static inline void fbcon_fb_unbind(struct fb_info *info) {}
|
||||
static inline void fbcon_suspended(struct fb_info *info) {}
|
||||
static inline void fbcon_resumed(struct fb_info *info) {}
|
||||
static inline int fbcon_mode_deleted(struct fb_info *info,
|
||||
struct fb_videomode *mode) { return 0; }
|
||||
static inline void fbcon_new_modelist(struct fb_info *info) {}
|
||||
static inline void fbcon_get_requirement(struct fb_info *info,
|
||||
struct fb_blit_caps *caps) {}
|
||||
static inline void fbcon_fb_blanked(struct fb_info *info, int blank) {}
|
||||
static inline void fbcon_update_vcs(struct fb_info *info, bool all) {}
|
||||
static inline void fbcon_remap_all(struct fb_info *info) {}
|
||||
static inline int fbcon_set_con2fb_map_ioctl(void __user *argp) { return 0; }
|
||||
static inline int fbcon_get_con2fb_map_ioctl(void __user *argp) { return 0; }
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_FBCON_H */
|
||||
|
|
|
@ -114,11 +114,6 @@ enum omap_dss_trans_key_type {
|
|||
OMAP_DSS_COLOR_KEY_VID_SRC = 1,
|
||||
};
|
||||
|
||||
enum omap_rfbi_te_mode {
|
||||
OMAP_DSS_RFBI_TE_MODE_1 = 1,
|
||||
OMAP_DSS_RFBI_TE_MODE_2 = 2,
|
||||
};
|
||||
|
||||
enum omap_dss_signal_level {
|
||||
OMAPDSS_SIG_ACTIVE_LOW,
|
||||
OMAPDSS_SIG_ACTIVE_HIGH,
|
||||
|
@ -189,27 +184,6 @@ enum omap_dss_output_id {
|
|||
OMAP_DSS_OUTPUT_HDMI = 1 << 6,
|
||||
};
|
||||
|
||||
/* RFBI */
|
||||
|
||||
struct rfbi_timings {
|
||||
int cs_on_time;
|
||||
int cs_off_time;
|
||||
int we_on_time;
|
||||
int we_off_time;
|
||||
int re_on_time;
|
||||
int re_off_time;
|
||||
int we_cycle_time;
|
||||
int re_cycle_time;
|
||||
int cs_pulse_width;
|
||||
int access_time;
|
||||
|
||||
int clk_div;
|
||||
|
||||
u32 tim[5]; /* set by rfbi_convert_timings() */
|
||||
|
||||
int converted;
|
||||
};
|
||||
|
||||
/* DSI */
|
||||
|
||||
enum omap_dss_dsi_trans_mode {
|
||||
|
@ -640,11 +614,6 @@ struct omap_dss_device {
|
|||
u8 data_lines;
|
||||
} dpi;
|
||||
|
||||
struct {
|
||||
u8 channel;
|
||||
u8 data_lines;
|
||||
} rfbi;
|
||||
|
||||
struct {
|
||||
u8 datapairs;
|
||||
} sdi;
|
||||
|
@ -668,7 +637,6 @@ struct omap_dss_device {
|
|||
|
||||
struct {
|
||||
u8 pixel_size;
|
||||
struct rfbi_timings rfbi_timings;
|
||||
} ctrl;
|
||||
|
||||
const char *name;
|
||||
|
|
Loading…
Reference in a new issue