123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /*
- * Copyright (C) 2012 Russell King
- *
- * 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 ARMADA_CRTC_H
- #define ARMADA_CRTC_H
- struct armada_gem_object;
- struct armada_regs {
- uint32_t offset;
- uint32_t mask;
- uint32_t val;
- };
- #define armada_reg_queue_mod(_r, _i, _v, _m, _o) \
- do { \
- struct armada_regs *__reg = _r; \
- __reg[_i].offset = _o; \
- __reg[_i].mask = ~(_m); \
- __reg[_i].val = _v; \
- _i++; \
- } while (0)
- #define armada_reg_queue_set(_r, _i, _v, _o) \
- armada_reg_queue_mod(_r, _i, _v, ~0, _o)
- #define armada_reg_queue_end(_r, _i) \
- armada_reg_queue_mod(_r, _i, 0, 0, ~0)
- struct armada_crtc;
- struct armada_plane;
- struct armada_variant;
- struct armada_plane_work {
- void (*fn)(struct armada_crtc *,
- struct armada_plane *,
- struct armada_plane_work *);
- };
- struct armada_plane_state {
- u32 src_hw;
- u32 dst_hw;
- u32 dst_yx;
- u32 ctrl0;
- };
- struct armada_plane {
- struct drm_plane base;
- wait_queue_head_t frame_wait;
- struct armada_plane_work *work;
- struct armada_plane_state state;
- };
- #define drm_to_armada_plane(p) container_of(p, struct armada_plane, base)
- int armada_drm_plane_init(struct armada_plane *plane);
- int armada_drm_plane_work_queue(struct armada_crtc *dcrtc,
- struct armada_plane *plane, struct armada_plane_work *work);
- int armada_drm_plane_work_wait(struct armada_plane *plane, long timeout);
- struct armada_plane_work *armada_drm_plane_work_cancel(
- struct armada_crtc *dcrtc, struct armada_plane *plane);
- void armada_drm_plane_calc_addrs(u32 *addrs, struct drm_framebuffer *fb,
- int x, int y);
- struct armada_crtc {
- struct drm_crtc crtc;
- const struct armada_variant *variant;
- unsigned num;
- void __iomem *base;
- struct clk *clk;
- struct clk *extclk[2];
- struct {
- uint32_t spu_v_h_total;
- uint32_t spu_v_porch;
- uint32_t spu_adv_reg;
- } v[2];
- bool interlaced;
- bool cursor_update;
- uint8_t csc_yuv_mode;
- uint8_t csc_rgb_mode;
- struct drm_plane *plane;
- struct armada_gem_object *cursor_obj;
- int cursor_x;
- int cursor_y;
- uint32_t cursor_hw_pos;
- uint32_t cursor_hw_sz;
- uint32_t cursor_w;
- uint32_t cursor_h;
- int dpms;
- uint32_t cfg_dumb_ctrl;
- uint32_t dumb_ctrl;
- uint32_t spu_iopad_ctrl;
- spinlock_t irq_lock;
- uint32_t irq_ena;
- };
- #define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc)
- void armada_drm_crtc_update_regs(struct armada_crtc *, struct armada_regs *);
- void armada_drm_crtc_plane_disable(struct armada_crtc *dcrtc,
- struct drm_plane *plane);
- extern struct platform_driver armada_lcd_platform_driver;
- #endif
|