#ifndef _ARM_TI_TI_LCDC_H
#define _ARM_TI_TI_LCDC_H
#include <sys/workqueue.h>
#include <drm/drm_encoder.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_gem_cma_helper.h>
#define DRIVER_AUTHOR "NetBSD"
#define DRIVER_NAME "tilcdc"
#define DRIVER_DESC "TI LCDC"
#define DRIVER_DATE "20191103"
#define DRIVER_MAJOR 1
#define DRIVER_MINOR 0
#define DRIVER_PATCHLEVEL 0
struct tilcdc_softc;
struct tilcdc_framebuffer;
struct tilcdc_vblank {
void *priv;
void (*enable_vblank)(void *);
void (*disable_vblank)(void *);
uint32_t (*get_vblank_counter)(void *);
};
struct tilcdc_crtc {
struct drm_crtc base;
struct tilcdc_softc *sc;
};
struct tilcdc_encoder {
struct drm_encoder base;
struct tilcdc_softc *sc;
};
struct tilcdc_softc {
device_t sc_dev;
struct drm_device *sc_ddev;
bus_space_tag_t sc_bst;
bus_space_handle_t sc_bsh;
bus_dma_tag_t sc_dmat;
struct clk *sc_clk;
int sc_phandle;
struct lwp *sc_task_thread;
SIMPLEQ_HEAD(, tilcdc_drm_task) sc_tasks;
struct workqueue *sc_task_wq;
bool sc_dev_registered;
struct tilcdc_crtc sc_crtc;
struct tilcdc_encoder sc_encoder;
struct tilcdc_vblank sc_vbl;
struct fdt_device_ports sc_ports;
};
struct tilcdc_framebuffer {
struct drm_framebuffer base;
struct drm_gem_cma_object *obj;
};
struct tilcdc_fbdev {
struct drm_fb_helper helper;
};
struct tilcdcfb_attach_args {
struct drm_device *tfa_drm_dev;
struct drm_fb_helper *tfa_fb_helper;
struct drm_fb_helper_surface_size tfa_fb_sizes;
bus_space_tag_t tfa_fb_bst;
bus_dma_tag_t tfa_fb_dmat;
uint32_t tfa_fb_linebytes;
};
struct tilcdc_drm_task {
union {
SIMPLEQ_ENTRY(tilcdc_drm_task) queue;
struct work work;
} tdt_u;
void (*tdt_fn)(struct tilcdc_drm_task *);
};
#define tilcdc_private(ddev) (ddev)->dev_private
#define to_tilcdc_framebuffer(x) container_of(x, struct tilcdc_framebuffer, base)
#define to_tilcdc_crtc(x) container_of(x, struct tilcdc_crtc, base)
#define RD4(sc, reg) \
bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, (reg))
#define WR4(sc, reg, val) \
bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (reg), (val))
void tilcdc_task_init(struct tilcdc_drm_task *,
void (*)(struct tilcdc_drm_task *));
void tilcdc_task_schedule(device_t, struct tilcdc_drm_task *);
#endif