Lines Matching refs:inno

275 static void inno_update_bits(struct inno_mipi_dphy *inno, u8 first, u8 second,  in inno_update_bits()  argument
280 regmap_update_bits(inno->regmap, reg, mask, val); in inno_update_bits()
283 static void inno_mipi_dphy_reset(struct inno_mipi_dphy *inno) in inno_mipi_dphy_reset() argument
286 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x01, in inno_mipi_dphy_reset()
289 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x01, in inno_mipi_dphy_reset()
292 inno_update_bits(inno, REGISTER_PART_DIGITAL, 0x00, in inno_mipi_dphy_reset()
295 inno_update_bits(inno, REGISTER_PART_DIGITAL, 0x00, in inno_mipi_dphy_reset()
299 static void inno_mipi_dphy_power_work_enable(struct inno_mipi_dphy *inno) in inno_mipi_dphy_power_work_enable() argument
301 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x00, in inno_mipi_dphy_power_work_enable()
305 static void inno_mipi_dphy_power_work_disable(struct inno_mipi_dphy *inno) in inno_mipi_dphy_power_work_disable() argument
307 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x00, in inno_mipi_dphy_power_work_disable()
311 static void inno_mipi_dphy_bandgap_power_enable(struct inno_mipi_dphy *inno) in inno_mipi_dphy_bandgap_power_enable() argument
313 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x00, in inno_mipi_dphy_bandgap_power_enable()
317 static void inno_mipi_dphy_bandgap_power_disable(struct inno_mipi_dphy *inno) in inno_mipi_dphy_bandgap_power_disable() argument
319 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x00, in inno_mipi_dphy_bandgap_power_disable()
323 static void inno_mipi_dphy_lane_enable(struct inno_mipi_dphy *inno) in inno_mipi_dphy_lane_enable() argument
327 switch (inno->lanes) { in inno_mipi_dphy_lane_enable()
343 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x00, LANE_EN_MASK, val); in inno_mipi_dphy_lane_enable()
346 static void inno_mipi_dphy_lane_disable(struct inno_mipi_dphy *inno) in inno_mipi_dphy_lane_disable() argument
348 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x00, LANE_EN_MASK, 0); in inno_mipi_dphy_lane_disable()
351 static void inno_mipi_dphy_pll_enable(struct inno_mipi_dphy *inno) in inno_mipi_dphy_pll_enable() argument
353 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x03, in inno_mipi_dphy_pll_enable()
354 REG_PREDIV_MASK, REG_PREDIV(inno->pll.prediv)); in inno_mipi_dphy_pll_enable()
355 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x03, in inno_mipi_dphy_pll_enable()
356 REG_FBDIV_HI_MASK, REG_FBDIV_HI(inno->pll.fbdiv >> 8)); in inno_mipi_dphy_pll_enable()
357 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x04, in inno_mipi_dphy_pll_enable()
358 REG_FBDIV_LO_MASK, REG_FBDIV_LO(inno->pll.fbdiv)); in inno_mipi_dphy_pll_enable()
359 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x08, in inno_mipi_dphy_pll_enable()
361 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x0b, in inno_mipi_dphy_pll_enable()
364 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x01, in inno_mipi_dphy_pll_enable()
369 static void inno_mipi_dphy_pll_disable(struct inno_mipi_dphy *inno) in inno_mipi_dphy_pll_disable() argument
371 inno_update_bits(inno, REGISTER_PART_ANALOG, 0x01, in inno_mipi_dphy_pll_disable()
410 inno_mipi_dphy_get_timing(struct inno_mipi_dphy *inno) in inno_mipi_dphy_get_timing() argument
414 unsigned int lane_mbps = inno->lane_rate / USEC_PER_SEC; in inno_mipi_dphy_get_timing()
430 static void inno_mipi_dphy_timing_init(struct inno_mipi_dphy *inno) in inno_mipi_dphy_timing_init() argument
442 txbyteclk = inno->lane_rate / 8; in inno_mipi_dphy_timing_init()
443 sys_clk = clk_get_rate(inno->pclk); in inno_mipi_dphy_timing_init()
446 ui = DIV_ROUND_CLOSEST_ULL(PSECS_PER_SEC, inno->lane_rate); in inno_mipi_dphy_timing_init()
448 dev_dbg(inno->dev, "txbyteclk=%ld, ui=%ld, sys_clk=%ld\n", in inno_mipi_dphy_timing_init()
452 timing = inno_mipi_dphy_get_timing(inno); in inno_mipi_dphy_timing_init()
476 dev_dbg(inno->dev, "lpx=%x\n", lpx); in inno_mipi_dphy_timing_init()
477 dev_dbg(inno->dev, in inno_mipi_dphy_timing_init()
480 dev_dbg(inno->dev, "clk_pre=%x, clk_post=%x\n", in inno_mipi_dphy_timing_init()
482 dev_dbg(inno->dev, "ta_go=%x, ta_sure=%x, ta_wait=%x\n", in inno_mipi_dphy_timing_init()
485 inno_update_bits(inno, i, 0x05, T_LPX_CNT_MASK, in inno_mipi_dphy_timing_init()
487 inno_update_bits(inno, i, 0x06, T_HS_PREPARE_CNT_MASK, in inno_mipi_dphy_timing_init()
489 inno_update_bits(inno, i, 0x06, T_HS_ZERO_CNT_HI_MASK, in inno_mipi_dphy_timing_init()
491 inno_update_bits(inno, i, 0x07, T_HS_ZERO_CNT_LO_MASK, in inno_mipi_dphy_timing_init()
493 inno_update_bits(inno, i, 0x08, T_HS_TRAIL_CNT_MASK, in inno_mipi_dphy_timing_init()
495 inno_update_bits(inno, i, 0x11, T_HS_EXIT_CNT_HI_MASK, in inno_mipi_dphy_timing_init()
497 inno_update_bits(inno, i, 0x09, T_HS_EXIT_CNT_LO_MASK, in inno_mipi_dphy_timing_init()
499 inno_update_bits(inno, i, 0x10, T_CLK_POST_HI_MASK, in inno_mipi_dphy_timing_init()
501 inno_update_bits(inno, i, 0x0a, T_CLK_POST_CNT_LO_MASK, in inno_mipi_dphy_timing_init()
503 inno_update_bits(inno, i, 0x0e, T_CLK_PRE_CNT_MASK, in inno_mipi_dphy_timing_init()
505 inno_update_bits(inno, i, 0x0c, T_WAKEUP_CNT_HI_MASK, in inno_mipi_dphy_timing_init()
507 inno_update_bits(inno, i, 0x0d, T_WAKEUP_CNT_LO_MASK, in inno_mipi_dphy_timing_init()
509 inno_update_bits(inno, i, 0x10, T_TA_GO_CNT_MASK, in inno_mipi_dphy_timing_init()
511 inno_update_bits(inno, i, 0x11, T_TA_SURE_CNT_MASK, in inno_mipi_dphy_timing_init()
513 inno_update_bits(inno, i, 0x12, T_TA_WAIT_CNT_MASK, in inno_mipi_dphy_timing_init()
518 static unsigned long inno_mipi_dphy_pll_round_rate(struct inno_mipi_dphy *inno, in inno_mipi_dphy_pll_round_rate() argument
581 struct inno_mipi_dphy *inno = phy_get_drvdata(phy); in inno_mipi_dphy_power_on() local
583 clk_prepare_enable(inno->pclk); in inno_mipi_dphy_power_on()
584 pm_runtime_get_sync(inno->dev); in inno_mipi_dphy_power_on()
585 inno_mipi_dphy_bandgap_power_enable(inno); in inno_mipi_dphy_power_on()
586 inno_mipi_dphy_power_work_enable(inno); in inno_mipi_dphy_power_on()
587 inno_mipi_dphy_pll_enable(inno); in inno_mipi_dphy_power_on()
588 inno_mipi_dphy_lane_enable(inno); in inno_mipi_dphy_power_on()
589 inno_mipi_dphy_reset(inno); in inno_mipi_dphy_power_on()
590 inno_mipi_dphy_timing_init(inno); in inno_mipi_dphy_power_on()
598 struct inno_mipi_dphy *inno = phy_get_drvdata(phy); in inno_mipi_dphy_power_off() local
600 inno_mipi_dphy_lane_disable(inno); in inno_mipi_dphy_power_off()
601 inno_mipi_dphy_pll_disable(inno); in inno_mipi_dphy_power_off()
602 inno_mipi_dphy_power_work_disable(inno); in inno_mipi_dphy_power_off()
603 inno_mipi_dphy_bandgap_power_disable(inno); in inno_mipi_dphy_power_off()
604 pm_runtime_put(inno->dev); in inno_mipi_dphy_power_off()
605 clk_disable_unprepare(inno->pclk); in inno_mipi_dphy_power_off()
620 struct inno_mipi_dphy *inno = hw_to_inno(hw); in inno_mipi_dphy_pll_clk_round_rate() local
626 fout = inno_mipi_dphy_pll_round_rate(inno, fin, rate, in inno_mipi_dphy_pll_clk_round_rate()
629 dev_dbg(inno->dev, "%s: fin=%lu, req_rate=%lu\n", in inno_mipi_dphy_pll_clk_round_rate()
631 dev_dbg(inno->dev, "%s: fout=%lu, prediv=%u, fbdiv=%u\n", in inno_mipi_dphy_pll_clk_round_rate()
634 inno->pll.prediv = prediv; in inno_mipi_dphy_pll_clk_round_rate()
635 inno->pll.fbdiv = fbdiv; in inno_mipi_dphy_pll_clk_round_rate()
644 struct inno_mipi_dphy *inno = hw_to_inno(hw); in inno_mipi_dphy_pll_clk_set_rate() local
646 dev_dbg(inno->dev, "%s: rate: %lu Hz\n", __func__, rate); in inno_mipi_dphy_pll_clk_set_rate()
648 inno->lane_rate = rate; in inno_mipi_dphy_pll_clk_set_rate()
656 struct inno_mipi_dphy *inno = hw_to_inno(hw); in inno_mipi_dphy_pll_clk_recalc_rate() local
658 dev_dbg(inno->dev, "%s: rate: %lu Hz\n", __func__, inno->lane_rate); in inno_mipi_dphy_pll_clk_recalc_rate()
660 return inno->lane_rate; in inno_mipi_dphy_pll_clk_recalc_rate()
669 static int inno_mipi_dphy_pll_register(struct inno_mipi_dphy *inno) in inno_mipi_dphy_pll_register() argument
671 struct device *dev = inno->dev; in inno_mipi_dphy_pll_register()
678 parent_name = __clk_get_name(inno->ref_clk); in inno_mipi_dphy_pll_register()
691 inno->pll.hw.init = &init; in inno_mipi_dphy_pll_register()
692 clk = devm_clk_register(dev, &inno->pll.hw); in inno_mipi_dphy_pll_register()
702 static void inno_mipi_dphy_pll_unregister(struct inno_mipi_dphy *inno) in inno_mipi_dphy_pll_unregister() argument
704 of_clk_del_provider(inno->dev->of_node); in inno_mipi_dphy_pll_unregister()
707 static int inno_mipi_dphy_parse_dt(struct inno_mipi_dphy *inno) in inno_mipi_dphy_parse_dt() argument
709 struct device *dev = inno->dev; in inno_mipi_dphy_parse_dt()
711 if (of_property_read_u32(dev->of_node, "inno,lanes", &inno->lanes)) in inno_mipi_dphy_parse_dt()
712 inno->lanes = 4; in inno_mipi_dphy_parse_dt()
727 struct inno_mipi_dphy *inno; in inno_mipi_dphy_probe() local
734 inno = devm_kzalloc(dev, sizeof(*inno), GFP_KERNEL); in inno_mipi_dphy_probe()
735 if (!inno) in inno_mipi_dphy_probe()
738 inno->dev = dev; in inno_mipi_dphy_probe()
739 platform_set_drvdata(pdev, inno); in inno_mipi_dphy_probe()
741 ret = inno_mipi_dphy_parse_dt(inno); in inno_mipi_dphy_probe()
752 inno->regmap = devm_regmap_init_mmio(dev, regs, in inno_mipi_dphy_probe()
754 if (IS_ERR(inno->regmap)) { in inno_mipi_dphy_probe()
755 ret = PTR_ERR(inno->regmap); in inno_mipi_dphy_probe()
760 inno->ref_clk = devm_clk_get(dev, "ref"); in inno_mipi_dphy_probe()
761 if (IS_ERR(inno->ref_clk)) { in inno_mipi_dphy_probe()
763 return PTR_ERR(inno->ref_clk); in inno_mipi_dphy_probe()
766 inno->pclk = devm_clk_get(dev, "pclk"); in inno_mipi_dphy_probe()
767 if (IS_ERR(inno->pclk)) { in inno_mipi_dphy_probe()
769 return PTR_ERR(inno->pclk); in inno_mipi_dphy_probe()
772 inno->rst = devm_reset_control_get(dev, "apb"); in inno_mipi_dphy_probe()
773 if (IS_ERR(inno->rst)) { in inno_mipi_dphy_probe()
775 return PTR_ERR(inno->rst); in inno_mipi_dphy_probe()
778 inno->grf = syscon_regmap_lookup_by_phandle(dev->of_node, in inno_mipi_dphy_probe()
780 if (IS_ERR(inno->grf)) { in inno_mipi_dphy_probe()
782 return PTR_ERR(inno->grf); in inno_mipi_dphy_probe()
791 phy_set_drvdata(phy, inno); in inno_mipi_dphy_probe()
799 ret = inno_mipi_dphy_pll_register(inno); in inno_mipi_dphy_probe()
810 struct inno_mipi_dphy *inno = platform_get_drvdata(pdev); in inno_mipi_dphy_remove() local
812 inno_mipi_dphy_pll_unregister(inno); in inno_mipi_dphy_remove()
813 pm_runtime_disable(inno->dev); in inno_mipi_dphy_remove()