1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
From 838a8a77639dc2c1bb349830fe75025aacbe096b Mon Sep 17 00:00:00 2001
From: Sanjay R Mehta <sanju.mehta@amd.com>
Date: Tue, 3 Mar 2020 14:44:41 +0530
Subject: [PATCH 04/10] spi: spidev: Add dummy spidev device to SPI bus
Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
---
drivers/spi/spidev.c | 40 +++++++++++++++++++++++++++++++++++++++-
1 file changed, 39 insertions(+), 1 deletion(-)
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
index 859910ec8d9f..710d9d8b5383 100644
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
@@ -27,6 +27,8 @@
#include <linux/uaccess.h>
+#define SPI_BUS 0
+#define SPI_BUS_CS1 0
/*
* This supports access to SPI devices using normal userspace I/O calls.
@@ -46,6 +48,7 @@
static DECLARE_BITMAP(minors, N_SPI_MINORS);
+struct spi_device *spi_device;
/* Bit masks for spi_device.mode management. Note that incorrect
* settings for some settings can cause *lots* of trouble for other
@@ -741,7 +744,7 @@ static int spidev_probe(struct spi_device *spi)
of_device_is_compatible(spi->dev.of_node, "spidev"),
"%pOF: buggy DT: spidev listed directly in DT\n", spi->dev.of_node);
- spidev_probe_acpi(spi);
+// spidev_probe_acpi(spi);
/* Allocate driver data */
spidev = kzalloc(sizeof(*spidev), GFP_KERNEL);
@@ -827,6 +830,32 @@ static struct spi_driver spidev_spi_driver = {
/*-------------------------------------------------------------------------*/
+static int __init add_spi_device_to_bus(void)
+{
+ struct spi_master *spi_master;
+ struct spi_board_info spi_info;
+
+ spi_master = spi_busnum_to_master(SPI_BUS);
+ if (!spi_master) {
+ printk(KERN_ALERT "Please make sure to \'modprobe "
+ "spi_amd\' driver first\n");
+ return -1;
+ }
+ memset(&spi_info, 0, sizeof(struct spi_board_info));
+
+ strlcpy(spi_info.modalias, "spidev", SPI_NAME_SIZE);
+ spi_info.bus_num = SPI_BUS; //Bus number of SPI master
+ spi_info.chip_select = SPI_BUS_CS1; //CS on which SPI device is connected
+
+ spi_device = spi_new_device(spi_master, &spi_info);
+ if (!spi_device)
+ return -ENODEV;
+
+ return 0;
+}
+
+
+
static int __init spidev_init(void)
{
int status;
@@ -851,6 +880,14 @@ static int __init spidev_init(void)
class_destroy(spidev_class);
unregister_chrdev(SPIDEV_MAJOR, spidev_spi_driver.driver.name);
}
+
+ status = add_spi_device_to_bus();
+ if (status < 0) {
+ spi_unregister_driver(&spidev_spi_driver);
+ class_destroy(spidev_class);
+ unregister_chrdev(SPIDEV_MAJOR, spidev_spi_driver.driver.name);
+ }
+
return status;
}
module_init(spidev_init);
@@ -858,6 +895,7 @@ module_init(spidev_init);
static void __exit spidev_exit(void)
{
spi_unregister_driver(&spidev_spi_driver);
+ spi_unregister_device(spi_device);
class_destroy(spidev_class);
unregister_chrdev(SPIDEV_MAJOR, spidev_spi_driver.driver.name);
}
--
2.17.1
|