xref: /openbmc/linux/drivers/i2c/busses/i2c-rcar.c (revision aad29a73199b7fbccfbabea3f1ee627ad1924f52)
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