blob: a7977eef2ead54adefc3819750faba5f2054066a [file] [log] [blame]
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Driver for STMicroelectronics STM32F7 I2C controller
4 *
5 * This I2C controller is described in the STM32F75xxx and STM32F74xxx Soc
6 * reference manual.
7 * Please see below a link to the documentation:
8 * http://www.st.com/resource/en/reference_manual/dm00124865.pdf
9 *
10 * Copyright (C) M'boumba Cedric Madianga 2017
11 * Copyright (C) STMicroelectronics 2017
12 * Author: M'boumba Cedric Madianga <cedric.madianga@gmail.com>
13 *
14 * This driver is based on i2c-stm32f4.c
15 *
16 */
17#include <linux/clk.h>
18#include <linux/delay.h>
19#include <linux/err.h>
20#include <linux/i2c.h>
21#include <linux/interrupt.h>
22#include <linux/io.h>
23#include <linux/iopoll.h>
David Brazdil0f672f62019-12-10 10:32:29 +000024#include <linux/mfd/syscon.h>
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000025#include <linux/module.h>
26#include <linux/of.h>
27#include <linux/of_address.h>
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000028#include <linux/of_platform.h>
29#include <linux/platform_device.h>
David Brazdil0f672f62019-12-10 10:32:29 +000030#include <linux/pinctrl/consumer.h>
31#include <linux/pm_runtime.h>
32#include <linux/regmap.h>
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000033#include <linux/reset.h>
34#include <linux/slab.h>
35
36#include "i2c-stm32.h"
37
38/* STM32F7 I2C registers */
39#define STM32F7_I2C_CR1 0x00
40#define STM32F7_I2C_CR2 0x04
41#define STM32F7_I2C_OAR1 0x08
42#define STM32F7_I2C_OAR2 0x0C
43#define STM32F7_I2C_PECR 0x20
44#define STM32F7_I2C_TIMINGR 0x10
45#define STM32F7_I2C_ISR 0x18
46#define STM32F7_I2C_ICR 0x1C
47#define STM32F7_I2C_RXDR 0x24
48#define STM32F7_I2C_TXDR 0x28
49
50/* STM32F7 I2C control 1 */
51#define STM32F7_I2C_CR1_PECEN BIT(23)
52#define STM32F7_I2C_CR1_SBC BIT(16)
53#define STM32F7_I2C_CR1_RXDMAEN BIT(15)
54#define STM32F7_I2C_CR1_TXDMAEN BIT(14)
55#define STM32F7_I2C_CR1_ANFOFF BIT(12)
Olivier Deprez0e641232021-09-23 10:07:05 +020056#define STM32F7_I2C_CR1_DNF_MASK GENMASK(11, 8)
57#define STM32F7_I2C_CR1_DNF(n) (((n) & 0xf) << 8)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000058#define STM32F7_I2C_CR1_ERRIE BIT(7)
59#define STM32F7_I2C_CR1_TCIE BIT(6)
60#define STM32F7_I2C_CR1_STOPIE BIT(5)
61#define STM32F7_I2C_CR1_NACKIE BIT(4)
62#define STM32F7_I2C_CR1_ADDRIE BIT(3)
63#define STM32F7_I2C_CR1_RXIE BIT(2)
64#define STM32F7_I2C_CR1_TXIE BIT(1)
65#define STM32F7_I2C_CR1_PE BIT(0)
66#define STM32F7_I2C_ALL_IRQ_MASK (STM32F7_I2C_CR1_ERRIE \
67 | STM32F7_I2C_CR1_TCIE \
68 | STM32F7_I2C_CR1_STOPIE \
69 | STM32F7_I2C_CR1_NACKIE \
70 | STM32F7_I2C_CR1_RXIE \
71 | STM32F7_I2C_CR1_TXIE)
72#define STM32F7_I2C_XFER_IRQ_MASK (STM32F7_I2C_CR1_TCIE \
73 | STM32F7_I2C_CR1_STOPIE \
74 | STM32F7_I2C_CR1_NACKIE \
75 | STM32F7_I2C_CR1_RXIE \
76 | STM32F7_I2C_CR1_TXIE)
77
78/* STM32F7 I2C control 2 */
79#define STM32F7_I2C_CR2_PECBYTE BIT(26)
80#define STM32F7_I2C_CR2_RELOAD BIT(24)
81#define STM32F7_I2C_CR2_NBYTES_MASK GENMASK(23, 16)
82#define STM32F7_I2C_CR2_NBYTES(n) (((n) & 0xff) << 16)
83#define STM32F7_I2C_CR2_NACK BIT(15)
84#define STM32F7_I2C_CR2_STOP BIT(14)
85#define STM32F7_I2C_CR2_START BIT(13)
86#define STM32F7_I2C_CR2_HEAD10R BIT(12)
87#define STM32F7_I2C_CR2_ADD10 BIT(11)
88#define STM32F7_I2C_CR2_RD_WRN BIT(10)
89#define STM32F7_I2C_CR2_SADD10_MASK GENMASK(9, 0)
90#define STM32F7_I2C_CR2_SADD10(n) (((n) & \
91 STM32F7_I2C_CR2_SADD10_MASK))
92#define STM32F7_I2C_CR2_SADD7_MASK GENMASK(7, 1)
93#define STM32F7_I2C_CR2_SADD7(n) (((n) & 0x7f) << 1)
94
95/* STM32F7 I2C Own Address 1 */
96#define STM32F7_I2C_OAR1_OA1EN BIT(15)
97#define STM32F7_I2C_OAR1_OA1MODE BIT(10)
98#define STM32F7_I2C_OAR1_OA1_10_MASK GENMASK(9, 0)
99#define STM32F7_I2C_OAR1_OA1_10(n) (((n) & \
100 STM32F7_I2C_OAR1_OA1_10_MASK))
101#define STM32F7_I2C_OAR1_OA1_7_MASK GENMASK(7, 1)
102#define STM32F7_I2C_OAR1_OA1_7(n) (((n) & 0x7f) << 1)
103#define STM32F7_I2C_OAR1_MASK (STM32F7_I2C_OAR1_OA1_7_MASK \
104 | STM32F7_I2C_OAR1_OA1_10_MASK \
105 | STM32F7_I2C_OAR1_OA1EN \
106 | STM32F7_I2C_OAR1_OA1MODE)
107
108/* STM32F7 I2C Own Address 2 */
109#define STM32F7_I2C_OAR2_OA2EN BIT(15)
110#define STM32F7_I2C_OAR2_OA2MSK_MASK GENMASK(10, 8)
111#define STM32F7_I2C_OAR2_OA2MSK(n) (((n) & 0x7) << 8)
112#define STM32F7_I2C_OAR2_OA2_7_MASK GENMASK(7, 1)
113#define STM32F7_I2C_OAR2_OA2_7(n) (((n) & 0x7f) << 1)
114#define STM32F7_I2C_OAR2_MASK (STM32F7_I2C_OAR2_OA2MSK_MASK \
115 | STM32F7_I2C_OAR2_OA2_7_MASK \
116 | STM32F7_I2C_OAR2_OA2EN)
117
118/* STM32F7 I2C Interrupt Status */
119#define STM32F7_I2C_ISR_ADDCODE_MASK GENMASK(23, 17)
120#define STM32F7_I2C_ISR_ADDCODE_GET(n) \
121 (((n) & STM32F7_I2C_ISR_ADDCODE_MASK) >> 17)
122#define STM32F7_I2C_ISR_DIR BIT(16)
123#define STM32F7_I2C_ISR_BUSY BIT(15)
124#define STM32F7_I2C_ISR_PECERR BIT(11)
125#define STM32F7_I2C_ISR_ARLO BIT(9)
126#define STM32F7_I2C_ISR_BERR BIT(8)
127#define STM32F7_I2C_ISR_TCR BIT(7)
128#define STM32F7_I2C_ISR_TC BIT(6)
129#define STM32F7_I2C_ISR_STOPF BIT(5)
130#define STM32F7_I2C_ISR_NACKF BIT(4)
131#define STM32F7_I2C_ISR_ADDR BIT(3)
132#define STM32F7_I2C_ISR_RXNE BIT(2)
133#define STM32F7_I2C_ISR_TXIS BIT(1)
134#define STM32F7_I2C_ISR_TXE BIT(0)
135
136/* STM32F7 I2C Interrupt Clear */
137#define STM32F7_I2C_ICR_PECCF BIT(11)
138#define STM32F7_I2C_ICR_ARLOCF BIT(9)
139#define STM32F7_I2C_ICR_BERRCF BIT(8)
140#define STM32F7_I2C_ICR_STOPCF BIT(5)
141#define STM32F7_I2C_ICR_NACKCF BIT(4)
142#define STM32F7_I2C_ICR_ADDRCF BIT(3)
143
144/* STM32F7 I2C Timing */
145#define STM32F7_I2C_TIMINGR_PRESC(n) (((n) & 0xf) << 28)
146#define STM32F7_I2C_TIMINGR_SCLDEL(n) (((n) & 0xf) << 20)
147#define STM32F7_I2C_TIMINGR_SDADEL(n) (((n) & 0xf) << 16)
148#define STM32F7_I2C_TIMINGR_SCLH(n) (((n) & 0xff) << 8)
149#define STM32F7_I2C_TIMINGR_SCLL(n) ((n) & 0xff)
150
151#define STM32F7_I2C_MAX_LEN 0xff
152#define STM32F7_I2C_DMA_LEN_MIN 0x16
153#define STM32F7_I2C_MAX_SLAVE 0x2
154
155#define STM32F7_I2C_DNF_DEFAULT 0
Olivier Deprez0e641232021-09-23 10:07:05 +0200156#define STM32F7_I2C_DNF_MAX 15
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000157
158#define STM32F7_I2C_ANALOG_FILTER_ENABLE 1
159#define STM32F7_I2C_ANALOG_FILTER_DELAY_MIN 50 /* ns */
160#define STM32F7_I2C_ANALOG_FILTER_DELAY_MAX 260 /* ns */
161
162#define STM32F7_I2C_RISE_TIME_DEFAULT 25 /* ns */
163#define STM32F7_I2C_FALL_TIME_DEFAULT 10 /* ns */
164
165#define STM32F7_PRESC_MAX BIT(4)
166#define STM32F7_SCLDEL_MAX BIT(4)
167#define STM32F7_SDADEL_MAX BIT(4)
168#define STM32F7_SCLH_MAX BIT(8)
169#define STM32F7_SCLL_MAX BIT(8)
170
David Brazdil0f672f62019-12-10 10:32:29 +0000171#define STM32F7_AUTOSUSPEND_DELAY (HZ / 100)
172
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000173/**
174 * struct stm32f7_i2c_spec - private i2c specification timing
175 * @rate: I2C bus speed (Hz)
176 * @rate_min: 80% of I2C bus speed (Hz)
177 * @rate_max: 100% of I2C bus speed (Hz)
178 * @fall_max: Max fall time of both SDA and SCL signals (ns)
179 * @rise_max: Max rise time of both SDA and SCL signals (ns)
180 * @hddat_min: Min data hold time (ns)
181 * @vddat_max: Max data valid time (ns)
182 * @sudat_min: Min data setup time (ns)
183 * @l_min: Min low period of the SCL clock (ns)
184 * @h_min: Min high period of the SCL clock (ns)
185 */
186struct stm32f7_i2c_spec {
187 u32 rate;
188 u32 rate_min;
189 u32 rate_max;
190 u32 fall_max;
191 u32 rise_max;
192 u32 hddat_min;
193 u32 vddat_max;
194 u32 sudat_min;
195 u32 l_min;
196 u32 h_min;
197};
198
199/**
200 * struct stm32f7_i2c_setup - private I2C timing setup parameters
201 * @speed: I2C speed mode (standard, Fast Plus)
202 * @speed_freq: I2C speed frequency (Hz)
203 * @clock_src: I2C clock source frequency (Hz)
204 * @rise_time: Rise time (ns)
205 * @fall_time: Fall time (ns)
206 * @dnf: Digital filter coefficient (0-16)
207 * @analog_filter: Analog filter delay (On/Off)
208 */
209struct stm32f7_i2c_setup {
210 enum stm32_i2c_speed speed;
211 u32 speed_freq;
212 u32 clock_src;
213 u32 rise_time;
214 u32 fall_time;
215 u8 dnf;
216 bool analog_filter;
217};
218
219/**
220 * struct stm32f7_i2c_timings - private I2C output parameters
221 * @node: List entry
222 * @presc: Prescaler value
223 * @scldel: Data setup time
224 * @sdadel: Data hold time
225 * @sclh: SCL high period (master mode)
226 * @scll: SCL low period (master mode)
227 */
228struct stm32f7_i2c_timings {
229 struct list_head node;
230 u8 presc;
231 u8 scldel;
232 u8 sdadel;
233 u8 sclh;
234 u8 scll;
235};
236
237/**
238 * struct stm32f7_i2c_msg - client specific data
239 * @addr: 8-bit or 10-bit slave addr, including r/w bit
240 * @count: number of bytes to be transferred
241 * @buf: data buffer
242 * @result: result of the transfer
243 * @stop: last I2C msg to be sent, i.e. STOP to be generated
244 * @smbus: boolean to know if the I2C IP is used in SMBus mode
245 * @size: type of SMBus protocol
246 * @read_write: direction of SMBus protocol
247 * SMBus block read and SMBus block write - block read process call protocols
248 * @smbus_buf: buffer to be used for SMBus protocol transfer. It will
249 * contain a maximum of 32 bytes of data + byte command + byte count + PEC
250 * This buffer has to be 32-bit aligned to be compliant with memory address
251 * register in DMA mode.
252 */
253struct stm32f7_i2c_msg {
254 u16 addr;
255 u32 count;
256 u8 *buf;
257 int result;
258 bool stop;
259 bool smbus;
260 int size;
261 char read_write;
262 u8 smbus_buf[I2C_SMBUS_BLOCK_MAX + 3] __aligned(4);
263};
264
265/**
266 * struct stm32f7_i2c_dev - private data of the controller
267 * @adap: I2C adapter for this controller
268 * @dev: device for this controller
269 * @base: virtual memory area
270 * @complete: completion of I2C message
271 * @clk: hw i2c clock
272 * @speed: I2C clock frequency of the controller. Standard, Fast or Fast+
273 * @msg: Pointer to data to be written
274 * @msg_num: number of I2C messages to be executed
275 * @msg_id: message identifiant
276 * @f7_msg: customized i2c msg for driver usage
277 * @setup: I2C timing input setup
278 * @timing: I2C computed timings
279 * @slave: list of slave devices registered on the I2C bus
280 * @slave_running: slave device currently used
281 * @slave_dir: transfer direction for the current slave device
282 * @master_mode: boolean to know in which mode the I2C is running (master or
283 * slave)
284 * @dma: dma data
285 * @use_dma: boolean to know if dma is used in the current transfer
David Brazdil0f672f62019-12-10 10:32:29 +0000286 * @regmap: holds SYSCFG phandle for Fast Mode Plus bits
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000287 */
288struct stm32f7_i2c_dev {
289 struct i2c_adapter adap;
290 struct device *dev;
291 void __iomem *base;
292 struct completion complete;
293 struct clk *clk;
294 int speed;
295 struct i2c_msg *msg;
296 unsigned int msg_num;
297 unsigned int msg_id;
298 struct stm32f7_i2c_msg f7_msg;
299 struct stm32f7_i2c_setup setup;
300 struct stm32f7_i2c_timings timing;
301 struct i2c_client *slave[STM32F7_I2C_MAX_SLAVE];
302 struct i2c_client *slave_running;
303 u32 slave_dir;
304 bool master_mode;
305 struct stm32_i2c_dma *dma;
306 bool use_dma;
David Brazdil0f672f62019-12-10 10:32:29 +0000307 struct regmap *regmap;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000308};
309
David Brazdil0f672f62019-12-10 10:32:29 +0000310/*
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000311 * All these values are coming from I2C Specification, Version 6.0, 4th of
312 * April 2014.
313 *
314 * Table10. Characteristics of the SDA and SCL bus lines for Standard, Fast,
315 * and Fast-mode Plus I2C-bus devices
316 */
317static struct stm32f7_i2c_spec i2c_specs[] = {
318 [STM32_I2C_SPEED_STANDARD] = {
319 .rate = 100000,
320 .rate_min = 80000,
321 .rate_max = 100000,
322 .fall_max = 300,
323 .rise_max = 1000,
324 .hddat_min = 0,
325 .vddat_max = 3450,
326 .sudat_min = 250,
327 .l_min = 4700,
328 .h_min = 4000,
329 },
330 [STM32_I2C_SPEED_FAST] = {
331 .rate = 400000,
332 .rate_min = 320000,
333 .rate_max = 400000,
334 .fall_max = 300,
335 .rise_max = 300,
336 .hddat_min = 0,
337 .vddat_max = 900,
338 .sudat_min = 100,
339 .l_min = 1300,
340 .h_min = 600,
341 },
342 [STM32_I2C_SPEED_FAST_PLUS] = {
343 .rate = 1000000,
344 .rate_min = 800000,
345 .rate_max = 1000000,
346 .fall_max = 100,
347 .rise_max = 120,
348 .hddat_min = 0,
349 .vddat_max = 450,
350 .sudat_min = 50,
351 .l_min = 500,
352 .h_min = 260,
353 },
354};
355
356static const struct stm32f7_i2c_setup stm32f7_setup = {
357 .rise_time = STM32F7_I2C_RISE_TIME_DEFAULT,
358 .fall_time = STM32F7_I2C_FALL_TIME_DEFAULT,
359 .dnf = STM32F7_I2C_DNF_DEFAULT,
360 .analog_filter = STM32F7_I2C_ANALOG_FILTER_ENABLE,
361};
362
363static inline void stm32f7_i2c_set_bits(void __iomem *reg, u32 mask)
364{
365 writel_relaxed(readl_relaxed(reg) | mask, reg);
366}
367
368static inline void stm32f7_i2c_clr_bits(void __iomem *reg, u32 mask)
369{
370 writel_relaxed(readl_relaxed(reg) & ~mask, reg);
371}
372
373static void stm32f7_i2c_disable_irq(struct stm32f7_i2c_dev *i2c_dev, u32 mask)
374{
375 stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1, mask);
376}
377
378static int stm32f7_i2c_compute_timing(struct stm32f7_i2c_dev *i2c_dev,
379 struct stm32f7_i2c_setup *setup,
380 struct stm32f7_i2c_timings *output)
381{
382 u32 p_prev = STM32F7_PRESC_MAX;
383 u32 i2cclk = DIV_ROUND_CLOSEST(NSEC_PER_SEC,
384 setup->clock_src);
385 u32 i2cbus = DIV_ROUND_CLOSEST(NSEC_PER_SEC,
386 setup->speed_freq);
387 u32 clk_error_prev = i2cbus;
388 u32 tsync;
389 u32 af_delay_min, af_delay_max;
390 u32 dnf_delay;
391 u32 clk_min, clk_max;
392 int sdadel_min, sdadel_max;
393 int scldel_min;
394 struct stm32f7_i2c_timings *v, *_v, *s;
395 struct list_head solutions;
396 u16 p, l, a, h;
397 int ret = 0;
398
399 if (setup->speed >= STM32_I2C_SPEED_END) {
400 dev_err(i2c_dev->dev, "speed out of bound {%d/%d}\n",
401 setup->speed, STM32_I2C_SPEED_END - 1);
402 return -EINVAL;
403 }
404
405 if ((setup->rise_time > i2c_specs[setup->speed].rise_max) ||
406 (setup->fall_time > i2c_specs[setup->speed].fall_max)) {
407 dev_err(i2c_dev->dev,
408 "timings out of bound Rise{%d>%d}/Fall{%d>%d}\n",
409 setup->rise_time, i2c_specs[setup->speed].rise_max,
410 setup->fall_time, i2c_specs[setup->speed].fall_max);
411 return -EINVAL;
412 }
413
414 if (setup->dnf > STM32F7_I2C_DNF_MAX) {
415 dev_err(i2c_dev->dev,
416 "DNF out of bound %d/%d\n",
417 setup->dnf, STM32F7_I2C_DNF_MAX);
418 return -EINVAL;
419 }
420
421 if (setup->speed_freq > i2c_specs[setup->speed].rate) {
422 dev_err(i2c_dev->dev, "ERROR: Freq {%d/%d}\n",
423 setup->speed_freq, i2c_specs[setup->speed].rate);
424 return -EINVAL;
425 }
426
427 /* Analog and Digital Filters */
428 af_delay_min =
429 (setup->analog_filter ?
430 STM32F7_I2C_ANALOG_FILTER_DELAY_MIN : 0);
431 af_delay_max =
432 (setup->analog_filter ?
433 STM32F7_I2C_ANALOG_FILTER_DELAY_MAX : 0);
434 dnf_delay = setup->dnf * i2cclk;
435
David Brazdil0f672f62019-12-10 10:32:29 +0000436 sdadel_min = i2c_specs[setup->speed].hddat_min + setup->fall_time -
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000437 af_delay_min - (setup->dnf + 3) * i2cclk;
438
439 sdadel_max = i2c_specs[setup->speed].vddat_max - setup->rise_time -
440 af_delay_max - (setup->dnf + 4) * i2cclk;
441
442 scldel_min = setup->rise_time + i2c_specs[setup->speed].sudat_min;
443
444 if (sdadel_min < 0)
445 sdadel_min = 0;
446 if (sdadel_max < 0)
447 sdadel_max = 0;
448
449 dev_dbg(i2c_dev->dev, "SDADEL(min/max): %i/%i, SCLDEL(Min): %i\n",
450 sdadel_min, sdadel_max, scldel_min);
451
452 INIT_LIST_HEAD(&solutions);
453 /* Compute possible values for PRESC, SCLDEL and SDADEL */
454 for (p = 0; p < STM32F7_PRESC_MAX; p++) {
455 for (l = 0; l < STM32F7_SCLDEL_MAX; l++) {
456 u32 scldel = (l + 1) * (p + 1) * i2cclk;
457
458 if (scldel < scldel_min)
459 continue;
460
461 for (a = 0; a < STM32F7_SDADEL_MAX; a++) {
462 u32 sdadel = (a * (p + 1) + 1) * i2cclk;
463
464 if (((sdadel >= sdadel_min) &&
465 (sdadel <= sdadel_max)) &&
466 (p != p_prev)) {
467 v = kmalloc(sizeof(*v), GFP_KERNEL);
468 if (!v) {
469 ret = -ENOMEM;
470 goto exit;
471 }
472
473 v->presc = p;
474 v->scldel = l;
475 v->sdadel = a;
476 p_prev = p;
477
478 list_add_tail(&v->node,
479 &solutions);
David Brazdil0f672f62019-12-10 10:32:29 +0000480 break;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000481 }
482 }
David Brazdil0f672f62019-12-10 10:32:29 +0000483
484 if (p_prev == p)
485 break;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000486 }
487 }
488
489 if (list_empty(&solutions)) {
490 dev_err(i2c_dev->dev, "no Prescaler solution\n");
491 ret = -EPERM;
492 goto exit;
493 }
494
495 tsync = af_delay_min + dnf_delay + (2 * i2cclk);
496 s = NULL;
497 clk_max = NSEC_PER_SEC / i2c_specs[setup->speed].rate_min;
498 clk_min = NSEC_PER_SEC / i2c_specs[setup->speed].rate_max;
499
500 /*
501 * Among Prescaler possibilities discovered above figures out SCL Low
502 * and High Period. Provided:
503 * - SCL Low Period has to be higher than SCL Clock Low Period
504 * defined by I2C Specification. I2C Clock has to be lower than
505 * (SCL Low Period - Analog/Digital filters) / 4.
506 * - SCL High Period has to be lower than SCL Clock High Period
507 * defined by I2C Specification
508 * - I2C Clock has to be lower than SCL High Period
509 */
510 list_for_each_entry(v, &solutions, node) {
511 u32 prescaler = (v->presc + 1) * i2cclk;
512
513 for (l = 0; l < STM32F7_SCLL_MAX; l++) {
514 u32 tscl_l = (l + 1) * prescaler + tsync;
515
516 if ((tscl_l < i2c_specs[setup->speed].l_min) ||
517 (i2cclk >=
518 ((tscl_l - af_delay_min - dnf_delay) / 4))) {
519 continue;
520 }
521
522 for (h = 0; h < STM32F7_SCLH_MAX; h++) {
523 u32 tscl_h = (h + 1) * prescaler + tsync;
524 u32 tscl = tscl_l + tscl_h +
525 setup->rise_time + setup->fall_time;
526
527 if ((tscl >= clk_min) && (tscl <= clk_max) &&
528 (tscl_h >= i2c_specs[setup->speed].h_min) &&
529 (i2cclk < tscl_h)) {
530 int clk_error = tscl - i2cbus;
531
532 if (clk_error < 0)
533 clk_error = -clk_error;
534
535 if (clk_error < clk_error_prev) {
536 clk_error_prev = clk_error;
537 v->scll = l;
538 v->sclh = h;
539 s = v;
540 }
541 }
542 }
543 }
544 }
545
546 if (!s) {
547 dev_err(i2c_dev->dev, "no solution at all\n");
548 ret = -EPERM;
549 goto exit;
550 }
551
552 output->presc = s->presc;
553 output->scldel = s->scldel;
554 output->sdadel = s->sdadel;
555 output->scll = s->scll;
556 output->sclh = s->sclh;
557
558 dev_dbg(i2c_dev->dev,
559 "Presc: %i, scldel: %i, sdadel: %i, scll: %i, sclh: %i\n",
560 output->presc,
561 output->scldel, output->sdadel,
562 output->scll, output->sclh);
563
564exit:
565 /* Release list and memory */
566 list_for_each_entry_safe(v, _v, &solutions, node) {
567 list_del(&v->node);
568 kfree(v);
569 }
570
571 return ret;
572}
573
574static int stm32f7_i2c_setup_timing(struct stm32f7_i2c_dev *i2c_dev,
575 struct stm32f7_i2c_setup *setup)
576{
577 int ret = 0;
578
579 setup->speed = i2c_dev->speed;
580 setup->speed_freq = i2c_specs[setup->speed].rate;
581 setup->clock_src = clk_get_rate(i2c_dev->clk);
582
583 if (!setup->clock_src) {
584 dev_err(i2c_dev->dev, "clock rate is 0\n");
585 return -EINVAL;
586 }
587
588 do {
589 ret = stm32f7_i2c_compute_timing(i2c_dev, setup,
590 &i2c_dev->timing);
591 if (ret) {
592 dev_err(i2c_dev->dev,
593 "failed to compute I2C timings.\n");
594 if (i2c_dev->speed > STM32_I2C_SPEED_STANDARD) {
595 i2c_dev->speed--;
596 setup->speed = i2c_dev->speed;
597 setup->speed_freq =
598 i2c_specs[setup->speed].rate;
599 dev_warn(i2c_dev->dev,
600 "downgrade I2C Speed Freq to (%i)\n",
601 i2c_specs[setup->speed].rate);
602 } else {
603 break;
604 }
605 }
606 } while (ret);
607
608 if (ret) {
609 dev_err(i2c_dev->dev, "Impossible to compute I2C timings.\n");
610 return ret;
611 }
612
613 dev_dbg(i2c_dev->dev, "I2C Speed(%i), Freq(%i), Clk Source(%i)\n",
614 setup->speed, setup->speed_freq, setup->clock_src);
615 dev_dbg(i2c_dev->dev, "I2C Rise(%i) and Fall(%i) Time\n",
616 setup->rise_time, setup->fall_time);
617 dev_dbg(i2c_dev->dev, "I2C Analog Filter(%s), DNF(%i)\n",
618 (setup->analog_filter ? "On" : "Off"), setup->dnf);
619
620 return 0;
621}
622
623static void stm32f7_i2c_disable_dma_req(struct stm32f7_i2c_dev *i2c_dev)
624{
625 void __iomem *base = i2c_dev->base;
626 u32 mask = STM32F7_I2C_CR1_RXDMAEN | STM32F7_I2C_CR1_TXDMAEN;
627
628 stm32f7_i2c_clr_bits(base + STM32F7_I2C_CR1, mask);
629}
630
631static void stm32f7_i2c_dma_callback(void *arg)
632{
633 struct stm32f7_i2c_dev *i2c_dev = (struct stm32f7_i2c_dev *)arg;
634 struct stm32_i2c_dma *dma = i2c_dev->dma;
635 struct device *dev = dma->chan_using->device->dev;
636
637 stm32f7_i2c_disable_dma_req(i2c_dev);
638 dma_unmap_single(dev, dma->dma_buf, dma->dma_len, dma->dma_data_dir);
639 complete(&dma->dma_complete);
640}
641
642static void stm32f7_i2c_hw_config(struct stm32f7_i2c_dev *i2c_dev)
643{
644 struct stm32f7_i2c_timings *t = &i2c_dev->timing;
645 u32 timing = 0;
646
647 /* Timing settings */
648 timing |= STM32F7_I2C_TIMINGR_PRESC(t->presc);
649 timing |= STM32F7_I2C_TIMINGR_SCLDEL(t->scldel);
650 timing |= STM32F7_I2C_TIMINGR_SDADEL(t->sdadel);
651 timing |= STM32F7_I2C_TIMINGR_SCLH(t->sclh);
652 timing |= STM32F7_I2C_TIMINGR_SCLL(t->scll);
653 writel_relaxed(timing, i2c_dev->base + STM32F7_I2C_TIMINGR);
654
655 /* Enable I2C */
656 if (i2c_dev->setup.analog_filter)
657 stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1,
658 STM32F7_I2C_CR1_ANFOFF);
659 else
660 stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
661 STM32F7_I2C_CR1_ANFOFF);
Olivier Deprez0e641232021-09-23 10:07:05 +0200662
663 /* Program the Digital Filter */
664 stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1,
665 STM32F7_I2C_CR1_DNF_MASK);
666 stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
667 STM32F7_I2C_CR1_DNF(i2c_dev->setup.dnf));
668
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000669 stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
670 STM32F7_I2C_CR1_PE);
671}
672
673static void stm32f7_i2c_write_tx_data(struct stm32f7_i2c_dev *i2c_dev)
674{
675 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
676 void __iomem *base = i2c_dev->base;
677
678 if (f7_msg->count) {
679 writeb_relaxed(*f7_msg->buf++, base + STM32F7_I2C_TXDR);
680 f7_msg->count--;
681 }
682}
683
684static void stm32f7_i2c_read_rx_data(struct stm32f7_i2c_dev *i2c_dev)
685{
686 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
687 void __iomem *base = i2c_dev->base;
688
689 if (f7_msg->count) {
690 *f7_msg->buf++ = readb_relaxed(base + STM32F7_I2C_RXDR);
691 f7_msg->count--;
692 } else {
693 /* Flush RX buffer has no data is expected */
694 readb_relaxed(base + STM32F7_I2C_RXDR);
695 }
696}
697
698static void stm32f7_i2c_reload(struct stm32f7_i2c_dev *i2c_dev)
699{
700 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
701 u32 cr2;
702
703 if (i2c_dev->use_dma)
704 f7_msg->count -= STM32F7_I2C_MAX_LEN;
705
706 cr2 = readl_relaxed(i2c_dev->base + STM32F7_I2C_CR2);
707
708 cr2 &= ~STM32F7_I2C_CR2_NBYTES_MASK;
709 if (f7_msg->count > STM32F7_I2C_MAX_LEN) {
710 cr2 |= STM32F7_I2C_CR2_NBYTES(STM32F7_I2C_MAX_LEN);
711 } else {
712 cr2 &= ~STM32F7_I2C_CR2_RELOAD;
713 cr2 |= STM32F7_I2C_CR2_NBYTES(f7_msg->count);
714 }
715
716 writel_relaxed(cr2, i2c_dev->base + STM32F7_I2C_CR2);
717}
718
719static void stm32f7_i2c_smbus_reload(struct stm32f7_i2c_dev *i2c_dev)
720{
721 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
722 u32 cr2;
723 u8 *val;
724
725 /*
726 * For I2C_SMBUS_BLOCK_DATA && I2C_SMBUS_BLOCK_PROC_CALL, the first
727 * data received inform us how many data will follow.
728 */
729 stm32f7_i2c_read_rx_data(i2c_dev);
730
731 /*
732 * Update NBYTES with the value read to continue the transfer
733 */
734 val = f7_msg->buf - sizeof(u8);
735 f7_msg->count = *val;
736 cr2 = readl_relaxed(i2c_dev->base + STM32F7_I2C_CR2);
737 cr2 &= ~(STM32F7_I2C_CR2_NBYTES_MASK | STM32F7_I2C_CR2_RELOAD);
738 cr2 |= STM32F7_I2C_CR2_NBYTES(f7_msg->count);
739 writel_relaxed(cr2, i2c_dev->base + STM32F7_I2C_CR2);
740}
741
742static int stm32f7_i2c_release_bus(struct i2c_adapter *i2c_adap)
743{
744 struct stm32f7_i2c_dev *i2c_dev = i2c_get_adapdata(i2c_adap);
745
746 dev_info(i2c_dev->dev, "Trying to recover bus\n");
747
748 stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1,
749 STM32F7_I2C_CR1_PE);
750
751 stm32f7_i2c_hw_config(i2c_dev);
752
753 return 0;
754}
755
756static int stm32f7_i2c_wait_free_bus(struct stm32f7_i2c_dev *i2c_dev)
757{
758 u32 status;
759 int ret;
760
761 ret = readl_relaxed_poll_timeout(i2c_dev->base + STM32F7_I2C_ISR,
762 status,
763 !(status & STM32F7_I2C_ISR_BUSY),
764 10, 1000);
765 if (!ret)
766 return 0;
767
768 dev_info(i2c_dev->dev, "bus busy\n");
769
770 ret = stm32f7_i2c_release_bus(&i2c_dev->adap);
771 if (ret) {
772 dev_err(i2c_dev->dev, "Failed to recover the bus (%d)\n", ret);
773 return ret;
774 }
775
776 return -EBUSY;
777}
778
779static void stm32f7_i2c_xfer_msg(struct stm32f7_i2c_dev *i2c_dev,
780 struct i2c_msg *msg)
781{
782 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
783 void __iomem *base = i2c_dev->base;
784 u32 cr1, cr2;
785 int ret;
786
787 f7_msg->addr = msg->addr;
788 f7_msg->buf = msg->buf;
789 f7_msg->count = msg->len;
790 f7_msg->result = 0;
791 f7_msg->stop = (i2c_dev->msg_id >= i2c_dev->msg_num - 1);
792
793 reinit_completion(&i2c_dev->complete);
794
795 cr1 = readl_relaxed(base + STM32F7_I2C_CR1);
796 cr2 = readl_relaxed(base + STM32F7_I2C_CR2);
797
798 /* Set transfer direction */
799 cr2 &= ~STM32F7_I2C_CR2_RD_WRN;
800 if (msg->flags & I2C_M_RD)
801 cr2 |= STM32F7_I2C_CR2_RD_WRN;
802
803 /* Set slave address */
804 cr2 &= ~(STM32F7_I2C_CR2_HEAD10R | STM32F7_I2C_CR2_ADD10);
805 if (msg->flags & I2C_M_TEN) {
806 cr2 &= ~STM32F7_I2C_CR2_SADD10_MASK;
807 cr2 |= STM32F7_I2C_CR2_SADD10(f7_msg->addr);
808 cr2 |= STM32F7_I2C_CR2_ADD10;
809 } else {
810 cr2 &= ~STM32F7_I2C_CR2_SADD7_MASK;
811 cr2 |= STM32F7_I2C_CR2_SADD7(f7_msg->addr);
812 }
813
814 /* Set nb bytes to transfer and reload if needed */
815 cr2 &= ~(STM32F7_I2C_CR2_NBYTES_MASK | STM32F7_I2C_CR2_RELOAD);
816 if (f7_msg->count > STM32F7_I2C_MAX_LEN) {
817 cr2 |= STM32F7_I2C_CR2_NBYTES(STM32F7_I2C_MAX_LEN);
818 cr2 |= STM32F7_I2C_CR2_RELOAD;
819 } else {
820 cr2 |= STM32F7_I2C_CR2_NBYTES(f7_msg->count);
821 }
822
823 /* Enable NACK, STOP, error and transfer complete interrupts */
824 cr1 |= STM32F7_I2C_CR1_ERRIE | STM32F7_I2C_CR1_TCIE |
825 STM32F7_I2C_CR1_STOPIE | STM32F7_I2C_CR1_NACKIE;
826
827 /* Clear DMA req and TX/RX interrupt */
828 cr1 &= ~(STM32F7_I2C_CR1_RXIE | STM32F7_I2C_CR1_TXIE |
829 STM32F7_I2C_CR1_RXDMAEN | STM32F7_I2C_CR1_TXDMAEN);
830
831 /* Configure DMA or enable RX/TX interrupt */
832 i2c_dev->use_dma = false;
833 if (i2c_dev->dma && f7_msg->count >= STM32F7_I2C_DMA_LEN_MIN) {
834 ret = stm32_i2c_prep_dma_xfer(i2c_dev->dev, i2c_dev->dma,
835 msg->flags & I2C_M_RD,
836 f7_msg->count, f7_msg->buf,
837 stm32f7_i2c_dma_callback,
838 i2c_dev);
839 if (!ret)
840 i2c_dev->use_dma = true;
841 else
842 dev_warn(i2c_dev->dev, "can't use DMA\n");
843 }
844
845 if (!i2c_dev->use_dma) {
846 if (msg->flags & I2C_M_RD)
847 cr1 |= STM32F7_I2C_CR1_RXIE;
848 else
849 cr1 |= STM32F7_I2C_CR1_TXIE;
850 } else {
851 if (msg->flags & I2C_M_RD)
852 cr1 |= STM32F7_I2C_CR1_RXDMAEN;
853 else
854 cr1 |= STM32F7_I2C_CR1_TXDMAEN;
855 }
856
857 /* Configure Start/Repeated Start */
858 cr2 |= STM32F7_I2C_CR2_START;
859
860 i2c_dev->master_mode = true;
861
862 /* Write configurations registers */
863 writel_relaxed(cr1, base + STM32F7_I2C_CR1);
864 writel_relaxed(cr2, base + STM32F7_I2C_CR2);
865}
866
867static int stm32f7_i2c_smbus_xfer_msg(struct stm32f7_i2c_dev *i2c_dev,
868 unsigned short flags, u8 command,
869 union i2c_smbus_data *data)
870{
871 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
872 struct device *dev = i2c_dev->dev;
873 void __iomem *base = i2c_dev->base;
874 u32 cr1, cr2;
875 int i, ret;
876
877 f7_msg->result = 0;
878 reinit_completion(&i2c_dev->complete);
879
880 cr2 = readl_relaxed(base + STM32F7_I2C_CR2);
881 cr1 = readl_relaxed(base + STM32F7_I2C_CR1);
882
883 /* Set transfer direction */
884 cr2 &= ~STM32F7_I2C_CR2_RD_WRN;
885 if (f7_msg->read_write)
886 cr2 |= STM32F7_I2C_CR2_RD_WRN;
887
888 /* Set slave address */
889 cr2 &= ~(STM32F7_I2C_CR2_ADD10 | STM32F7_I2C_CR2_SADD7_MASK);
890 cr2 |= STM32F7_I2C_CR2_SADD7(f7_msg->addr);
891
892 f7_msg->smbus_buf[0] = command;
893 switch (f7_msg->size) {
894 case I2C_SMBUS_QUICK:
895 f7_msg->stop = true;
896 f7_msg->count = 0;
897 break;
898 case I2C_SMBUS_BYTE:
899 f7_msg->stop = true;
900 f7_msg->count = 1;
901 break;
902 case I2C_SMBUS_BYTE_DATA:
903 if (f7_msg->read_write) {
904 f7_msg->stop = false;
905 f7_msg->count = 1;
906 cr2 &= ~STM32F7_I2C_CR2_RD_WRN;
907 } else {
908 f7_msg->stop = true;
909 f7_msg->count = 2;
910 f7_msg->smbus_buf[1] = data->byte;
911 }
912 break;
913 case I2C_SMBUS_WORD_DATA:
914 if (f7_msg->read_write) {
915 f7_msg->stop = false;
916 f7_msg->count = 1;
917 cr2 &= ~STM32F7_I2C_CR2_RD_WRN;
918 } else {
919 f7_msg->stop = true;
920 f7_msg->count = 3;
921 f7_msg->smbus_buf[1] = data->word & 0xff;
922 f7_msg->smbus_buf[2] = data->word >> 8;
923 }
924 break;
925 case I2C_SMBUS_BLOCK_DATA:
926 if (f7_msg->read_write) {
927 f7_msg->stop = false;
928 f7_msg->count = 1;
929 cr2 &= ~STM32F7_I2C_CR2_RD_WRN;
930 } else {
931 f7_msg->stop = true;
932 if (data->block[0] > I2C_SMBUS_BLOCK_MAX ||
933 !data->block[0]) {
934 dev_err(dev, "Invalid block write size %d\n",
935 data->block[0]);
936 return -EINVAL;
937 }
938 f7_msg->count = data->block[0] + 2;
939 for (i = 1; i < f7_msg->count; i++)
940 f7_msg->smbus_buf[i] = data->block[i - 1];
941 }
942 break;
943 case I2C_SMBUS_PROC_CALL:
944 f7_msg->stop = false;
945 f7_msg->count = 3;
946 f7_msg->smbus_buf[1] = data->word & 0xff;
947 f7_msg->smbus_buf[2] = data->word >> 8;
948 cr2 &= ~STM32F7_I2C_CR2_RD_WRN;
949 f7_msg->read_write = I2C_SMBUS_READ;
950 break;
951 case I2C_SMBUS_BLOCK_PROC_CALL:
952 f7_msg->stop = false;
953 if (data->block[0] > I2C_SMBUS_BLOCK_MAX - 1) {
954 dev_err(dev, "Invalid block write size %d\n",
955 data->block[0]);
956 return -EINVAL;
957 }
958 f7_msg->count = data->block[0] + 2;
959 for (i = 1; i < f7_msg->count; i++)
960 f7_msg->smbus_buf[i] = data->block[i - 1];
961 cr2 &= ~STM32F7_I2C_CR2_RD_WRN;
962 f7_msg->read_write = I2C_SMBUS_READ;
963 break;
David Brazdil0f672f62019-12-10 10:32:29 +0000964 case I2C_SMBUS_I2C_BLOCK_DATA:
965 /* Rely on emulated i2c transfer (through master_xfer) */
966 return -EOPNOTSUPP;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000967 default:
968 dev_err(dev, "Unsupported smbus protocol %d\n", f7_msg->size);
969 return -EOPNOTSUPP;
970 }
971
972 f7_msg->buf = f7_msg->smbus_buf;
973
974 /* Configure PEC */
975 if ((flags & I2C_CLIENT_PEC) && f7_msg->size != I2C_SMBUS_QUICK) {
976 cr1 |= STM32F7_I2C_CR1_PECEN;
977 cr2 |= STM32F7_I2C_CR2_PECBYTE;
978 if (!f7_msg->read_write)
979 f7_msg->count++;
980 } else {
981 cr1 &= ~STM32F7_I2C_CR1_PECEN;
982 cr2 &= ~STM32F7_I2C_CR2_PECBYTE;
983 }
984
985 /* Set number of bytes to be transferred */
986 cr2 &= ~(STM32F7_I2C_CR2_NBYTES_MASK | STM32F7_I2C_CR2_RELOAD);
987 cr2 |= STM32F7_I2C_CR2_NBYTES(f7_msg->count);
988
989 /* Enable NACK, STOP, error and transfer complete interrupts */
990 cr1 |= STM32F7_I2C_CR1_ERRIE | STM32F7_I2C_CR1_TCIE |
991 STM32F7_I2C_CR1_STOPIE | STM32F7_I2C_CR1_NACKIE;
992
993 /* Clear DMA req and TX/RX interrupt */
994 cr1 &= ~(STM32F7_I2C_CR1_RXIE | STM32F7_I2C_CR1_TXIE |
995 STM32F7_I2C_CR1_RXDMAEN | STM32F7_I2C_CR1_TXDMAEN);
996
997 /* Configure DMA or enable RX/TX interrupt */
998 i2c_dev->use_dma = false;
999 if (i2c_dev->dma && f7_msg->count >= STM32F7_I2C_DMA_LEN_MIN) {
1000 ret = stm32_i2c_prep_dma_xfer(i2c_dev->dev, i2c_dev->dma,
1001 cr2 & STM32F7_I2C_CR2_RD_WRN,
1002 f7_msg->count, f7_msg->buf,
1003 stm32f7_i2c_dma_callback,
1004 i2c_dev);
1005 if (!ret)
1006 i2c_dev->use_dma = true;
1007 else
1008 dev_warn(i2c_dev->dev, "can't use DMA\n");
1009 }
1010
1011 if (!i2c_dev->use_dma) {
1012 if (cr2 & STM32F7_I2C_CR2_RD_WRN)
1013 cr1 |= STM32F7_I2C_CR1_RXIE;
1014 else
1015 cr1 |= STM32F7_I2C_CR1_TXIE;
1016 } else {
1017 if (cr2 & STM32F7_I2C_CR2_RD_WRN)
1018 cr1 |= STM32F7_I2C_CR1_RXDMAEN;
1019 else
1020 cr1 |= STM32F7_I2C_CR1_TXDMAEN;
1021 }
1022
1023 /* Set Start bit */
1024 cr2 |= STM32F7_I2C_CR2_START;
1025
1026 i2c_dev->master_mode = true;
1027
1028 /* Write configurations registers */
1029 writel_relaxed(cr1, base + STM32F7_I2C_CR1);
1030 writel_relaxed(cr2, base + STM32F7_I2C_CR2);
1031
1032 return 0;
1033}
1034
1035static void stm32f7_i2c_smbus_rep_start(struct stm32f7_i2c_dev *i2c_dev)
1036{
1037 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
1038 void __iomem *base = i2c_dev->base;
1039 u32 cr1, cr2;
1040 int ret;
1041
1042 cr2 = readl_relaxed(base + STM32F7_I2C_CR2);
1043 cr1 = readl_relaxed(base + STM32F7_I2C_CR1);
1044
1045 /* Set transfer direction */
1046 cr2 |= STM32F7_I2C_CR2_RD_WRN;
1047
1048 switch (f7_msg->size) {
1049 case I2C_SMBUS_BYTE_DATA:
1050 f7_msg->count = 1;
1051 break;
1052 case I2C_SMBUS_WORD_DATA:
1053 case I2C_SMBUS_PROC_CALL:
1054 f7_msg->count = 2;
1055 break;
1056 case I2C_SMBUS_BLOCK_DATA:
1057 case I2C_SMBUS_BLOCK_PROC_CALL:
1058 f7_msg->count = 1;
1059 cr2 |= STM32F7_I2C_CR2_RELOAD;
1060 break;
1061 }
1062
1063 f7_msg->buf = f7_msg->smbus_buf;
1064 f7_msg->stop = true;
1065
1066 /* Add one byte for PEC if needed */
1067 if (cr1 & STM32F7_I2C_CR1_PECEN)
1068 f7_msg->count++;
1069
1070 /* Set number of bytes to be transferred */
1071 cr2 &= ~(STM32F7_I2C_CR2_NBYTES_MASK);
1072 cr2 |= STM32F7_I2C_CR2_NBYTES(f7_msg->count);
1073
1074 /*
1075 * Configure RX/TX interrupt:
1076 */
1077 cr1 &= ~(STM32F7_I2C_CR1_RXIE | STM32F7_I2C_CR1_TXIE);
1078 cr1 |= STM32F7_I2C_CR1_RXIE;
1079
1080 /*
1081 * Configure DMA or enable RX/TX interrupt:
1082 * For I2C_SMBUS_BLOCK_DATA and I2C_SMBUS_BLOCK_PROC_CALL we don't use
1083 * dma as we don't know in advance how many data will be received
1084 */
1085 cr1 &= ~(STM32F7_I2C_CR1_RXIE | STM32F7_I2C_CR1_TXIE |
1086 STM32F7_I2C_CR1_RXDMAEN | STM32F7_I2C_CR1_TXDMAEN);
1087
1088 i2c_dev->use_dma = false;
1089 if (i2c_dev->dma && f7_msg->count >= STM32F7_I2C_DMA_LEN_MIN &&
1090 f7_msg->size != I2C_SMBUS_BLOCK_DATA &&
1091 f7_msg->size != I2C_SMBUS_BLOCK_PROC_CALL) {
1092 ret = stm32_i2c_prep_dma_xfer(i2c_dev->dev, i2c_dev->dma,
1093 cr2 & STM32F7_I2C_CR2_RD_WRN,
1094 f7_msg->count, f7_msg->buf,
1095 stm32f7_i2c_dma_callback,
1096 i2c_dev);
1097
1098 if (!ret)
1099 i2c_dev->use_dma = true;
1100 else
1101 dev_warn(i2c_dev->dev, "can't use DMA\n");
1102 }
1103
1104 if (!i2c_dev->use_dma)
1105 cr1 |= STM32F7_I2C_CR1_RXIE;
1106 else
1107 cr1 |= STM32F7_I2C_CR1_RXDMAEN;
1108
1109 /* Configure Repeated Start */
1110 cr2 |= STM32F7_I2C_CR2_START;
1111
1112 /* Write configurations registers */
1113 writel_relaxed(cr1, base + STM32F7_I2C_CR1);
1114 writel_relaxed(cr2, base + STM32F7_I2C_CR2);
1115}
1116
1117static int stm32f7_i2c_smbus_check_pec(struct stm32f7_i2c_dev *i2c_dev)
1118{
1119 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
1120 u8 count, internal_pec, received_pec;
1121
1122 internal_pec = readl_relaxed(i2c_dev->base + STM32F7_I2C_PECR);
1123
1124 switch (f7_msg->size) {
1125 case I2C_SMBUS_BYTE:
1126 case I2C_SMBUS_BYTE_DATA:
1127 received_pec = f7_msg->smbus_buf[1];
1128 break;
1129 case I2C_SMBUS_WORD_DATA:
1130 case I2C_SMBUS_PROC_CALL:
1131 received_pec = f7_msg->smbus_buf[2];
1132 break;
1133 case I2C_SMBUS_BLOCK_DATA:
1134 case I2C_SMBUS_BLOCK_PROC_CALL:
1135 count = f7_msg->smbus_buf[0];
1136 received_pec = f7_msg->smbus_buf[count];
1137 break;
1138 default:
1139 dev_err(i2c_dev->dev, "Unsupported smbus protocol for PEC\n");
1140 return -EINVAL;
1141 }
1142
1143 if (internal_pec != received_pec) {
1144 dev_err(i2c_dev->dev, "Bad PEC 0x%02x vs. 0x%02x\n",
1145 internal_pec, received_pec);
1146 return -EBADMSG;
1147 }
1148
1149 return 0;
1150}
1151
1152static bool stm32f7_i2c_is_addr_match(struct i2c_client *slave, u32 addcode)
1153{
1154 u32 addr;
1155
1156 if (!slave)
1157 return false;
1158
1159 if (slave->flags & I2C_CLIENT_TEN) {
1160 /*
1161 * For 10-bit addr, addcode = 11110XY with
1162 * X = Bit 9 of slave address
1163 * Y = Bit 8 of slave address
1164 */
1165 addr = slave->addr >> 8;
1166 addr |= 0x78;
1167 if (addr == addcode)
1168 return true;
1169 } else {
1170 addr = slave->addr & 0x7f;
1171 if (addr == addcode)
1172 return true;
1173 }
1174
1175 return false;
1176}
1177
1178static void stm32f7_i2c_slave_start(struct stm32f7_i2c_dev *i2c_dev)
1179{
1180 struct i2c_client *slave = i2c_dev->slave_running;
1181 void __iomem *base = i2c_dev->base;
1182 u32 mask;
1183 u8 value = 0;
1184
1185 if (i2c_dev->slave_dir) {
1186 /* Notify i2c slave that new read transfer is starting */
1187 i2c_slave_event(slave, I2C_SLAVE_READ_REQUESTED, &value);
1188
1189 /*
1190 * Disable slave TX config in case of I2C combined message
1191 * (I2C Write followed by I2C Read)
1192 */
1193 mask = STM32F7_I2C_CR2_RELOAD;
1194 stm32f7_i2c_clr_bits(base + STM32F7_I2C_CR2, mask);
1195 mask = STM32F7_I2C_CR1_SBC | STM32F7_I2C_CR1_RXIE |
1196 STM32F7_I2C_CR1_TCIE;
1197 stm32f7_i2c_clr_bits(base + STM32F7_I2C_CR1, mask);
1198
1199 /* Enable TX empty, STOP, NACK interrupts */
1200 mask = STM32F7_I2C_CR1_STOPIE | STM32F7_I2C_CR1_NACKIE |
1201 STM32F7_I2C_CR1_TXIE;
1202 stm32f7_i2c_set_bits(base + STM32F7_I2C_CR1, mask);
1203
David Brazdil0f672f62019-12-10 10:32:29 +00001204 /* Write 1st data byte */
1205 writel_relaxed(value, base + STM32F7_I2C_TXDR);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001206 } else {
1207 /* Notify i2c slave that new write transfer is starting */
1208 i2c_slave_event(slave, I2C_SLAVE_WRITE_REQUESTED, &value);
1209
1210 /* Set reload mode to be able to ACK/NACK each received byte */
1211 mask = STM32F7_I2C_CR2_RELOAD;
1212 stm32f7_i2c_set_bits(base + STM32F7_I2C_CR2, mask);
1213
1214 /*
1215 * Set STOP, NACK, RX empty and transfer complete interrupts.*
1216 * Set Slave Byte Control to be able to ACK/NACK each data
1217 * byte received
1218 */
1219 mask = STM32F7_I2C_CR1_STOPIE | STM32F7_I2C_CR1_NACKIE |
1220 STM32F7_I2C_CR1_SBC | STM32F7_I2C_CR1_RXIE |
1221 STM32F7_I2C_CR1_TCIE;
1222 stm32f7_i2c_set_bits(base + STM32F7_I2C_CR1, mask);
1223 }
1224}
1225
1226static void stm32f7_i2c_slave_addr(struct stm32f7_i2c_dev *i2c_dev)
1227{
1228 void __iomem *base = i2c_dev->base;
1229 u32 isr, addcode, dir, mask;
1230 int i;
1231
1232 isr = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
1233 addcode = STM32F7_I2C_ISR_ADDCODE_GET(isr);
1234 dir = isr & STM32F7_I2C_ISR_DIR;
1235
1236 for (i = 0; i < STM32F7_I2C_MAX_SLAVE; i++) {
1237 if (stm32f7_i2c_is_addr_match(i2c_dev->slave[i], addcode)) {
1238 i2c_dev->slave_running = i2c_dev->slave[i];
1239 i2c_dev->slave_dir = dir;
1240
1241 /* Start I2C slave processing */
1242 stm32f7_i2c_slave_start(i2c_dev);
1243
1244 /* Clear ADDR flag */
1245 mask = STM32F7_I2C_ICR_ADDRCF;
1246 writel_relaxed(mask, base + STM32F7_I2C_ICR);
1247 break;
1248 }
1249 }
1250}
1251
1252static int stm32f7_i2c_get_slave_id(struct stm32f7_i2c_dev *i2c_dev,
1253 struct i2c_client *slave, int *id)
1254{
1255 int i;
1256
1257 for (i = 0; i < STM32F7_I2C_MAX_SLAVE; i++) {
1258 if (i2c_dev->slave[i] == slave) {
1259 *id = i;
1260 return 0;
1261 }
1262 }
1263
1264 dev_err(i2c_dev->dev, "Slave 0x%x not registered\n", slave->addr);
1265
1266 return -ENODEV;
1267}
1268
1269static int stm32f7_i2c_get_free_slave_id(struct stm32f7_i2c_dev *i2c_dev,
1270 struct i2c_client *slave, int *id)
1271{
1272 struct device *dev = i2c_dev->dev;
1273 int i;
1274
1275 /*
1276 * slave[0] supports 7-bit and 10-bit slave address
1277 * slave[1] supports 7-bit slave address only
1278 */
Olivier Deprez0e641232021-09-23 10:07:05 +02001279 for (i = STM32F7_I2C_MAX_SLAVE - 1; i >= 0; i--) {
1280 if (i == 1 && (slave->flags & I2C_CLIENT_TEN))
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001281 continue;
1282 if (!i2c_dev->slave[i]) {
1283 *id = i;
1284 return 0;
1285 }
1286 }
1287
1288 dev_err(dev, "Slave 0x%x could not be registered\n", slave->addr);
1289
1290 return -EINVAL;
1291}
1292
1293static bool stm32f7_i2c_is_slave_registered(struct stm32f7_i2c_dev *i2c_dev)
1294{
1295 int i;
1296
1297 for (i = 0; i < STM32F7_I2C_MAX_SLAVE; i++) {
1298 if (i2c_dev->slave[i])
1299 return true;
1300 }
1301
1302 return false;
1303}
1304
1305static bool stm32f7_i2c_is_slave_busy(struct stm32f7_i2c_dev *i2c_dev)
1306{
1307 int i, busy;
1308
1309 busy = 0;
1310 for (i = 0; i < STM32F7_I2C_MAX_SLAVE; i++) {
1311 if (i2c_dev->slave[i])
1312 busy++;
1313 }
1314
1315 return i == busy;
1316}
1317
1318static irqreturn_t stm32f7_i2c_slave_isr_event(struct stm32f7_i2c_dev *i2c_dev)
1319{
1320 void __iomem *base = i2c_dev->base;
1321 u32 cr2, status, mask;
1322 u8 val;
1323 int ret;
1324
1325 status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
1326
1327 /* Slave transmitter mode */
1328 if (status & STM32F7_I2C_ISR_TXIS) {
1329 i2c_slave_event(i2c_dev->slave_running,
1330 I2C_SLAVE_READ_PROCESSED,
1331 &val);
1332
1333 /* Write data byte */
1334 writel_relaxed(val, base + STM32F7_I2C_TXDR);
1335 }
1336
1337 /* Transfer Complete Reload for Slave receiver mode */
1338 if (status & STM32F7_I2C_ISR_TCR || status & STM32F7_I2C_ISR_RXNE) {
1339 /*
1340 * Read data byte then set NBYTES to receive next byte or NACK
1341 * the current received byte
1342 */
1343 val = readb_relaxed(i2c_dev->base + STM32F7_I2C_RXDR);
1344 ret = i2c_slave_event(i2c_dev->slave_running,
1345 I2C_SLAVE_WRITE_RECEIVED,
1346 &val);
1347 if (!ret) {
1348 cr2 = readl_relaxed(i2c_dev->base + STM32F7_I2C_CR2);
1349 cr2 |= STM32F7_I2C_CR2_NBYTES(1);
1350 writel_relaxed(cr2, i2c_dev->base + STM32F7_I2C_CR2);
1351 } else {
1352 mask = STM32F7_I2C_CR2_NACK;
1353 stm32f7_i2c_set_bits(base + STM32F7_I2C_CR2, mask);
1354 }
1355 }
1356
1357 /* NACK received */
1358 if (status & STM32F7_I2C_ISR_NACKF) {
1359 dev_dbg(i2c_dev->dev, "<%s>: Receive NACK\n", __func__);
1360 writel_relaxed(STM32F7_I2C_ICR_NACKCF, base + STM32F7_I2C_ICR);
1361 }
1362
1363 /* STOP received */
1364 if (status & STM32F7_I2C_ISR_STOPF) {
1365 /* Disable interrupts */
1366 stm32f7_i2c_disable_irq(i2c_dev, STM32F7_I2C_XFER_IRQ_MASK);
1367
1368 if (i2c_dev->slave_dir) {
1369 /*
1370 * Flush TX buffer in order to not used the byte in
1371 * TXDR for the next transfer
1372 */
1373 mask = STM32F7_I2C_ISR_TXE;
1374 stm32f7_i2c_set_bits(base + STM32F7_I2C_ISR, mask);
1375 }
1376
1377 /* Clear STOP flag */
1378 writel_relaxed(STM32F7_I2C_ICR_STOPCF, base + STM32F7_I2C_ICR);
1379
1380 /* Notify i2c slave that a STOP flag has been detected */
1381 i2c_slave_event(i2c_dev->slave_running, I2C_SLAVE_STOP, &val);
1382
1383 i2c_dev->slave_running = NULL;
1384 }
1385
1386 /* Address match received */
1387 if (status & STM32F7_I2C_ISR_ADDR)
1388 stm32f7_i2c_slave_addr(i2c_dev);
1389
1390 return IRQ_HANDLED;
1391}
1392
1393static irqreturn_t stm32f7_i2c_isr_event(int irq, void *data)
1394{
1395 struct stm32f7_i2c_dev *i2c_dev = data;
1396 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
1397 void __iomem *base = i2c_dev->base;
1398 u32 status, mask;
1399 int ret = IRQ_HANDLED;
1400
1401 /* Check if the interrupt if for a slave device */
1402 if (!i2c_dev->master_mode) {
1403 ret = stm32f7_i2c_slave_isr_event(i2c_dev);
1404 return ret;
1405 }
1406
1407 status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
1408
1409 /* Tx empty */
1410 if (status & STM32F7_I2C_ISR_TXIS)
1411 stm32f7_i2c_write_tx_data(i2c_dev);
1412
1413 /* RX not empty */
1414 if (status & STM32F7_I2C_ISR_RXNE)
1415 stm32f7_i2c_read_rx_data(i2c_dev);
1416
1417 /* NACK received */
1418 if (status & STM32F7_I2C_ISR_NACKF) {
1419 dev_dbg(i2c_dev->dev, "<%s>: Receive NACK\n", __func__);
1420 writel_relaxed(STM32F7_I2C_ICR_NACKCF, base + STM32F7_I2C_ICR);
1421 f7_msg->result = -ENXIO;
1422 }
1423
1424 /* STOP detection flag */
1425 if (status & STM32F7_I2C_ISR_STOPF) {
1426 /* Disable interrupts */
1427 if (stm32f7_i2c_is_slave_registered(i2c_dev))
1428 mask = STM32F7_I2C_XFER_IRQ_MASK;
1429 else
1430 mask = STM32F7_I2C_ALL_IRQ_MASK;
1431 stm32f7_i2c_disable_irq(i2c_dev, mask);
1432
1433 /* Clear STOP flag */
1434 writel_relaxed(STM32F7_I2C_ICR_STOPCF, base + STM32F7_I2C_ICR);
1435
1436 if (i2c_dev->use_dma) {
1437 ret = IRQ_WAKE_THREAD;
1438 } else {
1439 i2c_dev->master_mode = false;
1440 complete(&i2c_dev->complete);
1441 }
1442 }
1443
1444 /* Transfer complete */
1445 if (status & STM32F7_I2C_ISR_TC) {
1446 if (f7_msg->stop) {
1447 mask = STM32F7_I2C_CR2_STOP;
1448 stm32f7_i2c_set_bits(base + STM32F7_I2C_CR2, mask);
1449 } else if (i2c_dev->use_dma) {
1450 ret = IRQ_WAKE_THREAD;
1451 } else if (f7_msg->smbus) {
1452 stm32f7_i2c_smbus_rep_start(i2c_dev);
1453 } else {
1454 i2c_dev->msg_id++;
1455 i2c_dev->msg++;
1456 stm32f7_i2c_xfer_msg(i2c_dev, i2c_dev->msg);
1457 }
1458 }
1459
1460 if (status & STM32F7_I2C_ISR_TCR) {
1461 if (f7_msg->smbus)
1462 stm32f7_i2c_smbus_reload(i2c_dev);
1463 else
1464 stm32f7_i2c_reload(i2c_dev);
1465 }
1466
1467 return ret;
1468}
1469
1470static irqreturn_t stm32f7_i2c_isr_event_thread(int irq, void *data)
1471{
1472 struct stm32f7_i2c_dev *i2c_dev = data;
1473 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
1474 struct stm32_i2c_dma *dma = i2c_dev->dma;
1475 u32 status;
1476 int ret;
1477
1478 /*
1479 * Wait for dma transfer completion before sending next message or
1480 * notity the end of xfer to the client
1481 */
1482 ret = wait_for_completion_timeout(&i2c_dev->dma->dma_complete, HZ);
1483 if (!ret) {
1484 dev_dbg(i2c_dev->dev, "<%s>: Timed out\n", __func__);
1485 stm32f7_i2c_disable_dma_req(i2c_dev);
1486 dmaengine_terminate_all(dma->chan_using);
1487 f7_msg->result = -ETIMEDOUT;
1488 }
1489
1490 status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
1491
1492 if (status & STM32F7_I2C_ISR_TC) {
1493 if (f7_msg->smbus) {
1494 stm32f7_i2c_smbus_rep_start(i2c_dev);
1495 } else {
1496 i2c_dev->msg_id++;
1497 i2c_dev->msg++;
1498 stm32f7_i2c_xfer_msg(i2c_dev, i2c_dev->msg);
1499 }
1500 } else {
1501 i2c_dev->master_mode = false;
1502 complete(&i2c_dev->complete);
1503 }
1504
1505 return IRQ_HANDLED;
1506}
1507
1508static irqreturn_t stm32f7_i2c_isr_error(int irq, void *data)
1509{
1510 struct stm32f7_i2c_dev *i2c_dev = data;
1511 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
1512 void __iomem *base = i2c_dev->base;
1513 struct device *dev = i2c_dev->dev;
1514 struct stm32_i2c_dma *dma = i2c_dev->dma;
David Brazdil0f672f62019-12-10 10:32:29 +00001515 u32 status;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001516
1517 status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
1518
1519 /* Bus error */
1520 if (status & STM32F7_I2C_ISR_BERR) {
1521 dev_err(dev, "<%s>: Bus error\n", __func__);
1522 writel_relaxed(STM32F7_I2C_ICR_BERRCF, base + STM32F7_I2C_ICR);
1523 stm32f7_i2c_release_bus(&i2c_dev->adap);
1524 f7_msg->result = -EIO;
1525 }
1526
1527 /* Arbitration loss */
1528 if (status & STM32F7_I2C_ISR_ARLO) {
1529 dev_dbg(dev, "<%s>: Arbitration loss\n", __func__);
1530 writel_relaxed(STM32F7_I2C_ICR_ARLOCF, base + STM32F7_I2C_ICR);
1531 f7_msg->result = -EAGAIN;
1532 }
1533
1534 if (status & STM32F7_I2C_ISR_PECERR) {
1535 dev_err(dev, "<%s>: PEC error in reception\n", __func__);
1536 writel_relaxed(STM32F7_I2C_ICR_PECCF, base + STM32F7_I2C_ICR);
1537 f7_msg->result = -EINVAL;
1538 }
1539
David Brazdil0f672f62019-12-10 10:32:29 +00001540 if (!i2c_dev->slave_running) {
1541 u32 mask;
1542 /* Disable interrupts */
1543 if (stm32f7_i2c_is_slave_registered(i2c_dev))
1544 mask = STM32F7_I2C_XFER_IRQ_MASK;
1545 else
1546 mask = STM32F7_I2C_ALL_IRQ_MASK;
1547 stm32f7_i2c_disable_irq(i2c_dev, mask);
1548 }
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001549
1550 /* Disable dma */
1551 if (i2c_dev->use_dma) {
1552 stm32f7_i2c_disable_dma_req(i2c_dev);
1553 dmaengine_terminate_all(dma->chan_using);
1554 }
1555
1556 i2c_dev->master_mode = false;
1557 complete(&i2c_dev->complete);
1558
1559 return IRQ_HANDLED;
1560}
1561
1562static int stm32f7_i2c_xfer(struct i2c_adapter *i2c_adap,
1563 struct i2c_msg msgs[], int num)
1564{
1565 struct stm32f7_i2c_dev *i2c_dev = i2c_get_adapdata(i2c_adap);
1566 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
1567 struct stm32_i2c_dma *dma = i2c_dev->dma;
1568 unsigned long time_left;
1569 int ret;
1570
1571 i2c_dev->msg = msgs;
1572 i2c_dev->msg_num = num;
1573 i2c_dev->msg_id = 0;
1574 f7_msg->smbus = false;
1575
David Brazdil0f672f62019-12-10 10:32:29 +00001576 ret = pm_runtime_get_sync(i2c_dev->dev);
1577 if (ret < 0)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001578 return ret;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001579
1580 ret = stm32f7_i2c_wait_free_bus(i2c_dev);
1581 if (ret)
David Brazdil0f672f62019-12-10 10:32:29 +00001582 goto pm_free;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001583
1584 stm32f7_i2c_xfer_msg(i2c_dev, msgs);
1585
1586 time_left = wait_for_completion_timeout(&i2c_dev->complete,
1587 i2c_dev->adap.timeout);
1588 ret = f7_msg->result;
1589
1590 if (!time_left) {
1591 dev_dbg(i2c_dev->dev, "Access to slave 0x%x timed out\n",
1592 i2c_dev->msg->addr);
1593 if (i2c_dev->use_dma)
1594 dmaengine_terminate_all(dma->chan_using);
1595 ret = -ETIMEDOUT;
1596 }
1597
David Brazdil0f672f62019-12-10 10:32:29 +00001598pm_free:
1599 pm_runtime_mark_last_busy(i2c_dev->dev);
1600 pm_runtime_put_autosuspend(i2c_dev->dev);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001601
1602 return (ret < 0) ? ret : num;
1603}
1604
1605static int stm32f7_i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
1606 unsigned short flags, char read_write,
1607 u8 command, int size,
1608 union i2c_smbus_data *data)
1609{
1610 struct stm32f7_i2c_dev *i2c_dev = i2c_get_adapdata(adapter);
1611 struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
1612 struct stm32_i2c_dma *dma = i2c_dev->dma;
1613 struct device *dev = i2c_dev->dev;
1614 unsigned long timeout;
1615 int i, ret;
1616
1617 f7_msg->addr = addr;
1618 f7_msg->size = size;
1619 f7_msg->read_write = read_write;
1620 f7_msg->smbus = true;
1621
David Brazdil0f672f62019-12-10 10:32:29 +00001622 ret = pm_runtime_get_sync(dev);
1623 if (ret < 0)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001624 return ret;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001625
1626 ret = stm32f7_i2c_wait_free_bus(i2c_dev);
1627 if (ret)
David Brazdil0f672f62019-12-10 10:32:29 +00001628 goto pm_free;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001629
1630 ret = stm32f7_i2c_smbus_xfer_msg(i2c_dev, flags, command, data);
1631 if (ret)
David Brazdil0f672f62019-12-10 10:32:29 +00001632 goto pm_free;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001633
1634 timeout = wait_for_completion_timeout(&i2c_dev->complete,
1635 i2c_dev->adap.timeout);
1636 ret = f7_msg->result;
1637 if (ret)
David Brazdil0f672f62019-12-10 10:32:29 +00001638 goto pm_free;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001639
1640 if (!timeout) {
1641 dev_dbg(dev, "Access to slave 0x%x timed out\n", f7_msg->addr);
1642 if (i2c_dev->use_dma)
1643 dmaengine_terminate_all(dma->chan_using);
1644 ret = -ETIMEDOUT;
David Brazdil0f672f62019-12-10 10:32:29 +00001645 goto pm_free;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001646 }
1647
1648 /* Check PEC */
1649 if ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK && read_write) {
1650 ret = stm32f7_i2c_smbus_check_pec(i2c_dev);
1651 if (ret)
David Brazdil0f672f62019-12-10 10:32:29 +00001652 goto pm_free;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001653 }
1654
1655 if (read_write && size != I2C_SMBUS_QUICK) {
1656 switch (size) {
1657 case I2C_SMBUS_BYTE:
1658 case I2C_SMBUS_BYTE_DATA:
1659 data->byte = f7_msg->smbus_buf[0];
1660 break;
1661 case I2C_SMBUS_WORD_DATA:
1662 case I2C_SMBUS_PROC_CALL:
1663 data->word = f7_msg->smbus_buf[0] |
1664 (f7_msg->smbus_buf[1] << 8);
1665 break;
1666 case I2C_SMBUS_BLOCK_DATA:
1667 case I2C_SMBUS_BLOCK_PROC_CALL:
1668 for (i = 0; i <= f7_msg->smbus_buf[0]; i++)
1669 data->block[i] = f7_msg->smbus_buf[i];
1670 break;
1671 default:
1672 dev_err(dev, "Unsupported smbus transaction\n");
1673 ret = -EINVAL;
1674 }
1675 }
1676
David Brazdil0f672f62019-12-10 10:32:29 +00001677pm_free:
1678 pm_runtime_mark_last_busy(dev);
1679 pm_runtime_put_autosuspend(dev);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001680 return ret;
1681}
1682
1683static int stm32f7_i2c_reg_slave(struct i2c_client *slave)
1684{
1685 struct stm32f7_i2c_dev *i2c_dev = i2c_get_adapdata(slave->adapter);
1686 void __iomem *base = i2c_dev->base;
1687 struct device *dev = i2c_dev->dev;
1688 u32 oar1, oar2, mask;
1689 int id, ret;
1690
1691 if (slave->flags & I2C_CLIENT_PEC) {
1692 dev_err(dev, "SMBus PEC not supported in slave mode\n");
1693 return -EINVAL;
1694 }
1695
1696 if (stm32f7_i2c_is_slave_busy(i2c_dev)) {
1697 dev_err(dev, "Too much slave registered\n");
1698 return -EBUSY;
1699 }
1700
1701 ret = stm32f7_i2c_get_free_slave_id(i2c_dev, slave, &id);
1702 if (ret)
1703 return ret;
1704
David Brazdil0f672f62019-12-10 10:32:29 +00001705 ret = pm_runtime_get_sync(dev);
1706 if (ret < 0)
1707 return ret;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001708
1709 if (id == 0) {
1710 /* Configure Own Address 1 */
1711 oar1 = readl_relaxed(i2c_dev->base + STM32F7_I2C_OAR1);
1712 oar1 &= ~STM32F7_I2C_OAR1_MASK;
1713 if (slave->flags & I2C_CLIENT_TEN) {
1714 oar1 |= STM32F7_I2C_OAR1_OA1_10(slave->addr);
1715 oar1 |= STM32F7_I2C_OAR1_OA1MODE;
1716 } else {
1717 oar1 |= STM32F7_I2C_OAR1_OA1_7(slave->addr);
1718 }
1719 oar1 |= STM32F7_I2C_OAR1_OA1EN;
1720 i2c_dev->slave[id] = slave;
1721 writel_relaxed(oar1, i2c_dev->base + STM32F7_I2C_OAR1);
1722 } else if (id == 1) {
1723 /* Configure Own Address 2 */
1724 oar2 = readl_relaxed(i2c_dev->base + STM32F7_I2C_OAR2);
1725 oar2 &= ~STM32F7_I2C_OAR2_MASK;
1726 if (slave->flags & I2C_CLIENT_TEN) {
1727 ret = -EOPNOTSUPP;
David Brazdil0f672f62019-12-10 10:32:29 +00001728 goto pm_free;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001729 }
1730
1731 oar2 |= STM32F7_I2C_OAR2_OA2_7(slave->addr);
1732 oar2 |= STM32F7_I2C_OAR2_OA2EN;
1733 i2c_dev->slave[id] = slave;
1734 writel_relaxed(oar2, i2c_dev->base + STM32F7_I2C_OAR2);
1735 } else {
1736 ret = -ENODEV;
David Brazdil0f672f62019-12-10 10:32:29 +00001737 goto pm_free;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001738 }
1739
1740 /* Enable ACK */
1741 stm32f7_i2c_clr_bits(base + STM32F7_I2C_CR2, STM32F7_I2C_CR2_NACK);
1742
1743 /* Enable Address match interrupt, error interrupt and enable I2C */
1744 mask = STM32F7_I2C_CR1_ADDRIE | STM32F7_I2C_CR1_ERRIE |
1745 STM32F7_I2C_CR1_PE;
1746 stm32f7_i2c_set_bits(base + STM32F7_I2C_CR1, mask);
1747
David Brazdil0f672f62019-12-10 10:32:29 +00001748 ret = 0;
1749pm_free:
1750 pm_runtime_mark_last_busy(dev);
1751 pm_runtime_put_autosuspend(dev);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001752
1753 return ret;
1754}
1755
1756static int stm32f7_i2c_unreg_slave(struct i2c_client *slave)
1757{
1758 struct stm32f7_i2c_dev *i2c_dev = i2c_get_adapdata(slave->adapter);
1759 void __iomem *base = i2c_dev->base;
1760 u32 mask;
1761 int id, ret;
1762
1763 ret = stm32f7_i2c_get_slave_id(i2c_dev, slave, &id);
1764 if (ret)
1765 return ret;
1766
1767 WARN_ON(!i2c_dev->slave[id]);
1768
David Brazdil0f672f62019-12-10 10:32:29 +00001769 ret = pm_runtime_get_sync(i2c_dev->dev);
1770 if (ret < 0)
1771 return ret;
1772
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001773 if (id == 0) {
1774 mask = STM32F7_I2C_OAR1_OA1EN;
1775 stm32f7_i2c_clr_bits(base + STM32F7_I2C_OAR1, mask);
1776 } else {
1777 mask = STM32F7_I2C_OAR2_OA2EN;
1778 stm32f7_i2c_clr_bits(base + STM32F7_I2C_OAR2, mask);
1779 }
1780
1781 i2c_dev->slave[id] = NULL;
1782
David Brazdil0f672f62019-12-10 10:32:29 +00001783 if (!(stm32f7_i2c_is_slave_registered(i2c_dev)))
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001784 stm32f7_i2c_disable_irq(i2c_dev, STM32F7_I2C_ALL_IRQ_MASK);
David Brazdil0f672f62019-12-10 10:32:29 +00001785
1786 pm_runtime_mark_last_busy(i2c_dev->dev);
1787 pm_runtime_put_autosuspend(i2c_dev->dev);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001788
1789 return 0;
1790}
1791
David Brazdil0f672f62019-12-10 10:32:29 +00001792static int stm32f7_i2c_setup_fm_plus_bits(struct platform_device *pdev,
1793 struct stm32f7_i2c_dev *i2c_dev)
1794{
1795 struct device_node *np = pdev->dev.of_node;
1796 int ret;
1797 u32 reg, mask;
1798
1799 i2c_dev->regmap = syscon_regmap_lookup_by_phandle(np, "st,syscfg-fmp");
1800 if (IS_ERR(i2c_dev->regmap)) {
1801 /* Optional */
1802 return 0;
1803 }
1804
1805 ret = of_property_read_u32_index(np, "st,syscfg-fmp", 1, &reg);
1806 if (ret)
1807 return ret;
1808
1809 ret = of_property_read_u32_index(np, "st,syscfg-fmp", 2, &mask);
1810 if (ret)
1811 return ret;
1812
1813 return regmap_update_bits(i2c_dev->regmap, reg, mask, mask);
1814}
1815
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001816static u32 stm32f7_i2c_func(struct i2c_adapter *adap)
1817{
1818 return I2C_FUNC_I2C | I2C_FUNC_10BIT_ADDR | I2C_FUNC_SLAVE |
1819 I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
1820 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
1821 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
David Brazdil0f672f62019-12-10 10:32:29 +00001822 I2C_FUNC_SMBUS_PROC_CALL | I2C_FUNC_SMBUS_PEC |
1823 I2C_FUNC_SMBUS_I2C_BLOCK;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001824}
1825
David Brazdil0f672f62019-12-10 10:32:29 +00001826static const struct i2c_algorithm stm32f7_i2c_algo = {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001827 .master_xfer = stm32f7_i2c_xfer,
1828 .smbus_xfer = stm32f7_i2c_smbus_xfer,
1829 .functionality = stm32f7_i2c_func,
1830 .reg_slave = stm32f7_i2c_reg_slave,
1831 .unreg_slave = stm32f7_i2c_unreg_slave,
1832};
1833
1834static int stm32f7_i2c_probe(struct platform_device *pdev)
1835{
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001836 struct stm32f7_i2c_dev *i2c_dev;
1837 const struct stm32f7_i2c_setup *setup;
1838 struct resource *res;
David Brazdil0f672f62019-12-10 10:32:29 +00001839 u32 clk_rate, rise_time, fall_time;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001840 struct i2c_adapter *adap;
1841 struct reset_control *rst;
1842 dma_addr_t phy_addr;
David Brazdil0f672f62019-12-10 10:32:29 +00001843 int irq_error, irq_event, ret;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001844
1845 i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL);
1846 if (!i2c_dev)
1847 return -ENOMEM;
1848
1849 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1850 i2c_dev->base = devm_ioremap_resource(&pdev->dev, res);
1851 if (IS_ERR(i2c_dev->base))
1852 return PTR_ERR(i2c_dev->base);
1853 phy_addr = (dma_addr_t)res->start;
1854
David Brazdil0f672f62019-12-10 10:32:29 +00001855 irq_event = platform_get_irq(pdev, 0);
1856 if (irq_event <= 0) {
1857 if (irq_event != -EPROBE_DEFER)
1858 dev_err(&pdev->dev, "Failed to get IRQ event: %d\n",
1859 irq_event);
1860 return irq_event ? : -ENOENT;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001861 }
1862
David Brazdil0f672f62019-12-10 10:32:29 +00001863 irq_error = platform_get_irq(pdev, 1);
1864 if (irq_error <= 0) {
1865 if (irq_error != -EPROBE_DEFER)
1866 dev_err(&pdev->dev, "Failed to get IRQ error: %d\n",
1867 irq_error);
1868 return irq_error ? : -ENOENT;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001869 }
1870
1871 i2c_dev->clk = devm_clk_get(&pdev->dev, NULL);
1872 if (IS_ERR(i2c_dev->clk)) {
1873 dev_err(&pdev->dev, "Error: Missing controller clock\n");
1874 return PTR_ERR(i2c_dev->clk);
1875 }
David Brazdil0f672f62019-12-10 10:32:29 +00001876
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001877 ret = clk_prepare_enable(i2c_dev->clk);
1878 if (ret) {
1879 dev_err(&pdev->dev, "Failed to prepare_enable clock\n");
1880 return ret;
1881 }
1882
1883 i2c_dev->speed = STM32_I2C_SPEED_STANDARD;
1884 ret = device_property_read_u32(&pdev->dev, "clock-frequency",
1885 &clk_rate);
David Brazdil0f672f62019-12-10 10:32:29 +00001886 if (!ret && clk_rate >= 1000000) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001887 i2c_dev->speed = STM32_I2C_SPEED_FAST_PLUS;
David Brazdil0f672f62019-12-10 10:32:29 +00001888 ret = stm32f7_i2c_setup_fm_plus_bits(pdev, i2c_dev);
1889 if (ret)
1890 goto clk_free;
1891 } else if (!ret && clk_rate >= 400000) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001892 i2c_dev->speed = STM32_I2C_SPEED_FAST;
David Brazdil0f672f62019-12-10 10:32:29 +00001893 } else if (!ret && clk_rate >= 100000) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001894 i2c_dev->speed = STM32_I2C_SPEED_STANDARD;
David Brazdil0f672f62019-12-10 10:32:29 +00001895 }
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001896
1897 rst = devm_reset_control_get(&pdev->dev, NULL);
1898 if (IS_ERR(rst)) {
1899 dev_err(&pdev->dev, "Error: Missing controller reset\n");
1900 ret = PTR_ERR(rst);
1901 goto clk_free;
1902 }
1903 reset_control_assert(rst);
1904 udelay(2);
1905 reset_control_deassert(rst);
1906
1907 i2c_dev->dev = &pdev->dev;
1908
1909 ret = devm_request_threaded_irq(&pdev->dev, irq_event,
1910 stm32f7_i2c_isr_event,
1911 stm32f7_i2c_isr_event_thread,
1912 IRQF_ONESHOT,
1913 pdev->name, i2c_dev);
1914 if (ret) {
1915 dev_err(&pdev->dev, "Failed to request irq event %i\n",
1916 irq_event);
1917 goto clk_free;
1918 }
1919
1920 ret = devm_request_irq(&pdev->dev, irq_error, stm32f7_i2c_isr_error, 0,
1921 pdev->name, i2c_dev);
1922 if (ret) {
1923 dev_err(&pdev->dev, "Failed to request irq error %i\n",
1924 irq_error);
1925 goto clk_free;
1926 }
1927
1928 setup = of_device_get_match_data(&pdev->dev);
1929 if (!setup) {
1930 dev_err(&pdev->dev, "Can't get device data\n");
1931 ret = -ENODEV;
1932 goto clk_free;
1933 }
1934 i2c_dev->setup = *setup;
1935
1936 ret = device_property_read_u32(i2c_dev->dev, "i2c-scl-rising-time-ns",
1937 &rise_time);
1938 if (!ret)
1939 i2c_dev->setup.rise_time = rise_time;
1940
1941 ret = device_property_read_u32(i2c_dev->dev, "i2c-scl-falling-time-ns",
1942 &fall_time);
1943 if (!ret)
1944 i2c_dev->setup.fall_time = fall_time;
1945
1946 ret = stm32f7_i2c_setup_timing(i2c_dev, &i2c_dev->setup);
1947 if (ret)
1948 goto clk_free;
1949
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001950 adap = &i2c_dev->adap;
1951 i2c_set_adapdata(adap, i2c_dev);
1952 snprintf(adap->name, sizeof(adap->name), "STM32F7 I2C(%pa)",
1953 &res->start);
1954 adap->owner = THIS_MODULE;
1955 adap->timeout = 2 * HZ;
1956 adap->retries = 3;
1957 adap->algo = &stm32f7_i2c_algo;
1958 adap->dev.parent = &pdev->dev;
1959 adap->dev.of_node = pdev->dev.of_node;
1960
1961 init_completion(&i2c_dev->complete);
1962
1963 /* Init DMA config if supported */
1964 i2c_dev->dma = stm32_i2c_dma_request(i2c_dev->dev, phy_addr,
1965 STM32F7_I2C_TXDR,
1966 STM32F7_I2C_RXDR);
Olivier Deprez0e641232021-09-23 10:07:05 +02001967 if (PTR_ERR(i2c_dev->dma) == -ENODEV)
1968 i2c_dev->dma = NULL;
1969 else if (IS_ERR(i2c_dev->dma)) {
1970 ret = PTR_ERR(i2c_dev->dma);
1971 if (ret != -EPROBE_DEFER)
1972 dev_err(&pdev->dev,
1973 "Failed to request dma error %i\n", ret);
1974 goto clk_free;
1975 }
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001976
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001977 platform_set_drvdata(pdev, i2c_dev);
1978
David Brazdil0f672f62019-12-10 10:32:29 +00001979 pm_runtime_set_autosuspend_delay(i2c_dev->dev,
1980 STM32F7_AUTOSUSPEND_DELAY);
1981 pm_runtime_use_autosuspend(i2c_dev->dev);
1982 pm_runtime_set_active(i2c_dev->dev);
1983 pm_runtime_enable(i2c_dev->dev);
1984
1985 pm_runtime_get_noresume(&pdev->dev);
1986
1987 stm32f7_i2c_hw_config(i2c_dev);
1988
1989 ret = i2c_add_adapter(adap);
1990 if (ret)
1991 goto pm_disable;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001992
1993 dev_info(i2c_dev->dev, "STM32F7 I2C-%d bus adapter\n", adap->nr);
1994
David Brazdil0f672f62019-12-10 10:32:29 +00001995 pm_runtime_mark_last_busy(i2c_dev->dev);
1996 pm_runtime_put_autosuspend(i2c_dev->dev);
1997
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001998 return 0;
1999
David Brazdil0f672f62019-12-10 10:32:29 +00002000pm_disable:
2001 pm_runtime_put_noidle(i2c_dev->dev);
2002 pm_runtime_disable(i2c_dev->dev);
2003 pm_runtime_set_suspended(i2c_dev->dev);
2004 pm_runtime_dont_use_autosuspend(i2c_dev->dev);
2005
Olivier Deprez0e641232021-09-23 10:07:05 +02002006 if (i2c_dev->dma) {
2007 stm32_i2c_dma_free(i2c_dev->dma);
2008 i2c_dev->dma = NULL;
2009 }
2010
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002011clk_free:
2012 clk_disable_unprepare(i2c_dev->clk);
2013
2014 return ret;
2015}
2016
2017static int stm32f7_i2c_remove(struct platform_device *pdev)
2018{
2019 struct stm32f7_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
2020
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002021 i2c_del_adapter(&i2c_dev->adap);
David Brazdil0f672f62019-12-10 10:32:29 +00002022 pm_runtime_get_sync(i2c_dev->dev);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002023
David Brazdil0f672f62019-12-10 10:32:29 +00002024 pm_runtime_put_noidle(i2c_dev->dev);
2025 pm_runtime_disable(i2c_dev->dev);
2026 pm_runtime_set_suspended(i2c_dev->dev);
2027 pm_runtime_dont_use_autosuspend(i2c_dev->dev);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002028
Olivier Deprez0e641232021-09-23 10:07:05 +02002029 if (i2c_dev->dma) {
2030 stm32_i2c_dma_free(i2c_dev->dma);
2031 i2c_dev->dma = NULL;
2032 }
2033
2034 clk_disable_unprepare(i2c_dev->clk);
2035
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002036 return 0;
2037}
2038
David Brazdil0f672f62019-12-10 10:32:29 +00002039#ifdef CONFIG_PM
2040static int stm32f7_i2c_runtime_suspend(struct device *dev)
2041{
2042 struct stm32f7_i2c_dev *i2c_dev = dev_get_drvdata(dev);
2043
2044 if (!stm32f7_i2c_is_slave_registered(i2c_dev))
2045 clk_disable_unprepare(i2c_dev->clk);
2046
2047 return 0;
2048}
2049
2050static int stm32f7_i2c_runtime_resume(struct device *dev)
2051{
2052 struct stm32f7_i2c_dev *i2c_dev = dev_get_drvdata(dev);
2053 int ret;
2054
2055 if (!stm32f7_i2c_is_slave_registered(i2c_dev)) {
2056 ret = clk_prepare_enable(i2c_dev->clk);
2057 if (ret) {
2058 dev_err(dev, "failed to prepare_enable clock\n");
2059 return ret;
2060 }
2061 }
2062
2063 return 0;
2064}
2065#endif
2066
2067static const struct dev_pm_ops stm32f7_i2c_pm_ops = {
2068 SET_RUNTIME_PM_OPS(stm32f7_i2c_runtime_suspend,
2069 stm32f7_i2c_runtime_resume, NULL)
2070};
2071
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002072static const struct of_device_id stm32f7_i2c_match[] = {
2073 { .compatible = "st,stm32f7-i2c", .data = &stm32f7_setup},
2074 {},
2075};
2076MODULE_DEVICE_TABLE(of, stm32f7_i2c_match);
2077
2078static struct platform_driver stm32f7_i2c_driver = {
2079 .driver = {
2080 .name = "stm32f7-i2c",
2081 .of_match_table = stm32f7_i2c_match,
David Brazdil0f672f62019-12-10 10:32:29 +00002082 .pm = &stm32f7_i2c_pm_ops,
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002083 },
2084 .probe = stm32f7_i2c_probe,
2085 .remove = stm32f7_i2c_remove,
2086};
2087
2088module_platform_driver(stm32f7_i2c_driver);
2089
2090MODULE_AUTHOR("M'boumba Cedric Madianga <cedric.madianga@gmail.com>");
2091MODULE_DESCRIPTION("STMicroelectronics STM32F7 I2C driver");
2092MODULE_LICENSE("GPL v2");