Blame view

drivers/spi/spi.c 113 KB
b445bfcb9   Marco Felsch   spi: switch to SP...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
787f4889a   Mark Brown   spi: Fix formatti...
2
3
4
5
  // SPI init/core code
  //
  // Copyright (C) 2005 David Brownell
  // Copyright (C) 2008 Secret Lab Technologies Ltd.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
6

8ae12a0d8   David Brownell   [PATCH] spi: simp...
7
8
9
10
  #include <linux/kernel.h>
  #include <linux/device.h>
  #include <linux/init.h>
  #include <linux/cache.h>
99adef310   Mark Brown   spi: Provide core...
11
12
  #include <linux/dma-mapping.h>
  #include <linux/dmaengine.h>
940408289   Matthias Kaehlcke   use mutex instead...
13
  #include <linux/mutex.h>
2b7a32f7e   Sinan Akman   of/spi: Fix OF-st...
14
  #include <linux/of_device.h>
d57a4282d   Grant Likely   spi/devicetree: M...
15
  #include <linux/of_irq.h>
86be408bf   Sylwester Nawrocki   clk: Support for ...
16
  #include <linux/clk/clk-conf.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
17
  #include <linux/slab.h>
e0626e384   Anton Vorontsov   spi: prefix modal...
18
  #include <linux/mod_devicetable.h>
8ae12a0d8   David Brownell   [PATCH] spi: simp...
19
  #include <linux/spi/spi.h>
b5932f5c6   Boris Brezillon   spi: Make support...
20
  #include <linux/spi/spi-mem.h>
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
21
  #include <linux/of_gpio.h>
f3186dd87   Linus Walleij   spi: Optionally u...
22
  #include <linux/gpio/consumer.h>
3ae22e8c8   Mark Brown   spi / PM: Support...
23
  #include <linux/pm_runtime.h>
f48c767ce   Ulf Hansson   PM / Domains: Mov...
24
  #include <linux/pm_domain.h>
826cf175e   Dmitry Torokhov   spi: allow attach...
25
  #include <linux/property.h>
025ed1306   Paul Gortmaker   spi: Add export.h...
26
  #include <linux/export.h>
8bd75c77b   Clark Williams   sched/rt: Move rt...
27
  #include <linux/sched/rt.h>
ae7e81c07   Ingo Molnar   sched/headers: Pr...
28
  #include <uapi/linux/sched/types.h>
ffbbdd213   Linus Walleij   spi: create a mes...
29
30
  #include <linux/delay.h>
  #include <linux/kthread.h>
64bee4d28   Mika Westerberg   spi / ACPI: add A...
31
32
  #include <linux/ioport.h>
  #include <linux/acpi.h>
b1b8153cf   Vignesh R   spi: Add support ...
33
  #include <linux/highmem.h>
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
34
  #include <linux/idr.h>
8a2e487e6   Lukas Wunner   spi: Use Apple de...
35
  #include <linux/platform_data/x86/apple.h>
8ae12a0d8   David Brownell   [PATCH] spi: simp...
36

56ec1978f   Mark Brown   spi: Provide trac...
37
38
  #define CREATE_TRACE_POINTS
  #include <trace/events/spi.h>
ca1438dcb   Arnd Bergmann   spi: export trace...
39
40
  EXPORT_TRACEPOINT_SYMBOL(spi_transfer_start);
  EXPORT_TRACEPOINT_SYMBOL(spi_transfer_stop);
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
41

46336966b   Boris Brezillon   spi: Expose spi_{...
42
  #include "internals.h"
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
43
  static DEFINE_IDR(spi_master_idr);
56ec1978f   Mark Brown   spi: Provide trac...
44

8ae12a0d8   David Brownell   [PATCH] spi: simp...
45
46
  static void spidev_release(struct device *dev)
  {
0ffa02850   Hans-Peter Nilsson   [PATCH] SPI clean...
47
  	struct spi_device	*spi = to_spi_device(dev);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
48

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
49
50
51
  	/* spi controllers may cleanup for released devices */
  	if (spi->controller->cleanup)
  		spi->controller->cleanup(spi);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
52

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
53
  	spi_controller_put(spi->controller);
5039563e7   Trent Piepho   spi: Add driver_o...
54
  	kfree(spi->driver_override);
07a389fee   Roman Tereshonkov   spi: spi_device m...
55
  	kfree(spi);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
56
57
58
59
60
61
  }
  
  static ssize_t
  modalias_show(struct device *dev, struct device_attribute *a, char *buf)
  {
  	const struct spi_device	*spi = to_spi_device(dev);
8c4ff6d00   Zhang Rui   ACPI: fix module ...
62
63
64
65
66
  	int len;
  
  	len = acpi_device_modalias(dev, buf, PAGE_SIZE - 1);
  	if (len != -ENODEV)
  		return len;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
67

d8e328b3b   Grant Likely   spi: Add "spi:" p...
68
69
  	return sprintf(buf, "%s%s
  ", SPI_MODULE_PREFIX, spi->modalias);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
70
  }
aa7da564c   Greg Kroah-Hartman   spi: convert bus ...
71
  static DEVICE_ATTR_RO(modalias);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
72

5039563e7   Trent Piepho   spi: Add driver_o...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  static ssize_t driver_override_store(struct device *dev,
  				     struct device_attribute *a,
  				     const char *buf, size_t count)
  {
  	struct spi_device *spi = to_spi_device(dev);
  	const char *end = memchr(buf, '
  ', count);
  	const size_t len = end ? end - buf : count;
  	const char *driver_override, *old;
  
  	/* We need to keep extra room for a newline when displaying value */
  	if (len >= (PAGE_SIZE - 1))
  		return -EINVAL;
  
  	driver_override = kstrndup(buf, len, GFP_KERNEL);
  	if (!driver_override)
  		return -ENOMEM;
  
  	device_lock(dev);
  	old = spi->driver_override;
  	if (len) {
  		spi->driver_override = driver_override;
  	} else {
be73e323a   Andy Shevchenko   spi: Fix spelling...
96
  		/* Empty string, disable driver override */
5039563e7   Trent Piepho   spi: Add driver_o...
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  		spi->driver_override = NULL;
  		kfree(driver_override);
  	}
  	device_unlock(dev);
  	kfree(old);
  
  	return count;
  }
  
  static ssize_t driver_override_show(struct device *dev,
  				    struct device_attribute *a, char *buf)
  {
  	const struct spi_device *spi = to_spi_device(dev);
  	ssize_t len;
  
  	device_lock(dev);
  	len = snprintf(buf, PAGE_SIZE, "%s
  ", spi->driver_override ? : "");
  	device_unlock(dev);
  	return len;
  }
  static DEVICE_ATTR_RW(driver_override);
eca2ebc7e   Martin Sperl   spi: expose spi_m...
119
  #define SPI_STATISTICS_ATTRS(field, file)				\
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
120
121
122
  static ssize_t spi_controller_##field##_show(struct device *dev,	\
  					     struct device_attribute *attr, \
  					     char *buf)			\
eca2ebc7e   Martin Sperl   spi: expose spi_m...
123
  {									\
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
124
125
126
  	struct spi_controller *ctlr = container_of(dev,			\
  					 struct spi_controller, dev);	\
  	return spi_statistics_##field##_show(&ctlr->statistics, buf);	\
eca2ebc7e   Martin Sperl   spi: expose spi_m...
127
  }									\
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
128
  static struct device_attribute dev_attr_spi_controller_##field = {	\
ad25c92ec   Geert Uytterhoeven   spi: core: Replac...
129
  	.attr = { .name = file, .mode = 0444 },				\
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
130
  	.show = spi_controller_##field##_show,				\
eca2ebc7e   Martin Sperl   spi: expose spi_m...
131
132
133
134
135
  };									\
  static ssize_t spi_device_##field##_show(struct device *dev,		\
  					 struct device_attribute *attr,	\
  					char *buf)			\
  {									\
d1eba93bd   Geliang Tang   spi: use to_spi_d...
136
  	struct spi_device *spi = to_spi_device(dev);			\
eca2ebc7e   Martin Sperl   spi: expose spi_m...
137
138
139
  	return spi_statistics_##field##_show(&spi->statistics, buf);	\
  }									\
  static struct device_attribute dev_attr_spi_device_##field = {		\
ad25c92ec   Geert Uytterhoeven   spi: core: Replac...
140
  	.attr = { .name = file, .mode = 0444 },				\
eca2ebc7e   Martin Sperl   spi: expose spi_m...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  	.show = spi_device_##field##_show,				\
  }
  
  #define SPI_STATISTICS_SHOW_NAME(name, file, field, format_string)	\
  static ssize_t spi_statistics_##name##_show(struct spi_statistics *stat, \
  					    char *buf)			\
  {									\
  	unsigned long flags;						\
  	ssize_t len;							\
  	spin_lock_irqsave(&stat->lock, flags);				\
  	len = sprintf(buf, format_string, stat->field);			\
  	spin_unlock_irqrestore(&stat->lock, flags);			\
  	return len;							\
  }									\
  SPI_STATISTICS_ATTRS(name, file)
  
  #define SPI_STATISTICS_SHOW(field, format_string)			\
  	SPI_STATISTICS_SHOW_NAME(field, __stringify(field),		\
  				 field, format_string)
  
  SPI_STATISTICS_SHOW(messages, "%lu");
  SPI_STATISTICS_SHOW(transfers, "%lu");
  SPI_STATISTICS_SHOW(errors, "%lu");
  SPI_STATISTICS_SHOW(timedout, "%lu");
  
  SPI_STATISTICS_SHOW(spi_sync, "%lu");
  SPI_STATISTICS_SHOW(spi_sync_immediate, "%lu");
  SPI_STATISTICS_SHOW(spi_async, "%lu");
  
  SPI_STATISTICS_SHOW(bytes, "%llu");
  SPI_STATISTICS_SHOW(bytes_rx, "%llu");
  SPI_STATISTICS_SHOW(bytes_tx, "%llu");
6b7bc0618   Martin Sperl   spi: add transfer...
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
  #define SPI_STATISTICS_TRANSFER_BYTES_HISTO(index, number)		\
  	SPI_STATISTICS_SHOW_NAME(transfer_bytes_histo##index,		\
  				 "transfer_bytes_histo_" number,	\
  				 transfer_bytes_histo[index],  "%lu")
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(0,  "0-1");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(1,  "2-3");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(2,  "4-7");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(3,  "8-15");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(4,  "16-31");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(5,  "32-63");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(6,  "64-127");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(7,  "128-255");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(8,  "256-511");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(9,  "512-1023");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(10, "1024-2047");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(11, "2048-4095");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(12, "4096-8191");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(13, "8192-16383");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(14, "16384-32767");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(15, "32768-65535");
  SPI_STATISTICS_TRANSFER_BYTES_HISTO(16, "65536+");
d9f121227   Martin Sperl   spi: core: add sp...
194
  SPI_STATISTICS_SHOW(transfers_split_maxsize, "%lu");
aa7da564c   Greg Kroah-Hartman   spi: convert bus ...
195
196
  static struct attribute *spi_dev_attrs[] = {
  	&dev_attr_modalias.attr,
5039563e7   Trent Piepho   spi: Add driver_o...
197
  	&dev_attr_driver_override.attr,
aa7da564c   Greg Kroah-Hartman   spi: convert bus ...
198
  	NULL,
8ae12a0d8   David Brownell   [PATCH] spi: simp...
199
  };
eca2ebc7e   Martin Sperl   spi: expose spi_m...
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
  
  static const struct attribute_group spi_dev_group = {
  	.attrs  = spi_dev_attrs,
  };
  
  static struct attribute *spi_device_statistics_attrs[] = {
  	&dev_attr_spi_device_messages.attr,
  	&dev_attr_spi_device_transfers.attr,
  	&dev_attr_spi_device_errors.attr,
  	&dev_attr_spi_device_timedout.attr,
  	&dev_attr_spi_device_spi_sync.attr,
  	&dev_attr_spi_device_spi_sync_immediate.attr,
  	&dev_attr_spi_device_spi_async.attr,
  	&dev_attr_spi_device_bytes.attr,
  	&dev_attr_spi_device_bytes_rx.attr,
  	&dev_attr_spi_device_bytes_tx.attr,
6b7bc0618   Martin Sperl   spi: add transfer...
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
  	&dev_attr_spi_device_transfer_bytes_histo0.attr,
  	&dev_attr_spi_device_transfer_bytes_histo1.attr,
  	&dev_attr_spi_device_transfer_bytes_histo2.attr,
  	&dev_attr_spi_device_transfer_bytes_histo3.attr,
  	&dev_attr_spi_device_transfer_bytes_histo4.attr,
  	&dev_attr_spi_device_transfer_bytes_histo5.attr,
  	&dev_attr_spi_device_transfer_bytes_histo6.attr,
  	&dev_attr_spi_device_transfer_bytes_histo7.attr,
  	&dev_attr_spi_device_transfer_bytes_histo8.attr,
  	&dev_attr_spi_device_transfer_bytes_histo9.attr,
  	&dev_attr_spi_device_transfer_bytes_histo10.attr,
  	&dev_attr_spi_device_transfer_bytes_histo11.attr,
  	&dev_attr_spi_device_transfer_bytes_histo12.attr,
  	&dev_attr_spi_device_transfer_bytes_histo13.attr,
  	&dev_attr_spi_device_transfer_bytes_histo14.attr,
  	&dev_attr_spi_device_transfer_bytes_histo15.attr,
  	&dev_attr_spi_device_transfer_bytes_histo16.attr,
d9f121227   Martin Sperl   spi: core: add sp...
233
  	&dev_attr_spi_device_transfers_split_maxsize.attr,
eca2ebc7e   Martin Sperl   spi: expose spi_m...
234
235
236
237
238
239
240
241
242
243
244
245
246
  	NULL,
  };
  
  static const struct attribute_group spi_device_statistics_group = {
  	.name  = "statistics",
  	.attrs  = spi_device_statistics_attrs,
  };
  
  static const struct attribute_group *spi_dev_groups[] = {
  	&spi_dev_group,
  	&spi_device_statistics_group,
  	NULL,
  };
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
  static struct attribute *spi_controller_statistics_attrs[] = {
  	&dev_attr_spi_controller_messages.attr,
  	&dev_attr_spi_controller_transfers.attr,
  	&dev_attr_spi_controller_errors.attr,
  	&dev_attr_spi_controller_timedout.attr,
  	&dev_attr_spi_controller_spi_sync.attr,
  	&dev_attr_spi_controller_spi_sync_immediate.attr,
  	&dev_attr_spi_controller_spi_async.attr,
  	&dev_attr_spi_controller_bytes.attr,
  	&dev_attr_spi_controller_bytes_rx.attr,
  	&dev_attr_spi_controller_bytes_tx.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo0.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo1.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo2.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo3.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo4.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo5.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo6.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo7.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo8.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo9.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo10.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo11.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo12.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo13.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo14.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo15.attr,
  	&dev_attr_spi_controller_transfer_bytes_histo16.attr,
  	&dev_attr_spi_controller_transfers_split_maxsize.attr,
eca2ebc7e   Martin Sperl   spi: expose spi_m...
276
277
  	NULL,
  };
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
278
  static const struct attribute_group spi_controller_statistics_group = {
eca2ebc7e   Martin Sperl   spi: expose spi_m...
279
  	.name  = "statistics",
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
280
  	.attrs  = spi_controller_statistics_attrs,
eca2ebc7e   Martin Sperl   spi: expose spi_m...
281
282
283
  };
  
  static const struct attribute_group *spi_master_groups[] = {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
284
  	&spi_controller_statistics_group,
eca2ebc7e   Martin Sperl   spi: expose spi_m...
285
286
287
288
289
  	NULL,
  };
  
  void spi_statistics_add_transfer_stats(struct spi_statistics *stats,
  				       struct spi_transfer *xfer,
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
290
  				       struct spi_controller *ctlr)
eca2ebc7e   Martin Sperl   spi: expose spi_m...
291
292
  {
  	unsigned long flags;
6b7bc0618   Martin Sperl   spi: add transfer...
293
294
295
296
  	int l2len = min(fls(xfer->len), SPI_STATISTICS_HISTO_SIZE) - 1;
  
  	if (l2len < 0)
  		l2len = 0;
eca2ebc7e   Martin Sperl   spi: expose spi_m...
297
298
299
300
  
  	spin_lock_irqsave(&stats->lock, flags);
  
  	stats->transfers++;
6b7bc0618   Martin Sperl   spi: add transfer...
301
  	stats->transfer_bytes_histo[l2len]++;
eca2ebc7e   Martin Sperl   spi: expose spi_m...
302
303
304
  
  	stats->bytes += xfer->len;
  	if ((xfer->tx_buf) &&
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
305
  	    (xfer->tx_buf != ctlr->dummy_tx))
eca2ebc7e   Martin Sperl   spi: expose spi_m...
306
307
  		stats->bytes_tx += xfer->len;
  	if ((xfer->rx_buf) &&
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
308
  	    (xfer->rx_buf != ctlr->dummy_rx))
eca2ebc7e   Martin Sperl   spi: expose spi_m...
309
310
311
312
313
  		stats->bytes_rx += xfer->len;
  
  	spin_unlock_irqrestore(&stats->lock, flags);
  }
  EXPORT_SYMBOL_GPL(spi_statistics_add_transfer_stats);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
314
315
316
317
  
  /* modalias support makes "modprobe $MODALIAS" new-style hotplug work,
   * and the sysfs version makes coldplug work too.
   */
75368bf6c   Anton Vorontsov   spi: add support ...
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
  static const struct spi_device_id *spi_match_id(const struct spi_device_id *id,
  						const struct spi_device *sdev)
  {
  	while (id->name[0]) {
  		if (!strcmp(sdev->modalias, id->name))
  			return id;
  		id++;
  	}
  	return NULL;
  }
  
  const struct spi_device_id *spi_get_device_id(const struct spi_device *sdev)
  {
  	const struct spi_driver *sdrv = to_spi_driver(sdev->dev.driver);
  
  	return spi_match_id(sdrv->id_table, sdev);
  }
  EXPORT_SYMBOL_GPL(spi_get_device_id);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
336
337
338
  static int spi_match_device(struct device *dev, struct device_driver *drv)
  {
  	const struct spi_device	*spi = to_spi_device(dev);
75368bf6c   Anton Vorontsov   spi: add support ...
339
  	const struct spi_driver	*sdrv = to_spi_driver(drv);
5039563e7   Trent Piepho   spi: Add driver_o...
340
341
342
  	/* Check override first, and if set, only use the named driver */
  	if (spi->driver_override)
  		return strcmp(spi->driver_override, drv->name) == 0;
2b7a32f7e   Sinan Akman   of/spi: Fix OF-st...
343
344
345
  	/* Attempt an OF style match */
  	if (of_driver_match_device(dev, drv))
  		return 1;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
346
347
348
  	/* Then try ACPI */
  	if (acpi_driver_match_device(dev, drv))
  		return 1;
75368bf6c   Anton Vorontsov   spi: add support ...
349
350
  	if (sdrv->id_table)
  		return !!spi_match_id(sdrv->id_table, spi);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
351

35f74fcab   Kay Sievers   spi: struct devic...
352
  	return strcmp(spi->modalias, drv->name) == 0;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
353
  }
7eff2e7a8   Kay Sievers   Driver core: chan...
354
  static int spi_uevent(struct device *dev, struct kobj_uevent_env *env)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
355
356
  {
  	const struct spi_device		*spi = to_spi_device(dev);
8c4ff6d00   Zhang Rui   ACPI: fix module ...
357
358
359
360
361
  	int rc;
  
  	rc = acpi_device_uevent_modalias(dev, env);
  	if (rc != -ENODEV)
  		return rc;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
362

2856670f2   Andy Shevchenko   spi: core: Propag...
363
  	return add_uevent_var(env, "MODALIAS=%s%s", SPI_MODULE_PREFIX, spi->modalias);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
364
  }
8ae12a0d8   David Brownell   [PATCH] spi: simp...
365
366
  struct bus_type spi_bus_type = {
  	.name		= "spi",
aa7da564c   Greg Kroah-Hartman   spi: convert bus ...
367
  	.dev_groups	= spi_dev_groups,
8ae12a0d8   David Brownell   [PATCH] spi: simp...
368
369
  	.match		= spi_match_device,
  	.uevent		= spi_uevent,
8ae12a0d8   David Brownell   [PATCH] spi: simp...
370
371
  };
  EXPORT_SYMBOL_GPL(spi_bus_type);
b885244eb   David Brownell   [PATCH] spi: add ...
372
373
374
375
  
  static int spi_drv_probe(struct device *dev)
  {
  	const struct spi_driver		*sdrv = to_spi_driver(dev->driver);
44af79273   Jon Hunter   spi: Map SPI OF c...
376
  	struct spi_device		*spi = to_spi_device(dev);
33cf00e57   Mika Westerberg   spi: attach/detac...
377
  	int ret;
86be408bf   Sylwester Nawrocki   clk: Support for ...
378
379
380
  	ret = of_clk_set_defaults(dev->of_node, false);
  	if (ret)
  		return ret;
44af79273   Jon Hunter   spi: Map SPI OF c...
381
382
383
384
385
386
387
  	if (dev->of_node) {
  		spi->irq = of_irq_get(dev->of_node, 0);
  		if (spi->irq == -EPROBE_DEFER)
  			return -EPROBE_DEFER;
  		if (spi->irq < 0)
  			spi->irq = 0;
  	}
676e7c257   Ulf Hansson   spi: core: Conver...
388
  	ret = dev_pm_domain_attach(dev, true);
71f277a7b   Ulf Hansson   spi: Respect all ...
389
390
  	if (ret)
  		return ret;
ddbed6d02   Uwe Kleine-König   spi: fix resource...
391
392
393
394
395
  	if (sdrv->probe) {
  		ret = sdrv->probe(spi);
  		if (ret)
  			dev_pm_domain_detach(dev, true);
  	}
b885244eb   David Brownell   [PATCH] spi: add ...
396

33cf00e57   Mika Westerberg   spi: attach/detac...
397
  	return ret;
b885244eb   David Brownell   [PATCH] spi: add ...
398
399
400
401
402
  }
  
  static int spi_drv_remove(struct device *dev)
  {
  	const struct spi_driver		*sdrv = to_spi_driver(dev->driver);
ddbed6d02   Uwe Kleine-König   spi: fix resource...
403
  	int ret = 0;
33cf00e57   Mika Westerberg   spi: attach/detac...
404

ddbed6d02   Uwe Kleine-König   spi: fix resource...
405
406
  	if (sdrv->remove)
  		ret = sdrv->remove(to_spi_device(dev));
676e7c257   Ulf Hansson   spi: core: Conver...
407
  	dev_pm_domain_detach(dev, true);
b885244eb   David Brownell   [PATCH] spi: add ...
408

33cf00e57   Mika Westerberg   spi: attach/detac...
409
  	return ret;
b885244eb   David Brownell   [PATCH] spi: add ...
410
411
412
413
414
415
416
417
  }
  
  static void spi_drv_shutdown(struct device *dev)
  {
  	const struct spi_driver		*sdrv = to_spi_driver(dev->driver);
  
  	sdrv->shutdown(to_spi_device(dev));
  }
33e34dc6e   David Brownell   SPI kerneldoc
418
  /**
ca5d24854   Andrew F. Davis   spi: Add THIS_MOD...
419
   * __spi_register_driver - register a SPI driver
88c9321d1   Thierry Reding   spi: Add missing ...
420
   * @owner: owner module of the driver to register
33e34dc6e   David Brownell   SPI kerneldoc
421
422
   * @sdrv: the driver to register
   * Context: can sleep
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
423
424
   *
   * Return: zero on success, else a negative error code.
33e34dc6e   David Brownell   SPI kerneldoc
425
   */
ca5d24854   Andrew F. Davis   spi: Add THIS_MOD...
426
  int __spi_register_driver(struct module *owner, struct spi_driver *sdrv)
b885244eb   David Brownell   [PATCH] spi: add ...
427
  {
ca5d24854   Andrew F. Davis   spi: Add THIS_MOD...
428
  	sdrv->driver.owner = owner;
b885244eb   David Brownell   [PATCH] spi: add ...
429
  	sdrv->driver.bus = &spi_bus_type;
ddbed6d02   Uwe Kleine-König   spi: fix resource...
430
431
  	sdrv->driver.probe = spi_drv_probe;
  	sdrv->driver.remove = spi_drv_remove;
b885244eb   David Brownell   [PATCH] spi: add ...
432
433
434
435
  	if (sdrv->shutdown)
  		sdrv->driver.shutdown = spi_drv_shutdown;
  	return driver_register(&sdrv->driver);
  }
ca5d24854   Andrew F. Davis   spi: Add THIS_MOD...
436
  EXPORT_SYMBOL_GPL(__spi_register_driver);
b885244eb   David Brownell   [PATCH] spi: add ...
437

8ae12a0d8   David Brownell   [PATCH] spi: simp...
438
439
440
  /*-------------------------------------------------------------------------*/
  
  /* SPI devices should normally not be created by SPI device drivers; that
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
441
   * would make them board-specific.  Similarly with SPI controller drivers.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
442
443
444
445
446
447
   * Device registration normally goes into like arch/.../mach.../board-YYY.c
   * with other readonly (flashable) information about mainboard devices.
   */
  
  struct boardinfo {
  	struct list_head	list;
2b9603a0d   Feng Tang   spi: enable spi_b...
448
  	struct spi_board_info	board_info;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
449
450
451
  };
  
  static LIST_HEAD(board_list);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
452
  static LIST_HEAD(spi_controller_list);
2b9603a0d   Feng Tang   spi: enable spi_b...
453
454
  
  /*
be73e323a   Andy Shevchenko   spi: Fix spelling...
455
   * Used to protect add/del operation for board_info list and
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
456
   * spi_controller list, and their matching process
9a9a047a3   Suniel Mahesh   spi: Kernel codin...
457
   * also used to protect object of type struct idr
2b9603a0d   Feng Tang   spi: enable spi_b...
458
   */
940408289   Matthias Kaehlcke   use mutex instead...
459
  static DEFINE_MUTEX(board_lock);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
460

ddf75be47   Lukas Wunner   spi: Prevent addi...
461
462
463
464
465
  /*
   * Prevents addition of devices with same chip select and
   * addition of devices below an unregistering controller.
   */
  static DEFINE_MUTEX(spi_add_lock);
