diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2013-03-18 11:21:53 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-25 08:34:22 -0400 |
commit | 3b2d17b4ba77dce3a83c9e71dc8f086d7e743ec9 (patch) | |
tree | bd5959ef08aac787ea630e412e2d6569de963750 | |
parent | c7622fc9483f57f0dd77ad50e104b7e53d6b365d (diff) |
[media] em28xx: add support for g_chip_name
Add support for vidioc_g_chip_name, allowing AC97 to be implemented as a
second chip on the bridge with the name "ac97". v4l2-dbg can just match the
name with that string in order to detect a ac97-compliant set of registers.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-video.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c index d09b5c03c723..b1817231f50c 100644 --- a/drivers/media/usb/em28xx/em28xx-video.c +++ b/drivers/media/usb/em28xx/em28xx-video.c | |||
@@ -1245,9 +1245,9 @@ static int vidioc_g_chip_ident(struct file *file, void *priv, | |||
1245 | 1245 | ||
1246 | chip->ident = V4L2_IDENT_NONE; | 1246 | chip->ident = V4L2_IDENT_NONE; |
1247 | chip->revision = 0; | 1247 | chip->revision = 0; |
1248 | if (chip->match.type == V4L2_CHIP_MATCH_HOST) { | 1248 | if (chip->match.type == V4L2_CHIP_MATCH_BRIDGE) { |
1249 | if (v4l2_chip_match_host(&chip->match)) | 1249 | if (chip->match.addr > 1) |
1250 | chip->ident = V4L2_IDENT_NONE; | 1250 | return -EINVAL; |
1251 | return 0; | 1251 | return 0; |
1252 | } | 1252 | } |
1253 | if (chip->match.type != V4L2_CHIP_MATCH_I2C_DRIVER && | 1253 | if (chip->match.type != V4L2_CHIP_MATCH_I2C_DRIVER && |
@@ -1259,6 +1259,21 @@ static int vidioc_g_chip_ident(struct file *file, void *priv, | |||
1259 | return 0; | 1259 | return 0; |
1260 | } | 1260 | } |
1261 | 1261 | ||
1262 | static int vidioc_g_chip_name(struct file *file, void *priv, | ||
1263 | struct v4l2_dbg_chip_name *chip) | ||
1264 | { | ||
1265 | struct em28xx_fh *fh = priv; | ||
1266 | struct em28xx *dev = fh->dev; | ||
1267 | |||
1268 | if (chip->match.addr > 1) | ||
1269 | return -EINVAL; | ||
1270 | if (chip->match.addr == 1) | ||
1271 | strlcpy(chip->name, "ac97", sizeof(chip->name)); | ||
1272 | else | ||
1273 | strlcpy(chip->name, dev->v4l2_dev.name, sizeof(chip->name)); | ||
1274 | return 0; | ||
1275 | } | ||
1276 | |||
1262 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 1277 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
1263 | static int em28xx_reg_len(int reg) | 1278 | static int em28xx_reg_len(int reg) |
1264 | { | 1279 | { |
@@ -1280,6 +1295,12 @@ static int vidioc_g_register(struct file *file, void *priv, | |||
1280 | int ret; | 1295 | int ret; |
1281 | 1296 | ||
1282 | switch (reg->match.type) { | 1297 | switch (reg->match.type) { |
1298 | case V4L2_CHIP_MATCH_BRIDGE: | ||
1299 | if (reg->match.addr > 1) | ||
1300 | return -EINVAL; | ||
1301 | if (!reg->match.addr) | ||
1302 | break; | ||
1303 | /* fall-through */ | ||
1283 | case V4L2_CHIP_MATCH_AC97: | 1304 | case V4L2_CHIP_MATCH_AC97: |
1284 | ret = em28xx_read_ac97(dev, reg->reg); | 1305 | ret = em28xx_read_ac97(dev, reg->reg); |
1285 | if (ret < 0) | 1306 | if (ret < 0) |
@@ -1296,8 +1317,7 @@ static int vidioc_g_register(struct file *file, void *priv, | |||
1296 | v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg); | 1317 | v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg); |
1297 | return 0; | 1318 | return 0; |
1298 | default: | 1319 | default: |
1299 | if (!v4l2_chip_match_host(®->match)) | 1320 | return -EINVAL; |
1300 | return -EINVAL; | ||
1301 | } | 1321 | } |
1302 | 1322 | ||
1303 | /* Match host */ | 1323 | /* Match host */ |
@@ -1330,6 +1350,12 @@ static int vidioc_s_register(struct file *file, void *priv, | |||
1330 | __le16 buf; | 1350 | __le16 buf; |
1331 | 1351 | ||
1332 | switch (reg->match.type) { | 1352 | switch (reg->match.type) { |
1353 | case V4L2_CHIP_MATCH_BRIDGE: | ||
1354 | if (reg->match.addr > 1) | ||
1355 | return -EINVAL; | ||
1356 | if (!reg->match.addr) | ||
1357 | break; | ||
1358 | /* fall-through */ | ||
1333 | case V4L2_CHIP_MATCH_AC97: | 1359 | case V4L2_CHIP_MATCH_AC97: |
1334 | return em28xx_write_ac97(dev, reg->reg, reg->val); | 1360 | return em28xx_write_ac97(dev, reg->reg, reg->val); |
1335 | case V4L2_CHIP_MATCH_I2C_DRIVER: | 1361 | case V4L2_CHIP_MATCH_I2C_DRIVER: |
@@ -1340,8 +1366,7 @@ static int vidioc_s_register(struct file *file, void *priv, | |||
1340 | v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg); | 1366 | v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg); |
1341 | return 0; | 1367 | return 0; |
1342 | default: | 1368 | default: |
1343 | if (!v4l2_chip_match_host(®->match)) | 1369 | return -EINVAL; |
1344 | return -EINVAL; | ||
1345 | } | 1370 | } |
1346 | 1371 | ||
1347 | /* Match host */ | 1372 | /* Match host */ |
@@ -1699,6 +1724,7 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = { | |||
1699 | .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, | 1724 | .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, |
1700 | .vidioc_unsubscribe_event = v4l2_event_unsubscribe, | 1725 | .vidioc_unsubscribe_event = v4l2_event_unsubscribe, |
1701 | .vidioc_g_chip_ident = vidioc_g_chip_ident, | 1726 | .vidioc_g_chip_ident = vidioc_g_chip_ident, |
1727 | .vidioc_g_chip_name = vidioc_g_chip_name, | ||
1702 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 1728 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
1703 | .vidioc_g_register = vidioc_g_register, | 1729 | .vidioc_g_register = vidioc_g_register, |
1704 | .vidioc_s_register = vidioc_s_register, | 1730 | .vidioc_s_register = vidioc_s_register, |
@@ -1729,6 +1755,7 @@ static const struct v4l2_ioctl_ops radio_ioctl_ops = { | |||
1729 | .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, | 1755 | .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, |
1730 | .vidioc_unsubscribe_event = v4l2_event_unsubscribe, | 1756 | .vidioc_unsubscribe_event = v4l2_event_unsubscribe, |
1731 | .vidioc_g_chip_ident = vidioc_g_chip_ident, | 1757 | .vidioc_g_chip_ident = vidioc_g_chip_ident, |
1758 | .vidioc_g_chip_name = vidioc_g_chip_name, | ||
1732 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 1759 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
1733 | .vidioc_g_register = vidioc_g_register, | 1760 | .vidioc_g_register = vidioc_g_register, |
1734 | .vidioc_s_register = vidioc_s_register, | 1761 | .vidioc_s_register = vidioc_s_register, |