Lines Matching full:phy
33 static inline u32 camerarx_read(struct cal_camerarx *phy, u32 offset) in camerarx_read() argument
35 return ioread32(phy->base + offset); in camerarx_read()
38 static inline void camerarx_write(struct cal_camerarx *phy, u32 offset, u32 val) in camerarx_write() argument
40 iowrite32(val, phy->base + offset); in camerarx_write()
48 static s64 cal_camerarx_get_ext_link_freq(struct cal_camerarx *phy) in cal_camerarx_get_ext_link_freq() argument
50 struct v4l2_mbus_config_mipi_csi2 *mipi_csi2 = &phy->endpoint.bus.mipi_csi2; in cal_camerarx_get_ext_link_freq()
58 state = v4l2_subdev_get_locked_active_state(&phy->subdev); in cal_camerarx_get_ext_link_freq()
68 freq = v4l2_get_link_freq(&phy->source->entity.pads[phy->source_pad], in cal_camerarx_get_ext_link_freq()
71 phy_err(phy, "failed to get link freq for subdev '%s'\n", in cal_camerarx_get_ext_link_freq()
72 phy->source->name); in cal_camerarx_get_ext_link_freq()
76 phy_dbg(3, phy, "Source Link Freq: %llu\n", freq); in cal_camerarx_get_ext_link_freq()
81 static void cal_camerarx_lane_config(struct cal_camerarx *phy) in cal_camerarx_lane_config() argument
83 u32 val = cal_read(phy->cal, CAL_CSI2_COMPLEXIO_CFG(phy->instance)); in cal_camerarx_lane_config()
87 &phy->endpoint.bus.mipi_csi2; in cal_camerarx_lane_config()
104 cal_write(phy->cal, CAL_CSI2_COMPLEXIO_CFG(phy->instance), val); in cal_camerarx_lane_config()
105 phy_dbg(3, phy, "CAL_CSI2_COMPLEXIO_CFG(%d) = 0x%08x\n", in cal_camerarx_lane_config()
106 phy->instance, val); in cal_camerarx_lane_config()
109 static void cal_camerarx_enable(struct cal_camerarx *phy) in cal_camerarx_enable() argument
111 u32 num_lanes = phy->cal->data->camerarx[phy->instance].num_lanes; in cal_camerarx_enable()
113 regmap_field_write(phy->fields[F_CAMMODE], 0); in cal_camerarx_enable()
114 /* Always enable all lanes at the phy control level */ in cal_camerarx_enable()
115 regmap_field_write(phy->fields[F_LANEENABLE], (1 << num_lanes) - 1); in cal_camerarx_enable()
117 if (phy->fields[F_CSI_MODE]) in cal_camerarx_enable()
118 regmap_field_write(phy->fields[F_CSI_MODE], 1); in cal_camerarx_enable()
119 regmap_field_write(phy->fields[F_CTRLCLKEN], 1); in cal_camerarx_enable()
122 void cal_camerarx_disable(struct cal_camerarx *phy) in cal_camerarx_disable() argument
124 regmap_field_write(phy->fields[F_CTRLCLKEN], 0); in cal_camerarx_disable()
134 static void cal_camerarx_config(struct cal_camerarx *phy, s64 link_freq) in cal_camerarx_config() argument
143 phy_dbg(1, phy, "ths_term: %d (0x%02x)\n", ths_term, ths_term); in cal_camerarx_config()
147 phy_dbg(1, phy, "ths_settle: %d (0x%02x)\n", ths_settle, ths_settle); in cal_camerarx_config()
149 reg0 = camerarx_read(phy, CAL_CSI2_PHY_REG0); in cal_camerarx_config()
155 phy_dbg(1, phy, "CSI2_%d_REG0 = 0x%08x\n", phy->instance, reg0); in cal_camerarx_config()
156 camerarx_write(phy, CAL_CSI2_PHY_REG0, reg0); in cal_camerarx_config()
158 reg1 = camerarx_read(phy, CAL_CSI2_PHY_REG1); in cal_camerarx_config()
165 phy_dbg(1, phy, "CSI2_%d_REG1 = 0x%08x\n", phy->instance, reg1); in cal_camerarx_config()
166 camerarx_write(phy, CAL_CSI2_PHY_REG1, reg1); in cal_camerarx_config()
169 static void cal_camerarx_power(struct cal_camerarx *phy, bool enable) in cal_camerarx_power() argument
177 cal_write_field(phy->cal, CAL_CSI2_COMPLEXIO_CFG(phy->instance), in cal_camerarx_power()
183 current_state = cal_read_field(phy->cal, in cal_camerarx_power()
184 CAL_CSI2_COMPLEXIO_CFG(phy->instance), in cal_camerarx_power()
194 phy_err(phy, "Failed to power %s complexio\n", in cal_camerarx_power()
198 static void cal_camerarx_wait_reset(struct cal_camerarx *phy) in cal_camerarx_wait_reset() argument
204 if (cal_read_field(phy->cal, in cal_camerarx_wait_reset()
205 CAL_CSI2_COMPLEXIO_CFG(phy->instance), in cal_camerarx_wait_reset()
212 if (cal_read_field(phy->cal, CAL_CSI2_COMPLEXIO_CFG(phy->instance), in cal_camerarx_wait_reset()
215 phy_err(phy, "Timeout waiting for Complex IO reset done\n"); in cal_camerarx_wait_reset()
218 static void cal_camerarx_wait_stop_state(struct cal_camerarx *phy) in cal_camerarx_wait_stop_state() argument
224 if (cal_read_field(phy->cal, in cal_camerarx_wait_stop_state()
225 CAL_CSI2_TIMING(phy->instance), in cal_camerarx_wait_stop_state()
231 if (cal_read_field(phy->cal, CAL_CSI2_TIMING(phy->instance), in cal_camerarx_wait_stop_state()
233 phy_err(phy, "Timeout waiting for stop state\n"); in cal_camerarx_wait_stop_state()
236 static void cal_camerarx_enable_irqs(struct cal_camerarx *phy) in cal_camerarx_enable_irqs() argument
254 cal_write(phy->cal, CAL_HL_IRQENABLE_SET(0), in cal_camerarx_enable_irqs()
255 CAL_HL_IRQ_CIO_MASK(phy->instance) | in cal_camerarx_enable_irqs()
256 CAL_HL_IRQ_VC_MASK(phy->instance)); in cal_camerarx_enable_irqs()
257 cal_write(phy->cal, CAL_CSI2_COMPLEXIO_IRQENABLE(phy->instance), in cal_camerarx_enable_irqs()
259 cal_write(phy->cal, CAL_CSI2_VC_IRQENABLE(phy->instance), in cal_camerarx_enable_irqs()
263 static void cal_camerarx_disable_irqs(struct cal_camerarx *phy) in cal_camerarx_disable_irqs() argument
266 cal_write(phy->cal, CAL_HL_IRQENABLE_CLR(0), in cal_camerarx_disable_irqs()
267 CAL_HL_IRQ_CIO_MASK(phy->instance) | in cal_camerarx_disable_irqs()
268 CAL_HL_IRQ_VC_MASK(phy->instance)); in cal_camerarx_disable_irqs()
269 cal_write(phy->cal, CAL_CSI2_COMPLEXIO_IRQENABLE(phy->instance), 0); in cal_camerarx_disable_irqs()
270 cal_write(phy->cal, CAL_CSI2_VC_IRQENABLE(phy->instance), 0); in cal_camerarx_disable_irqs()
273 static void cal_camerarx_ppi_enable(struct cal_camerarx *phy) in cal_camerarx_ppi_enable() argument
275 cal_write_field(phy->cal, CAL_CSI2_PPI_CTRL(phy->instance), in cal_camerarx_ppi_enable()
278 cal_write_field(phy->cal, CAL_CSI2_PPI_CTRL(phy->instance), in cal_camerarx_ppi_enable()
282 static void cal_camerarx_ppi_disable(struct cal_camerarx *phy) in cal_camerarx_ppi_disable() argument
284 cal_write_field(phy->cal, CAL_CSI2_PPI_CTRL(phy->instance), in cal_camerarx_ppi_disable()
288 static int cal_camerarx_start(struct cal_camerarx *phy) in cal_camerarx_start() argument
295 if (phy->enable_count > 0) { in cal_camerarx_start()
296 phy->enable_count++; in cal_camerarx_start()
300 link_freq = cal_camerarx_get_ext_link_freq(phy); in cal_camerarx_start()
304 ret = v4l2_subdev_call(phy->source, core, s_power, 1); in cal_camerarx_start()
306 phy_err(phy, "power on failed in subdev\n"); in cal_camerarx_start()
310 cal_camerarx_enable_irqs(phy); in cal_camerarx_start()
313 * CSI-2 PHY Link Initialization Sequence, according to the DRA74xP / in cal_camerarx_start()
320 * receive signals/data from the CSI-2 PHY. in cal_camerarx_start()
324 cal_camerarx_lane_config(phy); in cal_camerarx_start()
327 * vi.-vii. Configure D-PHY mode, enable the required lanes and in cal_camerarx_start()
330 cal_camerarx_enable(phy); in cal_camerarx_start()
333 * 2. CSI PHY and link initialization sequence. in cal_camerarx_start()
335 * a. Deassert the CSI-2 PHY reset. Do not wait for reset completion in cal_camerarx_start()
339 cal_write_field(phy->cal, CAL_CSI2_COMPLEXIO_CFG(phy->instance), in cal_camerarx_start()
342 phy_dbg(3, phy, "CAL_CSI2_COMPLEXIO_CFG(%d) = 0x%08x De-assert Complex IO Reset\n", in cal_camerarx_start()
343 phy->instance, in cal_camerarx_start()
344 cal_read(phy->cal, CAL_CSI2_COMPLEXIO_CFG(phy->instance))); in cal_camerarx_start()
347 camerarx_read(phy, CAL_CSI2_PHY_REG0); in cal_camerarx_start()
349 /* Program the PHY timing parameters. */ in cal_camerarx_start()
350 cal_camerarx_config(phy, link_freq); in cal_camerarx_start()
362 sscounter = DIV_ROUND_UP(clk_get_rate(phy->cal->fclk), 10000 * 16 * 4); in cal_camerarx_start()
364 val = cal_read(phy->cal, CAL_CSI2_TIMING(phy->instance)); in cal_camerarx_start()
369 cal_write(phy->cal, CAL_CSI2_TIMING(phy->instance), val); in cal_camerarx_start()
370 phy_dbg(3, phy, "CAL_CSI2_TIMING(%d) = 0x%08x Stop States\n", in cal_camerarx_start()
371 phy->instance, in cal_camerarx_start()
372 cal_read(phy->cal, CAL_CSI2_TIMING(phy->instance))); in cal_camerarx_start()
375 cal_write_field(phy->cal, CAL_CSI2_TIMING(phy->instance), in cal_camerarx_start()
377 phy_dbg(3, phy, "CAL_CSI2_TIMING(%d) = 0x%08x Force RXMODE\n", in cal_camerarx_start()
378 phy->instance, in cal_camerarx_start()
379 cal_read(phy->cal, CAL_CSI2_TIMING(phy->instance))); in cal_camerarx_start()
382 * c. Connect pull-down on CSI-2 PHY link (using pad control). in cal_camerarx_start()
389 * d. Power up the CSI-2 PHY. in cal_camerarx_start()
392 cal_camerarx_power(phy, true); in cal_camerarx_start()
396 * CSI-2 PHY reset to complete. in cal_camerarx_start()
398 ret = v4l2_subdev_call(phy->source, video, s_stream, 1); in cal_camerarx_start()
400 v4l2_subdev_call(phy->source, core, s_power, 0); in cal_camerarx_start()
401 cal_camerarx_disable_irqs(phy); in cal_camerarx_start()
402 phy_err(phy, "stream on failed in subdev\n"); in cal_camerarx_start()
406 cal_camerarx_wait_reset(phy); in cal_camerarx_start()
409 cal_camerarx_wait_stop_state(phy); in cal_camerarx_start()
411 phy_dbg(1, phy, "CSI2_%u_REG1 = 0x%08x (bits 31-28 should be set)\n", in cal_camerarx_start()
412 phy->instance, camerarx_read(phy, CAL_CSI2_PHY_REG1)); in cal_camerarx_start()
415 * g. Disable pull-down on CSI-2 PHY link (using pad control). in cal_camerarx_start()
421 /* Finally, enable the PHY Protocol Interface (PPI). */ in cal_camerarx_start()
422 cal_camerarx_ppi_enable(phy); in cal_camerarx_start()
424 phy->enable_count++; in cal_camerarx_start()
429 static void cal_camerarx_stop(struct cal_camerarx *phy) in cal_camerarx_stop() argument
433 if (--phy->enable_count > 0) in cal_camerarx_stop()
436 cal_camerarx_ppi_disable(phy); in cal_camerarx_stop()
438 cal_camerarx_disable_irqs(phy); in cal_camerarx_stop()
440 cal_camerarx_power(phy, false); in cal_camerarx_stop()
443 cal_write_field(phy->cal, CAL_CSI2_COMPLEXIO_CFG(phy->instance), in cal_camerarx_stop()
447 phy_dbg(3, phy, "CAL_CSI2_COMPLEXIO_CFG(%d) = 0x%08x Complex IO in Reset\n", in cal_camerarx_stop()
448 phy->instance, in cal_camerarx_stop()
449 cal_read(phy->cal, CAL_CSI2_COMPLEXIO_CFG(phy->instance))); in cal_camerarx_stop()
451 /* Disable the phy */ in cal_camerarx_stop()
452 cal_camerarx_disable(phy); in cal_camerarx_stop()
454 if (v4l2_subdev_call(phy->source, video, s_stream, 0)) in cal_camerarx_stop()
455 phy_err(phy, "stream off failed in subdev\n"); in cal_camerarx_stop()
457 ret = v4l2_subdev_call(phy->source, core, s_power, 0); in cal_camerarx_stop()
459 phy_err(phy, "power off failed in subdev\n"); in cal_camerarx_stop()
481 void cal_camerarx_i913_errata(struct cal_camerarx *phy) in cal_camerarx_i913_errata() argument
483 u32 reg10 = camerarx_read(phy, CAL_CSI2_PHY_REG10); in cal_camerarx_i913_errata()
487 phy_dbg(1, phy, "CSI2_%d_REG10 = 0x%08x\n", phy->instance, reg10); in cal_camerarx_i913_errata()
488 camerarx_write(phy, CAL_CSI2_PHY_REG10, reg10); in cal_camerarx_i913_errata()
492 struct cal_camerarx *phy) in cal_camerarx_regmap_init() argument
500 phy_data = &cal->data->camerarx[phy->instance]; in cal_camerarx_regmap_init()
513 phy->fields[i] = devm_regmap_field_alloc(cal->dev, in cal_camerarx_regmap_init()
516 if (IS_ERR(phy->fields[i])) { in cal_camerarx_regmap_init()
518 return PTR_ERR(phy->fields[i]); in cal_camerarx_regmap_init()
525 static int cal_camerarx_parse_dt(struct cal_camerarx *phy) in cal_camerarx_parse_dt() argument
527 struct v4l2_fwnode_endpoint *endpoint = &phy->endpoint; in cal_camerarx_parse_dt()
534 * Find the endpoint node for the port corresponding to the PHY in cal_camerarx_parse_dt()
537 ep_node = of_graph_get_endpoint_by_regs(phy->cal->dev->of_node, in cal_camerarx_parse_dt()
538 phy->instance, 0); in cal_camerarx_parse_dt()
541 * The endpoint is not mandatory, not all PHY instances need to in cal_camerarx_parse_dt()
544 phy_dbg(3, phy, "Port has no endpoint\n"); in cal_camerarx_parse_dt()
551 phy_err(phy, "Failed to parse endpoint\n"); in cal_camerarx_parse_dt()
559 phy_err(phy, "Invalid position %u for data lane %u\n", in cal_camerarx_parse_dt()
571 phy_dbg(3, phy, in cal_camerarx_parse_dt()
577 phy->source_ep_node = of_graph_get_remote_endpoint(ep_node); in cal_camerarx_parse_dt()
578 phy->source_node = of_graph_get_port_parent(phy->source_ep_node); in cal_camerarx_parse_dt()
579 if (!phy->source_node) { in cal_camerarx_parse_dt()
580 phy_dbg(3, phy, "Can't get remote parent\n"); in cal_camerarx_parse_dt()
581 of_node_put(phy->source_ep_node); in cal_camerarx_parse_dt()
586 phy_dbg(1, phy, "Found connected device %pOFn\n", phy->source_node); in cal_camerarx_parse_dt()
605 struct cal_camerarx *phy = to_cal_camerarx(sd); in cal_camerarx_sd_s_stream() local
612 ret = cal_camerarx_start(phy); in cal_camerarx_sd_s_stream()
614 cal_camerarx_stop(phy); in cal_camerarx_sd_s_stream()
750 struct cal_camerarx *phy = to_cal_camerarx(sd); in cal_camerarx_get_frame_desc() local
755 remote_pad = media_pad_remote_pad_first(&phy->pads[CAL_CAMERARX_PAD_SINK]); in cal_camerarx_get_frame_desc()
759 ret = v4l2_subdev_call(phy->source, pad, get_frame_desc, in cal_camerarx_get_frame_desc()
765 cal_err(phy->cal, in cal_camerarx_get_frame_desc()
771 cal_err(phy->cal, in cal_camerarx_get_frame_desc()
815 struct cal_camerarx *phy; in cal_camerarx_create() local
820 phy = devm_kzalloc(cal->dev, sizeof(*phy), GFP_KERNEL); in cal_camerarx_create()
821 if (!phy) in cal_camerarx_create()
824 phy->cal = cal; in cal_camerarx_create()
825 phy->instance = instance; in cal_camerarx_create()
827 spin_lock_init(&phy->vc_lock); in cal_camerarx_create()
829 phy->res = platform_get_resource_byname(pdev, IORESOURCE_MEM, in cal_camerarx_create()
833 phy->base = devm_ioremap_resource(cal->dev, phy->res); in cal_camerarx_create()
834 if (IS_ERR(phy->base)) { in cal_camerarx_create()
836 return ERR_CAST(phy->base); in cal_camerarx_create()
840 phy->res->name, &phy->res->start, &phy->res->end); in cal_camerarx_create()
842 ret = cal_camerarx_regmap_init(cal, phy); in cal_camerarx_create()
846 ret = cal_camerarx_parse_dt(phy); in cal_camerarx_create()
851 sd = &phy->subdev; in cal_camerarx_create()
859 phy->pads[CAL_CAMERARX_PAD_SINK].flags = MEDIA_PAD_FL_SINK; in cal_camerarx_create()
861 phy->pads[i].flags = MEDIA_PAD_FL_SOURCE; in cal_camerarx_create()
863 ret = media_entity_pads_init(&sd->entity, ARRAY_SIZE(phy->pads), in cal_camerarx_create()
864 phy->pads); in cal_camerarx_create()
876 return phy; in cal_camerarx_create()
881 media_entity_cleanup(&phy->subdev.entity); in cal_camerarx_create()
883 of_node_put(phy->source_ep_node); in cal_camerarx_create()
884 of_node_put(phy->source_node); in cal_camerarx_create()
888 void cal_camerarx_destroy(struct cal_camerarx *phy) in cal_camerarx_destroy() argument
890 if (!phy) in cal_camerarx_destroy()
893 v4l2_device_unregister_subdev(&phy->subdev); in cal_camerarx_destroy()
894 v4l2_subdev_cleanup(&phy->subdev); in cal_camerarx_destroy()
895 media_entity_cleanup(&phy->subdev.entity); in cal_camerarx_destroy()
896 of_node_put(phy->source_ep_node); in cal_camerarx_destroy()
897 of_node_put(phy->source_node); in cal_camerarx_destroy()