162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * cobalt driver internal defines and structures 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Derived from cx18-driver.h 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright 2012-2015 Cisco Systems, Inc. and/or its affiliates. 862306a36Sopenharmony_ci * All rights reserved. 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifndef COBALT_DRIVER_H 1262306a36Sopenharmony_ci#define COBALT_DRIVER_H 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/bitops.h> 1562306a36Sopenharmony_ci#include <linux/module.h> 1662306a36Sopenharmony_ci#include <linux/pci.h> 1762306a36Sopenharmony_ci#include <linux/spinlock.h> 1862306a36Sopenharmony_ci#include <linux/i2c.h> 1962306a36Sopenharmony_ci#include <linux/list.h> 2062306a36Sopenharmony_ci#include <linux/workqueue.h> 2162306a36Sopenharmony_ci#include <linux/mutex.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <media/v4l2-common.h> 2462306a36Sopenharmony_ci#include <media/v4l2-ioctl.h> 2562306a36Sopenharmony_ci#include <media/v4l2-device.h> 2662306a36Sopenharmony_ci#include <media/v4l2-fh.h> 2762306a36Sopenharmony_ci#include <media/videobuf2-v4l2.h> 2862306a36Sopenharmony_ci#include <media/videobuf2-dma-sg.h> 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#include "m00233_video_measure_memmap_package.h" 3162306a36Sopenharmony_ci#include "m00235_fdma_packer_memmap_package.h" 3262306a36Sopenharmony_ci#include "m00389_cvi_memmap_package.h" 3362306a36Sopenharmony_ci#include "m00460_evcnt_memmap_package.h" 3462306a36Sopenharmony_ci#include "m00473_freewheel_memmap_package.h" 3562306a36Sopenharmony_ci#include "m00479_clk_loss_detector_memmap_package.h" 3662306a36Sopenharmony_ci#include "m00514_syncgen_flow_evcnt_memmap_package.h" 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* System device ID */ 3962306a36Sopenharmony_ci#define PCI_DEVICE_ID_COBALT 0x2732 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* Number of cobalt device nodes. */ 4262306a36Sopenharmony_ci#define COBALT_NUM_INPUTS 4 4362306a36Sopenharmony_ci#define COBALT_NUM_NODES 6 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* Number of cobalt device streams. */ 4662306a36Sopenharmony_ci#define COBALT_NUM_STREAMS 12 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define COBALT_HSMA_IN_NODE 4 4962306a36Sopenharmony_ci#define COBALT_HSMA_OUT_NODE 5 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* Cobalt audio streams */ 5262306a36Sopenharmony_ci#define COBALT_AUDIO_IN_STREAM 6 5362306a36Sopenharmony_ci#define COBALT_AUDIO_OUT_STREAM 11 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/* DMA stuff */ 5662306a36Sopenharmony_ci#define DMA_CHANNELS_MAX 16 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/* i2c stuff */ 5962306a36Sopenharmony_ci#define I2C_CLIENTS_MAX 16 6062306a36Sopenharmony_ci#define COBALT_NUM_ADAPTERS 5 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci#define COBALT_CLK 50000000 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* System status register */ 6562306a36Sopenharmony_ci#define COBALT_SYSSTAT_DIP0_MSK BIT(0) 6662306a36Sopenharmony_ci#define COBALT_SYSSTAT_DIP1_MSK BIT(1) 6762306a36Sopenharmony_ci#define COBALT_SYSSTAT_HSMA_PRSNTN_MSK BIT(2) 6862306a36Sopenharmony_ci#define COBALT_SYSSTAT_FLASH_RDYBSYN_MSK BIT(3) 6962306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI0_5V_MSK BIT(4) 7062306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI0_INT1_MSK BIT(5) 7162306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI0_INT2_MSK BIT(6) 7262306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI0_LOST_DATA_MSK BIT(7) 7362306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI1_5V_MSK BIT(8) 7462306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI1_INT1_MSK BIT(9) 7562306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI1_INT2_MSK BIT(10) 7662306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI1_LOST_DATA_MSK BIT(11) 7762306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI2_5V_MSK BIT(12) 7862306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI2_INT1_MSK BIT(13) 7962306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI2_INT2_MSK BIT(14) 8062306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI2_LOST_DATA_MSK BIT(15) 8162306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI3_5V_MSK BIT(16) 8262306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI3_INT1_MSK BIT(17) 8362306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI3_INT2_MSK BIT(18) 8462306a36Sopenharmony_ci#define COBALT_SYSSTAT_VI3_LOST_DATA_MSK BIT(19) 8562306a36Sopenharmony_ci#define COBALT_SYSSTAT_VIHSMA_5V_MSK BIT(20) 8662306a36Sopenharmony_ci#define COBALT_SYSSTAT_VIHSMA_INT1_MSK BIT(21) 8762306a36Sopenharmony_ci#define COBALT_SYSSTAT_VIHSMA_INT2_MSK BIT(22) 8862306a36Sopenharmony_ci#define COBALT_SYSSTAT_VIHSMA_LOST_DATA_MSK BIT(23) 8962306a36Sopenharmony_ci#define COBALT_SYSSTAT_VOHSMA_INT1_MSK BIT(24) 9062306a36Sopenharmony_ci#define COBALT_SYSSTAT_VOHSMA_PLL_LOCKED_MSK BIT(25) 9162306a36Sopenharmony_ci#define COBALT_SYSSTAT_VOHSMA_LOST_DATA_MSK BIT(26) 9262306a36Sopenharmony_ci#define COBALT_SYSSTAT_AUD_PLL_LOCKED_MSK BIT(28) 9362306a36Sopenharmony_ci#define COBALT_SYSSTAT_AUD_IN_LOST_DATA_MSK BIT(29) 9462306a36Sopenharmony_ci#define COBALT_SYSSTAT_AUD_OUT_LOST_DATA_MSK BIT(30) 9562306a36Sopenharmony_ci#define COBALT_SYSSTAT_PCIE_SMBCLK_MSK BIT(31) 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci/* Cobalt memory map */ 9862306a36Sopenharmony_ci#define COBALT_I2C_0_BASE 0x0 9962306a36Sopenharmony_ci#define COBALT_I2C_1_BASE 0x080 10062306a36Sopenharmony_ci#define COBALT_I2C_2_BASE 0x100 10162306a36Sopenharmony_ci#define COBALT_I2C_3_BASE 0x180 10262306a36Sopenharmony_ci#define COBALT_I2C_HSMA_BASE 0x200 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci#define COBALT_SYS_CTRL_BASE 0x400 10562306a36Sopenharmony_ci#define COBALT_SYS_CTRL_HSMA_TX_ENABLE_BIT 1 10662306a36Sopenharmony_ci#define COBALT_SYS_CTRL_VIDEO_RX_RESETN_BIT(n) (4 + 4 * (n)) 10762306a36Sopenharmony_ci#define COBALT_SYS_CTRL_NRESET_TO_HDMI_BIT(n) (5 + 4 * (n)) 10862306a36Sopenharmony_ci#define COBALT_SYS_CTRL_HPD_TO_CONNECTOR_BIT(n) (6 + 4 * (n)) 10962306a36Sopenharmony_ci#define COBALT_SYS_CTRL_AUDIO_IPP_RESETN_BIT(n) (7 + 4 * (n)) 11062306a36Sopenharmony_ci#define COBALT_SYS_CTRL_PWRDN0_TO_HSMA_TX_BIT 24 11162306a36Sopenharmony_ci#define COBALT_SYS_CTRL_VIDEO_TX_RESETN_BIT 25 11262306a36Sopenharmony_ci#define COBALT_SYS_CTRL_AUDIO_OPP_RESETN_BIT 27 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#define COBALT_SYS_STAT_BASE 0x500 11562306a36Sopenharmony_ci#define COBALT_SYS_STAT_MASK (COBALT_SYS_STAT_BASE + 0x08) 11662306a36Sopenharmony_ci#define COBALT_SYS_STAT_EDGE (COBALT_SYS_STAT_BASE + 0x0c) 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci#define COBALT_HDL_INFO_BASE 0x4800 11962306a36Sopenharmony_ci#define COBALT_HDL_INFO_SIZE 0x200 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci#define COBALT_VID_BASE 0x10000 12262306a36Sopenharmony_ci#define COBALT_VID_SIZE 0x1000 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#define COBALT_CVI(cobalt, c) \ 12562306a36Sopenharmony_ci (cobalt->bar1 + COBALT_VID_BASE + (c) * COBALT_VID_SIZE) 12662306a36Sopenharmony_ci#define COBALT_CVI_VMR(cobalt, c) \ 12762306a36Sopenharmony_ci (cobalt->bar1 + COBALT_VID_BASE + (c) * COBALT_VID_SIZE + 0x100) 12862306a36Sopenharmony_ci#define COBALT_CVI_EVCNT(cobalt, c) \ 12962306a36Sopenharmony_ci (cobalt->bar1 + COBALT_VID_BASE + (c) * COBALT_VID_SIZE + 0x200) 13062306a36Sopenharmony_ci#define COBALT_CVI_FREEWHEEL(cobalt, c) \ 13162306a36Sopenharmony_ci (cobalt->bar1 + COBALT_VID_BASE + (c) * COBALT_VID_SIZE + 0x300) 13262306a36Sopenharmony_ci#define COBALT_CVI_CLK_LOSS(cobalt, c) \ 13362306a36Sopenharmony_ci (cobalt->bar1 + COBALT_VID_BASE + (c) * COBALT_VID_SIZE + 0x400) 13462306a36Sopenharmony_ci#define COBALT_CVI_PACKER(cobalt, c) \ 13562306a36Sopenharmony_ci (cobalt->bar1 + COBALT_VID_BASE + (c) * COBALT_VID_SIZE + 0x500) 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci#define COBALT_TX_BASE(cobalt) (cobalt->bar1 + COBALT_VID_BASE + 0x5000) 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci#define DMA_INTERRUPT_STATUS_REG 0x08 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#define COBALT_HDL_SEARCH_STR "** HDL version info **" 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci/* Cobalt CPU bus interface */ 14462306a36Sopenharmony_ci#define COBALT_BUS_BAR1_BASE 0x600 14562306a36Sopenharmony_ci#define COBALT_BUS_SRAM_BASE 0x0 14662306a36Sopenharmony_ci#define COBALT_BUS_CPLD_BASE 0x00600000 14762306a36Sopenharmony_ci#define COBALT_BUS_FLASH_BASE 0x08000000 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci/* FDMA to PCIe packing */ 15062306a36Sopenharmony_ci#define COBALT_BYTES_PER_PIXEL_YUYV 2 15162306a36Sopenharmony_ci#define COBALT_BYTES_PER_PIXEL_RGB24 3 15262306a36Sopenharmony_ci#define COBALT_BYTES_PER_PIXEL_RGB32 4 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/* debugging */ 15562306a36Sopenharmony_ciextern int cobalt_debug; 15662306a36Sopenharmony_ciextern int cobalt_ignore_err; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci#define cobalt_err(fmt, arg...) v4l2_err(&cobalt->v4l2_dev, fmt, ## arg) 15962306a36Sopenharmony_ci#define cobalt_warn(fmt, arg...) v4l2_warn(&cobalt->v4l2_dev, fmt, ## arg) 16062306a36Sopenharmony_ci#define cobalt_info(fmt, arg...) v4l2_info(&cobalt->v4l2_dev, fmt, ## arg) 16162306a36Sopenharmony_ci#define cobalt_dbg(level, fmt, arg...) \ 16262306a36Sopenharmony_ci v4l2_dbg(level, cobalt_debug, &cobalt->v4l2_dev, fmt, ## arg) 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistruct cobalt; 16562306a36Sopenharmony_cistruct cobalt_i2c_regs; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci/* Per I2C bus private algo callback data */ 16862306a36Sopenharmony_cistruct cobalt_i2c_data { 16962306a36Sopenharmony_ci struct cobalt *cobalt; 17062306a36Sopenharmony_ci struct cobalt_i2c_regs __iomem *regs; 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistruct pci_consistent_buffer { 17462306a36Sopenharmony_ci void *virt; 17562306a36Sopenharmony_ci dma_addr_t bus; 17662306a36Sopenharmony_ci size_t bytes; 17762306a36Sopenharmony_ci}; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cistruct sg_dma_desc_info { 18062306a36Sopenharmony_ci void *virt; 18162306a36Sopenharmony_ci dma_addr_t bus; 18262306a36Sopenharmony_ci unsigned size; 18362306a36Sopenharmony_ci void *last_desc_virt; 18462306a36Sopenharmony_ci struct device *dev; 18562306a36Sopenharmony_ci}; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci#define COBALT_MAX_WIDTH 1920 18862306a36Sopenharmony_ci#define COBALT_MAX_HEIGHT 1200 18962306a36Sopenharmony_ci#define COBALT_MAX_BPP 3 19062306a36Sopenharmony_ci#define COBALT_MAX_FRAMESZ \ 19162306a36Sopenharmony_ci (COBALT_MAX_WIDTH * COBALT_MAX_HEIGHT * COBALT_MAX_BPP) 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci#define NR_BUFS VIDEO_MAX_FRAME 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci#define COBALT_STREAM_FL_DMA_IRQ 0 19662306a36Sopenharmony_ci#define COBALT_STREAM_FL_ADV_IRQ 1 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_cistruct cobalt_buffer { 19962306a36Sopenharmony_ci struct vb2_v4l2_buffer vb; 20062306a36Sopenharmony_ci struct list_head list; 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistatic inline 20462306a36Sopenharmony_cistruct cobalt_buffer *to_cobalt_buffer(struct vb2_v4l2_buffer *vb2) 20562306a36Sopenharmony_ci{ 20662306a36Sopenharmony_ci return container_of(vb2, struct cobalt_buffer, vb); 20762306a36Sopenharmony_ci} 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cistruct cobalt_stream { 21062306a36Sopenharmony_ci struct video_device vdev; 21162306a36Sopenharmony_ci struct vb2_queue q; 21262306a36Sopenharmony_ci struct list_head bufs; 21362306a36Sopenharmony_ci struct i2c_adapter *i2c_adap; 21462306a36Sopenharmony_ci struct v4l2_subdev *sd; 21562306a36Sopenharmony_ci struct mutex lock; 21662306a36Sopenharmony_ci spinlock_t irqlock; 21762306a36Sopenharmony_ci struct v4l2_dv_timings timings; 21862306a36Sopenharmony_ci u32 input; 21962306a36Sopenharmony_ci u32 pad_source; 22062306a36Sopenharmony_ci u32 width, height, bpp; 22162306a36Sopenharmony_ci u32 stride; 22262306a36Sopenharmony_ci u32 pixfmt; 22362306a36Sopenharmony_ci u32 sequence; 22462306a36Sopenharmony_ci u32 colorspace; 22562306a36Sopenharmony_ci u32 xfer_func; 22662306a36Sopenharmony_ci u32 ycbcr_enc; 22762306a36Sopenharmony_ci u32 quantization; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci u8 dma_channel; 23062306a36Sopenharmony_ci int video_channel; 23162306a36Sopenharmony_ci unsigned dma_fifo_mask; 23262306a36Sopenharmony_ci unsigned adv_irq_mask; 23362306a36Sopenharmony_ci struct sg_dma_desc_info dma_desc_info[NR_BUFS]; 23462306a36Sopenharmony_ci unsigned long flags; 23562306a36Sopenharmony_ci bool unstable_frame; 23662306a36Sopenharmony_ci bool enable_cvi; 23762306a36Sopenharmony_ci bool enable_freewheel; 23862306a36Sopenharmony_ci unsigned skip_first_frames; 23962306a36Sopenharmony_ci bool is_output; 24062306a36Sopenharmony_ci bool is_audio; 24162306a36Sopenharmony_ci bool is_dummy; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci struct cobalt *cobalt; 24462306a36Sopenharmony_ci struct snd_cobalt_card *alsa; 24562306a36Sopenharmony_ci}; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_cistruct snd_cobalt_card; 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci/* Struct to hold info about cobalt cards */ 25062306a36Sopenharmony_cistruct cobalt { 25162306a36Sopenharmony_ci int instance; 25262306a36Sopenharmony_ci struct pci_dev *pci_dev; 25362306a36Sopenharmony_ci struct v4l2_device v4l2_dev; 25462306a36Sopenharmony_ci /* serialize PCI access in cobalt_s_bit_sysctrl() */ 25562306a36Sopenharmony_ci struct mutex pci_lock; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci void __iomem *bar0, *bar1; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci u8 card_rev; 26062306a36Sopenharmony_ci u16 device_id; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci /* device nodes */ 26362306a36Sopenharmony_ci struct cobalt_stream streams[DMA_CHANNELS_MAX]; 26462306a36Sopenharmony_ci struct i2c_adapter i2c_adap[COBALT_NUM_ADAPTERS]; 26562306a36Sopenharmony_ci struct cobalt_i2c_data i2c_data[COBALT_NUM_ADAPTERS]; 26662306a36Sopenharmony_ci bool have_hsma_rx; 26762306a36Sopenharmony_ci bool have_hsma_tx; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci /* irq */ 27062306a36Sopenharmony_ci struct workqueue_struct *irq_work_queues; 27162306a36Sopenharmony_ci struct work_struct irq_work_queue; /* work entry */ 27262306a36Sopenharmony_ci /* irq counters */ 27362306a36Sopenharmony_ci u32 irq_adv1; 27462306a36Sopenharmony_ci u32 irq_adv2; 27562306a36Sopenharmony_ci u32 irq_advout; 27662306a36Sopenharmony_ci u32 irq_dma_tot; 27762306a36Sopenharmony_ci u32 irq_dma[COBALT_NUM_STREAMS]; 27862306a36Sopenharmony_ci u32 irq_none; 27962306a36Sopenharmony_ci u32 irq_full_fifo; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci /* omnitek dma */ 28262306a36Sopenharmony_ci int dma_channels; 28362306a36Sopenharmony_ci int first_fifo_channel; 28462306a36Sopenharmony_ci bool pci_32_bit; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci char hdl_info[COBALT_HDL_INFO_SIZE]; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci /* NOR flash */ 28962306a36Sopenharmony_ci struct mtd_info *mtd; 29062306a36Sopenharmony_ci}; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cistatic inline struct cobalt *to_cobalt(struct v4l2_device *v4l2_dev) 29362306a36Sopenharmony_ci{ 29462306a36Sopenharmony_ci return container_of(v4l2_dev, struct cobalt, v4l2_dev); 29562306a36Sopenharmony_ci} 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cistatic inline void cobalt_write_bar0(struct cobalt *cobalt, u32 reg, u32 val) 29862306a36Sopenharmony_ci{ 29962306a36Sopenharmony_ci iowrite32(val, cobalt->bar0 + reg); 30062306a36Sopenharmony_ci} 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cistatic inline u32 cobalt_read_bar0(struct cobalt *cobalt, u32 reg) 30362306a36Sopenharmony_ci{ 30462306a36Sopenharmony_ci return ioread32(cobalt->bar0 + reg); 30562306a36Sopenharmony_ci} 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_cistatic inline void cobalt_write_bar1(struct cobalt *cobalt, u32 reg, u32 val) 30862306a36Sopenharmony_ci{ 30962306a36Sopenharmony_ci iowrite32(val, cobalt->bar1 + reg); 31062306a36Sopenharmony_ci} 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistatic inline u32 cobalt_read_bar1(struct cobalt *cobalt, u32 reg) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci return ioread32(cobalt->bar1 + reg); 31562306a36Sopenharmony_ci} 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_cistatic inline u32 cobalt_g_sysctrl(struct cobalt *cobalt) 31862306a36Sopenharmony_ci{ 31962306a36Sopenharmony_ci return cobalt_read_bar1(cobalt, COBALT_SYS_CTRL_BASE); 32062306a36Sopenharmony_ci} 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_cistatic inline void cobalt_s_bit_sysctrl(struct cobalt *cobalt, 32362306a36Sopenharmony_ci int bit, int val) 32462306a36Sopenharmony_ci{ 32562306a36Sopenharmony_ci u32 ctrl; 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci mutex_lock(&cobalt->pci_lock); 32862306a36Sopenharmony_ci ctrl = cobalt_read_bar1(cobalt, COBALT_SYS_CTRL_BASE); 32962306a36Sopenharmony_ci cobalt_write_bar1(cobalt, COBALT_SYS_CTRL_BASE, 33062306a36Sopenharmony_ci (ctrl & ~(1UL << bit)) | (val << bit)); 33162306a36Sopenharmony_ci mutex_unlock(&cobalt->pci_lock); 33262306a36Sopenharmony_ci} 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_cistatic inline u32 cobalt_g_sysstat(struct cobalt *cobalt) 33562306a36Sopenharmony_ci{ 33662306a36Sopenharmony_ci return cobalt_read_bar1(cobalt, COBALT_SYS_STAT_BASE); 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci#define ADRS_REG (bar1 + COBALT_BUS_BAR1_BASE + 0) 34062306a36Sopenharmony_ci#define LOWER_DATA (bar1 + COBALT_BUS_BAR1_BASE + 4) 34162306a36Sopenharmony_ci#define UPPER_DATA (bar1 + COBALT_BUS_BAR1_BASE + 6) 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistatic inline u32 cobalt_bus_read32(void __iomem *bar1, u32 bus_adrs) 34462306a36Sopenharmony_ci{ 34562306a36Sopenharmony_ci iowrite32(bus_adrs, ADRS_REG); 34662306a36Sopenharmony_ci return ioread32(LOWER_DATA); 34762306a36Sopenharmony_ci} 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_cistatic inline void cobalt_bus_write16(void __iomem *bar1, 35062306a36Sopenharmony_ci u32 bus_adrs, u16 data) 35162306a36Sopenharmony_ci{ 35262306a36Sopenharmony_ci iowrite32(bus_adrs, ADRS_REG); 35362306a36Sopenharmony_ci if (bus_adrs & 2) 35462306a36Sopenharmony_ci iowrite16(data, UPPER_DATA); 35562306a36Sopenharmony_ci else 35662306a36Sopenharmony_ci iowrite16(data, LOWER_DATA); 35762306a36Sopenharmony_ci} 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_cistatic inline void cobalt_bus_write32(void __iomem *bar1, 36062306a36Sopenharmony_ci u32 bus_adrs, u16 data) 36162306a36Sopenharmony_ci{ 36262306a36Sopenharmony_ci iowrite32(bus_adrs, ADRS_REG); 36362306a36Sopenharmony_ci if (bus_adrs & 2) 36462306a36Sopenharmony_ci iowrite32(data, UPPER_DATA); 36562306a36Sopenharmony_ci else 36662306a36Sopenharmony_ci iowrite32(data, LOWER_DATA); 36762306a36Sopenharmony_ci} 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci/*==============Prototypes==================*/ 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_civoid cobalt_pcie_status_show(struct cobalt *cobalt); 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci#endif 374