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

rmi_spi.c (12100B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (c) 2011-2016 Synaptics Incorporated
      4 * Copyright (c) 2011 Unixphere
      5 */
      6
      7#include <linux/kernel.h>
      8#include <linux/module.h>
      9#include <linux/rmi.h>
     10#include <linux/slab.h>
     11#include <linux/spi/spi.h>
     12#include <linux/of.h>
     13#include "rmi_driver.h"
     14
     15#define RMI_SPI_DEFAULT_XFER_BUF_SIZE	64
     16
     17#define RMI_PAGE_SELECT_REGISTER	0x00FF
     18#define RMI_SPI_PAGE(addr)		(((addr) >> 8) & 0x80)
     19#define RMI_SPI_XFER_SIZE_LIMIT		255
     20
     21#define BUFFER_SIZE_INCREMENT 32
     22
     23enum rmi_spi_op {
     24	RMI_SPI_WRITE = 0,
     25	RMI_SPI_READ,
     26	RMI_SPI_V2_READ_UNIFIED,
     27	RMI_SPI_V2_READ_SPLIT,
     28	RMI_SPI_V2_WRITE,
     29};
     30
     31struct rmi_spi_cmd {
     32	enum rmi_spi_op op;
     33	u16 addr;
     34};
     35
     36struct rmi_spi_xport {
     37	struct rmi_transport_dev xport;
     38	struct spi_device *spi;
     39
     40	struct mutex page_mutex;
     41	int page;
     42
     43	u8 *rx_buf;
     44	u8 *tx_buf;
     45	int xfer_buf_size;
     46
     47	struct spi_transfer *rx_xfers;
     48	struct spi_transfer *tx_xfers;
     49	int rx_xfer_count;
     50	int tx_xfer_count;
     51};
     52
     53static int rmi_spi_manage_pools(struct rmi_spi_xport *rmi_spi, int len)
     54{
     55	struct spi_device *spi = rmi_spi->spi;
     56	int buf_size = rmi_spi->xfer_buf_size
     57		? rmi_spi->xfer_buf_size : RMI_SPI_DEFAULT_XFER_BUF_SIZE;
     58	struct spi_transfer *xfer_buf;
     59	void *buf;
     60	void *tmp;
     61
     62	while (buf_size < len)
     63		buf_size *= 2;
     64
     65	if (buf_size > RMI_SPI_XFER_SIZE_LIMIT)
     66		buf_size = RMI_SPI_XFER_SIZE_LIMIT;
     67
     68	tmp = rmi_spi->rx_buf;
     69	buf = devm_kcalloc(&spi->dev, buf_size, 2,
     70				GFP_KERNEL | GFP_DMA);
     71	if (!buf)
     72		return -ENOMEM;
     73
     74	rmi_spi->rx_buf = buf;
     75	rmi_spi->tx_buf = &rmi_spi->rx_buf[buf_size];
     76	rmi_spi->xfer_buf_size = buf_size;
     77
     78	if (tmp)
     79		devm_kfree(&spi->dev, tmp);
     80
     81	if (rmi_spi->xport.pdata.spi_data.read_delay_us)
     82		rmi_spi->rx_xfer_count = buf_size;
     83	else
     84		rmi_spi->rx_xfer_count = 1;
     85
     86	if (rmi_spi->xport.pdata.spi_data.write_delay_us)
     87		rmi_spi->tx_xfer_count = buf_size;
     88	else
     89		rmi_spi->tx_xfer_count = 1;
     90
     91	/*
     92	 * Allocate a pool of spi_transfer buffers for devices which need
     93	 * per byte delays.
     94	 */
     95	tmp = rmi_spi->rx_xfers;
     96	xfer_buf = devm_kcalloc(&spi->dev,
     97		rmi_spi->rx_xfer_count + rmi_spi->tx_xfer_count,
     98		sizeof(struct spi_transfer),
     99		GFP_KERNEL);
    100	if (!xfer_buf)
    101		return -ENOMEM;
    102
    103	rmi_spi->rx_xfers = xfer_buf;
    104	rmi_spi->tx_xfers = &xfer_buf[rmi_spi->rx_xfer_count];
    105
    106	if (tmp)
    107		devm_kfree(&spi->dev, tmp);
    108
    109	return 0;
    110}
    111
    112static int rmi_spi_xfer(struct rmi_spi_xport *rmi_spi,
    113			const struct rmi_spi_cmd *cmd, const u8 *tx_buf,
    114			int tx_len, u8 *rx_buf, int rx_len)
    115{
    116	struct spi_device *spi = rmi_spi->spi;
    117	struct rmi_device_platform_data_spi *spi_data =
    118					&rmi_spi->xport.pdata.spi_data;
    119	struct spi_message msg;
    120	struct spi_transfer *xfer;
    121	int ret = 0;
    122	int len;
    123	int cmd_len = 0;
    124	int total_tx_len;
    125	int i;
    126	u16 addr = cmd->addr;
    127
    128	spi_message_init(&msg);
    129
    130	switch (cmd->op) {
    131	case RMI_SPI_WRITE:
    132	case RMI_SPI_READ:
    133		cmd_len += 2;
    134		break;
    135	case RMI_SPI_V2_READ_UNIFIED:
    136	case RMI_SPI_V2_READ_SPLIT:
    137	case RMI_SPI_V2_WRITE:
    138		cmd_len += 4;
    139		break;
    140	}
    141
    142	total_tx_len = cmd_len + tx_len;
    143	len = max(total_tx_len, rx_len);
    144
    145	if (len > RMI_SPI_XFER_SIZE_LIMIT)
    146		return -EINVAL;
    147
    148	if (rmi_spi->xfer_buf_size < len) {
    149		ret = rmi_spi_manage_pools(rmi_spi, len);
    150		if (ret < 0)
    151			return ret;
    152	}
    153
    154	if (addr == 0)
    155		/*
    156		 * SPI needs an address. Use 0x7FF if we want to keep
    157		 * reading from the last position of the register pointer.
    158		 */
    159		addr = 0x7FF;
    160
    161	switch (cmd->op) {
    162	case RMI_SPI_WRITE:
    163		rmi_spi->tx_buf[0] = (addr >> 8);
    164		rmi_spi->tx_buf[1] = addr & 0xFF;
    165		break;
    166	case RMI_SPI_READ:
    167		rmi_spi->tx_buf[0] = (addr >> 8) | 0x80;
    168		rmi_spi->tx_buf[1] = addr & 0xFF;
    169		break;
    170	case RMI_SPI_V2_READ_UNIFIED:
    171		break;
    172	case RMI_SPI_V2_READ_SPLIT:
    173		break;
    174	case RMI_SPI_V2_WRITE:
    175		rmi_spi->tx_buf[0] = 0x40;
    176		rmi_spi->tx_buf[1] = (addr >> 8) & 0xFF;
    177		rmi_spi->tx_buf[2] = addr & 0xFF;
    178		rmi_spi->tx_buf[3] = tx_len;
    179		break;
    180	}
    181
    182	if (tx_buf)
    183		memcpy(&rmi_spi->tx_buf[cmd_len], tx_buf, tx_len);
    184
    185	if (rmi_spi->tx_xfer_count > 1) {
    186		for (i = 0; i < total_tx_len; i++) {
    187			xfer = &rmi_spi->tx_xfers[i];
    188			memset(xfer, 0,	sizeof(struct spi_transfer));
    189			xfer->tx_buf = &rmi_spi->tx_buf[i];
    190			xfer->len = 1;
    191			xfer->delay.value = spi_data->write_delay_us;
    192			xfer->delay.unit = SPI_DELAY_UNIT_USECS;
    193			spi_message_add_tail(xfer, &msg);
    194		}
    195	} else {
    196		xfer = rmi_spi->tx_xfers;
    197		memset(xfer, 0, sizeof(struct spi_transfer));
    198		xfer->tx_buf = rmi_spi->tx_buf;
    199		xfer->len = total_tx_len;
    200		spi_message_add_tail(xfer, &msg);
    201	}
    202
    203	rmi_dbg(RMI_DEBUG_XPORT, &spi->dev, "%s: cmd: %s tx_buf len: %d tx_buf: %*ph\n",
    204		__func__, cmd->op == RMI_SPI_WRITE ? "WRITE" : "READ",
    205		total_tx_len, total_tx_len, rmi_spi->tx_buf);
    206
    207	if (rx_buf) {
    208		if (rmi_spi->rx_xfer_count > 1) {
    209			for (i = 0; i < rx_len; i++) {
    210				xfer = &rmi_spi->rx_xfers[i];
    211				memset(xfer, 0, sizeof(struct spi_transfer));
    212				xfer->rx_buf = &rmi_spi->rx_buf[i];
    213				xfer->len = 1;
    214				xfer->delay.value = spi_data->read_delay_us;
    215				xfer->delay.unit = SPI_DELAY_UNIT_USECS;
    216				spi_message_add_tail(xfer, &msg);
    217			}
    218		} else {
    219			xfer = rmi_spi->rx_xfers;
    220			memset(xfer, 0, sizeof(struct spi_transfer));
    221			xfer->rx_buf = rmi_spi->rx_buf;
    222			xfer->len = rx_len;
    223			spi_message_add_tail(xfer, &msg);
    224		}
    225	}
    226
    227	ret = spi_sync(spi, &msg);
    228	if (ret < 0) {
    229		dev_err(&spi->dev, "spi xfer failed: %d\n", ret);
    230		return ret;
    231	}
    232
    233	if (rx_buf) {
    234		memcpy(rx_buf, rmi_spi->rx_buf, rx_len);
    235		rmi_dbg(RMI_DEBUG_XPORT, &spi->dev, "%s: (%d) %*ph\n",
    236			__func__, rx_len, rx_len, rx_buf);
    237	}
    238
    239	return 0;
    240}
    241
    242/*
    243 * rmi_set_page - Set RMI page
    244 * @xport: The pointer to the rmi_transport_dev struct
    245 * @page: The new page address.
    246 *
    247 * RMI devices have 16-bit addressing, but some of the transport
    248 * implementations (like SMBus) only have 8-bit addressing. So RMI implements
    249 * a page address at 0xff of every page so we can reliable page addresses
    250 * every 256 registers.
    251 *
    252 * The page_mutex lock must be held when this function is entered.
    253 *
    254 * Returns zero on success, non-zero on failure.
    255 */
    256static int rmi_set_page(struct rmi_spi_xport *rmi_spi, u8 page)
    257{
    258	struct rmi_spi_cmd cmd;
    259	int ret;
    260
    261	cmd.op = RMI_SPI_WRITE;
    262	cmd.addr = RMI_PAGE_SELECT_REGISTER;
    263
    264	ret = rmi_spi_xfer(rmi_spi, &cmd, &page, 1, NULL, 0);
    265
    266	if (ret)
    267		rmi_spi->page = page;
    268
    269	return ret;
    270}
    271
    272static int rmi_spi_write_block(struct rmi_transport_dev *xport, u16 addr,
    273			       const void *buf, size_t len)
    274{
    275	struct rmi_spi_xport *rmi_spi =
    276		container_of(xport, struct rmi_spi_xport, xport);
    277	struct rmi_spi_cmd cmd;
    278	int ret;
    279
    280	mutex_lock(&rmi_spi->page_mutex);
    281
    282	if (RMI_SPI_PAGE(addr) != rmi_spi->page) {
    283		ret = rmi_set_page(rmi_spi, RMI_SPI_PAGE(addr));
    284		if (ret)
    285			goto exit;
    286	}
    287
    288	cmd.op = RMI_SPI_WRITE;
    289	cmd.addr = addr;
    290
    291	ret = rmi_spi_xfer(rmi_spi, &cmd, buf, len, NULL, 0);
    292
    293exit:
    294	mutex_unlock(&rmi_spi->page_mutex);
    295	return ret;
    296}
    297
    298static int rmi_spi_read_block(struct rmi_transport_dev *xport, u16 addr,
    299			      void *buf, size_t len)
    300{
    301	struct rmi_spi_xport *rmi_spi =
    302		container_of(xport, struct rmi_spi_xport, xport);
    303	struct rmi_spi_cmd cmd;
    304	int ret;
    305
    306	mutex_lock(&rmi_spi->page_mutex);
    307
    308	if (RMI_SPI_PAGE(addr) != rmi_spi->page) {
    309		ret = rmi_set_page(rmi_spi, RMI_SPI_PAGE(addr));
    310		if (ret)
    311			goto exit;
    312	}
    313
    314	cmd.op = RMI_SPI_READ;
    315	cmd.addr = addr;
    316
    317	ret = rmi_spi_xfer(rmi_spi, &cmd, NULL, 0, buf, len);
    318
    319exit:
    320	mutex_unlock(&rmi_spi->page_mutex);
    321	return ret;
    322}
    323
    324static const struct rmi_transport_ops rmi_spi_ops = {
    325	.write_block	= rmi_spi_write_block,
    326	.read_block	= rmi_spi_read_block,
    327};
    328
    329#ifdef CONFIG_OF
    330static int rmi_spi_of_probe(struct spi_device *spi,
    331			struct rmi_device_platform_data *pdata)
    332{
    333	struct device *dev = &spi->dev;
    334	int retval;
    335
    336	retval = rmi_of_property_read_u32(dev,
    337			&pdata->spi_data.read_delay_us,
    338			"spi-rx-delay-us", 1);
    339	if (retval)
    340		return retval;
    341
    342	retval = rmi_of_property_read_u32(dev,
    343			&pdata->spi_data.write_delay_us,
    344			"spi-tx-delay-us", 1);
    345	if (retval)
    346		return retval;
    347
    348	return 0;
    349}
    350
    351static const struct of_device_id rmi_spi_of_match[] = {
    352	{ .compatible = "syna,rmi4-spi" },
    353	{},
    354};
    355MODULE_DEVICE_TABLE(of, rmi_spi_of_match);
    356#else
    357static inline int rmi_spi_of_probe(struct spi_device *spi,
    358				struct rmi_device_platform_data *pdata)
    359{
    360	return -ENODEV;
    361}
    362#endif
    363
    364static void rmi_spi_unregister_transport(void *data)
    365{
    366	struct rmi_spi_xport *rmi_spi = data;
    367
    368	rmi_unregister_transport_device(&rmi_spi->xport);
    369}
    370
    371static int rmi_spi_probe(struct spi_device *spi)
    372{
    373	struct rmi_spi_xport *rmi_spi;
    374	struct rmi_device_platform_data *pdata;
    375	struct rmi_device_platform_data *spi_pdata = spi->dev.platform_data;
    376	int error;
    377
    378	if (spi->master->flags & SPI_MASTER_HALF_DUPLEX)
    379		return -EINVAL;
    380
    381	rmi_spi = devm_kzalloc(&spi->dev, sizeof(struct rmi_spi_xport),
    382			GFP_KERNEL);
    383	if (!rmi_spi)
    384		return -ENOMEM;
    385
    386	pdata = &rmi_spi->xport.pdata;
    387
    388	if (spi->dev.of_node) {
    389		error = rmi_spi_of_probe(spi, pdata);
    390		if (error)
    391			return error;
    392	} else if (spi_pdata) {
    393		*pdata = *spi_pdata;
    394	}
    395
    396	if (pdata->spi_data.bits_per_word)
    397		spi->bits_per_word = pdata->spi_data.bits_per_word;
    398
    399	if (pdata->spi_data.mode)
    400		spi->mode = pdata->spi_data.mode;
    401
    402	error = spi_setup(spi);
    403	if (error < 0) {
    404		dev_err(&spi->dev, "spi_setup failed!\n");
    405		return error;
    406	}
    407
    408	pdata->irq = spi->irq;
    409
    410	rmi_spi->spi = spi;
    411	mutex_init(&rmi_spi->page_mutex);
    412
    413	rmi_spi->xport.dev = &spi->dev;
    414	rmi_spi->xport.proto_name = "spi";
    415	rmi_spi->xport.ops = &rmi_spi_ops;
    416
    417	spi_set_drvdata(spi, rmi_spi);
    418
    419	error = rmi_spi_manage_pools(rmi_spi, RMI_SPI_DEFAULT_XFER_BUF_SIZE);
    420	if (error)
    421		return error;
    422
    423	/*
    424	 * Setting the page to zero will (a) make sure the PSR is in a
    425	 * known state, and (b) make sure we can talk to the device.
    426	 */
    427	error = rmi_set_page(rmi_spi, 0);
    428	if (error) {
    429		dev_err(&spi->dev, "Failed to set page select to 0.\n");
    430		return error;
    431	}
    432
    433	dev_info(&spi->dev, "registering SPI-connected sensor\n");
    434
    435	error = rmi_register_transport_device(&rmi_spi->xport);
    436	if (error) {
    437		dev_err(&spi->dev, "failed to register sensor: %d\n", error);
    438		return error;
    439	}
    440
    441	error = devm_add_action_or_reset(&spi->dev,
    442					  rmi_spi_unregister_transport,
    443					  rmi_spi);
    444	if (error)
    445		return error;
    446
    447	return 0;
    448}
    449
    450#ifdef CONFIG_PM_SLEEP
    451static int rmi_spi_suspend(struct device *dev)
    452{
    453	struct spi_device *spi = to_spi_device(dev);
    454	struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi);
    455	int ret;
    456
    457	ret = rmi_driver_suspend(rmi_spi->xport.rmi_dev, true);
    458	if (ret)
    459		dev_warn(dev, "Failed to resume device: %d\n", ret);
    460
    461	return ret;
    462}
    463
    464static int rmi_spi_resume(struct device *dev)
    465{
    466	struct spi_device *spi = to_spi_device(dev);
    467	struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi);
    468	int ret;
    469
    470	ret = rmi_driver_resume(rmi_spi->xport.rmi_dev, true);
    471	if (ret)
    472		dev_warn(dev, "Failed to resume device: %d\n", ret);
    473
    474	return ret;
    475}
    476#endif
    477
    478#ifdef CONFIG_PM
    479static int rmi_spi_runtime_suspend(struct device *dev)
    480{
    481	struct spi_device *spi = to_spi_device(dev);
    482	struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi);
    483	int ret;
    484
    485	ret = rmi_driver_suspend(rmi_spi->xport.rmi_dev, false);
    486	if (ret)
    487		dev_warn(dev, "Failed to resume device: %d\n", ret);
    488
    489	return 0;
    490}
    491
    492static int rmi_spi_runtime_resume(struct device *dev)
    493{
    494	struct spi_device *spi = to_spi_device(dev);
    495	struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi);
    496	int ret;
    497
    498	ret = rmi_driver_resume(rmi_spi->xport.rmi_dev, false);
    499	if (ret)
    500		dev_warn(dev, "Failed to resume device: %d\n", ret);
    501
    502	return 0;
    503}
    504#endif
    505
    506static const struct dev_pm_ops rmi_spi_pm = {
    507	SET_SYSTEM_SLEEP_PM_OPS(rmi_spi_suspend, rmi_spi_resume)
    508	SET_RUNTIME_PM_OPS(rmi_spi_runtime_suspend, rmi_spi_runtime_resume,
    509			   NULL)
    510};
    511
    512static const struct spi_device_id rmi_id[] = {
    513	{ "rmi4_spi", 0 },
    514	{ }
    515};
    516MODULE_DEVICE_TABLE(spi, rmi_id);
    517
    518static struct spi_driver rmi_spi_driver = {
    519	.driver = {
    520		.name	= "rmi4_spi",
    521		.pm	= &rmi_spi_pm,
    522		.of_match_table = of_match_ptr(rmi_spi_of_match),
    523	},
    524	.id_table	= rmi_id,
    525	.probe		= rmi_spi_probe,
    526};
    527
    528module_spi_driver(rmi_spi_driver);
    529
    530MODULE_AUTHOR("Christopher Heiny <cheiny@synaptics.com>");
    531MODULE_AUTHOR("Andrew Duggan <aduggan@synaptics.com>");
    532MODULE_DESCRIPTION("RMI SPI driver");
    533MODULE_LICENSE("GPL");