Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.10-rc5 90 lines 2.6 kB view raw
1// SPDX-License-Identifier: GPL-2.0+ 2/* SC16IS7xx SPI interface driver */ 3 4#include <linux/dev_printk.h> 5#include <linux/mod_devicetable.h> 6#include <linux/module.h> 7#include <linux/regmap.h> 8#include <linux/spi/spi.h> 9#include <linux/string.h> 10#include <linux/units.h> 11 12#include "sc16is7xx.h" 13 14/* SPI definitions */ 15#define SC16IS7XX_SPI_READ_BIT BIT(7) 16 17static int sc16is7xx_spi_probe(struct spi_device *spi) 18{ 19 const struct sc16is7xx_devtype *devtype; 20 struct regmap *regmaps[SC16IS7XX_MAX_PORTS]; 21 struct regmap_config regcfg; 22 unsigned int i; 23 int ret; 24 25 /* Setup SPI bus */ 26 spi->bits_per_word = 8; 27 /* For all variants, only mode 0 is supported */ 28 if ((spi->mode & SPI_MODE_X_MASK) != SPI_MODE_0) 29 return dev_err_probe(&spi->dev, -EINVAL, "Unsupported SPI mode\n"); 30 31 spi->mode = spi->mode ? : SPI_MODE_0; 32 spi->max_speed_hz = spi->max_speed_hz ? : 4 * HZ_PER_MHZ; 33 ret = spi_setup(spi); 34 if (ret) 35 return ret; 36 37 devtype = spi_get_device_match_data(spi); 38 if (!devtype) 39 return dev_err_probe(&spi->dev, -ENODEV, "Failed to match device\n"); 40 41 memcpy(&regcfg, &sc16is7xx_regcfg, sizeof(struct regmap_config)); 42 43 for (i = 0; i < devtype->nr_uart; i++) { 44 regcfg.name = sc16is7xx_regmap_name(i); 45 /* 46 * If read_flag_mask is 0, the regmap code sets it to a default 47 * of 0x80. Since we specify our own mask, we must add the READ 48 * bit ourselves: 49 */ 50 regcfg.read_flag_mask = sc16is7xx_regmap_port_mask(i) | 51 SC16IS7XX_SPI_READ_BIT; 52 regcfg.write_flag_mask = sc16is7xx_regmap_port_mask(i); 53 regmaps[i] = devm_regmap_init_spi(spi, &regcfg); 54 } 55 56 return sc16is7xx_probe(&spi->dev, devtype, regmaps, spi->irq); 57} 58 59static void sc16is7xx_spi_remove(struct spi_device *spi) 60{ 61 sc16is7xx_remove(&spi->dev); 62} 63 64static const struct spi_device_id sc16is7xx_spi_id_table[] = { 65 { "sc16is74x", (kernel_ulong_t)&sc16is74x_devtype, }, 66 { "sc16is740", (kernel_ulong_t)&sc16is74x_devtype, }, 67 { "sc16is741", (kernel_ulong_t)&sc16is74x_devtype, }, 68 { "sc16is750", (kernel_ulong_t)&sc16is750_devtype, }, 69 { "sc16is752", (kernel_ulong_t)&sc16is752_devtype, }, 70 { "sc16is760", (kernel_ulong_t)&sc16is760_devtype, }, 71 { "sc16is762", (kernel_ulong_t)&sc16is762_devtype, }, 72 { } 73}; 74MODULE_DEVICE_TABLE(spi, sc16is7xx_spi_id_table); 75 76static struct spi_driver sc16is7xx_spi_driver = { 77 .driver = { 78 .name = SC16IS7XX_NAME, 79 .of_match_table = sc16is7xx_dt_ids, 80 }, 81 .probe = sc16is7xx_spi_probe, 82 .remove = sc16is7xx_spi_remove, 83 .id_table = sc16is7xx_spi_id_table, 84}; 85 86module_spi_driver(sc16is7xx_spi_driver); 87 88MODULE_LICENSE("GPL"); 89MODULE_DESCRIPTION("SC16IS7xx SPI interface driver"); 90MODULE_IMPORT_NS(SERIAL_NXP_SC16IS7XX);