csi2tx 88 drivers/media/platform/cadence/cdns-csi2tx.c void (*dphy_setup)(struct csi2tx_priv *csi2tx); csi2tx 175 drivers/media/platform/cadence/cdns-csi2tx.c struct csi2tx_priv *csi2tx = v4l2_subdev_to_csi2tx(subdev); csi2tx 181 drivers/media/platform/cadence/cdns-csi2tx.c return &csi2tx->pad_fmts[fmt->pad]; csi2tx 233 drivers/media/platform/cadence/cdns-csi2tx.c static void csi2tx_dphy_set_wakeup(struct csi2tx_priv *csi2tx) csi2tx 236 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->base + CSI2TX_DPHY_CLK_WAKEUP_REG); csi2tx 243 drivers/media/platform/cadence/cdns-csi2tx.c static void csi2tx_dphy_init_finish(struct csi2tx_priv *csi2tx, u32 reg) csi2tx 251 drivers/media/platform/cadence/cdns-csi2tx.c for (i = 0; i < csi2tx->num_lanes; i++) csi2tx 252 drivers/media/platform/cadence/cdns-csi2tx.c reg |= CSI2TX_DPHY_CFG_LANE_ENABLE(csi2tx->lanes[i] - 1); csi2tx 253 drivers/media/platform/cadence/cdns-csi2tx.c writel(reg, csi2tx->base + CSI2TX_DPHY_CFG_REG); csi2tx 260 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->base + CSI2TX_DPHY_CFG_REG); csi2tx 264 drivers/media/platform/cadence/cdns-csi2tx.c static void csi2tx_dphy_setup(struct csi2tx_priv *csi2tx) csi2tx 269 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx_dphy_set_wakeup(csi2tx); csi2tx 273 drivers/media/platform/cadence/cdns-csi2tx.c for (i = 0; i < csi2tx->num_lanes; i++) csi2tx 274 drivers/media/platform/cadence/cdns-csi2tx.c reg |= CSI2TX_DPHY_CFG_LANE_RESET(csi2tx->lanes[i] - 1); csi2tx 275 drivers/media/platform/cadence/cdns-csi2tx.c writel(reg, csi2tx->base + CSI2TX_DPHY_CFG_REG); csi2tx 277 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx_dphy_init_finish(csi2tx, reg); csi2tx 281 drivers/media/platform/cadence/cdns-csi2tx.c static void csi2tx_v2_dphy_setup(struct csi2tx_priv *csi2tx) csi2tx 285 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx_dphy_set_wakeup(csi2tx); csi2tx 289 drivers/media/platform/cadence/cdns-csi2tx.c writel(reg, csi2tx->base + CSI2TX_V2_DPHY_CFG_REG); csi2tx 291 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx_dphy_init_finish(csi2tx, reg); csi2tx 294 drivers/media/platform/cadence/cdns-csi2tx.c static void csi2tx_reset(struct csi2tx_priv *csi2tx) csi2tx 296 drivers/media/platform/cadence/cdns-csi2tx.c writel(CSI2TX_CONFIG_SRST_REQ, csi2tx->base + CSI2TX_CONFIG_REG); csi2tx 301 drivers/media/platform/cadence/cdns-csi2tx.c static int csi2tx_start(struct csi2tx_priv *csi2tx) csi2tx 303 drivers/media/platform/cadence/cdns-csi2tx.c struct media_entity *entity = &csi2tx->subdev.entity; csi2tx 307 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx_reset(csi2tx); csi2tx 309 drivers/media/platform/cadence/cdns-csi2tx.c writel(CSI2TX_CONFIG_CFG_REQ, csi2tx->base + CSI2TX_CONFIG_REG); csi2tx 313 drivers/media/platform/cadence/cdns-csi2tx.c if (csi2tx->vops && csi2tx->vops->dphy_setup) { csi2tx 314 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->vops->dphy_setup(csi2tx); csi2tx 337 drivers/media/platform/cadence/cdns-csi2tx.c struct media_pad *pad = &csi2tx->pads[i]; csi2tx 349 drivers/media/platform/cadence/cdns-csi2tx.c mfmt = &csi2tx->pad_fmts[pad_idx]; csi2tx 364 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->base + CSI2TX_DT_CFG_REG(stream)); csi2tx 368 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->base + CSI2TX_DT_FORMAT_REG(stream)); csi2tx 375 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->base + CSI2TX_STREAM_IF_CFG_REG(stream)); csi2tx 379 drivers/media/platform/cadence/cdns-csi2tx.c writel(0, csi2tx->base + CSI2TX_CONFIG_REG); csi2tx 384 drivers/media/platform/cadence/cdns-csi2tx.c static void csi2tx_stop(struct csi2tx_priv *csi2tx) csi2tx 387 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->base + CSI2TX_CONFIG_REG); csi2tx 392 drivers/media/platform/cadence/cdns-csi2tx.c struct csi2tx_priv *csi2tx = v4l2_subdev_to_csi2tx(subdev); csi2tx 395 drivers/media/platform/cadence/cdns-csi2tx.c mutex_lock(&csi2tx->lock); csi2tx 402 drivers/media/platform/cadence/cdns-csi2tx.c if (!csi2tx->count) { csi2tx 403 drivers/media/platform/cadence/cdns-csi2tx.c ret = csi2tx_start(csi2tx); csi2tx 408 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->count++; csi2tx 410 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->count--; csi2tx 415 drivers/media/platform/cadence/cdns-csi2tx.c if (!csi2tx->count) csi2tx 416 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx_stop(csi2tx); csi2tx 420 drivers/media/platform/cadence/cdns-csi2tx.c mutex_unlock(&csi2tx->lock); csi2tx 433 drivers/media/platform/cadence/cdns-csi2tx.c static int csi2tx_get_resources(struct csi2tx_priv *csi2tx, csi2tx 441 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->base = devm_ioremap_resource(&pdev->dev, res); csi2tx 442 drivers/media/platform/cadence/cdns-csi2tx.c if (IS_ERR(csi2tx->base)) csi2tx 443 drivers/media/platform/cadence/cdns-csi2tx.c return PTR_ERR(csi2tx->base); csi2tx 445 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->p_clk = devm_clk_get(&pdev->dev, "p_clk"); csi2tx 446 drivers/media/platform/cadence/cdns-csi2tx.c if (IS_ERR(csi2tx->p_clk)) { csi2tx 448 drivers/media/platform/cadence/cdns-csi2tx.c return PTR_ERR(csi2tx->p_clk); csi2tx 451 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->esc_clk = devm_clk_get(&pdev->dev, "esc_clk"); csi2tx 452 drivers/media/platform/cadence/cdns-csi2tx.c if (IS_ERR(csi2tx->esc_clk)) { csi2tx 454 drivers/media/platform/cadence/cdns-csi2tx.c return PTR_ERR(csi2tx->esc_clk); csi2tx 457 drivers/media/platform/cadence/cdns-csi2tx.c clk_prepare_enable(csi2tx->p_clk); csi2tx 458 drivers/media/platform/cadence/cdns-csi2tx.c dev_cfg = readl(csi2tx->base + CSI2TX_DEVICE_CONFIG_REG); csi2tx 459 drivers/media/platform/cadence/cdns-csi2tx.c clk_disable_unprepare(csi2tx->p_clk); csi2tx 461 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->max_lanes = dev_cfg & CSI2TX_DEVICE_CONFIG_LANES_MASK; csi2tx 462 drivers/media/platform/cadence/cdns-csi2tx.c if (csi2tx->max_lanes > CSI2TX_LANES_MAX) { csi2tx 464 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->max_lanes); csi2tx 468 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->max_streams = (dev_cfg & CSI2TX_DEVICE_CONFIG_STREAMS_MASK) >> 4; csi2tx 469 drivers/media/platform/cadence/cdns-csi2tx.c if (csi2tx->max_streams > CSI2TX_STREAMS_MAX) { csi2tx 471 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->max_streams); csi2tx 475 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->has_internal_dphy = !!(dev_cfg & CSI2TX_DEVICE_CONFIG_HAS_DPHY); csi2tx 477 drivers/media/platform/cadence/cdns-csi2tx.c for (i = 0; i < csi2tx->max_streams; i++) { csi2tx 481 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->pixel_clk[i] = devm_clk_get(&pdev->dev, clk_name); csi2tx 482 drivers/media/platform/cadence/cdns-csi2tx.c if (IS_ERR(csi2tx->pixel_clk[i])) { csi2tx 485 drivers/media/platform/cadence/cdns-csi2tx.c return PTR_ERR(csi2tx->pixel_clk[i]); csi2tx 492 drivers/media/platform/cadence/cdns-csi2tx.c static int csi2tx_check_lanes(struct csi2tx_priv *csi2tx) csi2tx 498 drivers/media/platform/cadence/cdns-csi2tx.c ep = of_graph_get_endpoint_by_regs(csi2tx->dev->of_node, 0, 0); csi2tx 504 drivers/media/platform/cadence/cdns-csi2tx.c dev_err(csi2tx->dev, "Could not parse v4l2 endpoint\n"); csi2tx 509 drivers/media/platform/cadence/cdns-csi2tx.c dev_err(csi2tx->dev, "Unsupported media bus type: 0x%x\n", csi2tx 515 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->num_lanes = v4l2_ep.bus.mipi_csi2.num_data_lanes; csi2tx 516 drivers/media/platform/cadence/cdns-csi2tx.c if (csi2tx->num_lanes > csi2tx->max_lanes) { csi2tx 517 drivers/media/platform/cadence/cdns-csi2tx.c dev_err(csi2tx->dev, csi2tx 523 drivers/media/platform/cadence/cdns-csi2tx.c for (i = 0; i < csi2tx->num_lanes; i++) { csi2tx 525 drivers/media/platform/cadence/cdns-csi2tx.c dev_err(csi2tx->dev, "Invalid lane[%d] number: %u\n", csi2tx 532 drivers/media/platform/cadence/cdns-csi2tx.c memcpy(csi2tx->lanes, v4l2_ep.bus.mipi_csi2.data_lanes, csi2tx 533 drivers/media/platform/cadence/cdns-csi2tx.c sizeof(csi2tx->lanes)); csi2tx 567 drivers/media/platform/cadence/cdns-csi2tx.c struct csi2tx_priv *csi2tx; csi2tx 572 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx = kzalloc(sizeof(*csi2tx), GFP_KERNEL); csi2tx 573 drivers/media/platform/cadence/cdns-csi2tx.c if (!csi2tx) csi2tx 575 drivers/media/platform/cadence/cdns-csi2tx.c platform_set_drvdata(pdev, csi2tx); csi2tx 576 drivers/media/platform/cadence/cdns-csi2tx.c mutex_init(&csi2tx->lock); csi2tx 577 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->dev = &pdev->dev; csi2tx 579 drivers/media/platform/cadence/cdns-csi2tx.c ret = csi2tx_get_resources(csi2tx, pdev); csi2tx 584 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->vops = (struct csi2tx_vops *)of_id->data; csi2tx 586 drivers/media/platform/cadence/cdns-csi2tx.c v4l2_subdev_init(&csi2tx->subdev, &csi2tx_subdev_ops); csi2tx 587 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->subdev.owner = THIS_MODULE; csi2tx 588 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->subdev.dev = &pdev->dev; csi2tx 589 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; csi2tx 590 drivers/media/platform/cadence/cdns-csi2tx.c snprintf(csi2tx->subdev.name, V4L2_SUBDEV_NAME_SIZE, "%s.%s", csi2tx 593 drivers/media/platform/cadence/cdns-csi2tx.c ret = csi2tx_check_lanes(csi2tx); csi2tx 598 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->subdev.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; csi2tx 599 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->pads[CSI2TX_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE; csi2tx 601 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->pads[i].flags = MEDIA_PAD_FL_SINK; csi2tx 610 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->pad_fmts[i] = fmt_default; csi2tx 612 drivers/media/platform/cadence/cdns-csi2tx.c ret = media_entity_pads_init(&csi2tx->subdev.entity, CSI2TX_PAD_MAX, csi2tx 613 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->pads); csi2tx 617 drivers/media/platform/cadence/cdns-csi2tx.c ret = v4l2_async_register_subdev(&csi2tx->subdev); csi2tx 623 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->num_lanes, csi2tx->max_lanes, csi2tx->max_streams, csi2tx 624 drivers/media/platform/cadence/cdns-csi2tx.c csi2tx->has_internal_dphy ? "internal" : "no"); csi2tx 629 drivers/media/platform/cadence/cdns-csi2tx.c kfree(csi2tx); csi2tx 635 drivers/media/platform/cadence/cdns-csi2tx.c struct csi2tx_priv *csi2tx = platform_get_drvdata(pdev); csi2tx 637 drivers/media/platform/cadence/cdns-csi2tx.c v4l2_async_unregister_subdev(&csi2tx->subdev); csi2tx 638 drivers/media/platform/cadence/cdns-csi2tx.c kfree(csi2tx);