cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

i2c-owl.c (13817B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Actions Semiconductor Owl SoC's I2C driver
      4 *
      5 * Copyright (c) 2014 Actions Semi Inc.
      6 * Author: David Liu <liuwei@actions-semi.com>
      7 *
      8 * Copyright (c) 2018 Linaro Ltd.
      9 * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
     10 */
     11
     12#include <linux/clk.h>
     13#include <linux/delay.h>
     14#include <linux/i2c.h>
     15#include <linux/interrupt.h>
     16#include <linux/io.h>
     17#include <linux/iopoll.h>
     18#include <linux/module.h>
     19#include <linux/of_device.h>
     20
     21/* I2C registers */
     22#define OWL_I2C_REG_CTL		0x0000
     23#define OWL_I2C_REG_CLKDIV	0x0004
     24#define OWL_I2C_REG_STAT	0x0008
     25#define OWL_I2C_REG_ADDR	0x000C
     26#define OWL_I2C_REG_TXDAT	0x0010
     27#define OWL_I2C_REG_RXDAT	0x0014
     28#define OWL_I2C_REG_CMD		0x0018
     29#define OWL_I2C_REG_FIFOCTL	0x001C
     30#define OWL_I2C_REG_FIFOSTAT	0x0020
     31#define OWL_I2C_REG_DATCNT	0x0024
     32#define OWL_I2C_REG_RCNT	0x0028
     33
     34/* I2Cx_CTL Bit Mask */
     35#define OWL_I2C_CTL_RB		BIT(1)
     36#define OWL_I2C_CTL_GBCC(x)	(((x) & 0x3) << 2)
     37#define	OWL_I2C_CTL_GBCC_NONE	OWL_I2C_CTL_GBCC(0)
     38#define	OWL_I2C_CTL_GBCC_START	OWL_I2C_CTL_GBCC(1)
     39#define	OWL_I2C_CTL_GBCC_STOP	OWL_I2C_CTL_GBCC(2)
     40#define	OWL_I2C_CTL_GBCC_RSTART	OWL_I2C_CTL_GBCC(3)
     41#define OWL_I2C_CTL_IRQE	BIT(5)
     42#define OWL_I2C_CTL_EN		BIT(7)
     43#define OWL_I2C_CTL_AE		BIT(8)
     44#define OWL_I2C_CTL_SHSM	BIT(10)
     45
     46#define OWL_I2C_DIV_FACTOR(x)	((x) & 0xff)
     47
     48/* I2Cx_STAT Bit Mask */
     49#define OWL_I2C_STAT_RACK	BIT(0)
     50#define OWL_I2C_STAT_BEB	BIT(1)
     51#define OWL_I2C_STAT_IRQP	BIT(2)
     52#define OWL_I2C_STAT_LAB	BIT(3)
     53#define OWL_I2C_STAT_STPD	BIT(4)
     54#define OWL_I2C_STAT_STAD	BIT(5)
     55#define OWL_I2C_STAT_BBB	BIT(6)
     56#define OWL_I2C_STAT_TCB	BIT(7)
     57#define OWL_I2C_STAT_LBST	BIT(8)
     58#define OWL_I2C_STAT_SAMB	BIT(9)
     59#define OWL_I2C_STAT_SRGC	BIT(10)
     60
     61/* I2Cx_CMD Bit Mask */
     62#define OWL_I2C_CMD_SBE		BIT(0)
     63#define OWL_I2C_CMD_RBE		BIT(4)
     64#define OWL_I2C_CMD_DE		BIT(8)
     65#define OWL_I2C_CMD_NS		BIT(9)
     66#define OWL_I2C_CMD_SE		BIT(10)
     67#define OWL_I2C_CMD_MSS		BIT(11)
     68#define OWL_I2C_CMD_WRS		BIT(12)
     69#define OWL_I2C_CMD_SECL	BIT(15)
     70
     71#define OWL_I2C_CMD_AS(x)	(((x) & 0x7) << 1)
     72#define OWL_I2C_CMD_SAS(x)	(((x) & 0x7) << 5)
     73
     74/* I2Cx_FIFOCTL Bit Mask */
     75#define OWL_I2C_FIFOCTL_NIB	BIT(0)
     76#define OWL_I2C_FIFOCTL_RFR	BIT(1)
     77#define OWL_I2C_FIFOCTL_TFR	BIT(2)
     78
     79/* I2Cc_FIFOSTAT Bit Mask */
     80#define OWL_I2C_FIFOSTAT_CECB	BIT(0)
     81#define OWL_I2C_FIFOSTAT_RNB	BIT(1)
     82#define OWL_I2C_FIFOSTAT_RFE	BIT(2)
     83#define OWL_I2C_FIFOSTAT_TFF	BIT(5)
     84#define OWL_I2C_FIFOSTAT_TFD	GENMASK(23, 16)
     85#define OWL_I2C_FIFOSTAT_RFD	GENMASK(15, 8)
     86
     87/* I2C bus timeout */
     88#define OWL_I2C_TIMEOUT_MS	(4 * 1000)
     89#define OWL_I2C_TIMEOUT		msecs_to_jiffies(OWL_I2C_TIMEOUT_MS)
     90
     91#define OWL_I2C_MAX_RETRIES	50
     92
     93struct owl_i2c_dev {
     94	struct i2c_adapter	adap;
     95	struct i2c_msg		*msg;
     96	struct completion	msg_complete;
     97	struct clk		*clk;
     98	spinlock_t		lock;
     99	void __iomem		*base;
    100	unsigned long		clk_rate;
    101	u32			bus_freq;
    102	u32			msg_ptr;
    103	int			err;
    104};
    105
    106static void owl_i2c_update_reg(void __iomem *reg, unsigned int val, bool state)
    107{
    108	unsigned int regval;
    109
    110	regval = readl(reg);
    111
    112	if (state)
    113		regval |= val;
    114	else
    115		regval &= ~val;
    116
    117	writel(regval, reg);
    118}
    119
    120static void owl_i2c_reset(struct owl_i2c_dev *i2c_dev)
    121{
    122	owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_CTL,
    123			   OWL_I2C_CTL_EN, false);
    124	mdelay(1);
    125	owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_CTL,
    126			   OWL_I2C_CTL_EN, true);
    127
    128	/* Clear status registers */
    129	writel(0, i2c_dev->base + OWL_I2C_REG_STAT);
    130}
    131
    132static int owl_i2c_reset_fifo(struct owl_i2c_dev *i2c_dev)
    133{
    134	unsigned int val, timeout = 0;
    135
    136	/* Reset FIFO */
    137	owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_FIFOCTL,
    138			   OWL_I2C_FIFOCTL_RFR | OWL_I2C_FIFOCTL_TFR,
    139			   true);
    140
    141	/* Wait 50ms for FIFO reset complete */
    142	do {
    143		val = readl(i2c_dev->base + OWL_I2C_REG_FIFOCTL);
    144		if (!(val & (OWL_I2C_FIFOCTL_RFR | OWL_I2C_FIFOCTL_TFR)))
    145			break;
    146		usleep_range(500, 1000);
    147	} while (timeout++ < OWL_I2C_MAX_RETRIES);
    148
    149	if (timeout > OWL_I2C_MAX_RETRIES) {
    150		dev_err(&i2c_dev->adap.dev, "FIFO reset timeout\n");
    151		return -ETIMEDOUT;
    152	}
    153
    154	return 0;
    155}
    156
    157static void owl_i2c_set_freq(struct owl_i2c_dev *i2c_dev)
    158{
    159	unsigned int val;
    160
    161	val = DIV_ROUND_UP(i2c_dev->clk_rate, i2c_dev->bus_freq * 16);
    162
    163	/* Set clock divider factor */
    164	writel(OWL_I2C_DIV_FACTOR(val), i2c_dev->base + OWL_I2C_REG_CLKDIV);
    165}
    166
    167static void owl_i2c_xfer_data(struct owl_i2c_dev *i2c_dev)
    168{
    169	struct i2c_msg *msg = i2c_dev->msg;
    170	unsigned int stat, fifostat;
    171
    172	i2c_dev->err = 0;
    173
    174	/* Handle NACK from slave */
    175	fifostat = readl(i2c_dev->base + OWL_I2C_REG_FIFOSTAT);
    176	if (fifostat & OWL_I2C_FIFOSTAT_RNB) {
    177		i2c_dev->err = -ENXIO;
    178		/* Clear NACK error bit by writing "1" */
    179		owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_FIFOSTAT,
    180				   OWL_I2C_FIFOSTAT_RNB, true);
    181		return;
    182	}
    183
    184	/* Handle bus error */
    185	stat = readl(i2c_dev->base + OWL_I2C_REG_STAT);
    186	if (stat & OWL_I2C_STAT_BEB) {
    187		i2c_dev->err = -EIO;
    188		/* Clear BUS error bit by writing "1" */
    189		owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_STAT,
    190				   OWL_I2C_STAT_BEB, true);
    191		return;
    192	}
    193
    194	/* Handle FIFO read */
    195	if (msg->flags & I2C_M_RD) {
    196		while ((readl(i2c_dev->base + OWL_I2C_REG_FIFOSTAT) &
    197			OWL_I2C_FIFOSTAT_RFE) && i2c_dev->msg_ptr < msg->len) {
    198			msg->buf[i2c_dev->msg_ptr++] = readl(i2c_dev->base +
    199							     OWL_I2C_REG_RXDAT);
    200		}
    201	} else {
    202		/* Handle the remaining bytes which were not sent */
    203		while (!(readl(i2c_dev->base + OWL_I2C_REG_FIFOSTAT) &
    204			 OWL_I2C_FIFOSTAT_TFF) && i2c_dev->msg_ptr < msg->len) {
    205			writel(msg->buf[i2c_dev->msg_ptr++],
    206			       i2c_dev->base + OWL_I2C_REG_TXDAT);
    207		}
    208	}
    209}
    210
    211static irqreturn_t owl_i2c_interrupt(int irq, void *_dev)
    212{
    213	struct owl_i2c_dev *i2c_dev = _dev;
    214
    215	spin_lock(&i2c_dev->lock);
    216
    217	owl_i2c_xfer_data(i2c_dev);
    218
    219	/* Clear pending interrupts */
    220	owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_STAT,
    221			   OWL_I2C_STAT_IRQP, true);
    222
    223	complete_all(&i2c_dev->msg_complete);
    224	spin_unlock(&i2c_dev->lock);
    225
    226	return IRQ_HANDLED;
    227}
    228
    229static u32 owl_i2c_func(struct i2c_adapter *adap)
    230{
    231	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
    232}
    233
    234static int owl_i2c_check_bus_busy(struct i2c_adapter *adap)
    235{
    236	struct owl_i2c_dev *i2c_dev = i2c_get_adapdata(adap);
    237	unsigned long timeout;
    238
    239	/* Check for Bus busy */
    240	timeout = jiffies + OWL_I2C_TIMEOUT;
    241	while (readl(i2c_dev->base + OWL_I2C_REG_STAT) & OWL_I2C_STAT_BBB) {
    242		if (time_after(jiffies, timeout)) {
    243			dev_err(&adap->dev, "Bus busy timeout\n");
    244			return -ETIMEDOUT;
    245		}
    246	}
    247
    248	return 0;
    249}
    250
    251static int owl_i2c_xfer_common(struct i2c_adapter *adap, struct i2c_msg *msgs,
    252			       int num, bool atomic)
    253{
    254	struct owl_i2c_dev *i2c_dev = i2c_get_adapdata(adap);
    255	struct i2c_msg *msg;
    256	unsigned long time_left, flags;
    257	unsigned int i2c_cmd, val;
    258	unsigned int addr;
    259	int ret, idx;
    260
    261	spin_lock_irqsave(&i2c_dev->lock, flags);
    262
    263	/* Reset I2C controller */
    264	owl_i2c_reset(i2c_dev);
    265
    266	/* Set bus frequency */
    267	owl_i2c_set_freq(i2c_dev);
    268
    269	/*
    270	 * Spinlock should be released before calling reset FIFO and
    271	 * bus busy check since those functions may sleep
    272	 */
    273	spin_unlock_irqrestore(&i2c_dev->lock, flags);
    274
    275	/* Reset FIFO */
    276	ret = owl_i2c_reset_fifo(i2c_dev);
    277	if (ret)
    278		goto unlocked_err_exit;
    279
    280	/* Check for bus busy */
    281	ret = owl_i2c_check_bus_busy(adap);
    282	if (ret)
    283		goto unlocked_err_exit;
    284
    285	spin_lock_irqsave(&i2c_dev->lock, flags);
    286
    287	/* Check for Arbitration lost */
    288	val = readl(i2c_dev->base + OWL_I2C_REG_STAT);
    289	if (val & OWL_I2C_STAT_LAB) {
    290		val &= ~OWL_I2C_STAT_LAB;
    291		writel(val, i2c_dev->base + OWL_I2C_REG_STAT);
    292		ret = -EAGAIN;
    293		goto err_exit;
    294	}
    295
    296	if (!atomic)
    297		reinit_completion(&i2c_dev->msg_complete);
    298
    299	/* Enable/disable I2C controller interrupt */
    300	owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_CTL,
    301			   OWL_I2C_CTL_IRQE, !atomic);
    302
    303	/*
    304	 * Select: FIFO enable, Master mode, Stop enable, Data count enable,
    305	 * Send start bit
    306	 */
    307	i2c_cmd = OWL_I2C_CMD_SECL | OWL_I2C_CMD_MSS | OWL_I2C_CMD_SE |
    308		  OWL_I2C_CMD_NS | OWL_I2C_CMD_DE | OWL_I2C_CMD_SBE;
    309
    310	/* Handle repeated start condition */
    311	if (num > 1) {
    312		/* Set internal address length and enable repeated start */
    313		i2c_cmd |= OWL_I2C_CMD_AS(msgs[0].len + 1) |
    314			   OWL_I2C_CMD_SAS(1) | OWL_I2C_CMD_RBE;
    315
    316		/* Write slave address */
    317		addr = i2c_8bit_addr_from_msg(&msgs[0]);
    318		writel(addr, i2c_dev->base + OWL_I2C_REG_TXDAT);
    319
    320		/* Write internal register address */
    321		for (idx = 0; idx < msgs[0].len; idx++)
    322			writel(msgs[0].buf[idx],
    323			       i2c_dev->base + OWL_I2C_REG_TXDAT);
    324
    325		msg = &msgs[1];
    326	} else {
    327		/* Set address length */
    328		i2c_cmd |= OWL_I2C_CMD_AS(1);
    329		msg = &msgs[0];
    330	}
    331
    332	i2c_dev->msg = msg;
    333	i2c_dev->msg_ptr = 0;
    334
    335	/* Set data count for the message */
    336	writel(msg->len, i2c_dev->base + OWL_I2C_REG_DATCNT);
    337
    338	addr = i2c_8bit_addr_from_msg(msg);
    339	writel(addr, i2c_dev->base + OWL_I2C_REG_TXDAT);
    340
    341	if (!(msg->flags & I2C_M_RD)) {
    342		/* Write data to FIFO */
    343		for (idx = 0; idx < msg->len; idx++) {
    344			/* Check for FIFO full */
    345			if (readl(i2c_dev->base + OWL_I2C_REG_FIFOSTAT) &
    346			    OWL_I2C_FIFOSTAT_TFF)
    347				break;
    348
    349			writel(msg->buf[idx],
    350			       i2c_dev->base + OWL_I2C_REG_TXDAT);
    351		}
    352
    353		i2c_dev->msg_ptr = idx;
    354	}
    355
    356	/* Ignore the NACK if needed */
    357	if (msg->flags & I2C_M_IGNORE_NAK)
    358		owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_FIFOCTL,
    359				   OWL_I2C_FIFOCTL_NIB, true);
    360	else
    361		owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_FIFOCTL,
    362				   OWL_I2C_FIFOCTL_NIB, false);
    363
    364	/* Start the transfer */
    365	writel(i2c_cmd, i2c_dev->base + OWL_I2C_REG_CMD);
    366
    367	spin_unlock_irqrestore(&i2c_dev->lock, flags);
    368
    369	if (atomic) {
    370		/* Wait for Command Execute Completed or NACK Error bits */
    371		ret = readl_poll_timeout_atomic(i2c_dev->base + OWL_I2C_REG_FIFOSTAT,
    372						val, val & (OWL_I2C_FIFOSTAT_CECB |
    373							    OWL_I2C_FIFOSTAT_RNB),
    374						10, OWL_I2C_TIMEOUT_MS * 1000);
    375	} else {
    376		time_left = wait_for_completion_timeout(&i2c_dev->msg_complete,
    377							adap->timeout);
    378		if (!time_left)
    379			ret = -ETIMEDOUT;
    380	}
    381
    382	spin_lock_irqsave(&i2c_dev->lock, flags);
    383
    384	if (ret) {
    385		dev_err(&adap->dev, "Transaction timed out\n");
    386		/* Send stop condition and release the bus */
    387		owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_CTL,
    388				   OWL_I2C_CTL_GBCC_STOP | OWL_I2C_CTL_RB,
    389				   true);
    390		goto err_exit;
    391	}
    392
    393	if (atomic)
    394		owl_i2c_xfer_data(i2c_dev);
    395
    396	ret = i2c_dev->err < 0 ? i2c_dev->err : num;
    397
    398err_exit:
    399	spin_unlock_irqrestore(&i2c_dev->lock, flags);
    400
    401unlocked_err_exit:
    402	/* Disable I2C controller */
    403	owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_CTL,
    404			   OWL_I2C_CTL_EN, false);
    405
    406	return ret;
    407}
    408
    409static int owl_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
    410			int num)
    411{
    412	return owl_i2c_xfer_common(adap, msgs, num, false);
    413}
    414
    415static int owl_i2c_xfer_atomic(struct i2c_adapter *adap,
    416			       struct i2c_msg *msgs, int num)
    417{
    418	return owl_i2c_xfer_common(adap, msgs, num, true);
    419}
    420
    421static const struct i2c_algorithm owl_i2c_algorithm = {
    422	.master_xfer	     = owl_i2c_xfer,
    423	.master_xfer_atomic  = owl_i2c_xfer_atomic,
    424	.functionality	     = owl_i2c_func,
    425};
    426
    427static const struct i2c_adapter_quirks owl_i2c_quirks = {
    428	.flags		= I2C_AQ_COMB | I2C_AQ_COMB_WRITE_FIRST,
    429	.max_read_len   = 240,
    430	.max_write_len  = 240,
    431	.max_comb_1st_msg_len = 6,
    432	.max_comb_2nd_msg_len = 240,
    433};
    434
    435static int owl_i2c_probe(struct platform_device *pdev)
    436{
    437	struct device *dev = &pdev->dev;
    438	struct owl_i2c_dev *i2c_dev;
    439	int ret, irq;
    440
    441	i2c_dev = devm_kzalloc(dev, sizeof(*i2c_dev), GFP_KERNEL);
    442	if (!i2c_dev)
    443		return -ENOMEM;
    444
    445	i2c_dev->base = devm_platform_ioremap_resource(pdev, 0);
    446	if (IS_ERR(i2c_dev->base))
    447		return PTR_ERR(i2c_dev->base);
    448
    449	irq = platform_get_irq(pdev, 0);
    450	if (irq < 0)
    451		return irq;
    452
    453	if (of_property_read_u32(dev->of_node, "clock-frequency",
    454				 &i2c_dev->bus_freq))
    455		i2c_dev->bus_freq = I2C_MAX_STANDARD_MODE_FREQ;
    456
    457	/* We support only frequencies of 100k and 400k for now */
    458	if (i2c_dev->bus_freq != I2C_MAX_STANDARD_MODE_FREQ &&
    459	    i2c_dev->bus_freq != I2C_MAX_FAST_MODE_FREQ) {
    460		dev_err(dev, "invalid clock-frequency %d\n", i2c_dev->bus_freq);
    461		return -EINVAL;
    462	}
    463
    464	i2c_dev->clk = devm_clk_get(dev, NULL);
    465	if (IS_ERR(i2c_dev->clk)) {
    466		dev_err(dev, "failed to get clock\n");
    467		return PTR_ERR(i2c_dev->clk);
    468	}
    469
    470	ret = clk_prepare_enable(i2c_dev->clk);
    471	if (ret)
    472		return ret;
    473
    474	i2c_dev->clk_rate = clk_get_rate(i2c_dev->clk);
    475	if (!i2c_dev->clk_rate) {
    476		dev_err(dev, "input clock rate should not be zero\n");
    477		ret = -EINVAL;
    478		goto disable_clk;
    479	}
    480
    481	init_completion(&i2c_dev->msg_complete);
    482	spin_lock_init(&i2c_dev->lock);
    483	i2c_dev->adap.owner = THIS_MODULE;
    484	i2c_dev->adap.algo = &owl_i2c_algorithm;
    485	i2c_dev->adap.timeout = OWL_I2C_TIMEOUT;
    486	i2c_dev->adap.quirks = &owl_i2c_quirks;
    487	i2c_dev->adap.dev.parent = dev;
    488	i2c_dev->adap.dev.of_node = dev->of_node;
    489	snprintf(i2c_dev->adap.name, sizeof(i2c_dev->adap.name),
    490		 "%s", "OWL I2C adapter");
    491	i2c_set_adapdata(&i2c_dev->adap, i2c_dev);
    492
    493	platform_set_drvdata(pdev, i2c_dev);
    494
    495	ret = devm_request_irq(dev, irq, owl_i2c_interrupt, 0, pdev->name,
    496			       i2c_dev);
    497	if (ret) {
    498		dev_err(dev, "failed to request irq %d\n", irq);
    499		goto disable_clk;
    500	}
    501
    502	return i2c_add_adapter(&i2c_dev->adap);
    503
    504disable_clk:
    505	clk_disable_unprepare(i2c_dev->clk);
    506
    507	return ret;
    508}
    509
    510static const struct of_device_id owl_i2c_of_match[] = {
    511	{ .compatible = "actions,s500-i2c" },
    512	{ .compatible = "actions,s700-i2c" },
    513	{ .compatible = "actions,s900-i2c" },
    514	{ /* sentinel */ }
    515};
    516MODULE_DEVICE_TABLE(of, owl_i2c_of_match);
    517
    518static struct platform_driver owl_i2c_driver = {
    519	.probe		= owl_i2c_probe,
    520	.driver		= {
    521		.name	= "owl-i2c",
    522		.of_match_table = of_match_ptr(owl_i2c_of_match),
    523		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
    524	},
    525};
    526module_platform_driver(owl_i2c_driver);
    527
    528MODULE_AUTHOR("David Liu <liuwei@actions-semi.com>");
    529MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>");
    530MODULE_DESCRIPTION("Actions Semiconductor Owl SoC's I2C driver");
    531MODULE_LICENSE("GPL");