struct v4l2_fwnode_endpoint endpoint;
struct device_node *sensor_node;
struct v4l2_subdev *sensor;
- unsigned int external_rate;
};
struct cal_dev {
* ------------------------------------------------------------------
*/
-static int cal_camerarx_get_external_info(struct cal_camerarx *phy)
+static s64 cal_camerarx_get_external_rate(struct cal_camerarx *phy)
{
struct v4l2_ctrl *ctrl;
+ s64 rate;
if (!phy->sensor)
return -ENODEV;
return -EPIPE;
}
- phy->external_rate = v4l2_ctrl_g_ctrl_int64(ctrl);
- phy_dbg(3, phy, "sensor Pixel Rate: %u\n", phy->external_rate);
+ rate = v4l2_ctrl_g_ctrl_int64(ctrl);
+ phy_dbg(3, phy, "sensor Pixel Rate: %llu\n", rate);
- return 0;
+ return rate;
}
static void cal_camerarx_lane_config(struct cal_camerarx *phy)
#define TCLK_MISS 1
#define TCLK_SETTLE 14
-static void cal_camerarx_config(struct cal_camerarx *phy,
+static void cal_camerarx_config(struct cal_camerarx *phy, s64 external_rate,
const struct cal_fmt *fmt)
{
unsigned int reg0, reg1;
u32 num_lanes = mipi_csi2->num_data_lanes;
/* DPHY timing configuration */
- /* CSI-2 is DDR and we only count used lanes. */
- csi2_ddrclk_khz = phy->external_rate / 1000
- / (2 * num_lanes) * fmt->bpp;
+
+ /*
+ * CSI-2 is DDR and we only count used lanes.
+ *
+ * csi2_ddrclk_khz = external_rate / 1000
+ * / (2 * num_lanes) * fmt->bpp;
+ */
+ csi2_ddrclk_khz = div_s64(external_rate * fmt->bpp,
+ 2 * num_lanes * 1000);
+
phy_dbg(1, phy, "csi2_ddrclk_khz: %d\n", csi2_ddrclk_khz);
/* THS_TERM: Programmed value = floor(20 ns/DDRClk period) */
static int cal_camerarx_start(struct cal_camerarx *phy,
const struct cal_fmt *fmt)
{
+ s64 external_rate;
u32 sscounter;
u32 val;
int ret;
- ret = cal_camerarx_get_external_info(phy);
- if (ret < 0)
- return ret;
+ external_rate = cal_camerarx_get_external_rate(phy);
+ if (external_rate < 0)
+ return external_rate;
ret = v4l2_subdev_call(phy->sensor, core, s_power, 1);
if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV) {
reg_read(phy, CAL_CSI2_PHY_REG0);
/* Program the PHY timing parameters. */
- cal_camerarx_config(phy, fmt);
+ cal_camerarx_config(phy, external_rate, fmt);
/*
* b. Assert the FORCERXMODE signal.
phy->cal = cal;
phy->instance = instance;
- phy->external_rate = 192000000;
phy->res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
(instance == 0) ?