dc87c98e8   Grant Likely   spi: split up spi...
466
467
  /**
   * spi_alloc_device - Allocate a new SPI device
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
468
   * @ctlr: Controller to which device is connected
dc87c98e8   Grant Likely   spi: split up spi...
469
470
471
472
473
474
475
476
   * Context: can sleep
   *
   * Allows a driver to allocate and initialize a spi_device without
   * registering it immediately.  This allows a driver to directly
   * fill the spi_device with device parameters before calling
   * spi_add_device() on it.
   *
   * Caller is responsible to call spi_add_device() on the returned
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
477
   * spi_device structure to add it to the SPI controller.  If the caller
dc87c98e8   Grant Likely   spi: split up spi...
478
479
480
   * needs to discard the spi_device without adding it, then it should
   * call spi_dev_put() on it.
   *
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
481
   * Return: a pointer to the new device, or NULL.
dc87c98e8   Grant Likely   spi: split up spi...
482
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
483
  struct spi_device *spi_alloc_device(struct spi_controller *ctlr)
dc87c98e8   Grant Likely   spi: split up spi...
484
485
  {
  	struct spi_device	*spi;
dc87c98e8   Grant Likely   spi: split up spi...
486

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
487
  	if (!spi_controller_get(ctlr))
dc87c98e8   Grant Likely   spi: split up spi...
488
  		return NULL;
5fe5f05e2   Jingoo Han   spi: Fix checkpat...
489
  	spi = kzalloc(sizeof(*spi), GFP_KERNEL);
dc87c98e8   Grant Likely   spi: split up spi...
490
  	if (!spi) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
491
  		spi_controller_put(ctlr);
dc87c98e8   Grant Likely   spi: split up spi...
492
493
  		return NULL;
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
494
495
  	spi->master = spi->controller = ctlr;
  	spi->dev.parent = &ctlr->dev;
dc87c98e8   Grant Likely   spi: split up spi...
496
497
  	spi->dev.bus = &spi_bus_type;
  	spi->dev.release = spidev_release;
446411e18   Andreas Larsson   spi: Initialize c...
498
  	spi->cs_gpio = -ENOENT;
ea2357861   John Garry   spi: Allow SPI co...
499
  	spi->mode = ctlr->buswidth_override_bits;
eca2ebc7e   Martin Sperl   spi: expose spi_m...
500
501
  
  	spin_lock_init(&spi->statistics.lock);
dc87c98e8   Grant Likely   spi: split up spi...
502
503
504
505
  	device_initialize(&spi->dev);
  	return spi;
  }
  EXPORT_SYMBOL_GPL(spi_alloc_device);
e13ac47be   Jarkko Nikula   spi: Use stable d...
506
507
508
509
510
511
512
513
  static void spi_dev_set_name(struct spi_device *spi)
  {
  	struct acpi_device *adev = ACPI_COMPANION(&spi->dev);
  
  	if (adev) {
  		dev_set_name(&spi->dev, "spi-%s", acpi_dev_name(adev));
  		return;
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
514
  	dev_set_name(&spi->dev, "%s.%u", dev_name(&spi->controller->dev),
e13ac47be   Jarkko Nikula   spi: Use stable d...
515
516
  		     spi->chip_select);
  }
b6fb8d3a1   Mika Westerberg   spi: Check confli...
517
518
519
520
  static int spi_dev_check(struct device *dev, void *data)
  {
  	struct spi_device *spi = to_spi_device(dev);
  	struct spi_device *new_spi = data;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
521
  	if (spi->controller == new_spi->controller &&
b6fb8d3a1   Mika Westerberg   spi: Check confli...
522
523
524
525
  	    spi->chip_select == new_spi->chip_select)
  		return -EBUSY;
  	return 0;
  }
dc87c98e8   Grant Likely   spi: split up spi...
526
527
528
529
530
531
532
  /**
   * spi_add_device - Add spi_device allocated with spi_alloc_device
   * @spi: spi_device to register
   *
   * Companion function to spi_alloc_device.  Devices allocated with
   * spi_alloc_device can be added onto the spi bus with this function.
   *
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
533
   * Return: 0 on success; negative errno on failure
dc87c98e8   Grant Likely   spi: split up spi...
534
535
536
   */
  int spi_add_device(struct spi_device *spi)
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
537
538
  	struct spi_controller *ctlr = spi->controller;
  	struct device *dev = ctlr->dev.parent;
dc87c98e8   Grant Likely   spi: split up spi...
539
540
541
  	int status;
  
  	/* Chipselects are numbered 0..max; validate. */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
542
543
544
545
  	if (spi->chip_select >= ctlr->num_chipselect) {
  		dev_err(dev, "cs%d >= max %d
  ", spi->chip_select,
  			ctlr->num_chipselect);
dc87c98e8   Grant Likely   spi: split up spi...
546
547
548
549
  		return -EINVAL;
  	}
  
  	/* Set the bus ID string */
e13ac47be   Jarkko Nikula   spi: Use stable d...
550
  	spi_dev_set_name(spi);
e48880e02   David Brownell   spi: bugfix spi_a...
551
552
553
554
555
556
  
  	/* We need to make sure there's no other device with this
  	 * chipselect **BEFORE** we call setup(), else we'll trash
  	 * its configuration.  Lock against concurrent add() calls.
  	 */
  	mutex_lock(&spi_add_lock);
b6fb8d3a1   Mika Westerberg   spi: Check confli...
557
558
  	status = bus_for_each_dev(&spi_bus_type, NULL, spi, spi_dev_check);
  	if (status) {
e48880e02   David Brownell   spi: bugfix spi_a...
559
560
561
  		dev_err(dev, "chipselect %d already in use
  ",
  				spi->chip_select);
e48880e02   David Brownell   spi: bugfix spi_a...
562
563
  		goto done;
  	}
ddf75be47   Lukas Wunner   spi: Prevent addi...
564
565
566
567
568
569
  	/* Controller may unregister concurrently */
  	if (IS_ENABLED(CONFIG_SPI_DYNAMIC) &&
  	    !device_is_registered(&ctlr->dev)) {
  		status = -ENODEV;
  		goto done;
  	}
f3186dd87   Linus Walleij   spi: Optionally u...
570
571
572
573
  	/* Descriptors take precedence */
  	if (ctlr->cs_gpiods)
  		spi->cs_gpiod = ctlr->cs_gpiods[spi->chip_select];
  	else if (ctlr->cs_gpios)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
574
  		spi->cs_gpio = ctlr->cs_gpios[spi->chip_select];
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
575

e48880e02   David Brownell   spi: bugfix spi_a...
576
577
578
579
  	/* Drivers may modify this initial i/o setup, but will
  	 * normally rely on the device being setup.  Devices
  	 * using SPI_CS_HIGH can't coexist well otherwise...
  	 */
7d0771970   David Brownell   spi: move common ...
580
  	status = spi_setup(spi);
dc87c98e8   Grant Likely   spi: split up spi...
581
  	if (status < 0) {
eb288a1f4   Linus Walleij   spi: fixed odd st...
582
583
584
  		dev_err(dev, "can't setup %s, status %d
  ",
  				dev_name(&spi->dev), status);
e48880e02   David Brownell   spi: bugfix spi_a...
585
  		goto done;
dc87c98e8   Grant Likely   spi: split up spi...
586
  	}
e48880e02   David Brownell   spi: bugfix spi_a...
587
  	/* Device may be bound to an active driver when this returns */
dc87c98e8   Grant Likely   spi: split up spi...
588
  	status = device_add(&spi->dev);
e48880e02   David Brownell   spi: bugfix spi_a...
589
  	if (status < 0)
eb288a1f4   Linus Walleij   spi: fixed odd st...
590
591
592
  		dev_err(dev, "can't add %s, status %d
  ",
  				dev_name(&spi->dev), status);
e48880e02   David Brownell   spi: bugfix spi_a...
593
  	else
35f74fcab   Kay Sievers   spi: struct devic...
594
595
  		dev_dbg(dev, "registered child %s
  ", dev_name(&spi->dev));
dc87c98e8   Grant Likely   spi: split up spi...
596

e48880e02   David Brownell   spi: bugfix spi_a...
597
598
599
  done:
  	mutex_unlock(&spi_add_lock);
  	return status;
dc87c98e8   Grant Likely   spi: split up spi...
600
601
  }
  EXPORT_SYMBOL_GPL(spi_add_device);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
602

33e34dc6e   David Brownell   SPI kerneldoc
603
604
  /**
   * spi_new_device - instantiate one new SPI device
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
605
   * @ctlr: Controller to which device is connected
33e34dc6e   David Brownell   SPI kerneldoc
606
607
608
609
   * @chip: Describes the SPI device
   * Context: can sleep
   *
   * On typical mainboards, this is purely internal; and it's not needed
8ae12a0d8   David Brownell   [PATCH] spi: simp...
610
611
612
613
   * after board init creates the hard-wired devices.  Some development
   * platforms may not be able to use spi_register_board_info though, and
   * this is exported so that for example a USB or parport based adapter
   * driver could add devices (which it would learn about out-of-band).
082c8cb4e   David Brownell   spi device setup ...
614
   *
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
615
   * Return: the new device, or NULL.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
616
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
617
  struct spi_device *spi_new_device(struct spi_controller *ctlr,
e9d5a4611   Adrian Bunk   [PATCH] drivers/s...
618
  				  struct spi_board_info *chip)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
619
620
  {
  	struct spi_device	*proxy;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
621
  	int			status;
082c8cb4e   David Brownell   spi device setup ...
622
623
624
625
626
627
  	/* NOTE:  caller did any chip->bus_num checks necessary.
  	 *
  	 * Also, unless we change the return value convention to use
  	 * error-or-pointer (not NULL-or-pointer), troubleshootability
  	 * suggests syslogged diagnostics are best here (ugh).
  	 */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
628
  	proxy = spi_alloc_device(ctlr);
dc87c98e8   Grant Likely   spi: split up spi...
629
  	if (!proxy)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
630
  		return NULL;
102eb9756   Grant Likely   spi: make spi_boa...
631
  	WARN_ON(strlen(chip->modalias) >= sizeof(proxy->modalias));
8ae12a0d8   David Brownell   [PATCH] spi: simp...
632
633
  	proxy->chip_select = chip->chip_select;
  	proxy->max_speed_hz = chip->max_speed_hz;
980a01c9b   David Brownell   [PATCH] SPI: infr...
634
  	proxy->mode = chip->mode;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
635
  	proxy->irq = chip->irq;
102eb9756   Grant Likely   spi: make spi_boa...
636
  	strlcpy(proxy->modalias, chip->modalias, sizeof(proxy->modalias));
8ae12a0d8   David Brownell   [PATCH] spi: simp...
637
638
639
  	proxy->dev.platform_data = (void *) chip->platform_data;
  	proxy->controller_data = chip->controller_data;
  	proxy->controller_state = NULL;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
640

826cf175e   Dmitry Torokhov   spi: allow attach...
641
642
643
  	if (chip->properties) {
  		status = device_add_properties(&proxy->dev, chip->properties);
  		if (status) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
644
  			dev_err(&ctlr->dev,
826cf175e   Dmitry Torokhov   spi: allow attach...
645
646
647
648
649
  				"failed to add properties to '%s': %d
  ",
  				chip->modalias, status);
  			goto err_dev_put;
  		}
8ae12a0d8   David Brownell   [PATCH] spi: simp...
650
  	}
826cf175e   Dmitry Torokhov   spi: allow attach...
651
652
653
  	status = spi_add_device(proxy);
  	if (status < 0)
  		goto err_remove_props;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
654
  	return proxy;
826cf175e   Dmitry Torokhov   spi: allow attach...
655
656
657
658
659
660
661
  
  err_remove_props:
  	if (chip->properties)
  		device_remove_properties(&proxy->dev);
  err_dev_put:
  	spi_dev_put(proxy);
  	return NULL;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
662
663
  }
  EXPORT_SYMBOL_GPL(spi_new_device);
3b1884c24   Geert Uytterhoeven   spi: Uninline spi...
664
665
666
667
668
  /**
   * spi_unregister_device - unregister a single SPI device
   * @spi: spi_device to unregister
   *
   * Start making the passed SPI device vanish. Normally this would be handled
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
669
   * by spi_unregister_controller().
3b1884c24   Geert Uytterhoeven   spi: Uninline spi...
670
671
672
   */
  void spi_unregister_device(struct spi_device *spi)
  {
bd6c1644a   Geert Uytterhoeven   spi: Mark instant...
673
674
  	if (!spi)
  		return;
8324147f3   Johan Hovold   spi: fix device-n...
675
  	if (spi->dev.of_node) {
bd6c1644a   Geert Uytterhoeven   spi: Mark instant...
676
  		of_node_clear_flag(spi->dev.of_node, OF_POPULATED);
8324147f3   Johan Hovold   spi: fix device-n...
677
678
  		of_node_put(spi->dev.of_node);
  	}
7f24467f3   Octavian Purdila   spi / ACPI: add s...
679
680
  	if (ACPI_COMPANION(&spi->dev))
  		acpi_device_clear_enumerated(ACPI_COMPANION(&spi->dev));
bd6c1644a   Geert Uytterhoeven   spi: Mark instant...
681
  	device_unregister(&spi->dev);
3b1884c24   Geert Uytterhoeven   spi: Uninline spi...
682
683
  }
  EXPORT_SYMBOL_GPL(spi_unregister_device);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
684
685
  static void spi_match_controller_to_boardinfo(struct spi_controller *ctlr,
  					      struct spi_board_info *bi)
2b9603a0d   Feng Tang   spi: enable spi_b...
686
687
  {
  	struct spi_device *dev;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
688
  	if (ctlr->bus_num != bi->bus_num)
2b9603a0d   Feng Tang   spi: enable spi_b...
689
  		return;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
690
  	dev = spi_new_device(ctlr, bi);
2b9603a0d   Feng Tang   spi: enable spi_b...
691
  	if (!dev)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
692
693
  		dev_err(ctlr->dev.parent, "can't create new device for %s
  ",
2b9603a0d   Feng Tang   spi: enable spi_b...
694
695
  			bi->modalias);
  }
33e34dc6e   David Brownell   SPI kerneldoc
696
697
698
699
700
701
  /**
   * spi_register_board_info - register SPI devices for a given board
   * @info: array of chip descriptors
   * @n: how many descriptors are provided
   * Context: can sleep
   *
8ae12a0d8   David Brownell   [PATCH] spi: simp...
702
703
704
705
706
707
708
709
710
711
712
713
   * Board-specific early init code calls this (probably during arch_initcall)
   * with segments of the SPI device table.  Any device nodes are created later,
   * after the relevant parent SPI controller (bus_num) is defined.  We keep
   * this table of devices forever, so that reloading a controller driver will
   * not make Linux forget about these hard-wired devices.
   *
   * Other code can also call this, e.g. a particular add-on board might provide
   * SPI devices through its expansion connector, so code initializing that board
   * would naturally declare its SPI devices.
   *
   * The board info passed can safely be __initdata ... but be careful of
   * any embedded pointers (platform_data, etc), they're copied as-is.
826cf175e   Dmitry Torokhov   spi: allow attach...
714
   * Device properties are deep-copied though.
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
715
716
   *
   * Return: zero on success, else a negative error code.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
717
   */
fd4a319bc   Grant Likely   spi: Remove HOTPL...
718
  int spi_register_board_info(struct spi_board_info const *info, unsigned n)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
719
  {
2b9603a0d   Feng Tang   spi: enable spi_b...
720
721
  	struct boardinfo *bi;
  	int i;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
722

c7908a37a   Xiubo Li   spi: Fix possible...
723
  	if (!n)
f974cf57b   Dmitry Torokhov   spi: allow regist...
724
  		return 0;
c7908a37a   Xiubo Li   spi: Fix possible...
725

f9bdb7fdd   Markus Elfring   spi: Use kcalloc(...
726
  	bi = kcalloc(n, sizeof(*bi), GFP_KERNEL);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
727
728
  	if (!bi)
  		return -ENOMEM;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
729

2b9603a0d   Feng Tang   spi: enable spi_b...
730
  	for (i = 0; i < n; i++, bi++, info++) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
731
  		struct spi_controller *ctlr;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
732

2b9603a0d   Feng Tang   spi: enable spi_b...
733
  		memcpy(&bi->board_info, info, sizeof(*info));
826cf175e   Dmitry Torokhov   spi: allow attach...
734
735
736
737
738
739
  		if (info->properties) {
  			bi->board_info.properties =
  					property_entries_dup(info->properties);
  			if (IS_ERR(bi->board_info.properties))
  				return PTR_ERR(bi->board_info.properties);
  		}
2b9603a0d   Feng Tang   spi: enable spi_b...
740
741
  		mutex_lock(&board_lock);
  		list_add_tail(&bi->list, &board_list);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
742
743
744
  		list_for_each_entry(ctlr, &spi_controller_list, list)
  			spi_match_controller_to_boardinfo(ctlr,
  							  &bi->board_info);
2b9603a0d   Feng Tang   spi: enable spi_b...
745
  		mutex_unlock(&board_lock);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
746
  	}
2b9603a0d   Feng Tang   spi: enable spi_b...
747
748
  
  	return 0;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
749
750
751
  }
  
  /*-------------------------------------------------------------------------*/
b158935f7   Mark Brown   spi: Provide comm...
752
753
  static void spi_set_cs(struct spi_device *spi, bool enable)
  {
25093bdeb   Alexandru Ardelean   spi: implement SW...
754
  	bool enable1 = enable;
d40f0b6f2   Douglas Anderson   spi: Avoid settin...
755
756
757
758
759
760
761
762
763
764
  	/*
  	 * Avoid calling into the driver (or doing delays) if the chip select
  	 * isn't actually changing from the last time this was called.
  	 */
  	if ((spi->controller->last_cs_enable == enable) &&
  	    (spi->controller->last_cs_mode_high == (spi->mode & SPI_CS_HIGH)))
  		return;
  
  	spi->controller->last_cs_enable = enable;
  	spi->controller->last_cs_mode_high = spi->mode & SPI_CS_HIGH;
25093bdeb   Alexandru Ardelean   spi: implement SW...
765
766
767
768
769
770
  	if (!spi->controller->set_cs_timing) {
  		if (enable1)
  			spi_delay_exec(&spi->controller->cs_setup, NULL);
  		else
  			spi_delay_exec(&spi->controller->cs_hold, NULL);
  	}
b158935f7   Mark Brown   spi: Provide comm...
771
772
  	if (spi->mode & SPI_CS_HIGH)
  		enable = !enable;
f3186dd87   Linus Walleij   spi: Optionally u...
773
  	if (spi->cs_gpiod || gpio_is_valid(spi->cs_gpio)) {
f3186dd87   Linus Walleij   spi: Optionally u...
774
775
  		if (!(spi->mode & SPI_NO_CS)) {
  			if (spi->cs_gpiod)
766c6b63a   Sven Van Asbroeck   spi: fix client d...
776
  				/* polarity handled by gpiolib */
28f7604f4   Felix Fietkau   spi: use gpio[d]_...
777
  				gpiod_set_value_cansleep(spi->cs_gpiod,
766c6b63a   Sven Van Asbroeck   spi: fix client d...
778
  							 enable1);
f3186dd87   Linus Walleij   spi: Optionally u...
779
  			else
766c6b63a   Sven Van Asbroeck   spi: fix client d...
780
781
782
783
  				/*
  				 * invert the enable line, as active low is
  				 * default for SPI.
  				 */
28f7604f4   Felix Fietkau   spi: use gpio[d]_...
784
  				gpio_set_value_cansleep(spi->cs_gpio, !enable);
f3186dd87   Linus Walleij   spi: Optionally u...
785
  		}
8eee6b9dd   Thor Thayer   spi: Add Flag to ...
786
  		/* Some SPI masters need both GPIO CS & slave_select */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
787
788
789
790
791
  		if ((spi->controller->flags & SPI_MASTER_GPIO_SS) &&
  		    spi->controller->set_cs)
  			spi->controller->set_cs(spi, !enable);
  	} else if (spi->controller->set_cs) {
  		spi->controller->set_cs(spi, !enable);
8eee6b9dd   Thor Thayer   spi: Add Flag to ...
792
  	}
25093bdeb   Alexandru Ardelean   spi: implement SW...
793
794
795
796
797
  
  	if (!spi->controller->set_cs_timing) {
  		if (!enable1)
  			spi_delay_exec(&spi->controller->cs_inactive, NULL);
  	}
b158935f7   Mark Brown   spi: Provide comm...
798
  }
2de440f59   Geert Uytterhoeven   spi: core: Protec...
799
  #ifdef CONFIG_HAS_DMA
46336966b   Boris Brezillon   spi: Expose spi_{...
800
801
802
  int spi_map_buf(struct spi_controller *ctlr, struct device *dev,
  		struct sg_table *sgt, void *buf, size_t len,
  		enum dma_data_direction dir)
6ad45a27c   Mark Brown   spi: Make core DM...
803
804
  {
  	const bool vmalloced_buf = is_vmalloc_addr(buf);
df88e91bb   Andy Shevchenko   spi: respect the ...
805
  	unsigned int max_seg_size = dma_get_max_seg_size(dev);
b1b8153cf   Vignesh R   spi: Add support ...
806
807
808
809
810
811
812
  #ifdef CONFIG_HIGHMEM
  	const bool kmap_buf = ((unsigned long)buf >= PKMAP_BASE &&
  				(unsigned long)buf < (PKMAP_BASE +
  					(LAST_PKMAP * PAGE_SIZE)));
  #else
  	const bool kmap_buf = false;
  #endif
65598c13f   Andrew Gabbasov   spi: Fix per-page...
813
814
  	int desc_len;
  	int sgs;
6ad45a27c   Mark Brown   spi: Make core DM...
815
  	struct page *vm_page;
8dd4a0163   Juan Gutierrez   spi: use sg_next ...
816
  	struct scatterlist *sg;
6ad45a27c   Mark Brown   spi: Make core DM...
817
818
819
  	void *sg_buf;
  	size_t min;
  	int i, ret;
b1b8153cf   Vignesh R   spi: Add support ...
820
  	if (vmalloced_buf || kmap_buf) {
df88e91bb   Andy Shevchenko   spi: respect the ...
821
  		desc_len = min_t(int, max_seg_size, PAGE_SIZE);
65598c13f   Andrew Gabbasov   spi: Fix per-page...
822
  		sgs = DIV_ROUND_UP(len + offset_in_page(buf), desc_len);
0569a88f3   Vignesh R   spi: return error...
823
  	} else if (virt_addr_valid(buf)) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
824
  		desc_len = min_t(int, max_seg_size, ctlr->max_dma_len);
65598c13f   Andrew Gabbasov   spi: Fix per-page...
825
  		sgs = DIV_ROUND_UP(len, desc_len);
0569a88f3   Vignesh R   spi: return error...
826
827
  	} else {
  		return -EINVAL;
65598c13f   Andrew Gabbasov   spi: Fix per-page...
828
  	}
6ad45a27c   Mark Brown   spi: Make core DM...
829
830
831
  	ret = sg_alloc_table(sgt, sgs, GFP_KERNEL);
  	if (ret != 0)
  		return ret;
8dd4a0163   Juan Gutierrez   spi: use sg_next ...
832
  	sg = &sgt->sgl[0];
6ad45a27c   Mark Brown   spi: Make core DM...
833
  	for (i = 0; i < sgs; i++) {
6ad45a27c   Mark Brown   spi: Make core DM...
834

b1b8153cf   Vignesh R   spi: Add support ...
835
  		if (vmalloced_buf || kmap_buf) {
ce99319a1   Maxime Chevallier   spi: Fix scatterl...
836
837
838
839
840
841
842
843
  			/*
  			 * Next scatterlist entry size is the minimum between
  			 * the desc_len and the remaining buffer length that
  			 * fits in a page.
  			 */
  			min = min_t(size_t, desc_len,
  				    min_t(size_t, len,
  					  PAGE_SIZE - offset_in_page(buf)));
b1b8153cf   Vignesh R   spi: Add support ...
844
845
846
847
  			if (vmalloced_buf)
  				vm_page = vmalloc_to_page(buf);
  			else
  				vm_page = kmap_to_page(buf);
6ad45a27c   Mark Brown   spi: Make core DM...
848
849
850
851
  			if (!vm_page) {
  				sg_free_table(sgt);
  				return -ENOMEM;
  			}
8dd4a0163   Juan Gutierrez   spi: use sg_next ...
852
  			sg_set_page(sg, vm_page,
c1aefbdd0   Charles Keepax   spi: Fix mapping ...
853
  				    min, offset_in_page(buf));
6ad45a27c   Mark Brown   spi: Make core DM...
854
  		} else {
65598c13f   Andrew Gabbasov   spi: Fix per-page...
855
  			min = min_t(size_t, len, desc_len);
6ad45a27c   Mark Brown   spi: Make core DM...
856
  			sg_buf = buf;
8dd4a0163   Juan Gutierrez   spi: use sg_next ...
857
  			sg_set_buf(sg, sg_buf, min);
6ad45a27c   Mark Brown   spi: Make core DM...
858
  		}
6ad45a27c   Mark Brown   spi: Make core DM...
859
860
  		buf += min;
  		len -= min;
8dd4a0163   Juan Gutierrez   spi: use sg_next ...
861
  		sg = sg_next(sg);
6ad45a27c   Mark Brown   spi: Make core DM...
862
863
864
  	}
  
  	ret = dma_map_sg(dev, sgt->sgl, sgt->nents, dir);
89e4b66a2   Geert Uytterhoeven   spi: core: Fix ch...
865
866
  	if (!ret)
  		ret = -ENOMEM;
6ad45a27c   Mark Brown   spi: Make core DM...
867
868
869
870
871
872
873
874
875
  	if (ret < 0) {
  		sg_free_table(sgt);
  		return ret;
  	}
  
  	sgt->nents = ret;
  
  	return 0;
  }
46336966b   Boris Brezillon   spi: Expose spi_{...
876
877
  void spi_unmap_buf(struct spi_controller *ctlr, struct device *dev,
  		   struct sg_table *sgt, enum dma_data_direction dir)
6ad45a27c   Mark Brown   spi: Make core DM...
878
879
880
881
882
883
  {
  	if (sgt->orig_nents) {
  		dma_unmap_sg(dev, sgt->sgl, sgt->orig_nents, dir);
  		sg_free_table(sgt);
  	}
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
884
  static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
99adef310   Mark Brown   spi: Provide core...
885
  {
99adef310   Mark Brown   spi: Provide core...
886
887
  	struct device *tx_dev, *rx_dev;
  	struct spi_transfer *xfer;
6ad45a27c   Mark Brown   spi: Make core DM...
888
  	int ret;
3a2eba9bd   Mark Brown   spi: Provide core...
889

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
890
  	if (!ctlr->can_dma)
99adef310   Mark Brown   spi: Provide core...
891
  		return 0;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
892
893
  	if (ctlr->dma_tx)
  		tx_dev = ctlr->dma_tx->device->dev;
c37f45b5f   Leilk Liu   spi: support spi ...
894
  	else
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
895
  		tx_dev = ctlr->dev.parent;
c37f45b5f   Leilk Liu   spi: support spi ...
896

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
897
898
  	if (ctlr->dma_rx)
  		rx_dev = ctlr->dma_rx->device->dev;
c37f45b5f   Leilk Liu   spi: support spi ...
899
  	else
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
900
  		rx_dev = ctlr->dev.parent;
99adef310   Mark Brown   spi: Provide core...
901
902
  
  	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
903
  		if (!ctlr->can_dma(ctlr, msg->spi, xfer))
99adef310   Mark Brown   spi: Provide core...
904
905
906
  			continue;
  
  		if (xfer->tx_buf != NULL) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
907
  			ret = spi_map_buf(ctlr, tx_dev, &xfer->tx_sg,
6ad45a27c   Mark Brown   spi: Make core DM...
908
909
910
911
  					  (void *)xfer->tx_buf, xfer->len,
  					  DMA_TO_DEVICE);
  			if (ret != 0)
  				return ret;
99adef310   Mark Brown   spi: Provide core...
912
913
914
  		}
  
  		if (xfer->rx_buf != NULL) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
915
  			ret = spi_map_buf(ctlr, rx_dev, &xfer->rx_sg,
6ad45a27c   Mark Brown   spi: Make core DM...
916
917
918
  					  xfer->rx_buf, xfer->len,
  					  DMA_FROM_DEVICE);
  			if (ret != 0) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
919
  				spi_unmap_buf(ctlr, tx_dev, &xfer->tx_sg,
6ad45a27c   Mark Brown   spi: Make core DM...
920
921
  					      DMA_TO_DEVICE);
  				return ret;
99adef310   Mark Brown   spi: Provide core...
922
923
924
  			}
  		}
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
925
  	ctlr->cur_msg_mapped = true;
99adef310   Mark Brown   spi: Provide core...
926
927
928
  
  	return 0;
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
929
  static int __spi_unmap_msg(struct spi_controller *ctlr, struct spi_message *msg)
99adef310   Mark Brown   spi: Provide core...
930
931
932
  {
  	struct spi_transfer *xfer;
  	struct device *tx_dev, *rx_dev;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
933
  	if (!ctlr->cur_msg_mapped || !ctlr->can_dma)
99adef310   Mark Brown   spi: Provide core...
934
  		return 0;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
935
936
  	if (ctlr->dma_tx)
  		tx_dev = ctlr->dma_tx->device->dev;
c37f45b5f   Leilk Liu   spi: support spi ...
937
  	else
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
938
  		tx_dev = ctlr->dev.parent;
c37f45b5f   Leilk Liu   spi: support spi ...
939

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
940
941
  	if (ctlr->dma_rx)
  		rx_dev = ctlr->dma_rx->device->dev;
c37f45b5f   Leilk Liu   spi: support spi ...
942
  	else
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
943
  		rx_dev = ctlr->dev.parent;
99adef310   Mark Brown   spi: Provide core...
944
945
  
  	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
946
  		if (!ctlr->can_dma(ctlr, msg->spi, xfer))
99adef310   Mark Brown   spi: Provide core...
947
  			continue;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
948
949
  		spi_unmap_buf(ctlr, rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE);
  		spi_unmap_buf(ctlr, tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);
99adef310   Mark Brown   spi: Provide core...
950
  	}
