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