1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Driver for the Conexant CX23885/7/8 PCIe bridge
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Various common ioctl() support functions
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Copyright (c) 2009 Andy Walls <awalls@md.metrocast.net>
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include "cx23885.h"
11*4882a593Smuzhiyun #include "cx23885-ioctl.h"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #ifdef CONFIG_VIDEO_ADV_DEBUG
cx23885_g_chip_info(struct file * file,void * fh,struct v4l2_dbg_chip_info * chip)14*4882a593Smuzhiyun int cx23885_g_chip_info(struct file *file, void *fh,
15*4882a593Smuzhiyun struct v4l2_dbg_chip_info *chip)
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun struct cx23885_dev *dev = video_drvdata(file);
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun if (chip->match.addr > 1)
20*4882a593Smuzhiyun return -EINVAL;
21*4882a593Smuzhiyun if (chip->match.addr == 1) {
22*4882a593Smuzhiyun if (dev->v4l_device == NULL)
23*4882a593Smuzhiyun return -EINVAL;
24*4882a593Smuzhiyun strscpy(chip->name, "cx23417", sizeof(chip->name));
25*4882a593Smuzhiyun } else {
26*4882a593Smuzhiyun strscpy(chip->name, dev->v4l2_dev.name, sizeof(chip->name));
27*4882a593Smuzhiyun }
28*4882a593Smuzhiyun return 0;
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun
cx23417_g_register(struct cx23885_dev * dev,struct v4l2_dbg_register * reg)31*4882a593Smuzhiyun static int cx23417_g_register(struct cx23885_dev *dev,
32*4882a593Smuzhiyun struct v4l2_dbg_register *reg)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun u32 value;
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun if (dev->v4l_device == NULL)
37*4882a593Smuzhiyun return -EINVAL;
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun if ((reg->reg & 0x3) != 0 || reg->reg >= 0x10000)
40*4882a593Smuzhiyun return -EINVAL;
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun if (mc417_register_read(dev, (u16) reg->reg, &value))
43*4882a593Smuzhiyun return -EINVAL; /* V4L2 spec, but -EREMOTEIO really */
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun reg->size = 4;
46*4882a593Smuzhiyun reg->val = value;
47*4882a593Smuzhiyun return 0;
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
cx23885_g_register(struct file * file,void * fh,struct v4l2_dbg_register * reg)50*4882a593Smuzhiyun int cx23885_g_register(struct file *file, void *fh,
51*4882a593Smuzhiyun struct v4l2_dbg_register *reg)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun struct cx23885_dev *dev = video_drvdata(file);
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun if (reg->match.addr > 1)
56*4882a593Smuzhiyun return -EINVAL;
57*4882a593Smuzhiyun if (reg->match.addr)
58*4882a593Smuzhiyun return cx23417_g_register(dev, reg);
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun if ((reg->reg & 0x3) != 0 || reg->reg >= pci_resource_len(dev->pci, 0))
61*4882a593Smuzhiyun return -EINVAL;
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun reg->size = 4;
64*4882a593Smuzhiyun reg->val = cx_read(reg->reg);
65*4882a593Smuzhiyun return 0;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun
cx23417_s_register(struct cx23885_dev * dev,const struct v4l2_dbg_register * reg)68*4882a593Smuzhiyun static int cx23417_s_register(struct cx23885_dev *dev,
69*4882a593Smuzhiyun const struct v4l2_dbg_register *reg)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun if (dev->v4l_device == NULL)
72*4882a593Smuzhiyun return -EINVAL;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun if ((reg->reg & 0x3) != 0 || reg->reg >= 0x10000)
75*4882a593Smuzhiyun return -EINVAL;
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun if (mc417_register_write(dev, (u16) reg->reg, (u32) reg->val))
78*4882a593Smuzhiyun return -EINVAL; /* V4L2 spec, but -EREMOTEIO really */
79*4882a593Smuzhiyun return 0;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun
cx23885_s_register(struct file * file,void * fh,const struct v4l2_dbg_register * reg)82*4882a593Smuzhiyun int cx23885_s_register(struct file *file, void *fh,
83*4882a593Smuzhiyun const struct v4l2_dbg_register *reg)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun struct cx23885_dev *dev = video_drvdata(file);
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun if (reg->match.addr > 1)
88*4882a593Smuzhiyun return -EINVAL;
89*4882a593Smuzhiyun if (reg->match.addr)
90*4882a593Smuzhiyun return cx23417_s_register(dev, reg);
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun if ((reg->reg & 0x3) != 0 || reg->reg >= pci_resource_len(dev->pci, 0))
93*4882a593Smuzhiyun return -EINVAL;
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun cx_write(reg->reg, reg->val);
96*4882a593Smuzhiyun return 0;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun #endif
99