809b1b04d   Robin Gong   spi: introduce fa...
951
  	ctlr->cur_msg_mapped = false;
99adef310   Mark Brown   spi: Provide core...
952
953
  	return 0;
  }
2de440f59   Geert Uytterhoeven   spi: core: Protec...
954
  #else /* !CONFIG_HAS_DMA */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
955
  static inline int __spi_map_msg(struct spi_controller *ctlr,
2de440f59   Geert Uytterhoeven   spi: core: Protec...
956
957
958
959
  				struct spi_message *msg)
  {
  	return 0;
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
960
  static inline int __spi_unmap_msg(struct spi_controller *ctlr,
4b786458e   Martin Sperl   spi: restore rx/t...
961
  				  struct spi_message *msg)
2de440f59   Geert Uytterhoeven   spi: core: Protec...
962
963
964
965
  {
  	return 0;
  }
  #endif /* !CONFIG_HAS_DMA */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
966
  static inline int spi_unmap_msg(struct spi_controller *ctlr,
4b786458e   Martin Sperl   spi: restore rx/t...
967
968
969
970
971
972
973
974
975
  				struct spi_message *msg)
  {
  	struct spi_transfer *xfer;
  
  	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
  		/*
  		 * Restore the original value of tx_buf or rx_buf if they are
  		 * NULL.
  		 */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
976
  		if (xfer->tx_buf == ctlr->dummy_tx)
4b786458e   Martin Sperl   spi: restore rx/t...
977
  			xfer->tx_buf = NULL;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
978
  		if (xfer->rx_buf == ctlr->dummy_rx)
4b786458e   Martin Sperl   spi: restore rx/t...
979
980
  			xfer->rx_buf = NULL;
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
981
  	return __spi_unmap_msg(ctlr, msg);
4b786458e   Martin Sperl   spi: restore rx/t...
982
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
983
  static int spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
2de440f59   Geert Uytterhoeven   spi: core: Protec...
984
985
986
987
  {
  	struct spi_transfer *xfer;
  	void *tmp;
  	unsigned int max_tx, max_rx;
aee67fe87   dillon min   spi: flags 'SPI_C...
988
989
  	if ((ctlr->flags & (SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX))
  		&& !(msg->spi->mode & SPI_3WIRE)) {
2de440f59   Geert Uytterhoeven   spi: core: Protec...
990
991
992
993
  		max_tx = 0;
  		max_rx = 0;
  
  		list_for_each_entry(xfer, &msg->transfers, transfer_list) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
994
  			if ((ctlr->flags & SPI_CONTROLLER_MUST_TX) &&
2de440f59   Geert Uytterhoeven   spi: core: Protec...
995
996
  			    !xfer->tx_buf)
  				max_tx = max(xfer->len, max_tx);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
997
  			if ((ctlr->flags & SPI_CONTROLLER_MUST_RX) &&
2de440f59   Geert Uytterhoeven   spi: core: Protec...
998
999
1000
1001
1002
  			    !xfer->rx_buf)
  				max_rx = max(xfer->len, max_rx);
  		}
  
  		if (max_tx) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1003
  			tmp = krealloc(ctlr->dummy_tx, max_tx,
2de440f59   Geert Uytterhoeven   spi: core: Protec...
1004
1005
1006
  				       GFP_KERNEL | GFP_DMA);
  			if (!tmp)
  				return -ENOMEM;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1007
  			ctlr->dummy_tx = tmp;
2de440f59   Geert Uytterhoeven   spi: core: Protec...
1008
1009
1010
1011
  			memset(tmp, 0, max_tx);
  		}
  
  		if (max_rx) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1012
  			tmp = krealloc(ctlr->dummy_rx, max_rx,
2de440f59   Geert Uytterhoeven   spi: core: Protec...
1013
1014
1015
  				       GFP_KERNEL | GFP_DMA);
  			if (!tmp)
  				return -ENOMEM;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1016
  			ctlr->dummy_rx = tmp;
2de440f59   Geert Uytterhoeven   spi: core: Protec...
1017
1018
1019
1020
1021
  		}
  
  		if (max_tx || max_rx) {
  			list_for_each_entry(xfer, &msg->transfers,
  					    transfer_list) {
5442dcaa0   Chris Lesiak   spi: Fix zero len...
1022
1023
  				if (!xfer->len)
  					continue;
2de440f59   Geert Uytterhoeven   spi: core: Protec...
1024
  				if (!xfer->tx_buf)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1025
  					xfer->tx_buf = ctlr->dummy_tx;
2de440f59   Geert Uytterhoeven   spi: core: Protec...
1026
  				if (!xfer->rx_buf)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1027
  					xfer->rx_buf = ctlr->dummy_rx;
2de440f59   Geert Uytterhoeven   spi: core: Protec...
1028
1029
1030
  			}
  		}
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1031
  	return __spi_map_msg(ctlr, msg);
2de440f59   Geert Uytterhoeven   spi: core: Protec...
1032
  }
99adef310   Mark Brown   spi: Provide core...
1033

810923f3b   Lubomir Rintel   spi: Deal with sl...
1034
1035
1036
1037
1038
1039
  static int spi_transfer_wait(struct spi_controller *ctlr,
  			     struct spi_message *msg,
  			     struct spi_transfer *xfer)
  {
  	struct spi_statistics *statm = &ctlr->statistics;
  	struct spi_statistics *stats = &msg->spi->statistics;
501e1875d   Xu Yilun   spi: fix the divi...
1040
  	u32 speed_hz = xfer->speed_hz;
49686df5b   Colin Ian King   spi: remove redun...
1041
  	unsigned long long ms;
810923f3b   Lubomir Rintel   spi: Deal with sl...
1042
1043
1044
1045
1046
1047
1048
1049
  
  	if (spi_controller_is_slave(ctlr)) {
  		if (wait_for_completion_interruptible(&ctlr->xfer_completion)) {
  			dev_dbg(&msg->spi->dev, "SPI transfer interrupted
  ");
  			return -EINTR;
  		}
  	} else {
501e1875d   Xu Yilun   spi: fix the divi...
1050
1051
  		if (!speed_hz)
  			speed_hz = 100000;
810923f3b   Lubomir Rintel   spi: Deal with sl...
1052
  		ms = 8LL * 1000LL * xfer->len;
501e1875d   Xu Yilun   spi: fix the divi...
1053
  		do_div(ms, speed_hz);
810923f3b   Lubomir Rintel   spi: Deal with sl...
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
  		ms += ms + 200; /* some tolerance */
  
  		if (ms > UINT_MAX)
  			ms = UINT_MAX;
  
  		ms = wait_for_completion_timeout(&ctlr->xfer_completion,
  						 msecs_to_jiffies(ms));
  
  		if (ms == 0) {
  			SPI_STATISTICS_INCREMENT_FIELD(statm, timedout);
  			SPI_STATISTICS_INCREMENT_FIELD(stats, timedout);
  			dev_err(&msg->spi->dev,
  				"SPI transfer timed out
  ");
  			return -ETIMEDOUT;
  		}
  	}
  
  	return 0;
  }
0ff2de8bb   Martin Sperl   spi: core: allow ...
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
  static void _spi_transfer_delay_ns(u32 ns)
  {
  	if (!ns)
  		return;
  	if (ns <= 1000) {
  		ndelay(ns);
  	} else {
  		u32 us = DIV_ROUND_UP(ns, 1000);
  
  		if (us <= 10)
  			udelay(us);
  		else
  			usleep_range(us, us + DIV_ROUND_UP(us, 10));
  	}
  }
3984d39b0   Alexandru Ardelean   spi: spi-fsl-espi...
1089
  int spi_delay_to_ns(struct spi_delay *_delay, struct spi_transfer *xfer)
0ff2de8bb   Martin Sperl   spi: core: allow ...
1090
  {
b2c98153f   Alexandru Ardelean   spi: introduce sp...
1091
1092
  	u32 delay = _delay->value;
  	u32 unit = _delay->unit;
d5864e5be   Martin Sperl   spi: core: allow ...
1093
  	u32 hz;
0ff2de8bb   Martin Sperl   spi: core: allow ...
1094

b2c98153f   Alexandru Ardelean   spi: introduce sp...
1095
1096
  	if (!delay)
  		return 0;
0ff2de8bb   Martin Sperl   spi: core: allow ...
1097
1098
1099
  
  	switch (unit) {
  	case SPI_DELAY_UNIT_USECS:
b2c98153f   Alexandru Ardelean   spi: introduce sp...
1100
  		delay *= 1000;
0ff2de8bb   Martin Sperl   spi: core: allow ...
1101
1102
1103
  		break;
  	case SPI_DELAY_UNIT_NSECS: /* nothing to do here */
  		break;
d5864e5be   Martin Sperl   spi: core: allow ...
1104
  	case SPI_DELAY_UNIT_SCK:
b2c98153f   Alexandru Ardelean   spi: introduce sp...
1105
1106
1107
  		/* clock cycles need to be obtained from spi_transfer */
  		if (!xfer)
  			return -EINVAL;
d5864e5be   Martin Sperl   spi: core: allow ...
1108
1109
1110
1111
  		/* if there is no effective speed know, then approximate
  		 * by underestimating with half the requested hz
  		 */
  		hz = xfer->effective_speed_hz ?: xfer->speed_hz / 2;
b2c98153f   Alexandru Ardelean   spi: introduce sp...
1112
1113
  		if (!hz)
  			return -EINVAL;
d5864e5be   Martin Sperl   spi: core: allow ...
1114
1115
  		delay *= DIV_ROUND_UP(1000000000, hz);
  		break;
0ff2de8bb   Martin Sperl   spi: core: allow ...
1116
  	default:
b2c98153f   Alexandru Ardelean   spi: introduce sp...
1117
1118
1119
1120
1121
  		return -EINVAL;
  	}
  
  	return delay;
  }
3984d39b0   Alexandru Ardelean   spi: spi-fsl-espi...
1122
  EXPORT_SYMBOL_GPL(spi_delay_to_ns);
b2c98153f   Alexandru Ardelean   spi: introduce sp...
1123
1124
1125
1126
  
  int spi_delay_exec(struct spi_delay *_delay, struct spi_transfer *xfer)
  {
  	int delay;
8fede89f8   Mark Brown   spi: Make spi_del...
1127
  	might_sleep();
b2c98153f   Alexandru Ardelean   spi: introduce sp...
1128
1129
  	if (!_delay)
  		return -EINVAL;
3984d39b0   Alexandru Ardelean   spi: spi-fsl-espi...
1130
  	delay = spi_delay_to_ns(_delay, xfer);
b2c98153f   Alexandru Ardelean   spi: introduce sp...
1131
1132
1133
1134
1135
1136
1137
1138
  	if (delay < 0)
  		return delay;
  
  	_spi_transfer_delay_ns(delay);
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(spi_delay_exec);
0ff2de8bb   Martin Sperl   spi: core: allow ...
1139
1140
1141
  static void _spi_transfer_cs_change_delay(struct spi_message *msg,
  					  struct spi_transfer *xfer)
  {
329f0dac4   Alexandru Ardelean   spi: make `cs_cha...
1142
1143
1144
  	u32 delay = xfer->cs_change_delay.value;
  	u32 unit = xfer->cs_change_delay.unit;
  	int ret;
0ff2de8bb   Martin Sperl   spi: core: allow ...
1145
1146
  
  	/* return early on "fast" mode - for everything but USECS */
6b3f236a9   Alexandru Ardelean   spi: move `cs_cha...
1147
1148
1149
  	if (!delay) {
  		if (unit == SPI_DELAY_UNIT_USECS)
  			_spi_transfer_delay_ns(10000);
0ff2de8bb   Martin Sperl   spi: core: allow ...
1150
  		return;
6b3f236a9   Alexandru Ardelean   spi: move `cs_cha...
1151
  	}
0ff2de8bb   Martin Sperl   spi: core: allow ...
1152

329f0dac4   Alexandru Ardelean   spi: make `cs_cha...
1153
1154
  	ret = spi_delay_exec(&xfer->cs_change_delay, xfer);
  	if (ret) {
0ff2de8bb   Martin Sperl   spi: core: allow ...
1155
1156
1157
  		dev_err_once(&msg->spi->dev,
  			     "Use of unsupported delay unit %i, using default of 10us
  ",
329f0dac4   Alexandru Ardelean   spi: make `cs_cha...
1158
1159
  			     unit);
  		_spi_transfer_delay_ns(10000);
0ff2de8bb   Martin Sperl   spi: core: allow ...
1160
  	}
0ff2de8bb   Martin Sperl   spi: core: allow ...
1161
  }
b158935f7   Mark Brown   spi: Provide comm...
1162
1163
1164
1165
  /*
   * spi_transfer_one_message - Default implementation of transfer_one_message()
   *
   * This is a standard implementation of transfer_one_message() for
8ba811a7d   Moritz Fischer   spi: Fix simple t...
1166
   * drivers which implement a transfer_one() operation.  It provides
b158935f7   Mark Brown   spi: Provide comm...
1167
1168
   * standard handling of delays and chip select management.
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1169
  static int spi_transfer_one_message(struct spi_controller *ctlr,
b158935f7   Mark Brown   spi: Provide comm...
1170
1171
1172
  				    struct spi_message *msg)
  {
  	struct spi_transfer *xfer;
b158935f7   Mark Brown   spi: Provide comm...
1173
1174
  	bool keep_cs = false;
  	int ret = 0;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1175
  	struct spi_statistics *statm = &ctlr->statistics;
eca2ebc7e   Martin Sperl   spi: expose spi_m...
1176
  	struct spi_statistics *stats = &msg->spi->statistics;
b158935f7   Mark Brown   spi: Provide comm...
1177
1178
  
  	spi_set_cs(msg->spi, true);
eca2ebc7e   Martin Sperl   spi: expose spi_m...
1179
1180
  	SPI_STATISTICS_INCREMENT_FIELD(statm, messages);
  	SPI_STATISTICS_INCREMENT_FIELD(stats, messages);
b158935f7   Mark Brown   spi: Provide comm...
1181
1182
  	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
  		trace_spi_transfer_start(msg, xfer);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1183
1184
  		spi_statistics_add_transfer_stats(statm, xfer, ctlr);
  		spi_statistics_add_transfer_stats(stats, xfer, ctlr);
eca2ebc7e   Martin Sperl   spi: expose spi_m...
1185

b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1186
1187
1188
1189
  		if (!ctlr->ptp_sts_supported) {
  			xfer->ptp_sts_word_pre = 0;
  			ptp_read_system_prets(xfer->ptp_sts);
  		}
38ec10f60   Mark Brown   spi: Only call tr...
1190
  		if (xfer->tx_buf || xfer->rx_buf) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1191
  			reinit_completion(&ctlr->xfer_completion);
b158935f7   Mark Brown   spi: Provide comm...
1192

809b1b04d   Robin Gong   spi: introduce fa...
1193
  fallback_pio:
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1194
  			ret = ctlr->transfer_one(ctlr, msg->spi, xfer);
38ec10f60   Mark Brown   spi: Only call tr...
1195
  			if (ret < 0) {
809b1b04d   Robin Gong   spi: introduce fa...
1196
1197
1198
1199
1200
1201
1202
  				if (ctlr->cur_msg_mapped &&
  				   (xfer->error & SPI_TRANS_FAIL_NO_START)) {
  					__spi_unmap_msg(ctlr, msg);
  					ctlr->fallback = true;
  					xfer->error &= ~SPI_TRANS_FAIL_NO_START;
  					goto fallback_pio;
  				}
eca2ebc7e   Martin Sperl   spi: expose spi_m...
1203
1204
1205
1206
  				SPI_STATISTICS_INCREMENT_FIELD(statm,
  							       errors);
  				SPI_STATISTICS_INCREMENT_FIELD(stats,
  							       errors);
38ec10f60   Mark Brown   spi: Only call tr...
1207
1208
1209
1210
1211
  				dev_err(&msg->spi->dev,
  					"SPI transfer failed: %d
  ", ret);
  				goto out;
  			}
b158935f7   Mark Brown   spi: Provide comm...
1212

d57e79601   Mark Brown   spi: Fix core tra...
1213
1214
1215
1216
1217
  			if (ret > 0) {
  				ret = spi_transfer_wait(ctlr, msg, xfer);
  				if (ret < 0)
  					msg->status = ret;
  			}
38ec10f60   Mark Brown   spi: Only call tr...
1218
1219
1220
1221
1222
1223
  		} else {
  			if (xfer->len)
  				dev_err(&msg->spi->dev,
  					"Bufferless transfer has length %u
  ",
  					xfer->len);
13a427988   Axel Lin   spi: core: Fix tr...
1224
  		}
b158935f7   Mark Brown   spi: Provide comm...
1225

b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1226
1227
1228
1229
  		if (!ctlr->ptp_sts_supported) {
  			ptp_read_system_postts(xfer->ptp_sts);
  			xfer->ptp_sts_word_post = xfer->len;
  		}
b158935f7   Mark Brown   spi: Provide comm...
1230
1231
1232
1233
  		trace_spi_transfer_stop(msg, xfer);
  
  		if (msg->status != -EINPROGRESS)
  			goto out;
bebcfd272   Alexandru Ardelean   spi: introduce `d...
1234
  		spi_transfer_delay_exec(xfer);
b158935f7   Mark Brown   spi: Provide comm...
1235
1236
1237
1238
1239
1240
  
  		if (xfer->cs_change) {
  			if (list_is_last(&xfer->transfer_list,
  					 &msg->transfers)) {
  				keep_cs = true;
  			} else {
0b73aa63c   Mark Brown   spi: Fix handling...
1241
  				spi_set_cs(msg->spi, false);
0ff2de8bb   Martin Sperl   spi: core: allow ...
1242
  				_spi_transfer_cs_change_delay(msg, xfer);
0b73aa63c   Mark Brown   spi: Fix handling...
1243
  				spi_set_cs(msg->spi, true);
b158935f7   Mark Brown   spi: Provide comm...
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
  			}
  		}
  
  		msg->actual_length += xfer->len;
  	}
  
  out:
  	if (ret != 0 || !keep_cs)
  		spi_set_cs(msg->spi, false);
  
  	if (msg->status == -EINPROGRESS)
  		msg->status = ret;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1256
1257
  	if (msg->status && ctlr->handle_err)
  		ctlr->handle_err(ctlr, msg);
b716c4ffc   Andy Shevchenko   spi: introduce ma...
1258

0ed56252c   Mark Brown   spi: Fix Raspberr...
1259
  	spi_finalize_current_message(ctlr);
b158935f7   Mark Brown   spi: Provide comm...
1260
1261
1262
1263
1264
  	return ret;
  }
  
  /**
   * spi_finalize_current_transfer - report completion of a transfer
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1265
   * @ctlr: the controller reporting completion
b158935f7   Mark Brown   spi: Provide comm...
1266
1267
1268
   *
   * Called by SPI drivers using the core transfer_one_message()
   * implementation to notify it that the current interrupt driven
9e8f4882c   Geert Uytterhoeven   spi: Spelling s/f...
1269
   * transfer has finished and the next one may be scheduled.
b158935f7   Mark Brown   spi: Provide comm...
1270
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1271
  void spi_finalize_current_transfer(struct spi_controller *ctlr)
b158935f7   Mark Brown   spi: Provide comm...
1272
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1273
  	complete(&ctlr->xfer_completion);
b158935f7   Mark Brown   spi: Provide comm...
1274
1275
  }
  EXPORT_SYMBOL_GPL(spi_finalize_current_transfer);
e12685972   Mark Brown   spi: Only defer t...
1276
1277
1278
1279
1280
1281
1282
  static void spi_idle_runtime_pm(struct spi_controller *ctlr)
  {
  	if (ctlr->auto_runtime_pm) {
  		pm_runtime_mark_last_busy(ctlr->dev.parent);
  		pm_runtime_put_autosuspend(ctlr->dev.parent);
  	}
  }
ffbbdd213   Linus Walleij   spi: create a mes...
1283
  /**
fc9e0f71f   Mark Brown   spi: Only idle th...
1284
   * __spi_pump_messages - function which processes spi message queue
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1285
   * @ctlr: controller to process queue for
fc9e0f71f   Mark Brown   spi: Only idle th...
1286
   * @in_kthread: true if we are in the context of the message pump thread
ffbbdd213   Linus Walleij   spi: create a mes...
1287
1288
1289
1290
1291
   *
   * This function checks if there is any spi message in the queue that
   * needs processing and if so call out to the driver to initialize hardware
   * and transfer each message.
   *
0461a4149   Mark Brown   spi: Pump transfe...
1292
1293
1294
   * Note that it is called both from the kthread itself and also from
   * inside spi_sync(); the queue extraction handling at the top of the
   * function should deal with this safely.
ffbbdd213   Linus Walleij   spi: create a mes...
1295
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1296
  static void __spi_pump_messages(struct spi_controller *ctlr, bool in_kthread)
ffbbdd213   Linus Walleij   spi: create a mes...
1297
  {
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1298
  	struct spi_transfer *xfer;
d1c44c934   Vladimir Oltean   spi: Use an abbre...
1299
  	struct spi_message *msg;
ffbbdd213   Linus Walleij   spi: create a mes...
1300
  	bool was_busy = false;
d1c44c934   Vladimir Oltean   spi: Use an abbre...
1301
  	unsigned long flags;
ffbbdd213   Linus Walleij   spi: create a mes...
1302
  	int ret;
983aee5d7   Mark Brown   spi: Check to see...
1303
  	/* Lock queue */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1304
  	spin_lock_irqsave(&ctlr->queue_lock, flags);
983aee5d7   Mark Brown   spi: Check to see...
1305
1306
  
  	/* Make sure we are not already running a message */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1307
1308
  	if (ctlr->cur_msg) {
  		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
983aee5d7   Mark Brown   spi: Check to see...
1309
1310
  		return;
  	}
f0125f1a5   Mark Brown   spi: Go back to i...
1311
  	/* If another context is idling the device then defer */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1312
  	if (ctlr->idling) {
60a883d11   Marek Szyprowski   spi: use kthread_...
1313
  		kthread_queue_work(ctlr->kworker, &ctlr->pump_messages);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1314
  		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
0461a4149   Mark Brown   spi: Pump transfe...
1315
1316
  		return;
  	}
983aee5d7   Mark Brown   spi: Check to see...
1317
  	/* Check if the queue is idle */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1318
1319
1320
  	if (list_empty(&ctlr->queue) || !ctlr->running) {
  		if (!ctlr->busy) {
  			spin_unlock_irqrestore(&ctlr->queue_lock, flags);
b0b36b861   Bryan Freed   spi: Unlock a spi...
1321
  			return;
ffbbdd213   Linus Walleij   spi: create a mes...
1322
  		}
fc9e0f71f   Mark Brown   spi: Only idle th...
1323

e12685972   Mark Brown   spi: Only defer t...
1324
  		/* Defer any non-atomic teardown to the thread */
f0125f1a5   Mark Brown   spi: Go back to i...
1325
  		if (!in_kthread) {
e12685972   Mark Brown   spi: Only defer t...
1326
1327
1328
1329
1330
1331
1332
1333
1334
  			if (!ctlr->dummy_rx && !ctlr->dummy_tx &&
  			    !ctlr->unprepare_transfer_hardware) {
  				spi_idle_runtime_pm(ctlr);
  				ctlr->busy = false;
  				trace_spi_controller_idle(ctlr);
  			} else {
  				kthread_queue_work(ctlr->kworker,
  						   &ctlr->pump_messages);
  			}
f0125f1a5   Mark Brown   spi: Go back to i...
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
  			spin_unlock_irqrestore(&ctlr->queue_lock, flags);
  			return;
  		}
  
  		ctlr->busy = false;
  		ctlr->idling = true;
  		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
  
  		kfree(ctlr->dummy_rx);
  		ctlr->dummy_rx = NULL;
  		kfree(ctlr->dummy_tx);
  		ctlr->dummy_tx = NULL;
  		if (ctlr->unprepare_transfer_hardware &&
  		    ctlr->unprepare_transfer_hardware(ctlr))
  			dev_err(&ctlr->dev,
  				"failed to unprepare transfer hardware
  ");
e12685972   Mark Brown   spi: Only defer t...
1352
  		spi_idle_runtime_pm(ctlr);
f0125f1a5   Mark Brown   spi: Go back to i...
1353
1354
1355
1356
  		trace_spi_controller_idle(ctlr);
  
  		spin_lock_irqsave(&ctlr->queue_lock, flags);
  		ctlr->idling = false;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1357
  		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1358
1359
  		return;
  	}
ffbbdd213   Linus Walleij   spi: create a mes...
1360

ffbbdd213   Linus Walleij   spi: create a mes...
1361
  	/* Extract head of queue */
d1c44c934   Vladimir Oltean   spi: Use an abbre...
1362
1363
  	msg = list_first_entry(&ctlr->queue, struct spi_message, queue);
  	ctlr->cur_msg = msg;
ffbbdd213   Linus Walleij   spi: create a mes...
1364

d1c44c934   Vladimir Oltean   spi: Use an abbre...
1365
  	list_del_init(&msg->queue);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1366
  	if (ctlr->busy)
ffbbdd213   Linus Walleij   spi: create a mes...
1367
1368
  		was_busy = true;
  	else
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1369
1370
  		ctlr->busy = true;
  	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1371

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1372
  	mutex_lock(&ctlr->io_mutex);
ef4d96ec4   Mark Brown   spi: Split bus an...
1373

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1374
1375
  	if (!was_busy && ctlr->auto_runtime_pm) {
  		ret = pm_runtime_get_sync(ctlr->dev.parent);
49834de23   Mark Brown   spi: Provide core...
1376
  		if (ret < 0) {
7e48e23a1   Tony Lindgren   spi: Add missing ...
1377
  			pm_runtime_put_noidle(ctlr->dev.parent);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1378
1379
  			dev_err(&ctlr->dev, "Failed to power device: %d
  ",
49834de23   Mark Brown   spi: Provide core...
1380
  				ret);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1381
  			mutex_unlock(&ctlr->io_mutex);
49834de23   Mark Brown   spi: Provide core...
1382
1383
1384
  			return;
  		}
  	}
56ec1978f   Mark Brown   spi: Provide trac...
1385
  	if (!was_busy)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1386
  		trace_spi_controller_busy(ctlr);
56ec1978f   Mark Brown   spi: Provide trac...
1387

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1388
1389
  	if (!was_busy && ctlr->prepare_transfer_hardware) {
  		ret = ctlr->prepare_transfer_hardware(ctlr);
ffbbdd213   Linus Walleij   spi: create a mes...
1390
  		if (ret) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1391
  			dev_err(&ctlr->dev,
f3440d9a0   Super Liu   spi: abort spi_sy...
1392
1393
1394
  				"failed to prepare transfer hardware: %d
  ",
  				ret);
49834de23   Mark Brown   spi: Provide core...
1395

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1396
1397
  			if (ctlr->auto_runtime_pm)
  				pm_runtime_put(ctlr->dev.parent);
f3440d9a0   Super Liu   spi: abort spi_sy...
1398

d1c44c934   Vladimir Oltean   spi: Use an abbre...
1399
  			msg->status = ret;
f3440d9a0   Super Liu   spi: abort spi_sy...
1400
  			spi_finalize_current_message(ctlr);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1401
  			mutex_unlock(&ctlr->io_mutex);
ffbbdd213   Linus Walleij   spi: create a mes...
1402
1403
1404
  			return;
  		}
  	}
d1c44c934   Vladimir Oltean   spi: Use an abbre...
1405
  	trace_spi_message_start(msg);
56ec1978f   Mark Brown   spi: Provide trac...
1406

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1407
  	if (ctlr->prepare_message) {
d1c44c934   Vladimir Oltean   spi: Use an abbre...
1408
  		ret = ctlr->prepare_message(ctlr, msg);
2841a5fc3   Mark Brown   spi: Provide per-...
1409
  		if (ret) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1410
1411
1412
  			dev_err(&ctlr->dev, "failed to prepare message: %d
  ",
  				ret);
d1c44c934   Vladimir Oltean   spi: Use an abbre...
1413
  			msg->status = ret;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1414
  			spi_finalize_current_message(ctlr);
49023d2e4   Jon Hunter   spi: core: Fix de...
1415
  			goto out;
2841a5fc3   Mark Brown   spi: Provide per-...
1416
  		}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1417
  		ctlr->cur_msg_prepared = true;
2841a5fc3   Mark Brown   spi: Provide per-...
1418
  	}
d1c44c934   Vladimir Oltean   spi: Use an abbre...
1419
  	ret = spi_map_msg(ctlr, msg);
99adef310   Mark Brown   spi: Provide core...
1420
  	if (ret) {
d1c44c934   Vladimir Oltean   spi: Use an abbre...
1421
  		msg->status = ret;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1422
  		spi_finalize_current_message(ctlr);
49023d2e4   Jon Hunter   spi: core: Fix de...
1423
  		goto out;
99adef310   Mark Brown   spi: Provide core...
1424
  	}
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1425
1426
1427
1428
1429
1430
  	if (!ctlr->ptp_sts_supported && !ctlr->transfer_one) {
  		list_for_each_entry(xfer, &msg->transfers, transfer_list) {
  			xfer->ptp_sts_word_pre = 0;
  			ptp_read_system_prets(xfer->ptp_sts);
  		}
  	}
d1c44c934   Vladimir Oltean   spi: Use an abbre...
1431
  	ret = ctlr->transfer_one_message(ctlr, msg);
ffbbdd213   Linus Walleij   spi: create a mes...
1432
  	if (ret) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1433
  		dev_err(&ctlr->dev,
1f802f824   Geert Uytterhoeven   spi: Fix crash wi...
1434
1435
  			"failed to transfer one message from queue
  ");
49023d2e4   Jon Hunter   spi: core: Fix de...
1436
  		goto out;
ffbbdd213   Linus Walleij   spi: create a mes...
1437
  	}
49023d2e4   Jon Hunter   spi: core: Fix de...
1438
1439
  
  out:
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1440
  	mutex_unlock(&ctlr->io_mutex);
628269704   Mark Brown   spi: Add cond_res...
1441
1442
  
  	/* Prod the scheduler in case transfer_one() was busy waiting */
49023d2e4   Jon Hunter   spi: core: Fix de...
1443
1444
  	if (!ret)
  		cond_resched();
ffbbdd213   Linus Walleij   spi: create a mes...
1445
  }
fc9e0f71f   Mark Brown   spi: Only idle th...
1446
1447
  /**
   * spi_pump_messages - kthread work function which processes spi message queue
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1448
   * @work: pointer to kthread work struct contained in the controller struct
fc9e0f71f   Mark Brown   spi: Only idle th...
1449
1450
1451
   */
  static void spi_pump_messages(struct kthread_work *work)
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1452
1453
  	struct spi_controller *ctlr =
  		container_of(work, struct spi_controller, pump_messages);
fc9e0f71f   Mark Brown   spi: Only idle th...
1454

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1455
  	__spi_pump_messages(ctlr, true);
fc9e0f71f   Mark Brown   spi: Only idle th...
1456
  }
924b5867e   Douglas Anderson   spi: Allow SPI de...
1457
  /**
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
   * spi_take_timestamp_pre - helper for drivers to collect the beginning of the
   *			    TX timestamp for the requested byte from the SPI
   *			    transfer. The frequency with which this function
   *			    must be called (once per word, once for the whole
   *			    transfer, once per batch of words etc) is arbitrary
   *			    as long as the @tx buffer offset is greater than or
   *			    equal to the requested byte at the time of the
   *			    call. The timestamp is only taken once, at the
   *			    first such call. It is assumed that the driver
   *			    advances its @tx buffer pointer monotonically.
   * @ctlr: Pointer to the spi_controller structure of the driver
   * @xfer: Pointer to the transfer being timestamped
862dd2a94   Vladimir Oltean   spi: Don't look a...
1470
   * @progress: How many words (not bytes) have been transferred so far
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1471
1472
1473
1474
1475
1476
1477
1478
1479
   * @irqs_off: If true, will disable IRQs and preemption for the duration of the
   *	      transfer, for less jitter in time measurement. Only compatible
   *	      with PIO drivers. If true, must follow up with
   *	      spi_take_timestamp_post or otherwise system will crash.
   *	      WARNING: for fully predictable results, the CPU frequency must
   *	      also be under control (governor).
   */
  void spi_take_timestamp_pre(struct spi_controller *ctlr,
  			    struct spi_transfer *xfer,
862dd2a94   Vladimir Oltean   spi: Don't look a...
1480
  			    size_t progress, bool irqs_off)
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1481
  {
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1482
1483
  	if (!xfer->ptp_sts)
  		return;
6a726824a   Vladimir Oltean   spi: Do spi_take_...
1484
  	if (xfer->timestamped)
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1485
  		return;
6a726824a   Vladimir Oltean   spi: Do spi_take_...
1486
  	if (progress > xfer->ptp_sts_word_pre)
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1487
1488
1489
  		return;
  
  	/* Capture the resolution of the timestamp */
862dd2a94   Vladimir Oltean   spi: Don't look a...
1490
  	xfer->ptp_sts_word_pre = progress;
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1491

b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
  	if (irqs_off) {
  		local_irq_save(ctlr->irq_flags);
  		preempt_disable();
  	}
  
  	ptp_read_system_prets(xfer->ptp_sts);
  }
  EXPORT_SYMBOL_GPL(spi_take_timestamp_pre);
  
  /**
   * spi_take_timestamp_post - helper for drivers to collect the end of the
   *			     TX timestamp for the requested byte from the SPI
   *			     transfer. Can be called with an arbitrary
   *			     frequency: only the first call where @tx exceeds
   *			     or is equal to the requested word will be
   *			     timestamped.
   * @ctlr: Pointer to the spi_controller structure of the driver
   * @xfer: Pointer to the transfer being timestamped
862dd2a94   Vladimir Oltean   spi: Don't look a...
1510
   * @progress: How many words (not bytes) have been transferred so far
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1511
1512
1513
1514
   * @irqs_off: If true, will re-enable IRQs and preemption for the local CPU.
   */
  void spi_take_timestamp_post(struct spi_controller *ctlr,
  			     struct spi_transfer *xfer,
862dd2a94   Vladimir Oltean   spi: Don't look a...
1515
  			     size_t progress, bool irqs_off)
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1516
  {
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1517
1518
  	if (!xfer->ptp_sts)
  		return;
6a726824a   Vladimir Oltean   spi: Do spi_take_...
1519
  	if (xfer->timestamped)
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1520
  		return;
862dd2a94   Vladimir Oltean   spi: Don't look a...
1521
  	if (progress < xfer->ptp_sts_word_post)
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
  		return;
  
  	ptp_read_system_postts(xfer->ptp_sts);
  
  	if (irqs_off) {
  		local_irq_restore(ctlr->irq_flags);
  		preempt_enable();
  	}
  
  	/* Capture the resolution of the timestamp */
862dd2a94   Vladimir Oltean   spi: Don't look a...
1532
  	xfer->ptp_sts_word_post = progress;
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1533

6a726824a   Vladimir Oltean   spi: Do spi_take_...
1534
  	xfer->timestamped = true;
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1535
1536
1537
1538
  }
  EXPORT_SYMBOL_GPL(spi_take_timestamp_post);
  
  /**
924b5867e   Douglas Anderson   spi: Allow SPI de...
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
   * spi_set_thread_rt - set the controller to pump at realtime priority
   * @ctlr: controller to boost priority of
   *
   * This can be called because the controller requested realtime priority
   * (by setting the ->rt value before calling spi_register_controller()) or
   * because a device on the bus said that its transfers needed realtime
   * priority.
   *
   * NOTE: at the moment if any device on a bus says it needs realtime then
   * the thread will be at realtime priority for all transfers on that
   * controller.  If this eventually becomes a problem we may see if we can
   * find a way to boost the priority only temporarily during relevant
   * transfers.
   */
  static void spi_set_thread_rt(struct spi_controller *ctlr)
ffbbdd213   Linus Walleij   spi: create a mes...
1554
  {
924b5867e   Douglas Anderson   spi: Allow SPI de...
1555
1556
1557
  	dev_info(&ctlr->dev,
  		"will run message pump with realtime priority
  ");
6d2b84a4e   Linus Torvalds   Merge tag 'sched-...
1558
  	sched_set_fifo(ctlr->kworker->task);
924b5867e   Douglas Anderson   spi: Allow SPI de...
1559
1560
1561
1562
  }
  
  static int spi_init_queue(struct spi_controller *ctlr)
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1563
1564
  	ctlr->running = false;
  	ctlr->busy = false;
ffbbdd213   Linus Walleij   spi: create a mes...
1565

60a883d11   Marek Szyprowski   spi: use kthread_...
1566
1567
1568
1569
1570
  	ctlr->kworker = kthread_create_worker(0, dev_name(&ctlr->dev));
  	if (IS_ERR(ctlr->kworker)) {
  		dev_err(&ctlr->dev, "failed to create message pump kworker
  ");
  		return PTR_ERR(ctlr->kworker);
ffbbdd213   Linus Walleij   spi: create a mes...
1571
  	}
60a883d11   Marek Szyprowski   spi: use kthread_...
1572

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1573
  	kthread_init_work(&ctlr->pump_messages, spi_pump_messages);
f0125f1a5   Mark Brown   spi: Go back to i...
1574

ffbbdd213   Linus Walleij   spi: create a mes...
1575
  	/*
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1576
  	 * Controller config will indicate if this controller should run the
ffbbdd213   Linus Walleij   spi: create a mes...
1577
1578
1579
1580
1581
  	 * message pump with high (realtime) priority to reduce the transfer
  	 * latency on the bus by minimising the delay between a transfer
  	 * request and the scheduling of the message pump thread. Without this
  	 * setting the message pump thread will remain at default priority.
  	 */
924b5867e   Douglas Anderson   spi: Allow SPI de...
1582
1583
  	if (ctlr->rt)
  		spi_set_thread_rt(ctlr);
ffbbdd213   Linus Walleij   spi: create a mes...
1584
1585
1586
1587
1588
1589
1590
  
  	return 0;
  }
  
  /**
   * spi_get_next_queued_message() - called by driver to check for queued
   * messages
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1591
   * @ctlr: the controller to check for queued messages
ffbbdd213   Linus Walleij   spi: create a mes...
1592
1593
1594
   *
   * If there are more messages in the queue, the next message is returned from
   * this call.
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
1595
1596
   *
   * Return: the next message in the queue, else NULL if the queue is empty.
ffbbdd213   Linus Walleij   spi: create a mes...
1597
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1598
  struct spi_message *spi_get_next_queued_message(struct spi_controller *ctlr)
ffbbdd213   Linus Walleij   spi: create a mes...
1599
1600
1601
1602
1603
  {
  	struct spi_message *next;
  	unsigned long flags;
  
  	/* get a pointer to the next message, if any */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1604
1605
  	spin_lock_irqsave(&ctlr->queue_lock, flags);
  	next = list_first_entry_or_null(&ctlr->queue, struct spi_message,
1cfd97f93   Axel Lin   spi: core: Use li...
1606
  					queue);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1607
  	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1608
1609
1610
1611
1612
1613
1614
  
  	return next;
  }
  EXPORT_SYMBOL_GPL(spi_get_next_queued_message);
  
  /**
   * spi_finalize_current_message() - the current message is complete
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1615
   * @ctlr: the controller to return the message to
ffbbdd213   Linus Walleij   spi: create a mes...
1616
1617
1618
1619
   *
   * Called by the driver to notify the core that the message in the front of the
   * queue is complete and can be removed from the queue.
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1620
  void spi_finalize_current_message(struct spi_controller *ctlr)
ffbbdd213   Linus Walleij   spi: create a mes...
1621
  {
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1622
  	struct spi_transfer *xfer;
ffbbdd213   Linus Walleij   spi: create a mes...
1623
1624
  	struct spi_message *mesg;
  	unsigned long flags;
2841a5fc3   Mark Brown   spi: Provide per-...
1625
  	int ret;
ffbbdd213   Linus Walleij   spi: create a mes...
1626

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1627
1628
1629
  	spin_lock_irqsave(&ctlr->queue_lock, flags);
  	mesg = ctlr->cur_msg;
  	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1630

b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
1631
1632
1633
1634
1635
1636
  	if (!ctlr->ptp_sts_supported && !ctlr->transfer_one) {
  		list_for_each_entry(xfer, &mesg->transfers, transfer_list) {
  			ptp_read_system_postts(xfer->ptp_sts);
  			xfer->ptp_sts_word_post = xfer->len;
  		}
  	}
6a726824a   Vladimir Oltean   spi: Do spi_take_...
1637
1638
1639
  	if (unlikely(ctlr->ptp_sts_supported))
  		list_for_each_entry(xfer, &mesg->transfers, transfer_list)
  			WARN_ON_ONCE(xfer->ptp_sts && !xfer->timestamped);
f971a2074   Vladimir Oltean   spi: Catch improp...
1640

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1641
  	spi_unmap_msg(ctlr, mesg);
99adef310   Mark Brown   spi: Provide core...
1642

b59a7ca15   Gustav Wiklander   spi: Fix memory l...
1643
1644
1645
1646
1647
1648
  	/* In the prepare_messages callback the spi bus has the opportunity to
  	 * split a transfer to smaller chunks.
  	 * Release splited transfers here since spi_map_msg is done on the
  	 * splited transfers.
  	 */
  	spi_res_release(ctlr, mesg);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1649
1650
  	if (ctlr->cur_msg_prepared && ctlr->unprepare_message) {
  		ret = ctlr->unprepare_message(ctlr, mesg);
2841a5fc3   Mark Brown   spi: Provide per-...
1651
  		if (ret) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1652
1653
1654
  			dev_err(&ctlr->dev, "failed to unprepare message: %d
  ",
  				ret);
2841a5fc3   Mark Brown   spi: Provide per-...
1655
1656
  		}
  	}
391949b6f   Uwe Kleine-König   spi: trigger trac...
1657

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1658
1659
1660
  	spin_lock_irqsave(&ctlr->queue_lock, flags);
  	ctlr->cur_msg = NULL;
  	ctlr->cur_msg_prepared = false;
809b1b04d   Robin Gong   spi: introduce fa...
1661
  	ctlr->fallback = false;
60a883d11   Marek Szyprowski   spi: use kthread_...
1662
  	kthread_queue_work(ctlr->kworker, &ctlr->pump_messages);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1663
  	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
8e76ef88f   Martin Sperl   spi: fix race fre...
1664
1665
  
  	trace_spi_message_done(mesg);
2841a5fc3   Mark Brown   spi: Provide per-...
1666

ffbbdd213   Linus Walleij   spi: create a mes...
1667
1668
1669
1670
1671
  	mesg->state = NULL;
  	if (mesg->complete)
  		mesg->complete(mesg->context);
  }
  EXPORT_SYMBOL_GPL(spi_finalize_current_message);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1672
  static int spi_start_queue(struct spi_controller *ctlr)
