Lines Matching +full:high +full:- +full:speed

4  * SPDX-License-Identifier:	GPL-2.0+
131 * struct stm32_i2c_spec - private i2c specification timing
132 * @rate: I2C bus speed (Hz)
133 * @rate_min: 80% of I2C bus speed (Hz)
134 * @rate_max: 120% of I2C bus speed (Hz)
141 * @h_min: Min high period of the SCL clock (ns)
158 * struct stm32_i2c_setup - private I2C timing setup parameters
159 * @speed: I2C speed mode (standard, Fast Plus)
160 * @speed_freq: I2C speed frequency (Hz)
164 * @dnf: Digital filter coefficient (0-16)
168 enum stm32_i2c_speed speed; member
178 * struct stm32_i2c_timings - private I2C output parameters
182 * @sclh: SCL high period (master mode)
198 int speed; member
251 struct stm32_i2c_regs *regs = i2c_priv->regs; in stm32_i2c_check_device_busy()
252 u32 status = readl(&regs->isr); in stm32_i2c_check_device_busy()
255 return -EBUSY; in stm32_i2c_check_device_busy()
263 struct stm32_i2c_regs *regs = i2c_priv->regs; in stm32_i2c_message_start()
264 u32 cr2 = readl(&regs->cr2); in stm32_i2c_message_start()
268 if (msg->flags & I2C_M_RD) in stm32_i2c_message_start()
273 if (msg->flags & I2C_M_TEN) { in stm32_i2c_message_start()
275 cr2 |= STM32_I2C_CR2_SADD10(msg->addr); in stm32_i2c_message_start()
279 cr2 |= STM32_I2C_CR2_SADD7(msg->addr); in stm32_i2c_message_start()
285 if (msg->len > STM32_I2C_MAX_LEN) { in stm32_i2c_message_start()
289 cr2 |= STM32_I2C_CR2_NBYTES(msg->len); in stm32_i2c_message_start()
293 writel(cr2, &regs->cr2); in stm32_i2c_message_start()
296 setbits_le32(&regs->cr2, STM32_I2C_CR2_START); in stm32_i2c_message_start()
307 struct stm32_i2c_regs *regs = i2c_priv->regs; in stm32_i2c_handle_reload()
308 u32 cr2 = readl(&regs->cr2); in stm32_i2c_handle_reload()
312 if (msg->len > STM32_I2C_MAX_LEN) { in stm32_i2c_handle_reload()
316 cr2 |= STM32_I2C_CR2_NBYTES(msg->len); in stm32_i2c_handle_reload()
319 writel(cr2, &regs->cr2); in stm32_i2c_handle_reload()
325 struct stm32_i2c_regs *regs = i2c_priv->regs; in stm32_i2c_wait_flags()
328 *status = readl(&regs->isr); in stm32_i2c_wait_flags()
332 return -ETIMEDOUT; in stm32_i2c_wait_flags()
335 *status = readl(&regs->isr); in stm32_i2c_wait_flags()
343 struct stm32_i2c_regs *regs = i2c_priv->regs; in stm32_i2c_check_end_of_message()
357 setbits_le32(&regs->icr, STM32_I2C_ICR_BERRCF); in stm32_i2c_check_end_of_message()
359 return -EIO; in stm32_i2c_check_end_of_message()
366 setbits_le32(&regs->icr, STM32_I2C_ICR_ARLOCF); in stm32_i2c_check_end_of_message()
368 return -EAGAIN; in stm32_i2c_check_end_of_message()
375 setbits_le32(&regs->icr, STM32_I2C_ICR_NACKCF); in stm32_i2c_check_end_of_message()
383 ret = -EIO; in stm32_i2c_check_end_of_message()
388 setbits_le32(&regs->icr, STM32_I2C_ICR_STOPCF); in stm32_i2c_check_end_of_message()
391 setbits_le32(&regs->cr2, STM32_I2C_CR2_RESET_MASK); in stm32_i2c_check_end_of_message()
400 struct stm32_i2c_regs *regs = i2c_priv->regs; in stm32_i2c_message_xfer()
402 u32 mask = msg->flags & I2C_M_RD ? STM32_I2C_ISR_RXNE : in stm32_i2c_message_xfer()
404 int bytes_to_rw = msg->len > STM32_I2C_MAX_LEN ? in stm32_i2c_message_xfer()
405 STM32_I2C_MAX_LEN : msg->len; in stm32_i2c_message_xfer()
413 while (msg->len) { in stm32_i2c_message_xfer()
426 *msg->buf++ = readb(&regs->rxdr); in stm32_i2c_message_xfer()
427 msg->len--; in stm32_i2c_message_xfer()
428 bytes_to_rw--; in stm32_i2c_message_xfer()
432 writeb(*msg->buf++, &regs->txdr); in stm32_i2c_message_xfer()
433 msg->len--; in stm32_i2c_message_xfer()
434 bytes_to_rw--; in stm32_i2c_message_xfer()
437 if (!bytes_to_rw && msg->len) { in stm32_i2c_message_xfer()
444 bytes_to_rw = msg->len > STM32_I2C_MAX_LEN ? in stm32_i2c_message_xfer()
445 STM32_I2C_MAX_LEN : msg->len; in stm32_i2c_message_xfer()
446 mask = msg->flags & I2C_M_RD ? STM32_I2C_ISR_RXNE : in stm32_i2c_message_xfer()
465 setbits_le32(&regs->cr2, mask); in stm32_i2c_message_xfer()
480 for (; nmsgs > 0; nmsgs--, msg++) { in stm32_i2c_xfer()
495 setup->clock_src); in stm32_i2c_compute_solutions()
501 af_delay_min = setup->analog_filter ? in stm32_i2c_compute_solutions()
503 af_delay_max = setup->analog_filter ? in stm32_i2c_compute_solutions()
506 sdadel_min = setup->fall_time - i2c_specs[setup->speed].hddat_min - in stm32_i2c_compute_solutions()
507 af_delay_min - (setup->dnf + 3) * i2cclk; in stm32_i2c_compute_solutions()
509 sdadel_max = i2c_specs[setup->speed].vddat_max - setup->rise_time - in stm32_i2c_compute_solutions()
510 af_delay_max - (setup->dnf + 4) * i2cclk; in stm32_i2c_compute_solutions()
512 scldel_min = setup->rise_time + i2c_specs[setup->speed].sudat_min; in stm32_i2c_compute_solutions()
538 return -ENOMEM; in stm32_i2c_compute_solutions()
540 v->presc = p; in stm32_i2c_compute_solutions()
541 v->scldel = l; in stm32_i2c_compute_solutions()
542 v->sdadel = a; in stm32_i2c_compute_solutions()
545 list_add_tail(&v->node, solutions); in stm32_i2c_compute_solutions()
553 ret = -EPERM; in stm32_i2c_compute_solutions()
565 setup->speed_freq); in stm32_i2c_choose_solution()
568 setup->clock_src); in stm32_i2c_choose_solution()
576 af_delay_min = setup->analog_filter ? in stm32_i2c_choose_solution()
578 dnf_delay = setup->dnf * i2cclk; in stm32_i2c_choose_solution()
581 clk_max = STM32_NSEC_PER_SEC / i2c_specs[setup->speed].rate_min; in stm32_i2c_choose_solution()
582 clk_min = STM32_NSEC_PER_SEC / i2c_specs[setup->speed].rate_max; in stm32_i2c_choose_solution()
586 * and High Period. Provided: in stm32_i2c_choose_solution()
587 * - SCL Low Period has to be higher than Low Period of the SCL Clock in stm32_i2c_choose_solution()
589 * (SCL Low Period - Analog/Digital filters) / 4. in stm32_i2c_choose_solution()
590 * - SCL High Period has to be lower than High Period of the SCL Clock in stm32_i2c_choose_solution()
592 * - I2C Clock has to be lower than SCL High Period in stm32_i2c_choose_solution()
595 u32 prescaler = (v->presc + 1) * i2cclk; in stm32_i2c_choose_solution()
599 if ((tscl_l < i2c_specs[setup->speed].l_min) || in stm32_i2c_choose_solution()
601 ((tscl_l - af_delay_min - dnf_delay) / 4))) { in stm32_i2c_choose_solution()
608 setup->rise_time + setup->fall_time; in stm32_i2c_choose_solution()
611 (tscl_h >= i2c_specs[setup->speed].h_min) && in stm32_i2c_choose_solution()
613 int clk_error = tscl - i2cbus; in stm32_i2c_choose_solution()
616 clk_error = -clk_error; in stm32_i2c_choose_solution()
620 v->scll = l; in stm32_i2c_choose_solution()
621 v->sclh = h; in stm32_i2c_choose_solution()
631 ret = -EPERM; in stm32_i2c_choose_solution()
645 if (setup->speed >= STM32_I2C_SPEED_END) { in stm32_i2c_compute_timing()
646 pr_err("%s: speed out of bound {%d/%d}\n", __func__, in stm32_i2c_compute_timing()
647 setup->speed, STM32_I2C_SPEED_END - 1); in stm32_i2c_compute_timing()
648 return -EINVAL; in stm32_i2c_compute_timing()
651 if ((setup->rise_time > i2c_specs[setup->speed].rise_max) || in stm32_i2c_compute_timing()
652 (setup->fall_time > i2c_specs[setup->speed].fall_max)) { in stm32_i2c_compute_timing()
655 setup->rise_time, i2c_specs[setup->speed].rise_max, in stm32_i2c_compute_timing()
656 setup->fall_time, i2c_specs[setup->speed].fall_max); in stm32_i2c_compute_timing()
657 return -EINVAL; in stm32_i2c_compute_timing()
660 if (setup->dnf > STM32_I2C_DNF_MAX) { in stm32_i2c_compute_timing()
662 setup->dnf, STM32_I2C_DNF_MAX); in stm32_i2c_compute_timing()
663 return -EINVAL; in stm32_i2c_compute_timing()
666 if (setup->speed_freq > i2c_specs[setup->speed].rate) { in stm32_i2c_compute_timing()
668 setup->speed_freq, i2c_specs[setup->speed].rate); in stm32_i2c_compute_timing()
669 return -EINVAL; in stm32_i2c_compute_timing()
682 output->presc = s->presc; in stm32_i2c_compute_timing()
683 output->scldel = s->scldel; in stm32_i2c_compute_timing()
684 output->sdadel = s->sdadel; in stm32_i2c_compute_timing()
685 output->scll = s->scll; in stm32_i2c_compute_timing()
686 output->sclh = s->sclh; in stm32_i2c_compute_timing()
689 __func__, output->presc, in stm32_i2c_compute_timing()
690 output->scldel, output->sdadel, in stm32_i2c_compute_timing()
691 output->scll, output->sclh); in stm32_i2c_compute_timing()
696 list_del(&v->node); in stm32_i2c_compute_timing()
706 struct stm32_i2c_setup *setup = i2c_priv->setup; in stm32_i2c_setup_timing()
709 setup->speed = i2c_priv->speed; in stm32_i2c_setup_timing()
710 setup->speed_freq = i2c_specs[setup->speed].rate; in stm32_i2c_setup_timing()
711 setup->clock_src = clk_get_rate(&i2c_priv->clk); in stm32_i2c_setup_timing()
713 if (!setup->clock_src) { in stm32_i2c_setup_timing()
715 return -EINVAL; in stm32_i2c_setup_timing()
723 if (i2c_priv->speed > STM32_I2C_SPEED_STANDARD) { in stm32_i2c_setup_timing()
724 i2c_priv->speed--; in stm32_i2c_setup_timing()
725 setup->speed = i2c_priv->speed; in stm32_i2c_setup_timing()
726 setup->speed_freq = in stm32_i2c_setup_timing()
727 i2c_specs[setup->speed].rate; in stm32_i2c_setup_timing()
728 debug("%s: downgrade I2C Speed Freq to (%i)\n", in stm32_i2c_setup_timing()
729 __func__, i2c_specs[setup->speed].rate); in stm32_i2c_setup_timing()
741 debug("%s: I2C Speed(%i), Freq(%i), Clk Source(%i)\n", __func__, in stm32_i2c_setup_timing()
742 setup->speed, setup->speed_freq, setup->clock_src); in stm32_i2c_setup_timing()
744 setup->rise_time, setup->fall_time); in stm32_i2c_setup_timing()
746 setup->analog_filter ? "On" : "Off", setup->dnf); in stm32_i2c_setup_timing()
753 struct stm32_i2c_regs *regs = i2c_priv->regs; in stm32_i2c_hw_config()
763 clrbits_le32(&regs->cr1, STM32_I2C_CR1_PE); in stm32_i2c_hw_config()
771 writel(timing, &regs->timingr); in stm32_i2c_hw_config()
774 if (i2c_priv->setup->analog_filter) in stm32_i2c_hw_config()
775 clrbits_le32(&regs->cr1, STM32_I2C_CR1_ANFOFF); in stm32_i2c_hw_config()
777 setbits_le32(&regs->cr1, STM32_I2C_CR1_ANFOFF); in stm32_i2c_hw_config()
778 setbits_le32(&regs->cr1, STM32_I2C_CR1_PE); in stm32_i2c_hw_config()
783 static int stm32_i2c_set_bus_speed(struct udevice *bus, unsigned int speed) in stm32_i2c_set_bus_speed() argument
787 switch (speed) { in stm32_i2c_set_bus_speed()
789 i2c_priv->speed = STM32_I2C_SPEED_STANDARD; in stm32_i2c_set_bus_speed()
792 i2c_priv->speed = STM32_I2C_SPEED_FAST; in stm32_i2c_set_bus_speed()
795 i2c_priv->speed = STM32_I2C_SPEED_FAST_PLUS; in stm32_i2c_set_bus_speed()
798 debug("%s: Speed %d not supported\n", __func__, speed); in stm32_i2c_set_bus_speed()
799 return -EINVAL; in stm32_i2c_set_bus_speed()
814 return -EINVAL; in stm32_i2c_probe()
816 i2c_priv->regs = (struct stm32_i2c_regs *)addr; in stm32_i2c_probe()
818 ret = clk_get_by_index(dev, 0, &i2c_priv->clk); in stm32_i2c_probe()
822 ret = clk_enable(&i2c_priv->clk); in stm32_i2c_probe()
837 clk_disable(&i2c_priv->clk); in stm32_i2c_probe()
839 clk_free(&i2c_priv->clk); in stm32_i2c_probe()
849 i2c_priv->setup = (struct stm32_i2c_setup *)dev_get_driver_data(dev); in stm32_ofdata_to_platdata()
850 if (!i2c_priv->setup) in stm32_ofdata_to_platdata()
851 return -EINVAL; in stm32_ofdata_to_platdata()
853 rise_time = dev_read_u32_default(dev, "i2c-scl-rising-time-ns", 0); in stm32_ofdata_to_platdata()
855 i2c_priv->setup->rise_time = rise_time; in stm32_ofdata_to_platdata()
857 fall_time = dev_read_u32_default(dev, "i2c-scl-falling-time-ns", 0); in stm32_ofdata_to_platdata()
859 i2c_priv->setup->fall_time = fall_time; in stm32_ofdata_to_platdata()
870 { .compatible = "st,stm32f7-i2c", .data = (ulong)&stm32f7_setup },
875 .name = "stm32f7-i2c",