i2c-stm32f7.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975
  1. // 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>
  24. #include <linux/module.h>
  25. #include <linux/of.h>
  26. #include <linux/of_address.h>
  27. #include <linux/of_irq.h>
  28. #include <linux/of_platform.h>
  29. #include <linux/platform_device.h>
  30. #include <linux/reset.h>
  31. #include <linux/slab.h>
  32. #include "i2c-stm32.h"
  33. /* STM32F7 I2C registers */
  34. #define STM32F7_I2C_CR1 0x00
  35. #define STM32F7_I2C_CR2 0x04
  36. #define STM32F7_I2C_TIMINGR 0x10
  37. #define STM32F7_I2C_ISR 0x18
  38. #define STM32F7_I2C_ICR 0x1C
  39. #define STM32F7_I2C_RXDR 0x24
  40. #define STM32F7_I2C_TXDR 0x28
  41. /* STM32F7 I2C control 1 */
  42. #define STM32F7_I2C_CR1_ANFOFF BIT(12)
  43. #define STM32F7_I2C_CR1_ERRIE BIT(7)
  44. #define STM32F7_I2C_CR1_TCIE BIT(6)
  45. #define STM32F7_I2C_CR1_STOPIE BIT(5)
  46. #define STM32F7_I2C_CR1_NACKIE BIT(4)
  47. #define STM32F7_I2C_CR1_ADDRIE BIT(3)
  48. #define STM32F7_I2C_CR1_RXIE BIT(2)
  49. #define STM32F7_I2C_CR1_TXIE BIT(1)
  50. #define STM32F7_I2C_CR1_PE BIT(0)
  51. #define STM32F7_I2C_ALL_IRQ_MASK (STM32F7_I2C_CR1_ERRIE \
  52. | STM32F7_I2C_CR1_TCIE \
  53. | STM32F7_I2C_CR1_STOPIE \
  54. | STM32F7_I2C_CR1_NACKIE \
  55. | STM32F7_I2C_CR1_RXIE \
  56. | STM32F7_I2C_CR1_TXIE)
  57. /* STM32F7 I2C control 2 */
  58. #define STM32F7_I2C_CR2_RELOAD BIT(24)
  59. #define STM32F7_I2C_CR2_NBYTES_MASK GENMASK(23, 16)
  60. #define STM32F7_I2C_CR2_NBYTES(n) (((n) & 0xff) << 16)
  61. #define STM32F7_I2C_CR2_NACK BIT(15)
  62. #define STM32F7_I2C_CR2_STOP BIT(14)
  63. #define STM32F7_I2C_CR2_START BIT(13)
  64. #define STM32F7_I2C_CR2_RD_WRN BIT(10)
  65. #define STM32F7_I2C_CR2_SADD7_MASK GENMASK(7, 1)
  66. #define STM32F7_I2C_CR2_SADD7(n) (((n) & 0x7f) << 1)
  67. /* STM32F7 I2C Interrupt Status */
  68. #define STM32F7_I2C_ISR_BUSY BIT(15)
  69. #define STM32F7_I2C_ISR_ARLO BIT(9)
  70. #define STM32F7_I2C_ISR_BERR BIT(8)
  71. #define STM32F7_I2C_ISR_TCR BIT(7)
  72. #define STM32F7_I2C_ISR_TC BIT(6)
  73. #define STM32F7_I2C_ISR_STOPF BIT(5)
  74. #define STM32F7_I2C_ISR_NACKF BIT(4)
  75. #define STM32F7_I2C_ISR_RXNE BIT(2)
  76. #define STM32F7_I2C_ISR_TXIS BIT(1)
  77. /* STM32F7 I2C Interrupt Clear */
  78. #define STM32F7_I2C_ICR_ARLOCF BIT(9)
  79. #define STM32F7_I2C_ICR_BERRCF BIT(8)
  80. #define STM32F7_I2C_ICR_STOPCF BIT(5)
  81. #define STM32F7_I2C_ICR_NACKCF BIT(4)
  82. /* STM32F7 I2C Timing */
  83. #define STM32F7_I2C_TIMINGR_PRESC(n) (((n) & 0xf) << 28)
  84. #define STM32F7_I2C_TIMINGR_SCLDEL(n) (((n) & 0xf) << 20)
  85. #define STM32F7_I2C_TIMINGR_SDADEL(n) (((n) & 0xf) << 16)
  86. #define STM32F7_I2C_TIMINGR_SCLH(n) (((n) & 0xff) << 8)
  87. #define STM32F7_I2C_TIMINGR_SCLL(n) ((n) & 0xff)
  88. #define STM32F7_I2C_MAX_LEN 0xff
  89. #define STM32F7_I2C_DNF_DEFAULT 0
  90. #define STM32F7_I2C_DNF_MAX 16
  91. #define STM32F7_I2C_ANALOG_FILTER_ENABLE 1
  92. #define STM32F7_I2C_ANALOG_FILTER_DELAY_MIN 50 /* ns */
  93. #define STM32F7_I2C_ANALOG_FILTER_DELAY_MAX 260 /* ns */
  94. #define STM32F7_I2C_RISE_TIME_DEFAULT 25 /* ns */
  95. #define STM32F7_I2C_FALL_TIME_DEFAULT 10 /* ns */
  96. #define STM32F7_PRESC_MAX BIT(4)
  97. #define STM32F7_SCLDEL_MAX BIT(4)
  98. #define STM32F7_SDADEL_MAX BIT(4)
  99. #define STM32F7_SCLH_MAX BIT(8)
  100. #define STM32F7_SCLL_MAX BIT(8)
  101. /**
  102. * struct stm32f7_i2c_spec - private i2c specification timing
  103. * @rate: I2C bus speed (Hz)
  104. * @rate_min: 80% of I2C bus speed (Hz)
  105. * @rate_max: 100% of I2C bus speed (Hz)
  106. * @fall_max: Max fall time of both SDA and SCL signals (ns)
  107. * @rise_max: Max rise time of both SDA and SCL signals (ns)
  108. * @hddat_min: Min data hold time (ns)
  109. * @vddat_max: Max data valid time (ns)
  110. * @sudat_min: Min data setup time (ns)
  111. * @l_min: Min low period of the SCL clock (ns)
  112. * @h_min: Min high period of the SCL clock (ns)
  113. */
  114. struct stm32f7_i2c_spec {
  115. u32 rate;
  116. u32 rate_min;
  117. u32 rate_max;
  118. u32 fall_max;
  119. u32 rise_max;
  120. u32 hddat_min;
  121. u32 vddat_max;
  122. u32 sudat_min;
  123. u32 l_min;
  124. u32 h_min;
  125. };
  126. /**
  127. * struct stm32f7_i2c_setup - private I2C timing setup parameters
  128. * @speed: I2C speed mode (standard, Fast Plus)
  129. * @speed_freq: I2C speed frequency (Hz)
  130. * @clock_src: I2C clock source frequency (Hz)
  131. * @rise_time: Rise time (ns)
  132. * @fall_time: Fall time (ns)
  133. * @dnf: Digital filter coefficient (0-16)
  134. * @analog_filter: Analog filter delay (On/Off)
  135. */
  136. struct stm32f7_i2c_setup {
  137. enum stm32_i2c_speed speed;
  138. u32 speed_freq;
  139. u32 clock_src;
  140. u32 rise_time;
  141. u32 fall_time;
  142. u8 dnf;
  143. bool analog_filter;
  144. };
  145. /**
  146. * struct stm32f7_i2c_timings - private I2C output parameters
  147. * @prec: Prescaler value
  148. * @scldel: Data setup time
  149. * @sdadel: Data hold time
  150. * @sclh: SCL high period (master mode)
  151. * @sclh: SCL low period (master mode)
  152. */
  153. struct stm32f7_i2c_timings {
  154. struct list_head node;
  155. u8 presc;
  156. u8 scldel;
  157. u8 sdadel;
  158. u8 sclh;
  159. u8 scll;
  160. };
  161. /**
  162. * struct stm32f7_i2c_msg - client specific data
  163. * @addr: 8-bit slave addr, including r/w bit
  164. * @count: number of bytes to be transferred
  165. * @buf: data buffer
  166. * @result: result of the transfer
  167. * @stop: last I2C msg to be sent, i.e. STOP to be generated
  168. */
  169. struct stm32f7_i2c_msg {
  170. u8 addr;
  171. u32 count;
  172. u8 *buf;
  173. int result;
  174. bool stop;
  175. };
  176. /**
  177. * struct stm32f7_i2c_dev - private data of the controller
  178. * @adap: I2C adapter for this controller
  179. * @dev: device for this controller
  180. * @base: virtual memory area
  181. * @complete: completion of I2C message
  182. * @clk: hw i2c clock
  183. * @speed: I2C clock frequency of the controller. Standard, Fast or Fast+
  184. * @msg: Pointer to data to be written
  185. * @msg_num: number of I2C messages to be executed
  186. * @msg_id: message identifiant
  187. * @f7_msg: customized i2c msg for driver usage
  188. * @setup: I2C timing input setup
  189. * @timing: I2C computed timings
  190. */
  191. struct stm32f7_i2c_dev {
  192. struct i2c_adapter adap;
  193. struct device *dev;
  194. void __iomem *base;
  195. struct completion complete;
  196. struct clk *clk;
  197. int speed;
  198. struct i2c_msg *msg;
  199. unsigned int msg_num;
  200. unsigned int msg_id;
  201. struct stm32f7_i2c_msg f7_msg;
  202. struct stm32f7_i2c_setup setup;
  203. struct stm32f7_i2c_timings timing;
  204. };
  205. /**
  206. * All these values are coming from I2C Specification, Version 6.0, 4th of
  207. * April 2014.
  208. *
  209. * Table10. Characteristics of the SDA and SCL bus lines for Standard, Fast,
  210. * and Fast-mode Plus I2C-bus devices
  211. */
  212. static struct stm32f7_i2c_spec i2c_specs[] = {
  213. [STM32_I2C_SPEED_STANDARD] = {
  214. .rate = 100000,
  215. .rate_min = 80000,
  216. .rate_max = 100000,
  217. .fall_max = 300,
  218. .rise_max = 1000,
  219. .hddat_min = 0,
  220. .vddat_max = 3450,
  221. .sudat_min = 250,
  222. .l_min = 4700,
  223. .h_min = 4000,
  224. },
  225. [STM32_I2C_SPEED_FAST] = {
  226. .rate = 400000,
  227. .rate_min = 320000,
  228. .rate_max = 400000,
  229. .fall_max = 300,
  230. .rise_max = 300,
  231. .hddat_min = 0,
  232. .vddat_max = 900,
  233. .sudat_min = 100,
  234. .l_min = 1300,
  235. .h_min = 600,
  236. },
  237. [STM32_I2C_SPEED_FAST_PLUS] = {
  238. .rate = 1000000,
  239. .rate_min = 800000,
  240. .rate_max = 1000000,
  241. .fall_max = 100,
  242. .rise_max = 120,
  243. .hddat_min = 0,
  244. .vddat_max = 450,
  245. .sudat_min = 50,
  246. .l_min = 500,
  247. .h_min = 260,
  248. },
  249. };
  250. static const struct stm32f7_i2c_setup stm32f7_setup = {
  251. .rise_time = STM32F7_I2C_RISE_TIME_DEFAULT,
  252. .fall_time = STM32F7_I2C_FALL_TIME_DEFAULT,
  253. .dnf = STM32F7_I2C_DNF_DEFAULT,
  254. .analog_filter = STM32F7_I2C_ANALOG_FILTER_ENABLE,
  255. };
  256. static inline void stm32f7_i2c_set_bits(void __iomem *reg, u32 mask)
  257. {
  258. writel_relaxed(readl_relaxed(reg) | mask, reg);
  259. }
  260. static inline void stm32f7_i2c_clr_bits(void __iomem *reg, u32 mask)
  261. {
  262. writel_relaxed(readl_relaxed(reg) & ~mask, reg);
  263. }
  264. static int stm32f7_i2c_compute_timing(struct stm32f7_i2c_dev *i2c_dev,
  265. struct stm32f7_i2c_setup *setup,
  266. struct stm32f7_i2c_timings *output)
  267. {
  268. u32 p_prev = STM32F7_PRESC_MAX;
  269. u32 i2cclk = DIV_ROUND_CLOSEST(NSEC_PER_SEC,
  270. setup->clock_src);
  271. u32 i2cbus = DIV_ROUND_CLOSEST(NSEC_PER_SEC,
  272. setup->speed_freq);
  273. u32 clk_error_prev = i2cbus;
  274. u32 tsync;
  275. u32 af_delay_min, af_delay_max;
  276. u32 dnf_delay;
  277. u32 clk_min, clk_max;
  278. int sdadel_min, sdadel_max;
  279. int scldel_min;
  280. struct stm32f7_i2c_timings *v, *_v, *s;
  281. struct list_head solutions;
  282. u16 p, l, a, h;
  283. int ret = 0;
  284. if (setup->speed >= STM32_I2C_SPEED_END) {
  285. dev_err(i2c_dev->dev, "speed out of bound {%d/%d}\n",
  286. setup->speed, STM32_I2C_SPEED_END - 1);
  287. return -EINVAL;
  288. }
  289. if ((setup->rise_time > i2c_specs[setup->speed].rise_max) ||
  290. (setup->fall_time > i2c_specs[setup->speed].fall_max)) {
  291. dev_err(i2c_dev->dev,
  292. "timings out of bound Rise{%d>%d}/Fall{%d>%d}\n",
  293. setup->rise_time, i2c_specs[setup->speed].rise_max,
  294. setup->fall_time, i2c_specs[setup->speed].fall_max);
  295. return -EINVAL;
  296. }
  297. if (setup->dnf > STM32F7_I2C_DNF_MAX) {
  298. dev_err(i2c_dev->dev,
  299. "DNF out of bound %d/%d\n",
  300. setup->dnf, STM32F7_I2C_DNF_MAX);
  301. return -EINVAL;
  302. }
  303. if (setup->speed_freq > i2c_specs[setup->speed].rate) {
  304. dev_err(i2c_dev->dev, "ERROR: Freq {%d/%d}\n",
  305. setup->speed_freq, i2c_specs[setup->speed].rate);
  306. return -EINVAL;
  307. }
  308. /* Analog and Digital Filters */
  309. af_delay_min =
  310. (setup->analog_filter ?
  311. STM32F7_I2C_ANALOG_FILTER_DELAY_MIN : 0);
  312. af_delay_max =
  313. (setup->analog_filter ?
  314. STM32F7_I2C_ANALOG_FILTER_DELAY_MAX : 0);
  315. dnf_delay = setup->dnf * i2cclk;
  316. sdadel_min = setup->fall_time - i2c_specs[setup->speed].hddat_min -
  317. af_delay_min - (setup->dnf + 3) * i2cclk;
  318. sdadel_max = i2c_specs[setup->speed].vddat_max - setup->rise_time -
  319. af_delay_max - (setup->dnf + 4) * i2cclk;
  320. scldel_min = setup->rise_time + i2c_specs[setup->speed].sudat_min;
  321. if (sdadel_min < 0)
  322. sdadel_min = 0;
  323. if (sdadel_max < 0)
  324. sdadel_max = 0;
  325. dev_dbg(i2c_dev->dev, "SDADEL(min/max): %i/%i, SCLDEL(Min): %i\n",
  326. sdadel_min, sdadel_max, scldel_min);
  327. INIT_LIST_HEAD(&solutions);
  328. /* Compute possible values for PRESC, SCLDEL and SDADEL */
  329. for (p = 0; p < STM32F7_PRESC_MAX; p++) {
  330. for (l = 0; l < STM32F7_SCLDEL_MAX; l++) {
  331. u32 scldel = (l + 1) * (p + 1) * i2cclk;
  332. if (scldel < scldel_min)
  333. continue;
  334. for (a = 0; a < STM32F7_SDADEL_MAX; a++) {
  335. u32 sdadel = (a * (p + 1) + 1) * i2cclk;
  336. if (((sdadel >= sdadel_min) &&
  337. (sdadel <= sdadel_max)) &&
  338. (p != p_prev)) {
  339. v = kmalloc(sizeof(*v), GFP_KERNEL);
  340. if (!v) {
  341. ret = -ENOMEM;
  342. goto exit;
  343. }
  344. v->presc = p;
  345. v->scldel = l;
  346. v->sdadel = a;
  347. p_prev = p;
  348. list_add_tail(&v->node,
  349. &solutions);
  350. }
  351. }
  352. }
  353. }
  354. if (list_empty(&solutions)) {
  355. dev_err(i2c_dev->dev, "no Prescaler solution\n");
  356. ret = -EPERM;
  357. goto exit;
  358. }
  359. tsync = af_delay_min + dnf_delay + (2 * i2cclk);
  360. s = NULL;
  361. clk_max = NSEC_PER_SEC / i2c_specs[setup->speed].rate_min;
  362. clk_min = NSEC_PER_SEC / i2c_specs[setup->speed].rate_max;
  363. /*
  364. * Among Prescaler possibilities discovered above figures out SCL Low
  365. * and High Period. Provided:
  366. * - SCL Low Period has to be higher than SCL Clock Low Period
  367. * defined by I2C Specification. I2C Clock has to be lower than
  368. * (SCL Low Period - Analog/Digital filters) / 4.
  369. * - SCL High Period has to be lower than SCL Clock High Period
  370. * defined by I2C Specification
  371. * - I2C Clock has to be lower than SCL High Period
  372. */
  373. list_for_each_entry(v, &solutions, node) {
  374. u32 prescaler = (v->presc + 1) * i2cclk;
  375. for (l = 0; l < STM32F7_SCLL_MAX; l++) {
  376. u32 tscl_l = (l + 1) * prescaler + tsync;
  377. if ((tscl_l < i2c_specs[setup->speed].l_min) ||
  378. (i2cclk >=
  379. ((tscl_l - af_delay_min - dnf_delay) / 4))) {
  380. continue;
  381. }
  382. for (h = 0; h < STM32F7_SCLH_MAX; h++) {
  383. u32 tscl_h = (h + 1) * prescaler + tsync;
  384. u32 tscl = tscl_l + tscl_h +
  385. setup->rise_time + setup->fall_time;
  386. if ((tscl >= clk_min) && (tscl <= clk_max) &&
  387. (tscl_h >= i2c_specs[setup->speed].h_min) &&
  388. (i2cclk < tscl_h)) {
  389. int clk_error = tscl - i2cbus;
  390. if (clk_error < 0)
  391. clk_error = -clk_error;
  392. if (clk_error < clk_error_prev) {
  393. clk_error_prev = clk_error;
  394. v->scll = l;
  395. v->sclh = h;
  396. s = v;
  397. }
  398. }
  399. }
  400. }
  401. }
  402. if (!s) {
  403. dev_err(i2c_dev->dev, "no solution at all\n");
  404. ret = -EPERM;
  405. goto exit;
  406. }
  407. output->presc = s->presc;
  408. output->scldel = s->scldel;
  409. output->sdadel = s->sdadel;
  410. output->scll = s->scll;
  411. output->sclh = s->sclh;
  412. dev_dbg(i2c_dev->dev,
  413. "Presc: %i, scldel: %i, sdadel: %i, scll: %i, sclh: %i\n",
  414. output->presc,
  415. output->scldel, output->sdadel,
  416. output->scll, output->sclh);
  417. exit:
  418. /* Release list and memory */
  419. list_for_each_entry_safe(v, _v, &solutions, node) {
  420. list_del(&v->node);
  421. kfree(v);
  422. }
  423. return ret;
  424. }
  425. static int stm32f7_i2c_setup_timing(struct stm32f7_i2c_dev *i2c_dev,
  426. struct stm32f7_i2c_setup *setup)
  427. {
  428. int ret = 0;
  429. setup->speed = i2c_dev->speed;
  430. setup->speed_freq = i2c_specs[setup->speed].rate;
  431. setup->clock_src = clk_get_rate(i2c_dev->clk);
  432. if (!setup->clock_src) {
  433. dev_err(i2c_dev->dev, "clock rate is 0\n");
  434. return -EINVAL;
  435. }
  436. do {
  437. ret = stm32f7_i2c_compute_timing(i2c_dev, setup,
  438. &i2c_dev->timing);
  439. if (ret) {
  440. dev_err(i2c_dev->dev,
  441. "failed to compute I2C timings.\n");
  442. if (i2c_dev->speed > STM32_I2C_SPEED_STANDARD) {
  443. i2c_dev->speed--;
  444. setup->speed = i2c_dev->speed;
  445. setup->speed_freq =
  446. i2c_specs[setup->speed].rate;
  447. dev_warn(i2c_dev->dev,
  448. "downgrade I2C Speed Freq to (%i)\n",
  449. i2c_specs[setup->speed].rate);
  450. } else {
  451. break;
  452. }
  453. }
  454. } while (ret);
  455. if (ret) {
  456. dev_err(i2c_dev->dev, "Impossible to compute I2C timings.\n");
  457. return ret;
  458. }
  459. dev_dbg(i2c_dev->dev, "I2C Speed(%i), Freq(%i), Clk Source(%i)\n",
  460. setup->speed, setup->speed_freq, setup->clock_src);
  461. dev_dbg(i2c_dev->dev, "I2C Rise(%i) and Fall(%i) Time\n",
  462. setup->rise_time, setup->fall_time);
  463. dev_dbg(i2c_dev->dev, "I2C Analog Filter(%s), DNF(%i)\n",
  464. (setup->analog_filter ? "On" : "Off"), setup->dnf);
  465. return 0;
  466. }
  467. static void stm32f7_i2c_hw_config(struct stm32f7_i2c_dev *i2c_dev)
  468. {
  469. struct stm32f7_i2c_timings *t = &i2c_dev->timing;
  470. u32 timing = 0;
  471. /* Timing settings */
  472. timing |= STM32F7_I2C_TIMINGR_PRESC(t->presc);
  473. timing |= STM32F7_I2C_TIMINGR_SCLDEL(t->scldel);
  474. timing |= STM32F7_I2C_TIMINGR_SDADEL(t->sdadel);
  475. timing |= STM32F7_I2C_TIMINGR_SCLH(t->sclh);
  476. timing |= STM32F7_I2C_TIMINGR_SCLL(t->scll);
  477. writel_relaxed(timing, i2c_dev->base + STM32F7_I2C_TIMINGR);
  478. /* Enable I2C */
  479. if (i2c_dev->setup.analog_filter)
  480. stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1,
  481. STM32F7_I2C_CR1_ANFOFF);
  482. else
  483. stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
  484. STM32F7_I2C_CR1_ANFOFF);
  485. stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
  486. STM32F7_I2C_CR1_PE);
  487. }
  488. static void stm32f7_i2c_write_tx_data(struct stm32f7_i2c_dev *i2c_dev)
  489. {
  490. struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
  491. void __iomem *base = i2c_dev->base;
  492. if (f7_msg->count) {
  493. writeb_relaxed(*f7_msg->buf++, base + STM32F7_I2C_TXDR);
  494. f7_msg->count--;
  495. }
  496. }
  497. static void stm32f7_i2c_read_rx_data(struct stm32f7_i2c_dev *i2c_dev)
  498. {
  499. struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
  500. void __iomem *base = i2c_dev->base;
  501. if (f7_msg->count) {
  502. *f7_msg->buf++ = readb_relaxed(base + STM32F7_I2C_RXDR);
  503. f7_msg->count--;
  504. }
  505. }
  506. static void stm32f7_i2c_reload(struct stm32f7_i2c_dev *i2c_dev)
  507. {
  508. struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
  509. u32 cr2;
  510. cr2 = readl_relaxed(i2c_dev->base + STM32F7_I2C_CR2);
  511. cr2 &= ~STM32F7_I2C_CR2_NBYTES_MASK;
  512. if (f7_msg->count > STM32F7_I2C_MAX_LEN) {
  513. cr2 |= STM32F7_I2C_CR2_NBYTES(STM32F7_I2C_MAX_LEN);
  514. } else {
  515. cr2 &= ~STM32F7_I2C_CR2_RELOAD;
  516. cr2 |= STM32F7_I2C_CR2_NBYTES(f7_msg->count);
  517. }
  518. writel_relaxed(cr2, i2c_dev->base + STM32F7_I2C_CR2);
  519. }
  520. static int stm32f7_i2c_wait_free_bus(struct stm32f7_i2c_dev *i2c_dev)
  521. {
  522. u32 status;
  523. int ret;
  524. ret = readl_relaxed_poll_timeout(i2c_dev->base + STM32F7_I2C_ISR,
  525. status,
  526. !(status & STM32F7_I2C_ISR_BUSY),
  527. 10, 1000);
  528. if (ret) {
  529. dev_dbg(i2c_dev->dev, "bus busy\n");
  530. ret = -EBUSY;
  531. }
  532. return ret;
  533. }
  534. static void stm32f7_i2c_xfer_msg(struct stm32f7_i2c_dev *i2c_dev,
  535. struct i2c_msg *msg)
  536. {
  537. struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
  538. void __iomem *base = i2c_dev->base;
  539. u32 cr1, cr2;
  540. f7_msg->addr = msg->addr;
  541. f7_msg->buf = msg->buf;
  542. f7_msg->count = msg->len;
  543. f7_msg->result = 0;
  544. f7_msg->stop = (i2c_dev->msg_id >= i2c_dev->msg_num - 1);
  545. reinit_completion(&i2c_dev->complete);
  546. cr1 = readl_relaxed(base + STM32F7_I2C_CR1);
  547. cr2 = readl_relaxed(base + STM32F7_I2C_CR2);
  548. /* Set transfer direction */
  549. cr2 &= ~STM32F7_I2C_CR2_RD_WRN;
  550. if (msg->flags & I2C_M_RD)
  551. cr2 |= STM32F7_I2C_CR2_RD_WRN;
  552. /* Set slave address */
  553. cr2 &= ~STM32F7_I2C_CR2_SADD7_MASK;
  554. cr2 |= STM32F7_I2C_CR2_SADD7(f7_msg->addr);
  555. /* Set nb bytes to transfer and reload if needed */
  556. cr2 &= ~(STM32F7_I2C_CR2_NBYTES_MASK | STM32F7_I2C_CR2_RELOAD);
  557. if (f7_msg->count > STM32F7_I2C_MAX_LEN) {
  558. cr2 |= STM32F7_I2C_CR2_NBYTES(STM32F7_I2C_MAX_LEN);
  559. cr2 |= STM32F7_I2C_CR2_RELOAD;
  560. } else {
  561. cr2 |= STM32F7_I2C_CR2_NBYTES(f7_msg->count);
  562. }
  563. /* Enable NACK, STOP, error and transfer complete interrupts */
  564. cr1 |= STM32F7_I2C_CR1_ERRIE | STM32F7_I2C_CR1_TCIE |
  565. STM32F7_I2C_CR1_STOPIE | STM32F7_I2C_CR1_NACKIE;
  566. /* Clear TX/RX interrupt */
  567. cr1 &= ~(STM32F7_I2C_CR1_RXIE | STM32F7_I2C_CR1_TXIE);
  568. /* Enable RX/TX interrupt according to msg direction */
  569. if (msg->flags & I2C_M_RD)
  570. cr1 |= STM32F7_I2C_CR1_RXIE;
  571. else
  572. cr1 |= STM32F7_I2C_CR1_TXIE;
  573. /* Configure Start/Repeated Start */
  574. cr2 |= STM32F7_I2C_CR2_START;
  575. /* Write configurations registers */
  576. writel_relaxed(cr1, base + STM32F7_I2C_CR1);
  577. writel_relaxed(cr2, base + STM32F7_I2C_CR2);
  578. }
  579. static void stm32f7_i2c_disable_irq(struct stm32f7_i2c_dev *i2c_dev, u32 mask)
  580. {
  581. stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1, mask);
  582. }
  583. static irqreturn_t stm32f7_i2c_isr_event(int irq, void *data)
  584. {
  585. struct stm32f7_i2c_dev *i2c_dev = data;
  586. struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
  587. void __iomem *base = i2c_dev->base;
  588. u32 status, mask;
  589. status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
  590. /* Tx empty */
  591. if (status & STM32F7_I2C_ISR_TXIS)
  592. stm32f7_i2c_write_tx_data(i2c_dev);
  593. /* RX not empty */
  594. if (status & STM32F7_I2C_ISR_RXNE)
  595. stm32f7_i2c_read_rx_data(i2c_dev);
  596. /* NACK received */
  597. if (status & STM32F7_I2C_ISR_NACKF) {
  598. dev_dbg(i2c_dev->dev, "<%s>: Receive NACK\n", __func__);
  599. writel_relaxed(STM32F7_I2C_ICR_NACKCF, base + STM32F7_I2C_ICR);
  600. f7_msg->result = -ENXIO;
  601. }
  602. /* STOP detection flag */
  603. if (status & STM32F7_I2C_ISR_STOPF) {
  604. /* Disable interrupts */
  605. stm32f7_i2c_disable_irq(i2c_dev, STM32F7_I2C_ALL_IRQ_MASK);
  606. /* Clear STOP flag */
  607. writel_relaxed(STM32F7_I2C_ICR_STOPCF, base + STM32F7_I2C_ICR);
  608. complete(&i2c_dev->complete);
  609. }
  610. /* Transfer complete */
  611. if (status & STM32F7_I2C_ISR_TC) {
  612. if (f7_msg->stop) {
  613. mask = STM32F7_I2C_CR2_STOP;
  614. stm32f7_i2c_set_bits(base + STM32F7_I2C_CR2, mask);
  615. } else {
  616. i2c_dev->msg_id++;
  617. i2c_dev->msg++;
  618. stm32f7_i2c_xfer_msg(i2c_dev, i2c_dev->msg);
  619. }
  620. }
  621. /*
  622. * Transfer Complete Reload: 255 data bytes have been transferred
  623. * We have to prepare the I2C controller to transfer the remaining
  624. * data.
  625. */
  626. if (status & STM32F7_I2C_ISR_TCR)
  627. stm32f7_i2c_reload(i2c_dev);
  628. return IRQ_HANDLED;
  629. }
  630. static irqreturn_t stm32f7_i2c_isr_error(int irq, void *data)
  631. {
  632. struct stm32f7_i2c_dev *i2c_dev = data;
  633. struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
  634. void __iomem *base = i2c_dev->base;
  635. struct device *dev = i2c_dev->dev;
  636. u32 status;
  637. status = readl_relaxed(i2c_dev->base + STM32F7_I2C_ISR);
  638. /* Bus error */
  639. if (status & STM32F7_I2C_ISR_BERR) {
  640. dev_err(dev, "<%s>: Bus error\n", __func__);
  641. writel_relaxed(STM32F7_I2C_ICR_BERRCF, base + STM32F7_I2C_ICR);
  642. f7_msg->result = -EIO;
  643. }
  644. /* Arbitration loss */
  645. if (status & STM32F7_I2C_ISR_ARLO) {
  646. dev_dbg(dev, "<%s>: Arbitration loss\n", __func__);
  647. writel_relaxed(STM32F7_I2C_ICR_ARLOCF, base + STM32F7_I2C_ICR);
  648. f7_msg->result = -EAGAIN;
  649. }
  650. stm32f7_i2c_disable_irq(i2c_dev, STM32F7_I2C_ALL_IRQ_MASK);
  651. complete(&i2c_dev->complete);
  652. return IRQ_HANDLED;
  653. }
  654. static int stm32f7_i2c_xfer(struct i2c_adapter *i2c_adap,
  655. struct i2c_msg msgs[], int num)
  656. {
  657. struct stm32f7_i2c_dev *i2c_dev = i2c_get_adapdata(i2c_adap);
  658. struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg;
  659. unsigned long time_left;
  660. int ret;
  661. i2c_dev->msg = msgs;
  662. i2c_dev->msg_num = num;
  663. i2c_dev->msg_id = 0;
  664. ret = clk_enable(i2c_dev->clk);
  665. if (ret) {
  666. dev_err(i2c_dev->dev, "Failed to enable clock\n");
  667. return ret;
  668. }
  669. ret = stm32f7_i2c_wait_free_bus(i2c_dev);
  670. if (ret)
  671. goto clk_free;
  672. stm32f7_i2c_xfer_msg(i2c_dev, msgs);
  673. time_left = wait_for_completion_timeout(&i2c_dev->complete,
  674. i2c_dev->adap.timeout);
  675. ret = f7_msg->result;
  676. if (!time_left) {
  677. dev_dbg(i2c_dev->dev, "Access to slave 0x%x timed out\n",
  678. i2c_dev->msg->addr);
  679. ret = -ETIMEDOUT;
  680. }
  681. clk_free:
  682. clk_disable(i2c_dev->clk);
  683. return (ret < 0) ? ret : num;
  684. }
  685. static u32 stm32f7_i2c_func(struct i2c_adapter *adap)
  686. {
  687. return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
  688. }
  689. static struct i2c_algorithm stm32f7_i2c_algo = {
  690. .master_xfer = stm32f7_i2c_xfer,
  691. .functionality = stm32f7_i2c_func,
  692. };
  693. static int stm32f7_i2c_probe(struct platform_device *pdev)
  694. {
  695. struct device_node *np = pdev->dev.of_node;
  696. struct stm32f7_i2c_dev *i2c_dev;
  697. const struct stm32f7_i2c_setup *setup;
  698. struct resource *res;
  699. u32 irq_error, irq_event, clk_rate, rise_time, fall_time;
  700. struct i2c_adapter *adap;
  701. struct reset_control *rst;
  702. int ret;
  703. i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL);
  704. if (!i2c_dev)
  705. return -ENOMEM;
  706. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  707. i2c_dev->base = devm_ioremap_resource(&pdev->dev, res);
  708. if (IS_ERR(i2c_dev->base))
  709. return PTR_ERR(i2c_dev->base);
  710. irq_event = irq_of_parse_and_map(np, 0);
  711. if (!irq_event) {
  712. dev_err(&pdev->dev, "IRQ event missing or invalid\n");
  713. return -EINVAL;
  714. }
  715. irq_error = irq_of_parse_and_map(np, 1);
  716. if (!irq_error) {
  717. dev_err(&pdev->dev, "IRQ error missing or invalid\n");
  718. return -EINVAL;
  719. }
  720. i2c_dev->clk = devm_clk_get(&pdev->dev, NULL);
  721. if (IS_ERR(i2c_dev->clk)) {
  722. dev_err(&pdev->dev, "Error: Missing controller clock\n");
  723. return PTR_ERR(i2c_dev->clk);
  724. }
  725. ret = clk_prepare_enable(i2c_dev->clk);
  726. if (ret) {
  727. dev_err(&pdev->dev, "Failed to prepare_enable clock\n");
  728. return ret;
  729. }
  730. i2c_dev->speed = STM32_I2C_SPEED_STANDARD;
  731. ret = device_property_read_u32(&pdev->dev, "clock-frequency",
  732. &clk_rate);
  733. if (!ret && clk_rate >= 1000000)
  734. i2c_dev->speed = STM32_I2C_SPEED_FAST_PLUS;
  735. else if (!ret && clk_rate >= 400000)
  736. i2c_dev->speed = STM32_I2C_SPEED_FAST;
  737. else if (!ret && clk_rate >= 100000)
  738. i2c_dev->speed = STM32_I2C_SPEED_STANDARD;
  739. rst = devm_reset_control_get(&pdev->dev, NULL);
  740. if (IS_ERR(rst)) {
  741. dev_err(&pdev->dev, "Error: Missing controller reset\n");
  742. ret = PTR_ERR(rst);
  743. goto clk_free;
  744. }
  745. reset_control_assert(rst);
  746. udelay(2);
  747. reset_control_deassert(rst);
  748. i2c_dev->dev = &pdev->dev;
  749. ret = devm_request_irq(&pdev->dev, irq_event, stm32f7_i2c_isr_event, 0,
  750. pdev->name, i2c_dev);
  751. if (ret) {
  752. dev_err(&pdev->dev, "Failed to request irq event %i\n",
  753. irq_event);
  754. goto clk_free;
  755. }
  756. ret = devm_request_irq(&pdev->dev, irq_error, stm32f7_i2c_isr_error, 0,
  757. pdev->name, i2c_dev);
  758. if (ret) {
  759. dev_err(&pdev->dev, "Failed to request irq error %i\n",
  760. irq_error);
  761. goto clk_free;
  762. }
  763. setup = of_device_get_match_data(&pdev->dev);
  764. if (!setup) {
  765. dev_err(&pdev->dev, "Can't get device data\n");
  766. ret = -ENODEV;
  767. goto clk_free;
  768. }
  769. i2c_dev->setup = *setup;
  770. ret = device_property_read_u32(i2c_dev->dev, "i2c-scl-rising-time-ns",
  771. &rise_time);
  772. if (!ret)
  773. i2c_dev->setup.rise_time = rise_time;
  774. ret = device_property_read_u32(i2c_dev->dev, "i2c-scl-falling-time-ns",
  775. &fall_time);
  776. if (!ret)
  777. i2c_dev->setup.fall_time = fall_time;
  778. ret = stm32f7_i2c_setup_timing(i2c_dev, &i2c_dev->setup);
  779. if (ret)
  780. goto clk_free;
  781. stm32f7_i2c_hw_config(i2c_dev);
  782. adap = &i2c_dev->adap;
  783. i2c_set_adapdata(adap, i2c_dev);
  784. snprintf(adap->name, sizeof(adap->name), "STM32F7 I2C(%pa)",
  785. &res->start);
  786. adap->owner = THIS_MODULE;
  787. adap->timeout = 2 * HZ;
  788. adap->retries = 3;
  789. adap->algo = &stm32f7_i2c_algo;
  790. adap->dev.parent = &pdev->dev;
  791. adap->dev.of_node = pdev->dev.of_node;
  792. init_completion(&i2c_dev->complete);
  793. ret = i2c_add_adapter(adap);
  794. if (ret)
  795. goto clk_free;
  796. platform_set_drvdata(pdev, i2c_dev);
  797. clk_disable(i2c_dev->clk);
  798. dev_info(i2c_dev->dev, "STM32F7 I2C-%d bus adapter\n", adap->nr);
  799. return 0;
  800. clk_free:
  801. clk_disable_unprepare(i2c_dev->clk);
  802. return ret;
  803. }
  804. static int stm32f7_i2c_remove(struct platform_device *pdev)
  805. {
  806. struct stm32f7_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
  807. i2c_del_adapter(&i2c_dev->adap);
  808. clk_unprepare(i2c_dev->clk);
  809. return 0;
  810. }
  811. static const struct of_device_id stm32f7_i2c_match[] = {
  812. { .compatible = "st,stm32f7-i2c", .data = &stm32f7_setup},
  813. {},
  814. };
  815. MODULE_DEVICE_TABLE(of, stm32f7_i2c_match);
  816. static struct platform_driver stm32f7_i2c_driver = {
  817. .driver = {
  818. .name = "stm32f7-i2c",
  819. .of_match_table = stm32f7_i2c_match,
  820. },
  821. .probe = stm32f7_i2c_probe,
  822. .remove = stm32f7_i2c_remove,
  823. };
  824. module_platform_driver(stm32f7_i2c_driver);
  825. MODULE_AUTHOR("M'boumba Cedric Madianga <cedric.madianga@gmail.com>");
  826. MODULE_DESCRIPTION("STMicroelectronics STM32F7 I2C driver");
  827. MODULE_LICENSE("GPL v2");