ffbbdd213   Linus Walleij   spi: create a mes...
1673
1674
  {
  	unsigned long flags;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1675
  	spin_lock_irqsave(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1676

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1677
1678
  	if (ctlr->running || ctlr->busy) {
  		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1679
1680
  		return -EBUSY;
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1681
1682
1683
  	ctlr->running = true;
  	ctlr->cur_msg = NULL;
  	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1684

60a883d11   Marek Szyprowski   spi: use kthread_...
1685
  	kthread_queue_work(ctlr->kworker, &ctlr->pump_messages);
ffbbdd213   Linus Walleij   spi: create a mes...
1686
1687
1688
  
  	return 0;
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1689
  static int spi_stop_queue(struct spi_controller *ctlr)
ffbbdd213   Linus Walleij   spi: create a mes...
1690
1691
1692
1693
  {
  	unsigned long flags;
  	unsigned limit = 500;
  	int ret = 0;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1694
  	spin_lock_irqsave(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1695
1696
1697
  
  	/*
  	 * This is a bit lame, but is optimized for the common execution path.
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1698
  	 * A wait_queue on the ctlr->busy could be used, but then the common
ffbbdd213   Linus Walleij   spi: create a mes...
1699
1700
1701
  	 * execution path (pump_messages) would be required to call wake_up or
  	 * friends on every SPI message. Do this instead.
  	 */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1702
1703
  	while ((!list_empty(&ctlr->queue) || ctlr->busy) && limit--) {
  		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
f97b26b05   Axel Lin   spi: core: Replac...
1704
  		usleep_range(10000, 11000);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1705
  		spin_lock_irqsave(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1706
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1707
  	if (!list_empty(&ctlr->queue) || ctlr->busy)
ffbbdd213   Linus Walleij   spi: create a mes...
1708
1709
  		ret = -EBUSY;
  	else
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1710
  		ctlr->running = false;
ffbbdd213   Linus Walleij   spi: create a mes...
1711

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1712
  	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1713
1714
  
  	if (ret) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1715
1716
  		dev_warn(&ctlr->dev, "could not stop message queue
  ");
ffbbdd213   Linus Walleij   spi: create a mes...
1717
1718
1719
1720
  		return ret;
  	}
  	return ret;
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1721
  static int spi_destroy_queue(struct spi_controller *ctlr)
ffbbdd213   Linus Walleij   spi: create a mes...
1722
1723
  {
  	int ret;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1724
  	ret = spi_stop_queue(ctlr);
ffbbdd213   Linus Walleij   spi: create a mes...
1725
1726
  
  	/*
3989144f8   Petr Mladek   kthread: kthread ...
1727
  	 * kthread_flush_worker will block until all work is done.
ffbbdd213   Linus Walleij   spi: create a mes...
1728
1729
1730
1731
1732
  	 * If the reason that stop_queue timed out is that the work will never
  	 * finish, then it does no good to call flush/stop thread, so
  	 * return anyway.
  	 */
  	if (ret) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1733
1734
  		dev_err(&ctlr->dev, "problem destroying queue
  ");
ffbbdd213   Linus Walleij   spi: create a mes...
1735
1736
  		return ret;
  	}
60a883d11   Marek Szyprowski   spi: use kthread_...
1737
  	kthread_destroy_worker(ctlr->kworker);
ffbbdd213   Linus Walleij   spi: create a mes...
1738
1739
1740
  
  	return 0;
  }
0461a4149   Mark Brown   spi: Pump transfe...
1741
1742
1743
  static int __spi_queued_transfer(struct spi_device *spi,
  				 struct spi_message *msg,
  				 bool need_pump)
ffbbdd213   Linus Walleij   spi: create a mes...
1744
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1745
  	struct spi_controller *ctlr = spi->controller;
ffbbdd213   Linus Walleij   spi: create a mes...
1746
  	unsigned long flags;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1747
  	spin_lock_irqsave(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1748

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1749
1750
  	if (!ctlr->running) {
  		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1751
1752
1753
1754
  		return -ESHUTDOWN;
  	}
  	msg->actual_length = 0;
  	msg->status = -EINPROGRESS;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1755
  	list_add_tail(&msg->queue, &ctlr->queue);
f0125f1a5   Mark Brown   spi: Go back to i...
1756
  	if (!ctlr->busy && need_pump)
60a883d11   Marek Szyprowski   spi: use kthread_...
1757
  		kthread_queue_work(ctlr->kworker, &ctlr->pump_messages);
ffbbdd213   Linus Walleij   spi: create a mes...
1758

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1759
  	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
ffbbdd213   Linus Walleij   spi: create a mes...
1760
1761
  	return 0;
  }
0461a4149   Mark Brown   spi: Pump transfe...
1762
1763
1764
1765
  /**
   * spi_queued_transfer - transfer function for queued transfers
   * @spi: spi device which is requesting transfer
   * @msg: spi message which is to handled is queued to driver queue
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
1766
1767
   *
   * Return: zero on success, else a negative error code.
0461a4149   Mark Brown   spi: Pump transfe...
1768
1769
1770
1771
1772
   */
  static int spi_queued_transfer(struct spi_device *spi, struct spi_message *msg)
  {
  	return __spi_queued_transfer(spi, msg, true);
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1773
  static int spi_controller_initialize_queue(struct spi_controller *ctlr)
ffbbdd213   Linus Walleij   spi: create a mes...
1774
1775
  {
  	int ret;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1776
1777
1778
  	ctlr->transfer = spi_queued_transfer;
  	if (!ctlr->transfer_one_message)
  		ctlr->transfer_one_message = spi_transfer_one_message;
ffbbdd213   Linus Walleij   spi: create a mes...
1779
1780
  
  	/* Initialize and start queue */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1781
  	ret = spi_init_queue(ctlr);
ffbbdd213   Linus Walleij   spi: create a mes...
1782
  	if (ret) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1783
1784
  		dev_err(&ctlr->dev, "problem initializing queue
  ");
ffbbdd213   Linus Walleij   spi: create a mes...
1785
1786
  		goto err_init_queue;
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1787
1788
  	ctlr->queued = true;
  	ret = spi_start_queue(ctlr);
ffbbdd213   Linus Walleij   spi: create a mes...
1789
  	if (ret) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1790
1791
  		dev_err(&ctlr->dev, "problem starting queue
  ");
ffbbdd213   Linus Walleij   spi: create a mes...
1792
1793
1794
1795
1796
1797
  		goto err_start_queue;
  	}
  
  	return 0;
  
  err_start_queue:
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1798
  	spi_destroy_queue(ctlr);
c3676d5ce   Mark Brown   spi: core: Don't ...
1799
  err_init_queue:
ffbbdd213   Linus Walleij   spi: create a mes...
1800
1801
  	return ret;
  }
988f259b4   Boris Brezillon   spi: Add an helpe...
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
  /**
   * spi_flush_queue - Send all pending messages in the queue from the callers'
   *		     context
   * @ctlr: controller to process queue for
   *
   * This should be used when one wants to ensure all pending messages have been
   * sent before doing something. Is used by the spi-mem code to make sure SPI
   * memory operations do not preempt regular SPI transfers that have been queued
   * before the spi-mem operation.
   */
  void spi_flush_queue(struct spi_controller *ctlr)
  {
  	if (ctlr->transfer == spi_queued_transfer)
  		__spi_pump_messages(ctlr, false);
  }
ffbbdd213   Linus Walleij   spi: create a mes...
1817
  /*-------------------------------------------------------------------------*/
7cb943615   Andreas Larsson   spi/sparc: Allow ...
1818
  #if defined(CONFIG_OF)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1819
  static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi,
c2e51ac3d   Geert Uytterhoeven   spi: core: Extrac...
1820
  			   struct device_node *nc)
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1821
  {
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1822
  	u32 value;
c2e51ac3d   Geert Uytterhoeven   spi: core: Extrac...
1823
  	int rc;
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1824

aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1825
  	/* Mode (clock phase/polarity/etc.) */
e0bcb680b   Sergei Shtylyov   spi: use of_prope...
1826
  	if (of_property_read_bool(nc, "spi-cpha"))
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1827
  		spi->mode |= SPI_CPHA;
e0bcb680b   Sergei Shtylyov   spi: use of_prope...
1828
  	if (of_property_read_bool(nc, "spi-cpol"))
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1829
  		spi->mode |= SPI_CPOL;
e0bcb680b   Sergei Shtylyov   spi: use of_prope...
1830
  	if (of_property_read_bool(nc, "spi-3wire"))
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1831
  		spi->mode |= SPI_3WIRE;
e0bcb680b   Sergei Shtylyov   spi: use of_prope...
1832
  	if (of_property_read_bool(nc, "spi-lsb-first"))
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1833
  		spi->mode |= SPI_LSB_FIRST;
3e5ec1db8   Gregory CLEMENT   spi: Fix SPI_CS_H...
1834
  	if (of_property_read_bool(nc, "spi-cs-high"))
f3186dd87   Linus Walleij   spi: Optionally u...
1835
  		spi->mode |= SPI_CS_HIGH;
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
  	/* Device DUAL/QUAD mode */
  	if (!of_property_read_u32(nc, "spi-tx-bus-width", &value)) {
  		switch (value) {
  		case 1:
  			break;
  		case 2:
  			spi->mode |= SPI_TX_DUAL;
  			break;
  		case 4:
  			spi->mode |= SPI_TX_QUAD;
  			break;
6b03061f8   Yogesh Narayan Gaur   spi: add support ...
1847
1848
1849
  		case 8:
  			spi->mode |= SPI_TX_OCTAL;
  			break;
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1850
  		default:
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1851
  			dev_warn(&ctlr->dev,
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
  				"spi-tx-bus-width %d not supported
  ",
  				value);
  			break;
  		}
  	}
  
  	if (!of_property_read_u32(nc, "spi-rx-bus-width", &value)) {
  		switch (value) {
  		case 1:
  			break;
  		case 2:
  			spi->mode |= SPI_RX_DUAL;
  			break;
  		case 4:
  			spi->mode |= SPI_RX_QUAD;
  			break;
6b03061f8   Yogesh Narayan Gaur   spi: add support ...
1869
1870
1871
  		case 8:
  			spi->mode |= SPI_RX_OCTAL;
  			break;
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1872
  		default:
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1873
  			dev_warn(&ctlr->dev,
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1874
1875
1876
1877
1878
1879
  				"spi-rx-bus-width %d not supported
  ",
  				value);
  			break;
  		}
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1880
  	if (spi_controller_is_slave(ctlr)) {
194276b07   Rob Herring   spi: Use of_node_...
1881
  		if (!of_node_name_eq(nc, "slave")) {
25c56c88a   Rob Herring   spi: Convert to u...
1882
1883
1884
  			dev_err(&ctlr->dev, "%pOF is not called 'slave'
  ",
  				nc);
6c364062b   Geert Uytterhoeven   spi: core: Add su...
1885
1886
1887
1888
1889
1890
1891
1892
  			return -EINVAL;
  		}
  		return 0;
  	}
  
  	/* Device address */
  	rc = of_property_read_u32(nc, "reg", &value);
  	if (rc) {
25c56c88a   Rob Herring   spi: Convert to u...
1893
1894
1895
  		dev_err(&ctlr->dev, "%pOF has no valid 'reg' property (%d)
  ",
  			nc, rc);
6c364062b   Geert Uytterhoeven   spi: core: Add su...
1896
1897
1898
  		return rc;
  	}
  	spi->chip_select = value;
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1899
  	/* Device speed */
671c3bf50   Chuanhong Guo   spi: make spi-max...
1900
1901
  	if (!of_property_read_u32(nc, "spi-max-frequency", &value))
  		spi->max_speed_hz = value;
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1902

c2e51ac3d   Geert Uytterhoeven   spi: core: Extrac...
1903
1904
1905
1906
  	return 0;
  }
  
  static struct spi_device *
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1907
  of_register_spi_device(struct spi_controller *ctlr, struct device_node *nc)
c2e51ac3d   Geert Uytterhoeven   spi: core: Extrac...
1908
1909
1910
1911
1912
  {
  	struct spi_device *spi;
  	int rc;
  
  	/* Alloc an spi_device */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1913
  	spi = spi_alloc_device(ctlr);
c2e51ac3d   Geert Uytterhoeven   spi: core: Extrac...
1914
  	if (!spi) {
25c56c88a   Rob Herring   spi: Convert to u...
1915
1916
  		dev_err(&ctlr->dev, "spi_device alloc error for %pOF
  ", nc);
c2e51ac3d   Geert Uytterhoeven   spi: core: Extrac...
1917
1918
1919
1920
1921
1922
1923
1924
  		rc = -ENOMEM;
  		goto err_out;
  	}
  
  	/* Select device driver */
  	rc = of_modalias_node(nc, spi->modalias,
  				sizeof(spi->modalias));
  	if (rc < 0) {
25c56c88a   Rob Herring   spi: Convert to u...
1925
1926
  		dev_err(&ctlr->dev, "cannot find modalias for %pOF
  ", nc);
c2e51ac3d   Geert Uytterhoeven   spi: core: Extrac...
1927
1928
  		goto err_out;
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1929
  	rc = of_spi_parse_dt(ctlr, spi, nc);
c2e51ac3d   Geert Uytterhoeven   spi: core: Extrac...
1930
1931
  	if (rc)
  		goto err_out;
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1932
1933
1934
  	/* Store a pointer to the node in the device structure */
  	of_node_get(nc);
  	spi->dev.of_node = nc;
f93a33edc   Daniel Mentz   ANDROID: spi: of:...
1935
  	spi->dev.fwnode = of_fwnode_handle(nc);
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1936
1937
  
  	/* Register the new device */
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1938
1939
  	rc = spi_add_device(spi);
  	if (rc) {
25c56c88a   Rob Herring   spi: Convert to u...
1940
1941
  		dev_err(&ctlr->dev, "spi_device register error %pOF
  ", nc);
8324147f3   Johan Hovold   spi: fix device-n...
1942
  		goto err_of_node_put;
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1943
1944
1945
  	}
  
  	return spi;
8324147f3   Johan Hovold   spi: fix device-n...
1946
1947
  err_of_node_put:
  	of_node_put(nc);
aff5e3f89   Pantelis Antoniou   spi/of: Create ne...
1948
1949
1950
1951
  err_out:
  	spi_dev_put(spi);
  	return ERR_PTR(rc);
  }
d57a4282d   Grant Likely   spi/devicetree: M...
1952
1953
  /**
   * of_register_spi_devices() - Register child devices onto the SPI bus
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1954
   * @ctlr:	Pointer to spi_controller device
d57a4282d   Grant Likely   spi/devicetree: M...
1955
   *
6c364062b   Geert Uytterhoeven   spi: core: Add su...
1956
1957
   * Registers an spi_device for each child node of controller node which
   * represents a valid SPI slave.
d57a4282d   Grant Likely   spi/devicetree: M...
1958
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1959
  static void of_register_spi_devices(struct spi_controller *ctlr)
d57a4282d   Grant Likely   spi/devicetree: M...
1960
1961
1962
  {
  	struct spi_device *spi;
  	struct device_node *nc;
d57a4282d   Grant Likely   spi/devicetree: M...
1963

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1964
  	if (!ctlr->dev.of_node)
d57a4282d   Grant Likely   spi/devicetree: M...
1965
  		return;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1966
  	for_each_available_child_of_node(ctlr->dev.of_node, nc) {
bd6c1644a   Geert Uytterhoeven   spi: Mark instant...
1967
1968
  		if (of_node_test_and_set_flag(nc, OF_POPULATED))
  			continue;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1969
  		spi = of_register_spi_device(ctlr, nc);
e0af98a7e   Ralf Ramsauer   spi: mark device ...
1970
  		if (IS_ERR(spi)) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1971
  			dev_warn(&ctlr->dev,
25c56c88a   Rob Herring   spi: Convert to u...
1972
1973
  				 "Failed to create SPI device for %pOF
  ", nc);
e0af98a7e   Ralf Ramsauer   spi: mark device ...
1974
1975
  			of_node_clear_flag(nc, OF_POPULATED);
  		}
d57a4282d   Grant Likely   spi/devicetree: M...
1976
1977
1978
  	}
  }
  #else
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
1979
  static void of_register_spi_devices(struct spi_controller *ctlr) { }
d57a4282d   Grant Likely   spi/devicetree: M...
1980
  #endif
64bee4d28   Mika Westerberg   spi / ACPI: add A...
1981
  #ifdef CONFIG_ACPI
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
  struct acpi_spi_lookup {
  	struct spi_controller 	*ctlr;
  	u32			max_speed_hz;
  	u32			mode;
  	int			irq;
  	u8			bits_per_word;
  	u8			chip_select;
  };
  
  static void acpi_spi_parse_apple_properties(struct acpi_device *dev,
  					    struct acpi_spi_lookup *lookup)
8a2e487e6   Lukas Wunner   spi: Use Apple de...
1993
  {
8a2e487e6   Lukas Wunner   spi: Use Apple de...
1994
1995
1996
1997
1998
1999
2000
  	const union acpi_object *obj;
  
  	if (!x86_apple_machine)
  		return;
  
  	if (!acpi_dev_get_property(dev, "spiSclkPeriod", ACPI_TYPE_BUFFER, &obj)
  	    && obj->buffer.length >= 4)
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2001
  		lookup->max_speed_hz  = NSEC_PER_SEC / *(u32 *)obj->buffer.pointer;
8a2e487e6   Lukas Wunner   spi: Use Apple de...
2002
2003
2004
  
  	if (!acpi_dev_get_property(dev, "spiWordSize", ACPI_TYPE_BUFFER, &obj)
  	    && obj->buffer.length == 8)
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2005
  		lookup->bits_per_word = *(u64 *)obj->buffer.pointer;
8a2e487e6   Lukas Wunner   spi: Use Apple de...
2006
2007
2008
  
  	if (!acpi_dev_get_property(dev, "spiBitOrder", ACPI_TYPE_BUFFER, &obj)
  	    && obj->buffer.length == 8 && !*(u64 *)obj->buffer.pointer)
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2009
  		lookup->mode |= SPI_LSB_FIRST;
8a2e487e6   Lukas Wunner   spi: Use Apple de...
2010
2011
2012
  
  	if (!acpi_dev_get_property(dev, "spiSPO", ACPI_TYPE_BUFFER, &obj)
  	    && obj->buffer.length == 8 &&  *(u64 *)obj->buffer.pointer)
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2013
  		lookup->mode |= SPI_CPOL;
8a2e487e6   Lukas Wunner   spi: Use Apple de...
2014
2015
2016
  
  	if (!acpi_dev_get_property(dev, "spiSPH", ACPI_TYPE_BUFFER, &obj)
  	    && obj->buffer.length == 8 &&  *(u64 *)obj->buffer.pointer)
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2017
  		lookup->mode |= SPI_CPHA;
8a2e487e6   Lukas Wunner   spi: Use Apple de...
2018
  }
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2019
2020
  static int acpi_spi_add_resource(struct acpi_resource *ares, void *data)
  {
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2021
2022
  	struct acpi_spi_lookup *lookup = data;
  	struct spi_controller *ctlr = lookup->ctlr;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2023
2024
2025
  
  	if (ares->type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {
  		struct acpi_resource_spi_serialbus *sb;
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2026
2027
  		acpi_handle parent_handle;
  		acpi_status status;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2028
2029
2030
  
  		sb = &ares->data.spi_serial_bus;
  		if (sb->type == ACPI_RESOURCE_SERIAL_TYPE_SPI) {
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2031
2032
2033
2034
  
  			status = acpi_get_handle(NULL,
  						 sb->resource_source.string_ptr,
  						 &parent_handle);
b5e3cf410   Ard Biesheuvel   spi/acpi: fix inc...
2035
  			if (ACPI_FAILURE(status) ||
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2036
2037
  			    ACPI_HANDLE(ctlr->dev.parent) != parent_handle)
  				return -ENODEV;
a0a90718f   Mika Westerberg   spi: Let drivers ...
2038
2039
2040
2041
2042
2043
2044
  			/*
  			 * ACPI DeviceSelection numbering is handled by the
  			 * host controller driver in Windows and can vary
  			 * from driver to driver. In Linux we always expect
  			 * 0 .. max - 1 so we need to ask the driver to
  			 * translate between the two schemes.
  			 */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2045
2046
  			if (ctlr->fw_translate_cs) {
  				int cs = ctlr->fw_translate_cs(ctlr,
a0a90718f   Mika Westerberg   spi: Let drivers ...
2047
2048
2049
  						sb->device_selection);
  				if (cs < 0)
  					return cs;
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2050
  				lookup->chip_select = cs;
a0a90718f   Mika Westerberg   spi: Let drivers ...
2051
  			} else {
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2052
  				lookup->chip_select = sb->device_selection;
a0a90718f   Mika Westerberg   spi: Let drivers ...
2053
  			}
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2054
  			lookup->max_speed_hz = sb->connection_speed;
0dadde344   Andy Shevchenko   spi: Respect Data...
2055
  			lookup->bits_per_word = sb->data_bit_length;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2056
2057
  
  			if (sb->clock_phase == ACPI_SPI_SECOND_PHASE)
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2058
  				lookup->mode |= SPI_CPHA;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2059
  			if (sb->clock_polarity == ACPI_SPI_START_HIGH)
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2060
  				lookup->mode |= SPI_CPOL;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2061
  			if (sb->device_polarity == ACPI_SPI_ACTIVE_HIGH)
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2062
  				lookup->mode |= SPI_CS_HIGH;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2063
  		}
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2064
  	} else if (lookup->irq < 0) {
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2065
2066
2067
  		struct resource r;
  
  		if (acpi_dev_resource_interrupt(ares, 0, &r))
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2068
  			lookup->irq = r.start;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2069
2070
2071
2072
2073
  	}
  
  	/* Always tell the ACPI core to skip this resource */
  	return 1;
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2074
  static acpi_status acpi_register_spi_device(struct spi_controller *ctlr,
7f24467f3   Octavian Purdila   spi / ACPI: add s...
2075
  					    struct acpi_device *adev)
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2076
  {
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2077
  	acpi_handle parent_handle = NULL;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2078
  	struct list_head resource_list;
b28944c6f   Ard Biesheuvel   spi/acpi: avoid s...
2079
  	struct acpi_spi_lookup lookup = {};
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2080
2081
  	struct spi_device *spi;
  	int ret;
7f24467f3   Octavian Purdila   spi / ACPI: add s...
2082
2083
  	if (acpi_bus_get_status(adev) || !adev->status.present ||
  	    acpi_device_enumerated(adev))
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2084
  		return AE_OK;
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2085
  	lookup.ctlr		= ctlr;
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2086
  	lookup.irq		= -1;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2087
2088
2089
  
  	INIT_LIST_HEAD(&resource_list);
  	ret = acpi_dev_get_resources(adev, &resource_list,
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2090
  				     acpi_spi_add_resource, &lookup);
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2091
  	acpi_dev_free_resource_list(&resource_list);
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2092
2093
2094
  	if (ret < 0)
  		/* found SPI in _CRS but it points to another controller */
  		return AE_OK;
8a2e487e6   Lukas Wunner   spi: Use Apple de...
2095

4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2096
2097
2098
2099
2100
2101
2102
2103
  	if (!lookup.max_speed_hz &&
  	    !ACPI_FAILURE(acpi_get_parent(adev->handle, &parent_handle)) &&
  	    ACPI_HANDLE(ctlr->dev.parent) == parent_handle) {
  		/* Apple does not use _CRS but nested devices for SPI slaves */
  		acpi_spi_parse_apple_properties(adev, &lookup);
  	}
  
  	if (!lookup.max_speed_hz)
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2104
  		return AE_OK;
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2105
2106
2107
2108
2109
2110
2111
  
  	spi = spi_alloc_device(ctlr);
  	if (!spi) {
  		dev_err(&ctlr->dev, "failed to allocate SPI device for %s
  ",
  			dev_name(&adev->dev));
  		return AE_NO_MEMORY;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2112
  	}
ea2357861   John Garry   spi: Allow SPI co...
2113

4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2114
2115
  	ACPI_COMPANION_SET(&spi->dev, adev);
  	spi->max_speed_hz	= lookup.max_speed_hz;
ea2357861   John Garry   spi: Allow SPI co...
2116
  	spi->mode		|= lookup.mode;
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2117
2118
2119
  	spi->irq		= lookup.irq;
  	spi->bits_per_word	= lookup.bits_per_word;
  	spi->chip_select	= lookup.chip_select;
0c6543f6c   Dan O'Donovan   spi: acpi: Initia...
2120
2121
  	acpi_set_modalias(adev, acpi_device_hid(adev), spi->modalias,
  			  sizeof(spi->modalias));
33ada67da   Christophe RICARD   ACPI / spi: attac...
2122
2123
  	if (spi->irq < 0)
  		spi->irq = acpi_dev_gpio_irq_get(adev, 0);
7f24467f3   Octavian Purdila   spi / ACPI: add s...
2124
  	acpi_device_set_enumerated(adev);
33cf00e57   Mika Westerberg   spi: attach/detac...
2125
  	adev->power.flags.ignore_parent = true;
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2126
  	if (spi_add_device(spi)) {
33cf00e57   Mika Westerberg   spi: attach/detac...
2127
  		adev->power.flags.ignore_parent = false;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2128
2129
  		dev_err(&ctlr->dev, "failed to add SPI device %s from ACPI
  ",
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2130
2131
2132
2133
2134
2135
  			dev_name(&adev->dev));
  		spi_dev_put(spi);
  	}
  
  	return AE_OK;
  }
7f24467f3   Octavian Purdila   spi / ACPI: add s...
2136
2137
2138
  static acpi_status acpi_spi_add_device(acpi_handle handle, u32 level,
  				       void *data, void **return_value)
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2139
  	struct spi_controller *ctlr = data;
7f24467f3   Octavian Purdila   spi / ACPI: add s...
2140
2141
2142
2143
  	struct acpi_device *adev;
  
  	if (acpi_bus_get_device(handle, &adev))
  		return AE_OK;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2144
  	return acpi_register_spi_device(ctlr, adev);
7f24467f3   Octavian Purdila   spi / ACPI: add s...
2145
  }
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2146
  #define SPI_ACPI_ENUMERATE_MAX_DEPTH		32
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2147
  static void acpi_register_spi_devices(struct spi_controller *ctlr)
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2148
2149
2150
  {
  	acpi_status status;
  	acpi_handle handle;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2151
  	handle = ACPI_HANDLE(ctlr->dev.parent);
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2152
2153
  	if (!handle)
  		return;
4c3c59544   Ard Biesheuvel   spi/acpi: enumera...
2154
2155
  	status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
  				     SPI_ACPI_ENUMERATE_MAX_DEPTH,
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2156
  				     acpi_spi_add_device, NULL, ctlr, NULL);
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2157
  	if (ACPI_FAILURE(status))
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2158
2159
  		dev_warn(&ctlr->dev, "failed to enumerate SPI slaves
  ");
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2160
2161
  }
  #else
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2162
  static inline void acpi_register_spi_devices(struct spi_controller *ctlr) {}
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2163
  #endif /* CONFIG_ACPI */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2164
  static void spi_controller_release(struct device *dev)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2165
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2166
  	struct spi_controller *ctlr;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2167

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2168
2169
  	ctlr = container_of(dev, struct spi_controller, dev);
  	kfree(ctlr);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2170
2171
2172
2173
2174
  }
  
  static struct class spi_master_class = {
  	.name		= "spi_master",
  	.owner		= THIS_MODULE,
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2175
  	.dev_release	= spi_controller_release,
eca2ebc7e   Martin Sperl   spi: expose spi_m...
2176
  	.dev_groups	= spi_master_groups,
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2177
  };
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2178
2179
2180
2181
2182
2183
2184
2185
  #ifdef CONFIG_SPI_SLAVE
  /**
   * spi_slave_abort - abort the ongoing transfer request on an SPI slave
   *		     controller
   * @spi: device used for the current transfer
   */
  int spi_slave_abort(struct spi_device *spi)
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2186
  	struct spi_controller *ctlr = spi->controller;
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2187

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2188
2189
  	if (spi_controller_is_slave(ctlr) && ctlr->slave_abort)
  		return ctlr->slave_abort(ctlr);
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2190
2191
2192
2193
2194
2195
2196
2197
2198
  
  	return -ENOTSUPP;
  }
  EXPORT_SYMBOL_GPL(spi_slave_abort);
  
  static int match_true(struct device *dev, void *data)
  {
  	return 1;
  }
cc8b46594   Geert Uytterhoeven   spi: core: Use DE...
2199
2200
  static ssize_t slave_show(struct device *dev, struct device_attribute *attr,
  			  char *buf)
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2201
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2202
2203
  	struct spi_controller *ctlr = container_of(dev, struct spi_controller,
  						   dev);
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2204
2205
2206
2207
2208
2209
2210
  	struct device *child;
  
  	child = device_find_child(&ctlr->dev, NULL, match_true);
  	return sprintf(buf, "%s
  ",
  		       child ? to_spi_device(child)->modalias : NULL);
  }
cc8b46594   Geert Uytterhoeven   spi: core: Use DE...
2211
2212
  static ssize_t slave_store(struct device *dev, struct device_attribute *attr,
  			   const char *buf, size_t count)
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2213
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2214
2215
  	struct spi_controller *ctlr = container_of(dev, struct spi_controller,
  						   dev);
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
  	struct spi_device *spi;
  	struct device *child;
  	char name[32];
  	int rc;
  
  	rc = sscanf(buf, "%31s", name);
  	if (rc != 1 || !name[0])
  		return -EINVAL;
  
  	child = device_find_child(&ctlr->dev, NULL, match_true);
  	if (child) {
  		/* Remove registered slave */
  		device_unregister(child);
  		put_device(child);
  	}
  
  	if (strcmp(name, "(null)")) {
  		/* Register new slave */
  		spi = spi_alloc_device(ctlr);
  		if (!spi)
  			return -ENOMEM;
  
  		strlcpy(spi->modalias, name, sizeof(spi->modalias));
  
  		rc = spi_add_device(spi);
  		if (rc) {
  			spi_dev_put(spi);
  			return rc;
  		}
  	}
  
  	return count;
  }
cc8b46594   Geert Uytterhoeven   spi: core: Use DE...
2249
  static DEVICE_ATTR_RW(slave);
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
  
  static struct attribute *spi_slave_attrs[] = {
  	&dev_attr_slave.attr,
  	NULL,
  };
  
  static const struct attribute_group spi_slave_group = {
  	.attrs = spi_slave_attrs,
  };
  
  static const struct attribute_group *spi_slave_groups[] = {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2261
  	&spi_controller_statistics_group,
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2262
2263
2264
2265
2266
2267
2268
  	&spi_slave_group,
  	NULL,
  };
  
  static struct class spi_slave_class = {
  	.name		= "spi_slave",
  	.owner		= THIS_MODULE,
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2269
  	.dev_release	= spi_controller_release,
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2270
2271
2272
2273
2274
  	.dev_groups	= spi_slave_groups,
  };
  #else
  extern struct class spi_slave_class;	/* dummy */
  #endif
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2275
2276
  
  /**
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2277
   * __spi_alloc_controller - allocate an SPI master or slave controller
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2278
   * @dev: the controller, possibly using the platform_bus
33e34dc6e   David Brownell   SPI kerneldoc
2279
   * @size: how much zeroed driver-private data to allocate; the pointer to this
229e6af10   Lukas Wunner   spi: Guarantee ca...
2280
2281
2282
2283
   *	memory is in the driver_data field of the returned device, accessible
   *	with spi_controller_get_devdata(); the memory is cacheline aligned;
   *	drivers granting DMA access to portions of their private data need to
   *	round up @size using ALIGN(size, dma_get_cache_alignment()).
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2284
2285
   * @slave: flag indicating whether to allocate an SPI master (false) or SPI
   *	slave (true) controller
33e34dc6e   David Brownell   SPI kerneldoc
2286
   * Context: can sleep
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2287
   *
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2288
   * This call is used only by SPI controller drivers, which are the
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2289
   * only ones directly touching chip registers.  It's how they allocate
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2290
   * an spi_controller structure, prior to calling spi_register_controller().
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2291
   *
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
2292
   * This must be called from context that can sleep.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2293
   *
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2294
   * The caller is responsible for assigning the bus number and initializing the
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2295
2296
2297
   * controller's methods before calling spi_register_controller(); and (after
   * errors adding the device) calling spi_controller_put() to prevent a memory
   * leak.
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
2298
   *
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2299
   * Return: the SPI controller structure on success, else NULL.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2300
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2301
2302
  struct spi_controller *__spi_alloc_controller(struct device *dev,
  					      unsigned int size, bool slave)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2303
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2304
  	struct spi_controller	*ctlr;
229e6af10   Lukas Wunner   spi: Guarantee ca...
2305
  	size_t ctlr_size = ALIGN(sizeof(*ctlr), dma_get_cache_alignment());
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2306

0c868461f   David Brownell   [PATCH] SPI core ...
2307
2308
  	if (!dev)
  		return NULL;
229e6af10   Lukas Wunner   spi: Guarantee ca...
2309
  	ctlr = kzalloc(size + ctlr_size, GFP_KERNEL);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2310
  	if (!ctlr)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2311
  		return NULL;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2312
2313
2314
2315
  	device_initialize(&ctlr->dev);
  	ctlr->bus_num = -1;
  	ctlr->num_chipselect = 1;
  	ctlr->slave = slave;
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2316
  	if (IS_ENABLED(CONFIG_SPI_SLAVE) && slave)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2317
  		ctlr->dev.class = &spi_slave_class;
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2318
  	else
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2319
2320
2321
  		ctlr->dev.class = &spi_master_class;
  	ctlr->dev.parent = dev;
  	pm_suspend_ignore_children(&ctlr->dev, true);
229e6af10   Lukas Wunner   spi: Guarantee ca...
2322
  	spi_controller_set_devdata(ctlr, (void *)ctlr + ctlr_size);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2323

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2324
  	return ctlr;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2325
  }
6c364062b   Geert Uytterhoeven   spi: core: Add su...
2326
  EXPORT_SYMBOL_GPL(__spi_alloc_controller);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2327

5e844cc37   Lukas Wunner   spi: Introduce de...
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
  static void devm_spi_release_controller(struct device *dev, void *ctlr)
  {
  	spi_controller_put(*(struct spi_controller **)ctlr);
  }
  
  /**
   * __devm_spi_alloc_controller - resource-managed __spi_alloc_controller()
   * @dev: physical device of SPI controller
   * @size: how much zeroed driver-private data to allocate
   * @slave: whether to allocate an SPI master (false) or SPI slave (true)
   * Context: can sleep
   *
   * Allocate an SPI controller and automatically release a reference on it
   * when @dev is unbound from its driver.  Drivers are thus relieved from
   * having to call spi_controller_put().
   *
   * The arguments to this function are identical to __spi_alloc_controller().
   *
   * Return: the SPI controller structure on success, else NULL.
   */
  struct spi_controller *__devm_spi_alloc_controller(struct device *dev,
  						   unsigned int size,
  						   bool slave)
  {
  	struct spi_controller **ptr, *ctlr;
  
  	ptr = devres_alloc(devm_spi_release_controller, sizeof(*ptr),
  			   GFP_KERNEL);
  	if (!ptr)
  		return NULL;
  
  	ctlr = __spi_alloc_controller(dev, size, slave);
  	if (ctlr) {
  		*ptr = ctlr;
  		devres_add(dev, ptr);
  	} else {
  		devres_free(ptr);
  	}
  
  	return ctlr;
  }
  EXPORT_SYMBOL_GPL(__devm_spi_alloc_controller);
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2370
  #ifdef CONFIG_OF
43004f31e   Linus Walleij   spi: Rename of_sp...
2371
  static int of_spi_get_gpio_numbers(struct spi_controller *ctlr)
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2372
  {
e80beb27d   Grant Likely   gpio: Make of_cou...
2373
  	int nb, i, *cs;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2374
  	struct device_node *np = ctlr->dev.of_node;
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2375
2376
2377
2378
2379
  
  	if (!np)
  		return 0;
  
  	nb = of_gpio_named_count(np, "cs-gpios");
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2380
  	ctlr->num_chipselect = max_t(int, nb, ctlr->num_chipselect);
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2381

8ec5d84ef   Andreas Larsson   spi: Return error...
2382
2383
  	/* Return error only for an incorrectly formed cs-gpios property */
  	if (nb == 0 || nb == -ENOENT)
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2384
  		return 0;
8ec5d84ef   Andreas Larsson   spi: Return error...
2385
2386
  	else if (nb < 0)
  		return nb;
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2387

a86854d0c   Kees Cook   treewide: devm_kz...
2388
  	cs = devm_kcalloc(&ctlr->dev, ctlr->num_chipselect, sizeof(int),
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2389
  			  GFP_KERNEL);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2390
  	ctlr->cs_gpios = cs;
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2391

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2392
  	if (!ctlr->cs_gpios)
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2393
  		return -ENOMEM;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2394
  	for (i = 0; i < ctlr->num_chipselect; i++)
446411e18   Andreas Larsson   spi: Initialize c...
2395
  		cs[i] = -ENOENT;
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2396
2397
2398
2399
2400
2401
2402
  
  	for (i = 0; i < nb; i++)
  		cs[i] = of_get_named_gpio(np, "cs-gpios", i);
  
  	return 0;
  }
  #else
43004f31e   Linus Walleij   spi: Rename of_sp...
2403
  static int of_spi_get_gpio_numbers(struct spi_controller *ctlr)
743179849   Jean-Christophe PLAGNIOL-VILLARD   of_spi: add gener...
2404
2405
2406
2407
  {
  	return 0;
  }
  #endif
f3186dd87   Linus Walleij   spi: Optionally u...
2408
2409
2410
2411
2412
2413
2414
2415
2416
  /**
   * spi_get_gpio_descs() - grab chip select GPIOs for the master
   * @ctlr: The SPI master to grab GPIO descriptors for
   */
  static int spi_get_gpio_descs(struct spi_controller *ctlr)
  {
  	int nb, i;
  	struct gpio_desc **cs;
  	struct device *dev = &ctlr->dev;
7d93aecdb   Geert Uytterhoeven   spi: Add generic ...
2417
2418
  	unsigned long native_cs_mask = 0;
  	unsigned int num_cs_gpios = 0;
f3186dd87   Linus Walleij   spi: Optionally u...
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
  
  	nb = gpiod_count(dev, "cs");
  	ctlr->num_chipselect = max_t(int, nb, ctlr->num_chipselect);
  
  	/* No GPIOs at all is fine, else return the error */
  	if (nb == 0 || nb == -ENOENT)
  		return 0;
  	else if (nb < 0)
  		return nb;
  
  	cs = devm_kcalloc(dev, ctlr->num_chipselect, sizeof(*cs),
  			  GFP_KERNEL);
  	if (!cs)
  		return -ENOMEM;
  	ctlr->cs_gpiods = cs;
  
  	for (i = 0; i < nb; i++) {
  		/*
  		 * Most chipselects are active low, the inverted
  		 * semantics are handled by special quirks in gpiolib,
  		 * so initializing them GPIOD_OUT_LOW here means
  		 * "unasserted", in most cases this will drive the physical
  		 * line high.
  		 */
  		cs[i] = devm_gpiod_get_index_optional(dev, "cs", i,
  						      GPIOD_OUT_LOW);
1723fdec5   Geert Uytterhoeven   spi: Add missing ...
2445
2446
  		if (IS_ERR(cs[i]))
  			return PTR_ERR(cs[i]);
f3186dd87   Linus Walleij   spi: Optionally u...
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
  
  		if (cs[i]) {
  			/*
  			 * If we find a CS GPIO, name it after the device and
  			 * chip select line.
  			 */
  			char *gpioname;
  
  			gpioname = devm_kasprintf(dev, GFP_KERNEL, "%s CS%d",
  						  dev_name(dev), i);
  			if (!gpioname)
  				return -ENOMEM;
  			gpiod_set_consumer_name(cs[i], gpioname);
7d93aecdb   Geert Uytterhoeven   spi: Add generic ...
2460
2461
  			num_cs_gpios++;
  			continue;
f3186dd87   Linus Walleij   spi: Optionally u...
2462
  		}
7d93aecdb   Geert Uytterhoeven   spi: Add generic ...
2463
2464
2465
2466
2467
  
  		if (ctlr->max_native_cs && i >= ctlr->max_native_cs) {
  			dev_err(dev, "Invalid native chip select %d
  ", i);
  			return -EINVAL;
f3186dd87   Linus Walleij   spi: Optionally u...
2468
  		}
7d93aecdb   Geert Uytterhoeven   spi: Add generic ...
2469
2470
2471
2472
2473
2474
2475
2476
2477
  		native_cs_mask |= BIT(i);
  	}
  
  	ctlr->unused_native_cs = ffz(native_cs_mask);
  	if (num_cs_gpios && ctlr->max_native_cs &&
  	    ctlr->unused_native_cs >= ctlr->max_native_cs) {
  		dev_err(dev, "No unused native chip select available
  ");
  		return -EINVAL;
f3186dd87   Linus Walleij   spi: Optionally u...
2478
2479
2480
2481
  	}
  
  	return 0;
  }
bdf3a3b59   Boris Brezillon   spi: Check presen...
2482
2483
2484
  static int spi_controller_check_ops(struct spi_controller *ctlr)
  {
  	/*
b5932f5c6   Boris Brezillon   spi: Make support...
2485
2486
2487
2488
2489
  	 * The controller may implement only the high-level SPI-memory like
  	 * operations if it does not support regular SPI transfers, and this is
  	 * valid use case.
  	 * If ->mem_ops is NULL, we request that at least one of the
  	 * ->transfer_xxx() method be implemented.
bdf3a3b59   Boris Brezillon   spi: Check presen...
2490
  	 */
b5932f5c6   Boris Brezillon   spi: Make support...
2491
2492
2493
2494
2495
  	if (ctlr->mem_ops) {
  		if (!ctlr->mem_ops->exec_op)
  			return -EINVAL;
  	} else if (!ctlr->transfer && !ctlr->transfer_one &&
  		   !ctlr->transfer_one_message) {
bdf3a3b59   Boris Brezillon   spi: Check presen...
2496
  		return -EINVAL;
b5932f5c6   Boris Brezillon   spi: Make support...
2497
  	}
bdf3a3b59   Boris Brezillon   spi: Check presen...
2498
2499
2500
  
  	return 0;
  }
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2501
  /**
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2502
2503
2504
   * spi_register_controller - register SPI master or slave controller
   * @ctlr: initialized master, originally from spi_alloc_master() or
   *	spi_alloc_slave()
33e34dc6e   David Brownell   SPI kerneldoc
2505
   * Context: can sleep
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2506
   *
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2507
   * SPI controllers connect to their drivers using some non-SPI bus,
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2508
   * such as the platform bus.  The final stage of probe() in that code
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2509
   * includes calling spi_register_controller() to hook up to this SPI bus glue.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2510
2511
2512
2513
2514
2515
2516
2517
   *
   * SPI controllers use board specific (often SOC specific) bus numbers,
   * and board-specific addressing for SPI devices combines those numbers
   * with chip select numbers.  Since SPI does not directly support dynamic
   * device identification, boards need configuration tables telling which
   * chip is at which address.
   *
   * This must be called from context that can sleep.  It returns zero on
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2518
   * success, else a negative error code (dropping the controller's refcount).
0c868461f   David Brownell   [PATCH] SPI core ...
2519
   * After a successful return, the caller is responsible for calling
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2520
   * spi_unregister_controller().
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
2521
2522
   *
   * Return: zero on success, else a negative error code.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2523
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2524
  int spi_register_controller(struct spi_controller *ctlr)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2525
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2526
  	struct device		*dev = ctlr->dev.parent;
2b9603a0d   Feng Tang   spi: enable spi_b...
2527
  	struct boardinfo	*bi;
b93318a22   Sergei Shtylyov   spi: kill useless...
2528
  	int			status;
42bdd7061   Lucas Stach   spi: fix IDR coll...
2529
  	int			id, first_dynamic;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2530

0c868461f   David Brownell   [PATCH] SPI core ...
2531
2532
  	if (!dev)
  		return -ENODEV;
bdf3a3b59   Boris Brezillon   spi: Check presen...
2533
2534
2535
2536
2537
2538
2539
  	/*
  	 * Make sure all necessary hooks are implemented before registering
  	 * the SPI controller.
  	 */
  	status = spi_controller_check_ops(ctlr);
  	if (status)
  		return status;
04b2d03a7   Geert Uytterhoeven   spi: Fix double I...
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
  	if (ctlr->bus_num >= 0) {
  		/* devices with a fixed bus num must check-in with the num */
  		mutex_lock(&board_lock);
  		id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num,
  			ctlr->bus_num + 1, GFP_KERNEL);
  		mutex_unlock(&board_lock);
  		if (WARN(id < 0, "couldn't get idr"))
  			return id == -ENOSPC ? -EBUSY : id;
  		ctlr->bus_num = id;
  	} else if (ctlr->dev.of_node) {
  		/* allocate dynamic bus number using Linux idr */
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
  		id = of_alias_get_id(ctlr->dev.of_node, "spi");
  		if (id >= 0) {
  			ctlr->bus_num = id;
  			mutex_lock(&board_lock);
  			id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num,
  				       ctlr->bus_num + 1, GFP_KERNEL);
  			mutex_unlock(&board_lock);
  			if (WARN(id < 0, "couldn't get idr"))
  				return id == -ENOSPC ? -EBUSY : id;
  		}
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2562
  	if (ctlr->bus_num < 0) {
42bdd7061   Lucas Stach   spi: fix IDR coll...
2563
2564
2565
2566
2567
  		first_dynamic = of_alias_get_highest_id("spi");
  		if (first_dynamic < 0)
  			first_dynamic = 0;
  		else
  			first_dynamic++;
9a9a047a3   Suniel Mahesh   spi: Kernel codin...
2568
  		mutex_lock(&board_lock);
42bdd7061   Lucas Stach   spi: fix IDR coll...
2569
2570
  		id = idr_alloc(&spi_master_idr, ctlr, first_dynamic,
  			       0, GFP_KERNEL);
9a9a047a3   Suniel Mahesh   spi: Kernel codin...
2571
2572
2573
2574
  		mutex_unlock(&board_lock);
  		if (WARN(id < 0, "couldn't get idr"))
  			return id;
  		ctlr->bus_num = id;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2575
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2576
2577
2578
2579
2580
2581
2582
2583
2584
  	INIT_LIST_HEAD(&ctlr->queue);
  	spin_lock_init(&ctlr->queue_lock);
  	spin_lock_init(&ctlr->bus_lock_spinlock);
  	mutex_init(&ctlr->bus_lock_mutex);
  	mutex_init(&ctlr->io_mutex);
  	ctlr->bus_lock_flag = 0;
  	init_completion(&ctlr->xfer_completion);
  	if (!ctlr->max_dma_len)
  		ctlr->max_dma_len = INT_MAX;
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
2585

8ae12a0d8   David Brownell   [PATCH] spi: simp...
2586
2587
2588
  	/* register the device, then userspace will see it.
  	 * registration fails if the bus ID is in use.
  	 */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2589
  	dev_set_name(&ctlr->dev, "spi%u", ctlr->bus_num);
0a919ae49   Andrey Smirnov   spi: Don't call s...
2590
2591
2592
2593
2594
  
  	if (!spi_controller_is_slave(ctlr)) {
  		if (ctlr->use_gpio_descriptors) {
  			status = spi_get_gpio_descs(ctlr);
  			if (status)
f9981d4f5   Aaro Koskinen   spi: spi_register...
2595
  				goto free_bus_id;
0a919ae49   Andrey Smirnov   spi: Don't call s...
2596
2597
2598
2599
2600
2601
2602
  			/*
  			 * A controller using GPIO descriptors always
  			 * supports SPI_CS_HIGH if need be.
  			 */
  			ctlr->mode_bits |= SPI_CS_HIGH;
  		} else {
  			/* Legacy code path for GPIOs from DT */
43004f31e   Linus Walleij   spi: Rename of_sp...
2603
  			status = of_spi_get_gpio_numbers(ctlr);
0a919ae49   Andrey Smirnov   spi: Don't call s...
2604
  			if (status)
f9981d4f5   Aaro Koskinen   spi: spi_register...
2605
  				goto free_bus_id;
0a919ae49   Andrey Smirnov   spi: Don't call s...
2606
2607
  		}
  	}
f9481b082   Tudor Ambarus   spi: fix ctrl->nu...
2608
2609
2610
2611
  	/*
  	 * Even if it's just one always-selected device, there must
  	 * be at least one chipselect.
  	 */
f9981d4f5   Aaro Koskinen   spi: spi_register...
2612
2613
2614
2615
  	if (!ctlr->num_chipselect) {
  		status = -EINVAL;
  		goto free_bus_id;
  	}
f9481b082   Tudor Ambarus   spi: fix ctrl->nu...
2616

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2617
  	status = device_add(&ctlr->dev);
f9981d4f5   Aaro Koskinen   spi: spi_register...
2618
2619
  	if (status < 0)
  		goto free_bus_id;
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
2620
2621
  	dev_dbg(dev, "registered %s %s
  ",
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2622
  			spi_controller_is_slave(ctlr) ? "slave" : "master",
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
2623
  			dev_name(&ctlr->dev));
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2624

b5932f5c6   Boris Brezillon   spi: Make support...
2625
2626
2627
2628
2629
2630
  	/*
  	 * If we're using a queued driver, start the queue. Note that we don't
  	 * need the queueing logic if the driver is only supporting high-level
  	 * memory operations.
  	 */
  	if (ctlr->transfer) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2631
2632
  		dev_info(dev, "controller is unqueued, this is deprecated
  ");
b5932f5c6   Boris Brezillon   spi: Make support...
2633
  	} else if (ctlr->transfer_one || ctlr->transfer_one_message) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2634
  		status = spi_controller_initialize_queue(ctlr);
ffbbdd213   Linus Walleij   spi: create a mes...
2635
  		if (status) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2636
  			device_del(&ctlr->dev);
f9981d4f5   Aaro Koskinen   spi: spi_register...
2637
  			goto free_bus_id;
ffbbdd213   Linus Walleij   spi: create a mes...
2638
2639
  		}
  	}
eca2ebc7e   Martin Sperl   spi: expose spi_m...
2640
  	/* add statistics */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2641
  	spin_lock_init(&ctlr->statistics.lock);
ffbbdd213   Linus Walleij   spi: create a mes...
2642

2b9603a0d   Feng Tang   spi: enable spi_b...
2643
  	mutex_lock(&board_lock);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2644
  	list_add_tail(&ctlr->list, &spi_controller_list);
2b9603a0d   Feng Tang   spi: enable spi_b...
2645
  	list_for_each_entry(bi, &board_list, list)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2646
  		spi_match_controller_to_boardinfo(ctlr, &bi->board_info);
2b9603a0d   Feng Tang   spi: enable spi_b...
2647
  	mutex_unlock(&board_lock);
64bee4d28   Mika Westerberg   spi / ACPI: add A...
2648
  	/* Register devices from the device tree and ACPI */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2649
2650
  	of_register_spi_devices(ctlr);
  	acpi_register_spi_devices(ctlr);
f9981d4f5   Aaro Koskinen   spi: spi_register...
2651
2652
2653
2654
2655
2656
  	return status;
  
  free_bus_id:
  	mutex_lock(&board_lock);
  	idr_remove(&spi_master_idr, ctlr->bus_num);
  	mutex_unlock(&board_lock);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2657
2658
  	return status;
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2659
  EXPORT_SYMBOL_GPL(spi_register_controller);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2660

666d5b4c7   Mark Brown   spi: core: Add de...
2661
2662
  static void devm_spi_unregister(struct device *dev, void *res)
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2663
  	spi_unregister_controller(*(struct spi_controller **)res);
666d5b4c7   Mark Brown   spi: core: Add de...
2664
2665
2666
  }
  
  /**
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2667
2668
2669
2670
2671
   * devm_spi_register_controller - register managed SPI master or slave
   *	controller
   * @dev:    device managing SPI controller
   * @ctlr: initialized controller, originally from spi_alloc_master() or
   *	spi_alloc_slave()
666d5b4c7   Mark Brown   spi: core: Add de...
2672
2673
   * Context: can sleep
   *
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2674
   * Register a SPI device as with spi_register_controller() which will
68b892f1f   Johan Hovold   spi: document odd...
2675
   * automatically be unregistered and freed.
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
2676
2677
   *
   * Return: zero on success, else a negative error code.
666d5b4c7   Mark Brown   spi: core: Add de...
2678
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2679
2680
  int devm_spi_register_controller(struct device *dev,
  				 struct spi_controller *ctlr)
666d5b4c7   Mark Brown   spi: core: Add de...
2681
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2682
  	struct spi_controller **ptr;
666d5b4c7   Mark Brown   spi: core: Add de...
2683
2684
2685
2686
2687
  	int ret;
  
  	ptr = devres_alloc(devm_spi_unregister, sizeof(*ptr), GFP_KERNEL);
  	if (!ptr)
  		return -ENOMEM;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2688
  	ret = spi_register_controller(ctlr);
4b92894ee   Stephen Warren   spi: core: invert...
2689
  	if (!ret) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2690
  		*ptr = ctlr;
666d5b4c7   Mark Brown   spi: core: Add de...
2691
2692
2693
2694
2695
2696
2697
  		devres_add(dev, ptr);
  	} else {
  		devres_free(ptr);
  	}
  
  	return ret;
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2698
  EXPORT_SYMBOL_GPL(devm_spi_register_controller);
666d5b4c7   Mark Brown   spi: core: Add de...
2699

5e844cc37   Lukas Wunner   spi: Introduce de...
2700
2701
2702
2703
  static int devm_spi_match_controller(struct device *dev, void *res, void *ctlr)
  {
  	return *(struct spi_controller **)res == ctlr;
  }
34860089c   David Lamparter   spi: free childre...
2704
  static int __unregister(struct device *dev, void *null)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2705
  {
34860089c   David Lamparter   spi: free childre...
2706
  	spi_unregister_device(to_spi_device(dev));
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2707
2708
2709
2710
  	return 0;
  }
  
  /**
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2711
2712
   * spi_unregister_controller - unregister SPI master or slave controller
   * @ctlr: the controller being unregistered
33e34dc6e   David Brownell   SPI kerneldoc
2713
   * Context: can sleep
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2714
   *
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2715
   * This call is used only by SPI controller drivers, which are the
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2716
2717
2718
   * only ones directly touching chip registers.
   *
   * This must be called from context that can sleep.
68b892f1f   Johan Hovold   spi: document odd...
2719
2720
   *
   * Note that this function also drops a reference to the controller.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2721
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2722
  void spi_unregister_controller(struct spi_controller *ctlr)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2723
  {
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
2724
  	struct spi_controller *found;
67f7b2781   Johan Hovold   spi: fix use-afte...
2725
  	int id = ctlr->bus_num;
89fc9a1a7   Jeff Garzik   [PATCH] SPI: impr...
2726

ddf75be47   Lukas Wunner   spi: Prevent addi...
2727
2728
2729
  	/* Prevent addition of new devices, unregister existing ones */
  	if (IS_ENABLED(CONFIG_SPI_DYNAMIC))
  		mutex_lock(&spi_add_lock);
84855678a   Lukas Wunner   spi: Fix controll...
2730
  	device_for_each_child(&ctlr->dev, NULL, __unregister);
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
2731
2732
  	/* First make sure that this controller was ever added */
  	mutex_lock(&board_lock);
67f7b2781   Johan Hovold   spi: fix use-afte...
2733
  	found = idr_find(&spi_master_idr, id);
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
2734
  	mutex_unlock(&board_lock);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2735
2736
2737
2738
  	if (ctlr->queued) {
  		if (spi_destroy_queue(ctlr))
  			dev_err(&ctlr->dev, "queue remove failed
  ");
ffbbdd213   Linus Walleij   spi: create a mes...
2739
  	}
2b9603a0d   Feng Tang   spi: enable spi_b...
2740
  	mutex_lock(&board_lock);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2741
  	list_del(&ctlr->list);
2b9603a0d   Feng Tang   spi: enable spi_b...
2742
  	mutex_unlock(&board_lock);
5e844cc37   Lukas Wunner   spi: Introduce de...
2743
2744
2745
2746
2747
2748
2749
2750
  	device_del(&ctlr->dev);
  
  	/* Release the last reference on the controller if its driver
  	 * has not yet been converted to devm_spi_alloc_master/slave().
  	 */
  	if (!devres_find(ctlr->dev.parent, devm_spi_release_controller,
  			 devm_spi_match_controller, ctlr))
  		put_device(&ctlr->dev);
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
2751
2752
  	/* free bus id */
  	mutex_lock(&board_lock);
613bd1ea3   Jarkko Nikula   spi: Fix unregist...
2753
2754
  	if (found == ctlr)
  		idr_remove(&spi_master_idr, id);
9b61e3022   Suniel Mahesh   spi: Pick spi bus...
2755
  	mutex_unlock(&board_lock);
ddf75be47   Lukas Wunner   spi: Prevent addi...
2756
2757
2758
  
  	if (IS_ENABLED(CONFIG_SPI_DYNAMIC))
  		mutex_unlock(&spi_add_lock);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2759
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2760
  EXPORT_SYMBOL_GPL(spi_unregister_controller);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2761

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2762
  int spi_controller_suspend(struct spi_controller *ctlr)
ffbbdd213   Linus Walleij   spi: create a mes...
2763
2764
  {
  	int ret;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2765
2766
  	/* Basically no-ops for non-queued controllers */
  	if (!ctlr->queued)
ffbbdd213   Linus Walleij   spi: create a mes...
2767
  		return 0;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2768
  	ret = spi_stop_queue(ctlr);
ffbbdd213   Linus Walleij   spi: create a mes...
2769
  	if (ret)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2770
2771
  		dev_err(&ctlr->dev, "queue stop failed
  ");
ffbbdd213   Linus Walleij   spi: create a mes...
2772
2773
2774
  
  	return ret;
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2775
  EXPORT_SYMBOL_GPL(spi_controller_suspend);
ffbbdd213   Linus Walleij   spi: create a mes...
2776

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2777
  int spi_controller_resume(struct spi_controller *ctlr)
ffbbdd213   Linus Walleij   spi: create a mes...
2778
2779
  {
  	int ret;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2780
  	if (!ctlr->queued)
ffbbdd213   Linus Walleij   spi: create a mes...
2781
  		return 0;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2782
  	ret = spi_start_queue(ctlr);
ffbbdd213   Linus Walleij   spi: create a mes...
2783
  	if (ret)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2784
2785
  		dev_err(&ctlr->dev, "queue restart failed
  ");
ffbbdd213   Linus Walleij   spi: create a mes...
2786
2787
2788
  
  	return ret;
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2789
  EXPORT_SYMBOL_GPL(spi_controller_resume);
ffbbdd213   Linus Walleij   spi: create a mes...
2790

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2791
  static int __spi_controller_match(struct device *dev, const void *data)
5ed2c832e   Dave Young   spi: use class it...
2792
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2793
  	struct spi_controller *ctlr;
9f3b795a6   MichaÅ‚ MirosÅ‚aw   driver-core: cons...
2794
  	const u16 *bus_num = data;
5ed2c832e   Dave Young   spi: use class it...
2795

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2796
2797
  	ctlr = container_of(dev, struct spi_controller, dev);
  	return ctlr->bus_num == *bus_num;
5ed2c832e   Dave Young   spi: use class it...
2798
  }
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2799
2800
2801
  /**
   * spi_busnum_to_master - look up master associated with bus_num
   * @bus_num: the master's bus number
33e34dc6e   David Brownell   SPI kerneldoc
2802
   * Context: can sleep
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2803
2804
2805
   *
   * This call may be used with devices that are registered after
   * arch init time.  It returns a refcounted pointer to the relevant
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2806
   * spi_controller (which the caller must release), or NULL if there is
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2807
   * no such master registered.
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
2808
2809
   *
   * Return: the SPI master structure on success, else NULL.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2810
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2811
  struct spi_controller *spi_busnum_to_master(u16 bus_num)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2812
  {
49dce689a   Tony Jones   spi doesn't need ...
2813
  	struct device		*dev;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2814
  	struct spi_controller	*ctlr = NULL;
5ed2c832e   Dave Young   spi: use class it...
2815

695794ae0   Greg Kroah-Hartman   Driver Core: add ...
2816
  	dev = class_find_device(&spi_master_class, NULL, &bus_num,
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2817
  				__spi_controller_match);
5ed2c832e   Dave Young   spi: use class it...
2818
  	if (dev)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2819
  		ctlr = container_of(dev, struct spi_controller, dev);
5ed2c832e   Dave Young   spi: use class it...
2820
  	/* reference got in class_find_device */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2821
  	return ctlr;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2822
2823
  }
  EXPORT_SYMBOL_GPL(spi_busnum_to_master);
d780c3711   Martin Sperl   spi: core: added ...
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
  /*-------------------------------------------------------------------------*/
  
  /* Core methods for SPI resource management */
  
  /**
   * spi_res_alloc - allocate a spi resource that is life-cycle managed
   *                 during the processing of a spi_message while using
   *                 spi_transfer_one
   * @spi:     the spi device for which we allocate memory
   * @release: the release code to execute for this resource
   * @size:    size to alloc and return
   * @gfp:     GFP allocation flags
   *
   * Return: the pointer to the allocated data
   *
   * This may get enhanced in the future to allocate from a memory pool
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2840
   * of the @spi_device or @spi_controller to avoid repeated allocations.
d780c3711   Martin Sperl   spi: core: added ...
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
   */
  void *spi_res_alloc(struct spi_device *spi,
  		    spi_res_release_t release,
  		    size_t size, gfp_t gfp)
  {
  	struct spi_res *sres;
  
  	sres = kzalloc(sizeof(*sres) + size, gfp);
  	if (!sres)
  		return NULL;
  
  	INIT_LIST_HEAD(&sres->entry);
  	sres->release = release;
  
  	return sres->data;
  }
  EXPORT_SYMBOL_GPL(spi_res_alloc);
  
  /**
   * spi_res_free - free an spi resource
   * @res: pointer to the custom data of a resource
   *
   */
  void spi_res_free(void *res)
  {
  	struct spi_res *sres = container_of(res, struct spi_res, data);
  
  	if (!res)
  		return;
  
  	WARN_ON(!list_empty(&sres->entry));
  	kfree(sres);
  }
  EXPORT_SYMBOL_GPL(spi_res_free);
  
  /**
   * spi_res_add - add a spi_res to the spi_message
   * @message: the spi message
   * @res:     the spi_resource
   */
  void spi_res_add(struct spi_message *message, void *res)
  {
  	struct spi_res *sres = container_of(res, struct spi_res, data);
  
  	WARN_ON(!list_empty(&sres->entry));
  	list_add_tail(&sres->entry, &message->resources);
  }
  EXPORT_SYMBOL_GPL(spi_res_add);
  
  /**
   * spi_res_release - release all spi resources for this message
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2892
   * @ctlr:  the @spi_controller
d780c3711   Martin Sperl   spi: core: added ...
2893
2894
   * @message: the @spi_message
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2895
  void spi_res_release(struct spi_controller *ctlr, struct spi_message *message)
d780c3711   Martin Sperl   spi: core: added ...
2896
  {
f56943699   Vladimir Zapolskiy   spi: don't open c...
2897
  	struct spi_res *res, *tmp;
d780c3711   Martin Sperl   spi: core: added ...
2898

f56943699   Vladimir Zapolskiy   spi: don't open c...
2899
  	list_for_each_entry_safe_reverse(res, tmp, &message->resources, entry) {
d780c3711   Martin Sperl   spi: core: added ...
2900
  		if (res->release)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2901
  			res->release(ctlr, message, res->data);
d780c3711   Martin Sperl   spi: core: added ...
2902
2903
2904
2905
2906
2907
2908
  
  		list_del(&res->entry);
  
  		kfree(res);
  	}
  }
  EXPORT_SYMBOL_GPL(spi_res_release);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
2909
2910
  
  /*-------------------------------------------------------------------------*/
523baf5a0   Martin Sperl   spi: core: add sp...
2911
  /* Core methods for spi_message alterations */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2912
  static void __spi_replace_transfers_release(struct spi_controller *ctlr,
523baf5a0   Martin Sperl   spi: core: add sp...
2913
2914
2915
2916
2917
2918
2919
2920
  					    struct spi_message *msg,
  					    void *res)
  {
  	struct spi_replaced_transfers *rxfer = res;
  	size_t i;
  
  	/* call extra callback if requested */
  	if (rxfer->release)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
2921
  		rxfer->release(ctlr, msg, res);
523baf5a0   Martin Sperl   spi: core: add sp...
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
  
  	/* insert replaced transfers back into the message */
  	list_splice(&rxfer->replaced_transfers, rxfer->replaced_after);
  
  	/* remove the formerly inserted entries */
  	for (i = 0; i < rxfer->inserted; i++)
  		list_del(&rxfer->inserted_transfers[i].transfer_list);
  }
  
  /**
   * spi_replace_transfers - replace transfers with several transfers
   *                         and register change with spi_message.resources
   * @msg:           the spi_message we work upon
   * @xfer_first:    the first spi_transfer we want to replace
   * @remove:        number of transfers to remove
   * @insert:        the number of transfers we want to insert instead
   * @release:       extra release code necessary in some circumstances
   * @extradatasize: extra data to allocate (with alignment guarantees
   *                 of struct @spi_transfer)
058853979   Martin Sperl   spi: docbook: add...
2941
   * @gfp:           gfp flags
523baf5a0   Martin Sperl   spi: core: add sp...
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
   *
   * Returns: pointer to @spi_replaced_transfers,
   *          PTR_ERR(...) in case of errors.
   */
  struct spi_replaced_transfers *spi_replace_transfers(
  	struct spi_message *msg,
  	struct spi_transfer *xfer_first,
  	size_t remove,
  	size_t insert,
  	spi_replaced_release_t release,
  	size_t extradatasize,
  	gfp_t gfp)
  {
  	struct spi_replaced_transfers *rxfer;
  	struct spi_transfer *xfer;
  	size_t i;
  
  	/* allocate the structure using spi_res */
  	rxfer = spi_res_alloc(msg->spi, __spi_replace_transfers_release,
aef975227   Gustavo A. R. Silva   spi: Use struct_s...
2961
  			      struct_size(rxfer, inserted_transfers, insert)
523baf5a0   Martin Sperl   spi: core: add sp...
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
  			      + extradatasize,
  			      gfp);
  	if (!rxfer)
  		return ERR_PTR(-ENOMEM);
  
  	/* the release code to invoke before running the generic release */
  	rxfer->release = release;
  
  	/* assign extradata */
  	if (extradatasize)
  		rxfer->extradata =
  			&rxfer->inserted_transfers[insert];
  
  	/* init the replaced_transfers list */
  	INIT_LIST_HEAD(&rxfer->replaced_transfers);
  
  	/* assign the list_entry after which we should reinsert
  	 * the @replaced_transfers - it may be spi_message.messages!
  	 */
  	rxfer->replaced_after = xfer_first->transfer_list.prev;
  
  	/* remove the requested number of transfers */
  	for (i = 0; i < remove; i++) {
  		/* if the entry after replaced_after it is msg->transfers
  		 * then we have been requested to remove more transfers
  		 * than are in the list
  		 */
  		if (rxfer->replaced_after->next == &msg->transfers) {
  			dev_err(&msg->spi->dev,
  				"requested to remove more spi_transfers than are available
  ");
  			/* insert replaced transfers back into the message */
  			list_splice(&rxfer->replaced_transfers,
  				    rxfer->replaced_after);
  
  			/* free the spi_replace_transfer structure */
  			spi_res_free(rxfer);
  
  			/* and return with an error */
  			return ERR_PTR(-EINVAL);
  		}
  
  		/* remove the entry after replaced_after from list of
  		 * transfers and add it to list of replaced_transfers
  		 */
  		list_move_tail(rxfer->replaced_after->next,
  			       &rxfer->replaced_transfers);
  	}
  
  	/* create copy of the given xfer with identical settings
  	 * based on the first transfer to get removed
  	 */
  	for (i = 0; i < insert; i++) {
  		/* we need to run in reverse order */
  		xfer = &rxfer->inserted_transfers[insert - 1 - i];
  
  		/* copy all spi_transfer data */
  		memcpy(xfer, xfer_first, sizeof(*xfer));
  
  		/* add to list */
  		list_add(&xfer->transfer_list, rxfer->replaced_after);
bebcfd272   Alexandru Ardelean   spi: introduce `d...
3023
  		/* clear cs_change and delay for all but the last */
523baf5a0   Martin Sperl   spi: core: add sp...
3024
3025
3026
  		if (i) {
  			xfer->cs_change = false;
  			xfer->delay_usecs = 0;
bebcfd272   Alexandru Ardelean   spi: introduce `d...
3027
  			xfer->delay.value = 0;
523baf5a0   Martin Sperl   spi: core: add sp...
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
  		}
  	}
  
  	/* set up inserted */
  	rxfer->inserted = insert;
  
  	/* and register it with spi_res/spi_message */
  	spi_res_add(msg, rxfer);
  
  	return rxfer;
  }
  EXPORT_SYMBOL_GPL(spi_replace_transfers);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3040
  static int __spi_split_transfer_maxsize(struct spi_controller *ctlr,
08933418d   Fabio Estevam   spi: core: Static...
3041
3042
3043
3044
  					struct spi_message *msg,
  					struct spi_transfer **xferp,
  					size_t maxsize,
  					gfp_t gfp)
d9f121227   Martin Sperl   spi: core: add sp...
3045
3046
3047
3048
3049
  {
  	struct spi_transfer *xfer = *xferp, *xfers;
  	struct spi_replaced_transfers *srt;
  	size_t offset;
  	size_t count, i;
d9f121227   Martin Sperl   spi: core: add sp...
3050
3051
3052
3053
3054
  	/* calculate how many we have to replace */
  	count = DIV_ROUND_UP(xfer->len, maxsize);
  
  	/* create replacement */
  	srt = spi_replace_transfers(msg, xfer, 1, count, NULL, 0, gfp);
657d32efe   Dan Carpenter   spi: checking for...
3055
3056
  	if (IS_ERR(srt))
  		return PTR_ERR(srt);
d9f121227   Martin Sperl   spi: core: add sp...
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
  	xfers = srt->inserted_transfers;
  
  	/* now handle each of those newly inserted spi_transfers
  	 * note that the replacements spi_transfers all are preset
  	 * to the same values as *xferp, so tx_buf, rx_buf and len
  	 * are all identical (as well as most others)
  	 * so we just have to fix up len and the pointers.
  	 *
  	 * this also includes support for the depreciated
  	 * spi_message.is_dma_mapped interface
  	 */
  
  	/* the first transfer just needs the length modified, so we
  	 * run it outside the loop
  	 */
c8dab77a1   Fabio Estevam   spi: core: Use mi...
3072
  	xfers[0].len = min_t(size_t, maxsize, xfer[0].len);
d9f121227   Martin Sperl   spi: core: add sp...
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
  
  	/* all the others need rx_buf/tx_buf also set */
  	for (i = 1, offset = maxsize; i < count; offset += maxsize, i++) {
  		/* update rx_buf, tx_buf and dma */
  		if (xfers[i].rx_buf)
  			xfers[i].rx_buf += offset;
  		if (xfers[i].rx_dma)
  			xfers[i].rx_dma += offset;
  		if (xfers[i].tx_buf)
  			xfers[i].tx_buf += offset;
  		if (xfers[i].tx_dma)
  			xfers[i].tx_dma += offset;
  
  		/* update length */
  		xfers[i].len = min(maxsize, xfers[i].len - offset);
  	}
  
  	/* we set up xferp to the last entry we have inserted,
  	 * so that we skip those already split transfers
  	 */
  	*xferp = &xfers[count - 1];
  
  	/* increment statistics counters */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3096
  	SPI_STATISTICS_INCREMENT_FIELD(&ctlr->statistics,
d9f121227   Martin Sperl   spi: core: add sp...
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
  				       transfers_split_maxsize);
  	SPI_STATISTICS_INCREMENT_FIELD(&msg->spi->statistics,
  				       transfers_split_maxsize);
  
  	return 0;
  }
  
  /**
   * spi_split_tranfers_maxsize - split spi transfers into multiple transfers
   *                              when an individual transfer exceeds a
   *                              certain size
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3108
   * @ctlr:    the @spi_controller for this transfer
3700ce951   Masanari Iida   spi: make xmldocs...
3109
3110
   * @msg:   the @spi_message to transform
   * @maxsize:  the maximum when to apply this
10f11a223   Javier Martinez Canillas   spi: Add gfp para...
3111
   * @gfp: GFP allocation flags
d9f121227   Martin Sperl   spi: core: add sp...
3112
3113
3114
   *
   * Return: status of transformation
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3115
  int spi_split_transfers_maxsize(struct spi_controller *ctlr,
d9f121227   Martin Sperl   spi: core: add sp...
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
  				struct spi_message *msg,
  				size_t maxsize,
  				gfp_t gfp)
  {
  	struct spi_transfer *xfer;
  	int ret;
  
  	/* iterate over the transfer_list,
  	 * but note that xfer is advanced to the last transfer inserted
  	 * to avoid checking sizes again unnecessarily (also xfer does
  	 * potentiall belong to a different list by the time the
  	 * replacement has happened
  	 */
  	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
  		if (xfer->len > maxsize) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3131
3132
  			ret = __spi_split_transfer_maxsize(ctlr, msg, &xfer,
  							   maxsize, gfp);
d9f121227   Martin Sperl   spi: core: add sp...
3133
3134
3135
3136
3137
3138
3139
3140
  			if (ret)
  				return ret;
  		}
  	}
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(spi_split_transfers_maxsize);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3141
3142
  
  /*-------------------------------------------------------------------------*/
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3143
  /* Core methods for SPI controller protocol drivers.  Some of the
7d0771970   David Brownell   spi: move common ...
3144
3145
   * other core methods are currently defined as inline functions.
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3146
3147
  static int __spi_validate_bits_per_word(struct spi_controller *ctlr,
  					u8 bits_per_word)
63ab645f4   Stefan Brüns   spi: check bits_p...
3148
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3149
  	if (ctlr->bits_per_word_mask) {
63ab645f4   Stefan Brüns   spi: check bits_p...
3150
3151
3152
  		/* Only 32 bits fit in the mask */
  		if (bits_per_word > 32)
  			return -EINVAL;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3153
  		if (!(ctlr->bits_per_word_mask & SPI_BPW_MASK(bits_per_word)))
63ab645f4   Stefan Brüns   spi: check bits_p...
3154
3155
3156
3157
3158
  			return -EINVAL;
  	}
  
  	return 0;
  }
7d0771970   David Brownell   spi: move common ...
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
  /**
   * spi_setup - setup SPI mode and clock rate
   * @spi: the device whose settings are being modified
   * Context: can sleep, and no requests are queued to the device
   *
   * SPI protocol drivers may need to update the transfer mode if the
   * device doesn't work with its default.  They may likewise need
   * to update clock rates or word sizes from initial values.  This function
   * changes those settings, and must be called from a context that can sleep.
   * Except for SPI_CS_HIGH, which takes effect immediately, the changes take
   * effect the next time the device is selected and data is transferred to
   * or from it.  When this function returns, the spi device is deselected.
   *
   * Note that this call will fail if the protocol driver specifies an option
   * that the underlying controller or its driver does not support.  For
   * example, not all hardware supports wire transfers using nine bit words,
   * LSB-first wire encoding, or active-high chipselects.
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
3176
3177
   *
   * Return: zero on success, else a negative error code.
7d0771970   David Brownell   spi: move common ...
3178
3179
3180
   */
  int spi_setup(struct spi_device *spi)
  {
83596fbeb   Geert Uytterhoeven   spi: core: Ignore...
3181
  	unsigned	bad_bits, ugly_bits;
5ab8d2621   Andy Shevchenko   spi: core: propag...
3182
  	int		status;
7d0771970   David Brownell   spi: move common ...
3183

f477b7fb1   wangyuhang   spi: DUAL and QUA...
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
  	/* check mode to prevent that DUAL and QUAD set at the same time
  	 */
  	if (((spi->mode & SPI_TX_DUAL) && (spi->mode & SPI_TX_QUAD)) ||
  		((spi->mode & SPI_RX_DUAL) && (spi->mode & SPI_RX_QUAD))) {
  		dev_err(&spi->dev,
  		"setup: can not select dual and quad at the same time
  ");
  		return -EINVAL;
  	}
  	/* if it is SPI_3WIRE mode, DUAL and QUAD should be forbidden
  	 */
  	if ((spi->mode & SPI_3WIRE) && (spi->mode &
6b03061f8   Yogesh Narayan Gaur   spi: add support ...
3196
3197
  		(SPI_TX_DUAL | SPI_TX_QUAD | SPI_TX_OCTAL |
  		 SPI_RX_DUAL | SPI_RX_QUAD | SPI_RX_OCTAL)))
f477b7fb1   wangyuhang   spi: DUAL and QUA...
3198
  		return -EINVAL;
e7db06b5d   David Brownell   spi: move more sp...
3199
  	/* help drivers fail *cleanly* when they need options
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3200
  	 * that aren't supported with their current controller
cbaa62e00   David Lechner   spi: add software...
3201
3202
  	 * SPI_CS_WORD has a fallback software implementation,
  	 * so it is ignored here.
e7db06b5d   David Brownell   spi: move more sp...
3203
  	 */
cbaa62e00   David Lechner   spi: add software...
3204
  	bad_bits = spi->mode & ~(spi->controller->mode_bits | SPI_CS_WORD);
d61ad23cb   Serge Semin   spi: Clear SPI_CS...
3205
3206
3207
3208
3209
  	/* nothing prevents from working with active-high CS in case if it
  	 * is driven by GPIO.
  	 */
  	if (gpio_is_valid(spi->cs_gpio))
  		bad_bits &= ~SPI_CS_HIGH;
83596fbeb   Geert Uytterhoeven   spi: core: Ignore...
3210
  	ugly_bits = bad_bits &
6b03061f8   Yogesh Narayan Gaur   spi: add support ...
3211
3212
  		    (SPI_TX_DUAL | SPI_TX_QUAD | SPI_TX_OCTAL |
  		     SPI_RX_DUAL | SPI_RX_QUAD | SPI_RX_OCTAL);
83596fbeb   Geert Uytterhoeven   spi: core: Ignore...
3213
3214
3215
3216
3217
3218
3219
3220
  	if (ugly_bits) {
  		dev_warn(&spi->dev,
  			 "setup: ignoring unsupported mode bits %x
  ",
  			 ugly_bits);
  		spi->mode &= ~ugly_bits;
  		bad_bits &= ~ugly_bits;
  	}
e7db06b5d   David Brownell   spi: move more sp...
3221
  	if (bad_bits) {
eb288a1f4   Linus Walleij   spi: fixed odd st...
3222
3223
  		dev_err(&spi->dev, "setup: unsupported mode bits %x
  ",
e7db06b5d   David Brownell   spi: move more sp...
3224
3225
3226
  			bad_bits);
  		return -EINVAL;
  	}
7d0771970   David Brownell   spi: move common ...
3227
3228
  	if (!spi->bits_per_word)
  		spi->bits_per_word = 8;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3229
3230
  	status = __spi_validate_bits_per_word(spi->controller,
  					      spi->bits_per_word);
5ab8d2621   Andy Shevchenko   spi: core: propag...
3231
3232
  	if (status)
  		return status;
63ab645f4   Stefan Brüns   spi: check bits_p...
3233

052eb2d49   Axel Lin   spi: core: Set ma...
3234
  	if (!spi->max_speed_hz)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3235
  		spi->max_speed_hz = spi->controller->max_speed_hz;
052eb2d49   Axel Lin   spi: core: Set ma...
3236

4fae3a58a   Serge Semin   spi: Take the SPI...
3237
  	mutex_lock(&spi->controller->io_mutex);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3238
3239
  	if (spi->controller->setup)
  		status = spi->controller->setup(spi);
7d0771970   David Brownell   spi: move common ...
3240

d948e6ca1   Luhua Xu   spi: add power co...
3241
3242
3243
  	if (spi->controller->auto_runtime_pm && spi->controller->set_cs) {
  		status = pm_runtime_get_sync(spi->controller->dev.parent);
  		if (status < 0) {
4fae3a58a   Serge Semin   spi: Take the SPI...
3244
  			mutex_unlock(&spi->controller->io_mutex);
d948e6ca1   Luhua Xu   spi: add power co...
3245
3246
3247
3248
3249
3250
  			pm_runtime_put_noidle(spi->controller->dev.parent);
  			dev_err(&spi->controller->dev, "Failed to power device: %d
  ",
  				status);
  			return status;
  		}
57a946070   Tony Lindgren   spi: Fix regressi...
3251
3252
3253
3254
3255
3256
3257
3258
  
  		/*
  		 * We do not want to return positive value from pm_runtime_get,
  		 * there are many instances of devices calling spi_setup() and
  		 * checking for a non-zero return value instead of a negative
  		 * return value.
  		 */
  		status = 0;
d948e6ca1   Luhua Xu   spi: add power co...
3259
3260
3261
3262
3263
3264
  		spi_set_cs(spi, false);
  		pm_runtime_mark_last_busy(spi->controller->dev.parent);
  		pm_runtime_put_autosuspend(spi->controller->dev.parent);
  	} else {
  		spi_set_cs(spi, false);
  	}
abeedb015   Franklin S Cooper Jr   spi: Setup the ma...
3265

4fae3a58a   Serge Semin   spi: Take the SPI...
3266
  	mutex_unlock(&spi->controller->io_mutex);
924b5867e   Douglas Anderson   spi: Allow SPI de...
3267
3268
3269
3270
  	if (spi->rt && !spi->controller->rt) {
  		spi->controller->rt = true;
  		spi_set_thread_rt(spi->controller);
  	}
5fe5f05e2   Jingoo Han   spi: Fix checkpat...
3271
3272
  	dev_dbg(&spi->dev, "setup mode %d, %s%s%s%s%u bits/w, %u Hz max --> %d
  ",
7d0771970   David Brownell   spi: move common ...
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
  			(int) (spi->mode & (SPI_CPOL | SPI_CPHA)),
  			(spi->mode & SPI_CS_HIGH) ? "cs_high, " : "",
  			(spi->mode & SPI_LSB_FIRST) ? "lsb, " : "",
  			(spi->mode & SPI_3WIRE) ? "3wire, " : "",
  			(spi->mode & SPI_LOOP) ? "loopback, " : "",
  			spi->bits_per_word, spi->max_speed_hz,
  			status);
  
  	return status;
  }
  EXPORT_SYMBOL_GPL(spi_setup);
f1ca9992c   Sowjanya Komatineni   spi: add a method...
3284
3285
3286
  /**
   * spi_set_cs_timing - configure CS setup, hold, and inactive delays
   * @spi: the device that requires specific CS timing configuration
810593668   Alexandru Ardelean   spi: tegra114: ch...
3287
3288
3289
3290
3291
   * @setup: CS setup time specified via @spi_delay
   * @hold: CS hold time specified via @spi_delay
   * @inactive: CS inactive delay between transfers specified via @spi_delay
   *
   * Return: zero on success, else a negative error code.
f1ca9992c   Sowjanya Komatineni   spi: add a method...
3292
   */
810593668   Alexandru Ardelean   spi: tegra114: ch...
3293
3294
  int spi_set_cs_timing(struct spi_device *spi, struct spi_delay *setup,
  		      struct spi_delay *hold, struct spi_delay *inactive)
f1ca9992c   Sowjanya Komatineni   spi: add a method...
3295
  {
25093bdeb   Alexandru Ardelean   spi: implement SW...
3296
  	size_t len;
f1ca9992c   Sowjanya Komatineni   spi: add a method...
3297
  	if (spi->controller->set_cs_timing)
810593668   Alexandru Ardelean   spi: tegra114: ch...
3298
3299
  		return spi->controller->set_cs_timing(spi, setup, hold,
  						      inactive);
25093bdeb   Alexandru Ardelean   spi: implement SW...
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
  
  	if ((setup && setup->unit == SPI_DELAY_UNIT_SCK) ||
  	    (hold && hold->unit == SPI_DELAY_UNIT_SCK) ||
  	    (inactive && inactive->unit == SPI_DELAY_UNIT_SCK)) {
  		dev_err(&spi->dev,
  			"Clock-cycle delays for CS not supported in SW mode
  ");
  		return -ENOTSUPP;
  	}
  
  	len = sizeof(struct spi_delay);
  
  	/* copy delays to controller */
  	if (setup)
  		memcpy(&spi->controller->cs_setup, setup, len);
  	else
  		memset(&spi->controller->cs_setup, 0, len);
  
  	if (hold)
  		memcpy(&spi->controller->cs_hold, hold, len);
  	else
  		memset(&spi->controller->cs_hold, 0, len);
  
  	if (inactive)
  		memcpy(&spi->controller->cs_inactive, inactive, len);
  	else
  		memset(&spi->controller->cs_inactive, 0, len);
  
  	return 0;
f1ca9992c   Sowjanya Komatineni   spi: add a method...
3329
3330
  }
  EXPORT_SYMBOL_GPL(spi_set_cs_timing);
6c613f68a   Alexandru Ardelean   spi: core,atmel: ...
3331
3332
3333
3334
  static int _spi_xfer_word_delay_update(struct spi_transfer *xfer,
  				       struct spi_device *spi)
  {
  	int delay1, delay2;
3984d39b0   Alexandru Ardelean   spi: spi-fsl-espi...
3335
  	delay1 = spi_delay_to_ns(&xfer->word_delay, xfer);
6c613f68a   Alexandru Ardelean   spi: core,atmel: ...
3336
3337
  	if (delay1 < 0)
  		return delay1;
3984d39b0   Alexandru Ardelean   spi: spi-fsl-espi...
3338
  	delay2 = spi_delay_to_ns(&spi->word_delay, xfer);
6c613f68a   Alexandru Ardelean   spi: core,atmel: ...
3339
3340
3341
3342
3343
3344
3345
3346
3347
  	if (delay2 < 0)
  		return delay2;
  
  	if (delay1 < delay2)
  		memcpy(&xfer->word_delay, &spi->word_delay,
  		       sizeof(xfer->word_delay));
  
  	return 0;
  }
90808738f   Mark Brown   spi: Factor valid...
3348
  static int __spi_validate(struct spi_device *spi, struct spi_message *message)
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3349
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3350
  	struct spi_controller *ctlr = spi->controller;
e6811d1d7   Laxman Dewangan   spi: make sure al...
3351
  	struct spi_transfer *xfer;
6ea312936   Atsushi Nemoto   spi: core: make z...
3352
  	int w_size;
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3353

24a0013a0   Mark Brown   spi: More sanity ...
3354
3355
  	if (list_empty(&message->transfers))
  		return -EINVAL;
24a0013a0   Mark Brown   spi: More sanity ...
3356

cbaa62e00   David Lechner   spi: add software...
3357
  	/* If an SPI controller does not support toggling the CS line on each
71388b215   David Lechner   spi: always use s...
3358
3359
  	 * transfer (indicated by the SPI_CS_WORD flag) or we are using a GPIO
  	 * for the CS line, we can emulate the CS-per-word hardware function by
cbaa62e00   David Lechner   spi: add software...
3360
3361
3362
  	 * splitting transfers into one-word transfers and ensuring that
  	 * cs_change is set for each transfer.
  	 */
71388b215   David Lechner   spi: always use s...
3363
  	if ((spi->mode & SPI_CS_WORD) && (!(ctlr->mode_bits & SPI_CS_WORD) ||
f3186dd87   Linus Walleij   spi: Optionally u...
3364
  					  spi->cs_gpiod ||
71388b215   David Lechner   spi: always use s...
3365
  					  gpio_is_valid(spi->cs_gpio))) {
cbaa62e00   David Lechner   spi: add software...
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
  		size_t maxsize;
  		int ret;
  
  		maxsize = (spi->bits_per_word + 7) / 8;
  
  		/* spi_split_transfers_maxsize() requires message->spi */
  		message->spi = spi;
  
  		ret = spi_split_transfers_maxsize(ctlr, message, maxsize,
  						  GFP_KERNEL);
  		if (ret)
  			return ret;
  
  		list_for_each_entry(xfer, &message->transfers, transfer_list) {
  			/* don't change cs_change on the last entry in the list */
  			if (list_is_last(&xfer->transfer_list, &message->transfers))
  				break;
  			xfer->cs_change = 1;
  		}
  	}
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3386
3387
3388
3389
3390
  	/* Half-duplex links include original MicroWire, and ones with
  	 * only one data pin like SPI_3WIRE (switches direction) or where
  	 * either MOSI or MISO is missing.  They can also be caused by
  	 * software limitations.
  	 */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3391
3392
3393
  	if ((ctlr->flags & SPI_CONTROLLER_HALF_DUPLEX) ||
  	    (spi->mode & SPI_3WIRE)) {
  		unsigned flags = ctlr->flags;
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3394
3395
3396
3397
  
  		list_for_each_entry(xfer, &message->transfers, transfer_list) {
  			if (xfer->rx_buf && xfer->tx_buf)
  				return -EINVAL;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3398
  			if ((flags & SPI_CONTROLLER_NO_TX) && xfer->tx_buf)
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3399
  				return -EINVAL;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3400
  			if ((flags & SPI_CONTROLLER_NO_RX) && xfer->rx_buf)
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3401
3402
3403
  				return -EINVAL;
  		}
  	}
e6811d1d7   Laxman Dewangan   spi: make sure al...
3404
  	/**
059b8ffee   Laxman Dewangan   spi: make sure al...
3405
3406
  	 * Set transfer bits_per_word and max speed as spi device default if
  	 * it is not set for this transfer.
f477b7fb1   wangyuhang   spi: DUAL and QUA...
3407
3408
  	 * Set transfer tx_nbits and rx_nbits as single transfer default
  	 * (SPI_NBITS_SINGLE) if it is not set for this transfer.
b7bb367af   Jonas Bonn   spi: support inte...
3409
3410
  	 * Ensure transfer word_delay is at least as long as that required by
  	 * device itself.
e6811d1d7   Laxman Dewangan   spi: make sure al...
3411
  	 */
77e805881   Martin Sperl   spi: bugfix: spi_...
3412
  	message->frame_length = 0;
e6811d1d7   Laxman Dewangan   spi: make sure al...
3413
  	list_for_each_entry(xfer, &message->transfers, transfer_list) {
5d7e2b5ed   Martin Sperl   spi: core: allow ...
3414
  		xfer->effective_speed_hz = 0;
078726ce6   Sourav Poddar   driver: spi: Modi...
3415
  		message->frame_length += xfer->len;
e6811d1d7   Laxman Dewangan   spi: make sure al...
3416
3417
  		if (!xfer->bits_per_word)
  			xfer->bits_per_word = spi->bits_per_word;
a6f87fad7   Axel Lin   spi: core: Use ma...
3418
3419
  
  		if (!xfer->speed_hz)
059b8ffee   Laxman Dewangan   spi: make sure al...
3420
  			xfer->speed_hz = spi->max_speed_hz;
a6f87fad7   Axel Lin   spi: core: Use ma...
3421

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3422
3423
  		if (ctlr->max_speed_hz && xfer->speed_hz > ctlr->max_speed_hz)
  			xfer->speed_hz = ctlr->max_speed_hz;
56ede94a0   Gabor Juhos   spi: limit defaul...
3424

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3425
  		if (__spi_validate_bits_per_word(ctlr, xfer->bits_per_word))
63ab645f4   Stefan Brüns   spi: check bits_p...
3426
  			return -EINVAL;
a2fd4f9fa   Mark Brown   spi: Support tran...
3427

4d94bd21b   Ivan T. Ivanov   spi: core: Valida...
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
  		/*
  		 * SPI transfer length should be multiple of SPI word size
  		 * where SPI word size should be power-of-two multiple
  		 */
  		if (xfer->bits_per_word <= 8)
  			w_size = 1;
  		else if (xfer->bits_per_word <= 16)
  			w_size = 2;
  		else
  			w_size = 4;
4d94bd21b   Ivan T. Ivanov   spi: core: Valida...
3438
  		/* No partial transfers accepted */
6ea312936   Atsushi Nemoto   spi: core: make z...
3439
  		if (xfer->len % w_size)
4d94bd21b   Ivan T. Ivanov   spi: core: Valida...
3440
  			return -EINVAL;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3441
3442
  		if (xfer->speed_hz && ctlr->min_speed_hz &&
  		    xfer->speed_hz < ctlr->min_speed_hz)
a2fd4f9fa   Mark Brown   spi: Support tran...
3443
  			return -EINVAL;
f477b7fb1   wangyuhang   spi: DUAL and QUA...
3444
3445
3446
3447
3448
3449
  
  		if (xfer->tx_buf && !xfer->tx_nbits)
  			xfer->tx_nbits = SPI_NBITS_SINGLE;
  		if (xfer->rx_buf && !xfer->rx_nbits)
  			xfer->rx_nbits = SPI_NBITS_SINGLE;
  		/* check transfer tx/rx_nbits:
1afd9989a   Geert Uytterhoeven   spi: core: Improv...
3450
3451
  		 * 1. check the value matches one of single, dual and quad
  		 * 2. check tx/rx_nbits match the mode in spi_device
f477b7fb1   wangyuhang   spi: DUAL and QUA...
3452
  		 */
db90a4417   Sourav Poddar   spi: conditional ...
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
  		if (xfer->tx_buf) {
  			if (xfer->tx_nbits != SPI_NBITS_SINGLE &&
  				xfer->tx_nbits != SPI_NBITS_DUAL &&
  				xfer->tx_nbits != SPI_NBITS_QUAD)
  				return -EINVAL;
  			if ((xfer->tx_nbits == SPI_NBITS_DUAL) &&
  				!(spi->mode & (SPI_TX_DUAL | SPI_TX_QUAD)))
  				return -EINVAL;
  			if ((xfer->tx_nbits == SPI_NBITS_QUAD) &&
  				!(spi->mode & SPI_TX_QUAD))
  				return -EINVAL;
db90a4417   Sourav Poddar   spi: conditional ...
3464
  		}
f477b7fb1   wangyuhang   spi: DUAL and QUA...
3465
  		/* check transfer rx_nbits */
db90a4417   Sourav Poddar   spi: conditional ...
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
  		if (xfer->rx_buf) {
  			if (xfer->rx_nbits != SPI_NBITS_SINGLE &&
  				xfer->rx_nbits != SPI_NBITS_DUAL &&
  				xfer->rx_nbits != SPI_NBITS_QUAD)
  				return -EINVAL;
  			if ((xfer->rx_nbits == SPI_NBITS_DUAL) &&
  				!(spi->mode & (SPI_RX_DUAL | SPI_RX_QUAD)))
  				return -EINVAL;
  			if ((xfer->rx_nbits == SPI_NBITS_QUAD) &&
  				!(spi->mode & SPI_RX_QUAD))
  				return -EINVAL;
db90a4417   Sourav Poddar   spi: conditional ...
3477
  		}
b7bb367af   Jonas Bonn   spi: support inte...
3478

6c613f68a   Alexandru Ardelean   spi: core,atmel: ...
3479
3480
  		if (_spi_xfer_word_delay_update(xfer, spi))
  			return -EINVAL;
e6811d1d7   Laxman Dewangan   spi: make sure al...
3481
  	}
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3482
  	message->status = -EINPROGRESS;
90808738f   Mark Brown   spi: Factor valid...
3483
3484
3485
3486
3487
3488
  
  	return 0;
  }
  
  static int __spi_async(struct spi_device *spi, struct spi_message *message)
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3489
  	struct spi_controller *ctlr = spi->controller;
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
3490
  	struct spi_transfer *xfer;
90808738f   Mark Brown   spi: Factor valid...
3491

b5932f5c6   Boris Brezillon   spi: Make support...
3492
3493
3494
3495
3496
3497
  	/*
  	 * Some controllers do not support doing regular SPI transfers. Return
  	 * ENOTSUPP when this is the case.
  	 */
  	if (!ctlr->transfer)
  		return -ENOTSUPP;
90808738f   Mark Brown   spi: Factor valid...
3498
  	message->spi = spi;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3499
  	SPI_STATISTICS_INCREMENT_FIELD(&ctlr->statistics, spi_async);
eca2ebc7e   Martin Sperl   spi: expose spi_m...
3500
  	SPI_STATISTICS_INCREMENT_FIELD(&spi->statistics, spi_async);
90808738f   Mark Brown   spi: Factor valid...
3501
  	trace_spi_message_submit(message);
b42faeee7   Vladimir Oltean   spi: Add a PTP sy...
3502
3503
3504
3505
3506
3507
  	if (!ctlr->ptp_sts_supported) {
  		list_for_each_entry(xfer, &message->transfers, transfer_list) {
  			xfer->ptp_sts_word_pre = 0;
  			ptp_read_system_prets(xfer->ptp_sts);
  		}
  	}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3508
  	return ctlr->transfer(spi, message);
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3509
  }
568d0697f   David Brownell   spi: handle TX-on...
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
  /**
   * spi_async - asynchronous SPI transfer
   * @spi: device with which data will be exchanged
   * @message: describes the data transfers, including completion callback
   * Context: any (irqs may be blocked, etc)
   *
   * This call may be used in_irq and other contexts which can't sleep,
   * as well as from task contexts which can sleep.
   *
   * The completion callback is invoked in a context which can't sleep.
   * Before that invocation, the value of message->status is undefined.
   * When the callback is issued, message->status holds either zero (to
   * indicate complete success) or a negative error code.  After that
   * callback returns, the driver which issued the transfer request may
   * deallocate the associated memory; it's no longer in use by any SPI
   * core or controller driver code.
   *
   * Note that although all messages to a spi_device are handled in
   * FIFO order, messages may go to different devices in other orders.
   * Some device might be higher priority, or have various "hard" access
   * time requirements, for example.
   *
   * On detection of any fault during the transfer, processing of
   * the entire message is aborted, and the device is deselected.
   * Until returning from the associated message completion callback,
   * no other spi_message queued to that device will be processed.
   * (This rule applies equally to all the synchronous transfer calls,
   * which are wrappers around this core asynchronous primitive.)
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
3538
3539
   *
   * Return: zero on success, else a negative error code.
568d0697f   David Brownell   spi: handle TX-on...
3540
3541
3542
   */
  int spi_async(struct spi_device *spi, struct spi_message *message)
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3543
  	struct spi_controller *ctlr = spi->controller;
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3544
3545
  	int ret;
  	unsigned long flags;
568d0697f   David Brownell   spi: handle TX-on...
3546

90808738f   Mark Brown   spi: Factor valid...
3547
3548
3549
  	ret = __spi_validate(spi, message);
  	if (ret != 0)
  		return ret;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3550
  	spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags);
568d0697f   David Brownell   spi: handle TX-on...
3551

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3552
  	if (ctlr->bus_lock_flag)
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3553
3554
3555
  		ret = -EBUSY;
  	else
  		ret = __spi_async(spi, message);
568d0697f   David Brownell   spi: handle TX-on...
3556

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3557
  	spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3558
3559
  
  	return ret;
568d0697f   David Brownell   spi: handle TX-on...
3560
3561
  }
  EXPORT_SYMBOL_GPL(spi_async);
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
  /**
   * spi_async_locked - version of spi_async with exclusive bus usage
   * @spi: device with which data will be exchanged
   * @message: describes the data transfers, including completion callback
   * Context: any (irqs may be blocked, etc)
   *
   * This call may be used in_irq and other contexts which can't sleep,
   * as well as from task contexts which can sleep.
   *
   * The completion callback is invoked in a context which can't sleep.
   * Before that invocation, the value of message->status is undefined.
   * When the callback is issued, message->status holds either zero (to
   * indicate complete success) or a negative error code.  After that
   * callback returns, the driver which issued the transfer request may
   * deallocate the associated memory; it's no longer in use by any SPI
   * core or controller driver code.
   *
   * Note that although all messages to a spi_device are handled in
   * FIFO order, messages may go to different devices in other orders.
   * Some device might be higher priority, or have various "hard" access
   * time requirements, for example.
   *
   * On detection of any fault during the transfer, processing of
   * the entire message is aborted, and the device is deselected.
   * Until returning from the associated message completion callback,
   * no other spi_message queued to that device will be processed.
   * (This rule applies equally to all the synchronous transfer calls,
   * which are wrappers around this core asynchronous primitive.)
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
3590
3591
   *
   * Return: zero on success, else a negative error code.
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3592
3593
3594
   */
  int spi_async_locked(struct spi_device *spi, struct spi_message *message)
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3595
  	struct spi_controller *ctlr = spi->controller;
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3596
3597
  	int ret;
  	unsigned long flags;
90808738f   Mark Brown   spi: Factor valid...
3598
3599
3600
  	ret = __spi_validate(spi, message);
  	if (ret != 0)
  		return ret;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3601
  	spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags);
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3602
3603
  
  	ret = __spi_async(spi, message);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3604
  	spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3605
3606
3607
3608
3609
  
  	return ret;
  
  }
  EXPORT_SYMBOL_GPL(spi_async_locked);
