aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Färber <afaerber@suse.de>2019-01-14 22:58:09 +0100
committerAndreas Färber <afaerber@suse.de>2019-03-12 02:42:22 +0100
commit5bf7b867c26f1adf87c572c0bb243b2cdc8cd7cd (patch)
treea4b4ffc2c10c4377e3d2e437b85505144a910e10
parent82617e23b294ba825ba84e47d781559bf5a2ce40 (diff)
downloadlinux-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/Makefile3
-rw-r--r--drivers/net/fsk/si443x.c87
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");