forked from luck/tmp_suning_uos_patched
sh: sh7760fb: Fix color pallette setting
The setting of the color palette was wrong, fixed it. And removed fb_setcmap, and added fb_setcolreg function. Signed-off-by: Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
f617682e9c
commit
679dc3c92c
|
@ -13,6 +13,8 @@
|
||||||
*
|
*
|
||||||
* Thanks to Siegfried Schaefer <s.schaefer at schaefer-edv.de>
|
* Thanks to Siegfried Schaefer <s.schaefer at schaefer-edv.de>
|
||||||
* for his original source and testing!
|
* for his original source and testing!
|
||||||
|
*
|
||||||
|
* sh7760_setcolreg get from drivers/video/sh_mobile_lcdcfb.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
|
@ -53,29 +55,6 @@ static irqreturn_t sh7760fb_irq(int irq, void *data)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sh7760fb_wait_vsync(struct fb_info *info)
|
|
||||||
{
|
|
||||||
struct sh7760fb_par *par = info->par;
|
|
||||||
|
|
||||||
if (par->pd->novsync)
|
|
||||||
return;
|
|
||||||
|
|
||||||
iowrite16(ioread16(par->base + LDINTR) & ~VINT_CHECK,
|
|
||||||
par->base + LDINTR);
|
|
||||||
|
|
||||||
if (par->irq < 0) {
|
|
||||||
/* poll for vert. retrace: status bit is sticky */
|
|
||||||
while (!(ioread16(par->base + LDINTR) & VINT_CHECK))
|
|
||||||
cpu_relax();
|
|
||||||
} else {
|
|
||||||
/* a "wait_for_irq_event(par->irq)" would be extremely nice */
|
|
||||||
init_completion(&par->vsync);
|
|
||||||
enable_irq(par->irq);
|
|
||||||
wait_for_completion(&par->vsync);
|
|
||||||
disable_irq_nosync(par->irq);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* wait_for_lps - wait until power supply has reached a certain state. */
|
/* wait_for_lps - wait until power supply has reached a certain state. */
|
||||||
static int wait_for_lps(struct sh7760fb_par *par, int val)
|
static int wait_for_lps(struct sh7760fb_par *par, int val)
|
||||||
{
|
{
|
||||||
|
@ -117,55 +96,28 @@ static int sh7760fb_blank(int blank, struct fb_info *info)
|
||||||
return wait_for_lps(par, lps);
|
return wait_for_lps(par, lps);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set color registers */
|
static int sh7760_setcolreg (u_int regno,
|
||||||
static int sh7760fb_setcmap(struct fb_cmap *cmap, struct fb_info *info)
|
u_int red, u_int green, u_int blue,
|
||||||
|
u_int transp, struct fb_info *info)
|
||||||
{
|
{
|
||||||
struct sh7760fb_par *par = info->par;
|
u32 *palette = info->pseudo_palette;
|
||||||
u32 s = cmap->start;
|
|
||||||
u32 l = cmap->len;
|
|
||||||
u16 *r = cmap->red;
|
|
||||||
u16 *g = cmap->green;
|
|
||||||
u16 *b = cmap->blue;
|
|
||||||
u32 col, tmo;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = 0;
|
if (regno >= 16)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
sh7760fb_wait_vsync(info);
|
/* only FB_VISUAL_TRUECOLOR supported */
|
||||||
|
|
||||||
/* request palette access */
|
red >>= 16 - info->var.red.length;
|
||||||
iowrite16(LDPALCR_PALEN, par->base + LDPALCR);
|
green >>= 16 - info->var.green.length;
|
||||||
|
blue >>= 16 - info->var.blue.length;
|
||||||
|
transp >>= 16 - info->var.transp.length;
|
||||||
|
|
||||||
/* poll for access grant */
|
palette[regno] = (red << info->var.red.offset) |
|
||||||
tmo = 100;
|
(green << info->var.green.offset) |
|
||||||
while (!(ioread16(par->base + LDPALCR) & LDPALCR_PALS) && (--tmo))
|
(blue << info->var.blue.offset) |
|
||||||
cpu_relax();
|
(transp << info->var.transp.offset);
|
||||||
|
|
||||||
if (!tmo) {
|
return 0;
|
||||||
ret = 1;
|
|
||||||
dev_dbg(info->dev, "no palette access!\n");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (l && (s < 256)) {
|
|
||||||
col = ((*r) & 0xff) << 16;
|
|
||||||
col |= ((*g) & 0xff) << 8;
|
|
||||||
col |= ((*b) & 0xff);
|
|
||||||
col &= SH7760FB_PALETTE_MASK;
|
|
||||||
iowrite32(col, par->base + LDPR(s));
|
|
||||||
|
|
||||||
if (s < 16)
|
|
||||||
((u32 *) (info->pseudo_palette))[s] = s;
|
|
||||||
|
|
||||||
s++;
|
|
||||||
l--;
|
|
||||||
r++;
|
|
||||||
g++;
|
|
||||||
b++;
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
iowrite16(0, par->base + LDPALCR);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void encode_fix(struct fb_fix_screeninfo *fix, struct fb_info *info,
|
static void encode_fix(struct fb_fix_screeninfo *fix, struct fb_info *info,
|
||||||
|
@ -406,7 +358,7 @@ static struct fb_ops sh7760fb_ops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.fb_blank = sh7760fb_blank,
|
.fb_blank = sh7760fb_blank,
|
||||||
.fb_check_var = sh7760fb_check_var,
|
.fb_check_var = sh7760fb_check_var,
|
||||||
.fb_setcmap = sh7760fb_setcmap,
|
.fb_setcolreg = sh7760_setcolreg,
|
||||||
.fb_set_par = sh7760fb_set_par,
|
.fb_set_par = sh7760fb_set_par,
|
||||||
.fb_fillrect = cfb_fillrect,
|
.fb_fillrect = cfb_fillrect,
|
||||||
.fb_copyarea = cfb_copyarea,
|
.fb_copyarea = cfb_copyarea,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user