Lines Matching refs:i2c_dev
144 static void stm32f4_i2c_disable_irq(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_disable_irq() argument
146 void __iomem *reg = i2c_dev->base + STM32F4_I2C_CR2; in stm32f4_i2c_disable_irq()
151 static int stm32f4_i2c_set_periph_clk_freq(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_set_periph_clk_freq() argument
156 i2c_dev->parent_rate = clk_get_rate(i2c_dev->clk); in stm32f4_i2c_set_periph_clk_freq()
157 freq = DIV_ROUND_UP(i2c_dev->parent_rate, HZ_TO_MHZ); in stm32f4_i2c_set_periph_clk_freq()
159 if (i2c_dev->speed == STM32_I2C_SPEED_STANDARD) { in stm32f4_i2c_set_periph_clk_freq()
167 dev_err(i2c_dev->dev, in stm32f4_i2c_set_periph_clk_freq()
179 dev_err(i2c_dev->dev, in stm32f4_i2c_set_periph_clk_freq()
186 writel_relaxed(cr2, i2c_dev->base + STM32F4_I2C_CR2); in stm32f4_i2c_set_periph_clk_freq()
191 static void stm32f4_i2c_set_rise_time(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_set_rise_time() argument
193 u32 freq = DIV_ROUND_UP(i2c_dev->parent_rate, HZ_TO_MHZ); in stm32f4_i2c_set_rise_time()
216 if (i2c_dev->speed == STM32_I2C_SPEED_STANDARD) in stm32f4_i2c_set_rise_time()
222 i2c_dev->base + STM32F4_I2C_TRISE); in stm32f4_i2c_set_rise_time()
225 static void stm32f4_i2c_set_speed_mode(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_set_speed_mode() argument
230 if (i2c_dev->speed == STM32_I2C_SPEED_STANDARD) { in stm32f4_i2c_set_speed_mode()
246 val = i2c_dev->parent_rate / (I2C_MAX_STANDARD_MODE_FREQ * 2); in stm32f4_i2c_set_speed_mode()
266 val = DIV_ROUND_UP(i2c_dev->parent_rate, I2C_MAX_FAST_MODE_FREQ * 3); in stm32f4_i2c_set_speed_mode()
273 writel_relaxed(ccr, i2c_dev->base + STM32F4_I2C_CCR); in stm32f4_i2c_set_speed_mode()
280 static int stm32f4_i2c_hw_config(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_hw_config() argument
284 ret = stm32f4_i2c_set_periph_clk_freq(i2c_dev); in stm32f4_i2c_hw_config()
288 stm32f4_i2c_set_rise_time(i2c_dev); in stm32f4_i2c_hw_config()
290 stm32f4_i2c_set_speed_mode(i2c_dev); in stm32f4_i2c_hw_config()
293 writel_relaxed(STM32F4_I2C_CR1_PE, i2c_dev->base + STM32F4_I2C_CR1); in stm32f4_i2c_hw_config()
298 static int stm32f4_i2c_wait_free_bus(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_wait_free_bus() argument
303 ret = readl_relaxed_poll_timeout(i2c_dev->base + STM32F4_I2C_SR2, in stm32f4_i2c_wait_free_bus()
308 dev_dbg(i2c_dev->dev, "bus not free\n"); in stm32f4_i2c_wait_free_bus()
320 static void stm32f4_i2c_write_byte(struct stm32f4_i2c_dev *i2c_dev, u8 byte) in stm32f4_i2c_write_byte() argument
322 writel_relaxed(byte, i2c_dev->base + STM32F4_I2C_DR); in stm32f4_i2c_write_byte()
331 static void stm32f4_i2c_write_msg(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_write_msg() argument
333 struct stm32f4_i2c_msg *msg = &i2c_dev->msg; in stm32f4_i2c_write_msg()
335 stm32f4_i2c_write_byte(i2c_dev, *msg->buf++); in stm32f4_i2c_write_msg()
339 static void stm32f4_i2c_read_msg(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_read_msg() argument
341 struct stm32f4_i2c_msg *msg = &i2c_dev->msg; in stm32f4_i2c_read_msg()
344 rbuf = readl_relaxed(i2c_dev->base + STM32F4_I2C_DR); in stm32f4_i2c_read_msg()
349 static void stm32f4_i2c_terminate_xfer(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_terminate_xfer() argument
351 struct stm32f4_i2c_msg *msg = &i2c_dev->msg; in stm32f4_i2c_terminate_xfer()
354 stm32f4_i2c_disable_irq(i2c_dev); in stm32f4_i2c_terminate_xfer()
356 reg = i2c_dev->base + STM32F4_I2C_CR1; in stm32f4_i2c_terminate_xfer()
362 complete(&i2c_dev->complete); in stm32f4_i2c_terminate_xfer()
369 static void stm32f4_i2c_handle_write(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_handle_write() argument
371 struct stm32f4_i2c_msg *msg = &i2c_dev->msg; in stm32f4_i2c_handle_write()
372 void __iomem *reg = i2c_dev->base + STM32F4_I2C_CR2; in stm32f4_i2c_handle_write()
375 stm32f4_i2c_write_msg(i2c_dev); in stm32f4_i2c_handle_write()
384 stm32f4_i2c_terminate_xfer(i2c_dev); in stm32f4_i2c_handle_write()
394 static void stm32f4_i2c_handle_read(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_handle_read() argument
396 struct stm32f4_i2c_msg *msg = &i2c_dev->msg; in stm32f4_i2c_handle_read()
397 void __iomem *reg = i2c_dev->base + STM32F4_I2C_CR2; in stm32f4_i2c_handle_read()
401 stm32f4_i2c_disable_irq(i2c_dev); in stm32f4_i2c_handle_read()
402 stm32f4_i2c_read_msg(i2c_dev); in stm32f4_i2c_handle_read()
403 complete(&i2c_dev->complete); in stm32f4_i2c_handle_read()
422 stm32f4_i2c_read_msg(i2c_dev); in stm32f4_i2c_handle_read()
434 static void stm32f4_i2c_handle_rx_done(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_handle_rx_done() argument
436 struct stm32f4_i2c_msg *msg = &i2c_dev->msg; in stm32f4_i2c_handle_rx_done()
451 reg = i2c_dev->base + STM32F4_I2C_CR1; in stm32f4_i2c_handle_rx_done()
458 stm32f4_i2c_read_msg(i2c_dev); in stm32f4_i2c_handle_rx_done()
460 reg = i2c_dev->base + STM32F4_I2C_CR2; in stm32f4_i2c_handle_rx_done()
464 complete(&i2c_dev->complete); in stm32f4_i2c_handle_rx_done()
472 reg = i2c_dev->base + STM32F4_I2C_CR1; in stm32f4_i2c_handle_rx_done()
474 stm32f4_i2c_read_msg(i2c_dev); in stm32f4_i2c_handle_rx_done()
477 stm32f4_i2c_read_msg(i2c_dev); in stm32f4_i2c_handle_rx_done()
486 static void stm32f4_i2c_handle_rx_addr(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_handle_rx_addr() argument
488 struct stm32f4_i2c_msg *msg = &i2c_dev->msg; in stm32f4_i2c_handle_rx_addr()
493 stm32f4_i2c_terminate_xfer(i2c_dev); in stm32f4_i2c_handle_rx_addr()
496 readl_relaxed(i2c_dev->base + STM32F4_I2C_SR2); in stm32f4_i2c_handle_rx_addr()
506 cr1 = readl_relaxed(i2c_dev->base + STM32F4_I2C_CR1); in stm32f4_i2c_handle_rx_addr()
508 writel_relaxed(cr1, i2c_dev->base + STM32F4_I2C_CR1); in stm32f4_i2c_handle_rx_addr()
510 readl_relaxed(i2c_dev->base + STM32F4_I2C_SR2); in stm32f4_i2c_handle_rx_addr()
516 writel_relaxed(cr1, i2c_dev->base + STM32F4_I2C_CR1); in stm32f4_i2c_handle_rx_addr()
526 cr1 = readl_relaxed(i2c_dev->base + STM32F4_I2C_CR1); in stm32f4_i2c_handle_rx_addr()
529 writel_relaxed(cr1, i2c_dev->base + STM32F4_I2C_CR1); in stm32f4_i2c_handle_rx_addr()
531 readl_relaxed(i2c_dev->base + STM32F4_I2C_SR2); in stm32f4_i2c_handle_rx_addr()
541 cr1 = readl_relaxed(i2c_dev->base + STM32F4_I2C_CR1); in stm32f4_i2c_handle_rx_addr()
544 writel_relaxed(cr1, i2c_dev->base + STM32F4_I2C_CR1); in stm32f4_i2c_handle_rx_addr()
546 readl_relaxed(i2c_dev->base + STM32F4_I2C_SR2); in stm32f4_i2c_handle_rx_addr()
558 struct stm32f4_i2c_dev *i2c_dev = data; in stm32f4_i2c_isr_event() local
559 struct stm32f4_i2c_msg *msg = &i2c_dev->msg; in stm32f4_i2c_isr_event()
563 cr2 = readl_relaxed(i2c_dev->base + STM32F4_I2C_CR2); in stm32f4_i2c_isr_event()
570 status = readl_relaxed(i2c_dev->base + STM32F4_I2C_SR1); in stm32f4_i2c_isr_event()
573 dev_dbg(i2c_dev->dev, in stm32f4_i2c_isr_event()
581 stm32f4_i2c_write_byte(i2c_dev, msg->addr); in stm32f4_i2c_isr_event()
586 stm32f4_i2c_handle_rx_addr(i2c_dev); in stm32f4_i2c_isr_event()
588 readl_relaxed(i2c_dev->base + STM32F4_I2C_SR2); in stm32f4_i2c_isr_event()
595 writel_relaxed(cr2, i2c_dev->base + STM32F4_I2C_CR2); in stm32f4_i2c_isr_event()
600 stm32f4_i2c_handle_write(i2c_dev); in stm32f4_i2c_isr_event()
604 stm32f4_i2c_handle_read(i2c_dev); in stm32f4_i2c_isr_event()
615 stm32f4_i2c_handle_rx_done(i2c_dev); in stm32f4_i2c_isr_event()
617 stm32f4_i2c_handle_write(i2c_dev); in stm32f4_i2c_isr_event()
630 struct stm32f4_i2c_dev *i2c_dev = data; in stm32f4_i2c_isr_error() local
631 struct stm32f4_i2c_msg *msg = &i2c_dev->msg; in stm32f4_i2c_isr_error()
635 status = readl_relaxed(i2c_dev->base + STM32F4_I2C_SR1); in stm32f4_i2c_isr_error()
640 writel_relaxed(status, i2c_dev->base + STM32F4_I2C_SR1); in stm32f4_i2c_isr_error()
650 reg = i2c_dev->base + STM32F4_I2C_CR1; in stm32f4_i2c_isr_error()
654 writel_relaxed(status, i2c_dev->base + STM32F4_I2C_SR1); in stm32f4_i2c_isr_error()
661 writel_relaxed(status, i2c_dev->base + STM32F4_I2C_SR1); in stm32f4_i2c_isr_error()
665 stm32f4_i2c_disable_irq(i2c_dev); in stm32f4_i2c_isr_error()
666 complete(&i2c_dev->complete); in stm32f4_i2c_isr_error()
678 static int stm32f4_i2c_xfer_msg(struct stm32f4_i2c_dev *i2c_dev, in stm32f4_i2c_xfer_msg() argument
682 struct stm32f4_i2c_msg *f4_msg = &i2c_dev->msg; in stm32f4_i2c_xfer_msg()
683 void __iomem *reg = i2c_dev->base + STM32F4_I2C_CR1; in stm32f4_i2c_xfer_msg()
694 reinit_completion(&i2c_dev->complete); in stm32f4_i2c_xfer_msg()
698 stm32f4_i2c_set_bits(i2c_dev->base + STM32F4_I2C_CR2, mask); in stm32f4_i2c_xfer_msg()
701 ret = stm32f4_i2c_wait_free_bus(i2c_dev); in stm32f4_i2c_xfer_msg()
709 timeout = wait_for_completion_timeout(&i2c_dev->complete, in stm32f4_i2c_xfer_msg()
710 i2c_dev->adap.timeout); in stm32f4_i2c_xfer_msg()
728 struct stm32f4_i2c_dev *i2c_dev = i2c_get_adapdata(i2c_adap); in stm32f4_i2c_xfer() local
731 ret = clk_enable(i2c_dev->clk); in stm32f4_i2c_xfer()
733 dev_err(i2c_dev->dev, "Failed to enable clock\n"); in stm32f4_i2c_xfer()
738 ret = stm32f4_i2c_xfer_msg(i2c_dev, &msgs[i], i == 0, in stm32f4_i2c_xfer()
741 clk_disable(i2c_dev->clk); in stm32f4_i2c_xfer()
759 struct stm32f4_i2c_dev *i2c_dev; in stm32f4_i2c_probe() local
766 i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); in stm32f4_i2c_probe()
767 if (!i2c_dev) in stm32f4_i2c_probe()
771 i2c_dev->base = devm_ioremap_resource(&pdev->dev, res); in stm32f4_i2c_probe()
772 if (IS_ERR(i2c_dev->base)) in stm32f4_i2c_probe()
773 return PTR_ERR(i2c_dev->base); in stm32f4_i2c_probe()
787 i2c_dev->clk = devm_clk_get(&pdev->dev, NULL); in stm32f4_i2c_probe()
788 if (IS_ERR(i2c_dev->clk)) { in stm32f4_i2c_probe()
790 return PTR_ERR(i2c_dev->clk); in stm32f4_i2c_probe()
792 ret = clk_prepare_enable(i2c_dev->clk); in stm32f4_i2c_probe()
794 dev_err(i2c_dev->dev, "Failed to prepare_enable clock\n"); in stm32f4_i2c_probe()
808 i2c_dev->speed = STM32_I2C_SPEED_STANDARD; in stm32f4_i2c_probe()
811 i2c_dev->speed = STM32_I2C_SPEED_FAST; in stm32f4_i2c_probe()
813 i2c_dev->dev = &pdev->dev; in stm32f4_i2c_probe()
816 pdev->name, i2c_dev); in stm32f4_i2c_probe()
824 pdev->name, i2c_dev); in stm32f4_i2c_probe()
831 ret = stm32f4_i2c_hw_config(i2c_dev); in stm32f4_i2c_probe()
835 adap = &i2c_dev->adap; in stm32f4_i2c_probe()
836 i2c_set_adapdata(adap, i2c_dev); in stm32f4_i2c_probe()
845 init_completion(&i2c_dev->complete); in stm32f4_i2c_probe()
851 platform_set_drvdata(pdev, i2c_dev); in stm32f4_i2c_probe()
853 clk_disable(i2c_dev->clk); in stm32f4_i2c_probe()
855 dev_info(i2c_dev->dev, "STM32F4 I2C driver registered\n"); in stm32f4_i2c_probe()
860 clk_disable_unprepare(i2c_dev->clk); in stm32f4_i2c_probe()
866 struct stm32f4_i2c_dev *i2c_dev = platform_get_drvdata(pdev); in stm32f4_i2c_remove() local
868 i2c_del_adapter(&i2c_dev->adap); in stm32f4_i2c_remove()
870 clk_unprepare(i2c_dev->clk); in stm32f4_i2c_remove()