dispc_write_reg(vsi_reg[plane-1], val);
}
+static void _dispc_setup_global_alpha(enum omap_plane plane, u8 global_alpha)
+{
+
+ BUG_ON(plane == OMAP_DSS_VIDEO1);
+
+ if (plane == OMAP_DSS_GFX)
+ REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, 7, 0);
+ else if (plane == OMAP_DSS_VIDEO2)
+ REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, 23, 16);
+}
+
static void _dispc_set_pix_inc(enum omap_plane plane, s32 inc)
{
const struct dispc_reg ri_reg[] = { DISPC_GFX_PIXEL_INC,
enum omap_color_mode color_mode,
bool ilace,
enum omap_dss_rotation_type rotation_type,
- u8 rotation, int mirror)
+ u8 rotation, int mirror,
+ u8 global_alpha)
{
const int maxdownscale = cpu_is_omap34xx() ? 4 : 2;
bool five_taps = 0;
_dispc_set_rotation_attrs(plane, rotation, mirror, color_mode);
+ if (plane != OMAP_DSS_VIDEO1)
+ _dispc_setup_global_alpha(plane, global_alpha);
+
return 0;
}
enum omap_color_mode color_mode,
bool ilace,
enum omap_dss_rotation_type rotation_type,
- u8 rotation, bool mirror)
+ u8 rotation, bool mirror, u8 global_alpha)
{
int r = 0;
out_width, out_height,
color_mode, ilace,
rotation_type,
- rotation, mirror);
+ rotation, mirror,
+ global_alpha);
enable_clocks(0);
pi->color_mode, 0,
pi->rotation_type,
pi->rotation,
- pi->mirror);
+ pi->mirror,
+ pi->global_alpha);
dispc_enable_plane(ovl->id, 1);
}
return size;
}
+static ssize_t overlay_global_alpha_show(struct omap_overlay *ovl, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%d\n",
+ ovl->info.global_alpha);
+}
+
+static ssize_t overlay_global_alpha_store(struct omap_overlay *ovl,
+ const char *buf, size_t size)
+{
+ int r;
+ struct omap_overlay_info info;
+
+ ovl->get_overlay_info(ovl, &info);
+
+ /* Video1 plane does not support global alpha
+ * to always make it 255 completely opaque
+ */
+ if (ovl->id == OMAP_DSS_VIDEO1)
+ info.global_alpha = 255;
+ else
+ info.global_alpha = simple_strtoul(buf, NULL, 10);
+
+ if ((r = ovl->set_overlay_info(ovl, &info)))
+ return r;
+
+ if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+ return r;
+
+ return size;
+}
+
struct overlay_attribute {
struct attribute attr;
ssize_t (*show)(struct omap_overlay *, char *);
overlay_output_size_show, overlay_output_size_store);
static OVERLAY_ATTR(enabled, S_IRUGO|S_IWUSR,
overlay_enabled_show, overlay_enabled_store);
+static OVERLAY_ATTR(global_alpha, S_IRUGO|S_IWUSR,
+ overlay_global_alpha_show, overlay_global_alpha_store);
static struct attribute *overlay_sysfs_attrs[] = {
&overlay_attr_name.attr,
&overlay_attr_position.attr,
&overlay_attr_output_size.attr,
&overlay_attr_enabled.attr,
+ &overlay_attr_global_alpha.attr,
NULL
};
ovl->id = OMAP_DSS_GFX;
ovl->supported_modes = OMAP_DSS_COLOR_GFX_OMAP3;
ovl->caps = OMAP_DSS_OVL_CAP_DISPC;
+ ovl->info.global_alpha = 255;
break;
case 1:
ovl->name = "vid1";
ovl->supported_modes = OMAP_DSS_COLOR_VID_OMAP3;
ovl->caps = OMAP_DSS_OVL_CAP_SCALE |
OMAP_DSS_OVL_CAP_DISPC;
+ ovl->info.global_alpha = 255;
break;
case 2:
ovl->name = "vid2";
ovl->supported_modes = OMAP_DSS_COLOR_VID_OMAP3;
ovl->caps = OMAP_DSS_OVL_CAP_SCALE |
OMAP_DSS_OVL_CAP_DISPC;
+ ovl->info.global_alpha = 255;
break;
}