7d0771970   David Brownell   spi: move common ...
3610
  /*-------------------------------------------------------------------------*/
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3611
  /* Utility methods for SPI protocol drivers, layered on
7d0771970   David Brownell   spi: move common ...
3612
3613
3614
   * top of the core.  Some other utility methods are defined as
   * inline functions.
   */
5d870c8e2   Andrew Morton   [PATCH] spi: remo...
3615
3616
3617
3618
  static void spi_complete(void *arg)
  {
  	complete(arg);
  }
ef4d96ec4   Mark Brown   spi: Split bus an...
3619
  static int __spi_sync(struct spi_device *spi, struct spi_message *message)
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3620
3621
3622
  {
  	DECLARE_COMPLETION_ONSTACK(done);
  	int status;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3623
  	struct spi_controller *ctlr = spi->controller;
0461a4149   Mark Brown   spi: Pump transfe...
3624
3625
3626
3627
3628
  	unsigned long flags;
  
  	status = __spi_validate(spi, message);
  	if (status != 0)
  		return status;
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3629
3630
3631
  
  	message->complete = spi_complete;
  	message->context = &done;
0461a4149   Mark Brown   spi: Pump transfe...
3632
  	message->spi = spi;
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3633

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3634
  	SPI_STATISTICS_INCREMENT_FIELD(&ctlr->statistics, spi_sync);
eca2ebc7e   Martin Sperl   spi: expose spi_m...
3635
  	SPI_STATISTICS_INCREMENT_FIELD(&spi->statistics, spi_sync);
0461a4149   Mark Brown   spi: Pump transfe...
3636
3637
3638
3639
3640
  	/* If we're not using the legacy transfer method then we will
  	 * try to transfer in the calling context so special case.
  	 * This code would be less tricky if we could remove the
  	 * support for driver implemented message queues.
  	 */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3641
3642
  	if (ctlr->transfer == spi_queued_transfer) {
  		spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags);
0461a4149   Mark Brown   spi: Pump transfe...
3643
3644
3645
3646
  
  		trace_spi_message_submit(message);
  
  		status = __spi_queued_transfer(spi, message, false);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3647
  		spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);
