diff options
author | Andreas Färber <afaerber@suse.de> | 2019-01-14 22:58:09 +0100 |
---|---|---|
committer | Andreas Färber <afaerber@suse.de> | 2019-03-12 02:42:22 +0100 |
commit | 5bf7b867c26f1adf87c572c0bb243b2cdc8cd7cd (patch) | |
tree | a4b4ffc2c10c4377e3d2e437b85505144a910e10 | |
parent | 82617e23b294ba825ba84e47d781559bf5a2ce40 (diff) | |
download | linux-lora-lora-next.tar.gz |
net: fsk: Prepare SiLabs Si4432 driverlora-next
Tested with HopeRF RFM22B module on Chistera Pi HAT.
Signed-off-by: Andreas Färber <afaerber@suse.de>
-rw-r--r-- | drivers/net/fsk/Makefile | 3 | ||||
-rw-r--r-- | drivers/net/fsk/si443x.c | 87 |
2 files changed, 90 insertions, 0 deletions
diff --git a/drivers/net/fsk/Makefile b/drivers/net/fsk/Makefile index 0be2ecc561dcef..f2b53696e7a172 100644 --- a/drivers/net/fsk/Makefile +++ b/drivers/net/fsk/Makefile @@ -1,2 +1,5 @@ obj-m += fsk-nrf24l01p.o fsk-nrf24l01p-y := nrf24l01p.o + +obj-m += fsk-si443x.o +fsk-si443x-y := si443x.o diff --git a/drivers/net/fsk/si443x.c b/drivers/net/fsk/si443x.c new file mode 100644 index 00000000000000..ee2873665470ad --- /dev/null +++ b/drivers/net/fsk/si443x.c @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * SiLabs Si4432 transceiver + * + * Copyright (c) 2019 Andreas Färber + */ + +#include <linux/module.h> +#include <linux/netdevice.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/regmap.h> +#include <linux/spi/spi.h> + +static struct regmap_config si443x_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + + .cache_type = REGCACHE_NONE, + + .read_flag_mask = 0, + .write_flag_mask = BIT(7), + + .max_register = 0x7f, +}; + +#ifdef CONFIG_OF +static const struct of_device_id si443x_dt_ids[] = { + { .compatible = "silabs,si4432" }, + {} +}; +MODULE_DEVICE_TABLE(of, si443x_dt_ids); +#endif + +static int si443x_probe(struct spi_device *spi) +{ + struct regmap *regmap; + unsigned int val; + int ret; + + spi->bits_per_word = 8; + spi_setup(spi); + + regmap = devm_regmap_init_spi(spi, &si443x_regmap_config); + if (IS_ERR(regmap)) { + ret = PTR_ERR(regmap); + return ret; + } + + ret = regmap_read(regmap, 0, &val); + if (ret) + return ret; + + dev_info(&spi->dev, "device type: 0x%02x\n", val); + + ret = regmap_read(regmap, 1, &val); + if (ret) + return ret; + + dev_info(&spi->dev, "device version: 0x%02x\n", val); + + dev_info(&spi->dev, "probed\n"); + + return 0; +} + +static int si443x_remove(struct spi_device *spi) +{ + dev_info(&spi->dev, "removed\n"); + + return 0; +} + +static struct spi_driver si443x_spi_driver = { + .driver = { + .name = "si443x", + .of_match_table = of_match_ptr(si443x_dt_ids), + }, + .probe = si443x_probe, + .remove = si443x_remove, +}; + +module_spi_driver(si443x_spi_driver); + +MODULE_DESCRIPTION("Si443x SPI driver"); +MODULE_AUTHOR("Andreas Färber <afaerber@suse.de>"); +MODULE_LICENSE("GPL"); |