mirror of
https://github.com/suyu-emu/horinux.git
synced 2026-09-21 14:15:21 -07:00
Merge tag 'fbdev-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux
Pull fbdev updates from Tomi Valkeinen: - imxfb: fix lcd power up - small fixes and cleanups * tag 'fbdev-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux: fbdev: Use IS_ENABLED() instead of checking for built-in or module efifb: Don't show the mapping VA video: AMBA CLCD: Remove unncessary include in amba-clcd.c fbdev: ssd1307fb: Fix charge pump setting Documentation: fb: fix spelling mistakes fbdev: fbmem: implement error handling in fbmem_init() fbdev: sh_mipi_dsi: remove driver video: fbdev: imxfb: add some error handling video: fbdev: imxfb: fix semantic of .get_power and .set_power video: fbdev: omap2: Remove deprecated regulator_can_change_voltage() usage
This commit is contained in:
@@ -9,7 +9,7 @@ pairing that with a hardware framebuffer (16MB) on the other end of the
|
||||
USB wire. That hardware framebuffer is able to drive the VGA, DVI, or HDMI
|
||||
monitor with no CPU involvement until a pixel has to change.
|
||||
|
||||
The CPU or other local resource does all the rendering; optinally compares the
|
||||
The CPU or other local resource does all the rendering; optionally compares the
|
||||
result with a local shadow of the remote hardware framebuffer to identify
|
||||
the minimal set of pixels that have changed; and compresses and sends those
|
||||
pixels line-by-line via USB bulk transfers.
|
||||
@@ -66,10 +66,10 @@ means that from a hardware and fbdev software perspective, everything is good.
|
||||
At that point, a /dev/fb? interface will be present for user-mode applications
|
||||
to open and begin writing to the framebuffer of the DisplayLink device using
|
||||
standard fbdev calls. Note that if mmap() is used, by default the user mode
|
||||
application must send down damage notifcations to trigger repaints of the
|
||||
application must send down damage notifications to trigger repaints of the
|
||||
changed regions. Alternatively, udlfb can be recompiled with experimental
|
||||
defio support enabled, to support a page-fault based detection mechanism
|
||||
that can work without explicit notifcation.
|
||||
that can work without explicit notification.
|
||||
|
||||
The most common client of udlfb is xf86-video-displaylink or a modified
|
||||
xf86-video-fbdev X server. These servers have no real DisplayLink specific
|
||||
|
||||
@@ -8,10 +8,6 @@ menu "Graphics support"
|
||||
config HAVE_FB_ATMEL
|
||||
bool
|
||||
|
||||
config SH_MIPI_DSI
|
||||
tristate
|
||||
depends on (SUPERH || ARCH_SHMOBILE) && HAVE_CLK
|
||||
|
||||
config SH_LCD_MIPI_DSI
|
||||
bool
|
||||
|
||||
|
||||
@@ -1993,7 +1993,6 @@ config FB_SH_MOBILE_LCDC
|
||||
select FB_SYS_FOPS
|
||||
select FB_DEFERRED_IO
|
||||
select FB_BACKLIGHT
|
||||
select SH_MIPI_DSI if SH_LCD_MIPI_DSI
|
||||
---help---
|
||||
Frame buffer driver for the on-chip SH-Mobile LCD controller.
|
||||
|
||||
|
||||
@@ -117,7 +117,6 @@ obj-$(CONFIG_FB_SM501) += sm501fb.o
|
||||
obj-$(CONFIG_FB_UDL) += udlfb.o
|
||||
obj-$(CONFIG_FB_SMSCUFX) += smscufx.o
|
||||
obj-$(CONFIG_FB_XILINX) += xilinxfb.o
|
||||
obj-$(CONFIG_SH_MIPI_DSI) += sh_mipi_dsi.o
|
||||
obj-$(CONFIG_FB_SH_MOBILE_MERAM) += sh_mobile_meram.o
|
||||
obj-$(CONFIG_FB_SH_MOBILE_LCDC) += sh_mobile_lcdcfb.o
|
||||
obj-$(CONFIG_FB_OMAP) += omap/
|
||||
|
||||
@@ -34,8 +34,6 @@
|
||||
#include <video/of_display_timing.h>
|
||||
#include <video/videomode.h>
|
||||
|
||||
#include <asm/sizes.h>
|
||||
|
||||
#define to_clcd(info) container_of(info, struct clcd_fb, fb)
|
||||
|
||||
/* This is limited to 16 characters when displayed by X startup */
|
||||
|
||||
@@ -1854,17 +1854,31 @@ EXPORT_SYMBOL(fb_set_suspend);
|
||||
static int __init
|
||||
fbmem_init(void)
|
||||
{
|
||||
proc_create("fb", 0, NULL, &fb_proc_fops);
|
||||
int ret;
|
||||
|
||||
if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
|
||||
if (!proc_create("fb", 0, NULL, &fb_proc_fops))
|
||||
return -ENOMEM;
|
||||
|
||||
ret = register_chrdev(FB_MAJOR, "fb", &fb_fops);
|
||||
if (ret) {
|
||||
printk("unable to get major %d for fb devs\n", FB_MAJOR);
|
||||
goto err_chrdev;
|
||||
}
|
||||
|
||||
fb_class = class_create(THIS_MODULE, "graphics");
|
||||
if (IS_ERR(fb_class)) {
|
||||
printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
|
||||
ret = PTR_ERR(fb_class);
|
||||
pr_warn("Unable to create fb class; errno = %d\n", ret);
|
||||
fb_class = NULL;
|
||||
goto err_class;
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_class:
|
||||
unregister_chrdev(FB_MAJOR, "fb");
|
||||
err_chrdev:
|
||||
remove_proc_entry("fb", NULL);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef MODULE
|
||||
|
||||
@@ -237,10 +237,8 @@ static int efifb_probe(struct platform_device *dev)
|
||||
goto err_release_fb;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "efifb: framebuffer at 0x%lx, mapped to 0x%p, "
|
||||
"using %dk, total %dk\n",
|
||||
efifb_fix.smem_start, info->screen_base,
|
||||
size_remap/1024, size_total/1024);
|
||||
printk(KERN_INFO "efifb: framebuffer at 0x%lx, using %dk, total %dk\n",
|
||||
efifb_fix.smem_start, size_remap/1024, size_total/1024);
|
||||
printk(KERN_INFO "efifb: mode is %dx%dx%d, linelength=%d, pages=%d\n",
|
||||
efifb_defined.xres, efifb_defined.yres,
|
||||
efifb_defined.bits_per_pixel, efifb_fix.line_length,
|
||||
|
||||
+32
-12
@@ -473,11 +473,12 @@ static int imxfb_set_par(struct fb_info *info)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void imxfb_enable_controller(struct imxfb_info *fbi)
|
||||
static int imxfb_enable_controller(struct imxfb_info *fbi)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (fbi->enabled)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
pr_debug("Enabling LCD controller\n");
|
||||
|
||||
@@ -496,10 +497,29 @@ static void imxfb_enable_controller(struct imxfb_info *fbi)
|
||||
*/
|
||||
writel(RMCR_LCDC_EN_MX1, fbi->regs + LCDC_RMCR);
|
||||
|
||||
clk_prepare_enable(fbi->clk_ipg);
|
||||
clk_prepare_enable(fbi->clk_ahb);
|
||||
clk_prepare_enable(fbi->clk_per);
|
||||
ret = clk_prepare_enable(fbi->clk_ipg);
|
||||
if (ret)
|
||||
goto err_enable_ipg;
|
||||
|
||||
ret = clk_prepare_enable(fbi->clk_ahb);
|
||||
if (ret)
|
||||
goto err_enable_ahb;
|
||||
|
||||
ret = clk_prepare_enable(fbi->clk_per);
|
||||
if (ret)
|
||||
goto err_enable_per;
|
||||
|
||||
fbi->enabled = true;
|
||||
return 0;
|
||||
|
||||
err_enable_per:
|
||||
clk_disable_unprepare(fbi->clk_ahb);
|
||||
err_enable_ahb:
|
||||
clk_disable_unprepare(fbi->clk_ipg);
|
||||
err_enable_ipg:
|
||||
writel(0, fbi->regs + LCDC_RMCR);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void imxfb_disable_controller(struct imxfb_info *fbi)
|
||||
@@ -510,8 +530,8 @@ static void imxfb_disable_controller(struct imxfb_info *fbi)
|
||||
pr_debug("Disabling LCD controller\n");
|
||||
|
||||
clk_disable_unprepare(fbi->clk_per);
|
||||
clk_disable_unprepare(fbi->clk_ipg);
|
||||
clk_disable_unprepare(fbi->clk_ahb);
|
||||
clk_disable_unprepare(fbi->clk_ipg);
|
||||
fbi->enabled = false;
|
||||
|
||||
writel(0, fbi->regs + LCDC_RMCR);
|
||||
@@ -532,8 +552,7 @@ static int imxfb_blank(int blank, struct fb_info *info)
|
||||
break;
|
||||
|
||||
case FB_BLANK_UNBLANK:
|
||||
imxfb_enable_controller(fbi);
|
||||
break;
|
||||
return imxfb_enable_controller(fbi);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -758,10 +777,11 @@ static int imxfb_lcd_get_power(struct lcd_device *lcddev)
|
||||
{
|
||||
struct imxfb_info *fbi = dev_get_drvdata(&lcddev->dev);
|
||||
|
||||
if (!IS_ERR(fbi->lcd_pwr))
|
||||
return regulator_is_enabled(fbi->lcd_pwr);
|
||||
if (!IS_ERR(fbi->lcd_pwr) &&
|
||||
!regulator_is_enabled(fbi->lcd_pwr))
|
||||
return FB_BLANK_POWERDOWN;
|
||||
|
||||
return 1;
|
||||
return FB_BLANK_UNBLANK;
|
||||
}
|
||||
|
||||
static int imxfb_lcd_set_power(struct lcd_device *lcddev, int power)
|
||||
@@ -769,7 +789,7 @@ static int imxfb_lcd_set_power(struct lcd_device *lcddev, int power)
|
||||
struct imxfb_info *fbi = dev_get_drvdata(&lcddev->dev);
|
||||
|
||||
if (!IS_ERR(fbi->lcd_pwr)) {
|
||||
if (power)
|
||||
if (power == FB_BLANK_UNBLANK)
|
||||
return regulator_enable(fbi->lcd_pwr);
|
||||
else
|
||||
return regulator_disable(fbi->lcd_pwr);
|
||||
|
||||
@@ -1180,13 +1180,11 @@ static int dsi_regulator_init(struct platform_device *dsidev)
|
||||
return PTR_ERR(vdds_dsi);
|
||||
}
|
||||
|
||||
if (regulator_can_change_voltage(vdds_dsi)) {
|
||||
r = regulator_set_voltage(vdds_dsi, 1800000, 1800000);
|
||||
if (r) {
|
||||
devm_regulator_put(vdds_dsi);
|
||||
DSSERR("can't set the DSI regulator voltage\n");
|
||||
return r;
|
||||
}
|
||||
r = regulator_set_voltage(vdds_dsi, 1800000, 1800000);
|
||||
if (r) {
|
||||
devm_regulator_put(vdds_dsi);
|
||||
DSSERR("can't set the DSI regulator voltage\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
dsi->vdds_dsi_reg = vdds_dsi;
|
||||
|
||||
@@ -114,13 +114,11 @@ static int hdmi_init_regulator(void)
|
||||
return PTR_ERR(reg);
|
||||
}
|
||||
|
||||
if (regulator_can_change_voltage(reg)) {
|
||||
r = regulator_set_voltage(reg, 1800000, 1800000);
|
||||
if (r) {
|
||||
devm_regulator_put(reg);
|
||||
DSSWARN("can't set the regulator voltage\n");
|
||||
return r;
|
||||
}
|
||||
r = regulator_set_voltage(reg, 1800000, 1800000);
|
||||
if (r) {
|
||||
devm_regulator_put(reg);
|
||||
DSSWARN("can't set the regulator voltage\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
hdmi.vdda_reg = reg;
|
||||
|
||||
@@ -131,13 +131,11 @@ static int hdmi_init_regulator(void)
|
||||
return PTR_ERR(reg);
|
||||
}
|
||||
|
||||
if (regulator_can_change_voltage(reg)) {
|
||||
r = regulator_set_voltage(reg, 1800000, 1800000);
|
||||
if (r) {
|
||||
devm_regulator_put(reg);
|
||||
DSSWARN("can't set the regulator voltage\n");
|
||||
return r;
|
||||
}
|
||||
r = regulator_set_voltage(reg, 1800000, 1800000);
|
||||
if (r) {
|
||||
devm_regulator_put(reg);
|
||||
DSSWARN("can't set the regulator voltage\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
hdmi.vdda_reg = reg;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -389,7 +389,7 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
|
||||
return ret;
|
||||
|
||||
ret = ssd1307fb_write_cmd(par->client,
|
||||
(par->device_info->need_chargepump & 0x1 << 2) & 0x14);
|
||||
BIT(4) | (par->device_info->need_chargepump ? BIT(2) : 0));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -358,7 +358,7 @@ int viafb_setup_engine(struct fb_info *info)
|
||||
viapar->shared->vq_vram_addr = viapar->fbmem_free;
|
||||
viapar->fbmem_used += VQ_SIZE;
|
||||
|
||||
#if defined(CONFIG_VIDEO_VIA_CAMERA) || defined(CONFIG_VIDEO_VIA_CAMERA_MODULE)
|
||||
#if IS_ENABLED(CONFIG_VIDEO_VIA_CAMERA)
|
||||
/*
|
||||
* Set aside a chunk of framebuffer memory for the camera
|
||||
* driver. Someday this driver probably needs a proper allocator
|
||||
|
||||
@@ -116,7 +116,7 @@ EXPORT_SYMBOL_GPL(viafb_irq_disable);
|
||||
* most viafb systems will not need to have this extra code for a while.
|
||||
* As soon as another user comes long, the ifdef can be removed.
|
||||
*/
|
||||
#if defined(CONFIG_VIDEO_VIA_CAMERA) || defined(CONFIG_VIDEO_VIA_CAMERA_MODULE)
|
||||
#if IS_ENABLED(CONFIG_VIDEO_VIA_CAMERA)
|
||||
/*
|
||||
* Access to the DMA engine. This currently provides what the camera
|
||||
* driver needs (i.e. outgoing only) but is easily expandable if need
|
||||
@@ -542,7 +542,7 @@ static struct viafb_subdev_info {
|
||||
{
|
||||
.name = "viafb-i2c",
|
||||
},
|
||||
#if defined(CONFIG_VIDEO_VIA_CAMERA) || defined(CONFIG_VIDEO_VIA_CAMERA_MODULE)
|
||||
#if IS_ENABLED(CONFIG_VIDEO_VIA_CAMERA)
|
||||
{
|
||||
.name = "viafb-camera",
|
||||
},
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
* Public SH-mobile MIPI DSI header
|
||||
*
|
||||
* Copyright (C) 2010 Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef VIDEO_SH_MIPI_DSI_H
|
||||
#define VIDEO_SH_MIPI_DSI_H
|
||||
|
||||
enum sh_mipi_dsi_data_fmt {
|
||||
MIPI_RGB888,
|
||||
MIPI_RGB565,
|
||||
MIPI_RGB666_LP,
|
||||
MIPI_RGB666,
|
||||
MIPI_BGR888,
|
||||
MIPI_BGR565,
|
||||
MIPI_BGR666_LP,
|
||||
MIPI_BGR666,
|
||||
MIPI_YUYV,
|
||||
MIPI_UYVY,
|
||||
MIPI_YUV420_L,
|
||||
MIPI_YUV420,
|
||||
};
|
||||
|
||||
#define SH_MIPI_DSI_HSABM (1 << 0)
|
||||
#define SH_MIPI_DSI_HBPBM (1 << 1)
|
||||
#define SH_MIPI_DSI_HFPBM (1 << 2)
|
||||
#define SH_MIPI_DSI_BL2E (1 << 3)
|
||||
#define SH_MIPI_DSI_VSEE (1 << 4)
|
||||
#define SH_MIPI_DSI_HSEE (1 << 5)
|
||||
#define SH_MIPI_DSI_HSAE (1 << 6)
|
||||
|
||||
#define SH_MIPI_DSI_HSbyteCLK (1 << 24)
|
||||
#define SH_MIPI_DSI_HS6divCLK (1 << 25)
|
||||
#define SH_MIPI_DSI_HS4divCLK (1 << 26)
|
||||
|
||||
#define SH_MIPI_DSI_SYNC_PULSES_MODE (SH_MIPI_DSI_VSEE | \
|
||||
SH_MIPI_DSI_HSEE | \
|
||||
SH_MIPI_DSI_HSAE)
|
||||
#define SH_MIPI_DSI_SYNC_EVENTS_MODE (0)
|
||||
#define SH_MIPI_DSI_SYNC_BURST_MODE (SH_MIPI_DSI_BL2E)
|
||||
|
||||
struct sh_mipi_dsi_info {
|
||||
enum sh_mipi_dsi_data_fmt data_format;
|
||||
int channel;
|
||||
int lane;
|
||||
unsigned long flags;
|
||||
u32 clksrc;
|
||||
u32 phyctrl; /* for extra setting */
|
||||
unsigned int vsynw_offset;
|
||||
int (*set_dot_clock)(struct platform_device *pdev,
|
||||
void __iomem *base,
|
||||
int enable);
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user