1 // SPDX-License-Identifier: GPL-2.0+
2 /* SC16IS7xx SPI interface driver */
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>
12 #include "sc16is7xx.h"
15 #define SC16IS7XX_SPI_READ_BIT BIT(7)
17 static int sc16is7xx_spi_probe(struct spi_device
*spi
)
19 const struct sc16is7xx_devtype
*devtype
;
20 struct regmap
*regmaps
[SC16IS7XX_MAX_PORTS
];
21 struct regmap_config regcfg
;
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");
31 spi
->mode
= spi
->mode
? : SPI_MODE_0
;
32 spi
->max_speed_hz
= spi
->max_speed_hz
? : 4 * HZ_PER_MHZ
;
37 devtype
= spi_get_device_match_data(spi
);
39 return dev_err_probe(&spi
->dev
, -ENODEV
, "Failed to match device\n");
41 memcpy(®cfg
, &sc16is7xx_regcfg
, sizeof(struct regmap_config
));
43 for (i
= 0; i
< devtype
->nr_uart
; i
++) {
44 regcfg
.name
= sc16is7xx_regmap_name(i
);
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
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
, ®cfg
);
56 return sc16is7xx_probe(&spi
->dev
, devtype
, regmaps
, spi
->irq
);
59 static void sc16is7xx_spi_remove(struct spi_device
*spi
)
61 sc16is7xx_remove(&spi
->dev
);
64 static 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
, },
74 MODULE_DEVICE_TABLE(spi
, sc16is7xx_spi_id_table
);
76 static struct spi_driver sc16is7xx_spi_driver
= {
78 .name
= SC16IS7XX_NAME
,
79 .of_match_table
= sc16is7xx_dt_ids
,
81 .probe
= sc16is7xx_spi_probe
,
82 .remove
= sc16is7xx_spi_remove
,
83 .id_table
= sc16is7xx_spi_id_table
,
86 module_spi_driver(sc16is7xx_spi_driver
);
88 MODULE_LICENSE("GPL");
89 MODULE_DESCRIPTION("SC16IS7xx SPI interface driver");
90 MODULE_IMPORT_NS(SERIAL_NXP_SC16IS7XX
);