16055af5eSWolfram Sang // SPDX-License-Identifier: GPL-2.0
26ccbe607SKuninori Morimoto /*
35c8e3ab1SWolfram Sang * Driver for the Renesas R-Car I2C unit
46ccbe607SKuninori Morimoto *
5d0051ca5SWolfram Sang * Copyright (C) 2014-19 Wolfram Sang <wsa@sang-engineering.com>
6d0051ca5SWolfram Sang * Copyright (C) 2011-2019 Renesas Electronics Corporation
73d99beabSWolfram Sang *
83d99beabSWolfram Sang * Copyright (C) 2012-14 Renesas Solutions Corp.
96ccbe607SKuninori Morimoto * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
106ccbe607SKuninori Morimoto *
116ccbe607SKuninori Morimoto * This file is based on the drivers/i2c/busses/i2c-sh7760.c
126ccbe607SKuninori Morimoto * (c) 2005-2008 MSC Vertriebsges.m.b.H, Manuel Lauss <mlau@msc-ge.com>
136ccbe607SKuninori Morimoto */
14b07531acSWolfram Sang #include <linux/bitops.h>
156ccbe607SKuninori Morimoto #include <linux/clk.h>
166ccbe607SKuninori Morimoto #include <linux/delay.h>
1773e8b052SNiklas Söderlund #include <linux/dmaengine.h>
1873e8b052SNiklas Söderlund #include <linux/dma-mapping.h>
196ccbe607SKuninori Morimoto #include <linux/err.h>
206ccbe607SKuninori Morimoto #include <linux/interrupt.h>
216ccbe607SKuninori Morimoto #include <linux/io.h>
229374ed1dSWolfram Sang #include <linux/iopoll.h>
236ccbe607SKuninori Morimoto #include <linux/i2c.h>
24c4651f11SWolfram Sang #include <linux/i2c-smbus.h>
256ccbe607SKuninori Morimoto #include <linux/kernel.h>
266ccbe607SKuninori Morimoto #include <linux/module.h>
2759738ab2SRob Herring #include <linux/of.h>
286ccbe607SKuninori Morimoto #include <linux/platform_device.h>
296ccbe607SKuninori Morimoto #include <linux/pm_runtime.h>
303b770017SWolfram Sang #include <linux/reset.h>
316ccbe607SKuninori Morimoto #include <linux/slab.h>
326ccbe607SKuninori Morimoto
336ccbe607SKuninori Morimoto /* register offsets */
346ccbe607SKuninori Morimoto #define ICSCR 0x00 /* slave ctrl */
356ccbe607SKuninori Morimoto #define ICMCR 0x04 /* master ctrl */
366ccbe607SKuninori Morimoto #define ICSSR 0x08 /* slave status */
376ccbe607SKuninori Morimoto #define ICMSR 0x0C /* master status */
386ccbe607SKuninori Morimoto #define ICSIER 0x10 /* slave irq enable */
396ccbe607SKuninori Morimoto #define ICMIER 0x14 /* master irq enable */
406ccbe607SKuninori Morimoto #define ICCCR 0x18 /* clock dividers */
416ccbe607SKuninori Morimoto #define ICSAR 0x1C /* slave address */
426ccbe607SKuninori Morimoto #define ICMAR 0x20 /* master address */
436ccbe607SKuninori Morimoto #define ICRXTX 0x24 /* data port */
4418769445SWolfram Sang #define ICFBSCR 0x38 /* first bit setup cycle (Gen3) */
4518769445SWolfram Sang #define ICDMAER 0x3c /* DMA enable (Gen3) */
466ccbe607SKuninori Morimoto
47de20d185SWolfram Sang /* ICSCR */
484c278db7SWolfram Sang #define SDBS BIT(3) /* slave data buffer select */
494c278db7SWolfram Sang #define SIE BIT(2) /* slave interface enable */
504c278db7SWolfram Sang #define GCAE BIT(1) /* general call address enable */
514c278db7SWolfram Sang #define FNA BIT(0) /* forced non acknowledgment */
52de20d185SWolfram Sang
536ccbe607SKuninori Morimoto /* ICMCR */
544c278db7SWolfram Sang #define MDBS BIT(7) /* non-fifo mode switch */
554c278db7SWolfram Sang #define FSCL BIT(6) /* override SCL pin */
564c278db7SWolfram Sang #define FSDA BIT(5) /* override SDA pin */
574c278db7SWolfram Sang #define OBPC BIT(4) /* override pins */
584c278db7SWolfram Sang #define MIE BIT(3) /* master if enable */
594c278db7SWolfram Sang #define TSBE BIT(2)
604c278db7SWolfram Sang #define FSB BIT(1) /* force stop bit */
614c278db7SWolfram Sang #define ESG BIT(0) /* enable start bit gen */
626ccbe607SKuninori Morimoto
63de20d185SWolfram Sang /* ICSSR (also for ICSIER) */
644c278db7SWolfram Sang #define GCAR BIT(6) /* general call received */
654c278db7SWolfram Sang #define STM BIT(5) /* slave transmit mode */
664c278db7SWolfram Sang #define SSR BIT(4) /* stop received */
674c278db7SWolfram Sang #define SDE BIT(3) /* slave data empty */
684c278db7SWolfram Sang #define SDT BIT(2) /* slave data transmitted */
694c278db7SWolfram Sang #define SDR BIT(1) /* slave data received */
704c278db7SWolfram Sang #define SAR BIT(0) /* slave addr received */
71de20d185SWolfram Sang
723e3aabacSWolfram Sang /* ICMSR (also for ICMIE) */
734c278db7SWolfram Sang #define MNR BIT(6) /* nack received */
744c278db7SWolfram Sang #define MAL BIT(5) /* arbitration lost */
754c278db7SWolfram Sang #define MST BIT(4) /* sent a stop */
764c278db7SWolfram Sang #define MDE BIT(3)
774c278db7SWolfram Sang #define MDT BIT(2)
784c278db7SWolfram Sang #define MDR BIT(1)
794c278db7SWolfram Sang #define MAT BIT(0) /* slave addr xfer done */
806ccbe607SKuninori Morimoto
8173e8b052SNiklas Söderlund /* ICDMAER */
824c278db7SWolfram Sang #define RSDMAE BIT(3) /* DMA Slave Received Enable */
834c278db7SWolfram Sang #define TSDMAE BIT(2) /* DMA Slave Transmitted Enable */
844c278db7SWolfram Sang #define RMDMAE BIT(1) /* DMA Master Received Enable */
854c278db7SWolfram Sang #define TMDMAE BIT(0) /* DMA Master Transmitted Enable */
8673e8b052SNiklas Söderlund
8773e8b052SNiklas Söderlund /* ICFBSCR */
8873e8b052SNiklas Söderlund #define TCYC17 0x0f /* 17*Tcyc delay 1st bit between SDA and SCL */
8973e8b052SNiklas Söderlund
90ed5a8104SWolfram Sang #define RCAR_MIN_DMA_LEN 8
916ccbe607SKuninori Morimoto
924f443a8aSWolfram Sang #define RCAR_BUS_PHASE_START (MDBS | MIE | ESG)
934f443a8aSWolfram Sang #define RCAR_BUS_PHASE_DATA (MDBS | MIE)
944f443a8aSWolfram Sang #define RCAR_BUS_PHASE_STOP (MDBS | MIE | FSB)
956ccbe607SKuninori Morimoto
963e3aabacSWolfram Sang #define RCAR_IRQ_SEND (MNR | MAL | MST | MAT | MDE)
973e3aabacSWolfram Sang #define RCAR_IRQ_RECV (MNR | MAL | MST | MAT | MDR)
983e3aabacSWolfram Sang #define RCAR_IRQ_STOP (MST)
996ccbe607SKuninori Morimoto
1004c278db7SWolfram Sang #define ID_LAST_MSG BIT(0)
101f0f0e076SWolfram Sang #define ID_REP_AFTER_RD BIT(1)
1024c278db7SWolfram Sang #define ID_DONE BIT(2)
1034c278db7SWolfram Sang #define ID_ARBLOST BIT(3)
1044c278db7SWolfram Sang #define ID_NACK BIT(4)
1054c278db7SWolfram Sang #define ID_EPROTO BIT(5)
1067ee24eb5SWolfram Sang /* persistent flags */
107e35fb418SKuninori Morimoto #define ID_P_NOT_ATOMIC BIT(28)
108f0f0e076SWolfram Sang #define ID_P_HOST_NOTIFY BIT(29)
109b07531acSWolfram Sang #define ID_P_NO_RXDMA BIT(30) /* HW forbids RXDMA sometimes */
110b07531acSWolfram Sang #define ID_P_PM_BLOCKED BIT(31)
111e35fb418SKuninori Morimoto #define ID_P_MASK GENMASK(31, 28)
1126ccbe607SKuninori Morimoto
113*6152c2c6SWolfram Sang #define ID_SLAVE_NACK BIT(0)
114*6152c2c6SWolfram Sang
115b720423aSNguyen Viet Dung enum rcar_i2c_type {
116043a3f11SKuninori Morimoto I2C_RCAR_GEN1,
117043a3f11SKuninori Morimoto I2C_RCAR_GEN2,
118e7db0d34SWolfram Sang I2C_RCAR_GEN3,
119988c3133SWolfram Sang I2C_RCAR_GEN4,
120b720423aSNguyen Viet Dung };
121b720423aSNguyen Viet Dung
1226ccbe607SKuninori Morimoto struct rcar_i2c_priv {
12325c2e0fbSWolfram Sang u32 flags;
1246ccbe607SKuninori Morimoto void __iomem *io;
1256ccbe607SKuninori Morimoto struct i2c_adapter adap;
1266ccbe607SKuninori Morimoto struct i2c_msg *msg;
127b9d0684cSWolfram Sang int msgs_left;
128bc8120f1SBen Dooks struct clk *clk;
1296ccbe607SKuninori Morimoto
1306ccbe607SKuninori Morimoto wait_queue_head_t wait;
1316ccbe607SKuninori Morimoto
1326ccbe607SKuninori Morimoto int pos;
1336ccbe607SKuninori Morimoto u32 icccr;
1347d2c17f0SWolfram Sang u8 recovery_icmcr; /* protected by adapter lock */
135b720423aSNguyen Viet Dung enum rcar_i2c_type devtype;
136de20d185SWolfram Sang struct i2c_client *slave;
13773e8b052SNiklas Söderlund
13873e8b052SNiklas Söderlund struct resource *res;
13973e8b052SNiklas Söderlund struct dma_chan *dma_tx;
14073e8b052SNiklas Söderlund struct dma_chan *dma_rx;
14173e8b052SNiklas Söderlund struct scatterlist sg;
14273e8b052SNiklas Söderlund enum dma_data_direction dma_direction;
1433b770017SWolfram Sang
1443b770017SWolfram Sang struct reset_control *rstc;
1457b814d85SWolfram Sang int irq;
146c4651f11SWolfram Sang
147c4651f11SWolfram Sang struct i2c_client *host_notify_client;
148*6152c2c6SWolfram Sang u8 slave_flags;
1496ccbe607SKuninori Morimoto };
1506ccbe607SKuninori Morimoto
1516ccbe607SKuninori Morimoto #define rcar_i2c_priv_to_dev(p) ((p)->adap.dev.parent)
1526ccbe607SKuninori Morimoto #define rcar_i2c_is_recv(p) ((p)->msg->flags & I2C_M_RD)
1536ccbe607SKuninori Morimoto
rcar_i2c_write(struct rcar_i2c_priv * priv,int reg,u32 val)1546ccbe607SKuninori Morimoto static void rcar_i2c_write(struct rcar_i2c_priv *priv, int reg, u32 val)
1556ccbe607SKuninori Morimoto {
1566ccbe607SKuninori Morimoto writel(val, priv->io + reg);
1576ccbe607SKuninori Morimoto }
1586ccbe607SKuninori Morimoto
rcar_i2c_read(struct rcar_i2c_priv * priv,int reg)1596ccbe607SKuninori Morimoto static u32 rcar_i2c_read(struct rcar_i2c_priv *priv, int reg)
1606ccbe607SKuninori Morimoto {
1616ccbe607SKuninori Morimoto return readl(priv->io + reg);
1626ccbe607SKuninori Morimoto }
1636ccbe607SKuninori Morimoto
rcar_i2c_clear_irq(struct rcar_i2c_priv * priv,u32 val)164a0fb48c9SWolfram Sang static void rcar_i2c_clear_irq(struct rcar_i2c_priv *priv, u32 val)
165a0fb48c9SWolfram Sang {
166a0fb48c9SWolfram Sang writel(~val & 0x7f, priv->io + ICMSR);
167a0fb48c9SWolfram Sang }
168a0fb48c9SWolfram Sang
rcar_i2c_get_scl(struct i2c_adapter * adap)1697d2c17f0SWolfram Sang static int rcar_i2c_get_scl(struct i2c_adapter *adap)
1707d2c17f0SWolfram Sang {
1717d2c17f0SWolfram Sang struct rcar_i2c_priv *priv = i2c_get_adapdata(adap);
1727d2c17f0SWolfram Sang
1737d2c17f0SWolfram Sang return !!(rcar_i2c_read(priv, ICMCR) & FSCL);
1747d2c17f0SWolfram Sang
1757d2c17f0SWolfram Sang };
1767d2c17f0SWolfram Sang
rcar_i2c_set_scl(struct i2c_adapter * adap,int val)1777d2c17f0SWolfram Sang static void rcar_i2c_set_scl(struct i2c_adapter *adap, int val)
1787d2c17f0SWolfram Sang {
1797d2c17f0SWolfram Sang struct rcar_i2c_priv *priv = i2c_get_adapdata(adap);
1807d2c17f0SWolfram Sang
1817d2c17f0SWolfram Sang if (val)
1827d2c17f0SWolfram Sang priv->recovery_icmcr |= FSCL;
1837d2c17f0SWolfram Sang else
1847d2c17f0SWolfram Sang priv->recovery_icmcr &= ~FSCL;
1857d2c17f0SWolfram Sang
1867d2c17f0SWolfram Sang rcar_i2c_write(priv, ICMCR, priv->recovery_icmcr);
1877d2c17f0SWolfram Sang };
1887d2c17f0SWolfram Sang
rcar_i2c_set_sda(struct i2c_adapter * adap,int val)1897d2c17f0SWolfram Sang static void rcar_i2c_set_sda(struct i2c_adapter *adap, int val)
1907d2c17f0SWolfram Sang {
1917d2c17f0SWolfram Sang struct rcar_i2c_priv *priv = i2c_get_adapdata(adap);
1927d2c17f0SWolfram Sang
1937d2c17f0SWolfram Sang if (val)
1947d2c17f0SWolfram Sang priv->recovery_icmcr |= FSDA;
1957d2c17f0SWolfram Sang else
1967d2c17f0SWolfram Sang priv->recovery_icmcr &= ~FSDA;
1977d2c17f0SWolfram Sang
1987d2c17f0SWolfram Sang rcar_i2c_write(priv, ICMCR, priv->recovery_icmcr);
1997d2c17f0SWolfram Sang };
2007d2c17f0SWolfram Sang
rcar_i2c_get_bus_free(struct i2c_adapter * adap)2014fe10de5SWolfram Sang static int rcar_i2c_get_bus_free(struct i2c_adapter *adap)
2024fe10de5SWolfram Sang {
2034fe10de5SWolfram Sang struct rcar_i2c_priv *priv = i2c_get_adapdata(adap);
2044fe10de5SWolfram Sang
2054fe10de5SWolfram Sang return !(rcar_i2c_read(priv, ICMCR) & FSDA);
2064fe10de5SWolfram Sang
2074fe10de5SWolfram Sang };
2084fe10de5SWolfram Sang
2097d2c17f0SWolfram Sang static struct i2c_bus_recovery_info rcar_i2c_bri = {
2107d2c17f0SWolfram Sang .get_scl = rcar_i2c_get_scl,
2117d2c17f0SWolfram Sang .set_scl = rcar_i2c_set_scl,
2127d2c17f0SWolfram Sang .set_sda = rcar_i2c_set_sda,
2134fe10de5SWolfram Sang .get_bus_free = rcar_i2c_get_bus_free,
2147d2c17f0SWolfram Sang .recover_bus = i2c_generic_scl_recovery,
2157d2c17f0SWolfram Sang };
rcar_i2c_init(struct rcar_i2c_priv * priv)2166ccbe607SKuninori Morimoto static void rcar_i2c_init(struct rcar_i2c_priv *priv)
2176ccbe607SKuninori Morimoto {
2186ccbe607SKuninori Morimoto /* reset master mode */
2196ccbe607SKuninori Morimoto rcar_i2c_write(priv, ICMIER, 0);
2202c78cdc1SWolfram Sang rcar_i2c_write(priv, ICMCR, MDBS);
2216ccbe607SKuninori Morimoto rcar_i2c_write(priv, ICMSR, 0);
2222c78cdc1SWolfram Sang /* start clock */
2232c78cdc1SWolfram Sang rcar_i2c_write(priv, ICCCR, priv->icccr);
22418769445SWolfram Sang
22518769445SWolfram Sang if (priv->devtype == I2C_RCAR_GEN3)
22618769445SWolfram Sang rcar_i2c_write(priv, ICFBSCR, TCYC17);
22718769445SWolfram Sang
2286ccbe607SKuninori Morimoto }
2296ccbe607SKuninori Morimoto
rcar_i2c_reset_slave(struct rcar_i2c_priv * priv)2305bfec9c2SWolfram Sang static void rcar_i2c_reset_slave(struct rcar_i2c_priv *priv)
2315bfec9c2SWolfram Sang {
2325bfec9c2SWolfram Sang rcar_i2c_write(priv, ICSIER, 0);
2335bfec9c2SWolfram Sang rcar_i2c_write(priv, ICSSR, 0);
2345bfec9c2SWolfram Sang rcar_i2c_write(priv, ICSCR, SDBS);
2355bfec9c2SWolfram Sang rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */
2365bfec9c2SWolfram Sang }
2375bfec9c2SWolfram Sang
rcar_i2c_bus_barrier(struct rcar_i2c_priv * priv)2386ccbe607SKuninori Morimoto static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv)
2396ccbe607SKuninori Morimoto {
2409374ed1dSWolfram Sang int ret;
2419374ed1dSWolfram Sang u32 val;
2426ccbe607SKuninori Morimoto
2439374ed1dSWolfram Sang ret = readl_poll_timeout(priv->io + ICMCR, val, !(val & FSDA), 10,
2449374ed1dSWolfram Sang priv->adap.timeout);
2459374ed1dSWolfram Sang if (ret) {
2467d2c17f0SWolfram Sang /* Waiting did not help, try to recover */
2477d2c17f0SWolfram Sang priv->recovery_icmcr = MDBS | OBPC | FSDA | FSCL;
2489374ed1dSWolfram Sang ret = i2c_recover_bus(&priv->adap);
2499374ed1dSWolfram Sang }
2509374ed1dSWolfram Sang
2519374ed1dSWolfram Sang return ret;
2526ccbe607SKuninori Morimoto }
2536ccbe607SKuninori Morimoto
rcar_i2c_clock_calculate(struct rcar_i2c_priv * priv)25438a592e2SAndy Shevchenko static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv)
2556ccbe607SKuninori Morimoto {
256ca68eadeSWolfram Sang u32 scgd, cdf, round, ick, sum, scl, cdf_width;
2578d049403SGuennadi Liakhovetski unsigned long rate;
258f9c9d31bSWolfram Sang struct device *dev = rcar_i2c_priv_to_dev(priv);
259df576beeSWolfram Sang struct i2c_timings t = {
26038a592e2SAndy Shevchenko .bus_freq_hz = I2C_MAX_STANDARD_MODE_FREQ,
26138a592e2SAndy Shevchenko .scl_fall_ns = 35,
26238a592e2SAndy Shevchenko .scl_rise_ns = 200,
26338a592e2SAndy Shevchenko .scl_int_delay_ns = 50,
264df576beeSWolfram Sang };
2656ccbe607SKuninori Morimoto
266c7881871SWolfram Sang /* Fall back to previously used values if not supplied */
267df576beeSWolfram Sang i2c_parse_fw_timings(dev, &t, false);
2686ccbe607SKuninori Morimoto
269b720423aSNguyen Viet Dung switch (priv->devtype) {
270043a3f11SKuninori Morimoto case I2C_RCAR_GEN1:
271b720423aSNguyen Viet Dung cdf_width = 2;
272b720423aSNguyen Viet Dung break;
273043a3f11SKuninori Morimoto case I2C_RCAR_GEN2:
274e7db0d34SWolfram Sang case I2C_RCAR_GEN3:
275b720423aSNguyen Viet Dung cdf_width = 3;
276b720423aSNguyen Viet Dung break;
277b720423aSNguyen Viet Dung default:
278b720423aSNguyen Viet Dung dev_err(dev, "device type error\n");
279b720423aSNguyen Viet Dung return -EIO;
280b720423aSNguyen Viet Dung }
281b720423aSNguyen Viet Dung
2826ccbe607SKuninori Morimoto /*
2836ccbe607SKuninori Morimoto * calculate SCL clock
2846ccbe607SKuninori Morimoto * see
2856ccbe607SKuninori Morimoto * ICCCR
2866ccbe607SKuninori Morimoto *
2876ccbe607SKuninori Morimoto * ick = clkp / (1 + CDF)
2886ccbe607SKuninori Morimoto * SCL = ick / (20 + SCGD * 8 + F[(ticf + tr + intd) * ick])
2896ccbe607SKuninori Morimoto *
2906ccbe607SKuninori Morimoto * ick : I2C internal clock < 20 MHz
291ca68eadeSWolfram Sang * ticf : I2C SCL falling time
292ca68eadeSWolfram Sang * tr : I2C SCL rising time
293ca68eadeSWolfram Sang * intd : LSI internal delay
2946ccbe607SKuninori Morimoto * clkp : peripheral_clk
2956ccbe607SKuninori Morimoto * F[] : integer up-valuation
2966ccbe607SKuninori Morimoto */
297bc8120f1SBen Dooks rate = clk_get_rate(priv->clk);
2988d049403SGuennadi Liakhovetski cdf = rate / 20000000;
29922762ccbSWolfram Sang if (cdf >= 1U << cdf_width) {
3008d049403SGuennadi Liakhovetski dev_err(dev, "Input clock %lu too high\n", rate);
3016ccbe607SKuninori Morimoto return -EIO;
3028d049403SGuennadi Liakhovetski }
3038d049403SGuennadi Liakhovetski ick = rate / (cdf + 1);
3046ccbe607SKuninori Morimoto
3056ccbe607SKuninori Morimoto /*
3066ccbe607SKuninori Morimoto * it is impossible to calculate large scale
3076ccbe607SKuninori Morimoto * number on u32. separate it
3086ccbe607SKuninori Morimoto *
309ca68eadeSWolfram Sang * F[(ticf + tr + intd) * ick] with sum = (ticf + tr + intd)
310ca68eadeSWolfram Sang * = F[sum * ick / 1000000000]
311ca68eadeSWolfram Sang * = F[(ick / 1000000) * sum / 1000]
3126ccbe607SKuninori Morimoto */
313df576beeSWolfram Sang sum = t.scl_fall_ns + t.scl_rise_ns + t.scl_int_delay_ns;
314ca68eadeSWolfram Sang round = (ick + 500000) / 1000000 * sum;
3156ccbe607SKuninori Morimoto round = (round + 500) / 1000;
3166ccbe607SKuninori Morimoto
3176ccbe607SKuninori Morimoto /*
3186ccbe607SKuninori Morimoto * SCL = ick / (20 + SCGD * 8 + F[(ticf + tr + intd) * ick])
3196ccbe607SKuninori Morimoto *
3206ccbe607SKuninori Morimoto * Calculation result (= SCL) should be less than
3216ccbe607SKuninori Morimoto * bus_speed for hardware safety
3228d049403SGuennadi Liakhovetski *
3238d049403SGuennadi Liakhovetski * We could use something along the lines of
3248d049403SGuennadi Liakhovetski * div = ick / (bus_speed + 1) + 1;
3258d049403SGuennadi Liakhovetski * scgd = (div - 20 - round + 7) / 8;
3268d049403SGuennadi Liakhovetski * scl = ick / (20 + (scgd * 8) + round);
3278d049403SGuennadi Liakhovetski * (not fully verified) but that would get pretty involved
3286ccbe607SKuninori Morimoto */
3296ccbe607SKuninori Morimoto for (scgd = 0; scgd < 0x40; scgd++) {
3306ccbe607SKuninori Morimoto scl = ick / (20 + (scgd * 8) + round);
331df576beeSWolfram Sang if (scl <= t.bus_freq_hz)
3326ccbe607SKuninori Morimoto goto scgd_find;
3336ccbe607SKuninori Morimoto }
3346ccbe607SKuninori Morimoto dev_err(dev, "it is impossible to calculate best SCL\n");
3356ccbe607SKuninori Morimoto return -EIO;
3366ccbe607SKuninori Morimoto
3376ccbe607SKuninori Morimoto scgd_find:
3386ccbe607SKuninori Morimoto dev_dbg(dev, "clk %d/%d(%lu), round %u, CDF:0x%x, SCGD: 0x%x\n",
339df576beeSWolfram Sang scl, t.bus_freq_hz, rate, round, cdf, scgd);
3406ccbe607SKuninori Morimoto
3413c2b1ff3SWolfram Sang /* keep icccr value */
34214d32f17SGuennadi Liakhovetski priv->icccr = scgd << cdf_width | cdf;
3436ccbe607SKuninori Morimoto
3446ccbe607SKuninori Morimoto return 0;
3456ccbe607SKuninori Morimoto }
3466ccbe607SKuninori Morimoto
347238904ddSWolfram Sang /*
348238904ddSWolfram Sang * We don't have a test case but the HW engineers say that the write order of
349238904ddSWolfram Sang * ICMSR and ICMCR depends on whether we issue START or REP_START. So, ICMSR
350238904ddSWolfram Sang * handling is outside of this function. First messages clear ICMSR before this
351238904ddSWolfram Sang * function, interrupt handlers clear the relevant bits after this function.
352238904ddSWolfram Sang */
rcar_i2c_prepare_msg(struct rcar_i2c_priv * priv)3537c7117ffSSergei Shtylyov static void rcar_i2c_prepare_msg(struct rcar_i2c_priv *priv)
3546ccbe607SKuninori Morimoto {
355386babf8SWolfram Sang int read = !!rcar_i2c_is_recv(priv);
356f0f0e076SWolfram Sang bool rep_start = !(priv->flags & ID_REP_AFTER_RD);
357386babf8SWolfram Sang
358b9d0684cSWolfram Sang priv->pos = 0;
359238904ddSWolfram Sang priv->flags &= ID_P_MASK;
360238904ddSWolfram Sang
361b9d0684cSWolfram Sang if (priv->msgs_left == 1)
36242c0783bSWolfram Sang priv->flags |= ID_LAST_MSG;
363b9d0684cSWolfram Sang
36430a64757SPeter Rosin rcar_i2c_write(priv, ICMAR, i2c_8bit_addr_from_msg(priv->msg));
365e35fb418SKuninori Morimoto if (priv->flags & ID_P_NOT_ATOMIC)
366e7f42648SWolfram Sang rcar_i2c_write(priv, ICMIER, read ? RCAR_IRQ_RECV : RCAR_IRQ_SEND);
367e7f42648SWolfram Sang
368f0f0e076SWolfram Sang if (rep_start)
369e49865d1SWolfram Sang rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START);
370e49865d1SWolfram Sang }
371238904ddSWolfram Sang
rcar_i2c_first_msg(struct rcar_i2c_priv * priv,struct i2c_msg * msgs,int num)372238904ddSWolfram Sang static void rcar_i2c_first_msg(struct rcar_i2c_priv *priv,
373238904ddSWolfram Sang struct i2c_msg *msgs, int num)
374238904ddSWolfram Sang {
375238904ddSWolfram Sang priv->msg = msgs;
376238904ddSWolfram Sang priv->msgs_left = num;
377238904ddSWolfram Sang rcar_i2c_write(priv, ICMSR, 0); /* must be before preparing msg */
378238904ddSWolfram Sang rcar_i2c_prepare_msg(priv);
3796ccbe607SKuninori Morimoto }
3806ccbe607SKuninori Morimoto
rcar_i2c_next_msg(struct rcar_i2c_priv * priv)381cc21d0b4SWolfram Sang static void rcar_i2c_next_msg(struct rcar_i2c_priv *priv)
382cc21d0b4SWolfram Sang {
383cc21d0b4SWolfram Sang priv->msg++;
384cc21d0b4SWolfram Sang priv->msgs_left--;
385cc21d0b4SWolfram Sang rcar_i2c_prepare_msg(priv);
386238904ddSWolfram Sang /* ICMSR handling must come afterwards in the irq handler */
387cc21d0b4SWolfram Sang }
388cc21d0b4SWolfram Sang
rcar_i2c_cleanup_dma(struct rcar_i2c_priv * priv,bool terminate)389a5f7cf95SWolfram Sang static void rcar_i2c_cleanup_dma(struct rcar_i2c_priv *priv, bool terminate)
39073e8b052SNiklas Söderlund {
39173e8b052SNiklas Söderlund struct dma_chan *chan = priv->dma_direction == DMA_FROM_DEVICE
39273e8b052SNiklas Söderlund ? priv->dma_rx : priv->dma_tx;
39373e8b052SNiklas Söderlund
394a5f7cf95SWolfram Sang /* only allowed from thread context! */
395a5f7cf95SWolfram Sang if (terminate)
396a5f7cf95SWolfram Sang dmaengine_terminate_sync(chan);
397a5f7cf95SWolfram Sang
39873e8b052SNiklas Söderlund dma_unmap_single(chan->device->dev, sg_dma_address(&priv->sg),
39991633503SWolfram Sang sg_dma_len(&priv->sg), priv->dma_direction);
40073e8b052SNiklas Söderlund
401988c3133SWolfram Sang /* Gen3+ can only do one RXDMA per transfer and we just completed it */
402988c3133SWolfram Sang if (priv->devtype >= I2C_RCAR_GEN3 &&
4033b770017SWolfram Sang priv->dma_direction == DMA_FROM_DEVICE)
4043b770017SWolfram Sang priv->flags |= ID_P_NO_RXDMA;
4053b770017SWolfram Sang
40673e8b052SNiklas Söderlund priv->dma_direction = DMA_NONE;
407a35ba2f7SHiromitsu Yamasaki
408a35ba2f7SHiromitsu Yamasaki /* Disable DMA Master Received/Transmitted, must be last! */
409a35ba2f7SHiromitsu Yamasaki rcar_i2c_write(priv, ICDMAER, 0);
41073e8b052SNiklas Söderlund }
41173e8b052SNiklas Söderlund
rcar_i2c_dma_callback(void * data)41273e8b052SNiklas Söderlund static void rcar_i2c_dma_callback(void *data)
41373e8b052SNiklas Söderlund {
41473e8b052SNiklas Söderlund struct rcar_i2c_priv *priv = data;
41573e8b052SNiklas Söderlund
41673e8b052SNiklas Söderlund priv->pos += sg_dma_len(&priv->sg);
41773e8b052SNiklas Söderlund
418a5f7cf95SWolfram Sang rcar_i2c_cleanup_dma(priv, false);
41973e8b052SNiklas Söderlund }
42073e8b052SNiklas Söderlund
rcar_i2c_dma(struct rcar_i2c_priv * priv)42103f85e38SWolfram Sang static bool rcar_i2c_dma(struct rcar_i2c_priv *priv)
42273e8b052SNiklas Söderlund {
42373e8b052SNiklas Söderlund struct device *dev = rcar_i2c_priv_to_dev(priv);
42473e8b052SNiklas Söderlund struct i2c_msg *msg = priv->msg;
42573e8b052SNiklas Söderlund bool read = msg->flags & I2C_M_RD;
42673e8b052SNiklas Söderlund enum dma_data_direction dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
42773e8b052SNiklas Söderlund struct dma_chan *chan = read ? priv->dma_rx : priv->dma_tx;
42873e8b052SNiklas Söderlund struct dma_async_tx_descriptor *txdesc;
42973e8b052SNiklas Söderlund dma_addr_t dma_addr;
43073e8b052SNiklas Söderlund dma_cookie_t cookie;
43173e8b052SNiklas Söderlund unsigned char *buf;
43273e8b052SNiklas Söderlund int len;
43373e8b052SNiklas Söderlund
4343b770017SWolfram Sang /* Do various checks to see if DMA is feasible at all */
435e35fb418SKuninori Morimoto if (!(priv->flags & ID_P_NOT_ATOMIC) || IS_ERR(chan) || msg->len < RCAR_MIN_DMA_LEN ||
436ed5a8104SWolfram Sang !(msg->flags & I2C_M_DMA_SAFE) || (read && priv->flags & ID_P_NO_RXDMA))
43703f85e38SWolfram Sang return false;
43873e8b052SNiklas Söderlund
43973e8b052SNiklas Söderlund if (read) {
44073e8b052SNiklas Söderlund /*
44173e8b052SNiklas Söderlund * The last two bytes needs to be fetched using PIO in
44273e8b052SNiklas Söderlund * order for the STOP phase to work.
44373e8b052SNiklas Söderlund */
44473e8b052SNiklas Söderlund buf = priv->msg->buf;
44573e8b052SNiklas Söderlund len = priv->msg->len - 2;
44673e8b052SNiklas Söderlund } else {
44773e8b052SNiklas Söderlund /*
44873e8b052SNiklas Söderlund * First byte in message was sent using PIO.
44973e8b052SNiklas Söderlund */
45073e8b052SNiklas Söderlund buf = priv->msg->buf + 1;
45173e8b052SNiklas Söderlund len = priv->msg->len - 1;
45273e8b052SNiklas Söderlund }
45373e8b052SNiklas Söderlund
45473e8b052SNiklas Söderlund dma_addr = dma_map_single(chan->device->dev, buf, len, dir);
455c13c2918SWolfram Sang if (dma_mapping_error(chan->device->dev, dma_addr)) {
45673e8b052SNiklas Söderlund dev_dbg(dev, "dma map failed, using PIO\n");
45703f85e38SWolfram Sang return false;
45873e8b052SNiklas Söderlund }
45973e8b052SNiklas Söderlund
46073e8b052SNiklas Söderlund sg_dma_len(&priv->sg) = len;
46173e8b052SNiklas Söderlund sg_dma_address(&priv->sg) = dma_addr;
46273e8b052SNiklas Söderlund
46373e8b052SNiklas Söderlund priv->dma_direction = dir;
46473e8b052SNiklas Söderlund
46573e8b052SNiklas Söderlund txdesc = dmaengine_prep_slave_sg(chan, &priv->sg, 1,
46673e8b052SNiklas Söderlund read ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV,
46773e8b052SNiklas Söderlund DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
46873e8b052SNiklas Söderlund if (!txdesc) {
46973e8b052SNiklas Söderlund dev_dbg(dev, "dma prep slave sg failed, using PIO\n");
470a5f7cf95SWolfram Sang rcar_i2c_cleanup_dma(priv, false);
47103f85e38SWolfram Sang return false;
47273e8b052SNiklas Söderlund }
47373e8b052SNiklas Söderlund
47473e8b052SNiklas Söderlund txdesc->callback = rcar_i2c_dma_callback;
47573e8b052SNiklas Söderlund txdesc->callback_param = priv;
47673e8b052SNiklas Söderlund
47773e8b052SNiklas Söderlund cookie = dmaengine_submit(txdesc);
47873e8b052SNiklas Söderlund if (dma_submit_error(cookie)) {
47973e8b052SNiklas Söderlund dev_dbg(dev, "submitting dma failed, using PIO\n");
480a5f7cf95SWolfram Sang rcar_i2c_cleanup_dma(priv, false);
48103f85e38SWolfram Sang return false;
48273e8b052SNiklas Söderlund }
48373e8b052SNiklas Söderlund
48473e8b052SNiklas Söderlund /* Enable DMA Master Received/Transmitted */
48573e8b052SNiklas Söderlund if (read)
48673e8b052SNiklas Söderlund rcar_i2c_write(priv, ICDMAER, RMDMAE);
48773e8b052SNiklas Söderlund else
48873e8b052SNiklas Söderlund rcar_i2c_write(priv, ICDMAER, TMDMAE);
48973e8b052SNiklas Söderlund
49073e8b052SNiklas Söderlund dma_async_issue_pending(chan);
49103f85e38SWolfram Sang return true;
49273e8b052SNiklas Söderlund }
49373e8b052SNiklas Söderlund
rcar_i2c_irq_send(struct rcar_i2c_priv * priv,u32 msr)494cc21d0b4SWolfram Sang static void rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr)
4956ccbe607SKuninori Morimoto {
4966ccbe607SKuninori Morimoto struct i2c_msg *msg = priv->msg;
497a0fb48c9SWolfram Sang u32 irqs_to_clear = MDE;
4986ccbe607SKuninori Morimoto
4993c2b1ff3SWolfram Sang /* FIXME: sometimes, unknown interrupt happened. Do nothing */
5006ccbe607SKuninori Morimoto if (!(msr & MDE))
501cc21d0b4SWolfram Sang return;
5026ccbe607SKuninori Morimoto
503a0fb48c9SWolfram Sang if (msr & MAT)
504a0fb48c9SWolfram Sang irqs_to_clear |= MAT;
505a0fb48c9SWolfram Sang
50694e290b0SWolfram Sang /* Check if DMA can be enabled and take over */
50794e290b0SWolfram Sang if (priv->pos == 1 && rcar_i2c_dma(priv))
50894e290b0SWolfram Sang return;
50994e290b0SWolfram Sang
5106ccbe607SKuninori Morimoto if (priv->pos < msg->len) {
5116ccbe607SKuninori Morimoto /*
5126ccbe607SKuninori Morimoto * Prepare next data to ICRXTX register.
5136ccbe607SKuninori Morimoto * This data will go to _SHIFT_ register.
5146ccbe607SKuninori Morimoto *
5156ccbe607SKuninori Morimoto * *
5166ccbe607SKuninori Morimoto * [ICRXTX] -> [SHIFT] -> [I2C bus]
5176ccbe607SKuninori Morimoto */
5186ccbe607SKuninori Morimoto rcar_i2c_write(priv, ICRXTX, msg->buf[priv->pos]);
5196ccbe607SKuninori Morimoto priv->pos++;
5206ccbe607SKuninori Morimoto } else {
5216ccbe607SKuninori Morimoto /*
5226ccbe607SKuninori Morimoto * The last data was pushed to ICRXTX on _PREV_ empty irq.
5236ccbe607SKuninori Morimoto * It is on _SHIFT_ register, and will sent to I2C bus.
5246ccbe607SKuninori Morimoto *
5256ccbe607SKuninori Morimoto * *
5266ccbe607SKuninori Morimoto * [ICRXTX] -> [SHIFT] -> [I2C bus]
5276ccbe607SKuninori Morimoto */
5286ccbe607SKuninori Morimoto
529a0fb48c9SWolfram Sang if (priv->flags & ID_LAST_MSG)
5306ccbe607SKuninori Morimoto /*
5316ccbe607SKuninori Morimoto * If current msg is the _LAST_ msg,
5326ccbe607SKuninori Morimoto * prepare stop condition here.
5336ccbe607SKuninori Morimoto * ID_DONE will be set on STOP irq.
5346ccbe607SKuninori Morimoto */
5354f443a8aSWolfram Sang rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP);
536a0fb48c9SWolfram Sang else
537cc21d0b4SWolfram Sang rcar_i2c_next_msg(priv);
5386ccbe607SKuninori Morimoto }
5396ccbe607SKuninori Morimoto
540a0fb48c9SWolfram Sang rcar_i2c_clear_irq(priv, irqs_to_clear);
5416ccbe607SKuninori Morimoto }
5426ccbe607SKuninori Morimoto
rcar_i2c_irq_recv(struct rcar_i2c_priv * priv,u32 msr)543cc21d0b4SWolfram Sang static void rcar_i2c_irq_recv(struct rcar_i2c_priv *priv, u32 msr)
5446ccbe607SKuninori Morimoto {
5456ccbe607SKuninori Morimoto struct i2c_msg *msg = priv->msg;
546633c0e75SWolfram Sang bool recv_len_init = priv->pos == 0 && msg->flags & I2C_M_RECV_LEN;
547a0fb48c9SWolfram Sang u32 irqs_to_clear = MDR;
5486ccbe607SKuninori Morimoto
5493c2b1ff3SWolfram Sang /* FIXME: sometimes, unknown interrupt happened. Do nothing */
5506ccbe607SKuninori Morimoto if (!(msr & MDR))
551cc21d0b4SWolfram Sang return;
5526ccbe607SKuninori Morimoto
5536ccbe607SKuninori Morimoto if (msr & MAT) {
554a0fb48c9SWolfram Sang irqs_to_clear |= MAT;
55573e8b052SNiklas Söderlund /*
55673e8b052SNiklas Söderlund * Address transfer phase finished, but no data at this point.
55773e8b052SNiklas Söderlund * Try to use DMA to receive data.
55873e8b052SNiklas Söderlund */
55973e8b052SNiklas Söderlund rcar_i2c_dma(priv);
5606ccbe607SKuninori Morimoto } else if (priv->pos < msg->len) {
5613c2b1ff3SWolfram Sang /* get received data */
562633c0e75SWolfram Sang u8 data = rcar_i2c_read(priv, ICRXTX);
563633c0e75SWolfram Sang
564633c0e75SWolfram Sang msg->buf[priv->pos] = data;
565633c0e75SWolfram Sang if (recv_len_init) {
566633c0e75SWolfram Sang if (data == 0 || data > I2C_SMBUS_BLOCK_MAX) {
567633c0e75SWolfram Sang priv->flags |= ID_DONE | ID_EPROTO;
568633c0e75SWolfram Sang return;
569633c0e75SWolfram Sang }
570633c0e75SWolfram Sang msg->len += msg->buf[0];
571633c0e75SWolfram Sang /* Enough data for DMA? */
572633c0e75SWolfram Sang if (rcar_i2c_dma(priv))
573633c0e75SWolfram Sang return;
574633c0e75SWolfram Sang /* new length after RECV_LEN now properly initialized */
575633c0e75SWolfram Sang recv_len_init = false;
576633c0e75SWolfram Sang }
5776ccbe607SKuninori Morimoto priv->pos++;
5786ccbe607SKuninori Morimoto }
5796ccbe607SKuninori Morimoto
580633c0e75SWolfram Sang /*
581633c0e75SWolfram Sang * If next received data is the _LAST_ and we are not waiting for a new
582633c0e75SWolfram Sang * length because of RECV_LEN, then go to a new phase.
583633c0e75SWolfram Sang */
584633c0e75SWolfram Sang if (priv->pos + 1 == msg->len && !recv_len_init) {
58519358d44SWolfram Sang if (priv->flags & ID_LAST_MSG) {
5864f443a8aSWolfram Sang rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP);
58719358d44SWolfram Sang } else {
58819358d44SWolfram Sang rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START);
589f0f0e076SWolfram Sang priv->flags |= ID_REP_AFTER_RD;
59019358d44SWolfram Sang }
59119358d44SWolfram Sang }
5926ccbe607SKuninori Morimoto
593cc21d0b4SWolfram Sang if (priv->pos == msg->len && !(priv->flags & ID_LAST_MSG))
594cc21d0b4SWolfram Sang rcar_i2c_next_msg(priv);
595a0fb48c9SWolfram Sang
596a0fb48c9SWolfram Sang rcar_i2c_clear_irq(priv, irqs_to_clear);
5976ccbe607SKuninori Morimoto }
5986ccbe607SKuninori Morimoto
rcar_i2c_slave_irq(struct rcar_i2c_priv * priv)599de20d185SWolfram Sang static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv)
600de20d185SWolfram Sang {
601de20d185SWolfram Sang u32 ssr_raw, ssr_filtered;
602de20d185SWolfram Sang u8 value;
603*6152c2c6SWolfram Sang int ret;
604de20d185SWolfram Sang
605de20d185SWolfram Sang ssr_raw = rcar_i2c_read(priv, ICSSR) & 0xff;
606de20d185SWolfram Sang ssr_filtered = ssr_raw & rcar_i2c_read(priv, ICSIER);
607de20d185SWolfram Sang
608de20d185SWolfram Sang if (!ssr_filtered)
609de20d185SWolfram Sang return false;
610de20d185SWolfram Sang
611de20d185SWolfram Sang /* address detected */
612de20d185SWolfram Sang if (ssr_filtered & SAR) {
613de20d185SWolfram Sang /* read or write request */
614de20d185SWolfram Sang if (ssr_raw & STM) {
6155b77d162SWolfram Sang i2c_slave_event(priv->slave, I2C_SLAVE_READ_REQUESTED, &value);
616de20d185SWolfram Sang rcar_i2c_write(priv, ICRXTX, value);
617de20d185SWolfram Sang rcar_i2c_write(priv, ICSIER, SDE | SSR | SAR);
618de20d185SWolfram Sang } else {
619*6152c2c6SWolfram Sang ret = i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_REQUESTED, &value);
620*6152c2c6SWolfram Sang if (ret)
621*6152c2c6SWolfram Sang priv->slave_flags |= ID_SLAVE_NACK;
622*6152c2c6SWolfram Sang
623de20d185SWolfram Sang rcar_i2c_read(priv, ICRXTX); /* dummy read */
624de20d185SWolfram Sang rcar_i2c_write(priv, ICSIER, SDR | SSR | SAR);
625de20d185SWolfram Sang }
626de20d185SWolfram Sang
627314139f9SWolfram Sang /* Clear SSR, too, because of old STOPs to other clients than us */
628314139f9SWolfram Sang rcar_i2c_write(priv, ICSSR, ~(SAR | SSR) & 0xff);
629de20d185SWolfram Sang }
630de20d185SWolfram Sang
631de20d185SWolfram Sang /* master sent stop */
632de20d185SWolfram Sang if (ssr_filtered & SSR) {
633de20d185SWolfram Sang i2c_slave_event(priv->slave, I2C_SLAVE_STOP, &value);
634914a7b35SWolfram Sang rcar_i2c_write(priv, ICSCR, SIE | SDBS); /* clear our NACK */
635*6152c2c6SWolfram Sang priv->slave_flags &= ~ID_SLAVE_NACK;
636314139f9SWolfram Sang rcar_i2c_write(priv, ICSIER, SAR);
637de20d185SWolfram Sang rcar_i2c_write(priv, ICSSR, ~SSR & 0xff);
638de20d185SWolfram Sang }
639de20d185SWolfram Sang
640de20d185SWolfram Sang /* master wants to write to us */
641de20d185SWolfram Sang if (ssr_filtered & SDR) {
642de20d185SWolfram Sang value = rcar_i2c_read(priv, ICRXTX);
6435b77d162SWolfram Sang ret = i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_RECEIVED, &value);
644*6152c2c6SWolfram Sang if (ret)
645*6152c2c6SWolfram Sang priv->slave_flags |= ID_SLAVE_NACK;
646*6152c2c6SWolfram Sang
647*6152c2c6SWolfram Sang /* Send NACK in case of error, but it will come 1 byte late :( */
648*6152c2c6SWolfram Sang rcar_i2c_write(priv, ICSCR, SIE | SDBS |
649*6152c2c6SWolfram Sang (priv->slave_flags & ID_SLAVE_NACK ? FNA : 0));
650de20d185SWolfram Sang rcar_i2c_write(priv, ICSSR, ~SDR & 0xff);
651de20d185SWolfram Sang }
652de20d185SWolfram Sang
653de20d185SWolfram Sang /* master wants to read from us */
654de20d185SWolfram Sang if (ssr_filtered & SDE) {
6555b77d162SWolfram Sang i2c_slave_event(priv->slave, I2C_SLAVE_READ_PROCESSED, &value);
656de20d185SWolfram Sang rcar_i2c_write(priv, ICRXTX, value);
657de20d185SWolfram Sang rcar_i2c_write(priv, ICSSR, ~SDE & 0xff);
658de20d185SWolfram Sang }
659de20d185SWolfram Sang
660de20d185SWolfram Sang return true;
661de20d185SWolfram Sang }
662de20d185SWolfram Sang
6637ce98a55SWolfram Sang /*
6647ce98a55SWolfram Sang * This driver has a lock-free design because there are IP cores (at least
6657ce98a55SWolfram Sang * R-Car Gen2) which have an inherent race condition in their hardware design.
666c7b514ecSWolfram Sang * There, we need to switch to RCAR_BUS_PHASE_DATA as soon as possible after
6677ce98a55SWolfram Sang * the interrupt was generated, otherwise an unwanted repeated message gets
6687ce98a55SWolfram Sang * generated. It turned out that taking a spinlock at the beginning of the ISR
6697ce98a55SWolfram Sang * was already causing repeated messages. Thus, this driver was converted to
6707ce98a55SWolfram Sang * the now lockless behaviour. Please keep this in mind when hacking the driver.
6719c975c43SWolfram Sang * R-Car Gen3 seems to have this fixed but earlier versions than R-Car Gen2 are
6729c975c43SWolfram Sang * likely affected. Therefore, we have different interrupt handler entries.
6737ce98a55SWolfram Sang */
rcar_i2c_irq(int irq,struct rcar_i2c_priv * priv,u32 msr)6749c975c43SWolfram Sang static irqreturn_t rcar_i2c_irq(int irq, struct rcar_i2c_priv *priv, u32 msr)
6756ccbe607SKuninori Morimoto {
676aa5beaf6SSergei Shtylyov if (!msr) {
677c3be0af1SWolfram Sang if (rcar_i2c_slave_irq(priv))
678c3be0af1SWolfram Sang return IRQ_HANDLED;
679c3be0af1SWolfram Sang
680c3be0af1SWolfram Sang return IRQ_NONE;
681aa5beaf6SSergei Shtylyov }
682dd318b0dSSergei Shtylyov
68351371cdcSWolfram Sang /* Arbitration lost */
6846ccbe607SKuninori Morimoto if (msr & MAL) {
68542c0783bSWolfram Sang priv->flags |= ID_DONE | ID_ARBLOST;
6866ccbe607SKuninori Morimoto goto out;
6876ccbe607SKuninori Morimoto }
6886ccbe607SKuninori Morimoto
68951371cdcSWolfram Sang /* Nack */
6906ccbe607SKuninori Morimoto if (msr & MNR) {
691d89667b1SWolfram Sang /* HW automatically sends STOP after received NACK */
692e35fb418SKuninori Morimoto if (priv->flags & ID_P_NOT_ATOMIC)
693f2382249SWolfram Sang rcar_i2c_write(priv, ICMIER, RCAR_IRQ_STOP);
69442c0783bSWolfram Sang priv->flags |= ID_NACK;
6956ccbe607SKuninori Morimoto goto out;
6966ccbe607SKuninori Morimoto }
6976ccbe607SKuninori Morimoto
698dd318b0dSSergei Shtylyov /* Stop */
699dd318b0dSSergei Shtylyov if (msr & MST) {
700cc21d0b4SWolfram Sang priv->msgs_left--; /* The last message also made it */
70142c0783bSWolfram Sang priv->flags |= ID_DONE;
702dd318b0dSSergei Shtylyov goto out;
703dd318b0dSSergei Shtylyov }
704dd318b0dSSergei Shtylyov
7056ccbe607SKuninori Morimoto if (rcar_i2c_is_recv(priv))
706cc21d0b4SWolfram Sang rcar_i2c_irq_recv(priv, msr);
7076ccbe607SKuninori Morimoto else
708cc21d0b4SWolfram Sang rcar_i2c_irq_send(priv, msr);
7096ccbe607SKuninori Morimoto
7106ccbe607SKuninori Morimoto out:
71142c0783bSWolfram Sang if (priv->flags & ID_DONE) {
712f2382249SWolfram Sang rcar_i2c_write(priv, ICMIER, 0);
7133c95de67SWolfram Sang rcar_i2c_write(priv, ICMSR, 0);
714e35fb418SKuninori Morimoto if (priv->flags & ID_P_NOT_ATOMIC)
7156ccbe607SKuninori Morimoto wake_up(&priv->wait);
7166ccbe607SKuninori Morimoto }
7176ccbe607SKuninori Morimoto
718c3be0af1SWolfram Sang return IRQ_HANDLED;
7196ccbe607SKuninori Morimoto }
7206ccbe607SKuninori Morimoto
rcar_i2c_gen2_irq(int irq,void * ptr)7219c975c43SWolfram Sang static irqreturn_t rcar_i2c_gen2_irq(int irq, void *ptr)
7229c975c43SWolfram Sang {
7239c975c43SWolfram Sang struct rcar_i2c_priv *priv = ptr;
7249c975c43SWolfram Sang u32 msr;
7259c975c43SWolfram Sang
7269c975c43SWolfram Sang /* Clear START or STOP immediately, except for REPSTART after read */
727f0f0e076SWolfram Sang if (likely(!(priv->flags & ID_REP_AFTER_RD)))
7289c975c43SWolfram Sang rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA);
7299c975c43SWolfram Sang
7309c975c43SWolfram Sang /* Only handle interrupts that are currently enabled */
7319c975c43SWolfram Sang msr = rcar_i2c_read(priv, ICMSR);
732e35fb418SKuninori Morimoto if (priv->flags & ID_P_NOT_ATOMIC)
7339c975c43SWolfram Sang msr &= rcar_i2c_read(priv, ICMIER);
7349c975c43SWolfram Sang
7359c975c43SWolfram Sang return rcar_i2c_irq(irq, priv, msr);
7369c975c43SWolfram Sang }
7379c975c43SWolfram Sang
rcar_i2c_gen3_irq(int irq,void * ptr)7389c975c43SWolfram Sang static irqreturn_t rcar_i2c_gen3_irq(int irq, void *ptr)
7399c975c43SWolfram Sang {
7409c975c43SWolfram Sang struct rcar_i2c_priv *priv = ptr;
7419c975c43SWolfram Sang u32 msr;
7429c975c43SWolfram Sang
7439c975c43SWolfram Sang /* Only handle interrupts that are currently enabled */
7449c975c43SWolfram Sang msr = rcar_i2c_read(priv, ICMSR);
745e35fb418SKuninori Morimoto if (priv->flags & ID_P_NOT_ATOMIC)
7469c975c43SWolfram Sang msr &= rcar_i2c_read(priv, ICMIER);
7479c975c43SWolfram Sang
7489c975c43SWolfram Sang /*
7499c975c43SWolfram Sang * Clear START or STOP immediately, except for REPSTART after read or
7509c975c43SWolfram Sang * if a spurious interrupt was detected.
7519c975c43SWolfram Sang */
752f0f0e076SWolfram Sang if (likely(!(priv->flags & ID_REP_AFTER_RD) && msr))
7539c975c43SWolfram Sang rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA);
7549c975c43SWolfram Sang
7559c975c43SWolfram Sang return rcar_i2c_irq(irq, priv, msr);
7569c975c43SWolfram Sang }
7579c975c43SWolfram Sang
rcar_i2c_request_dma_chan(struct device * dev,enum dma_transfer_direction dir,dma_addr_t port_addr)75873e8b052SNiklas Söderlund static struct dma_chan *rcar_i2c_request_dma_chan(struct device *dev,
75973e8b052SNiklas Söderlund enum dma_transfer_direction dir,
76073e8b052SNiklas Söderlund dma_addr_t port_addr)
76173e8b052SNiklas Söderlund {
76273e8b052SNiklas Söderlund struct dma_chan *chan;
76373e8b052SNiklas Söderlund struct dma_slave_config cfg;
76473e8b052SNiklas Söderlund char *chan_name = dir == DMA_MEM_TO_DEV ? "tx" : "rx";
76573e8b052SNiklas Söderlund int ret;
76673e8b052SNiklas Söderlund
7676aabf9d0SNiklas Söderlund chan = dma_request_chan(dev, chan_name);
76873e8b052SNiklas Söderlund if (IS_ERR(chan)) {
7698ae034c2SEugeniu Rosca dev_dbg(dev, "request_channel failed for %s (%ld)\n",
7708ae034c2SEugeniu Rosca chan_name, PTR_ERR(chan));
77173e8b052SNiklas Söderlund return chan;
77273e8b052SNiklas Söderlund }
77373e8b052SNiklas Söderlund
77473e8b052SNiklas Söderlund memset(&cfg, 0, sizeof(cfg));
77573e8b052SNiklas Söderlund cfg.direction = dir;
77673e8b052SNiklas Söderlund if (dir == DMA_MEM_TO_DEV) {
77773e8b052SNiklas Söderlund cfg.dst_addr = port_addr;
77873e8b052SNiklas Söderlund cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
77973e8b052SNiklas Söderlund } else {
78073e8b052SNiklas Söderlund cfg.src_addr = port_addr;
78173e8b052SNiklas Söderlund cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
78273e8b052SNiklas Söderlund }
78373e8b052SNiklas Söderlund
78473e8b052SNiklas Söderlund ret = dmaengine_slave_config(chan, &cfg);
78573e8b052SNiklas Söderlund if (ret) {
78673e8b052SNiklas Söderlund dev_dbg(dev, "slave_config failed for %s (%d)\n",
78773e8b052SNiklas Söderlund chan_name, ret);
78873e8b052SNiklas Söderlund dma_release_channel(chan);
78973e8b052SNiklas Söderlund return ERR_PTR(ret);
79073e8b052SNiklas Söderlund }
79173e8b052SNiklas Söderlund
79273e8b052SNiklas Söderlund dev_dbg(dev, "got DMA channel for %s\n", chan_name);
79373e8b052SNiklas Söderlund return chan;
79473e8b052SNiklas Söderlund }
79573e8b052SNiklas Söderlund
rcar_i2c_request_dma(struct rcar_i2c_priv * priv,struct i2c_msg * msg)79673e8b052SNiklas Söderlund static void rcar_i2c_request_dma(struct rcar_i2c_priv *priv,
79773e8b052SNiklas Söderlund struct i2c_msg *msg)
79873e8b052SNiklas Söderlund {
79973e8b052SNiklas Söderlund struct device *dev = rcar_i2c_priv_to_dev(priv);
80073e8b052SNiklas Söderlund bool read;
80173e8b052SNiklas Söderlund struct dma_chan *chan;
80273e8b052SNiklas Söderlund enum dma_transfer_direction dir;
80373e8b052SNiklas Söderlund
80473e8b052SNiklas Söderlund read = msg->flags & I2C_M_RD;
80573e8b052SNiklas Söderlund
80673e8b052SNiklas Söderlund chan = read ? priv->dma_rx : priv->dma_tx;
80773e8b052SNiklas Söderlund if (PTR_ERR(chan) != -EPROBE_DEFER)
80873e8b052SNiklas Söderlund return;
80973e8b052SNiklas Söderlund
81073e8b052SNiklas Söderlund dir = read ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV;
81173e8b052SNiklas Söderlund chan = rcar_i2c_request_dma_chan(dev, dir, priv->res->start + ICRXTX);
81273e8b052SNiklas Söderlund
81373e8b052SNiklas Söderlund if (read)
81473e8b052SNiklas Söderlund priv->dma_rx = chan;
81573e8b052SNiklas Söderlund else
81673e8b052SNiklas Söderlund priv->dma_tx = chan;
81773e8b052SNiklas Söderlund }
81873e8b052SNiklas Söderlund
rcar_i2c_release_dma(struct rcar_i2c_priv * priv)81973e8b052SNiklas Söderlund static void rcar_i2c_release_dma(struct rcar_i2c_priv *priv)
82073e8b052SNiklas Söderlund {
82173e8b052SNiklas Söderlund if (!IS_ERR(priv->dma_tx)) {
82273e8b052SNiklas Söderlund dma_release_channel(priv->dma_tx);
82373e8b052SNiklas Söderlund priv->dma_tx = ERR_PTR(-EPROBE_DEFER);
82473e8b052SNiklas Söderlund }
82573e8b052SNiklas Söderlund
82673e8b052SNiklas Söderlund if (!IS_ERR(priv->dma_rx)) {
82773e8b052SNiklas Söderlund dma_release_channel(priv->dma_rx);
82873e8b052SNiklas Söderlund priv->dma_rx = ERR_PTR(-EPROBE_DEFER);
82973e8b052SNiklas Söderlund }
83073e8b052SNiklas Söderlund }
83173e8b052SNiklas Söderlund
8323b770017SWolfram Sang /* I2C is a special case, we need to poll the status of a reset */
rcar_i2c_do_reset(struct rcar_i2c_priv * priv)8333b770017SWolfram Sang static int rcar_i2c_do_reset(struct rcar_i2c_priv *priv)
8343b770017SWolfram Sang {
83574779f6eSWolfram Sang int ret;
8363b770017SWolfram Sang
8374d2d0491SWolfram Sang /* Don't reset if a slave instance is currently running */
8384d2d0491SWolfram Sang if (priv->slave)
8394d2d0491SWolfram Sang return -EISCONN;
8404d2d0491SWolfram Sang
8413b770017SWolfram Sang ret = reset_control_reset(priv->rstc);
8423b770017SWolfram Sang if (ret)
8433b770017SWolfram Sang return ret;
8443b770017SWolfram Sang
84574779f6eSWolfram Sang return read_poll_timeout_atomic(reset_control_status, ret, ret == 0, 1,
84674779f6eSWolfram Sang 100, false, priv->rstc);
8473b770017SWolfram Sang }
8483b770017SWolfram Sang
rcar_i2c_master_xfer(struct i2c_adapter * adap,struct i2c_msg * msgs,int num)8496ccbe607SKuninori Morimoto static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
8506ccbe607SKuninori Morimoto struct i2c_msg *msgs,
8516ccbe607SKuninori Morimoto int num)
8526ccbe607SKuninori Morimoto {
8536ccbe607SKuninori Morimoto struct rcar_i2c_priv *priv = i2c_get_adapdata(adap);
8546ccbe607SKuninori Morimoto struct device *dev = rcar_i2c_priv_to_dev(priv);
855b6763d0dSWolfram Sang int i, ret;
856ff2316b8SWolfram Sang long time_left;
8576ccbe607SKuninori Morimoto
858e35fb418SKuninori Morimoto priv->flags |= ID_P_NOT_ATOMIC;
85982531dfdSUlrich Hecht
8606ccbe607SKuninori Morimoto pm_runtime_get_sync(dev);
8616ccbe607SKuninori Morimoto
8620b57436fSWolfram Sang /* Check bus state before init otherwise bus busy info will be lost */
8630b57436fSWolfram Sang ret = rcar_i2c_bus_barrier(priv);
8640b57436fSWolfram Sang if (ret < 0)
8650b57436fSWolfram Sang goto out;
8660b57436fSWolfram Sang
867988c3133SWolfram Sang /* Gen3+ needs a reset. That also allows RXDMA once */
868988c3133SWolfram Sang if (priv->devtype >= I2C_RCAR_GEN3) {
8694c029f04SWolfram Sang ret = rcar_i2c_do_reset(priv);
8704c029f04SWolfram Sang if (ret)
8714c029f04SWolfram Sang goto out;
872557d62e4SWolfram Sang priv->flags &= ~ID_P_NO_RXDMA;
8733b770017SWolfram Sang }
8743b770017SWolfram Sang
875ae481cc1SWolfram Sang rcar_i2c_init(priv);
876ae481cc1SWolfram Sang
8773ef3e5cdSWolfram Sang for (i = 0; i < num; i++)
87873e8b052SNiklas Söderlund rcar_i2c_request_dma(priv, msgs + i);
879d7653964SWolfram Sang
880238904ddSWolfram Sang rcar_i2c_first_msg(priv, msgs, num);
8816ccbe607SKuninori Morimoto
88242c0783bSWolfram Sang time_left = wait_event_timeout(priv->wait, priv->flags & ID_DONE,
883cc21d0b4SWolfram Sang num * adap->timeout);
88431d86033SWolfram Sang
88531d86033SWolfram Sang /* cleanup DMA if it couldn't complete properly due to an error */
88631d86033SWolfram Sang if (priv->dma_direction != DMA_NONE)
887a5f7cf95SWolfram Sang rcar_i2c_cleanup_dma(priv, true);
88831d86033SWolfram Sang
88931d86033SWolfram Sang if (!time_left) {
890ff2316b8SWolfram Sang rcar_i2c_init(priv);
8916ccbe607SKuninori Morimoto ret = -ETIMEDOUT;
89242c0783bSWolfram Sang } else if (priv->flags & ID_NACK) {
8936ff4b105SBen Dooks ret = -ENXIO;
89442c0783bSWolfram Sang } else if (priv->flags & ID_ARBLOST) {
8956ccbe607SKuninori Morimoto ret = -EAGAIN;
896633c0e75SWolfram Sang } else if (priv->flags & ID_EPROTO) {
897633c0e75SWolfram Sang ret = -EPROTO;
898cc21d0b4SWolfram Sang } else {
899cc21d0b4SWolfram Sang ret = num - priv->msgs_left; /* The number of transfer */
9006ccbe607SKuninori Morimoto }
9013f7de22eSWolfram Sang out:
9026ccbe607SKuninori Morimoto pm_runtime_put(dev);
9036ccbe607SKuninori Morimoto
9046ff4b105SBen Dooks if (ret < 0 && ret != -ENXIO)
9056ccbe607SKuninori Morimoto dev_err(dev, "error %d : %x\n", ret, priv->flags);
9066ccbe607SKuninori Morimoto
9076ccbe607SKuninori Morimoto return ret;
9086ccbe607SKuninori Morimoto }
9096ccbe607SKuninori Morimoto
rcar_i2c_master_xfer_atomic(struct i2c_adapter * adap,struct i2c_msg * msgs,int num)91082531dfdSUlrich Hecht static int rcar_i2c_master_xfer_atomic(struct i2c_adapter *adap,
91182531dfdSUlrich Hecht struct i2c_msg *msgs,
91282531dfdSUlrich Hecht int num)
91382531dfdSUlrich Hecht {
91482531dfdSUlrich Hecht struct rcar_i2c_priv *priv = i2c_get_adapdata(adap);
91582531dfdSUlrich Hecht struct device *dev = rcar_i2c_priv_to_dev(priv);
91682531dfdSUlrich Hecht unsigned long j;
91782531dfdSUlrich Hecht bool time_left;
91882531dfdSUlrich Hecht int ret;
91982531dfdSUlrich Hecht
920e35fb418SKuninori Morimoto priv->flags &= ~ID_P_NOT_ATOMIC;
92182531dfdSUlrich Hecht
92282531dfdSUlrich Hecht pm_runtime_get_sync(dev);
92382531dfdSUlrich Hecht
92482531dfdSUlrich Hecht /* Check bus state before init otherwise bus busy info will be lost */
92582531dfdSUlrich Hecht ret = rcar_i2c_bus_barrier(priv);
92682531dfdSUlrich Hecht if (ret < 0)
92782531dfdSUlrich Hecht goto out;
92882531dfdSUlrich Hecht
92982531dfdSUlrich Hecht rcar_i2c_init(priv);
930238904ddSWolfram Sang rcar_i2c_first_msg(priv, msgs, num);
93182531dfdSUlrich Hecht
93282531dfdSUlrich Hecht j = jiffies + num * adap->timeout;
93382531dfdSUlrich Hecht do {
93482531dfdSUlrich Hecht u32 msr = rcar_i2c_read(priv, ICMSR);
93582531dfdSUlrich Hecht
93682531dfdSUlrich Hecht msr &= (rcar_i2c_is_recv(priv) ? RCAR_IRQ_RECV : RCAR_IRQ_SEND) | RCAR_IRQ_STOP;
93782531dfdSUlrich Hecht
93882531dfdSUlrich Hecht if (msr) {
93982531dfdSUlrich Hecht if (priv->devtype < I2C_RCAR_GEN3)
94082531dfdSUlrich Hecht rcar_i2c_gen2_irq(0, priv);
94182531dfdSUlrich Hecht else
94282531dfdSUlrich Hecht rcar_i2c_gen3_irq(0, priv);
94382531dfdSUlrich Hecht }
94482531dfdSUlrich Hecht
94582531dfdSUlrich Hecht time_left = time_before_eq(jiffies, j);
94682531dfdSUlrich Hecht } while (!(priv->flags & ID_DONE) && time_left);
94782531dfdSUlrich Hecht
94882531dfdSUlrich Hecht if (!time_left) {
94982531dfdSUlrich Hecht rcar_i2c_init(priv);
95082531dfdSUlrich Hecht ret = -ETIMEDOUT;
95182531dfdSUlrich Hecht } else if (priv->flags & ID_NACK) {
95282531dfdSUlrich Hecht ret = -ENXIO;
95382531dfdSUlrich Hecht } else if (priv->flags & ID_ARBLOST) {
95482531dfdSUlrich Hecht ret = -EAGAIN;
955633c0e75SWolfram Sang } else if (priv->flags & ID_EPROTO) {
956633c0e75SWolfram Sang ret = -EPROTO;
95782531dfdSUlrich Hecht } else {
95882531dfdSUlrich Hecht ret = num - priv->msgs_left; /* The number of transfer */
95982531dfdSUlrich Hecht }
96082531dfdSUlrich Hecht out:
96182531dfdSUlrich Hecht pm_runtime_put(dev);
96282531dfdSUlrich Hecht
96382531dfdSUlrich Hecht if (ret < 0 && ret != -ENXIO)
96482531dfdSUlrich Hecht dev_err(dev, "error %d : %x\n", ret, priv->flags);
96582531dfdSUlrich Hecht
96682531dfdSUlrich Hecht return ret;
96782531dfdSUlrich Hecht }
96882531dfdSUlrich Hecht
rcar_reg_slave(struct i2c_client * slave)969de20d185SWolfram Sang static int rcar_reg_slave(struct i2c_client *slave)
970de20d185SWolfram Sang {
971de20d185SWolfram Sang struct rcar_i2c_priv *priv = i2c_get_adapdata(slave->adapter);
972de20d185SWolfram Sang
973de20d185SWolfram Sang if (priv->slave)
974de20d185SWolfram Sang return -EBUSY;
975de20d185SWolfram Sang
976de20d185SWolfram Sang if (slave->flags & I2C_CLIENT_TEN)
977de20d185SWolfram Sang return -EAFNOSUPPORT;
978de20d185SWolfram Sang
97963a761eeSWolfram Sang /* Keep device active for slave address detection logic */
980b4cd08aaSWolfram Sang pm_runtime_get_sync(rcar_i2c_priv_to_dev(priv));
981de20d185SWolfram Sang
982de20d185SWolfram Sang priv->slave = slave;
983de20d185SWolfram Sang rcar_i2c_write(priv, ICSAR, slave->addr);
984de20d185SWolfram Sang rcar_i2c_write(priv, ICSSR, 0);
985314139f9SWolfram Sang rcar_i2c_write(priv, ICSIER, SAR);
986de20d185SWolfram Sang rcar_i2c_write(priv, ICSCR, SIE | SDBS);
987de20d185SWolfram Sang
988de20d185SWolfram Sang return 0;
989de20d185SWolfram Sang }
990de20d185SWolfram Sang
rcar_unreg_slave(struct i2c_client * slave)991de20d185SWolfram Sang static int rcar_unreg_slave(struct i2c_client *slave)
992de20d185SWolfram Sang {
993de20d185SWolfram Sang struct rcar_i2c_priv *priv = i2c_get_adapdata(slave->adapter);
994de20d185SWolfram Sang
995de20d185SWolfram Sang WARN_ON(!priv->slave);
996de20d185SWolfram Sang
997c7c9e914SWolfram Sang /* ensure no irq is running before clearing ptr */
998c7c9e914SWolfram Sang disable_irq(priv->irq);
9995bfec9c2SWolfram Sang rcar_i2c_reset_slave(priv);
1000c7c9e914SWolfram Sang enable_irq(priv->irq);
1001de20d185SWolfram Sang
1002de20d185SWolfram Sang priv->slave = NULL;
1003de20d185SWolfram Sang
1004b4cd08aaSWolfram Sang pm_runtime_put(rcar_i2c_priv_to_dev(priv));
1005de20d185SWolfram Sang
1006de20d185SWolfram Sang return 0;
1007de20d185SWolfram Sang }
1008de20d185SWolfram Sang
rcar_i2c_func(struct i2c_adapter * adap)10096ccbe607SKuninori Morimoto static u32 rcar_i2c_func(struct i2c_adapter *adap)
10106ccbe607SKuninori Morimoto {
1011c4651f11SWolfram Sang struct rcar_i2c_priv *priv = i2c_get_adapdata(adap);
1012c4651f11SWolfram Sang
1013b395ba21SWolfram Sang /*
1014b395ba21SWolfram Sang * This HW can't do:
1015b395ba21SWolfram Sang * I2C_SMBUS_QUICK (setting FSB during START didn't work)
1016b395ba21SWolfram Sang * I2C_M_NOSTART (automatically sends address after START)
1017b395ba21SWolfram Sang * I2C_M_IGNORE_NAK (automatically sends STOP after NAK)
1018b395ba21SWolfram Sang */
1019c4651f11SWolfram Sang u32 func = I2C_FUNC_I2C | I2C_FUNC_SLAVE |
1020633c0e75SWolfram Sang (I2C_FUNC_SMBUS_EMUL_ALL & ~I2C_FUNC_SMBUS_QUICK);
1021c4651f11SWolfram Sang
1022c4651f11SWolfram Sang if (priv->flags & ID_P_HOST_NOTIFY)
1023c4651f11SWolfram Sang func |= I2C_FUNC_SMBUS_HOST_NOTIFY;
1024c4651f11SWolfram Sang
1025c4651f11SWolfram Sang return func;
10266ccbe607SKuninori Morimoto }
10276ccbe607SKuninori Morimoto
10286ccbe607SKuninori Morimoto static const struct i2c_algorithm rcar_i2c_algo = {
10296ccbe607SKuninori Morimoto .master_xfer = rcar_i2c_master_xfer,
103082531dfdSUlrich Hecht .master_xfer_atomic = rcar_i2c_master_xfer_atomic,
10316ccbe607SKuninori Morimoto .functionality = rcar_i2c_func,
1032de20d185SWolfram Sang .reg_slave = rcar_reg_slave,
1033de20d185SWolfram Sang .unreg_slave = rcar_unreg_slave,
10346ccbe607SKuninori Morimoto };
10356ccbe607SKuninori Morimoto
10363ef3e5cdSWolfram Sang static const struct i2c_adapter_quirks rcar_i2c_quirks = {
10373ef3e5cdSWolfram Sang .flags = I2C_AQ_NO_ZERO_LEN,
10383ef3e5cdSWolfram Sang };
10393ef3e5cdSWolfram Sang
10407679c0e1SGuennadi Liakhovetski static const struct of_device_id rcar_i2c_dt_ids[] = {
1041043a3f11SKuninori Morimoto { .compatible = "renesas,i2c-r8a7778", .data = (void *)I2C_RCAR_GEN1 },
1042043a3f11SKuninori Morimoto { .compatible = "renesas,i2c-r8a7779", .data = (void *)I2C_RCAR_GEN1 },
1043043a3f11SKuninori Morimoto { .compatible = "renesas,i2c-r8a7790", .data = (void *)I2C_RCAR_GEN2 },
1044e8936455SWolfram Sang { .compatible = "renesas,i2c-r8a7791", .data = (void *)I2C_RCAR_GEN2 },
1045819a3951SWolfram Sang { .compatible = "renesas,i2c-r8a7792", .data = (void *)I2C_RCAR_GEN2 },
1046819a3951SWolfram Sang { .compatible = "renesas,i2c-r8a7793", .data = (void *)I2C_RCAR_GEN2 },
1047819a3951SWolfram Sang { .compatible = "renesas,i2c-r8a7794", .data = (void *)I2C_RCAR_GEN2 },
1048e7db0d34SWolfram Sang { .compatible = "renesas,i2c-r8a7795", .data = (void *)I2C_RCAR_GEN3 },
1049c13f743aSUlrich Hecht { .compatible = "renesas,i2c-r8a7796", .data = (void *)I2C_RCAR_GEN3 },
1050ad4a8dc3SSimon Horman { .compatible = "renesas,rcar-gen1-i2c", .data = (void *)I2C_RCAR_GEN1 },
1051ad4a8dc3SSimon Horman { .compatible = "renesas,rcar-gen2-i2c", .data = (void *)I2C_RCAR_GEN2 },
1052ad4a8dc3SSimon Horman { .compatible = "renesas,rcar-gen3-i2c", .data = (void *)I2C_RCAR_GEN3 },
1053988c3133SWolfram Sang { .compatible = "renesas,rcar-gen4-i2c", .data = (void *)I2C_RCAR_GEN4 },
10547679c0e1SGuennadi Liakhovetski {},
10557679c0e1SGuennadi Liakhovetski };
10567679c0e1SGuennadi Liakhovetski MODULE_DEVICE_TABLE(of, rcar_i2c_dt_ids);
10577679c0e1SGuennadi Liakhovetski
rcar_i2c_probe(struct platform_device * pdev)10580b255e92SBill Pemberton static int rcar_i2c_probe(struct platform_device *pdev)
10596ccbe607SKuninori Morimoto {
10606ccbe607SKuninori Morimoto struct rcar_i2c_priv *priv;
10616ccbe607SKuninori Morimoto struct i2c_adapter *adap;
10626ccbe607SKuninori Morimoto struct device *dev = &pdev->dev;
106324c6d4bcSWolfram Sang unsigned long irqflags = 0;
10649c975c43SWolfram Sang irqreturn_t (*irqhandler)(int irq, void *ptr) = rcar_i2c_gen3_irq;
10657b814d85SWolfram Sang int ret;
10666ccbe607SKuninori Morimoto
1067ed5a8104SWolfram Sang /* Otherwise logic will break because some bytes must always use PIO */
1068ed5a8104SWolfram Sang BUILD_BUG_ON_MSG(RCAR_MIN_DMA_LEN < 3, "Invalid min DMA length");
1069ed5a8104SWolfram Sang
10706ccbe607SKuninori Morimoto priv = devm_kzalloc(dev, sizeof(struct rcar_i2c_priv), GFP_KERNEL);
107146797a2aSJingoo Han if (!priv)
10726ccbe607SKuninori Morimoto return -ENOMEM;
10736ccbe607SKuninori Morimoto
1074bc8120f1SBen Dooks priv->clk = devm_clk_get(dev, NULL);
1075bc8120f1SBen Dooks if (IS_ERR(priv->clk)) {
1076bc8120f1SBen Dooks dev_err(dev, "cannot get clock\n");
1077bc8120f1SBen Dooks return PTR_ERR(priv->clk);
1078bc8120f1SBen Dooks }
1079bc8120f1SBen Dooks
1080c02fb2b8SDejin Zheng priv->io = devm_platform_get_and_ioremap_resource(pdev, 0, &priv->res);
108184dbf809SThierry Reding if (IS_ERR(priv->io))
108284dbf809SThierry Reding return PTR_ERR(priv->io);
10836ccbe607SKuninori Morimoto
108469e558faSWolfram Sang priv->devtype = (enum rcar_i2c_type)of_device_get_match_data(dev);
10856ccbe607SKuninori Morimoto init_waitqueue_head(&priv->wait);
10866ccbe607SKuninori Morimoto
10876ccbe607SKuninori Morimoto adap = &priv->adap;
10886ccbe607SKuninori Morimoto adap->nr = pdev->id;
10896ccbe607SKuninori Morimoto adap->algo = &rcar_i2c_algo;
1090929e3abaSWolfram Sang adap->class = I2C_CLASS_DEPRECATED;
10916ccbe607SKuninori Morimoto adap->retries = 3;
10926ccbe607SKuninori Morimoto adap->dev.parent = dev;
10937679c0e1SGuennadi Liakhovetski adap->dev.of_node = dev->of_node;
10947d2c17f0SWolfram Sang adap->bus_recovery_info = &rcar_i2c_bri;
10953ef3e5cdSWolfram Sang adap->quirks = &rcar_i2c_quirks;
10966ccbe607SKuninori Morimoto i2c_set_adapdata(adap, priv);
1097ea1558ceSWolfram Sang strscpy(adap->name, pdev->name, sizeof(adap->name));
10986ccbe607SKuninori Morimoto
109973e8b052SNiklas Söderlund /* Init DMA */
110073e8b052SNiklas Söderlund sg_init_table(&priv->sg, 1);
110173e8b052SNiklas Söderlund priv->dma_direction = DMA_NONE;
110273e8b052SNiklas Söderlund priv->dma_rx = priv->dma_tx = ERR_PTR(-EPROBE_DEFER);
110373e8b052SNiklas Söderlund
110463a761eeSWolfram Sang /* Activate device for clock calculation */
11054f7effddSWolfram Sang pm_runtime_enable(dev);
1106f9c9d31bSWolfram Sang pm_runtime_get_sync(dev);
110738a592e2SAndy Shevchenko ret = rcar_i2c_clock_calculate(priv);
11083fe2ec59SKuninori Morimoto if (ret < 0) {
11093fe2ec59SKuninori Morimoto pm_runtime_put(dev);
11103fe2ec59SKuninori Morimoto goto out_pm_disable;
11113fe2ec59SKuninori Morimoto }
1112f9c9d31bSWolfram Sang
11135bfec9c2SWolfram Sang /* Bring hardware to known state */
11145bfec9c2SWolfram Sang rcar_i2c_init(priv);
11155bfec9c2SWolfram Sang rcar_i2c_reset_slave(priv);
1116eb015971SWolfram Sang
11179c975c43SWolfram Sang if (priv->devtype < I2C_RCAR_GEN3) {
111824c6d4bcSWolfram Sang irqflags |= IRQF_NO_THREAD;
11199c975c43SWolfram Sang irqhandler = rcar_i2c_gen2_irq;
11209c975c43SWolfram Sang }
112124c6d4bcSWolfram Sang
112263a761eeSWolfram Sang /* Stay always active when multi-master to keep arbitration working */
11237ee24eb5SWolfram Sang if (of_property_read_bool(dev->of_node, "multi-master"))
11247ee24eb5SWolfram Sang priv->flags |= ID_P_PM_BLOCKED;
11257ee24eb5SWolfram Sang else
1126f9c9d31bSWolfram Sang pm_runtime_put(dev);
1127f9c9d31bSWolfram Sang
1128c4651f11SWolfram Sang if (of_property_read_bool(dev->of_node, "smbus"))
1129c4651f11SWolfram Sang priv->flags |= ID_P_HOST_NOTIFY;
11307ee24eb5SWolfram Sang
11314d2d0491SWolfram Sang /* R-Car Gen3+ needs a reset before every transfer */
1132988c3133SWolfram Sang if (priv->devtype >= I2C_RCAR_GEN3) {
11334c029f04SWolfram Sang priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);
1134eb7641faSDan Carpenter if (IS_ERR(priv->rstc)) {
1135eb7641faSDan Carpenter ret = PTR_ERR(priv->rstc);
11364c029f04SWolfram Sang goto out_pm_put;
1137eb7641faSDan Carpenter }
11384c029f04SWolfram Sang
11394c029f04SWolfram Sang ret = reset_control_status(priv->rstc);
11404c029f04SWolfram Sang if (ret < 0)
11414c029f04SWolfram Sang goto out_pm_put;
11424d2d0491SWolfram Sang
11434d2d0491SWolfram Sang /* hard reset disturbs HostNotify local target, so disable it */
11444d2d0491SWolfram Sang priv->flags &= ~ID_P_HOST_NOTIFY;
11454c029f04SWolfram Sang }
11464c029f04SWolfram Sang
1147147178cfSSergey Shtylyov ret = platform_get_irq(pdev, 0);
1148147178cfSSergey Shtylyov if (ret < 0)
11493fe2ec59SKuninori Morimoto goto out_pm_put;
1150147178cfSSergey Shtylyov priv->irq = ret;
11519c975c43SWolfram Sang ret = devm_request_irq(dev, priv->irq, irqhandler, irqflags, dev_name(dev), priv);
11526ccbe607SKuninori Morimoto if (ret < 0) {
11537b814d85SWolfram Sang dev_err(dev, "cannot get irq %d\n", priv->irq);
11543fe2ec59SKuninori Morimoto goto out_pm_put;
11556ccbe607SKuninori Morimoto }
11566ccbe607SKuninori Morimoto
11574f7effddSWolfram Sang platform_set_drvdata(pdev, priv);
11584f7effddSWolfram Sang
11596ccbe607SKuninori Morimoto ret = i2c_add_numbered_adapter(adap);
1160ea734404SWolfram Sang if (ret < 0)
11613fe2ec59SKuninori Morimoto goto out_pm_put;
11626ccbe607SKuninori Morimoto
1163c4651f11SWolfram Sang if (priv->flags & ID_P_HOST_NOTIFY) {
1164c4651f11SWolfram Sang priv->host_notify_client = i2c_new_slave_host_notify_device(adap);
1165c4651f11SWolfram Sang if (IS_ERR(priv->host_notify_client)) {
1166c4651f11SWolfram Sang ret = PTR_ERR(priv->host_notify_client);
1167c4651f11SWolfram Sang goto out_del_device;
1168c4651f11SWolfram Sang }
1169c4651f11SWolfram Sang }
1170c4651f11SWolfram Sang
11716ccbe607SKuninori Morimoto dev_info(dev, "probed\n");
11726ccbe607SKuninori Morimoto
11736ccbe607SKuninori Morimoto return 0;
1174e43e0df1SWolfram Sang
1175c4651f11SWolfram Sang out_del_device:
1176c4651f11SWolfram Sang i2c_del_adapter(&priv->adap);
1177e43e0df1SWolfram Sang out_pm_put:
11783fe2ec59SKuninori Morimoto if (priv->flags & ID_P_PM_BLOCKED)
1179e43e0df1SWolfram Sang pm_runtime_put(dev);
1180e43e0df1SWolfram Sang out_pm_disable:
1181e43e0df1SWolfram Sang pm_runtime_disable(dev);
1182e43e0df1SWolfram Sang return ret;
11836ccbe607SKuninori Morimoto }
11846ccbe607SKuninori Morimoto
rcar_i2c_remove(struct platform_device * pdev)1185e190a0c3SUwe Kleine-König static void rcar_i2c_remove(struct platform_device *pdev)
11866ccbe607SKuninori Morimoto {
11876ccbe607SKuninori Morimoto struct rcar_i2c_priv *priv = platform_get_drvdata(pdev);
11886ccbe607SKuninori Morimoto struct device *dev = &pdev->dev;
11896ccbe607SKuninori Morimoto
1190c4651f11SWolfram Sang if (priv->host_notify_client)
1191c4651f11SWolfram Sang i2c_free_slave_host_notify_device(priv->host_notify_client);
11926ccbe607SKuninori Morimoto i2c_del_adapter(&priv->adap);
119373e8b052SNiklas Söderlund rcar_i2c_release_dma(priv);
11947ee24eb5SWolfram Sang if (priv->flags & ID_P_PM_BLOCKED)
11957ee24eb5SWolfram Sang pm_runtime_put(dev);
11966ccbe607SKuninori Morimoto pm_runtime_disable(dev);
11976ccbe607SKuninori Morimoto }
11986ccbe607SKuninori Morimoto
rcar_i2c_suspend(struct device * dev)119918569fa8SWolfram Sang static int rcar_i2c_suspend(struct device *dev)
120018569fa8SWolfram Sang {
120118569fa8SWolfram Sang struct rcar_i2c_priv *priv = dev_get_drvdata(dev);
120218569fa8SWolfram Sang
120318569fa8SWolfram Sang i2c_mark_adapter_suspended(&priv->adap);
120418569fa8SWolfram Sang return 0;
120518569fa8SWolfram Sang }
120618569fa8SWolfram Sang
rcar_i2c_resume(struct device * dev)120718569fa8SWolfram Sang static int rcar_i2c_resume(struct device *dev)
120818569fa8SWolfram Sang {
120918569fa8SWolfram Sang struct rcar_i2c_priv *priv = dev_get_drvdata(dev);
121018569fa8SWolfram Sang
121118569fa8SWolfram Sang i2c_mark_adapter_resumed(&priv->adap);
121218569fa8SWolfram Sang return 0;
121318569fa8SWolfram Sang }
121418569fa8SWolfram Sang
121581d696c7SGeert Uytterhoeven static const struct dev_pm_ops rcar_i2c_pm_ops = {
1216941b99acSPaul Cercueil NOIRQ_SYSTEM_SLEEP_PM_OPS(rcar_i2c_suspend, rcar_i2c_resume)
121781d696c7SGeert Uytterhoeven };
121818569fa8SWolfram Sang
121945fd5e4aSWolfram Sang static struct platform_driver rcar_i2c_driver = {
12206ccbe607SKuninori Morimoto .driver = {
12216ccbe607SKuninori Morimoto .name = "i2c-rcar",
12227679c0e1SGuennadi Liakhovetski .of_match_table = rcar_i2c_dt_ids,
1223941b99acSPaul Cercueil .pm = pm_sleep_ptr(&rcar_i2c_pm_ops),
12246ccbe607SKuninori Morimoto },
12256ccbe607SKuninori Morimoto .probe = rcar_i2c_probe,
1226e190a0c3SUwe Kleine-König .remove_new = rcar_i2c_remove,
12276ccbe607SKuninori Morimoto };
12286ccbe607SKuninori Morimoto
122945fd5e4aSWolfram Sang module_platform_driver(rcar_i2c_driver);
12306ccbe607SKuninori Morimoto
12313d99beabSWolfram Sang MODULE_LICENSE("GPL v2");
12326ccbe607SKuninori Morimoto MODULE_DESCRIPTION("Renesas R-Car I2C bus driver");
12336ccbe607SKuninori Morimoto MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
1234