0461a4149   Mark Brown   spi: Pump transfe...
3648
3649
3650
  	} else {
  		status = spi_async_locked(spi, message);
  	}
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3651

cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3652
  	if (status == 0) {
0461a4149   Mark Brown   spi: Pump transfe...
3653
3654
3655
  		/* Push out the messages in the calling context if we
  		 * can.
  		 */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3656
3657
  		if (ctlr->transfer == spi_queued_transfer) {
  			SPI_STATISTICS_INCREMENT_FIELD(&ctlr->statistics,
eca2ebc7e   Martin Sperl   spi: expose spi_m...
3658
3659
3660
  						       spi_sync_immediate);
  			SPI_STATISTICS_INCREMENT_FIELD(&spi->statistics,
  						       spi_sync_immediate);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3661
  			__spi_pump_messages(ctlr, false);
eca2ebc7e   Martin Sperl   spi: expose spi_m...
3662
  		}
0461a4149   Mark Brown   spi: Pump transfe...
3663

cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3664
3665
3666
3667
3668
3669
  		wait_for_completion(&done);
  		status = message->status;
  	}
  	message->context = NULL;
  	return status;
  }
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3670
3671
3672
3673
  /**
   * spi_sync - blocking/synchronous SPI data transfers
   * @spi: device with which data will be exchanged
   * @message: describes the data transfers
33e34dc6e   David Brownell   SPI kerneldoc
3674
   * Context: can sleep
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
   *
   * This call may only be used from a context that may sleep.  The sleep
   * is non-interruptible, and has no timeout.  Low-overhead controller
   * drivers may DMA directly into and out of the message buffers.
   *
   * Note that the SPI device's chip select is active during the message,
   * and then is normally disabled between messages.  Drivers for some
   * frequently-used devices may want to minimize costs of selecting a chip,
   * by leaving it selected in anticipation that the next message will go
   * to the same chip.  (That may increase power usage.)
   *
0c868461f   David Brownell   [PATCH] SPI core ...
3686
3687
3688
   * Also, the caller is guaranteeing that the memory associated with the
   * message will not be freed before this call returns.
   *
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
3689
   * Return: zero on success, else a negative error code.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3690
3691
3692
   */
  int spi_sync(struct spi_device *spi, struct spi_message *message)
  {
ef4d96ec4   Mark Brown   spi: Split bus an...
3693
  	int ret;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3694
  	mutex_lock(&spi->controller->bus_lock_mutex);
ef4d96ec4   Mark Brown   spi: Split bus an...
3695
  	ret = __spi_sync(spi, message);
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3696
  	mutex_unlock(&spi->controller->bus_lock_mutex);
ef4d96ec4   Mark Brown   spi: Split bus an...
3697
3698
  
  	return ret;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3699
3700
  }
  EXPORT_SYMBOL_GPL(spi_sync);
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
  /**
   * spi_sync_locked - version of spi_sync with exclusive bus usage
   * @spi: device with which data will be exchanged
   * @message: describes the data transfers
   * Context: can sleep
   *
   * This call may only be used from a context that may sleep.  The sleep
   * is non-interruptible, and has no timeout.  Low-overhead controller
   * drivers may DMA directly into and out of the message buffers.
   *
   * This call should be used by drivers that require exclusive access to the
25985edce   Lucas De Marchi   Fix common misspe...
3712
   * SPI bus. It has to be preceded by a spi_bus_lock call. The SPI bus must
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3713
3714
   * be released by a spi_bus_unlock call when the exclusive access is over.
   *
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
3715
   * Return: zero on success, else a negative error code.
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3716
3717
3718
   */
  int spi_sync_locked(struct spi_device *spi, struct spi_message *message)
  {
ef4d96ec4   Mark Brown   spi: Split bus an...
3719
  	return __spi_sync(spi, message);
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3720
3721
3722
3723
3724
  }
  EXPORT_SYMBOL_GPL(spi_sync_locked);
  
  /**
   * spi_bus_lock - obtain a lock for exclusive SPI bus usage
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3725
   * @ctlr: SPI bus master that should be locked for exclusive bus access
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
   * Context: can sleep
   *
   * This call may only be used from a context that may sleep.  The sleep
   * is non-interruptible, and has no timeout.
   *
   * This call should be used by drivers that require exclusive access to the
   * SPI bus. The SPI bus must be released by a spi_bus_unlock call when the
   * exclusive access is over. Data transfer must be done by spi_sync_locked
   * and spi_async_locked calls when the SPI bus lock is held.
   *
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
3736
   * Return: always zero.
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3737
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3738
  int spi_bus_lock(struct spi_controller *ctlr)
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3739
3740
  {
  	unsigned long flags;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3741
  	mutex_lock(&ctlr->bus_lock_mutex);
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3742

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3743
3744
3745
  	spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags);
  	ctlr->bus_lock_flag = 1;
  	spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3746
3747
3748
3749
3750
3751
3752
3753
3754
  
  	/* mutex remains locked until spi_bus_unlock is called */
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(spi_bus_lock);
  
  /**
   * spi_bus_unlock - release the lock for exclusive SPI bus usage
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3755
   * @ctlr: SPI bus master that was locked for exclusive bus access
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3756
3757
3758
3759
3760
3761
3762
3763
   * Context: can sleep
   *
   * This call may only be used from a context that may sleep.  The sleep
   * is non-interruptible, and has no timeout.
   *
   * This call releases an SPI bus lock previously obtained by an spi_bus_lock
   * call.
   *
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
3764
   * Return: always zero.
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3765
   */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3766
  int spi_bus_unlock(struct spi_controller *ctlr)
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3767
  {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3768
  	ctlr->bus_lock_flag = 0;
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3769

8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3770
  	mutex_unlock(&ctlr->bus_lock_mutex);
cf32b71e9   Ernst Schwab   spi/mmc_spi: SPI ...
3771
3772
3773
3774
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(spi_bus_unlock);
a9948b619   David Brownell   [PATCH] SPI: spi ...
3775
  /* portable code must never pass more than 32 bytes */
5fe5f05e2   Jingoo Han   spi: Fix checkpat...
3776
  #define	SPI_BUFSIZ	max(32, SMP_CACHE_BYTES)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3777
3778
3779
3780
3781
3782
3783
3784
  
  static u8	*buf;
  
  /**
   * spi_write_then_read - SPI synchronous write followed by read
   * @spi: device with which data will be exchanged
   * @txbuf: data to be written (need not be dma-safe)
   * @n_tx: size of txbuf, in bytes
275704970   Jiri Pirko   spi: fix spi_writ...
3785
3786
   * @rxbuf: buffer into which data will be read (need not be dma-safe)
   * @n_rx: size of rxbuf, in bytes
33e34dc6e   David Brownell   SPI kerneldoc
3787
   * Context: can sleep
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3788
3789
3790
3791
   *
   * This performs a half duplex MicroWire style transaction with the
   * device, sending txbuf and then reading rxbuf.  The return value
   * is zero for success, else a negative errno status code.
b885244eb   David Brownell   [PATCH] spi: add ...
3792
   * This call may only be used from a context that may sleep.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3793
   *
c373643b8   Mark Brown   spi: Remove note ...
3794
   * Parameters to this routine are always copied using a small buffer.
33e34dc6e   David Brownell   SPI kerneldoc
3795
   * Performance-sensitive or bulk transfer code should instead use
0c868461f   David Brownell   [PATCH] SPI core ...
3796
   * spi_{async,sync}() calls with dma-safe buffers.
97d56dc68   Javier Martinez Canillas   spi: fix kernel-d...
3797
3798
   *
   * Return: zero on success, else a negative error code.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3799
3800
   */
  int spi_write_then_read(struct spi_device *spi,
0c4a15901   Mark Brown   spi: Use void poi...
3801
3802
  		const void *txbuf, unsigned n_tx,
  		void *rxbuf, unsigned n_rx)
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3803
  {
068f40708   David Brownell   SPI: use mutex no...
3804
  	static DEFINE_MUTEX(lock);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3805
3806
3807
  
  	int			status;
  	struct spi_message	message;
bdff549eb   David Brownell   spi: spi_write_th...
3808
  	struct spi_transfer	x[2];
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3809
  	u8			*local_buf;
b3a223ee2   Mark Brown   spi: Remove SPI_B...
3810
3811
3812
3813
  	/* Use preallocated DMA-safe buffer if we can.  We can't avoid
  	 * copying here, (as a pure convenience thing), but we can
  	 * keep heap costs out of the hot path unless someone else is
  	 * using the pre-allocated buffer or the transfer is too large.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3814
  	 */
b3a223ee2   Mark Brown   spi: Remove SPI_B...
3815
  	if ((n_tx + n_rx) > SPI_BUFSIZ || !mutex_trylock(&lock)) {
2cd94c8a1   Mark Brown   spi: Ensure memor...
3816
3817
  		local_buf = kmalloc(max((unsigned)SPI_BUFSIZ, n_tx + n_rx),
  				    GFP_KERNEL | GFP_DMA);
b3a223ee2   Mark Brown   spi: Remove SPI_B...
3818
3819
3820
3821
3822
  		if (!local_buf)
  			return -ENOMEM;
  	} else {
  		local_buf = buf;
  	}
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3823

8275c642c   Vitaly Wool   [PATCH] spi: use ...
3824
  	spi_message_init(&message);
5fe5f05e2   Jingoo Han   spi: Fix checkpat...
3825
  	memset(x, 0, sizeof(x));
bdff549eb   David Brownell   spi: spi_write_th...
3826
3827
3828
3829
3830
3831
3832
3833
  	if (n_tx) {
  		x[0].len = n_tx;
  		spi_message_add_tail(&x[0], &message);
  	}
  	if (n_rx) {
  		x[1].len = n_rx;
  		spi_message_add_tail(&x[1], &message);
  	}
8275c642c   Vitaly Wool   [PATCH] spi: use ...
3834

8ae12a0d8   David Brownell   [PATCH] spi: simp...
3835
  	memcpy(local_buf, txbuf, n_tx);
bdff549eb   David Brownell   spi: spi_write_th...
3836
3837
  	x[0].tx_buf = local_buf;
  	x[1].rx_buf = local_buf + n_tx;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3838
3839
  
  	/* do the i/o */
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3840
  	status = spi_sync(spi, &message);
9b938b749   Marc Pignat   spi: simplify spi...
3841
  	if (status == 0)
bdff549eb   David Brownell   spi: spi_write_th...
3842
  		memcpy(rxbuf, x[1].rx_buf, n_rx);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3843

bdff549eb   David Brownell   spi: spi_write_th...
3844
  	if (x[0].tx_buf == buf)
068f40708   David Brownell   SPI: use mutex no...
3845
  		mutex_unlock(&lock);
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3846
3847
3848
3849
3850
3851
3852
3853
  	else
  		kfree(local_buf);
  
  	return status;
  }
  EXPORT_SYMBOL_GPL(spi_write_then_read);
  
  /*-------------------------------------------------------------------------*/
5f143af75   Marco Felsch   spi: make OF help...
3854
  #if IS_ENABLED(CONFIG_OF)
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3855
  /* must call put_device() when done with returned spi_device device */
5f143af75   Marco Felsch   spi: make OF help...
3856
  struct spi_device *of_find_spi_device_by_node(struct device_node *node)
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3857
  {
cfba5de9b   Suzuki K Poulose   drivers: Introduc...
3858
  	struct device *dev = bus_find_device_by_of_node(&spi_bus_type, node);
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3859
3860
  	return dev ? to_spi_device(dev) : NULL;
  }
5f143af75   Marco Felsch   spi: make OF help...
3861
3862
  EXPORT_SYMBOL_GPL(of_find_spi_device_by_node);
  #endif /* IS_ENABLED(CONFIG_OF) */
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3863

5f143af75   Marco Felsch   spi: make OF help...
3864
  #if IS_ENABLED(CONFIG_OF_DYNAMIC)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3865
3866
  /* the spi controllers are not using spi_bus, so we find it with another way */
  static struct spi_controller *of_find_spi_controller_by_node(struct device_node *node)
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3867
3868
  {
  	struct device *dev;
cfba5de9b   Suzuki K Poulose   drivers: Introduc...
3869
  	dev = class_find_device_by_of_node(&spi_master_class, node);
6c364062b   Geert Uytterhoeven   spi: core: Add su...
3870
  	if (!dev && IS_ENABLED(CONFIG_SPI_SLAVE))
cfba5de9b   Suzuki K Poulose   drivers: Introduc...
3871
  		dev = class_find_device_by_of_node(&spi_slave_class, node);
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3872
3873
3874
3875
  	if (!dev)
  		return NULL;
  
  	/* reference got in class_find_device */
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3876
  	return container_of(dev, struct spi_controller, dev);
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3877
3878
3879
3880
3881
3882
  }
  
  static int of_spi_notify(struct notifier_block *nb, unsigned long action,
  			 void *arg)
  {
  	struct of_reconfig_data *rd = arg;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3883
  	struct spi_controller *ctlr;
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3884
3885
3886
3887
  	struct spi_device *spi;
  
  	switch (of_reconfig_get_state_change(action, arg)) {
  	case OF_RECONFIG_CHANGE_ADD:
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3888
3889
  		ctlr = of_find_spi_controller_by_node(rd->dn->parent);
  		if (ctlr == NULL)
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3890
  			return NOTIFY_OK;	/* not for us */
bd6c1644a   Geert Uytterhoeven   spi: Mark instant...
3891
  		if (of_node_test_and_set_flag(rd->dn, OF_POPULATED)) {
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3892
  			put_device(&ctlr->dev);
bd6c1644a   Geert Uytterhoeven   spi: Mark instant...
3893
3894
  			return NOTIFY_OK;
  		}
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3895
3896
  		spi = of_register_spi_device(ctlr, rd->dn);
  		put_device(&ctlr->dev);
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3897
3898
  
  		if (IS_ERR(spi)) {
25c56c88a   Rob Herring   spi: Convert to u...
3899
3900
3901
  			pr_err("%s: failed to create for '%pOF'
  ",
  					__func__, rd->dn);
e0af98a7e   Ralf Ramsauer   spi: mark device ...
3902
  			of_node_clear_flag(rd->dn, OF_POPULATED);
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3903
3904
3905
3906
3907
  			return notifier_from_errno(PTR_ERR(spi));
  		}
  		break;
  
  	case OF_RECONFIG_CHANGE_REMOVE:
bd6c1644a   Geert Uytterhoeven   spi: Mark instant...
3908
3909
3910
  		/* already depopulated? */
  		if (!of_node_check_flag(rd->dn, OF_POPULATED))
  			return NOTIFY_OK;
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
  		/* find our device by node */
  		spi = of_find_spi_device_by_node(rd->dn);
  		if (spi == NULL)
  			return NOTIFY_OK;	/* no? not meant for us */
  
  		/* unregister takes one ref away */
  		spi_unregister_device(spi);
  
  		/* and put the reference of the find */
  		put_device(&spi->dev);
  		break;
  	}
  
  	return NOTIFY_OK;
  }
  
  static struct notifier_block spi_of_notifier = {
  	.notifier_call = of_spi_notify,
  };
  #else /* IS_ENABLED(CONFIG_OF_DYNAMIC) */
  extern struct notifier_block spi_of_notifier;
  #endif /* IS_ENABLED(CONFIG_OF_DYNAMIC) */
7f24467f3   Octavian Purdila   spi / ACPI: add s...
3933
  #if IS_ENABLED(CONFIG_ACPI)
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3934
  static int spi_acpi_controller_match(struct device *dev, const void *data)
7f24467f3   Octavian Purdila   spi / ACPI: add s...
3935
3936
3937
  {
  	return ACPI_COMPANION(dev->parent) == data;
  }
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3938
  static struct spi_controller *acpi_spi_find_controller_by_adev(struct acpi_device *adev)
7f24467f3   Octavian Purdila   spi / ACPI: add s...
3939
3940
3941
3942
  {
  	struct device *dev;
  
  	dev = class_find_device(&spi_master_class, NULL, adev,
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3943
  				spi_acpi_controller_match);
6c364062b   Geert Uytterhoeven   spi: core: Add su...
3944
3945
  	if (!dev && IS_ENABLED(CONFIG_SPI_SLAVE))
  		dev = class_find_device(&spi_slave_class, NULL, adev,
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3946
  					spi_acpi_controller_match);
7f24467f3   Octavian Purdila   spi / ACPI: add s...
3947
3948
  	if (!dev)
  		return NULL;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3949
  	return container_of(dev, struct spi_controller, dev);
7f24467f3   Octavian Purdila   spi / ACPI: add s...
3950
3951
3952
3953
3954
  }
  
  static struct spi_device *acpi_spi_find_device_by_adev(struct acpi_device *adev)
  {
  	struct device *dev;
00500147c   Suzuki K Poulose   drivers: Introduc...
3955
  	dev = bus_find_device_by_acpi_dev(&spi_bus_type, adev);
5b16668e6   Wolfram Sang   spi: acpi: remove...
3956
  	return to_spi_device(dev);
7f24467f3   Octavian Purdila   spi / ACPI: add s...
3957
3958
3959
3960
3961
3962
  }
  
  static int acpi_spi_notify(struct notifier_block *nb, unsigned long value,
  			   void *arg)
  {
  	struct acpi_device *adev = arg;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3963
  	struct spi_controller *ctlr;
7f24467f3   Octavian Purdila   spi / ACPI: add s...
3964
3965
3966
3967
  	struct spi_device *spi;
  
  	switch (value) {
  	case ACPI_RECONFIG_DEVICE_ADD:
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3968
3969
  		ctlr = acpi_spi_find_controller_by_adev(adev->parent);
  		if (!ctlr)
7f24467f3   Octavian Purdila   spi / ACPI: add s...
3970
  			break;
8caab75fd   Geert Uytterhoeven   spi: Generalize S...
3971
3972
  		acpi_register_spi_device(ctlr, adev);
  		put_device(&ctlr->dev);
7f24467f3   Octavian Purdila   spi / ACPI: add s...
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
  		break;
  	case ACPI_RECONFIG_DEVICE_REMOVE:
  		if (!acpi_device_enumerated(adev))
  			break;
  
  		spi = acpi_spi_find_device_by_adev(adev);
  		if (!spi)
  			break;
  
  		spi_unregister_device(spi);
  		put_device(&spi->dev);
  		break;
  	}
  
  	return NOTIFY_OK;
  }
  
  static struct notifier_block spi_acpi_notifier = {
  	.notifier_call = acpi_spi_notify,
  };
  #else
  extern struct notifier_block spi_acpi_notifier;
  #endif
8ae12a0d8   David Brownell   [PATCH] spi: simp...
3996
3997
  static int __init spi_init(void)
  {
b885244eb   David Brownell   [PATCH] spi: add ...
3998
  	int	status;
e94b17660   Christoph Lameter   [PATCH] slab: rem...
3999
  	buf = kmalloc(SPI_BUFSIZ, GFP_KERNEL);
b885244eb   David Brownell   [PATCH] spi: add ...
4000
4001
4002
4003
4004
4005
4006
4007
  	if (!buf) {
  		status = -ENOMEM;
  		goto err0;
  	}
  
  	status = bus_register(&spi_bus_type);
  	if (status < 0)
  		goto err1;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
4008

b885244eb   David Brownell   [PATCH] spi: add ...
4009
4010
4011
  	status = class_register(&spi_master_class);
  	if (status < 0)
  		goto err2;
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
4012

6c364062b   Geert Uytterhoeven   spi: core: Add su...
4013
4014
4015
4016
4017
  	if (IS_ENABLED(CONFIG_SPI_SLAVE)) {
  		status = class_register(&spi_slave_class);
  		if (status < 0)
  			goto err3;
  	}
5267720e7   Fabio Estevam   spi: Check for sp...
4018
  	if (IS_ENABLED(CONFIG_OF_DYNAMIC))
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
4019
  		WARN_ON(of_reconfig_notifier_register(&spi_of_notifier));
7f24467f3   Octavian Purdila   spi / ACPI: add s...
4020
4021
  	if (IS_ENABLED(CONFIG_ACPI))
  		WARN_ON(acpi_reconfig_notifier_register(&spi_acpi_notifier));
ce79d54ae   Pantelis Antoniou   spi/of: Add OF no...
4022

8ae12a0d8   David Brownell   [PATCH] spi: simp...
4023
  	return 0;
b885244eb   David Brownell   [PATCH] spi: add ...
4024

6c364062b   Geert Uytterhoeven   spi: core: Add su...
4025
4026
  err3:
  	class_unregister(&spi_master_class);
b885244eb   David Brownell   [PATCH] spi: add ...
4027
4028
4029
4030
4031
4032
4033
  err2:
  	bus_unregister(&spi_bus_type);
  err1:
  	kfree(buf);
  	buf = NULL;
  err0:
  	return status;
8ae12a0d8   David Brownell   [PATCH] spi: simp...
4034
  }
b885244eb   David Brownell   [PATCH] spi: add ...
4035

8ae12a0d8   David Brownell   [PATCH] spi: simp...
4036
4037
  /* board_info is normally registered in arch_initcall(),
   * but even essential drivers wait till later
b885244eb   David Brownell   [PATCH] spi: add ...
4038
4039
4040
4041
   *
   * REVISIT only boardinfo really needs static linking. the rest (device and
   * driver registration) _could_ be dynamically linked (modular) ... costs
   * include needing to have boardinfo data structures be much more public.
8ae12a0d8   David Brownell   [PATCH] spi: simp...
4042
   */
673c0c003   David Brownell   spi: core and gpi...
4043
  postcore_initcall(spi_init);