brintos

brintos / linux-shallow public Read only

0
0
Text · 4.3 KiB · 21a9899 Raw
180 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (C) 2015 VanguardiaSur - www.vanguardiasur.com.ar4 *5 * Copyright (C) 2015 Industrial Research Institute for Automation6 * and Measurements PIAP7 * Written by Krzysztof Ha?asa8 */9 10#include <linux/mutex.h>11#include <linux/pci.h>12#include <linux/timer.h>13#include <linux/videodev2.h>14#include <media/v4l2-common.h>15#include <media/v4l2-ctrls.h>16#include <media/v4l2-device.h>17#include <media/v4l2-ioctl.h>18#include <media/videobuf2-v4l2.h>19#include <sound/pcm.h>20 21#include "tw686x-regs.h"22 23#define TYPE_MAX_CHANNELS	0x0f24#define TYPE_SECOND_GEN		0x1025#define TW686X_DEF_PHASE_REF	0x151826 27#define TW686X_AUDIO_PAGE_MAX		1628#define TW686X_AUDIO_PERIODS_MIN	229#define TW686X_AUDIO_PERIODS_MAX	TW686X_AUDIO_PAGE_MAX30 31#define TW686X_DMA_MODE_MEMCPY		032#define TW686X_DMA_MODE_CONTIG		133#define TW686X_DMA_MODE_SG		234 35struct tw686x_format {36	char *name;37	unsigned int fourcc;38	unsigned int depth;39	unsigned int mode;40};41 42struct tw686x_dma_desc {43	dma_addr_t phys;44	void *virt;45	unsigned int size;46};47 48struct tw686x_sg_desc {49	/* 3 MSBits for flags, 13 LSBits for length */50	__le32 flags_length;51	__le32 phys;52};53 54struct tw686x_audio_buf {55	dma_addr_t dma;56	void *virt;57	struct list_head list;58};59 60struct tw686x_v4l2_buf {61	struct vb2_v4l2_buffer vb;62	struct list_head list;63};64 65struct tw686x_audio_channel {66	struct tw686x_dev *dev;67	struct snd_pcm_substream *ss;68	unsigned int ch;69	struct tw686x_audio_buf *curr_bufs[2];70	struct tw686x_dma_desc dma_descs[2];71	dma_addr_t ptr;72 73	struct tw686x_audio_buf buf[TW686X_AUDIO_PAGE_MAX];74	struct list_head buf_list;75	spinlock_t lock;76};77 78struct tw686x_video_channel {79	struct tw686x_dev *dev;80 81	struct vb2_queue vidq;82	struct list_head vidq_queued;83	struct video_device *device;84	struct tw686x_v4l2_buf *curr_bufs[2];85	struct tw686x_dma_desc dma_descs[2];86	struct tw686x_sg_desc *sg_descs[2];87 88	struct v4l2_ctrl_handler ctrl_handler;89	const struct tw686x_format *format;90	struct mutex vb_mutex;91	spinlock_t qlock;92	v4l2_std_id video_standard;93	unsigned int width, height;94	unsigned int h_halve, v_halve;95	unsigned int ch;96	unsigned int num;97	unsigned int fps;98	unsigned int input;99	unsigned int sequence;100	unsigned int pb;101	bool no_signal;102};103 104struct tw686x_dma_ops {105	int (*setup)(struct tw686x_dev *dev);106	int (*alloc)(struct tw686x_video_channel *vc, unsigned int pb);107	void (*free)(struct tw686x_video_channel *vc, unsigned int pb);108	void (*buf_refill)(struct tw686x_video_channel *vc, unsigned int pb);109	const struct vb2_mem_ops *mem_ops;110	enum v4l2_field field;111	u32 hw_dma_mode;112};113 114/* struct tw686x_dev - global device status */115struct tw686x_dev {116	/*117	 * spinlock controlling access to the shared device registers118	 * (DMA enable/disable)119	 */120	spinlock_t lock;121 122	struct v4l2_device v4l2_dev;123	struct snd_card *snd_card;124 125	char name[32];126	unsigned int type;127	unsigned int dma_mode;128	struct pci_dev *pci_dev;129	__u32 __iomem *mmio;130 131	const struct tw686x_dma_ops *dma_ops;132	struct tw686x_video_channel *video_channels;133	struct tw686x_audio_channel *audio_channels;134 135	/* Per-device audio parameters */136	int audio_rate;137	int period_size;138	int audio_enabled;139 140	struct timer_list dma_delay_timer;141	u32 pending_dma_en; /* must be protected by lock */142	u32 pending_dma_cmd; /* must be protected by lock */143};144 145static inline uint32_t reg_read(struct tw686x_dev *dev, unsigned int reg)146{147	return readl(dev->mmio + reg);148}149 150static inline void reg_write(struct tw686x_dev *dev, unsigned int reg,151			     uint32_t value)152{153	writel(value, dev->mmio + reg);154}155 156static inline unsigned int max_channels(struct tw686x_dev *dev)157{158	return dev->type & TYPE_MAX_CHANNELS; /* 4 or 8 channels */159}160 161static inline unsigned is_second_gen(struct tw686x_dev *dev)162{163	/* each channel has its own DMA SG table */164	return dev->type & TYPE_SECOND_GEN;165}166 167void tw686x_enable_channel(struct tw686x_dev *dev, unsigned int channel);168void tw686x_disable_channel(struct tw686x_dev *dev, unsigned int channel);169 170int tw686x_video_init(struct tw686x_dev *dev);171void tw686x_video_free(struct tw686x_dev *dev);172void tw686x_video_irq(struct tw686x_dev *dev, unsigned long requests,173		      unsigned int pb_status, unsigned int fifo_status,174		      unsigned int *reset_ch);175 176int tw686x_audio_init(struct tw686x_dev *dev);177void tw686x_audio_free(struct tw686x_dev *dev);178void tw686x_audio_irq(struct tw686x_dev *dev, unsigned long requests,179		      unsigned int pb_status);180