2019-05-27 08:55:06 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2009-09-15 11:33:54 -03:00
/*
* Driver for the Conexant CX25821 PCIe bridge
*
2009-09-13 11:25:45 -03:00
* Copyright ( C ) 2009 Conexant Systems Inc .
2009-09-15 11:33:54 -03:00
* Authors < shu . lin @ conexant . com > , < hiep . huynh @ conexant . com >
* Based on Steven Toth < stoth @ linuxtv . org > cx23885 driver
*/
# ifndef CX25821_H_
# define CX25821_H_
# include <linux/pci.h>
# include <linux/i2c.h>
# include <linux/interrupt.h>
# include <linux/delay.h>
# include <linux/sched.h>
# include <linux/kdev_t.h>
# include <media/v4l2-common.h>
2009-09-13 11:25:45 -03:00
# include <media/v4l2-device.h>
2013-04-13 08:38:14 -03:00
# include <media/v4l2-ctrls.h>
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 10:30:30 -03:00
# include <media/videobuf2-v4l2.h>
2014-12-12 10:27:58 -03:00
# include <media/videobuf2-dma-sg.h>
2009-09-15 11:33:54 -03:00
# include "cx25821-reg.h"
# include "cx25821-medusa-reg.h"
# include "cx25821-sram.h"
# include "cx25821-audio.h"
# include <linux/version.h>
# include <linux/mutex.h>
# define UNSET (-1U)
# define NO_SYNC_LINE (-1U)
# define CX25821_MAXBOARDS 2
# define LINE_SIZE_D1 1440
2010-07-04 14:15:38 -03:00
/* Number of decoders and encoders */
2009-09-15 11:33:54 -03:00
# define MAX_DECODERS 8
# define MAX_ENCODERS 2
# define QUAD_DECODERS 4
# define MAX_CAMERAS 16
/* Max number of inputs by card */
2011-10-22 01:43:56 -03:00
# define MAX_CX25821_INPUT 8
2009-09-15 11:33:54 -03:00
# define RESOURCE_VIDEO0 1
# define RESOURCE_VIDEO1 2
# define RESOURCE_VIDEO2 4
# define RESOURCE_VIDEO3 8
# define RESOURCE_VIDEO4 16
# define RESOURCE_VIDEO5 32
# define RESOURCE_VIDEO6 64
# define RESOURCE_VIDEO7 128
# define RESOURCE_VIDEO8 256
# define RESOURCE_VIDEO9 512
# define RESOURCE_VIDEO10 1024
# define RESOURCE_VIDEO11 2048
2009-09-13 11:30:11 -03:00
# define BUFFER_TIMEOUT (HZ) /* 0.5 seconds */
2009-09-15 11:33:54 -03:00
2011-10-22 01:43:56 -03:00
# define UNKNOWN_BOARD 0
2009-09-15 11:33:54 -03:00
# define CX25821_BOARD 1
2009-09-13 11:25:45 -03:00
/* Currently supported by the driver */
2009-09-15 11:33:54 -03:00
# define CX25821_NORMS (\
2010-09-27 10:01:36 -03:00
V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP | V4L2_STD_NTSC_M_KR | \
V4L2_STD_PAL_BG | V4L2_STD_PAL_DK | V4L2_STD_PAL_I | \
V4L2_STD_PAL_M | V4L2_STD_PAL_N | V4L2_STD_PAL_H | \
V4L2_STD_PAL_Nc )
2009-09-15 11:33:54 -03:00
# define CX25821_BOARD_CONEXANT_ATHENA10 1
# define MAX_VID_CHANNEL_NUM 12
2014-12-12 10:28:00 -03:00
/*
* Maximum capture - only channels . This can go away once video / audio output
* is fully supported in this driver .
*/
# define MAX_VID_CAP_CHANNEL_NUM 10
2009-09-15 11:33:54 -03:00
# define VID_CHANNEL_NUM 8
struct cx25821_fmt {
2009-09-13 11:30:11 -03:00
u32 fourcc ; /* v4l2 format id */
int depth ;
int flags ;
u32 cxformat ;
2009-09-15 11:33:54 -03:00
} ;
struct cx25821_tvnorm {
2009-09-13 11:30:11 -03:00
char * name ;
v4l2_std_id id ;
u32 cxiformat ;
u32 cxoformat ;
2009-09-15 11:33:54 -03:00
} ;
enum cx25821_src_sel_type {
2009-09-13 11:30:11 -03:00
CX25821_SRC_SEL_EXT_656_VIDEO = 0 ,
CX25821_SRC_SEL_PARALLEL_MPEG_VIDEO
2009-09-15 11:33:54 -03:00
} ;
2014-12-12 10:27:54 -03:00
struct cx25821_riscmem {
unsigned int size ;
__le32 * cpu ;
__le32 * jmp ;
dma_addr_t dma ;
} ;
2009-09-15 11:33:54 -03:00
/* buffer for one video frame */
struct cx25821_buffer {
2009-09-13 11:30:11 -03:00
/* common v4l buffer stuff -- must be first */
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 10:30:30 -03:00
struct vb2_v4l2_buffer vb ;
2014-12-12 10:27:58 -03:00
struct list_head queue ;
2009-09-13 11:30:11 -03:00
/* cx25821 specific */
unsigned int bpl ;
2014-12-12 10:27:54 -03:00
struct cx25821_riscmem risc ;
2013-04-13 07:41:29 -03:00
const struct cx25821_fmt * fmt ;
2009-09-15 11:33:54 -03:00
} ;
2011-09-02 11:55:29 +08:00
enum port {
2009-09-13 11:30:11 -03:00
CX25821_UNDEFINED = 0 ,
CX25821_RAW ,
CX25821_264
2011-09-02 11:55:29 +08:00
} ;
2009-09-15 11:33:54 -03:00
struct cx25821_board {
2012-07-18 13:41:11 -03:00
const char * name ;
2011-09-02 11:55:29 +08:00
enum port porta ;
enum port portb ;
enum port portc ;
2009-09-13 11:30:11 -03:00
u32 clk_freq ;
2009-09-15 11:33:54 -03:00
} ;
struct cx25821_i2c {
2009-09-13 11:30:11 -03:00
struct cx25821_dev * dev ;
int nr ;
/* i2c i/o */
struct i2c_adapter i2c_adap ;
struct i2c_client i2c_client ;
u32 i2c_rc ;
2019-02-18 14:28:59 -05:00
/* cx25821 registers used for raw address */
2009-09-13 11:30:11 -03:00
u32 i2c_period ;
u32 reg_ctrl ;
u32 reg_stat ;
u32 reg_addr ;
u32 reg_rdata ;
u32 reg_wdata ;
2009-09-15 11:33:54 -03:00
} ;
struct cx25821_dmaqueue {
2009-09-13 11:30:11 -03:00
struct list_head active ;
u32 count ;
2009-09-15 11:33:54 -03:00
} ;
2013-04-13 08:38:14 -03:00
struct cx25821_dev ;
2013-04-14 12:10:32 -03:00
struct cx25821_channel ;
struct cx25821_video_out_data {
struct cx25821_channel * chan ;
int _line_size ;
int _prog_cnt ;
int _pixel_format ;
int _is_first_frame ;
int _is_running ;
int _file_status ;
int _lines_count ;
int _frame_count ;
unsigned int _risc_size ;
__le32 * _dma_virt_start_addr ;
__le32 * _dma_virt_addr ;
dma_addr_t _dma_phys_addr ;
dma_addr_t _dma_phys_start_addr ;
unsigned int _data_buf_size ;
__le32 * _data_buf_virt_addr ;
dma_addr_t _data_buf_phys_addr ;
u32 upstream_riscbuf_size ;
u32 upstream_databuf_size ;
int is_60hz ;
int _frame_index ;
2013-04-14 12:02:19 -03:00
int cur_frame_index ;
int curpos ;
wait_queue_head_t waitq ;
2013-04-14 12:10:32 -03:00
} ;
2010-07-04 14:15:38 -03:00
struct cx25821_channel {
2013-04-13 08:38:14 -03:00
unsigned id ;
struct cx25821_dev * dev ;
2010-07-04 14:15:38 -03:00
2013-04-13 08:38:14 -03:00
struct v4l2_ctrl_handler hdl ;
2010-07-04 14:15:38 -03:00
2013-04-13 08:18:00 -03:00
struct video_device vdev ;
2013-04-13 10:00:52 -03:00
struct cx25821_dmaqueue dma_vidq ;
2014-12-12 10:27:58 -03:00
struct vb2_queue vidq ;
2010-07-04 14:15:38 -03:00
2013-04-13 06:28:54 -03:00
const struct sram_channel * sram_channels ;
2010-07-04 14:15:38 -03:00
2013-04-13 10:00:52 -03:00
const struct cx25821_fmt * fmt ;
2014-12-12 10:27:58 -03:00
unsigned field ;
2013-04-13 10:00:52 -03:00
unsigned int width , height ;
2010-09-27 10:01:36 -03:00
int pixel_formats ;
int use_cif_resolution ;
int cif_width ;
2013-04-14 12:10:32 -03:00
/* video output data for the video output channel */
struct cx25821_video_out_data * out ;
2010-07-04 14:15:38 -03:00
} ;
2013-04-13 07:07:40 -03:00
struct snd_card ;
2009-09-15 11:33:54 -03:00
struct cx25821_dev {
2009-09-13 11:30:11 -03:00
struct v4l2_device v4l2_dev ;
/* pci stuff */
struct pci_dev * pci ;
unsigned char pci_rev , pci_lat ;
int pci_bus , pci_slot ;
u32 base_io_addr ;
u32 __iomem * lmmio ;
u8 __iomem * bmmio ;
int pci_irqmask ;
int hwrevision ;
2013-04-13 07:07:40 -03:00
/* used by cx25821-alsa */
struct snd_card * card ;
2009-09-13 11:30:11 -03:00
u32 clk_freq ;
/* I2C adapters: Master 1 & 2 (External) & Master 3 (Internal only) */
struct cx25821_i2c i2c_bus [ 3 ] ;
int nr ;
struct mutex lock ;
2010-09-27 10:01:36 -03:00
struct cx25821_channel channels [ MAX_VID_CHANNEL_NUM ] ;
2010-07-04 14:15:38 -03:00
2009-09-13 11:30:11 -03:00
/* board details */
unsigned int board ;
char name [ 32 ] ;
/* Analog video */
unsigned int input ;
v4l2_std_id tvnorm ;
unsigned short _max_num_decoders ;
/* Analog Audio Upstream */
int _audio_is_running ;
int _audiopixel_format ;
int _is_first_audio_frame ;
int _audiofile_status ;
int _audio_lines_count ;
int _audioframe_count ;
2011-09-02 11:55:30 +08:00
int _audio_upstream_channel ;
2010-09-27 10:01:36 -03:00
int _last_index_irq ; /* The last interrupt index processed. */
2009-09-13 11:30:11 -03:00
__le32 * _risc_audio_jmp_addr ;
__le32 * _risc_virt_start_addr ;
__le32 * _risc_virt_addr ;
dma_addr_t _risc_phys_addr ;
dma_addr_t _risc_phys_start_addr ;
unsigned int _audiorisc_size ;
unsigned int _audiodata_buf_size ;
__le32 * _audiodata_buf_virt_addr ;
dma_addr_t _audiodata_buf_phys_addr ;
char * _audiofilename ;
u32 audio_upstream_riscbuf_size ;
u32 audio_upstream_databuf_size ;
int _audioframe_index ;
struct work_struct _audio_work_entry ;
char * input_audiofilename ;
2013-04-14 12:10:32 -03:00
/* V4l */
spinlock_t slock ;
/* Video Upstream */
struct cx25821_video_out_data vid_out_data [ 2 ] ;
2009-09-15 11:33:54 -03:00
} ;
static inline struct cx25821_dev * get_cx25821 ( struct v4l2_device * v4l2_dev )
{
2009-09-13 11:30:11 -03:00
return container_of ( v4l2_dev , struct cx25821_dev , v4l2_dev ) ;
2009-09-15 11:33:54 -03:00
}
extern struct cx25821_board cx25821_boards [ ] ;
2009-09-13 11:30:11 -03:00
# define SRAM_CH00 0 /* Video A */
# define SRAM_CH01 1 /* Video B */
# define SRAM_CH02 2 /* Video C */
# define SRAM_CH03 3 /* Video D */
# define SRAM_CH04 4 /* Video E */
# define SRAM_CH05 5 /* Video F */
# define SRAM_CH06 6 /* Video G */
# define SRAM_CH07 7 /* Video H */
2009-09-15 11:33:54 -03:00
2009-09-13 11:30:11 -03:00
# define SRAM_CH08 8 /* Audio A */
# define SRAM_CH09 9 /* Video Upstream I */
# define SRAM_CH10 10 /* Video Upstream J */
# define SRAM_CH11 11 /* Audio Upstream AUD_CHANNEL_B */
2009-09-15 11:33:54 -03:00
# define VID_UPSTREAM_SRAM_CHANNEL_I SRAM_CH09
# define VID_UPSTREAM_SRAM_CHANNEL_J SRAM_CH10
# define AUDIO_UPSTREAM_SRAM_CHANNEL_B SRAM_CH11
struct sram_channel {
2009-09-13 11:30:11 -03:00
char * name ;
u32 i ;
u32 cmds_start ;
u32 ctrl_start ;
u32 cdt ;
u32 fifo_start ;
u32 fifo_size ;
u32 ptr1_reg ;
u32 ptr2_reg ;
u32 cnt1_reg ;
u32 cnt2_reg ;
u32 int_msk ;
u32 int_stat ;
u32 int_mstat ;
u32 dma_ctl ;
u32 gpcnt_ctl ;
u32 gpcnt ;
u32 aud_length ;
u32 aud_cfg ;
u32 fld_aud_fifo_en ;
u32 fld_aud_risc_en ;
2010-09-27 10:01:36 -03:00
/* For Upstream Video */
2009-09-13 11:30:11 -03:00
u32 vid_fmt_ctl ;
u32 vid_active_ctl1 ;
u32 vid_active_ctl2 ;
u32 vid_cdt_size ;
u32 vip_ctl ;
u32 pix_frmt ;
u32 jumponly ;
u32 irq_bit ;
2009-09-15 11:33:54 -03:00
} ;
2013-04-13 06:28:54 -03:00
extern const struct sram_channel cx25821_sram_channels [ ] ;
2009-09-15 11:33:54 -03:00
# define cx_read(reg) readl(dev->lmmio + ((reg)>>2))
# define cx_write(reg, value) writel((value), dev->lmmio + ((reg)>>2))
# define cx_andor(reg, mask, value) \
2010-09-27 10:01:36 -03:00
writel ( ( readl ( dev - > lmmio + ( ( reg ) > > 2 ) ) & ~ ( mask ) ) | \
( ( value ) & ( mask ) ) , dev - > lmmio + ( ( reg ) > > 2 ) )
2009-09-15 11:33:54 -03:00
# define cx_set(reg, bit) cx_andor((reg), (bit), (bit))
# define cx_clear(reg, bit) cx_andor((reg), (bit), 0)
# define Set_GPIO_Bit(Bit) (1 << Bit)
# define Clear_GPIO_Bit(Bit) (~(1 << Bit))
2010-11-07 17:48:21 -03:00
# define CX25821_ERR(fmt, args...) \
pr_err ( " (%d): " fmt , dev - > board , # # args )
# define CX25821_WARN(fmt, args...) \
pr_warn ( " (%d): " fmt , dev - > board , # # args )
# define CX25821_INFO(fmt, args...) \
pr_info ( " (%d): " fmt , dev - > board , # # args )
2009-09-15 11:33:54 -03:00
2009-09-13 11:30:11 -03:00
extern int cx25821_i2c_register ( struct cx25821_i2c * bus ) ;
extern int cx25821_i2c_read ( struct cx25821_i2c * bus , u16 reg_addr , int * value ) ;
extern int cx25821_i2c_write ( struct cx25821_i2c * bus , u16 reg_addr , int value ) ;
extern int cx25821_i2c_unregister ( struct cx25821_i2c * bus ) ;
2009-09-15 11:33:54 -03:00
extern void cx25821_gpio_init ( struct cx25821_dev * dev ) ;
2009-09-13 11:30:11 -03:00
extern void cx25821_set_gpiopin_direction ( struct cx25821_dev * dev ,
int pin_number , int pin_logic_value ) ;
extern int medusa_video_init ( struct cx25821_dev * dev ) ;
extern int medusa_set_videostandard ( struct cx25821_dev * dev ) ;
extern void medusa_set_resolution ( struct cx25821_dev * dev , int width ,
int decoder_select ) ;
extern int medusa_set_brightness ( struct cx25821_dev * dev , int brightness ,
int decoder ) ;
extern int medusa_set_contrast ( struct cx25821_dev * dev , int contrast ,
int decoder ) ;
extern int medusa_set_hue ( struct cx25821_dev * dev , int hue , int decoder ) ;
extern int medusa_set_saturation ( struct cx25821_dev * dev , int saturation ,
int decoder ) ;
extern int cx25821_sram_channel_setup ( struct cx25821_dev * dev ,
2013-04-13 06:28:54 -03:00
const struct sram_channel * ch , unsigned int bpl ,
2009-09-13 11:30:11 -03:00
u32 risc ) ;
2009-09-15 11:33:54 -03:00
2014-12-12 10:27:54 -03:00
extern int cx25821_riscmem_alloc ( struct pci_dev * pci ,
struct cx25821_riscmem * risc ,
unsigned int size ) ;
extern int cx25821_risc_buffer ( struct pci_dev * pci , struct cx25821_riscmem * risc ,
2009-09-13 11:30:11 -03:00
struct scatterlist * sglist ,
unsigned int top_offset ,
unsigned int bottom_offset ,
unsigned int bpl ,
unsigned int padding , unsigned int lines ) ;
2009-09-15 11:33:54 -03:00
extern int cx25821_risc_databuffer_audio ( struct pci_dev * pci ,
2014-12-12 10:27:54 -03:00
struct cx25821_riscmem * risc ,
2009-09-13 11:30:11 -03:00
struct scatterlist * sglist ,
unsigned int bpl ,
unsigned int lines , unsigned int lpi ) ;
2014-12-12 10:27:58 -03:00
extern void cx25821_free_buffer ( struct cx25821_dev * dev ,
2009-09-13 11:30:11 -03:00
struct cx25821_buffer * buf ) ;
extern void cx25821_sram_channel_dump ( struct cx25821_dev * dev ,
2013-04-13 06:28:54 -03:00
const struct sram_channel * ch ) ;
2009-09-13 11:30:11 -03:00
extern void cx25821_sram_channel_dump_audio ( struct cx25821_dev * dev ,
2013-04-13 06:28:54 -03:00
const struct sram_channel * ch ) ;
2009-09-13 11:30:11 -03:00
extern struct cx25821_dev * cx25821_dev_get ( struct pci_dev * pci ) ;
extern void cx25821_print_irqbits ( char * name , char * tag , char * * strings ,
int len , u32 bits , u32 mask ) ;
2009-09-15 11:33:54 -03:00
extern void cx25821_dev_unregister ( struct cx25821_dev * dev ) ;
extern int cx25821_sram_channel_setup_audio ( struct cx25821_dev * dev ,
2013-04-13 06:28:54 -03:00
const struct sram_channel * ch ,
2009-09-13 11:30:11 -03:00
unsigned int bpl , u32 risc ) ;
extern void cx25821_set_pixel_format ( struct cx25821_dev * dev , int channel ,
u32 format ) ;
2013-04-13 07:41:29 -03:00
2009-09-15 11:33:54 -03:00
# endif