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, (u16) reg->reg, &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, (u16) reg->reg, (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