Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: v4l2-mediabus: Use structures to describe bus configuration

The media bus configuration is specified through a set of flags, some of
which being mutually exclusive. This doesn't scale to express more
complex configurations. Improve the API by replacing the single flags
field in v4l2_mbus_config by a union of v4l2_mbus_config_* structures.
The flags themselves are still used in those structures, so they are
kept here. Drivers are however updated to use structure fields instead
of flags when already possible.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>

authored by

Laurent Pinchart and committed by
Mauro Carvalho Chehab
6a7bdd89 44e756fa

+79 -112
+3 -3
drivers/gpu/ipu-v3/ipu-csi.c
··· 357 357 switch (mbus_cfg->type) { 358 358 case V4L2_MBUS_PARALLEL: 359 359 csicfg->ext_vsync = 1; 360 - csicfg->vsync_pol = (mbus_cfg->flags & 360 + csicfg->vsync_pol = (mbus_cfg->bus.parallel.flags & 361 361 V4L2_MBUS_VSYNC_ACTIVE_LOW) ? 1 : 0; 362 - csicfg->hsync_pol = (mbus_cfg->flags & 362 + csicfg->hsync_pol = (mbus_cfg->bus.parallel.flags & 363 363 V4L2_MBUS_HSYNC_ACTIVE_LOW) ? 1 : 0; 364 - csicfg->pixclk_pol = (mbus_cfg->flags & 364 + csicfg->pixclk_pol = (mbus_cfg->bus.parallel.flags & 365 365 V4L2_MBUS_PCLK_SAMPLE_FALLING) ? 1 : 0; 366 366 csicfg->clk_mode = IPU_CSI_CLK_MODE_GATED_CLK; 367 367 break;
+5 -3
drivers/media/i2c/adv7180.c
··· 784 784 785 785 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { 786 786 cfg->type = V4L2_MBUS_CSI2_DPHY; 787 - cfg->flags = V4L2_MBUS_CSI2_1_LANE | 787 + cfg->bus.mipi_csi2.num_data_lanes = 1; 788 + cfg->bus.mipi_csi2.flags = 788 789 V4L2_MBUS_CSI2_CHANNEL_0 | 789 790 V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; 790 791 } else { ··· 793 792 * The ADV7180 sensor supports BT.601/656 output modes. 794 793 * The BT.656 is default and not yet configurable by s/w. 795 794 */ 796 - cfg->flags = V4L2_MBUS_MASTER | V4L2_MBUS_PCLK_SAMPLE_RISING | 797 - V4L2_MBUS_DATA_ACTIVE_HIGH; 795 + cfg->bus.parallel.flags = V4L2_MBUS_MASTER | 796 + V4L2_MBUS_PCLK_SAMPLE_RISING | 797 + V4L2_MBUS_DATA_ACTIVE_HIGH; 798 798 cfg->type = V4L2_MBUS_BT656; 799 799 } 800 800
+1 -17
drivers/media/i2c/adv748x/adv748x-csi2.c
··· 222 222 return -EINVAL; 223 223 224 224 config->type = V4L2_MBUS_CSI2_DPHY; 225 - switch (tx->active_lanes) { 226 - case 1: 227 - config->flags = V4L2_MBUS_CSI2_1_LANE; 228 - break; 229 - 230 - case 2: 231 - config->flags = V4L2_MBUS_CSI2_2_LANE; 232 - break; 233 - 234 - case 3: 235 - config->flags = V4L2_MBUS_CSI2_3_LANE; 236 - break; 237 - 238 - case 4: 239 - config->flags = V4L2_MBUS_CSI2_4_LANE; 240 - break; 241 - } 225 + config->bus.mipi_csi2.num_data_lanes = tx->active_lanes; 242 226 243 227 return 0; 244 228 }
+3 -2
drivers/media/i2c/ml86v7667.c
··· 223 223 unsigned int pad, 224 224 struct v4l2_mbus_config *cfg) 225 225 { 226 - cfg->flags = V4L2_MBUS_MASTER | V4L2_MBUS_PCLK_SAMPLE_RISING | 227 - V4L2_MBUS_DATA_ACTIVE_HIGH; 228 226 cfg->type = V4L2_MBUS_BT656; 227 + cfg->bus.parallel.flags = V4L2_MBUS_MASTER | 228 + V4L2_MBUS_PCLK_SAMPLE_RISING | 229 + V4L2_MBUS_DATA_ACTIVE_HIGH; 229 230 230 231 return 0; 231 232 }
+5 -3
drivers/media/i2c/mt9m001.c
··· 695 695 struct v4l2_mbus_config *cfg) 696 696 { 697 697 /* MT9M001 has all capture_format parameters fixed */ 698 - cfg->flags = V4L2_MBUS_PCLK_SAMPLE_FALLING | 699 - V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_HIGH | 700 - V4L2_MBUS_DATA_ACTIVE_HIGH | V4L2_MBUS_MASTER; 701 698 cfg->type = V4L2_MBUS_PARALLEL; 699 + cfg->bus.parallel.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING | 700 + V4L2_MBUS_HSYNC_ACTIVE_HIGH | 701 + V4L2_MBUS_VSYNC_ACTIVE_HIGH | 702 + V4L2_MBUS_DATA_ACTIVE_HIGH | 703 + V4L2_MBUS_MASTER; 702 704 703 705 return 0; 704 706 }
+9 -7
drivers/media/i2c/mt9m111.c
··· 1143 1143 { 1144 1144 struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev); 1145 1145 1146 - cfg->flags = V4L2_MBUS_MASTER | 1147 - V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_HIGH | 1148 - V4L2_MBUS_DATA_ACTIVE_HIGH; 1149 - 1150 - cfg->flags |= mt9m111->pclk_sample ? V4L2_MBUS_PCLK_SAMPLE_RISING : 1151 - V4L2_MBUS_PCLK_SAMPLE_FALLING; 1152 - 1153 1146 cfg->type = V4L2_MBUS_PARALLEL; 1147 + 1148 + cfg->bus.parallel.flags = V4L2_MBUS_MASTER | 1149 + V4L2_MBUS_HSYNC_ACTIVE_HIGH | 1150 + V4L2_MBUS_VSYNC_ACTIVE_HIGH | 1151 + V4L2_MBUS_DATA_ACTIVE_HIGH; 1152 + 1153 + cfg->bus.parallel.flags |= mt9m111->pclk_sample ? 1154 + V4L2_MBUS_PCLK_SAMPLE_RISING : 1155 + V4L2_MBUS_PCLK_SAMPLE_FALLING; 1154 1156 1155 1157 return 0; 1156 1158 }
+7 -7
drivers/media/i2c/ov6650.c
··· 984 984 if (ret) 985 985 return ret; 986 986 987 - cfg->flags = V4L2_MBUS_MASTER | V4L2_MBUS_DATA_ACTIVE_HIGH 988 - | ((comj & COMJ_VSYNC_HIGH) ? V4L2_MBUS_VSYNC_ACTIVE_HIGH 989 - : V4L2_MBUS_VSYNC_ACTIVE_LOW) 990 - | ((comf & COMF_HREF_LOW) ? V4L2_MBUS_HSYNC_ACTIVE_LOW 991 - : V4L2_MBUS_HSYNC_ACTIVE_HIGH) 992 - | ((comj & COMJ_PCLK_RISING) ? V4L2_MBUS_PCLK_SAMPLE_RISING 993 - : V4L2_MBUS_PCLK_SAMPLE_FALLING); 994 987 cfg->type = V4L2_MBUS_PARALLEL; 995 988 989 + cfg->bus.parallel.flags = V4L2_MBUS_MASTER | V4L2_MBUS_DATA_ACTIVE_HIGH 990 + | ((comj & COMJ_VSYNC_HIGH) ? V4L2_MBUS_VSYNC_ACTIVE_HIGH 991 + : V4L2_MBUS_VSYNC_ACTIVE_LOW) 992 + | ((comf & COMF_HREF_LOW) ? V4L2_MBUS_HSYNC_ACTIVE_LOW 993 + : V4L2_MBUS_HSYNC_ACTIVE_HIGH) 994 + | ((comj & COMJ_PCLK_RISING) ? V4L2_MBUS_PCLK_SAMPLE_RISING 995 + : V4L2_MBUS_PCLK_SAMPLE_FALLING); 996 996 return 0; 997 997 } 998 998
+5 -3
drivers/media/i2c/ov9640.c
··· 652 652 unsigned int pad, 653 653 struct v4l2_mbus_config *cfg) 654 654 { 655 - cfg->flags = V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_MASTER | 656 - V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_HIGH | 657 - V4L2_MBUS_DATA_ACTIVE_HIGH; 658 655 cfg->type = V4L2_MBUS_PARALLEL; 656 + cfg->bus.parallel.flags = V4L2_MBUS_PCLK_SAMPLE_RISING | 657 + V4L2_MBUS_MASTER | 658 + V4L2_MBUS_VSYNC_ACTIVE_HIGH | 659 + V4L2_MBUS_HSYNC_ACTIVE_HIGH | 660 + V4L2_MBUS_DATA_ACTIVE_HIGH; 659 661 660 662 return 0; 661 663 }
+2 -18
drivers/media/i2c/tc358743.c
··· 1613 1613 cfg->type = V4L2_MBUS_CSI2_DPHY; 1614 1614 1615 1615 /* Support for non-continuous CSI-2 clock is missing in the driver */ 1616 - cfg->flags = V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; 1617 - 1618 - switch (state->csi_lanes_in_use) { 1619 - case 1: 1620 - cfg->flags |= V4L2_MBUS_CSI2_1_LANE; 1621 - break; 1622 - case 2: 1623 - cfg->flags |= V4L2_MBUS_CSI2_2_LANE; 1624 - break; 1625 - case 3: 1626 - cfg->flags |= V4L2_MBUS_CSI2_3_LANE; 1627 - break; 1628 - case 4: 1629 - cfg->flags |= V4L2_MBUS_CSI2_4_LANE; 1630 - break; 1631 - default: 1632 - return -EINVAL; 1633 - } 1616 + cfg->bus.mipi_csi2.flags = V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; 1617 + cfg->bus.mipi_csi2.num_data_lanes = state->csi_lanes_in_use; 1634 1618 1635 1619 return 0; 1636 1620 }
+4 -2
drivers/media/i2c/tvp5150.c
··· 1198 1198 struct tvp5150 *decoder = to_tvp5150(sd); 1199 1199 1200 1200 cfg->type = decoder->mbus_type; 1201 - cfg->flags = V4L2_MBUS_MASTER | V4L2_MBUS_PCLK_SAMPLE_RISING 1202 - | V4L2_MBUS_FIELD_EVEN_LOW | V4L2_MBUS_DATA_ACTIVE_HIGH; 1201 + cfg->bus.parallel.flags = V4L2_MBUS_MASTER 1202 + | V4L2_MBUS_PCLK_SAMPLE_RISING 1203 + | V4L2_MBUS_FIELD_EVEN_LOW 1204 + | V4L2_MBUS_DATA_ACTIVE_HIGH; 1203 1205 1204 1206 return 0; 1205 1207 }
+1 -1
drivers/media/platform/atmel/microchip-csi2dc.c
··· 359 359 360 360 dev_dbg(csi2dc->dev, "subdev sending on channel %d\n", csi2dc->vc); 361 361 362 - csi2dc->clk_gated = mbus_config.flags & 362 + csi2dc->clk_gated = mbus_config.bus.parallel.flags & 363 363 V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK; 364 364 365 365 dev_dbg(csi2dc->dev, "mbus_config: %s clock\n",
+7 -5
drivers/media/platform/pxa_camera.c
··· 1587 1587 * PXA does not support V4L2_MBUS_DATA_ACTIVE_LOW and the bus mastering 1588 1588 * roles should match. 1589 1589 */ 1590 - if (cfg.flags != mbus_config) { 1590 + if (cfg.bus.parallel.flags != mbus_config) { 1591 1591 unsigned int pxa_mbus_role = mbus_config & (V4L2_MBUS_MASTER | 1592 1592 V4L2_MBUS_SLAVE); 1593 - if (pxa_mbus_role != (cfg.flags & (V4L2_MBUS_MASTER | 1594 - V4L2_MBUS_SLAVE))) { 1593 + unsigned int flags = cfg.bus.parallel.flags; 1594 + 1595 + if (pxa_mbus_role != (flags & (V4L2_MBUS_MASTER | 1596 + V4L2_MBUS_SLAVE))) { 1595 1597 dev_err(pcdev_to_dev(pcdev), 1596 1598 "Unsupported mbus configuration: bus mastering\n"); 1597 1599 return -EINVAL; 1598 1600 } 1599 1601 1600 - if (cfg.flags & V4L2_MBUS_DATA_ACTIVE_LOW) { 1602 + if (flags & V4L2_MBUS_DATA_ACTIVE_LOW) { 1601 1603 dev_err(pcdev_to_dev(pcdev), 1602 1604 "Unsupported mbus configuration: DATA_ACTIVE_LOW\n"); 1603 1605 return -EINVAL; 1604 1606 } 1605 1607 } 1606 1608 1607 - pxa_camera_setup_cicr(pcdev, cfg.flags, pixfmt); 1609 + pxa_camera_setup_cicr(pcdev, cfg.bus.parallel.flags, pixfmt); 1608 1610 1609 1611 return 0; 1610 1612 }
+3 -13
drivers/media/platform/rcar-vin/rcar-csi2.c
··· 603 603 unsigned int *lanes) 604 604 { 605 605 struct v4l2_mbus_config mbus_config = { 0 }; 606 - unsigned int num_lanes = UINT_MAX; 607 606 int ret; 608 607 609 608 *lanes = priv->lanes; ··· 625 626 return -EINVAL; 626 627 } 627 628 628 - if (mbus_config.flags & V4L2_MBUS_CSI2_1_LANE) 629 - num_lanes = 1; 630 - else if (mbus_config.flags & V4L2_MBUS_CSI2_2_LANE) 631 - num_lanes = 2; 632 - else if (mbus_config.flags & V4L2_MBUS_CSI2_3_LANE) 633 - num_lanes = 3; 634 - else if (mbus_config.flags & V4L2_MBUS_CSI2_4_LANE) 635 - num_lanes = 4; 636 - 637 - if (num_lanes > priv->lanes) { 629 + if (mbus_config.bus.mipi_csi2.num_data_lanes > priv->lanes) { 638 630 dev_err(priv->dev, 639 631 "Unsupported mbus config: too many data lanes %u\n", 640 - num_lanes); 632 + mbus_config.bus.mipi_csi2.num_data_lanes); 641 633 return -EINVAL; 642 634 } 643 635 644 - *lanes = num_lanes; 636 + *lanes = mbus_config.bus.mipi_csi2.num_data_lanes; 645 637 646 638 return 0; 647 639 }
+4 -3
drivers/staging/media/imx/imx-media-csi.c
··· 718 718 719 719 /* compose mbus_config from the upstream endpoint */ 720 720 mbus_cfg.type = priv->upstream_ep.bus_type; 721 - mbus_cfg.flags = is_parallel_bus(&priv->upstream_ep) ? 722 - priv->upstream_ep.bus.parallel.flags : 723 - priv->upstream_ep.bus.mipi_csi2.flags; 721 + if (is_parallel_bus(&priv->upstream_ep)) 722 + mbus_cfg.bus.parallel = priv->upstream_ep.bus.parallel; 723 + else 724 + mbus_cfg.bus.mipi_csi2 = priv->upstream_ep.bus.mipi_csi2; 724 725 725 726 if_fmt = *infmt; 726 727 crop = priv->crop;
+3 -22
drivers/staging/media/imx/imx6-mipi-csi2.c
··· 303 303 static int csi2_get_active_lanes(struct csi2_dev *csi2, unsigned int *lanes) 304 304 { 305 305 struct v4l2_mbus_config mbus_config = { 0 }; 306 - unsigned int num_lanes = UINT_MAX; 307 306 int ret; 308 307 309 308 *lanes = csi2->data_lanes; ··· 325 326 return -EINVAL; 326 327 } 327 328 328 - switch (mbus_config.flags & V4L2_MBUS_CSI2_LANES) { 329 - case V4L2_MBUS_CSI2_1_LANE: 330 - num_lanes = 1; 331 - break; 332 - case V4L2_MBUS_CSI2_2_LANE: 333 - num_lanes = 2; 334 - break; 335 - case V4L2_MBUS_CSI2_3_LANE: 336 - num_lanes = 3; 337 - break; 338 - case V4L2_MBUS_CSI2_4_LANE: 339 - num_lanes = 4; 340 - break; 341 - default: 342 - num_lanes = csi2->data_lanes; 343 - break; 344 - } 345 - 346 - if (num_lanes > csi2->data_lanes) { 329 + if (mbus_config.bus.mipi_csi2.num_data_lanes > csi2->data_lanes) { 347 330 dev_err(csi2->dev, 348 331 "Unsupported mbus config: too many data lanes %u\n", 349 - num_lanes); 332 + mbus_config.bus.mipi_csi2.num_data_lanes); 350 333 return -EINVAL; 351 334 } 352 335 353 - *lanes = num_lanes; 336 + *lanes = mbus_config.bus.mipi_csi2.num_data_lanes; 354 337 355 338 return 0; 356 339 }
+17 -3
include/media/v4l2-mediabus.h
··· 166 166 167 167 /** 168 168 * struct v4l2_mbus_config - media bus configuration 169 - * @type: in: interface type 170 - * @flags: in / out: configuration flags, depending on @type 169 + * @type: interface type 170 + * @bus: bus configuration data structure 171 + * @bus.parallel: embedded &struct v4l2_mbus_config_parallel. 172 + * Used if the bus is parallel or BT.656. 173 + * @bus.mipi_csi1: embedded &struct v4l2_mbus_config_mipi_csi1. 174 + * Used if the bus is MIPI Alliance's Camera Serial 175 + * Interface version 1 (MIPI CSI1) or Standard 176 + * Mobile Imaging Architecture's Compact Camera Port 2 177 + * (SMIA CCP2). 178 + * @bus.mipi_csi2: embedded &struct v4l2_mbus_config_mipi_csi2. 179 + * Used if the bus is MIPI Alliance's Camera Serial 180 + * Interface version 2 (MIPI CSI2). 171 181 */ 172 182 struct v4l2_mbus_config { 173 183 enum v4l2_mbus_type type; 174 - unsigned int flags; 184 + union { 185 + struct v4l2_mbus_config_parallel parallel; 186 + struct v4l2_mbus_config_mipi_csi1 mipi_csi1; 187 + struct v4l2_mbus_config_mipi_csi2 mipi_csi2; 188 + } bus; 175 189 }; 176 190 177 191 /**