Symbol: tc358746
drivers/media/i2c/tc358746.c
1004
struct tc358746 *tc358746 = to_tc358746(sd);
drivers/media/i2c/tc358746.c
1014
err = tc358746_read(tc358746, reg->reg, &val);
drivers/media/i2c/tc358746.c
1025
struct tc358746 *tc358746 = to_tc358746(sd);
drivers/media/i2c/tc358746.c
1030
tc358746_write(tc358746, (u32)reg->reg, (u32)reg->val);
drivers/media/i2c/tc358746.c
1073
struct tc358746 *tc358746 = clk_hw_to_tc358746(hw);
drivers/media/i2c/tc358746.c
1078
div = tc358746->mclk_postdiv / 2;
drivers/media/i2c/tc358746.c
1080
dev_dbg(tc358746->sd.dev, "MCLKCTL: %u (0x%x)\n", val, val);
drivers/media/i2c/tc358746.c
1081
err = tc358746_write(tc358746, MCLKCTL_REG, val);
drivers/media/i2c/tc358746.c
1085
if (tc358746->mclk_prediv == 8)
drivers/media/i2c/tc358746.c
1087
else if (tc358746->mclk_prediv == 4)
drivers/media/i2c/tc358746.c
1092
dev_dbg(tc358746->sd.dev, "CLKCTL[MCLKDIV]: %u (0x%x)\n", val, val);
drivers/media/i2c/tc358746.c
1094
return tc358746_update_bits(tc358746, CLKCTL_REG, MCLKDIV_MASK, val);
drivers/media/i2c/tc358746.c
1099
struct tc358746 *tc358746 = clk_hw_to_tc358746(hw);
drivers/media/i2c/tc358746.c
1101
tc358746_write(tc358746, MCLKCTL_REG, 0);
drivers/media/i2c/tc358746.c
1105
tc358746_find_mclk_settings(struct tc358746 *tc358746, unsigned long mclk_rate)
drivers/media/i2c/tc358746.c
1107
unsigned long pll_rate = tc358746->pll_rate;
drivers/media/i2c/tc358746.c
1110
struct device *dev = tc358746->sd.dev;
drivers/media/i2c/tc358746.c
1135
if (mclk_rate == tc358746->mclk_rate)
drivers/media/i2c/tc358746.c
1181
tc358746->mclk_prediv = mclk_prediv;
drivers/media/i2c/tc358746.c
1182
tc358746->mclk_postdiv = mclk_postdiv;
drivers/media/i2c/tc358746.c
1183
tc358746->mclk_rate = best_mclk_rate;
drivers/media/i2c/tc358746.c
1198
struct tc358746 *tc358746 = clk_hw_to_tc358746(hw);
drivers/media/i2c/tc358746.c
1203
err = tc358746_read(tc358746, MCLKCTL_REG, &val);
drivers/media/i2c/tc358746.c
1210
err = tc358746_read(tc358746, CLKCTL_REG, &val);
drivers/media/i2c/tc358746.c
1222
return tc358746->pll_rate / (prediv * postdiv);
drivers/media/i2c/tc358746.c
1228
struct tc358746 *tc358746 = clk_hw_to_tc358746(hw);
drivers/media/i2c/tc358746.c
1230
req->best_parent_rate = tc358746->pll_rate;
drivers/media/i2c/tc358746.c
1232
req->rate = tc358746_find_mclk_settings(tc358746, req->rate);
drivers/media/i2c/tc358746.c
1240
struct tc358746 *tc358746 = clk_hw_to_tc358746(hw);
drivers/media/i2c/tc358746.c
1242
tc358746_find_mclk_settings(tc358746, rate);
drivers/media/i2c/tc358746.c
1255
static int tc358746_setup_mclk_provider(struct tc358746 *tc358746)
drivers/media/i2c/tc358746.c
1258
struct device *dev = tc358746->sd.dev;
drivers/media/i2c/tc358746.c
1267
tc358746->mclk_postdiv = 512;
drivers/media/i2c/tc358746.c
1268
tc358746->mclk_prediv = 8;
drivers/media/i2c/tc358746.c
1275
tc358746->mclk_hw.init = &mclk_initdata;
drivers/media/i2c/tc358746.c
1277
err = devm_clk_hw_register(dev, &tc358746->mclk_hw);
drivers/media/i2c/tc358746.c
1284
&tc358746->mclk_hw);
drivers/media/i2c/tc358746.c
1292
tc358746_init_subdev(struct tc358746 *tc358746, struct i2c_client *client)
drivers/media/i2c/tc358746.c
1294
struct v4l2_subdev *sd = &tc358746->sd;
drivers/media/i2c/tc358746.c
1303
tc358746->pads[TC358746_SINK].flags = MEDIA_PAD_FL_SINK;
drivers/media/i2c/tc358746.c
1304
tc358746->pads[TC358746_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/tc358746.c
1306
tc358746->pads);
drivers/media/i2c/tc358746.c
1318
tc358746_init_output_port(struct tc358746 *tc358746, unsigned long refclk)
drivers/media/i2c/tc358746.c
1320
struct device *dev = tc358746->sd.dev;
drivers/media/i2c/tc358746.c
1335
vep = &tc358746->csi_vep;
drivers/media/i2c/tc358746.c
1354
tc358746->pll_rate = tc358746_find_pll_settings(tc358746, refclk,
drivers/media/i2c/tc358746.c
1356
if (!tc358746->pll_rate) {
drivers/media/i2c/tc358746.c
1361
err = phy_mipi_dphy_get_default_config_for_hsclk(tc358746->pll_rate,
drivers/media/i2c/tc358746.c
1362
csi_lanes, &tc358746->dphy_cfg);
drivers/media/i2c/tc358746.c
1374
static int tc358746_init_hw(struct tc358746 *tc358746)
drivers/media/i2c/tc358746.c
1376
struct device *dev = tc358746->sd.dev;
drivers/media/i2c/tc358746.c
1388
err = tc358746_sw_reset(tc358746);
drivers/media/i2c/tc358746.c
1395
err = tc358746_read(tc358746, CHIPID_REG, &val);
drivers/media/i2c/tc358746.c
1409
static int tc358746_init_controls(struct tc358746 *tc358746)
drivers/media/i2c/tc358746.c
1411
u64 *link_frequencies = tc358746->csi_vep.link_frequencies;
drivers/media/i2c/tc358746.c
1415
err = v4l2_ctrl_handler_init(&tc358746->ctrl_hdl, 1);
drivers/media/i2c/tc358746.c
1425
ctrl = v4l2_ctrl_new_int_menu(&tc358746->ctrl_hdl, NULL,
drivers/media/i2c/tc358746.c
1431
err = tc358746->ctrl_hdl.error;
drivers/media/i2c/tc358746.c
1433
v4l2_ctrl_handler_free(&tc358746->ctrl_hdl);
drivers/media/i2c/tc358746.c
1437
tc358746->sd.ctrl_handler = &tc358746->ctrl_hdl;
drivers/media/i2c/tc358746.c
1446
struct tc358746 *tc358746 =
drivers/media/i2c/tc358746.c
1447
container_of(notifier, struct tc358746, notifier);
drivers/media/i2c/tc358746.c
1449
struct media_pad *sink = &tc358746->pads[TC358746_SINK];
drivers/media/i2c/tc358746.c
1458
static int tc358746_async_register(struct tc358746 *tc358746)
drivers/media/i2c/tc358746.c
1467
ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(tc358746->sd.dev),
drivers/media/i2c/tc358746.c
1478
v4l2_async_subdev_nf_init(&tc358746->notifier, &tc358746->sd);
drivers/media/i2c/tc358746.c
1479
asd = v4l2_async_nf_add_fwnode_remote(&tc358746->notifier, ep,
drivers/media/i2c/tc358746.c
1488
tc358746->notifier.ops = &tc358746_notify_ops;
drivers/media/i2c/tc358746.c
1490
err = v4l2_async_nf_register(&tc358746->notifier);
drivers/media/i2c/tc358746.c
1494
err = v4l2_async_register_subdev(&tc358746->sd);
drivers/media/i2c/tc358746.c
1501
v4l2_async_nf_unregister(&tc358746->notifier);
drivers/media/i2c/tc358746.c
1503
v4l2_async_nf_cleanup(&tc358746->notifier);
drivers/media/i2c/tc358746.c
1511
struct tc358746 *tc358746;
drivers/media/i2c/tc358746.c
1516
tc358746 = devm_kzalloc(&client->dev, sizeof(*tc358746), GFP_KERNEL);
drivers/media/i2c/tc358746.c
1517
if (!tc358746)
drivers/media/i2c/tc358746.c
1520
tc358746->regmap = devm_regmap_init_i2c(client, &tc358746_regmap_config);
drivers/media/i2c/tc358746.c
1521
if (IS_ERR(tc358746->regmap))
drivers/media/i2c/tc358746.c
1522
return dev_err_probe(dev, PTR_ERR(tc358746->regmap),
drivers/media/i2c/tc358746.c
1525
tc358746->refclk = devm_clk_get(dev, "refclk");
drivers/media/i2c/tc358746.c
1526
if (IS_ERR(tc358746->refclk))
drivers/media/i2c/tc358746.c
1527
return dev_err_probe(dev, PTR_ERR(tc358746->refclk),
drivers/media/i2c/tc358746.c
1530
err = clk_prepare_enable(tc358746->refclk);
drivers/media/i2c/tc358746.c
1535
refclk = clk_get_rate(tc358746->refclk);
drivers/media/i2c/tc358746.c
1536
clk_disable_unprepare(tc358746->refclk);
drivers/media/i2c/tc358746.c
1542
tc358746->supplies[i].supply = tc358746_supplies[i];
drivers/media/i2c/tc358746.c
1545
tc358746->supplies);
drivers/media/i2c/tc358746.c
1549
tc358746->reset_gpio = devm_gpiod_get_optional(dev, "reset",
drivers/media/i2c/tc358746.c
1551
if (IS_ERR(tc358746->reset_gpio))
drivers/media/i2c/tc358746.c
1552
return dev_err_probe(dev, PTR_ERR(tc358746->reset_gpio),
drivers/media/i2c/tc358746.c
1555
err = tc358746_init_subdev(tc358746, client);
drivers/media/i2c/tc358746.c
1559
err = tc358746_init_output_port(tc358746, refclk);
drivers/media/i2c/tc358746.c
1567
err = tc358746_init_controls(tc358746);
drivers/media/i2c/tc358746.c
1571
dev_set_drvdata(dev, tc358746);
drivers/media/i2c/tc358746.c
1578
err = tc358746_init_hw(tc358746);
drivers/media/i2c/tc358746.c
1582
err = tc358746_setup_mclk_provider(tc358746);
drivers/media/i2c/tc358746.c
1586
err = tc358746_async_register(tc358746);
drivers/media/i2c/tc358746.c
1599
v4l2_ctrl_handler_free(&tc358746->ctrl_hdl);
drivers/media/i2c/tc358746.c
1601
v4l2_fwnode_endpoint_free(&tc358746->csi_vep);
drivers/media/i2c/tc358746.c
1603
v4l2_subdev_cleanup(&tc358746->sd);
drivers/media/i2c/tc358746.c
1604
media_entity_cleanup(&tc358746->sd.entity);
drivers/media/i2c/tc358746.c
1612
struct tc358746 *tc358746 = to_tc358746(sd);
drivers/media/i2c/tc358746.c
1615
v4l2_ctrl_handler_free(&tc358746->ctrl_hdl);
drivers/media/i2c/tc358746.c
1616
v4l2_fwnode_endpoint_free(&tc358746->csi_vep);
drivers/media/i2c/tc358746.c
1617
v4l2_async_nf_unregister(&tc358746->notifier);
drivers/media/i2c/tc358746.c
1618
v4l2_async_nf_cleanup(&tc358746->notifier);
drivers/media/i2c/tc358746.c
1632
static void tc358746_clk_enable(struct tc358746 *tc358746)
drivers/media/i2c/tc358746.c
1634
clk_prepare_enable(tc358746->refclk);
drivers/media/i2c/tc358746.c
1639
struct tc358746 *tc358746 = dev_get_drvdata(dev);
drivers/media/i2c/tc358746.c
1642
clk_disable_unprepare(tc358746->refclk);
drivers/media/i2c/tc358746.c
1645
tc358746->supplies);
drivers/media/i2c/tc358746.c
1647
tc358746_clk_enable(tc358746);
drivers/media/i2c/tc358746.c
1654
struct tc358746 *tc358746 = dev_get_drvdata(dev);
drivers/media/i2c/tc358746.c
1657
gpiod_set_value(tc358746->reset_gpio, 1);
drivers/media/i2c/tc358746.c
1660
tc358746->supplies);
drivers/media/i2c/tc358746.c
1667
gpiod_set_value(tc358746->reset_gpio, 0);
drivers/media/i2c/tc358746.c
1669
err = clk_prepare_enable(tc358746->refclk);
drivers/media/i2c/tc358746.c
167
static inline struct tc358746 *to_tc358746(struct v4l2_subdev *sd)
drivers/media/i2c/tc358746.c
1680
err = tc358746_apply_pll_config(tc358746);
drivers/media/i2c/tc358746.c
1687
clk_disable_unprepare(tc358746->refclk);
drivers/media/i2c/tc358746.c
169
return container_of(sd, struct tc358746, sd);
drivers/media/i2c/tc358746.c
1690
tc358746->supplies);
drivers/media/i2c/tc358746.c
172
static inline struct tc358746 *clk_hw_to_tc358746(struct clk_hw *hw)
drivers/media/i2c/tc358746.c
174
return container_of(hw, struct tc358746, mclk_hw);
drivers/media/i2c/tc358746.c
332
static int tc358746_write(struct tc358746 *tc358746, u32 reg, u32 val)
drivers/media/i2c/tc358746.c
340
err = regmap_bulk_write(tc358746->regmap, reg, &val, count);
drivers/media/i2c/tc358746.c
342
dev_err(tc358746->sd.dev,
drivers/media/i2c/tc358746.c
348
static int tc358746_read(struct tc358746 *tc358746, u32 reg, u32 *val)
drivers/media/i2c/tc358746.c
357
err = regmap_bulk_read(tc358746->regmap, reg, val, count);
drivers/media/i2c/tc358746.c
359
dev_err(tc358746->sd.dev,
drivers/media/i2c/tc358746.c
366
tc358746_update_bits(struct tc358746 *tc358746, u32 reg, u32 mask, u32 val)
drivers/media/i2c/tc358746.c
371
err = tc358746_read(tc358746, reg, &orig);
drivers/media/i2c/tc358746.c
378
return tc358746_write(tc358746, reg, tmp);
drivers/media/i2c/tc358746.c
381
static int tc358746_set_bits(struct tc358746 *tc358746, u32 reg, u32 bits)
drivers/media/i2c/tc358746.c
383
return tc358746_update_bits(tc358746, reg, bits, bits);
drivers/media/i2c/tc358746.c
386
static int tc358746_clear_bits(struct tc358746 *tc358746, u32 reg, u32 bits)
drivers/media/i2c/tc358746.c
388
return tc358746_update_bits(tc358746, reg, bits, 0);
drivers/media/i2c/tc358746.c
391
static int tc358746_sw_reset(struct tc358746 *tc358746)
drivers/media/i2c/tc358746.c
395
err = tc358746_set_bits(tc358746, SYSCTL_REG, SRESET);
drivers/media/i2c/tc358746.c
401
return tc358746_clear_bits(tc358746, SYSCTL_REG, SRESET);
drivers/media/i2c/tc358746.c
405
tc358746_apply_pll_config(struct tc358746 *tc358746)
drivers/media/i2c/tc358746.c
407
u8 post = tc358746->pll_post_div;
drivers/media/i2c/tc358746.c
408
u16 pre = tc358746->pll_pre_div;
drivers/media/i2c/tc358746.c
409
u16 mul = tc358746->pll_mul;
drivers/media/i2c/tc358746.c
413
err = tc358746_read(tc358746, PLLCTL1_REG, &val);
drivers/media/i2c/tc358746.c
424
err = tc358746_update_bits(tc358746, PLLCTL0_REG, mask, val);
drivers/media/i2c/tc358746.c
430
err = tc358746_update_bits(tc358746, PLLCTL1_REG, mask, val);
drivers/media/i2c/tc358746.c
436
return tc358746_set_bits(tc358746, PLLCTL1_REG, CKEN);
drivers/media/i2c/tc358746.c
443
static int tc358746_calc_vb_size(struct tc358746 *tc358746,
drivers/media/i2c/tc358746.c
454
csi_bitrate = tc358746->dphy_cfg.lanes * tc358746->pll_rate;
drivers/media/i2c/tc358746.c
456
dev_dbg(tc358746->sd.dev,
drivers/media/i2c/tc358746.c
493
dev_dbg(tc358746->sd.dev,
drivers/media/i2c/tc358746.c
503
static int tc358746_apply_misc_config(struct tc358746 *tc358746)
drivers/media/i2c/tc358746.c
506
struct v4l2_subdev *sd = &tc358746->sd;
drivers/media/i2c/tc358746.c
539
err = tc358746_write(tc358746, DATAFMT_REG, val);
drivers/media/i2c/tc358746.c
545
err = tc358746_update_bits(tc358746, CONFCTL_REG, PDATAF_MASK, val);
drivers/media/i2c/tc358746.c
549
vb_size = tc358746_calc_vb_size(tc358746, source_link_freq, mbusfmt, fmt);
drivers/media/i2c/tc358746.c
557
err = tc358746_write(tc358746, FIFOCTL_REG, val);
drivers/media/i2c/tc358746.c
564
err = tc358746_write(tc358746, WORDCNT_REG, val);
drivers/media/i2c/tc358746.c
588
static int tc358746_apply_dphy_config(struct tc358746 *tc358746)
drivers/media/i2c/tc358746.c
590
struct phy_configure_opts_mipi_dphy *cfg = &tc358746->dphy_cfg;
drivers/media/i2c/tc358746.c
591
bool non_cont_clk = !!(tc358746->csi_vep.bus.mipi_csi2.flags &
drivers/media/i2c/tc358746.c
593
struct device *dev = tc358746->sd.dev;
drivers/media/i2c/tc358746.c
604
err = tc358746_write(tc358746, LINEINITCNT_REG, val);
drivers/media/i2c/tc358746.c
611
err = tc358746_write(tc358746, LPTXTIMECNT_REG, val);
drivers/media/i2c/tc358746.c
621
err = tc358746_write(tc358746, TCLK_HEADERCNT_REG,
drivers/media/i2c/tc358746.c
628
err = tc358746_write(tc358746, TCLK_TRAILCNT_REG, val);
drivers/media/i2c/tc358746.c
638
err = tc358746_write(tc358746, THS_HEADERCNT_REG,
drivers/media/i2c/tc358746.c
647
err = tc358746_write(tc358746, TWAKEUP_REG, val);
drivers/media/i2c/tc358746.c
653
err = tc358746_write(tc358746, TCLK_POSTCNT_REG, val);
drivers/media/i2c/tc358746.c
659
err = tc358746_write(tc358746, THS_TRAILCNT_REG, val);
drivers/media/i2c/tc358746.c
665
return tc358746_write(tc358746, TXOPTIONCNTRL_REG, non_cont_clk ? 0 : 1);
drivers/media/i2c/tc358746.c
670
static int tc358746_enable_csi_lanes(struct tc358746 *tc358746, int enable)
drivers/media/i2c/tc358746.c
672
unsigned int lanes = tc358746->dphy_cfg.lanes;
drivers/media/i2c/tc358746.c
677
err = tc358746_update_bits(tc358746, CONFCTL_REG, DATALANE_MASK,
drivers/media/i2c/tc358746.c
684
dev_dbg(tc358746->sd.dev, "CLW_CNTRL: 0x%x\n", val);
drivers/media/i2c/tc358746.c
685
err = tc358746_write(tc358746, CLW_CNTRL_REG, val);
drivers/media/i2c/tc358746.c
694
dev_dbg(tc358746->sd.dev, "D%uW_CNTRL: 0x%x\n", lane, val);
drivers/media/i2c/tc358746.c
695
err = tc358746_write(tc358746, reg, val);
drivers/media/i2c/tc358746.c
710
dev_dbg(tc358746->sd.dev, "HSTXVREGEN: 0x%x\n", val);
drivers/media/i2c/tc358746.c
712
return tc358746_write(tc358746, HSTXVREGEN_REG, val);
drivers/media/i2c/tc358746.c
715
static int tc358746_enable_csi_module(struct tc358746 *tc358746, int enable)
drivers/media/i2c/tc358746.c
717
unsigned int lanes = tc358746->dphy_cfg.lanes;
drivers/media/i2c/tc358746.c
726
return tc358746_sw_reset(tc358746);
drivers/media/i2c/tc358746.c
728
err = tc358746_write(tc358746, STARTCNTRL_REG, START);
drivers/media/i2c/tc358746.c
732
err = tc358746_write(tc358746, CSI_START_REG, STRT);
drivers/media/i2c/tc358746.c
737
return tc358746_write(tc358746, CSI_CONFW_REG,
drivers/media/i2c/tc358746.c
743
static int tc358746_enable_parallel_port(struct tc358746 *tc358746, int enable)
drivers/media/i2c/tc358746.c
748
err = tc358746_write(tc358746, PP_MISC_REG, 0);
drivers/media/i2c/tc358746.c
752
return tc358746_set_bits(tc358746, CONFCTL_REG, PPEN);
drivers/media/i2c/tc358746.c
755
err = tc358746_set_bits(tc358746, PP_MISC_REG, FRMSTOP);
drivers/media/i2c/tc358746.c
759
err = tc358746_clear_bits(tc358746, CONFCTL_REG, PPEN);
drivers/media/i2c/tc358746.c
763
return tc358746_set_bits(tc358746, PP_MISC_REG, RSTPTR);
drivers/media/i2c/tc358746.c
777
struct tc358746 *tc358746 = to_tc358746(sd);
drivers/media/i2c/tc358746.c
783
src = tc358746_get_remote_sd(&tc358746->pads[TC358746_SINK]);
drivers/media/i2c/tc358746.c
792
err = tc358746_apply_dphy_config(tc358746);
drivers/media/i2c/tc358746.c
796
err = tc358746_apply_misc_config(tc358746);
drivers/media/i2c/tc358746.c
800
err = tc358746_enable_csi_lanes(tc358746, 1);
drivers/media/i2c/tc358746.c
804
err = tc358746_enable_csi_module(tc358746, 1);
drivers/media/i2c/tc358746.c
808
err = tc358746_enable_parallel_port(tc358746, 1);
drivers/media/i2c/tc358746.c
828
err = tc358746_enable_csi_lanes(tc358746, 0);
drivers/media/i2c/tc358746.c
832
err = tc358746_enable_csi_module(tc358746, 0);
drivers/media/i2c/tc358746.c
836
err = tc358746_enable_parallel_port(tc358746, 0);
drivers/media/i2c/tc358746.c
912
static unsigned long tc358746_find_pll_settings(struct tc358746 *tc358746,
drivers/media/i2c/tc358746.c
917
struct device *dev = tc358746->sd.dev;
drivers/media/i2c/tc358746.c
973
tc358746->pll_post_div = postdiv;
drivers/media/i2c/tc358746.c
974
tc358746->pll_pre_div = p_best;
drivers/media/i2c/tc358746.c
975
tc358746->pll_mul = m_best;
drivers/media/i2c/tc358746.c
990
struct tc358746 *tc358746 = to_tc358746(sd);
drivers/media/i2c/tc358746.c
996
config->bus.mipi_csi2 = tc358746->csi_vep.bus.mipi_csi2;