diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig index 8ea45a5cd806..983280e8d93f 100644 --- a/drivers/video/fbdev/Kconfig +++ b/drivers/video/fbdev/Kconfig @@ -1808,8 +1808,8 @@ config FB_HIT frame buffer card. config FB_PMAG_AA - bool "PMAG-AA TURBOchannel framebuffer support" - depends on (FB = y) && TC + tristate "PMAG-AA TURBOchannel framebuffer support" + depends on FB && TC select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -1985,7 +1985,7 @@ config FB_W100 config FB_SH_MOBILE_LCDC tristate "SuperH Mobile LCDC framebuffer support" - depends on FB && (SUPERH || ARCH_SHMOBILE) && HAVE_CLK + depends on FB && (SUPERH || ARCH_RENESAS) && HAVE_CLK depends on FB_SH_MOBILE_MERAM || !FB_SH_MOBILE_MERAM select FB_SYS_FILLRECT select FB_SYS_COPYAREA @@ -2246,7 +2246,6 @@ config XEN_FBDEV_FRONTEND select FB_SYS_IMAGEBLIT select FB_SYS_FOPS select FB_DEFERRED_IO - select INPUT_XEN_KBDDEV_FRONTEND if INPUT_MISC select XEN_XENBUS_FRONTEND default y help diff --git a/drivers/video/fbdev/atafb.c b/drivers/video/fbdev/atafb.c index d6ce613e12ad..fcd2dd670a65 100644 --- a/drivers/video/fbdev/atafb.c +++ b/drivers/video/fbdev/atafb.c @@ -313,9 +313,6 @@ extern unsigned char fontdata_8x16[]; * * Draws cursor * * int (*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor); * - * * Rotates the display * - * void (*fb_rotate)(struct fb_info *info, int angle); - * * * wait for blit idle, optional * * int (*fb_sync)(struct fb_info *info); * diff --git a/drivers/video/fbdev/au1100fb.c b/drivers/video/fbdev/au1100fb.c index 59560189b24a..35df2c1a8a63 100644 --- a/drivers/video/fbdev/au1100fb.c +++ b/drivers/video/fbdev/au1100fb.c @@ -334,27 +334,6 @@ int au1100fb_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fbi) return 0; } -/* fb_rotate - * Rotate the display of this angle. This doesn't seems to be used by the core, - * but as our hardware supports it, so why not implementing it... - */ -void au1100fb_fb_rotate(struct fb_info *fbi, int angle) -{ - struct au1100fb_device *fbdev = to_au1100fb_device(fbi); - - print_dbg("fb_rotate %p %d", fbi, angle); - - if (fbdev && (angle > 0) && !(angle % 90)) { - - fbdev->regs->lcd_control &= ~LCD_CONTROL_GO; - - fbdev->regs->lcd_control &= ~(LCD_CONTROL_SM_MASK); - fbdev->regs->lcd_control |= ((angle/90) << LCD_CONTROL_SM_BIT); - - fbdev->regs->lcd_control |= LCD_CONTROL_GO; - } -} - /* fb_mmap * Map video memory in user space. We don't use the generic fb_mmap method mainly * to allow the use of the TLB streaming flag (CCA=6) @@ -380,7 +359,6 @@ static struct fb_ops au1100fb_ops = .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, - .fb_rotate = au1100fb_fb_rotate, .fb_mmap = au1100fb_fb_mmap, }; diff --git a/drivers/video/fbdev/bf537-lq035.c b/drivers/video/fbdev/bf537-lq035.c index 7db3052b471d..ef29fb425122 100644 --- a/drivers/video/fbdev/bf537-lq035.c +++ b/drivers/video/fbdev/bf537-lq035.c @@ -554,28 +554,6 @@ static int bfin_lq035_fb_check_var(struct fb_var_screeninfo *var, return 0; } -/* fb_rotate - * Rotate the display of this angle. This doesn't seems to be used by the core, - * but as our hardware supports it, so why not implementing it... - */ -static void bfin_lq035_fb_rotate(struct fb_info *fbi, int angle) -{ - pr_debug("%s: %p %d", __func__, fbi, angle); -#if (defined(UD) && defined(LBR)) - switch (angle) { - - case 180: - gpio_set_value(LBR, 0); - gpio_set_value(UD, 1); - break; - default: - gpio_set_value(LBR, 1); - gpio_set_value(UD, 0); - break; - } -#endif -} - static int bfin_lq035_fb_cursor(struct fb_info *info, struct fb_cursor *cursor) { if (nocursor) @@ -623,7 +601,6 @@ static struct fb_ops bfin_lq035_fb_ops = { .fb_open = bfin_lq035_fb_open, .fb_release = bfin_lq035_fb_release, .fb_check_var = bfin_lq035_fb_check_var, - .fb_rotate = bfin_lq035_fb_rotate, .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, diff --git a/drivers/video/fbdev/bt431.h b/drivers/video/fbdev/bt431.h index 04e0cfbba538..3929602f5867 100644 --- a/drivers/video/fbdev/bt431.h +++ b/drivers/video/fbdev/bt431.h @@ -2,6 +2,7 @@ * linux/drivers/video/bt431.h * * Copyright 2003 Thiemo Seufer + * Copyright 2016 Maciej W. Rozycki * * This file is subject to the terms and conditions of the GNU General * Public License. See the file COPYING in the main directory of this @@ -9,6 +10,8 @@ */ #include +#define BT431_CURSOR_SIZE 64 + /* * Bt431 cursor generator registers, 32-bit aligned. * Two twin Bt431 are used on the DECstation's PMAG-AA. @@ -60,7 +63,7 @@ static inline u8 bt431_get_value(u16 val) #define BT431_CMD_CURS_ENABLE 0x40 #define BT431_CMD_XHAIR_ENABLE 0x20 #define BT431_CMD_OR_CURSORS 0x10 -#define BT431_CMD_AND_CURSORS 0x00 +#define BT431_CMD_XOR_CURSORS 0x00 #define BT431_CMD_1_1_MUX 0x00 #define BT431_CMD_4_1_MUX 0x04 #define BT431_CMD_5_1_MUX 0x08 @@ -196,28 +199,30 @@ static inline void bt431_position_cursor(struct bt431_regs *regs, u16 x, u16 y) bt431_write_reg_inc(regs, (y >> 8) & 0x0f); /* BT431_REG_CYHI */ } -static inline void bt431_set_font(struct bt431_regs *regs, u8 fgc, - u16 width, u16 height) +static inline void bt431_set_cursor(struct bt431_regs *regs, + const char *data, const char *mask, + u16 rop, u16 width, u16 height) { + u16 x, y; int i; - u16 fgp = fgc ? 0xffff : 0x0000; - u16 bgp = fgc ? 0x0000 : 0xffff; + i = 0; + width = DIV_ROUND_UP(width, 8); bt431_select_reg(regs, BT431_REG_CRAM_BASE); - for (i = BT431_REG_CRAM_BASE; i <= BT431_REG_CRAM_END; i++) { - u16 value; + for (y = 0; y < BT431_CURSOR_SIZE; y++) + for (x = 0; x < BT431_CURSOR_SIZE / 8; x++) { + u16 val = 0; - if (height << 6 <= i << 3) - value = bgp; - else if (width <= i % 8 << 3) - value = bgp; - else if (((width >> 3) & 0xffff) > i % 8) - value = fgp; - else - value = fgp & ~(bgp << (width % 8 << 1)); - - bt431_write_cmap_inc(regs, value); - } + if (y < height && x < width) { + val = mask[i]; + if (rop == ROP_XOR) + val = (val << 8) | (val ^ data[i]); + else + val = (val << 8) | (val & data[i]); + i++; + } + bt431_write_cmap_inc(regs, val); + } } static inline void bt431_init_cursor(struct bt431_regs *regs) diff --git a/drivers/video/fbdev/bt455.h b/drivers/video/fbdev/bt455.h index 80f61b03e9ae..dd1404b40611 100644 --- a/drivers/video/fbdev/bt455.h +++ b/drivers/video/fbdev/bt455.h @@ -2,6 +2,7 @@ * linux/drivers/video/bt455.h * * Copyright 2003 Thiemo Seufer + * Copyright 2016 Maciej W. Rozycki * * This file is subject to the terms and conditions of the GNU General * Public License. See the file COPYING in the main directory of this @@ -29,66 +30,61 @@ static inline void bt455_select_reg(struct bt455_regs *regs, int ir) regs->addr_cmap = ir & 0x0f; } +static inline void bt455_reset_reg(struct bt455_regs *regs) +{ + mb(); + regs->addr_clr = 0; +} + /* * Read/write to a Bt455 color map register. */ -static inline void bt455_read_cmap_entry(struct bt455_regs *regs, int cr, - u8* red, u8* green, u8* blue) -{ - bt455_select_reg(regs, cr); - mb(); - *red = regs->addr_cmap_data & 0x0f; - rmb(); - *green = regs->addr_cmap_data & 0x0f; - rmb(); - *blue = regs->addr_cmap_data & 0x0f; -} - -static inline void bt455_write_cmap_entry(struct bt455_regs *regs, int cr, - u8 red, u8 green, u8 blue) -{ - bt455_select_reg(regs, cr); - wmb(); - regs->addr_cmap_data = red & 0x0f; - wmb(); - regs->addr_cmap_data = green & 0x0f; - wmb(); - regs->addr_cmap_data = blue & 0x0f; -} - -static inline void bt455_write_ovly_entry(struct bt455_regs *regs, int cr, - u8 red, u8 green, u8 blue) -{ - bt455_select_reg(regs, cr); - wmb(); - regs->addr_ovly = red & 0x0f; - wmb(); - regs->addr_ovly = green & 0x0f; - wmb(); - regs->addr_ovly = blue & 0x0f; -} - -static inline void bt455_set_cursor(struct bt455_regs *regs) +static inline void bt455_read_cmap_next(struct bt455_regs *regs, u8 *grey) { mb(); - regs->addr_ovly = 0x0f; - wmb(); - regs->addr_ovly = 0x0f; - wmb(); - regs->addr_ovly = 0x0f; + regs->addr_cmap_data; + rmb(); + *grey = regs->addr_cmap_data & 0xf; + rmb(); + regs->addr_cmap_data; } -static inline void bt455_erase_cursor(struct bt455_regs *regs) +static inline void bt455_write_cmap_next(struct bt455_regs *regs, u8 grey) { - /* bt455_write_cmap_entry(regs, 8, 0x00, 0x00, 0x00); */ - /* bt455_write_cmap_entry(regs, 9, 0x00, 0x00, 0x00); */ - bt455_write_ovly_entry(regs, 8, 0x03, 0x03, 0x03); - bt455_write_ovly_entry(regs, 9, 0x07, 0x07, 0x07); - wmb(); - regs->addr_ovly = 0x09; + regs->addr_cmap_data = 0x0; wmb(); - regs->addr_ovly = 0x09; + regs->addr_cmap_data = grey & 0xf; wmb(); - regs->addr_ovly = 0x09; + regs->addr_cmap_data = 0x0; +} + +static inline void bt455_write_ovly_next(struct bt455_regs *regs, u8 grey) +{ + wmb(); + regs->addr_ovly = 0x0; + wmb(); + regs->addr_ovly = grey & 0xf; + wmb(); + regs->addr_ovly = 0x0; +} + +static inline void bt455_read_cmap_entry(struct bt455_regs *regs, + int cr, u8 *grey) +{ + bt455_select_reg(regs, cr); + bt455_read_cmap_next(regs, grey); +} + +static inline void bt455_write_cmap_entry(struct bt455_regs *regs, + int cr, u8 grey) +{ + bt455_select_reg(regs, cr); + bt455_write_cmap_next(regs, grey); +} + +static inline void bt455_write_ovly_entry(struct bt455_regs *regs, u8 grey) +{ + bt455_reset_reg(regs); + bt455_write_ovly_next(regs, grey); } diff --git a/drivers/video/fbdev/da8xx-fb.c b/drivers/video/fbdev/da8xx-fb.c index 6b2a06d09f2b..d8d583d32a37 100644 --- a/drivers/video/fbdev/da8xx-fb.c +++ b/drivers/video/fbdev/da8xx-fb.c @@ -209,8 +209,7 @@ static struct fb_videomode known_lcd_panels[] = { .lower_margin = 2, .hsync_len = 0, .vsync_len = 0, - .sync = FB_SYNC_CLK_INVERT | - FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, + .sync = FB_SYNC_CLK_INVERT, }, /* Sharp LK043T1DG01 */ [1] = { @@ -224,7 +223,7 @@ static struct fb_videomode known_lcd_panels[] = { .lower_margin = 2, .hsync_len = 41, .vsync_len = 10, - .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, + .sync = 0, .flag = 0, }, [2] = { @@ -239,7 +238,7 @@ static struct fb_videomode known_lcd_panels[] = { .lower_margin = 10, .hsync_len = 10, .vsync_len = 10, - .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, + .sync = 0, .flag = 0, }, [3] = { diff --git a/drivers/video/fbdev/exynos/Kconfig b/drivers/video/fbdev/exynos/Kconfig index 1f16b4678c71..d916bef94f25 100644 --- a/drivers/video/fbdev/exynos/Kconfig +++ b/drivers/video/fbdev/exynos/Kconfig @@ -3,7 +3,7 @@ # menuconfig EXYNOS_VIDEO - bool "Exynos Video driver support" + tristate "Exynos Video driver support" depends on ARCH_S5PV210 || ARCH_EXYNOS help This enables support for EXYNOS Video device. @@ -15,13 +15,13 @@ if EXYNOS_VIDEO # config EXYNOS_MIPI_DSI - bool "EXYNOS MIPI DSI driver support." + tristate "EXYNOS MIPI DSI driver support." select GENERIC_PHY help This enables support for MIPI-DSI device. config EXYNOS_LCD_S6E8AX0 - bool "S6E8AX0 MIPI AMOLED LCD Driver" + tristate "S6E8AX0 MIPI AMOLED LCD Driver" depends on EXYNOS_MIPI_DSI && BACKLIGHT_CLASS_DEVICE depends on (LCD_CLASS_DEVICE = y) default n diff --git a/drivers/video/fbdev/exynos/Makefile b/drivers/video/fbdev/exynos/Makefile index b5b1bd228abb..02d8dc522fea 100644 --- a/drivers/video/fbdev/exynos/Makefile +++ b/drivers/video/fbdev/exynos/Makefile @@ -2,6 +2,8 @@ # Makefile for the exynos video drivers. # -obj-$(CONFIG_EXYNOS_MIPI_DSI) += exynos_mipi_dsi.o exynos_mipi_dsi_common.o \ - exynos_mipi_dsi_lowlevel.o +obj-$(CONFIG_EXYNOS_MIPI_DSI) += exynos-mipi-dsi-mod.o + +exynos-mipi-dsi-mod-objs += exynos_mipi_dsi.o exynos_mipi_dsi_common.o \ + exynos_mipi_dsi_lowlevel.o obj-$(CONFIG_EXYNOS_LCD_S6E8AX0) += s6e8ax0.o diff --git a/drivers/video/fbdev/exynos/exynos_mipi_dsi.c b/drivers/video/fbdev/exynos/exynos_mipi_dsi.c index b527fe464628..92e4af3caaf8 100644 --- a/drivers/video/fbdev/exynos/exynos_mipi_dsi.c +++ b/drivers/video/fbdev/exynos/exynos_mipi_dsi.c @@ -263,6 +263,7 @@ int exynos_mipi_dsi_register_lcd_driver(struct mipi_dsim_lcd_driver *lcd_drv) return 0; } +EXPORT_SYMBOL_GPL(exynos_mipi_dsi_register_lcd_driver); static struct mipi_dsim_ddi *exynos_mipi_dsi_bind_lcd_ddi( struct mipi_dsim_device *dsim, @@ -402,12 +403,12 @@ static int exynos_mipi_dsi_probe(struct platform_device *pdev) goto error; } - dsim->irq = platform_get_irq(pdev, 0); - if (IS_ERR_VALUE(dsim->irq)) { + ret = platform_get_irq(pdev, 0); + if (ret < 0) { dev_err(&pdev->dev, "failed to request dsim irq resource\n"); - ret = -EINVAL; goto error; } + dsim->irq = ret; init_completion(&dsim_wr_comp); init_completion(&dsim_rd_comp); diff --git a/drivers/video/fbdev/intelfb/intelfbdrv.c b/drivers/video/fbdev/intelfb/intelfbdrv.c index bbec737eef30..bf207444ba0c 100644 --- a/drivers/video/fbdev/intelfb/intelfbdrv.c +++ b/drivers/video/fbdev/intelfb/intelfbdrv.c @@ -302,7 +302,7 @@ static __inline__ int get_opt_int(const char *this_opt, const char *name, } static __inline__ int get_opt_bool(const char *this_opt, const char *name, - int *ret) + bool *ret) { if (!ret) return 0; diff --git a/drivers/video/fbdev/metronomefb.c b/drivers/video/fbdev/metronomefb.c index ad04a01e2761..abb6bbf226d5 100644 --- a/drivers/video/fbdev/metronomefb.c +++ b/drivers/video/fbdev/metronomefb.c @@ -354,7 +354,8 @@ static int metronome_powerup_cmd(struct metronomefb_par *par) } /* the rest are 0 */ - memset((u8 *) (par->metromem_cmd->args + i), 0, (32-i)*2); + memset(&par->metromem_cmd->args[i], 0, + (ARRAY_SIZE(par->metromem_cmd->args) - i) * 2); par->metromem_cmd->csum = cs; @@ -376,7 +377,8 @@ static int metronome_config_cmd(struct metronomefb_par *par) memcpy(par->metromem_cmd->args, epd_frame_table[par->dt].config, sizeof(epd_frame_table[par->dt].config)); /* the rest are 0 */ - memset((u8 *) (par->metromem_cmd->args + 4), 0, (32-4)*2); + memset(&par->metromem_cmd->args[4], 0, + (ARRAY_SIZE(par->metromem_cmd->args) - 4) * 2); par->metromem_cmd->csum = 0xCC10; par->metromem_cmd->csum += calc_img_cksum(par->metromem_cmd->args, 4); diff --git a/drivers/video/fbdev/n411.c b/drivers/video/fbdev/n411.c index 935830fea7b6..053deacad7cc 100644 --- a/drivers/video/fbdev/n411.c +++ b/drivers/video/fbdev/n411.c @@ -165,16 +165,22 @@ static int __init n411_init(void) if (!n411_device) return -ENOMEM; - platform_device_add_data(n411_device, &n411_board, sizeof(n411_board)); + ret = platform_device_add_data(n411_device, &n411_board, + sizeof(n411_board)); + if (ret) + goto put_plat_device; /* this _add binds hecubafb to n411. hecubafb refcounts n411 */ ret = platform_device_add(n411_device); if (ret) - platform_device_put(n411_device); + goto put_plat_device; + return 0; + +put_plat_device: + platform_device_put(n411_device); return ret; - } static void __exit n411_exit(void) diff --git a/drivers/video/fbdev/omap/omapfb_main.c b/drivers/video/fbdev/omap/omapfb_main.c index 393ae1bc07e8..6429f33167f5 100644 --- a/drivers/video/fbdev/omap/omapfb_main.c +++ b/drivers/video/fbdev/omap/omapfb_main.c @@ -594,27 +594,6 @@ static int set_fb_var(struct fb_info *fbi, } -/* Set rotation (0, 90, 180, 270 degree), and switch to the new mode. */ -static void omapfb_rotate(struct fb_info *fbi, int rotate) -{ - struct omapfb_plane_struct *plane = fbi->par; - struct omapfb_device *fbdev = plane->fbdev; - - omapfb_rqueue_lock(fbdev); - if (rotate != fbi->var.rotate) { - struct fb_var_screeninfo *new_var = &fbdev->new_var; - - memcpy(new_var, &fbi->var, sizeof(*new_var)); - new_var->rotate = rotate; - if (set_fb_var(fbi, new_var) == 0 && - memcmp(new_var, &fbi->var, sizeof(*new_var))) { - memcpy(&fbi->var, new_var, sizeof(*new_var)); - ctrl_change_mode(fbi); - } - } - omapfb_rqueue_unlock(fbdev); -} - /* * Set new x,y offsets in the virtual display for the visible area and switch * to the new mode. @@ -1256,7 +1235,6 @@ static struct fb_ops omapfb_ops = { .fb_ioctl = omapfb_ioctl, .fb_check_var = omapfb_check_var, .fb_set_par = omapfb_set_par, - .fb_rotate = omapfb_rotate, .fb_pan_display = omapfb_pan_display, }; diff --git a/drivers/video/fbdev/pmag-aa-fb.c b/drivers/video/fbdev/pmag-aa-fb.c index 838424817de2..ffe2dd482f84 100644 --- a/drivers/video/fbdev/pmag-aa-fb.c +++ b/drivers/video/fbdev/pmag-aa-fb.c @@ -8,6 +8,7 @@ * and Harald Koerfgen , which itself is derived from * "HP300 Topcat framebuffer support (derived from macfb of all things) * Phil Blundell 1998" + * Copyright (c) 2016 Maciej W. Rozycki * * This file is subject to the terms and conditions of the GNU General * Public License. See the file COPYING in the main directory of this @@ -21,37 +22,29 @@ * * 2003-09-21 Thiemo Seufer * Hardware cursor support. + * + * 2016-02-21 Maciej W. Rozycki + * Version 0.03: Rewritten for the new FB and TC APIs. */ -#include -#include + +#include #include -#include -#include -#include -#include -#include #include -#include - -#include -#include -#include - -#include