13ce8859eSGuenter Roeck /* 23ce8859eSGuenter Roeck * NXP SC18IS602/603 SPI driver 33ce8859eSGuenter Roeck * 43ce8859eSGuenter Roeck * Copyright (C) Guenter Roeck <linux@roeck-us.net> 53ce8859eSGuenter Roeck * 63ce8859eSGuenter Roeck * This program is free software; you can redistribute it and/or modify 73ce8859eSGuenter Roeck * it under the terms of the GNU General Public License as published by 83ce8859eSGuenter Roeck * the Free Software Foundation; either version 2 of the License, or 93ce8859eSGuenter Roeck * (at your option) any later version. 103ce8859eSGuenter Roeck * 113ce8859eSGuenter Roeck * This program is distributed in the hope that it will be useful, 123ce8859eSGuenter Roeck * but WITHOUT ANY WARRANTY; without even the implied warranty of 133ce8859eSGuenter Roeck * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 143ce8859eSGuenter Roeck * GNU General Public License for more details. 153ce8859eSGuenter Roeck */ 163ce8859eSGuenter Roeck 173ce8859eSGuenter Roeck #include <linux/kernel.h> 183ce8859eSGuenter Roeck #include <linux/err.h> 193ce8859eSGuenter Roeck #include <linux/module.h> 203ce8859eSGuenter Roeck #include <linux/spi/spi.h> 213ce8859eSGuenter Roeck #include <linux/i2c.h> 223ce8859eSGuenter Roeck #include <linux/delay.h> 233ce8859eSGuenter Roeck #include <linux/pm_runtime.h> 243ce8859eSGuenter Roeck #include <linux/of.h> 253ce8859eSGuenter Roeck #include <linux/platform_data/sc18is602.h> 263ce8859eSGuenter Roeck 273ce8859eSGuenter Roeck enum chips { sc18is602, sc18is602b, sc18is603 }; 283ce8859eSGuenter Roeck 293ce8859eSGuenter Roeck #define SC18IS602_BUFSIZ 200 303ce8859eSGuenter Roeck #define SC18IS602_CLOCK 7372000 313ce8859eSGuenter Roeck 323ce8859eSGuenter Roeck #define SC18IS602_MODE_CPHA BIT(2) 333ce8859eSGuenter Roeck #define SC18IS602_MODE_CPOL BIT(3) 343ce8859eSGuenter Roeck #define SC18IS602_MODE_LSB_FIRST BIT(5) 353ce8859eSGuenter Roeck #define SC18IS602_MODE_CLOCK_DIV_4 0x0 363ce8859eSGuenter Roeck #define SC18IS602_MODE_CLOCK_DIV_16 0x1 373ce8859eSGuenter Roeck #define SC18IS602_MODE_CLOCK_DIV_64 0x2 383ce8859eSGuenter Roeck #define SC18IS602_MODE_CLOCK_DIV_128 0x3 393ce8859eSGuenter Roeck 403ce8859eSGuenter Roeck struct sc18is602 { 413ce8859eSGuenter Roeck struct spi_master *master; 423ce8859eSGuenter Roeck struct device *dev; 433ce8859eSGuenter Roeck u8 ctrl; 443ce8859eSGuenter Roeck u32 freq; 453ce8859eSGuenter Roeck u32 speed; 463ce8859eSGuenter Roeck 473ce8859eSGuenter Roeck /* I2C data */ 483ce8859eSGuenter Roeck struct i2c_client *client; 493ce8859eSGuenter Roeck enum chips id; 503ce8859eSGuenter Roeck u8 buffer[SC18IS602_BUFSIZ + 1]; 513ce8859eSGuenter Roeck int tlen; /* Data queued for tx in buffer */ 523ce8859eSGuenter Roeck int rindex; /* Receive data index in buffer */ 533ce8859eSGuenter Roeck }; 543ce8859eSGuenter Roeck 553ce8859eSGuenter Roeck static int sc18is602_wait_ready(struct sc18is602 *hw, int len) 563ce8859eSGuenter Roeck { 573ce8859eSGuenter Roeck int i, err; 583ce8859eSGuenter Roeck int usecs = 1000000 * len / hw->speed + 1; 593ce8859eSGuenter Roeck u8 dummy[1]; 603ce8859eSGuenter Roeck 613ce8859eSGuenter Roeck for (i = 0; i < 10; i++) { 623ce8859eSGuenter Roeck err = i2c_master_recv(hw->client, dummy, 1); 633ce8859eSGuenter Roeck if (err >= 0) 643ce8859eSGuenter Roeck return 0; 653ce8859eSGuenter Roeck usleep_range(usecs, usecs * 2); 663ce8859eSGuenter Roeck } 673ce8859eSGuenter Roeck return -ETIMEDOUT; 683ce8859eSGuenter Roeck } 693ce8859eSGuenter Roeck 703ce8859eSGuenter Roeck static int sc18is602_txrx(struct sc18is602 *hw, struct spi_message *msg, 713ce8859eSGuenter Roeck struct spi_transfer *t, bool do_transfer) 723ce8859eSGuenter Roeck { 733ce8859eSGuenter Roeck unsigned int len = t->len; 743ce8859eSGuenter Roeck int ret; 753ce8859eSGuenter Roeck 763ce8859eSGuenter Roeck if (hw->tlen == 0) { 773ce8859eSGuenter Roeck /* First byte (I2C command) is chip select */ 783ce8859eSGuenter Roeck hw->buffer[0] = 1 << msg->spi->chip_select; 793ce8859eSGuenter Roeck hw->tlen = 1; 803ce8859eSGuenter Roeck hw->rindex = 0; 813ce8859eSGuenter Roeck } 823ce8859eSGuenter Roeck /* 833ce8859eSGuenter Roeck * We can not immediately send data to the chip, since each I2C message 843ce8859eSGuenter Roeck * resembles a full SPI message (from CS active to CS inactive). 853ce8859eSGuenter Roeck * Enqueue messages up to the first read or until do_transfer is true. 863ce8859eSGuenter Roeck */ 873ce8859eSGuenter Roeck if (t->tx_buf) { 883ce8859eSGuenter Roeck memcpy(&hw->buffer[hw->tlen], t->tx_buf, len); 893ce8859eSGuenter Roeck hw->tlen += len; 903ce8859eSGuenter Roeck if (t->rx_buf) 913ce8859eSGuenter Roeck do_transfer = true; 923ce8859eSGuenter Roeck else 933ce8859eSGuenter Roeck hw->rindex = hw->tlen - 1; 943ce8859eSGuenter Roeck } else if (t->rx_buf) { 953ce8859eSGuenter Roeck /* 963ce8859eSGuenter Roeck * For receive-only transfers we still need to perform a dummy 973ce8859eSGuenter Roeck * write to receive data from the SPI chip. 983ce8859eSGuenter Roeck * Read data starts at the end of transmit data (minus 1 to 993ce8859eSGuenter Roeck * account for CS). 1003ce8859eSGuenter Roeck */ 1013ce8859eSGuenter Roeck hw->rindex = hw->tlen - 1; 1023ce8859eSGuenter Roeck memset(&hw->buffer[hw->tlen], 0, len); 1033ce8859eSGuenter Roeck hw->tlen += len; 1043ce8859eSGuenter Roeck do_transfer = true; 1053ce8859eSGuenter Roeck } 1063ce8859eSGuenter Roeck 1073ce8859eSGuenter Roeck if (do_transfer && hw->tlen > 1) { 1083ce8859eSGuenter Roeck ret = sc18is602_wait_ready(hw, SC18IS602_BUFSIZ); 1093ce8859eSGuenter Roeck if (ret < 0) 1103ce8859eSGuenter Roeck return ret; 1113ce8859eSGuenter Roeck ret = i2c_master_send(hw->client, hw->buffer, hw->tlen); 1123ce8859eSGuenter Roeck if (ret < 0) 1133ce8859eSGuenter Roeck return ret; 1143ce8859eSGuenter Roeck if (ret != hw->tlen) 1153ce8859eSGuenter Roeck return -EIO; 1163ce8859eSGuenter Roeck 1173ce8859eSGuenter Roeck if (t->rx_buf) { 1183ce8859eSGuenter Roeck int rlen = hw->rindex + len; 1193ce8859eSGuenter Roeck 1203ce8859eSGuenter Roeck ret = sc18is602_wait_ready(hw, hw->tlen); 1213ce8859eSGuenter Roeck if (ret < 0) 1223ce8859eSGuenter Roeck return ret; 1233ce8859eSGuenter Roeck ret = i2c_master_recv(hw->client, hw->buffer, rlen); 1243ce8859eSGuenter Roeck if (ret < 0) 1253ce8859eSGuenter Roeck return ret; 1263ce8859eSGuenter Roeck if (ret != rlen) 1273ce8859eSGuenter Roeck return -EIO; 1283ce8859eSGuenter Roeck memcpy(t->rx_buf, &hw->buffer[hw->rindex], len); 1293ce8859eSGuenter Roeck } 1303ce8859eSGuenter Roeck hw->tlen = 0; 1313ce8859eSGuenter Roeck } 1323ce8859eSGuenter Roeck return len; 1333ce8859eSGuenter Roeck } 1343ce8859eSGuenter Roeck 1353ce8859eSGuenter Roeck static int sc18is602_setup_transfer(struct sc18is602 *hw, u32 hz, u8 mode) 1363ce8859eSGuenter Roeck { 1373ce8859eSGuenter Roeck u8 ctrl = 0; 1383ce8859eSGuenter Roeck int ret; 1393ce8859eSGuenter Roeck 1403ce8859eSGuenter Roeck if (mode & SPI_CPHA) 1413ce8859eSGuenter Roeck ctrl |= SC18IS602_MODE_CPHA; 1423ce8859eSGuenter Roeck if (mode & SPI_CPOL) 1433ce8859eSGuenter Roeck ctrl |= SC18IS602_MODE_CPOL; 1443ce8859eSGuenter Roeck if (mode & SPI_LSB_FIRST) 1453ce8859eSGuenter Roeck ctrl |= SC18IS602_MODE_LSB_FIRST; 1463ce8859eSGuenter Roeck 1473ce8859eSGuenter Roeck /* Find the closest clock speed */ 1483ce8859eSGuenter Roeck if (hz >= hw->freq / 4) { 1493ce8859eSGuenter Roeck ctrl |= SC18IS602_MODE_CLOCK_DIV_4; 1503ce8859eSGuenter Roeck hw->speed = hw->freq / 4; 1513ce8859eSGuenter Roeck } else if (hz >= hw->freq / 16) { 1523ce8859eSGuenter Roeck ctrl |= SC18IS602_MODE_CLOCK_DIV_16; 1533ce8859eSGuenter Roeck hw->speed = hw->freq / 16; 1543ce8859eSGuenter Roeck } else if (hz >= hw->freq / 64) { 1553ce8859eSGuenter Roeck ctrl |= SC18IS602_MODE_CLOCK_DIV_64; 1563ce8859eSGuenter Roeck hw->speed = hw->freq / 64; 1573ce8859eSGuenter Roeck } else { 1583ce8859eSGuenter Roeck ctrl |= SC18IS602_MODE_CLOCK_DIV_128; 1593ce8859eSGuenter Roeck hw->speed = hw->freq / 128; 1603ce8859eSGuenter Roeck } 1613ce8859eSGuenter Roeck 1623ce8859eSGuenter Roeck /* 1633ce8859eSGuenter Roeck * Don't do anything if the control value did not change. The initial 1643ce8859eSGuenter Roeck * value of 0xff for hw->ctrl ensures that the correct mode will be set 1653ce8859eSGuenter Roeck * with the first call to this function. 1663ce8859eSGuenter Roeck */ 1673ce8859eSGuenter Roeck if (ctrl == hw->ctrl) 1683ce8859eSGuenter Roeck return 0; 1693ce8859eSGuenter Roeck 1703ce8859eSGuenter Roeck ret = i2c_smbus_write_byte_data(hw->client, 0xf0, ctrl); 1713ce8859eSGuenter Roeck if (ret < 0) 1723ce8859eSGuenter Roeck return ret; 1733ce8859eSGuenter Roeck 1743ce8859eSGuenter Roeck hw->ctrl = ctrl; 1753ce8859eSGuenter Roeck 1763ce8859eSGuenter Roeck return 0; 1773ce8859eSGuenter Roeck } 1783ce8859eSGuenter Roeck 1793ce8859eSGuenter Roeck static int sc18is602_check_transfer(struct spi_device *spi, 1803ce8859eSGuenter Roeck struct spi_transfer *t, int tlen) 1813ce8859eSGuenter Roeck { 1823ce8859eSGuenter Roeck if (t && t->len + tlen > SC18IS602_BUFSIZ) 1833ce8859eSGuenter Roeck return -EINVAL; 1843ce8859eSGuenter Roeck 1853ce8859eSGuenter Roeck return 0; 1863ce8859eSGuenter Roeck } 1873ce8859eSGuenter Roeck 1883ce8859eSGuenter Roeck static int sc18is602_transfer_one(struct spi_master *master, 1893ce8859eSGuenter Roeck struct spi_message *m) 1903ce8859eSGuenter Roeck { 1913ce8859eSGuenter Roeck struct sc18is602 *hw = spi_master_get_devdata(master); 1923ce8859eSGuenter Roeck struct spi_device *spi = m->spi; 1933ce8859eSGuenter Roeck struct spi_transfer *t; 1943ce8859eSGuenter Roeck int status = 0; 1953ce8859eSGuenter Roeck 1963ce8859eSGuenter Roeck hw->tlen = 0; 1973ce8859eSGuenter Roeck list_for_each_entry(t, &m->transfers, transfer_list) { 1983ce8859eSGuenter Roeck bool do_transfer; 1993ce8859eSGuenter Roeck 2003ce8859eSGuenter Roeck status = sc18is602_check_transfer(spi, t, hw->tlen); 2013ce8859eSGuenter Roeck if (status < 0) 2023ce8859eSGuenter Roeck break; 2033ce8859eSGuenter Roeck 20409e99bcaSAxel Lin status = sc18is602_setup_transfer(hw, t->speed_hz, spi->mode); 2053ce8859eSGuenter Roeck if (status < 0) 2063ce8859eSGuenter Roeck break; 2073ce8859eSGuenter Roeck 2083ce8859eSGuenter Roeck do_transfer = t->cs_change || list_is_last(&t->transfer_list, 2093ce8859eSGuenter Roeck &m->transfers); 2103ce8859eSGuenter Roeck 2113ce8859eSGuenter Roeck if (t->len) { 2123ce8859eSGuenter Roeck status = sc18is602_txrx(hw, m, t, do_transfer); 2133ce8859eSGuenter Roeck if (status < 0) 2143ce8859eSGuenter Roeck break; 2153ce8859eSGuenter Roeck m->actual_length += status; 2163ce8859eSGuenter Roeck } 2173ce8859eSGuenter Roeck status = 0; 2183ce8859eSGuenter Roeck 2193ce8859eSGuenter Roeck if (t->delay_usecs) 2203ce8859eSGuenter Roeck udelay(t->delay_usecs); 2213ce8859eSGuenter Roeck } 2223ce8859eSGuenter Roeck m->status = status; 2233ce8859eSGuenter Roeck spi_finalize_current_message(master); 2243ce8859eSGuenter Roeck 2253ce8859eSGuenter Roeck return status; 2263ce8859eSGuenter Roeck } 2273ce8859eSGuenter Roeck 228c5c67e31SAxel Lin static int sc18is602_setup(struct spi_device *spi) 229c5c67e31SAxel Lin { 230c5c67e31SAxel Lin struct sc18is602 *hw = spi_master_get_devdata(spi->master); 231c5c67e31SAxel Lin 232c5c67e31SAxel Lin /* SC18IS602 does not support CS2 */ 233c5c67e31SAxel Lin if (hw->id == sc18is602 && spi->chip_select == 2) 234c5c67e31SAxel Lin return -ENXIO; 235c5c67e31SAxel Lin 236c5c67e31SAxel Lin return 0; 237c5c67e31SAxel Lin } 238c5c67e31SAxel Lin 2393ce8859eSGuenter Roeck static int sc18is602_probe(struct i2c_client *client, 2403ce8859eSGuenter Roeck const struct i2c_device_id *id) 2413ce8859eSGuenter Roeck { 2423ce8859eSGuenter Roeck struct device *dev = &client->dev; 2433ce8859eSGuenter Roeck struct device_node *np = dev->of_node; 2443ce8859eSGuenter Roeck struct sc18is602_platform_data *pdata = dev_get_platdata(dev); 2453ce8859eSGuenter Roeck struct sc18is602 *hw; 2463ce8859eSGuenter Roeck struct spi_master *master; 2473ce8859eSGuenter Roeck int error; 2483ce8859eSGuenter Roeck 2493ce8859eSGuenter Roeck if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C | 2503ce8859eSGuenter Roeck I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) 25158ed90deSGuenter Roeck return -EINVAL; 2523ce8859eSGuenter Roeck 2533ce8859eSGuenter Roeck master = spi_alloc_master(dev, sizeof(struct sc18is602)); 2543ce8859eSGuenter Roeck if (!master) 2553ce8859eSGuenter Roeck return -ENOMEM; 2563ce8859eSGuenter Roeck 2573ce8859eSGuenter Roeck hw = spi_master_get_devdata(master); 2583ce8859eSGuenter Roeck i2c_set_clientdata(client, hw); 2593ce8859eSGuenter Roeck 2603ce8859eSGuenter Roeck hw->master = master; 2613ce8859eSGuenter Roeck hw->client = client; 2623ce8859eSGuenter Roeck hw->dev = dev; 2633ce8859eSGuenter Roeck hw->ctrl = 0xff; 2643ce8859eSGuenter Roeck 2653ce8859eSGuenter Roeck hw->id = id->driver_data; 2663ce8859eSGuenter Roeck 2673ce8859eSGuenter Roeck switch (hw->id) { 2683ce8859eSGuenter Roeck case sc18is602: 2693ce8859eSGuenter Roeck case sc18is602b: 2703ce8859eSGuenter Roeck master->num_chipselect = 4; 2713ce8859eSGuenter Roeck hw->freq = SC18IS602_CLOCK; 2723ce8859eSGuenter Roeck break; 2733ce8859eSGuenter Roeck case sc18is603: 2743ce8859eSGuenter Roeck master->num_chipselect = 2; 2753ce8859eSGuenter Roeck if (pdata) { 2763ce8859eSGuenter Roeck hw->freq = pdata->clock_frequency; 2773ce8859eSGuenter Roeck } else { 2783ce8859eSGuenter Roeck const __be32 *val; 2793ce8859eSGuenter Roeck int len; 2803ce8859eSGuenter Roeck 2813ce8859eSGuenter Roeck val = of_get_property(np, "clock-frequency", &len); 2823ce8859eSGuenter Roeck if (val && len >= sizeof(__be32)) 2833ce8859eSGuenter Roeck hw->freq = be32_to_cpup(val); 2843ce8859eSGuenter Roeck } 2853ce8859eSGuenter Roeck if (!hw->freq) 2863ce8859eSGuenter Roeck hw->freq = SC18IS602_CLOCK; 2873ce8859eSGuenter Roeck break; 2883ce8859eSGuenter Roeck } 289b4e27545SGuenter Roeck master->bus_num = np ? -1 : client->adapter->nr; 2903ce8859eSGuenter Roeck master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST; 291463654ceSAxel Lin master->bits_per_word_mask = SPI_BPW_MASK(8); 292c5c67e31SAxel Lin master->setup = sc18is602_setup; 2933ce8859eSGuenter Roeck master->transfer_one_message = sc18is602_transfer_one; 2943ce8859eSGuenter Roeck master->dev.of_node = np; 29509e99bcaSAxel Lin master->min_speed_hz = hw->freq / 128; 29609e99bcaSAxel Lin master->max_speed_hz = hw->freq / 4; 2973ce8859eSGuenter Roeck 29815e0964dSJingoo Han error = devm_spi_register_master(dev, master); 2993ce8859eSGuenter Roeck if (error) 3003ce8859eSGuenter Roeck goto error_reg; 3013ce8859eSGuenter Roeck 3023ce8859eSGuenter Roeck return 0; 3033ce8859eSGuenter Roeck 3043ce8859eSGuenter Roeck error_reg: 3053ce8859eSGuenter Roeck spi_master_put(master); 3063ce8859eSGuenter Roeck return error; 3073ce8859eSGuenter Roeck } 3083ce8859eSGuenter Roeck 3093ce8859eSGuenter Roeck static const struct i2c_device_id sc18is602_id[] = { 3103ce8859eSGuenter Roeck { "sc18is602", sc18is602 }, 3113ce8859eSGuenter Roeck { "sc18is602b", sc18is602b }, 3123ce8859eSGuenter Roeck { "sc18is603", sc18is603 }, 3133ce8859eSGuenter Roeck { } 3143ce8859eSGuenter Roeck }; 3153ce8859eSGuenter Roeck MODULE_DEVICE_TABLE(i2c, sc18is602_id); 3163ce8859eSGuenter Roeck 3173ce8859eSGuenter Roeck static struct i2c_driver sc18is602_driver = { 3183ce8859eSGuenter Roeck .driver = { 3193ce8859eSGuenter Roeck .name = "sc18is602", 3203ce8859eSGuenter Roeck }, 3213ce8859eSGuenter Roeck .probe = sc18is602_probe, 3223ce8859eSGuenter Roeck .id_table = sc18is602_id, 3233ce8859eSGuenter Roeck }; 3243ce8859eSGuenter Roeck 3253ce8859eSGuenter Roeck module_i2c_driver(sc18is602_driver); 3263ce8859eSGuenter Roeck 3273ce8859eSGuenter Roeck MODULE_DESCRIPTION("SC18IC602/603 SPI Master Driver"); 3283ce8859eSGuenter Roeck MODULE_AUTHOR("Guenter Roeck"); 3293ce8859eSGuenter Roeck MODULE_LICENSE("GPL"); 330