|
@@ -138,7 +138,9 @@ struct stm32_ltdc_priv {
|
|
|
#define LXCFBLNR_CFBLN GENMASK(10, 0) /* Color Frame Buffer Line Number */
|
|
|
|
|
|
#define BF1_PAXCA 0x600 /* Pixel Alpha x Constant Alpha */
|
|
|
+#define BF1_CA 0x400 /* Constant Alpha */
|
|
|
#define BF2_1PAXCA 0x007 /* 1 - (Pixel Alpha x Constant Alpha) */
|
|
|
+#define BF2_1CA 0x005 /* 1 - Constant Alpha */
|
|
|
|
|
|
enum stm32_ltdc_pix_fmt {
|
|
|
PF_ARGB8888 = 0,
|
|
@@ -161,11 +163,17 @@ static u32 stm32_ltdc_get_pixel_format(enum video_log2_bpp l2bpp)
|
|
|
pf = PF_RGB565;
|
|
|
break;
|
|
|
|
|
|
+ case VIDEO_BPP32:
|
|
|
+ pf = PF_ARGB8888;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case VIDEO_BPP8:
|
|
|
+ pf = PF_L8;
|
|
|
+ break;
|
|
|
+
|
|
|
case VIDEO_BPP1:
|
|
|
case VIDEO_BPP2:
|
|
|
case VIDEO_BPP4:
|
|
|
- case VIDEO_BPP8:
|
|
|
- case VIDEO_BPP32:
|
|
|
default:
|
|
|
debug("%s: warning %dbpp not supported yet, %dbpp instead\n",
|
|
|
__func__, VNBITS(l2bpp), VNBITS(VIDEO_BPP16));
|
|
@@ -178,6 +186,23 @@ static u32 stm32_ltdc_get_pixel_format(enum video_log2_bpp l2bpp)
|
|
|
return (u32)pf;
|
|
|
}
|
|
|
|
|
|
+static bool has_alpha(u32 fmt)
|
|
|
+{
|
|
|
+ switch (fmt) {
|
|
|
+ case PF_ARGB8888:
|
|
|
+ case PF_ARGB1555:
|
|
|
+ case PF_ARGB4444:
|
|
|
+ case PF_AL44:
|
|
|
+ case PF_AL88:
|
|
|
+ return true;
|
|
|
+ case PF_RGB888:
|
|
|
+ case PF_RGB565:
|
|
|
+ case PF_L8:
|
|
|
+ default:
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void stm32_ltdc_enable(struct stm32_ltdc_priv *priv)
|
|
|
{
|
|
|
/* Reload configuration immediately & enable LTDC */
|
|
@@ -247,6 +272,7 @@ static void stm32_ltdc_set_layer1(struct stm32_ltdc_priv *priv, ulong fb_addr)
|
|
|
u32 line_length;
|
|
|
u32 bus_width;
|
|
|
u32 val, tmp, bpp;
|
|
|
+ u32 format;
|
|
|
|
|
|
x0 = priv->crop_x;
|
|
|
x1 = priv->crop_x + priv->crop_w - 1;
|
|
@@ -277,15 +303,18 @@ static void stm32_ltdc_set_layer1(struct stm32_ltdc_priv *priv, ulong fb_addr)
|
|
|
clrsetbits_le32(regs + LTDC_L1CFBLR, LXCFBLR_CFBLL | LXCFBLR_CFBP, val);
|
|
|
|
|
|
/* Pixel format */
|
|
|
- val = stm32_ltdc_get_pixel_format(priv->l2bpp);
|
|
|
- clrsetbits_le32(regs + LTDC_L1PFCR, LXPFCR_PF, val);
|
|
|
+ format = stm32_ltdc_get_pixel_format(priv->l2bpp);
|
|
|
+ clrsetbits_le32(regs + LTDC_L1PFCR, LXPFCR_PF, format);
|
|
|
|
|
|
/* Constant alpha value */
|
|
|
clrsetbits_le32(regs + LTDC_L1CACR, LXCACR_CONSTA, priv->alpha);
|
|
|
|
|
|
+ /* Specifies the blending factors : with or without pixel alpha */
|
|
|
+ /* Manage hw-specific capabilities */
|
|
|
+ val = has_alpha(format) ? BF1_PAXCA | BF2_1PAXCA : BF1_CA | BF2_1CA;
|
|
|
+
|
|
|
/* Blending factors */
|
|
|
- clrsetbits_le32(regs + LTDC_L1BFCR, LXBFCR_BF2 | LXBFCR_BF1,
|
|
|
- BF1_PAXCA | BF2_1PAXCA);
|
|
|
+ clrsetbits_le32(regs + LTDC_L1BFCR, LXBFCR_BF2 | LXBFCR_BF1, val);
|
|
|
|
|
|
/* Frame buffer line number */
|
|
|
clrsetbits_le32(regs + LTDC_L1CFBLNR, LXCFBLNR_CFBLN, priv->crop_h);
|