Lines Matching refs:csiphy
102 static int csiphy_set_clock_rates(struct csiphy_device *csiphy) in csiphy_set_clock_rates() argument
104 struct device *dev = csiphy->camss->dev; in csiphy_set_clock_rates()
109 ret = camss_get_pixel_clock(&csiphy->subdev.entity, &pixel_clock); in csiphy_set_clock_rates()
113 for (i = 0; i < csiphy->nclocks; i++) { in csiphy_set_clock_rates()
114 struct camss_clock *clock = &csiphy->clock[i]; in csiphy_set_clock_rates()
119 u8 bpp = csiphy_get_bpp(csiphy->formats, in csiphy_set_clock_rates()
120 csiphy->nformats, in csiphy_set_clock_rates()
121 csiphy->fmt[MSM_CSIPHY_PAD_SINK].code); in csiphy_set_clock_rates()
122 u8 num_lanes = csiphy->cfg.csi2->lane_cfg.num_data; in csiphy_set_clock_rates()
150 csiphy->timer_clk_rate = round_rate; in csiphy_set_clock_rates()
152 ret = clk_set_rate(clock->clk, csiphy->timer_clk_rate); in csiphy_set_clock_rates()
172 struct csiphy_device *csiphy = v4l2_get_subdevdata(sd); in csiphy_set_power() local
173 struct device *dev = csiphy->camss->dev; in csiphy_set_power()
182 ret = csiphy_set_clock_rates(csiphy); in csiphy_set_power()
188 ret = camss_enable_clocks(csiphy->nclocks, csiphy->clock, dev); in csiphy_set_power()
194 enable_irq(csiphy->irq); in csiphy_set_power()
196 csiphy->ops->reset(csiphy); in csiphy_set_power()
198 csiphy->ops->hw_version_read(csiphy, dev); in csiphy_set_power()
200 disable_irq(csiphy->irq); in csiphy_set_power()
202 camss_disable_clocks(csiphy->nclocks, csiphy->clock); in csiphy_set_power()
238 static int csiphy_stream_on(struct csiphy_device *csiphy) in csiphy_stream_on() argument
240 struct csiphy_config *cfg = &csiphy->cfg; in csiphy_stream_on()
243 u8 bpp = csiphy_get_bpp(csiphy->formats, csiphy->nformats, in csiphy_stream_on()
244 csiphy->fmt[MSM_CSIPHY_PAD_SINK].code); in csiphy_stream_on()
248 ret = camss_get_pixel_clock(&csiphy->subdev.entity, &pixel_clock); in csiphy_stream_on()
250 dev_err(csiphy->camss->dev, in csiphy_stream_on()
255 dev_err(csiphy->camss->dev, in csiphy_stream_on()
260 val = readl_relaxed(csiphy->base_clk_mux); in csiphy_stream_on()
268 writel_relaxed(val, csiphy->base_clk_mux); in csiphy_stream_on()
271 csiphy->ops->lanes_enable(csiphy, cfg, pixel_clock, bpp, lane_mask); in csiphy_stream_on()
282 static void csiphy_stream_off(struct csiphy_device *csiphy) in csiphy_stream_off() argument
284 csiphy->ops->lanes_disable(csiphy, &csiphy->cfg); in csiphy_stream_off()
297 struct csiphy_device *csiphy = v4l2_get_subdevdata(sd); in csiphy_set_stream() local
301 ret = csiphy_stream_on(csiphy); in csiphy_set_stream()
303 csiphy_stream_off(csiphy); in csiphy_set_stream()
318 __csiphy_get_format(struct csiphy_device *csiphy, in __csiphy_get_format() argument
324 return v4l2_subdev_get_try_format(&csiphy->subdev, cfg, pad); in __csiphy_get_format()
326 return &csiphy->fmt[pad]; in __csiphy_get_format()
337 static void csiphy_try_format(struct csiphy_device *csiphy, in csiphy_try_format() argument
349 for (i = 0; i < csiphy->nformats; i++) in csiphy_try_format()
350 if (fmt->code == csiphy->formats[i].code) in csiphy_try_format()
354 if (i >= csiphy->nformats) in csiphy_try_format()
368 *fmt = *__csiphy_get_format(csiphy, cfg, MSM_CSID_PAD_SINK, in csiphy_try_format()
386 struct csiphy_device *csiphy = v4l2_get_subdevdata(sd); in csiphy_enum_mbus_code() local
390 if (code->index >= csiphy->nformats) in csiphy_enum_mbus_code()
393 code->code = csiphy->formats[code->index].code; in csiphy_enum_mbus_code()
398 format = __csiphy_get_format(csiphy, cfg, MSM_CSIPHY_PAD_SINK, in csiphy_enum_mbus_code()
418 struct csiphy_device *csiphy = v4l2_get_subdevdata(sd); in csiphy_enum_frame_size() local
427 csiphy_try_format(csiphy, cfg, fse->pad, &format, fse->which); in csiphy_enum_frame_size()
437 csiphy_try_format(csiphy, cfg, fse->pad, &format, fse->which); in csiphy_enum_frame_size()
456 struct csiphy_device *csiphy = v4l2_get_subdevdata(sd); in csiphy_get_format() local
459 format = __csiphy_get_format(csiphy, cfg, fmt->pad, fmt->which); in csiphy_get_format()
480 struct csiphy_device *csiphy = v4l2_get_subdevdata(sd); in csiphy_set_format() local
483 format = __csiphy_get_format(csiphy, cfg, fmt->pad, fmt->which); in csiphy_set_format()
487 csiphy_try_format(csiphy, cfg, fmt->pad, &fmt->format, fmt->which); in csiphy_set_format()
492 format = __csiphy_get_format(csiphy, cfg, MSM_CSIPHY_PAD_SRC, in csiphy_set_format()
496 csiphy_try_format(csiphy, cfg, MSM_CSIPHY_PAD_SRC, format, in csiphy_set_format()
538 struct csiphy_device *csiphy, in msm_csiphy_subdev_init() argument
547 csiphy->camss = camss; in msm_csiphy_subdev_init()
548 csiphy->id = id; in msm_csiphy_subdev_init()
549 csiphy->cfg.combo_mode = 0; in msm_csiphy_subdev_init()
552 csiphy->ops = &csiphy_ops_2ph_1_0; in msm_csiphy_subdev_init()
553 csiphy->formats = csiphy_formats_8x16; in msm_csiphy_subdev_init()
554 csiphy->nformats = ARRAY_SIZE(csiphy_formats_8x16); in msm_csiphy_subdev_init()
556 csiphy->ops = &csiphy_ops_3ph_1_0; in msm_csiphy_subdev_init()
557 csiphy->formats = csiphy_formats_8x96; in msm_csiphy_subdev_init()
558 csiphy->nformats = ARRAY_SIZE(csiphy_formats_8x96); in msm_csiphy_subdev_init()
566 csiphy->base = devm_ioremap_resource(dev, r); in msm_csiphy_subdev_init()
567 if (IS_ERR(csiphy->base)) { in msm_csiphy_subdev_init()
569 return PTR_ERR(csiphy->base); in msm_csiphy_subdev_init()
573 csiphy->base_clk_mux = devm_ioremap_resource(dev, r); in msm_csiphy_subdev_init()
574 if (IS_ERR(csiphy->base_clk_mux)) { in msm_csiphy_subdev_init()
576 return PTR_ERR(csiphy->base_clk_mux); in msm_csiphy_subdev_init()
588 csiphy->irq = r->start; in msm_csiphy_subdev_init()
589 snprintf(csiphy->irq_name, sizeof(csiphy->irq_name), "%s_%s%d", in msm_csiphy_subdev_init()
590 dev_name(dev), MSM_CSIPHY_NAME, csiphy->id); in msm_csiphy_subdev_init()
592 ret = devm_request_irq(dev, csiphy->irq, csiphy->ops->isr, in msm_csiphy_subdev_init()
593 IRQF_TRIGGER_RISING, csiphy->irq_name, csiphy); in msm_csiphy_subdev_init()
599 disable_irq(csiphy->irq); in msm_csiphy_subdev_init()
603 csiphy->nclocks = 0; in msm_csiphy_subdev_init()
604 while (res->clock[csiphy->nclocks]) in msm_csiphy_subdev_init()
605 csiphy->nclocks++; in msm_csiphy_subdev_init()
607 csiphy->clock = devm_kcalloc(dev, in msm_csiphy_subdev_init()
608 csiphy->nclocks, sizeof(*csiphy->clock), in msm_csiphy_subdev_init()
610 if (!csiphy->clock) in msm_csiphy_subdev_init()
613 for (i = 0; i < csiphy->nclocks; i++) { in msm_csiphy_subdev_init()
614 struct camss_clock *clock = &csiphy->clock[i]; in msm_csiphy_subdev_init()
661 struct csiphy_device *csiphy; in csiphy_link_setup() local
668 csiphy = v4l2_get_subdevdata(sd); in csiphy_link_setup()
673 csiphy->cfg.csid_id = csid->id; in csiphy_link_setup()
716 int msm_csiphy_register_entity(struct csiphy_device *csiphy, in msm_csiphy_register_entity() argument
719 struct v4l2_subdev *sd = &csiphy->subdev; in msm_csiphy_register_entity()
720 struct media_pad *pads = csiphy->pads; in msm_csiphy_register_entity()
721 struct device *dev = csiphy->camss->dev; in msm_csiphy_register_entity()
728 MSM_CSIPHY_NAME, csiphy->id); in msm_csiphy_register_entity()
729 v4l2_set_subdevdata(sd, csiphy); in msm_csiphy_register_entity()
761 void msm_csiphy_unregister_entity(struct csiphy_device *csiphy) in msm_csiphy_unregister_entity() argument
763 v4l2_device_unregister_subdev(&csiphy->subdev); in msm_csiphy_unregister_entity()
764 media_entity_cleanup(&csiphy->subdev.entity); in msm_csiphy_unregister_entity()