162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2023 Loongson Technology Corporation Limited 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __LSDC_DRV_H__ 762306a36Sopenharmony_ci#define __LSDC_DRV_H__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/pci.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <drm/drm_connector.h> 1262306a36Sopenharmony_ci#include <drm/drm_crtc.h> 1362306a36Sopenharmony_ci#include <drm/drm_device.h> 1462306a36Sopenharmony_ci#include <drm/drm_encoder.h> 1562306a36Sopenharmony_ci#include <drm/drm_file.h> 1662306a36Sopenharmony_ci#include <drm/drm_plane.h> 1762306a36Sopenharmony_ci#include <drm/ttm/ttm_device.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include "lsdc_i2c.h" 2062306a36Sopenharmony_ci#include "lsdc_irq.h" 2162306a36Sopenharmony_ci#include "lsdc_gfxpll.h" 2262306a36Sopenharmony_ci#include "lsdc_output.h" 2362306a36Sopenharmony_ci#include "lsdc_pixpll.h" 2462306a36Sopenharmony_ci#include "lsdc_regs.h" 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* Currently, all Loongson display controllers have two display pipes. */ 2762306a36Sopenharmony_ci#define LSDC_NUM_CRTC 2 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* 3062306a36Sopenharmony_ci * LS7A1000/LS7A2000 chipsets function as the south & north bridges of the 3162306a36Sopenharmony_ci * Loongson 3 series processors, they are equipped with on-board video RAM 3262306a36Sopenharmony_ci * typically. While Loongson LS2K series are low cost SoCs which share the 3362306a36Sopenharmony_ci * system RAM as video RAM, they don't has a dedicated VRAM. 3462306a36Sopenharmony_ci * 3562306a36Sopenharmony_ci * There is only a 1:1 mapping of crtcs, encoders and connectors for the DC 3662306a36Sopenharmony_ci * 3762306a36Sopenharmony_ci * display pipe 0 = crtc0 + dvo0 + encoder0 + connector0 + cursor0 + primary0 3862306a36Sopenharmony_ci * display pipe 1 = crtc1 + dvo1 + encoder1 + connectro1 + cursor1 + primary1 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cienum loongson_chip_id { 4262306a36Sopenharmony_ci CHIP_LS7A1000 = 0, 4362306a36Sopenharmony_ci CHIP_LS7A2000 = 1, 4462306a36Sopenharmony_ci CHIP_LS_LAST, 4562306a36Sopenharmony_ci}; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ciconst struct lsdc_desc * 4862306a36Sopenharmony_cilsdc_device_probe(struct pci_dev *pdev, enum loongson_chip_id chip); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistruct lsdc_kms_funcs; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* DC specific */ 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistruct lsdc_desc { 5562306a36Sopenharmony_ci u32 num_of_crtc; 5662306a36Sopenharmony_ci u32 max_pixel_clk; 5762306a36Sopenharmony_ci u32 max_width; 5862306a36Sopenharmony_ci u32 max_height; 5962306a36Sopenharmony_ci u32 num_of_hw_cursor; 6062306a36Sopenharmony_ci u32 hw_cursor_w; 6162306a36Sopenharmony_ci u32 hw_cursor_h; 6262306a36Sopenharmony_ci u32 pitch_align; /* CRTC DMA alignment constraint */ 6362306a36Sopenharmony_ci bool has_vblank_counter; /* 32 bit hw vsync counter */ 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci /* device dependent ops, dc side */ 6662306a36Sopenharmony_ci const struct lsdc_kms_funcs *funcs; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* GFX related resources wrangler */ 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistruct loongson_gfx_desc { 7262306a36Sopenharmony_ci struct lsdc_desc dc; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci u32 conf_reg_base; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci /* GFXPLL shared by the DC, GMC and GPU */ 7762306a36Sopenharmony_ci struct { 7862306a36Sopenharmony_ci u32 reg_offset; 7962306a36Sopenharmony_ci u32 reg_size; 8062306a36Sopenharmony_ci } gfxpll; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci /* Pixel PLL, per display pipe */ 8362306a36Sopenharmony_ci struct { 8462306a36Sopenharmony_ci u32 reg_offset; 8562306a36Sopenharmony_ci u32 reg_size; 8662306a36Sopenharmony_ci } pixpll[LSDC_NUM_CRTC]; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci enum loongson_chip_id chip_id; 8962306a36Sopenharmony_ci char model[64]; 9062306a36Sopenharmony_ci}; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistatic inline const struct loongson_gfx_desc * 9362306a36Sopenharmony_cito_loongson_gfx(const struct lsdc_desc *dcp) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci return container_of_const(dcp, struct loongson_gfx_desc, dc); 9662306a36Sopenharmony_ci}; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistruct lsdc_reg32 { 9962306a36Sopenharmony_ci char *name; 10062306a36Sopenharmony_ci u32 offset; 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci/* crtc hardware related ops */ 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistruct lsdc_crtc; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistruct lsdc_crtc_hw_ops { 10862306a36Sopenharmony_ci void (*enable)(struct lsdc_crtc *lcrtc); 10962306a36Sopenharmony_ci void (*disable)(struct lsdc_crtc *lcrtc); 11062306a36Sopenharmony_ci void (*enable_vblank)(struct lsdc_crtc *lcrtc); 11162306a36Sopenharmony_ci void (*disable_vblank)(struct lsdc_crtc *lcrtc); 11262306a36Sopenharmony_ci void (*flip)(struct lsdc_crtc *lcrtc); 11362306a36Sopenharmony_ci void (*clone)(struct lsdc_crtc *lcrtc); 11462306a36Sopenharmony_ci void (*get_scan_pos)(struct lsdc_crtc *lcrtc, int *hpos, int *vpos); 11562306a36Sopenharmony_ci void (*set_mode)(struct lsdc_crtc *lcrtc, const struct drm_display_mode *mode); 11662306a36Sopenharmony_ci void (*soft_reset)(struct lsdc_crtc *lcrtc); 11762306a36Sopenharmony_ci void (*reset)(struct lsdc_crtc *lcrtc); 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci u32 (*get_vblank_counter)(struct lsdc_crtc *lcrtc); 12062306a36Sopenharmony_ci void (*set_dma_step)(struct lsdc_crtc *lcrtc, enum lsdc_dma_steps step); 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cistruct lsdc_crtc { 12462306a36Sopenharmony_ci struct drm_crtc base; 12562306a36Sopenharmony_ci struct lsdc_pixpll pixpll; 12662306a36Sopenharmony_ci struct lsdc_device *ldev; 12762306a36Sopenharmony_ci const struct lsdc_crtc_hw_ops *hw_ops; 12862306a36Sopenharmony_ci const struct lsdc_reg32 *preg; 12962306a36Sopenharmony_ci unsigned int nreg; 13062306a36Sopenharmony_ci struct drm_info_list *p_info_list; 13162306a36Sopenharmony_ci unsigned int n_info_list; 13262306a36Sopenharmony_ci bool has_vblank; 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci/* primary plane hardware related ops */ 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct lsdc_primary; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistruct lsdc_primary_plane_ops { 14062306a36Sopenharmony_ci void (*update_fb_addr)(struct lsdc_primary *plane, u64 addr); 14162306a36Sopenharmony_ci void (*update_fb_stride)(struct lsdc_primary *plane, u32 stride); 14262306a36Sopenharmony_ci void (*update_fb_format)(struct lsdc_primary *plane, 14362306a36Sopenharmony_ci const struct drm_format_info *format); 14462306a36Sopenharmony_ci}; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistruct lsdc_primary { 14762306a36Sopenharmony_ci struct drm_plane base; 14862306a36Sopenharmony_ci const struct lsdc_primary_plane_ops *ops; 14962306a36Sopenharmony_ci struct lsdc_device *ldev; 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/* cursor plane hardware related ops */ 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistruct lsdc_cursor; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistruct lsdc_cursor_plane_ops { 15762306a36Sopenharmony_ci void (*update_bo_addr)(struct lsdc_cursor *plane, u64 addr); 15862306a36Sopenharmony_ci void (*update_cfg)(struct lsdc_cursor *plane, 15962306a36Sopenharmony_ci enum lsdc_cursor_size cursor_size, 16062306a36Sopenharmony_ci enum lsdc_cursor_format); 16162306a36Sopenharmony_ci void (*update_position)(struct lsdc_cursor *plane, int x, int y); 16262306a36Sopenharmony_ci}; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistruct lsdc_cursor { 16562306a36Sopenharmony_ci struct drm_plane base; 16662306a36Sopenharmony_ci const struct lsdc_cursor_plane_ops *ops; 16762306a36Sopenharmony_ci struct lsdc_device *ldev; 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistruct lsdc_output { 17162306a36Sopenharmony_ci struct drm_encoder encoder; 17262306a36Sopenharmony_ci struct drm_connector connector; 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistatic inline struct lsdc_output * 17662306a36Sopenharmony_ciconnector_to_lsdc_output(struct drm_connector *connector) 17762306a36Sopenharmony_ci{ 17862306a36Sopenharmony_ci return container_of(connector, struct lsdc_output, connector); 17962306a36Sopenharmony_ci} 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cistatic inline struct lsdc_output * 18262306a36Sopenharmony_ciencoder_to_lsdc_output(struct drm_encoder *encoder) 18362306a36Sopenharmony_ci{ 18462306a36Sopenharmony_ci return container_of(encoder, struct lsdc_output, encoder); 18562306a36Sopenharmony_ci} 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cistruct lsdc_display_pipe { 18862306a36Sopenharmony_ci struct lsdc_crtc crtc; 18962306a36Sopenharmony_ci struct lsdc_primary primary; 19062306a36Sopenharmony_ci struct lsdc_cursor cursor; 19162306a36Sopenharmony_ci struct lsdc_output output; 19262306a36Sopenharmony_ci struct lsdc_i2c *li2c; 19362306a36Sopenharmony_ci unsigned int index; 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistatic inline struct lsdc_display_pipe * 19762306a36Sopenharmony_cioutput_to_display_pipe(struct lsdc_output *output) 19862306a36Sopenharmony_ci{ 19962306a36Sopenharmony_ci return container_of(output, struct lsdc_display_pipe, output); 20062306a36Sopenharmony_ci} 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_cistruct lsdc_kms_funcs { 20362306a36Sopenharmony_ci irqreturn_t (*irq_handler)(int irq, void *arg); 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci int (*create_i2c)(struct drm_device *ddev, 20662306a36Sopenharmony_ci struct lsdc_display_pipe *dispipe, 20762306a36Sopenharmony_ci unsigned int index); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci int (*output_init)(struct drm_device *ddev, 21062306a36Sopenharmony_ci struct lsdc_display_pipe *dispipe, 21162306a36Sopenharmony_ci struct i2c_adapter *ddc, 21262306a36Sopenharmony_ci unsigned int index); 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci int (*cursor_plane_init)(struct drm_device *ddev, 21562306a36Sopenharmony_ci struct drm_plane *plane, 21662306a36Sopenharmony_ci unsigned int index); 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci int (*primary_plane_init)(struct drm_device *ddev, 21962306a36Sopenharmony_ci struct drm_plane *plane, 22062306a36Sopenharmony_ci unsigned int index); 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci int (*crtc_init)(struct drm_device *ddev, 22362306a36Sopenharmony_ci struct drm_crtc *crtc, 22462306a36Sopenharmony_ci struct drm_plane *primary, 22562306a36Sopenharmony_ci struct drm_plane *cursor, 22662306a36Sopenharmony_ci unsigned int index, 22762306a36Sopenharmony_ci bool has_vblank); 22862306a36Sopenharmony_ci}; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_cistatic inline struct lsdc_crtc * 23162306a36Sopenharmony_cito_lsdc_crtc(struct drm_crtc *crtc) 23262306a36Sopenharmony_ci{ 23362306a36Sopenharmony_ci return container_of(crtc, struct lsdc_crtc, base); 23462306a36Sopenharmony_ci} 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistatic inline struct lsdc_display_pipe * 23762306a36Sopenharmony_cicrtc_to_display_pipe(struct drm_crtc *crtc) 23862306a36Sopenharmony_ci{ 23962306a36Sopenharmony_ci return container_of(crtc, struct lsdc_display_pipe, crtc.base); 24062306a36Sopenharmony_ci} 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistatic inline struct lsdc_primary * 24362306a36Sopenharmony_cito_lsdc_primary(struct drm_plane *plane) 24462306a36Sopenharmony_ci{ 24562306a36Sopenharmony_ci return container_of(plane, struct lsdc_primary, base); 24662306a36Sopenharmony_ci} 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistatic inline struct lsdc_cursor * 24962306a36Sopenharmony_cito_lsdc_cursor(struct drm_plane *plane) 25062306a36Sopenharmony_ci{ 25162306a36Sopenharmony_ci return container_of(plane, struct lsdc_cursor, base); 25262306a36Sopenharmony_ci} 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_cistruct lsdc_crtc_state { 25562306a36Sopenharmony_ci struct drm_crtc_state base; 25662306a36Sopenharmony_ci struct lsdc_pixpll_parms pparms; 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistruct lsdc_gem { 26062306a36Sopenharmony_ci /* @mutex: protect objects list */ 26162306a36Sopenharmony_ci struct mutex mutex; 26262306a36Sopenharmony_ci struct list_head objects; 26362306a36Sopenharmony_ci}; 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistruct lsdc_device { 26662306a36Sopenharmony_ci struct drm_device base; 26762306a36Sopenharmony_ci struct ttm_device bdev; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci /* @descp: features description of the DC variant */ 27062306a36Sopenharmony_ci const struct lsdc_desc *descp; 27162306a36Sopenharmony_ci struct pci_dev *dc; 27262306a36Sopenharmony_ci struct pci_dev *gpu; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci struct loongson_gfxpll *gfxpll; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci /* @reglock: protects concurrent access */ 27762306a36Sopenharmony_ci spinlock_t reglock; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci void __iomem *reg_base; 28062306a36Sopenharmony_ci resource_size_t vram_base; 28162306a36Sopenharmony_ci resource_size_t vram_size; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci resource_size_t gtt_base; 28462306a36Sopenharmony_ci resource_size_t gtt_size; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci struct lsdc_display_pipe dispipe[LSDC_NUM_CRTC]; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci struct lsdc_gem gem; 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci u32 irq_status; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci /* tracking pinned memory */ 29362306a36Sopenharmony_ci size_t vram_pinned_size; 29462306a36Sopenharmony_ci size_t gtt_pinned_size; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci /* @num_output: count the number of active display pipe */ 29762306a36Sopenharmony_ci unsigned int num_output; 29862306a36Sopenharmony_ci}; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_cistatic inline struct lsdc_device *tdev_to_ldev(struct ttm_device *bdev) 30162306a36Sopenharmony_ci{ 30262306a36Sopenharmony_ci return container_of(bdev, struct lsdc_device, bdev); 30362306a36Sopenharmony_ci} 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_cistatic inline struct lsdc_device *to_lsdc(struct drm_device *ddev) 30662306a36Sopenharmony_ci{ 30762306a36Sopenharmony_ci return container_of(ddev, struct lsdc_device, base); 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistatic inline struct lsdc_crtc_state * 31162306a36Sopenharmony_cito_lsdc_crtc_state(struct drm_crtc_state *base) 31262306a36Sopenharmony_ci{ 31362306a36Sopenharmony_ci return container_of(base, struct lsdc_crtc_state, base); 31462306a36Sopenharmony_ci} 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_civoid lsdc_debugfs_init(struct drm_minor *minor); 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ciint ls7a1000_crtc_init(struct drm_device *ddev, 31962306a36Sopenharmony_ci struct drm_crtc *crtc, 32062306a36Sopenharmony_ci struct drm_plane *primary, 32162306a36Sopenharmony_ci struct drm_plane *cursor, 32262306a36Sopenharmony_ci unsigned int index, 32362306a36Sopenharmony_ci bool no_vblank); 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ciint ls7a2000_crtc_init(struct drm_device *ddev, 32662306a36Sopenharmony_ci struct drm_crtc *crtc, 32762306a36Sopenharmony_ci struct drm_plane *primary, 32862306a36Sopenharmony_ci struct drm_plane *cursor, 32962306a36Sopenharmony_ci unsigned int index, 33062306a36Sopenharmony_ci bool no_vblank); 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ciint lsdc_primary_plane_init(struct drm_device *ddev, 33362306a36Sopenharmony_ci struct drm_plane *plane, 33462306a36Sopenharmony_ci unsigned int index); 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ciint ls7a1000_cursor_plane_init(struct drm_device *ddev, 33762306a36Sopenharmony_ci struct drm_plane *plane, 33862306a36Sopenharmony_ci unsigned int index); 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ciint ls7a2000_cursor_plane_init(struct drm_device *ddev, 34162306a36Sopenharmony_ci struct drm_plane *plane, 34262306a36Sopenharmony_ci unsigned int index); 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci/* Registers access helpers */ 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_cistatic inline u32 lsdc_rreg32(struct lsdc_device *ldev, u32 offset) 34762306a36Sopenharmony_ci{ 34862306a36Sopenharmony_ci return readl(ldev->reg_base + offset); 34962306a36Sopenharmony_ci} 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_cistatic inline void lsdc_wreg32(struct lsdc_device *ldev, u32 offset, u32 val) 35262306a36Sopenharmony_ci{ 35362306a36Sopenharmony_ci writel(val, ldev->reg_base + offset); 35462306a36Sopenharmony_ci} 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_cistatic inline void lsdc_ureg32_set(struct lsdc_device *ldev, 35762306a36Sopenharmony_ci u32 offset, 35862306a36Sopenharmony_ci u32 mask) 35962306a36Sopenharmony_ci{ 36062306a36Sopenharmony_ci void __iomem *addr = ldev->reg_base + offset; 36162306a36Sopenharmony_ci u32 val = readl(addr); 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci writel(val | mask, addr); 36462306a36Sopenharmony_ci} 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cistatic inline void lsdc_ureg32_clr(struct lsdc_device *ldev, 36762306a36Sopenharmony_ci u32 offset, 36862306a36Sopenharmony_ci u32 mask) 36962306a36Sopenharmony_ci{ 37062306a36Sopenharmony_ci void __iomem *addr = ldev->reg_base + offset; 37162306a36Sopenharmony_ci u32 val = readl(addr); 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci writel(val & ~mask, addr); 37462306a36Sopenharmony_ci} 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistatic inline u32 lsdc_pipe_rreg32(struct lsdc_device *ldev, 37762306a36Sopenharmony_ci u32 offset, u32 pipe) 37862306a36Sopenharmony_ci{ 37962306a36Sopenharmony_ci return readl(ldev->reg_base + offset + pipe * CRTC_PIPE_OFFSET); 38062306a36Sopenharmony_ci} 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_cistatic inline void lsdc_pipe_wreg32(struct lsdc_device *ldev, 38362306a36Sopenharmony_ci u32 offset, u32 pipe, u32 val) 38462306a36Sopenharmony_ci{ 38562306a36Sopenharmony_ci writel(val, ldev->reg_base + offset + pipe * CRTC_PIPE_OFFSET); 38662306a36Sopenharmony_ci} 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci#endif 389