xref: /kernel/linux/linux-6.6/drivers/spi/spi.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci// SPI init/core code
362306a36Sopenharmony_ci//
462306a36Sopenharmony_ci// Copyright (C) 2005 David Brownell
562306a36Sopenharmony_ci// Copyright (C) 2008 Secret Lab Technologies Ltd.
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/acpi.h>
862306a36Sopenharmony_ci#include <linux/cache.h>
962306a36Sopenharmony_ci#include <linux/clk/clk-conf.h>
1062306a36Sopenharmony_ci#include <linux/delay.h>
1162306a36Sopenharmony_ci#include <linux/device.h>
1262306a36Sopenharmony_ci#include <linux/dmaengine.h>
1362306a36Sopenharmony_ci#include <linux/dma-mapping.h>
1462306a36Sopenharmony_ci#include <linux/export.h>
1562306a36Sopenharmony_ci#include <linux/gpio/consumer.h>
1662306a36Sopenharmony_ci#include <linux/highmem.h>
1762306a36Sopenharmony_ci#include <linux/idr.h>
1862306a36Sopenharmony_ci#include <linux/init.h>
1962306a36Sopenharmony_ci#include <linux/ioport.h>
2062306a36Sopenharmony_ci#include <linux/kernel.h>
2162306a36Sopenharmony_ci#include <linux/kthread.h>
2262306a36Sopenharmony_ci#include <linux/mod_devicetable.h>
2362306a36Sopenharmony_ci#include <linux/mutex.h>
2462306a36Sopenharmony_ci#include <linux/of_device.h>
2562306a36Sopenharmony_ci#include <linux/of_irq.h>
2662306a36Sopenharmony_ci#include <linux/percpu.h>
2762306a36Sopenharmony_ci#include <linux/platform_data/x86/apple.h>
2862306a36Sopenharmony_ci#include <linux/pm_domain.h>
2962306a36Sopenharmony_ci#include <linux/pm_runtime.h>
3062306a36Sopenharmony_ci#include <linux/property.h>
3162306a36Sopenharmony_ci#include <linux/ptp_clock_kernel.h>
3262306a36Sopenharmony_ci#include <linux/sched/rt.h>
3362306a36Sopenharmony_ci#include <linux/slab.h>
3462306a36Sopenharmony_ci#include <linux/spi/spi.h>
3562306a36Sopenharmony_ci#include <linux/spi/spi-mem.h>
3662306a36Sopenharmony_ci#include <uapi/linux/sched/types.h>
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define CREATE_TRACE_POINTS
3962306a36Sopenharmony_ci#include <trace/events/spi.h>
4062306a36Sopenharmony_ciEXPORT_TRACEPOINT_SYMBOL(spi_transfer_start);
4162306a36Sopenharmony_ciEXPORT_TRACEPOINT_SYMBOL(spi_transfer_stop);
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#include "internals.h"
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic DEFINE_IDR(spi_master_idr);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistatic void spidev_release(struct device *dev)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	struct spi_device	*spi = to_spi_device(dev);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	spi_controller_put(spi->controller);
5262306a36Sopenharmony_ci	kfree(spi->driver_override);
5362306a36Sopenharmony_ci	free_percpu(spi->pcpu_statistics);
5462306a36Sopenharmony_ci	kfree(spi);
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic ssize_t
5862306a36Sopenharmony_cimodalias_show(struct device *dev, struct device_attribute *a, char *buf)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	const struct spi_device	*spi = to_spi_device(dev);
6162306a36Sopenharmony_ci	int len;
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	len = acpi_device_modalias(dev, buf, PAGE_SIZE - 1);
6462306a36Sopenharmony_ci	if (len != -ENODEV)
6562306a36Sopenharmony_ci		return len;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	return sysfs_emit(buf, "%s%s\n", SPI_MODULE_PREFIX, spi->modalias);
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_cistatic DEVICE_ATTR_RO(modalias);
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistatic ssize_t driver_override_store(struct device *dev,
7262306a36Sopenharmony_ci				     struct device_attribute *a,
7362306a36Sopenharmony_ci				     const char *buf, size_t count)
7462306a36Sopenharmony_ci{
7562306a36Sopenharmony_ci	struct spi_device *spi = to_spi_device(dev);
7662306a36Sopenharmony_ci	int ret;
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	ret = driver_set_override(dev, &spi->driver_override, buf, count);
7962306a36Sopenharmony_ci	if (ret)
8062306a36Sopenharmony_ci		return ret;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	return count;
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistatic ssize_t driver_override_show(struct device *dev,
8662306a36Sopenharmony_ci				    struct device_attribute *a, char *buf)
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci	const struct spi_device *spi = to_spi_device(dev);
8962306a36Sopenharmony_ci	ssize_t len;
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	device_lock(dev);
9262306a36Sopenharmony_ci	len = sysfs_emit(buf, "%s\n", spi->driver_override ? : "");
9362306a36Sopenharmony_ci	device_unlock(dev);
9462306a36Sopenharmony_ci	return len;
9562306a36Sopenharmony_ci}
9662306a36Sopenharmony_cistatic DEVICE_ATTR_RW(driver_override);
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic struct spi_statistics __percpu *spi_alloc_pcpu_stats(struct device *dev)
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci	struct spi_statistics __percpu *pcpu_stats;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	if (dev)
10362306a36Sopenharmony_ci		pcpu_stats = devm_alloc_percpu(dev, struct spi_statistics);
10462306a36Sopenharmony_ci	else
10562306a36Sopenharmony_ci		pcpu_stats = alloc_percpu_gfp(struct spi_statistics, GFP_KERNEL);
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	if (pcpu_stats) {
10862306a36Sopenharmony_ci		int cpu;
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci		for_each_possible_cpu(cpu) {
11162306a36Sopenharmony_ci			struct spi_statistics *stat;
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci			stat = per_cpu_ptr(pcpu_stats, cpu);
11462306a36Sopenharmony_ci			u64_stats_init(&stat->syncp);
11562306a36Sopenharmony_ci		}
11662306a36Sopenharmony_ci	}
11762306a36Sopenharmony_ci	return pcpu_stats;
11862306a36Sopenharmony_ci}
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistatic ssize_t spi_emit_pcpu_stats(struct spi_statistics __percpu *stat,
12162306a36Sopenharmony_ci				   char *buf, size_t offset)
12262306a36Sopenharmony_ci{
12362306a36Sopenharmony_ci	u64 val = 0;
12462306a36Sopenharmony_ci	int i;
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	for_each_possible_cpu(i) {
12762306a36Sopenharmony_ci		const struct spi_statistics *pcpu_stats;
12862306a36Sopenharmony_ci		u64_stats_t *field;
12962306a36Sopenharmony_ci		unsigned int start;
13062306a36Sopenharmony_ci		u64 inc;
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci		pcpu_stats = per_cpu_ptr(stat, i);
13362306a36Sopenharmony_ci		field = (void *)pcpu_stats + offset;
13462306a36Sopenharmony_ci		do {
13562306a36Sopenharmony_ci			start = u64_stats_fetch_begin(&pcpu_stats->syncp);
13662306a36Sopenharmony_ci			inc = u64_stats_read(field);
13762306a36Sopenharmony_ci		} while (u64_stats_fetch_retry(&pcpu_stats->syncp, start));
13862306a36Sopenharmony_ci		val += inc;
13962306a36Sopenharmony_ci	}
14062306a36Sopenharmony_ci	return sysfs_emit(buf, "%llu\n", val);
14162306a36Sopenharmony_ci}
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci#define SPI_STATISTICS_ATTRS(field, file)				\
14462306a36Sopenharmony_cistatic ssize_t spi_controller_##field##_show(struct device *dev,	\
14562306a36Sopenharmony_ci					     struct device_attribute *attr, \
14662306a36Sopenharmony_ci					     char *buf)			\
14762306a36Sopenharmony_ci{									\
14862306a36Sopenharmony_ci	struct spi_controller *ctlr = container_of(dev,			\
14962306a36Sopenharmony_ci					 struct spi_controller, dev);	\
15062306a36Sopenharmony_ci	return spi_statistics_##field##_show(ctlr->pcpu_statistics, buf); \
15162306a36Sopenharmony_ci}									\
15262306a36Sopenharmony_cistatic struct device_attribute dev_attr_spi_controller_##field = {	\
15362306a36Sopenharmony_ci	.attr = { .name = file, .mode = 0444 },				\
15462306a36Sopenharmony_ci	.show = spi_controller_##field##_show,				\
15562306a36Sopenharmony_ci};									\
15662306a36Sopenharmony_cistatic ssize_t spi_device_##field##_show(struct device *dev,		\
15762306a36Sopenharmony_ci					 struct device_attribute *attr,	\
15862306a36Sopenharmony_ci					char *buf)			\
15962306a36Sopenharmony_ci{									\
16062306a36Sopenharmony_ci	struct spi_device *spi = to_spi_device(dev);			\
16162306a36Sopenharmony_ci	return spi_statistics_##field##_show(spi->pcpu_statistics, buf); \
16262306a36Sopenharmony_ci}									\
16362306a36Sopenharmony_cistatic struct device_attribute dev_attr_spi_device_##field = {		\
16462306a36Sopenharmony_ci	.attr = { .name = file, .mode = 0444 },				\
16562306a36Sopenharmony_ci	.show = spi_device_##field##_show,				\
16662306a36Sopenharmony_ci}
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci#define SPI_STATISTICS_SHOW_NAME(name, file, field)			\
16962306a36Sopenharmony_cistatic ssize_t spi_statistics_##name##_show(struct spi_statistics __percpu *stat, \
17062306a36Sopenharmony_ci					    char *buf)			\
17162306a36Sopenharmony_ci{									\
17262306a36Sopenharmony_ci	return spi_emit_pcpu_stats(stat, buf,				\
17362306a36Sopenharmony_ci			offsetof(struct spi_statistics, field));	\
17462306a36Sopenharmony_ci}									\
17562306a36Sopenharmony_ciSPI_STATISTICS_ATTRS(name, file)
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci#define SPI_STATISTICS_SHOW(field)					\
17862306a36Sopenharmony_ci	SPI_STATISTICS_SHOW_NAME(field, __stringify(field),		\
17962306a36Sopenharmony_ci				 field)
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ciSPI_STATISTICS_SHOW(messages);
18262306a36Sopenharmony_ciSPI_STATISTICS_SHOW(transfers);
18362306a36Sopenharmony_ciSPI_STATISTICS_SHOW(errors);
18462306a36Sopenharmony_ciSPI_STATISTICS_SHOW(timedout);
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ciSPI_STATISTICS_SHOW(spi_sync);
18762306a36Sopenharmony_ciSPI_STATISTICS_SHOW(spi_sync_immediate);
18862306a36Sopenharmony_ciSPI_STATISTICS_SHOW(spi_async);
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ciSPI_STATISTICS_SHOW(bytes);
19162306a36Sopenharmony_ciSPI_STATISTICS_SHOW(bytes_rx);
19262306a36Sopenharmony_ciSPI_STATISTICS_SHOW(bytes_tx);
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci#define SPI_STATISTICS_TRANSFER_BYTES_HISTO(index, number)		\
19562306a36Sopenharmony_ci	SPI_STATISTICS_SHOW_NAME(transfer_bytes_histo##index,		\
19662306a36Sopenharmony_ci				 "transfer_bytes_histo_" number,	\
19762306a36Sopenharmony_ci				 transfer_bytes_histo[index])
19862306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(0,  "0-1");
19962306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(1,  "2-3");
20062306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(2,  "4-7");
20162306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(3,  "8-15");
20262306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(4,  "16-31");
20362306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(5,  "32-63");
20462306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(6,  "64-127");
20562306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(7,  "128-255");
20662306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(8,  "256-511");
20762306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(9,  "512-1023");
20862306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(10, "1024-2047");
20962306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(11, "2048-4095");
21062306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(12, "4096-8191");
21162306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(13, "8192-16383");
21262306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(14, "16384-32767");
21362306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(15, "32768-65535");
21462306a36Sopenharmony_ciSPI_STATISTICS_TRANSFER_BYTES_HISTO(16, "65536+");
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ciSPI_STATISTICS_SHOW(transfers_split_maxsize);
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_cistatic struct attribute *spi_dev_attrs[] = {
21962306a36Sopenharmony_ci	&dev_attr_modalias.attr,
22062306a36Sopenharmony_ci	&dev_attr_driver_override.attr,
22162306a36Sopenharmony_ci	NULL,
22262306a36Sopenharmony_ci};
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_cistatic const struct attribute_group spi_dev_group = {
22562306a36Sopenharmony_ci	.attrs  = spi_dev_attrs,
22662306a36Sopenharmony_ci};
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_cistatic struct attribute *spi_device_statistics_attrs[] = {
22962306a36Sopenharmony_ci	&dev_attr_spi_device_messages.attr,
23062306a36Sopenharmony_ci	&dev_attr_spi_device_transfers.attr,
23162306a36Sopenharmony_ci	&dev_attr_spi_device_errors.attr,
23262306a36Sopenharmony_ci	&dev_attr_spi_device_timedout.attr,
23362306a36Sopenharmony_ci	&dev_attr_spi_device_spi_sync.attr,
23462306a36Sopenharmony_ci	&dev_attr_spi_device_spi_sync_immediate.attr,
23562306a36Sopenharmony_ci	&dev_attr_spi_device_spi_async.attr,
23662306a36Sopenharmony_ci	&dev_attr_spi_device_bytes.attr,
23762306a36Sopenharmony_ci	&dev_attr_spi_device_bytes_rx.attr,
23862306a36Sopenharmony_ci	&dev_attr_spi_device_bytes_tx.attr,
23962306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo0.attr,
24062306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo1.attr,
24162306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo2.attr,
24262306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo3.attr,
24362306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo4.attr,
24462306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo5.attr,
24562306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo6.attr,
24662306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo7.attr,
24762306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo8.attr,
24862306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo9.attr,
24962306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo10.attr,
25062306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo11.attr,
25162306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo12.attr,
25262306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo13.attr,
25362306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo14.attr,
25462306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo15.attr,
25562306a36Sopenharmony_ci	&dev_attr_spi_device_transfer_bytes_histo16.attr,
25662306a36Sopenharmony_ci	&dev_attr_spi_device_transfers_split_maxsize.attr,
25762306a36Sopenharmony_ci	NULL,
25862306a36Sopenharmony_ci};
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_cistatic const struct attribute_group spi_device_statistics_group = {
26162306a36Sopenharmony_ci	.name  = "statistics",
26262306a36Sopenharmony_ci	.attrs  = spi_device_statistics_attrs,
26362306a36Sopenharmony_ci};
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_cistatic const struct attribute_group *spi_dev_groups[] = {
26662306a36Sopenharmony_ci	&spi_dev_group,
26762306a36Sopenharmony_ci	&spi_device_statistics_group,
26862306a36Sopenharmony_ci	NULL,
26962306a36Sopenharmony_ci};
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_cistatic struct attribute *spi_controller_statistics_attrs[] = {
27262306a36Sopenharmony_ci	&dev_attr_spi_controller_messages.attr,
27362306a36Sopenharmony_ci	&dev_attr_spi_controller_transfers.attr,
27462306a36Sopenharmony_ci	&dev_attr_spi_controller_errors.attr,
27562306a36Sopenharmony_ci	&dev_attr_spi_controller_timedout.attr,
27662306a36Sopenharmony_ci	&dev_attr_spi_controller_spi_sync.attr,
27762306a36Sopenharmony_ci	&dev_attr_spi_controller_spi_sync_immediate.attr,
27862306a36Sopenharmony_ci	&dev_attr_spi_controller_spi_async.attr,
27962306a36Sopenharmony_ci	&dev_attr_spi_controller_bytes.attr,
28062306a36Sopenharmony_ci	&dev_attr_spi_controller_bytes_rx.attr,
28162306a36Sopenharmony_ci	&dev_attr_spi_controller_bytes_tx.attr,
28262306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo0.attr,
28362306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo1.attr,
28462306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo2.attr,
28562306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo3.attr,
28662306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo4.attr,
28762306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo5.attr,
28862306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo6.attr,
28962306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo7.attr,
29062306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo8.attr,
29162306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo9.attr,
29262306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo10.attr,
29362306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo11.attr,
29462306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo12.attr,
29562306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo13.attr,
29662306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo14.attr,
29762306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo15.attr,
29862306a36Sopenharmony_ci	&dev_attr_spi_controller_transfer_bytes_histo16.attr,
29962306a36Sopenharmony_ci	&dev_attr_spi_controller_transfers_split_maxsize.attr,
30062306a36Sopenharmony_ci	NULL,
30162306a36Sopenharmony_ci};
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_cistatic const struct attribute_group spi_controller_statistics_group = {
30462306a36Sopenharmony_ci	.name  = "statistics",
30562306a36Sopenharmony_ci	.attrs  = spi_controller_statistics_attrs,
30662306a36Sopenharmony_ci};
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_cistatic const struct attribute_group *spi_master_groups[] = {
30962306a36Sopenharmony_ci	&spi_controller_statistics_group,
31062306a36Sopenharmony_ci	NULL,
31162306a36Sopenharmony_ci};
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_cistatic void spi_statistics_add_transfer_stats(struct spi_statistics __percpu *pcpu_stats,
31462306a36Sopenharmony_ci					      struct spi_transfer *xfer,
31562306a36Sopenharmony_ci					      struct spi_controller *ctlr)
31662306a36Sopenharmony_ci{
31762306a36Sopenharmony_ci	int l2len = min(fls(xfer->len), SPI_STATISTICS_HISTO_SIZE) - 1;
31862306a36Sopenharmony_ci	struct spi_statistics *stats;
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	if (l2len < 0)
32162306a36Sopenharmony_ci		l2len = 0;
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci	get_cpu();
32462306a36Sopenharmony_ci	stats = this_cpu_ptr(pcpu_stats);
32562306a36Sopenharmony_ci	u64_stats_update_begin(&stats->syncp);
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci	u64_stats_inc(&stats->transfers);
32862306a36Sopenharmony_ci	u64_stats_inc(&stats->transfer_bytes_histo[l2len]);
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	u64_stats_add(&stats->bytes, xfer->len);
33162306a36Sopenharmony_ci	if ((xfer->tx_buf) &&
33262306a36Sopenharmony_ci	    (xfer->tx_buf != ctlr->dummy_tx))
33362306a36Sopenharmony_ci		u64_stats_add(&stats->bytes_tx, xfer->len);
33462306a36Sopenharmony_ci	if ((xfer->rx_buf) &&
33562306a36Sopenharmony_ci	    (xfer->rx_buf != ctlr->dummy_rx))
33662306a36Sopenharmony_ci		u64_stats_add(&stats->bytes_rx, xfer->len);
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	u64_stats_update_end(&stats->syncp);
33962306a36Sopenharmony_ci	put_cpu();
34062306a36Sopenharmony_ci}
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci/*
34362306a36Sopenharmony_ci * modalias support makes "modprobe $MODALIAS" new-style hotplug work,
34462306a36Sopenharmony_ci * and the sysfs version makes coldplug work too.
34562306a36Sopenharmony_ci */
34662306a36Sopenharmony_cistatic const struct spi_device_id *spi_match_id(const struct spi_device_id *id, const char *name)
34762306a36Sopenharmony_ci{
34862306a36Sopenharmony_ci	while (id->name[0]) {
34962306a36Sopenharmony_ci		if (!strcmp(name, id->name))
35062306a36Sopenharmony_ci			return id;
35162306a36Sopenharmony_ci		id++;
35262306a36Sopenharmony_ci	}
35362306a36Sopenharmony_ci	return NULL;
35462306a36Sopenharmony_ci}
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ciconst struct spi_device_id *spi_get_device_id(const struct spi_device *sdev)
35762306a36Sopenharmony_ci{
35862306a36Sopenharmony_ci	const struct spi_driver *sdrv = to_spi_driver(sdev->dev.driver);
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	return spi_match_id(sdrv->id_table, sdev->modalias);
36162306a36Sopenharmony_ci}
36262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_get_device_id);
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ciconst void *spi_get_device_match_data(const struct spi_device *sdev)
36562306a36Sopenharmony_ci{
36662306a36Sopenharmony_ci	const void *match;
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci	match = device_get_match_data(&sdev->dev);
36962306a36Sopenharmony_ci	if (match)
37062306a36Sopenharmony_ci		return match;
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci	return (const void *)spi_get_device_id(sdev)->driver_data;
37362306a36Sopenharmony_ci}
37462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_get_device_match_data);
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_cistatic int spi_match_device(struct device *dev, struct device_driver *drv)
37762306a36Sopenharmony_ci{
37862306a36Sopenharmony_ci	const struct spi_device	*spi = to_spi_device(dev);
37962306a36Sopenharmony_ci	const struct spi_driver	*sdrv = to_spi_driver(drv);
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci	/* Check override first, and if set, only use the named driver */
38262306a36Sopenharmony_ci	if (spi->driver_override)
38362306a36Sopenharmony_ci		return strcmp(spi->driver_override, drv->name) == 0;
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci	/* Attempt an OF style match */
38662306a36Sopenharmony_ci	if (of_driver_match_device(dev, drv))
38762306a36Sopenharmony_ci		return 1;
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci	/* Then try ACPI */
39062306a36Sopenharmony_ci	if (acpi_driver_match_device(dev, drv))
39162306a36Sopenharmony_ci		return 1;
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci	if (sdrv->id_table)
39462306a36Sopenharmony_ci		return !!spi_match_id(sdrv->id_table, spi->modalias);
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci	return strcmp(spi->modalias, drv->name) == 0;
39762306a36Sopenharmony_ci}
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_cistatic int spi_uevent(const struct device *dev, struct kobj_uevent_env *env)
40062306a36Sopenharmony_ci{
40162306a36Sopenharmony_ci	const struct spi_device		*spi = to_spi_device(dev);
40262306a36Sopenharmony_ci	int rc;
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci	rc = acpi_device_uevent_modalias(dev, env);
40562306a36Sopenharmony_ci	if (rc != -ENODEV)
40662306a36Sopenharmony_ci		return rc;
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci	return add_uevent_var(env, "MODALIAS=%s%s", SPI_MODULE_PREFIX, spi->modalias);
40962306a36Sopenharmony_ci}
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_cistatic int spi_probe(struct device *dev)
41262306a36Sopenharmony_ci{
41362306a36Sopenharmony_ci	const struct spi_driver		*sdrv = to_spi_driver(dev->driver);
41462306a36Sopenharmony_ci	struct spi_device		*spi = to_spi_device(dev);
41562306a36Sopenharmony_ci	int ret;
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci	ret = of_clk_set_defaults(dev->of_node, false);
41862306a36Sopenharmony_ci	if (ret)
41962306a36Sopenharmony_ci		return ret;
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ci	if (dev->of_node) {
42262306a36Sopenharmony_ci		spi->irq = of_irq_get(dev->of_node, 0);
42362306a36Sopenharmony_ci		if (spi->irq == -EPROBE_DEFER)
42462306a36Sopenharmony_ci			return -EPROBE_DEFER;
42562306a36Sopenharmony_ci		if (spi->irq < 0)
42662306a36Sopenharmony_ci			spi->irq = 0;
42762306a36Sopenharmony_ci	}
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci	ret = dev_pm_domain_attach(dev, true);
43062306a36Sopenharmony_ci	if (ret)
43162306a36Sopenharmony_ci		return ret;
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ci	if (sdrv->probe) {
43462306a36Sopenharmony_ci		ret = sdrv->probe(spi);
43562306a36Sopenharmony_ci		if (ret)
43662306a36Sopenharmony_ci			dev_pm_domain_detach(dev, true);
43762306a36Sopenharmony_ci	}
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci	return ret;
44062306a36Sopenharmony_ci}
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_cistatic void spi_remove(struct device *dev)
44362306a36Sopenharmony_ci{
44462306a36Sopenharmony_ci	const struct spi_driver		*sdrv = to_spi_driver(dev->driver);
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	if (sdrv->remove)
44762306a36Sopenharmony_ci		sdrv->remove(to_spi_device(dev));
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci	dev_pm_domain_detach(dev, true);
45062306a36Sopenharmony_ci}
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_cistatic void spi_shutdown(struct device *dev)
45362306a36Sopenharmony_ci{
45462306a36Sopenharmony_ci	if (dev->driver) {
45562306a36Sopenharmony_ci		const struct spi_driver	*sdrv = to_spi_driver(dev->driver);
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci		if (sdrv->shutdown)
45862306a36Sopenharmony_ci			sdrv->shutdown(to_spi_device(dev));
45962306a36Sopenharmony_ci	}
46062306a36Sopenharmony_ci}
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_cistruct bus_type spi_bus_type = {
46362306a36Sopenharmony_ci	.name		= "spi",
46462306a36Sopenharmony_ci	.dev_groups	= spi_dev_groups,
46562306a36Sopenharmony_ci	.match		= spi_match_device,
46662306a36Sopenharmony_ci	.uevent		= spi_uevent,
46762306a36Sopenharmony_ci	.probe		= spi_probe,
46862306a36Sopenharmony_ci	.remove		= spi_remove,
46962306a36Sopenharmony_ci	.shutdown	= spi_shutdown,
47062306a36Sopenharmony_ci};
47162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_bus_type);
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_ci/**
47462306a36Sopenharmony_ci * __spi_register_driver - register a SPI driver
47562306a36Sopenharmony_ci * @owner: owner module of the driver to register
47662306a36Sopenharmony_ci * @sdrv: the driver to register
47762306a36Sopenharmony_ci * Context: can sleep
47862306a36Sopenharmony_ci *
47962306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
48062306a36Sopenharmony_ci */
48162306a36Sopenharmony_ciint __spi_register_driver(struct module *owner, struct spi_driver *sdrv)
48262306a36Sopenharmony_ci{
48362306a36Sopenharmony_ci	sdrv->driver.owner = owner;
48462306a36Sopenharmony_ci	sdrv->driver.bus = &spi_bus_type;
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci	/*
48762306a36Sopenharmony_ci	 * For Really Good Reasons we use spi: modaliases not of:
48862306a36Sopenharmony_ci	 * modaliases for DT so module autoloading won't work if we
48962306a36Sopenharmony_ci	 * don't have a spi_device_id as well as a compatible string.
49062306a36Sopenharmony_ci	 */
49162306a36Sopenharmony_ci	if (sdrv->driver.of_match_table) {
49262306a36Sopenharmony_ci		const struct of_device_id *of_id;
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci		for (of_id = sdrv->driver.of_match_table; of_id->compatible[0];
49562306a36Sopenharmony_ci		     of_id++) {
49662306a36Sopenharmony_ci			const char *of_name;
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci			/* Strip off any vendor prefix */
49962306a36Sopenharmony_ci			of_name = strnchr(of_id->compatible,
50062306a36Sopenharmony_ci					  sizeof(of_id->compatible), ',');
50162306a36Sopenharmony_ci			if (of_name)
50262306a36Sopenharmony_ci				of_name++;
50362306a36Sopenharmony_ci			else
50462306a36Sopenharmony_ci				of_name = of_id->compatible;
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_ci			if (sdrv->id_table) {
50762306a36Sopenharmony_ci				const struct spi_device_id *spi_id;
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ci				spi_id = spi_match_id(sdrv->id_table, of_name);
51062306a36Sopenharmony_ci				if (spi_id)
51162306a36Sopenharmony_ci					continue;
51262306a36Sopenharmony_ci			} else {
51362306a36Sopenharmony_ci				if (strcmp(sdrv->driver.name, of_name) == 0)
51462306a36Sopenharmony_ci					continue;
51562306a36Sopenharmony_ci			}
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci			pr_warn("SPI driver %s has no spi_device_id for %s\n",
51862306a36Sopenharmony_ci				sdrv->driver.name, of_id->compatible);
51962306a36Sopenharmony_ci		}
52062306a36Sopenharmony_ci	}
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci	return driver_register(&sdrv->driver);
52362306a36Sopenharmony_ci}
52462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(__spi_register_driver);
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ci/*-------------------------------------------------------------------------*/
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci/*
52962306a36Sopenharmony_ci * SPI devices should normally not be created by SPI device drivers; that
53062306a36Sopenharmony_ci * would make them board-specific.  Similarly with SPI controller drivers.
53162306a36Sopenharmony_ci * Device registration normally goes into like arch/.../mach.../board-YYY.c
53262306a36Sopenharmony_ci * with other readonly (flashable) information about mainboard devices.
53362306a36Sopenharmony_ci */
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_cistruct boardinfo {
53662306a36Sopenharmony_ci	struct list_head	list;
53762306a36Sopenharmony_ci	struct spi_board_info	board_info;
53862306a36Sopenharmony_ci};
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_cistatic LIST_HEAD(board_list);
54162306a36Sopenharmony_cistatic LIST_HEAD(spi_controller_list);
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ci/*
54462306a36Sopenharmony_ci * Used to protect add/del operation for board_info list and
54562306a36Sopenharmony_ci * spi_controller list, and their matching process also used
54662306a36Sopenharmony_ci * to protect object of type struct idr.
54762306a36Sopenharmony_ci */
54862306a36Sopenharmony_cistatic DEFINE_MUTEX(board_lock);
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ci/**
55162306a36Sopenharmony_ci * spi_alloc_device - Allocate a new SPI device
55262306a36Sopenharmony_ci * @ctlr: Controller to which device is connected
55362306a36Sopenharmony_ci * Context: can sleep
55462306a36Sopenharmony_ci *
55562306a36Sopenharmony_ci * Allows a driver to allocate and initialize a spi_device without
55662306a36Sopenharmony_ci * registering it immediately.  This allows a driver to directly
55762306a36Sopenharmony_ci * fill the spi_device with device parameters before calling
55862306a36Sopenharmony_ci * spi_add_device() on it.
55962306a36Sopenharmony_ci *
56062306a36Sopenharmony_ci * Caller is responsible to call spi_add_device() on the returned
56162306a36Sopenharmony_ci * spi_device structure to add it to the SPI controller.  If the caller
56262306a36Sopenharmony_ci * needs to discard the spi_device without adding it, then it should
56362306a36Sopenharmony_ci * call spi_dev_put() on it.
56462306a36Sopenharmony_ci *
56562306a36Sopenharmony_ci * Return: a pointer to the new device, or NULL.
56662306a36Sopenharmony_ci */
56762306a36Sopenharmony_cistruct spi_device *spi_alloc_device(struct spi_controller *ctlr)
56862306a36Sopenharmony_ci{
56962306a36Sopenharmony_ci	struct spi_device	*spi;
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_ci	if (!spi_controller_get(ctlr))
57262306a36Sopenharmony_ci		return NULL;
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_ci	spi = kzalloc(sizeof(*spi), GFP_KERNEL);
57562306a36Sopenharmony_ci	if (!spi) {
57662306a36Sopenharmony_ci		spi_controller_put(ctlr);
57762306a36Sopenharmony_ci		return NULL;
57862306a36Sopenharmony_ci	}
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci	spi->pcpu_statistics = spi_alloc_pcpu_stats(NULL);
58162306a36Sopenharmony_ci	if (!spi->pcpu_statistics) {
58262306a36Sopenharmony_ci		kfree(spi);
58362306a36Sopenharmony_ci		spi_controller_put(ctlr);
58462306a36Sopenharmony_ci		return NULL;
58562306a36Sopenharmony_ci	}
58662306a36Sopenharmony_ci
58762306a36Sopenharmony_ci	spi->master = spi->controller = ctlr;
58862306a36Sopenharmony_ci	spi->dev.parent = &ctlr->dev;
58962306a36Sopenharmony_ci	spi->dev.bus = &spi_bus_type;
59062306a36Sopenharmony_ci	spi->dev.release = spidev_release;
59162306a36Sopenharmony_ci	spi->mode = ctlr->buswidth_override_bits;
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ci	device_initialize(&spi->dev);
59462306a36Sopenharmony_ci	return spi;
59562306a36Sopenharmony_ci}
59662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_alloc_device);
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_cistatic void spi_dev_set_name(struct spi_device *spi)
59962306a36Sopenharmony_ci{
60062306a36Sopenharmony_ci	struct acpi_device *adev = ACPI_COMPANION(&spi->dev);
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_ci	if (adev) {
60362306a36Sopenharmony_ci		dev_set_name(&spi->dev, "spi-%s", acpi_dev_name(adev));
60462306a36Sopenharmony_ci		return;
60562306a36Sopenharmony_ci	}
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci	dev_set_name(&spi->dev, "%s.%u", dev_name(&spi->controller->dev),
60862306a36Sopenharmony_ci		     spi_get_chipselect(spi, 0));
60962306a36Sopenharmony_ci}
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_cistatic int spi_dev_check(struct device *dev, void *data)
61262306a36Sopenharmony_ci{
61362306a36Sopenharmony_ci	struct spi_device *spi = to_spi_device(dev);
61462306a36Sopenharmony_ci	struct spi_device *new_spi = data;
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_ci	if (spi->controller == new_spi->controller &&
61762306a36Sopenharmony_ci	    spi_get_chipselect(spi, 0) == spi_get_chipselect(new_spi, 0))
61862306a36Sopenharmony_ci		return -EBUSY;
61962306a36Sopenharmony_ci	return 0;
62062306a36Sopenharmony_ci}
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_cistatic void spi_cleanup(struct spi_device *spi)
62362306a36Sopenharmony_ci{
62462306a36Sopenharmony_ci	if (spi->controller->cleanup)
62562306a36Sopenharmony_ci		spi->controller->cleanup(spi);
62662306a36Sopenharmony_ci}
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_cistatic int __spi_add_device(struct spi_device *spi)
62962306a36Sopenharmony_ci{
63062306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
63162306a36Sopenharmony_ci	struct device *dev = ctlr->dev.parent;
63262306a36Sopenharmony_ci	int status;
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_ci	/* Chipselects are numbered 0..max; validate. */
63562306a36Sopenharmony_ci	if (spi_get_chipselect(spi, 0) >= ctlr->num_chipselect) {
63662306a36Sopenharmony_ci		dev_err(dev, "cs%d >= max %d\n", spi_get_chipselect(spi, 0),
63762306a36Sopenharmony_ci			ctlr->num_chipselect);
63862306a36Sopenharmony_ci		return -EINVAL;
63962306a36Sopenharmony_ci	}
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ci	/* Set the bus ID string */
64262306a36Sopenharmony_ci	spi_dev_set_name(spi);
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_ci	/*
64562306a36Sopenharmony_ci	 * We need to make sure there's no other device with this
64662306a36Sopenharmony_ci	 * chipselect **BEFORE** we call setup(), else we'll trash
64762306a36Sopenharmony_ci	 * its configuration.
64862306a36Sopenharmony_ci	 */
64962306a36Sopenharmony_ci	status = bus_for_each_dev(&spi_bus_type, NULL, spi, spi_dev_check);
65062306a36Sopenharmony_ci	if (status) {
65162306a36Sopenharmony_ci		dev_err(dev, "chipselect %d already in use\n",
65262306a36Sopenharmony_ci				spi_get_chipselect(spi, 0));
65362306a36Sopenharmony_ci		return status;
65462306a36Sopenharmony_ci	}
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci	/* Controller may unregister concurrently */
65762306a36Sopenharmony_ci	if (IS_ENABLED(CONFIG_SPI_DYNAMIC) &&
65862306a36Sopenharmony_ci	    !device_is_registered(&ctlr->dev)) {
65962306a36Sopenharmony_ci		return -ENODEV;
66062306a36Sopenharmony_ci	}
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_ci	if (ctlr->cs_gpiods)
66362306a36Sopenharmony_ci		spi_set_csgpiod(spi, 0, ctlr->cs_gpiods[spi_get_chipselect(spi, 0)]);
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_ci	/*
66662306a36Sopenharmony_ci	 * Drivers may modify this initial i/o setup, but will
66762306a36Sopenharmony_ci	 * normally rely on the device being setup.  Devices
66862306a36Sopenharmony_ci	 * using SPI_CS_HIGH can't coexist well otherwise...
66962306a36Sopenharmony_ci	 */
67062306a36Sopenharmony_ci	status = spi_setup(spi);
67162306a36Sopenharmony_ci	if (status < 0) {
67262306a36Sopenharmony_ci		dev_err(dev, "can't setup %s, status %d\n",
67362306a36Sopenharmony_ci				dev_name(&spi->dev), status);
67462306a36Sopenharmony_ci		return status;
67562306a36Sopenharmony_ci	}
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_ci	/* Device may be bound to an active driver when this returns */
67862306a36Sopenharmony_ci	status = device_add(&spi->dev);
67962306a36Sopenharmony_ci	if (status < 0) {
68062306a36Sopenharmony_ci		dev_err(dev, "can't add %s, status %d\n",
68162306a36Sopenharmony_ci				dev_name(&spi->dev), status);
68262306a36Sopenharmony_ci		spi_cleanup(spi);
68362306a36Sopenharmony_ci	} else {
68462306a36Sopenharmony_ci		dev_dbg(dev, "registered child %s\n", dev_name(&spi->dev));
68562306a36Sopenharmony_ci	}
68662306a36Sopenharmony_ci
68762306a36Sopenharmony_ci	return status;
68862306a36Sopenharmony_ci}
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci/**
69162306a36Sopenharmony_ci * spi_add_device - Add spi_device allocated with spi_alloc_device
69262306a36Sopenharmony_ci * @spi: spi_device to register
69362306a36Sopenharmony_ci *
69462306a36Sopenharmony_ci * Companion function to spi_alloc_device.  Devices allocated with
69562306a36Sopenharmony_ci * spi_alloc_device can be added onto the SPI bus with this function.
69662306a36Sopenharmony_ci *
69762306a36Sopenharmony_ci * Return: 0 on success; negative errno on failure
69862306a36Sopenharmony_ci */
69962306a36Sopenharmony_ciint spi_add_device(struct spi_device *spi)
70062306a36Sopenharmony_ci{
70162306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
70262306a36Sopenharmony_ci	int status;
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci	mutex_lock(&ctlr->add_lock);
70562306a36Sopenharmony_ci	status = __spi_add_device(spi);
70662306a36Sopenharmony_ci	mutex_unlock(&ctlr->add_lock);
70762306a36Sopenharmony_ci	return status;
70862306a36Sopenharmony_ci}
70962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_add_device);
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_ci/**
71262306a36Sopenharmony_ci * spi_new_device - instantiate one new SPI device
71362306a36Sopenharmony_ci * @ctlr: Controller to which device is connected
71462306a36Sopenharmony_ci * @chip: Describes the SPI device
71562306a36Sopenharmony_ci * Context: can sleep
71662306a36Sopenharmony_ci *
71762306a36Sopenharmony_ci * On typical mainboards, this is purely internal; and it's not needed
71862306a36Sopenharmony_ci * after board init creates the hard-wired devices.  Some development
71962306a36Sopenharmony_ci * platforms may not be able to use spi_register_board_info though, and
72062306a36Sopenharmony_ci * this is exported so that for example a USB or parport based adapter
72162306a36Sopenharmony_ci * driver could add devices (which it would learn about out-of-band).
72262306a36Sopenharmony_ci *
72362306a36Sopenharmony_ci * Return: the new device, or NULL.
72462306a36Sopenharmony_ci */
72562306a36Sopenharmony_cistruct spi_device *spi_new_device(struct spi_controller *ctlr,
72662306a36Sopenharmony_ci				  struct spi_board_info *chip)
72762306a36Sopenharmony_ci{
72862306a36Sopenharmony_ci	struct spi_device	*proxy;
72962306a36Sopenharmony_ci	int			status;
73062306a36Sopenharmony_ci
73162306a36Sopenharmony_ci	/*
73262306a36Sopenharmony_ci	 * NOTE:  caller did any chip->bus_num checks necessary.
73362306a36Sopenharmony_ci	 *
73462306a36Sopenharmony_ci	 * Also, unless we change the return value convention to use
73562306a36Sopenharmony_ci	 * error-or-pointer (not NULL-or-pointer), troubleshootability
73662306a36Sopenharmony_ci	 * suggests syslogged diagnostics are best here (ugh).
73762306a36Sopenharmony_ci	 */
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_ci	proxy = spi_alloc_device(ctlr);
74062306a36Sopenharmony_ci	if (!proxy)
74162306a36Sopenharmony_ci		return NULL;
74262306a36Sopenharmony_ci
74362306a36Sopenharmony_ci	WARN_ON(strlen(chip->modalias) >= sizeof(proxy->modalias));
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_ci	spi_set_chipselect(proxy, 0, chip->chip_select);
74662306a36Sopenharmony_ci	proxy->max_speed_hz = chip->max_speed_hz;
74762306a36Sopenharmony_ci	proxy->mode = chip->mode;
74862306a36Sopenharmony_ci	proxy->irq = chip->irq;
74962306a36Sopenharmony_ci	strscpy(proxy->modalias, chip->modalias, sizeof(proxy->modalias));
75062306a36Sopenharmony_ci	proxy->dev.platform_data = (void *) chip->platform_data;
75162306a36Sopenharmony_ci	proxy->controller_data = chip->controller_data;
75262306a36Sopenharmony_ci	proxy->controller_state = NULL;
75362306a36Sopenharmony_ci
75462306a36Sopenharmony_ci	if (chip->swnode) {
75562306a36Sopenharmony_ci		status = device_add_software_node(&proxy->dev, chip->swnode);
75662306a36Sopenharmony_ci		if (status) {
75762306a36Sopenharmony_ci			dev_err(&ctlr->dev, "failed to add software node to '%s': %d\n",
75862306a36Sopenharmony_ci				chip->modalias, status);
75962306a36Sopenharmony_ci			goto err_dev_put;
76062306a36Sopenharmony_ci		}
76162306a36Sopenharmony_ci	}
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_ci	status = spi_add_device(proxy);
76462306a36Sopenharmony_ci	if (status < 0)
76562306a36Sopenharmony_ci		goto err_dev_put;
76662306a36Sopenharmony_ci
76762306a36Sopenharmony_ci	return proxy;
76862306a36Sopenharmony_ci
76962306a36Sopenharmony_cierr_dev_put:
77062306a36Sopenharmony_ci	device_remove_software_node(&proxy->dev);
77162306a36Sopenharmony_ci	spi_dev_put(proxy);
77262306a36Sopenharmony_ci	return NULL;
77362306a36Sopenharmony_ci}
77462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_new_device);
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci/**
77762306a36Sopenharmony_ci * spi_unregister_device - unregister a single SPI device
77862306a36Sopenharmony_ci * @spi: spi_device to unregister
77962306a36Sopenharmony_ci *
78062306a36Sopenharmony_ci * Start making the passed SPI device vanish. Normally this would be handled
78162306a36Sopenharmony_ci * by spi_unregister_controller().
78262306a36Sopenharmony_ci */
78362306a36Sopenharmony_civoid spi_unregister_device(struct spi_device *spi)
78462306a36Sopenharmony_ci{
78562306a36Sopenharmony_ci	if (!spi)
78662306a36Sopenharmony_ci		return;
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_ci	if (spi->dev.of_node) {
78962306a36Sopenharmony_ci		of_node_clear_flag(spi->dev.of_node, OF_POPULATED);
79062306a36Sopenharmony_ci		of_node_put(spi->dev.of_node);
79162306a36Sopenharmony_ci	}
79262306a36Sopenharmony_ci	if (ACPI_COMPANION(&spi->dev))
79362306a36Sopenharmony_ci		acpi_device_clear_enumerated(ACPI_COMPANION(&spi->dev));
79462306a36Sopenharmony_ci	device_remove_software_node(&spi->dev);
79562306a36Sopenharmony_ci	device_del(&spi->dev);
79662306a36Sopenharmony_ci	spi_cleanup(spi);
79762306a36Sopenharmony_ci	put_device(&spi->dev);
79862306a36Sopenharmony_ci}
79962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_unregister_device);
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_cistatic void spi_match_controller_to_boardinfo(struct spi_controller *ctlr,
80262306a36Sopenharmony_ci					      struct spi_board_info *bi)
80362306a36Sopenharmony_ci{
80462306a36Sopenharmony_ci	struct spi_device *dev;
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci	if (ctlr->bus_num != bi->bus_num)
80762306a36Sopenharmony_ci		return;
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_ci	dev = spi_new_device(ctlr, bi);
81062306a36Sopenharmony_ci	if (!dev)
81162306a36Sopenharmony_ci		dev_err(ctlr->dev.parent, "can't create new device for %s\n",
81262306a36Sopenharmony_ci			bi->modalias);
81362306a36Sopenharmony_ci}
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_ci/**
81662306a36Sopenharmony_ci * spi_register_board_info - register SPI devices for a given board
81762306a36Sopenharmony_ci * @info: array of chip descriptors
81862306a36Sopenharmony_ci * @n: how many descriptors are provided
81962306a36Sopenharmony_ci * Context: can sleep
82062306a36Sopenharmony_ci *
82162306a36Sopenharmony_ci * Board-specific early init code calls this (probably during arch_initcall)
82262306a36Sopenharmony_ci * with segments of the SPI device table.  Any device nodes are created later,
82362306a36Sopenharmony_ci * after the relevant parent SPI controller (bus_num) is defined.  We keep
82462306a36Sopenharmony_ci * this table of devices forever, so that reloading a controller driver will
82562306a36Sopenharmony_ci * not make Linux forget about these hard-wired devices.
82662306a36Sopenharmony_ci *
82762306a36Sopenharmony_ci * Other code can also call this, e.g. a particular add-on board might provide
82862306a36Sopenharmony_ci * SPI devices through its expansion connector, so code initializing that board
82962306a36Sopenharmony_ci * would naturally declare its SPI devices.
83062306a36Sopenharmony_ci *
83162306a36Sopenharmony_ci * The board info passed can safely be __initdata ... but be careful of
83262306a36Sopenharmony_ci * any embedded pointers (platform_data, etc), they're copied as-is.
83362306a36Sopenharmony_ci *
83462306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
83562306a36Sopenharmony_ci */
83662306a36Sopenharmony_ciint spi_register_board_info(struct spi_board_info const *info, unsigned n)
83762306a36Sopenharmony_ci{
83862306a36Sopenharmony_ci	struct boardinfo *bi;
83962306a36Sopenharmony_ci	int i;
84062306a36Sopenharmony_ci
84162306a36Sopenharmony_ci	if (!n)
84262306a36Sopenharmony_ci		return 0;
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_ci	bi = kcalloc(n, sizeof(*bi), GFP_KERNEL);
84562306a36Sopenharmony_ci	if (!bi)
84662306a36Sopenharmony_ci		return -ENOMEM;
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_ci	for (i = 0; i < n; i++, bi++, info++) {
84962306a36Sopenharmony_ci		struct spi_controller *ctlr;
85062306a36Sopenharmony_ci
85162306a36Sopenharmony_ci		memcpy(&bi->board_info, info, sizeof(*info));
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_ci		mutex_lock(&board_lock);
85462306a36Sopenharmony_ci		list_add_tail(&bi->list, &board_list);
85562306a36Sopenharmony_ci		list_for_each_entry(ctlr, &spi_controller_list, list)
85662306a36Sopenharmony_ci			spi_match_controller_to_boardinfo(ctlr,
85762306a36Sopenharmony_ci							  &bi->board_info);
85862306a36Sopenharmony_ci		mutex_unlock(&board_lock);
85962306a36Sopenharmony_ci	}
86062306a36Sopenharmony_ci
86162306a36Sopenharmony_ci	return 0;
86262306a36Sopenharmony_ci}
86362306a36Sopenharmony_ci
86462306a36Sopenharmony_ci/*-------------------------------------------------------------------------*/
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_ci/* Core methods for SPI resource management */
86762306a36Sopenharmony_ci
86862306a36Sopenharmony_ci/**
86962306a36Sopenharmony_ci * spi_res_alloc - allocate a spi resource that is life-cycle managed
87062306a36Sopenharmony_ci *                 during the processing of a spi_message while using
87162306a36Sopenharmony_ci *                 spi_transfer_one
87262306a36Sopenharmony_ci * @spi:     the SPI device for which we allocate memory
87362306a36Sopenharmony_ci * @release: the release code to execute for this resource
87462306a36Sopenharmony_ci * @size:    size to alloc and return
87562306a36Sopenharmony_ci * @gfp:     GFP allocation flags
87662306a36Sopenharmony_ci *
87762306a36Sopenharmony_ci * Return: the pointer to the allocated data
87862306a36Sopenharmony_ci *
87962306a36Sopenharmony_ci * This may get enhanced in the future to allocate from a memory pool
88062306a36Sopenharmony_ci * of the @spi_device or @spi_controller to avoid repeated allocations.
88162306a36Sopenharmony_ci */
88262306a36Sopenharmony_cistatic void *spi_res_alloc(struct spi_device *spi, spi_res_release_t release,
88362306a36Sopenharmony_ci			   size_t size, gfp_t gfp)
88462306a36Sopenharmony_ci{
88562306a36Sopenharmony_ci	struct spi_res *sres;
88662306a36Sopenharmony_ci
88762306a36Sopenharmony_ci	sres = kzalloc(sizeof(*sres) + size, gfp);
88862306a36Sopenharmony_ci	if (!sres)
88962306a36Sopenharmony_ci		return NULL;
89062306a36Sopenharmony_ci
89162306a36Sopenharmony_ci	INIT_LIST_HEAD(&sres->entry);
89262306a36Sopenharmony_ci	sres->release = release;
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci	return sres->data;
89562306a36Sopenharmony_ci}
89662306a36Sopenharmony_ci
89762306a36Sopenharmony_ci/**
89862306a36Sopenharmony_ci * spi_res_free - free an SPI resource
89962306a36Sopenharmony_ci * @res: pointer to the custom data of a resource
90062306a36Sopenharmony_ci */
90162306a36Sopenharmony_cistatic void spi_res_free(void *res)
90262306a36Sopenharmony_ci{
90362306a36Sopenharmony_ci	struct spi_res *sres = container_of(res, struct spi_res, data);
90462306a36Sopenharmony_ci
90562306a36Sopenharmony_ci	if (!res)
90662306a36Sopenharmony_ci		return;
90762306a36Sopenharmony_ci
90862306a36Sopenharmony_ci	WARN_ON(!list_empty(&sres->entry));
90962306a36Sopenharmony_ci	kfree(sres);
91062306a36Sopenharmony_ci}
91162306a36Sopenharmony_ci
91262306a36Sopenharmony_ci/**
91362306a36Sopenharmony_ci * spi_res_add - add a spi_res to the spi_message
91462306a36Sopenharmony_ci * @message: the SPI message
91562306a36Sopenharmony_ci * @res:     the spi_resource
91662306a36Sopenharmony_ci */
91762306a36Sopenharmony_cistatic void spi_res_add(struct spi_message *message, void *res)
91862306a36Sopenharmony_ci{
91962306a36Sopenharmony_ci	struct spi_res *sres = container_of(res, struct spi_res, data);
92062306a36Sopenharmony_ci
92162306a36Sopenharmony_ci	WARN_ON(!list_empty(&sres->entry));
92262306a36Sopenharmony_ci	list_add_tail(&sres->entry, &message->resources);
92362306a36Sopenharmony_ci}
92462306a36Sopenharmony_ci
92562306a36Sopenharmony_ci/**
92662306a36Sopenharmony_ci * spi_res_release - release all SPI resources for this message
92762306a36Sopenharmony_ci * @ctlr:  the @spi_controller
92862306a36Sopenharmony_ci * @message: the @spi_message
92962306a36Sopenharmony_ci */
93062306a36Sopenharmony_cistatic void spi_res_release(struct spi_controller *ctlr, struct spi_message *message)
93162306a36Sopenharmony_ci{
93262306a36Sopenharmony_ci	struct spi_res *res, *tmp;
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_ci	list_for_each_entry_safe_reverse(res, tmp, &message->resources, entry) {
93562306a36Sopenharmony_ci		if (res->release)
93662306a36Sopenharmony_ci			res->release(ctlr, message, res->data);
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_ci		list_del(&res->entry);
93962306a36Sopenharmony_ci
94062306a36Sopenharmony_ci		kfree(res);
94162306a36Sopenharmony_ci	}
94262306a36Sopenharmony_ci}
94362306a36Sopenharmony_ci
94462306a36Sopenharmony_ci/*-------------------------------------------------------------------------*/
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_cistatic void spi_set_cs(struct spi_device *spi, bool enable, bool force)
94762306a36Sopenharmony_ci{
94862306a36Sopenharmony_ci	bool activate = enable;
94962306a36Sopenharmony_ci
95062306a36Sopenharmony_ci	/*
95162306a36Sopenharmony_ci	 * Avoid calling into the driver (or doing delays) if the chip select
95262306a36Sopenharmony_ci	 * isn't actually changing from the last time this was called.
95362306a36Sopenharmony_ci	 */
95462306a36Sopenharmony_ci	if (!force && ((enable && spi->controller->last_cs == spi_get_chipselect(spi, 0)) ||
95562306a36Sopenharmony_ci		       (!enable && spi->controller->last_cs != spi_get_chipselect(spi, 0))) &&
95662306a36Sopenharmony_ci	    (spi->controller->last_cs_mode_high == (spi->mode & SPI_CS_HIGH)))
95762306a36Sopenharmony_ci		return;
95862306a36Sopenharmony_ci
95962306a36Sopenharmony_ci	trace_spi_set_cs(spi, activate);
96062306a36Sopenharmony_ci
96162306a36Sopenharmony_ci	spi->controller->last_cs = enable ? spi_get_chipselect(spi, 0) : -1;
96262306a36Sopenharmony_ci	spi->controller->last_cs_mode_high = spi->mode & SPI_CS_HIGH;
96362306a36Sopenharmony_ci
96462306a36Sopenharmony_ci	if ((spi_get_csgpiod(spi, 0) || !spi->controller->set_cs_timing) && !activate)
96562306a36Sopenharmony_ci		spi_delay_exec(&spi->cs_hold, NULL);
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_ci	if (spi->mode & SPI_CS_HIGH)
96862306a36Sopenharmony_ci		enable = !enable;
96962306a36Sopenharmony_ci
97062306a36Sopenharmony_ci	if (spi_get_csgpiod(spi, 0)) {
97162306a36Sopenharmony_ci		if (!(spi->mode & SPI_NO_CS)) {
97262306a36Sopenharmony_ci			/*
97362306a36Sopenharmony_ci			 * Historically ACPI has no means of the GPIO polarity and
97462306a36Sopenharmony_ci			 * thus the SPISerialBus() resource defines it on the per-chip
97562306a36Sopenharmony_ci			 * basis. In order to avoid a chain of negations, the GPIO
97662306a36Sopenharmony_ci			 * polarity is considered being Active High. Even for the cases
97762306a36Sopenharmony_ci			 * when _DSD() is involved (in the updated versions of ACPI)
97862306a36Sopenharmony_ci			 * the GPIO CS polarity must be defined Active High to avoid
97962306a36Sopenharmony_ci			 * ambiguity. That's why we use enable, that takes SPI_CS_HIGH
98062306a36Sopenharmony_ci			 * into account.
98162306a36Sopenharmony_ci			 */
98262306a36Sopenharmony_ci			if (has_acpi_companion(&spi->dev))
98362306a36Sopenharmony_ci				gpiod_set_value_cansleep(spi_get_csgpiod(spi, 0), !enable);
98462306a36Sopenharmony_ci			else
98562306a36Sopenharmony_ci				/* Polarity handled by GPIO library */
98662306a36Sopenharmony_ci				gpiod_set_value_cansleep(spi_get_csgpiod(spi, 0), activate);
98762306a36Sopenharmony_ci		}
98862306a36Sopenharmony_ci		/* Some SPI masters need both GPIO CS & slave_select */
98962306a36Sopenharmony_ci		if ((spi->controller->flags & SPI_CONTROLLER_GPIO_SS) &&
99062306a36Sopenharmony_ci		    spi->controller->set_cs)
99162306a36Sopenharmony_ci			spi->controller->set_cs(spi, !enable);
99262306a36Sopenharmony_ci	} else if (spi->controller->set_cs) {
99362306a36Sopenharmony_ci		spi->controller->set_cs(spi, !enable);
99462306a36Sopenharmony_ci	}
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci	if (spi_get_csgpiod(spi, 0) || !spi->controller->set_cs_timing) {
99762306a36Sopenharmony_ci		if (activate)
99862306a36Sopenharmony_ci			spi_delay_exec(&spi->cs_setup, NULL);
99962306a36Sopenharmony_ci		else
100062306a36Sopenharmony_ci			spi_delay_exec(&spi->cs_inactive, NULL);
100162306a36Sopenharmony_ci	}
100262306a36Sopenharmony_ci}
100362306a36Sopenharmony_ci
100462306a36Sopenharmony_ci#ifdef CONFIG_HAS_DMA
100562306a36Sopenharmony_cistatic int spi_map_buf_attrs(struct spi_controller *ctlr, struct device *dev,
100662306a36Sopenharmony_ci			     struct sg_table *sgt, void *buf, size_t len,
100762306a36Sopenharmony_ci			     enum dma_data_direction dir, unsigned long attrs)
100862306a36Sopenharmony_ci{
100962306a36Sopenharmony_ci	const bool vmalloced_buf = is_vmalloc_addr(buf);
101062306a36Sopenharmony_ci	unsigned int max_seg_size = dma_get_max_seg_size(dev);
101162306a36Sopenharmony_ci#ifdef CONFIG_HIGHMEM
101262306a36Sopenharmony_ci	const bool kmap_buf = ((unsigned long)buf >= PKMAP_BASE &&
101362306a36Sopenharmony_ci				(unsigned long)buf < (PKMAP_BASE +
101462306a36Sopenharmony_ci					(LAST_PKMAP * PAGE_SIZE)));
101562306a36Sopenharmony_ci#else
101662306a36Sopenharmony_ci	const bool kmap_buf = false;
101762306a36Sopenharmony_ci#endif
101862306a36Sopenharmony_ci	int desc_len;
101962306a36Sopenharmony_ci	int sgs;
102062306a36Sopenharmony_ci	struct page *vm_page;
102162306a36Sopenharmony_ci	struct scatterlist *sg;
102262306a36Sopenharmony_ci	void *sg_buf;
102362306a36Sopenharmony_ci	size_t min;
102462306a36Sopenharmony_ci	int i, ret;
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_ci	if (vmalloced_buf || kmap_buf) {
102762306a36Sopenharmony_ci		desc_len = min_t(unsigned long, max_seg_size, PAGE_SIZE);
102862306a36Sopenharmony_ci		sgs = DIV_ROUND_UP(len + offset_in_page(buf), desc_len);
102962306a36Sopenharmony_ci	} else if (virt_addr_valid(buf)) {
103062306a36Sopenharmony_ci		desc_len = min_t(size_t, max_seg_size, ctlr->max_dma_len);
103162306a36Sopenharmony_ci		sgs = DIV_ROUND_UP(len, desc_len);
103262306a36Sopenharmony_ci	} else {
103362306a36Sopenharmony_ci		return -EINVAL;
103462306a36Sopenharmony_ci	}
103562306a36Sopenharmony_ci
103662306a36Sopenharmony_ci	ret = sg_alloc_table(sgt, sgs, GFP_KERNEL);
103762306a36Sopenharmony_ci	if (ret != 0)
103862306a36Sopenharmony_ci		return ret;
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci	sg = &sgt->sgl[0];
104162306a36Sopenharmony_ci	for (i = 0; i < sgs; i++) {
104262306a36Sopenharmony_ci
104362306a36Sopenharmony_ci		if (vmalloced_buf || kmap_buf) {
104462306a36Sopenharmony_ci			/*
104562306a36Sopenharmony_ci			 * Next scatterlist entry size is the minimum between
104662306a36Sopenharmony_ci			 * the desc_len and the remaining buffer length that
104762306a36Sopenharmony_ci			 * fits in a page.
104862306a36Sopenharmony_ci			 */
104962306a36Sopenharmony_ci			min = min_t(size_t, desc_len,
105062306a36Sopenharmony_ci				    min_t(size_t, len,
105162306a36Sopenharmony_ci					  PAGE_SIZE - offset_in_page(buf)));
105262306a36Sopenharmony_ci			if (vmalloced_buf)
105362306a36Sopenharmony_ci				vm_page = vmalloc_to_page(buf);
105462306a36Sopenharmony_ci			else
105562306a36Sopenharmony_ci				vm_page = kmap_to_page(buf);
105662306a36Sopenharmony_ci			if (!vm_page) {
105762306a36Sopenharmony_ci				sg_free_table(sgt);
105862306a36Sopenharmony_ci				return -ENOMEM;
105962306a36Sopenharmony_ci			}
106062306a36Sopenharmony_ci			sg_set_page(sg, vm_page,
106162306a36Sopenharmony_ci				    min, offset_in_page(buf));
106262306a36Sopenharmony_ci		} else {
106362306a36Sopenharmony_ci			min = min_t(size_t, len, desc_len);
106462306a36Sopenharmony_ci			sg_buf = buf;
106562306a36Sopenharmony_ci			sg_set_buf(sg, sg_buf, min);
106662306a36Sopenharmony_ci		}
106762306a36Sopenharmony_ci
106862306a36Sopenharmony_ci		buf += min;
106962306a36Sopenharmony_ci		len -= min;
107062306a36Sopenharmony_ci		sg = sg_next(sg);
107162306a36Sopenharmony_ci	}
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_ci	ret = dma_map_sgtable(dev, sgt, dir, attrs);
107462306a36Sopenharmony_ci	if (ret < 0) {
107562306a36Sopenharmony_ci		sg_free_table(sgt);
107662306a36Sopenharmony_ci		return ret;
107762306a36Sopenharmony_ci	}
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci	return 0;
108062306a36Sopenharmony_ci}
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ciint spi_map_buf(struct spi_controller *ctlr, struct device *dev,
108362306a36Sopenharmony_ci		struct sg_table *sgt, void *buf, size_t len,
108462306a36Sopenharmony_ci		enum dma_data_direction dir)
108562306a36Sopenharmony_ci{
108662306a36Sopenharmony_ci	return spi_map_buf_attrs(ctlr, dev, sgt, buf, len, dir, 0);
108762306a36Sopenharmony_ci}
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_cistatic void spi_unmap_buf_attrs(struct spi_controller *ctlr,
109062306a36Sopenharmony_ci				struct device *dev, struct sg_table *sgt,
109162306a36Sopenharmony_ci				enum dma_data_direction dir,
109262306a36Sopenharmony_ci				unsigned long attrs)
109362306a36Sopenharmony_ci{
109462306a36Sopenharmony_ci	if (sgt->orig_nents) {
109562306a36Sopenharmony_ci		dma_unmap_sgtable(dev, sgt, dir, attrs);
109662306a36Sopenharmony_ci		sg_free_table(sgt);
109762306a36Sopenharmony_ci		sgt->orig_nents = 0;
109862306a36Sopenharmony_ci		sgt->nents = 0;
109962306a36Sopenharmony_ci	}
110062306a36Sopenharmony_ci}
110162306a36Sopenharmony_ci
110262306a36Sopenharmony_civoid spi_unmap_buf(struct spi_controller *ctlr, struct device *dev,
110362306a36Sopenharmony_ci		   struct sg_table *sgt, enum dma_data_direction dir)
110462306a36Sopenharmony_ci{
110562306a36Sopenharmony_ci	spi_unmap_buf_attrs(ctlr, dev, sgt, dir, 0);
110662306a36Sopenharmony_ci}
110762306a36Sopenharmony_ci
110862306a36Sopenharmony_cistatic int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
110962306a36Sopenharmony_ci{
111062306a36Sopenharmony_ci	struct device *tx_dev, *rx_dev;
111162306a36Sopenharmony_ci	struct spi_transfer *xfer;
111262306a36Sopenharmony_ci	int ret;
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_ci	if (!ctlr->can_dma)
111562306a36Sopenharmony_ci		return 0;
111662306a36Sopenharmony_ci
111762306a36Sopenharmony_ci	if (ctlr->dma_tx)
111862306a36Sopenharmony_ci		tx_dev = ctlr->dma_tx->device->dev;
111962306a36Sopenharmony_ci	else if (ctlr->dma_map_dev)
112062306a36Sopenharmony_ci		tx_dev = ctlr->dma_map_dev;
112162306a36Sopenharmony_ci	else
112262306a36Sopenharmony_ci		tx_dev = ctlr->dev.parent;
112362306a36Sopenharmony_ci
112462306a36Sopenharmony_ci	if (ctlr->dma_rx)
112562306a36Sopenharmony_ci		rx_dev = ctlr->dma_rx->device->dev;
112662306a36Sopenharmony_ci	else if (ctlr->dma_map_dev)
112762306a36Sopenharmony_ci		rx_dev = ctlr->dma_map_dev;
112862306a36Sopenharmony_ci	else
112962306a36Sopenharmony_ci		rx_dev = ctlr->dev.parent;
113062306a36Sopenharmony_ci
113162306a36Sopenharmony_ci	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
113262306a36Sopenharmony_ci		/* The sync is done before each transfer. */
113362306a36Sopenharmony_ci		unsigned long attrs = DMA_ATTR_SKIP_CPU_SYNC;
113462306a36Sopenharmony_ci
113562306a36Sopenharmony_ci		if (!ctlr->can_dma(ctlr, msg->spi, xfer))
113662306a36Sopenharmony_ci			continue;
113762306a36Sopenharmony_ci
113862306a36Sopenharmony_ci		if (xfer->tx_buf != NULL) {
113962306a36Sopenharmony_ci			ret = spi_map_buf_attrs(ctlr, tx_dev, &xfer->tx_sg,
114062306a36Sopenharmony_ci						(void *)xfer->tx_buf,
114162306a36Sopenharmony_ci						xfer->len, DMA_TO_DEVICE,
114262306a36Sopenharmony_ci						attrs);
114362306a36Sopenharmony_ci			if (ret != 0)
114462306a36Sopenharmony_ci				return ret;
114562306a36Sopenharmony_ci		}
114662306a36Sopenharmony_ci
114762306a36Sopenharmony_ci		if (xfer->rx_buf != NULL) {
114862306a36Sopenharmony_ci			ret = spi_map_buf_attrs(ctlr, rx_dev, &xfer->rx_sg,
114962306a36Sopenharmony_ci						xfer->rx_buf, xfer->len,
115062306a36Sopenharmony_ci						DMA_FROM_DEVICE, attrs);
115162306a36Sopenharmony_ci			if (ret != 0) {
115262306a36Sopenharmony_ci				spi_unmap_buf_attrs(ctlr, tx_dev,
115362306a36Sopenharmony_ci						&xfer->tx_sg, DMA_TO_DEVICE,
115462306a36Sopenharmony_ci						attrs);
115562306a36Sopenharmony_ci
115662306a36Sopenharmony_ci				return ret;
115762306a36Sopenharmony_ci			}
115862306a36Sopenharmony_ci		}
115962306a36Sopenharmony_ci	}
116062306a36Sopenharmony_ci
116162306a36Sopenharmony_ci	ctlr->cur_rx_dma_dev = rx_dev;
116262306a36Sopenharmony_ci	ctlr->cur_tx_dma_dev = tx_dev;
116362306a36Sopenharmony_ci	ctlr->cur_msg_mapped = true;
116462306a36Sopenharmony_ci
116562306a36Sopenharmony_ci	return 0;
116662306a36Sopenharmony_ci}
116762306a36Sopenharmony_ci
116862306a36Sopenharmony_cistatic int __spi_unmap_msg(struct spi_controller *ctlr, struct spi_message *msg)
116962306a36Sopenharmony_ci{
117062306a36Sopenharmony_ci	struct device *rx_dev = ctlr->cur_rx_dma_dev;
117162306a36Sopenharmony_ci	struct device *tx_dev = ctlr->cur_tx_dma_dev;
117262306a36Sopenharmony_ci	struct spi_transfer *xfer;
117362306a36Sopenharmony_ci
117462306a36Sopenharmony_ci	if (!ctlr->cur_msg_mapped || !ctlr->can_dma)
117562306a36Sopenharmony_ci		return 0;
117662306a36Sopenharmony_ci
117762306a36Sopenharmony_ci	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
117862306a36Sopenharmony_ci		/* The sync has already been done after each transfer. */
117962306a36Sopenharmony_ci		unsigned long attrs = DMA_ATTR_SKIP_CPU_SYNC;
118062306a36Sopenharmony_ci
118162306a36Sopenharmony_ci		if (!ctlr->can_dma(ctlr, msg->spi, xfer))
118262306a36Sopenharmony_ci			continue;
118362306a36Sopenharmony_ci
118462306a36Sopenharmony_ci		spi_unmap_buf_attrs(ctlr, rx_dev, &xfer->rx_sg,
118562306a36Sopenharmony_ci				    DMA_FROM_DEVICE, attrs);
118662306a36Sopenharmony_ci		spi_unmap_buf_attrs(ctlr, tx_dev, &xfer->tx_sg,
118762306a36Sopenharmony_ci				    DMA_TO_DEVICE, attrs);
118862306a36Sopenharmony_ci	}
118962306a36Sopenharmony_ci
119062306a36Sopenharmony_ci	ctlr->cur_msg_mapped = false;
119162306a36Sopenharmony_ci
119262306a36Sopenharmony_ci	return 0;
119362306a36Sopenharmony_ci}
119462306a36Sopenharmony_ci
119562306a36Sopenharmony_cistatic void spi_dma_sync_for_device(struct spi_controller *ctlr,
119662306a36Sopenharmony_ci				    struct spi_transfer *xfer)
119762306a36Sopenharmony_ci{
119862306a36Sopenharmony_ci	struct device *rx_dev = ctlr->cur_rx_dma_dev;
119962306a36Sopenharmony_ci	struct device *tx_dev = ctlr->cur_tx_dma_dev;
120062306a36Sopenharmony_ci
120162306a36Sopenharmony_ci	if (!ctlr->cur_msg_mapped)
120262306a36Sopenharmony_ci		return;
120362306a36Sopenharmony_ci
120462306a36Sopenharmony_ci	if (xfer->tx_sg.orig_nents)
120562306a36Sopenharmony_ci		dma_sync_sgtable_for_device(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);
120662306a36Sopenharmony_ci	if (xfer->rx_sg.orig_nents)
120762306a36Sopenharmony_ci		dma_sync_sgtable_for_device(rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE);
120862306a36Sopenharmony_ci}
120962306a36Sopenharmony_ci
121062306a36Sopenharmony_cistatic void spi_dma_sync_for_cpu(struct spi_controller *ctlr,
121162306a36Sopenharmony_ci				 struct spi_transfer *xfer)
121262306a36Sopenharmony_ci{
121362306a36Sopenharmony_ci	struct device *rx_dev = ctlr->cur_rx_dma_dev;
121462306a36Sopenharmony_ci	struct device *tx_dev = ctlr->cur_tx_dma_dev;
121562306a36Sopenharmony_ci
121662306a36Sopenharmony_ci	if (!ctlr->cur_msg_mapped)
121762306a36Sopenharmony_ci		return;
121862306a36Sopenharmony_ci
121962306a36Sopenharmony_ci	if (xfer->rx_sg.orig_nents)
122062306a36Sopenharmony_ci		dma_sync_sgtable_for_cpu(rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE);
122162306a36Sopenharmony_ci	if (xfer->tx_sg.orig_nents)
122262306a36Sopenharmony_ci		dma_sync_sgtable_for_cpu(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);
122362306a36Sopenharmony_ci}
122462306a36Sopenharmony_ci#else /* !CONFIG_HAS_DMA */
122562306a36Sopenharmony_cistatic inline int __spi_map_msg(struct spi_controller *ctlr,
122662306a36Sopenharmony_ci				struct spi_message *msg)
122762306a36Sopenharmony_ci{
122862306a36Sopenharmony_ci	return 0;
122962306a36Sopenharmony_ci}
123062306a36Sopenharmony_ci
123162306a36Sopenharmony_cistatic inline int __spi_unmap_msg(struct spi_controller *ctlr,
123262306a36Sopenharmony_ci				  struct spi_message *msg)
123362306a36Sopenharmony_ci{
123462306a36Sopenharmony_ci	return 0;
123562306a36Sopenharmony_ci}
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_cistatic void spi_dma_sync_for_device(struct spi_controller *ctrl,
123862306a36Sopenharmony_ci				    struct spi_transfer *xfer)
123962306a36Sopenharmony_ci{
124062306a36Sopenharmony_ci}
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_cistatic void spi_dma_sync_for_cpu(struct spi_controller *ctrl,
124362306a36Sopenharmony_ci				 struct spi_transfer *xfer)
124462306a36Sopenharmony_ci{
124562306a36Sopenharmony_ci}
124662306a36Sopenharmony_ci#endif /* !CONFIG_HAS_DMA */
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_cistatic inline int spi_unmap_msg(struct spi_controller *ctlr,
124962306a36Sopenharmony_ci				struct spi_message *msg)
125062306a36Sopenharmony_ci{
125162306a36Sopenharmony_ci	struct spi_transfer *xfer;
125262306a36Sopenharmony_ci
125362306a36Sopenharmony_ci	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
125462306a36Sopenharmony_ci		/*
125562306a36Sopenharmony_ci		 * Restore the original value of tx_buf or rx_buf if they are
125662306a36Sopenharmony_ci		 * NULL.
125762306a36Sopenharmony_ci		 */
125862306a36Sopenharmony_ci		if (xfer->tx_buf == ctlr->dummy_tx)
125962306a36Sopenharmony_ci			xfer->tx_buf = NULL;
126062306a36Sopenharmony_ci		if (xfer->rx_buf == ctlr->dummy_rx)
126162306a36Sopenharmony_ci			xfer->rx_buf = NULL;
126262306a36Sopenharmony_ci	}
126362306a36Sopenharmony_ci
126462306a36Sopenharmony_ci	return __spi_unmap_msg(ctlr, msg);
126562306a36Sopenharmony_ci}
126662306a36Sopenharmony_ci
126762306a36Sopenharmony_cistatic int spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
126862306a36Sopenharmony_ci{
126962306a36Sopenharmony_ci	struct spi_transfer *xfer;
127062306a36Sopenharmony_ci	void *tmp;
127162306a36Sopenharmony_ci	unsigned int max_tx, max_rx;
127262306a36Sopenharmony_ci
127362306a36Sopenharmony_ci	if ((ctlr->flags & (SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX))
127462306a36Sopenharmony_ci		&& !(msg->spi->mode & SPI_3WIRE)) {
127562306a36Sopenharmony_ci		max_tx = 0;
127662306a36Sopenharmony_ci		max_rx = 0;
127762306a36Sopenharmony_ci
127862306a36Sopenharmony_ci		list_for_each_entry(xfer, &msg->transfers, transfer_list) {
127962306a36Sopenharmony_ci			if ((ctlr->flags & SPI_CONTROLLER_MUST_TX) &&
128062306a36Sopenharmony_ci			    !xfer->tx_buf)
128162306a36Sopenharmony_ci				max_tx = max(xfer->len, max_tx);
128262306a36Sopenharmony_ci			if ((ctlr->flags & SPI_CONTROLLER_MUST_RX) &&
128362306a36Sopenharmony_ci			    !xfer->rx_buf)
128462306a36Sopenharmony_ci				max_rx = max(xfer->len, max_rx);
128562306a36Sopenharmony_ci		}
128662306a36Sopenharmony_ci
128762306a36Sopenharmony_ci		if (max_tx) {
128862306a36Sopenharmony_ci			tmp = krealloc(ctlr->dummy_tx, max_tx,
128962306a36Sopenharmony_ci				       GFP_KERNEL | GFP_DMA | __GFP_ZERO);
129062306a36Sopenharmony_ci			if (!tmp)
129162306a36Sopenharmony_ci				return -ENOMEM;
129262306a36Sopenharmony_ci			ctlr->dummy_tx = tmp;
129362306a36Sopenharmony_ci		}
129462306a36Sopenharmony_ci
129562306a36Sopenharmony_ci		if (max_rx) {
129662306a36Sopenharmony_ci			tmp = krealloc(ctlr->dummy_rx, max_rx,
129762306a36Sopenharmony_ci				       GFP_KERNEL | GFP_DMA);
129862306a36Sopenharmony_ci			if (!tmp)
129962306a36Sopenharmony_ci				return -ENOMEM;
130062306a36Sopenharmony_ci			ctlr->dummy_rx = tmp;
130162306a36Sopenharmony_ci		}
130262306a36Sopenharmony_ci
130362306a36Sopenharmony_ci		if (max_tx || max_rx) {
130462306a36Sopenharmony_ci			list_for_each_entry(xfer, &msg->transfers,
130562306a36Sopenharmony_ci					    transfer_list) {
130662306a36Sopenharmony_ci				if (!xfer->len)
130762306a36Sopenharmony_ci					continue;
130862306a36Sopenharmony_ci				if (!xfer->tx_buf)
130962306a36Sopenharmony_ci					xfer->tx_buf = ctlr->dummy_tx;
131062306a36Sopenharmony_ci				if (!xfer->rx_buf)
131162306a36Sopenharmony_ci					xfer->rx_buf = ctlr->dummy_rx;
131262306a36Sopenharmony_ci			}
131362306a36Sopenharmony_ci		}
131462306a36Sopenharmony_ci	}
131562306a36Sopenharmony_ci
131662306a36Sopenharmony_ci	return __spi_map_msg(ctlr, msg);
131762306a36Sopenharmony_ci}
131862306a36Sopenharmony_ci
131962306a36Sopenharmony_cistatic int spi_transfer_wait(struct spi_controller *ctlr,
132062306a36Sopenharmony_ci			     struct spi_message *msg,
132162306a36Sopenharmony_ci			     struct spi_transfer *xfer)
132262306a36Sopenharmony_ci{
132362306a36Sopenharmony_ci	struct spi_statistics __percpu *statm = ctlr->pcpu_statistics;
132462306a36Sopenharmony_ci	struct spi_statistics __percpu *stats = msg->spi->pcpu_statistics;
132562306a36Sopenharmony_ci	u32 speed_hz = xfer->speed_hz;
132662306a36Sopenharmony_ci	unsigned long long ms;
132762306a36Sopenharmony_ci
132862306a36Sopenharmony_ci	if (spi_controller_is_slave(ctlr)) {
132962306a36Sopenharmony_ci		if (wait_for_completion_interruptible(&ctlr->xfer_completion)) {
133062306a36Sopenharmony_ci			dev_dbg(&msg->spi->dev, "SPI transfer interrupted\n");
133162306a36Sopenharmony_ci			return -EINTR;
133262306a36Sopenharmony_ci		}
133362306a36Sopenharmony_ci	} else {
133462306a36Sopenharmony_ci		if (!speed_hz)
133562306a36Sopenharmony_ci			speed_hz = 100000;
133662306a36Sopenharmony_ci
133762306a36Sopenharmony_ci		/*
133862306a36Sopenharmony_ci		 * For each byte we wait for 8 cycles of the SPI clock.
133962306a36Sopenharmony_ci		 * Since speed is defined in Hz and we want milliseconds,
134062306a36Sopenharmony_ci		 * use respective multiplier, but before the division,
134162306a36Sopenharmony_ci		 * otherwise we may get 0 for short transfers.
134262306a36Sopenharmony_ci		 */
134362306a36Sopenharmony_ci		ms = 8LL * MSEC_PER_SEC * xfer->len;
134462306a36Sopenharmony_ci		do_div(ms, speed_hz);
134562306a36Sopenharmony_ci
134662306a36Sopenharmony_ci		/*
134762306a36Sopenharmony_ci		 * Increase it twice and add 200 ms tolerance, use
134862306a36Sopenharmony_ci		 * predefined maximum in case of overflow.
134962306a36Sopenharmony_ci		 */
135062306a36Sopenharmony_ci		ms += ms + 200;
135162306a36Sopenharmony_ci		if (ms > UINT_MAX)
135262306a36Sopenharmony_ci			ms = UINT_MAX;
135362306a36Sopenharmony_ci
135462306a36Sopenharmony_ci		ms = wait_for_completion_timeout(&ctlr->xfer_completion,
135562306a36Sopenharmony_ci						 msecs_to_jiffies(ms));
135662306a36Sopenharmony_ci
135762306a36Sopenharmony_ci		if (ms == 0) {
135862306a36Sopenharmony_ci			SPI_STATISTICS_INCREMENT_FIELD(statm, timedout);
135962306a36Sopenharmony_ci			SPI_STATISTICS_INCREMENT_FIELD(stats, timedout);
136062306a36Sopenharmony_ci			dev_err(&msg->spi->dev,
136162306a36Sopenharmony_ci				"SPI transfer timed out\n");
136262306a36Sopenharmony_ci			return -ETIMEDOUT;
136362306a36Sopenharmony_ci		}
136462306a36Sopenharmony_ci	}
136562306a36Sopenharmony_ci
136662306a36Sopenharmony_ci	return 0;
136762306a36Sopenharmony_ci}
136862306a36Sopenharmony_ci
136962306a36Sopenharmony_cistatic void _spi_transfer_delay_ns(u32 ns)
137062306a36Sopenharmony_ci{
137162306a36Sopenharmony_ci	if (!ns)
137262306a36Sopenharmony_ci		return;
137362306a36Sopenharmony_ci	if (ns <= NSEC_PER_USEC) {
137462306a36Sopenharmony_ci		ndelay(ns);
137562306a36Sopenharmony_ci	} else {
137662306a36Sopenharmony_ci		u32 us = DIV_ROUND_UP(ns, NSEC_PER_USEC);
137762306a36Sopenharmony_ci
137862306a36Sopenharmony_ci		if (us <= 10)
137962306a36Sopenharmony_ci			udelay(us);
138062306a36Sopenharmony_ci		else
138162306a36Sopenharmony_ci			usleep_range(us, us + DIV_ROUND_UP(us, 10));
138262306a36Sopenharmony_ci	}
138362306a36Sopenharmony_ci}
138462306a36Sopenharmony_ci
138562306a36Sopenharmony_ciint spi_delay_to_ns(struct spi_delay *_delay, struct spi_transfer *xfer)
138662306a36Sopenharmony_ci{
138762306a36Sopenharmony_ci	u32 delay = _delay->value;
138862306a36Sopenharmony_ci	u32 unit = _delay->unit;
138962306a36Sopenharmony_ci	u32 hz;
139062306a36Sopenharmony_ci
139162306a36Sopenharmony_ci	if (!delay)
139262306a36Sopenharmony_ci		return 0;
139362306a36Sopenharmony_ci
139462306a36Sopenharmony_ci	switch (unit) {
139562306a36Sopenharmony_ci	case SPI_DELAY_UNIT_USECS:
139662306a36Sopenharmony_ci		delay *= NSEC_PER_USEC;
139762306a36Sopenharmony_ci		break;
139862306a36Sopenharmony_ci	case SPI_DELAY_UNIT_NSECS:
139962306a36Sopenharmony_ci		/* Nothing to do here */
140062306a36Sopenharmony_ci		break;
140162306a36Sopenharmony_ci	case SPI_DELAY_UNIT_SCK:
140262306a36Sopenharmony_ci		/* Clock cycles need to be obtained from spi_transfer */
140362306a36Sopenharmony_ci		if (!xfer)
140462306a36Sopenharmony_ci			return -EINVAL;
140562306a36Sopenharmony_ci		/*
140662306a36Sopenharmony_ci		 * If there is unknown effective speed, approximate it
140762306a36Sopenharmony_ci		 * by underestimating with half of the requested Hz.
140862306a36Sopenharmony_ci		 */
140962306a36Sopenharmony_ci		hz = xfer->effective_speed_hz ?: xfer->speed_hz / 2;
141062306a36Sopenharmony_ci		if (!hz)
141162306a36Sopenharmony_ci			return -EINVAL;
141262306a36Sopenharmony_ci
141362306a36Sopenharmony_ci		/* Convert delay to nanoseconds */
141462306a36Sopenharmony_ci		delay *= DIV_ROUND_UP(NSEC_PER_SEC, hz);
141562306a36Sopenharmony_ci		break;
141662306a36Sopenharmony_ci	default:
141762306a36Sopenharmony_ci		return -EINVAL;
141862306a36Sopenharmony_ci	}
141962306a36Sopenharmony_ci
142062306a36Sopenharmony_ci	return delay;
142162306a36Sopenharmony_ci}
142262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_delay_to_ns);
142362306a36Sopenharmony_ci
142462306a36Sopenharmony_ciint spi_delay_exec(struct spi_delay *_delay, struct spi_transfer *xfer)
142562306a36Sopenharmony_ci{
142662306a36Sopenharmony_ci	int delay;
142762306a36Sopenharmony_ci
142862306a36Sopenharmony_ci	might_sleep();
142962306a36Sopenharmony_ci
143062306a36Sopenharmony_ci	if (!_delay)
143162306a36Sopenharmony_ci		return -EINVAL;
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_ci	delay = spi_delay_to_ns(_delay, xfer);
143462306a36Sopenharmony_ci	if (delay < 0)
143562306a36Sopenharmony_ci		return delay;
143662306a36Sopenharmony_ci
143762306a36Sopenharmony_ci	_spi_transfer_delay_ns(delay);
143862306a36Sopenharmony_ci
143962306a36Sopenharmony_ci	return 0;
144062306a36Sopenharmony_ci}
144162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_delay_exec);
144262306a36Sopenharmony_ci
144362306a36Sopenharmony_cistatic void _spi_transfer_cs_change_delay(struct spi_message *msg,
144462306a36Sopenharmony_ci					  struct spi_transfer *xfer)
144562306a36Sopenharmony_ci{
144662306a36Sopenharmony_ci	u32 default_delay_ns = 10 * NSEC_PER_USEC;
144762306a36Sopenharmony_ci	u32 delay = xfer->cs_change_delay.value;
144862306a36Sopenharmony_ci	u32 unit = xfer->cs_change_delay.unit;
144962306a36Sopenharmony_ci	int ret;
145062306a36Sopenharmony_ci
145162306a36Sopenharmony_ci	/* Return early on "fast" mode - for everything but USECS */
145262306a36Sopenharmony_ci	if (!delay) {
145362306a36Sopenharmony_ci		if (unit == SPI_DELAY_UNIT_USECS)
145462306a36Sopenharmony_ci			_spi_transfer_delay_ns(default_delay_ns);
145562306a36Sopenharmony_ci		return;
145662306a36Sopenharmony_ci	}
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci	ret = spi_delay_exec(&xfer->cs_change_delay, xfer);
145962306a36Sopenharmony_ci	if (ret) {
146062306a36Sopenharmony_ci		dev_err_once(&msg->spi->dev,
146162306a36Sopenharmony_ci			     "Use of unsupported delay unit %i, using default of %luus\n",
146262306a36Sopenharmony_ci			     unit, default_delay_ns / NSEC_PER_USEC);
146362306a36Sopenharmony_ci		_spi_transfer_delay_ns(default_delay_ns);
146462306a36Sopenharmony_ci	}
146562306a36Sopenharmony_ci}
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_civoid spi_transfer_cs_change_delay_exec(struct spi_message *msg,
146862306a36Sopenharmony_ci						  struct spi_transfer *xfer)
146962306a36Sopenharmony_ci{
147062306a36Sopenharmony_ci	_spi_transfer_cs_change_delay(msg, xfer);
147162306a36Sopenharmony_ci}
147262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_transfer_cs_change_delay_exec);
147362306a36Sopenharmony_ci
147462306a36Sopenharmony_ci/*
147562306a36Sopenharmony_ci * spi_transfer_one_message - Default implementation of transfer_one_message()
147662306a36Sopenharmony_ci *
147762306a36Sopenharmony_ci * This is a standard implementation of transfer_one_message() for
147862306a36Sopenharmony_ci * drivers which implement a transfer_one() operation.  It provides
147962306a36Sopenharmony_ci * standard handling of delays and chip select management.
148062306a36Sopenharmony_ci */
148162306a36Sopenharmony_cistatic int spi_transfer_one_message(struct spi_controller *ctlr,
148262306a36Sopenharmony_ci				    struct spi_message *msg)
148362306a36Sopenharmony_ci{
148462306a36Sopenharmony_ci	struct spi_transfer *xfer;
148562306a36Sopenharmony_ci	bool keep_cs = false;
148662306a36Sopenharmony_ci	int ret = 0;
148762306a36Sopenharmony_ci	struct spi_statistics __percpu *statm = ctlr->pcpu_statistics;
148862306a36Sopenharmony_ci	struct spi_statistics __percpu *stats = msg->spi->pcpu_statistics;
148962306a36Sopenharmony_ci
149062306a36Sopenharmony_ci	xfer = list_first_entry(&msg->transfers, struct spi_transfer, transfer_list);
149162306a36Sopenharmony_ci	spi_set_cs(msg->spi, !xfer->cs_off, false);
149262306a36Sopenharmony_ci
149362306a36Sopenharmony_ci	SPI_STATISTICS_INCREMENT_FIELD(statm, messages);
149462306a36Sopenharmony_ci	SPI_STATISTICS_INCREMENT_FIELD(stats, messages);
149562306a36Sopenharmony_ci
149662306a36Sopenharmony_ci	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
149762306a36Sopenharmony_ci		trace_spi_transfer_start(msg, xfer);
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci		spi_statistics_add_transfer_stats(statm, xfer, ctlr);
150062306a36Sopenharmony_ci		spi_statistics_add_transfer_stats(stats, xfer, ctlr);
150162306a36Sopenharmony_ci
150262306a36Sopenharmony_ci		if (!ctlr->ptp_sts_supported) {
150362306a36Sopenharmony_ci			xfer->ptp_sts_word_pre = 0;
150462306a36Sopenharmony_ci			ptp_read_system_prets(xfer->ptp_sts);
150562306a36Sopenharmony_ci		}
150662306a36Sopenharmony_ci
150762306a36Sopenharmony_ci		if ((xfer->tx_buf || xfer->rx_buf) && xfer->len) {
150862306a36Sopenharmony_ci			reinit_completion(&ctlr->xfer_completion);
150962306a36Sopenharmony_ci
151062306a36Sopenharmony_cifallback_pio:
151162306a36Sopenharmony_ci			spi_dma_sync_for_device(ctlr, xfer);
151262306a36Sopenharmony_ci			ret = ctlr->transfer_one(ctlr, msg->spi, xfer);
151362306a36Sopenharmony_ci			if (ret < 0) {
151462306a36Sopenharmony_ci				spi_dma_sync_for_cpu(ctlr, xfer);
151562306a36Sopenharmony_ci
151662306a36Sopenharmony_ci				if (ctlr->cur_msg_mapped &&
151762306a36Sopenharmony_ci				   (xfer->error & SPI_TRANS_FAIL_NO_START)) {
151862306a36Sopenharmony_ci					__spi_unmap_msg(ctlr, msg);
151962306a36Sopenharmony_ci					ctlr->fallback = true;
152062306a36Sopenharmony_ci					xfer->error &= ~SPI_TRANS_FAIL_NO_START;
152162306a36Sopenharmony_ci					goto fallback_pio;
152262306a36Sopenharmony_ci				}
152362306a36Sopenharmony_ci
152462306a36Sopenharmony_ci				SPI_STATISTICS_INCREMENT_FIELD(statm,
152562306a36Sopenharmony_ci							       errors);
152662306a36Sopenharmony_ci				SPI_STATISTICS_INCREMENT_FIELD(stats,
152762306a36Sopenharmony_ci							       errors);
152862306a36Sopenharmony_ci				dev_err(&msg->spi->dev,
152962306a36Sopenharmony_ci					"SPI transfer failed: %d\n", ret);
153062306a36Sopenharmony_ci				goto out;
153162306a36Sopenharmony_ci			}
153262306a36Sopenharmony_ci
153362306a36Sopenharmony_ci			if (ret > 0) {
153462306a36Sopenharmony_ci				ret = spi_transfer_wait(ctlr, msg, xfer);
153562306a36Sopenharmony_ci				if (ret < 0)
153662306a36Sopenharmony_ci					msg->status = ret;
153762306a36Sopenharmony_ci			}
153862306a36Sopenharmony_ci
153962306a36Sopenharmony_ci			spi_dma_sync_for_cpu(ctlr, xfer);
154062306a36Sopenharmony_ci		} else {
154162306a36Sopenharmony_ci			if (xfer->len)
154262306a36Sopenharmony_ci				dev_err(&msg->spi->dev,
154362306a36Sopenharmony_ci					"Bufferless transfer has length %u\n",
154462306a36Sopenharmony_ci					xfer->len);
154562306a36Sopenharmony_ci		}
154662306a36Sopenharmony_ci
154762306a36Sopenharmony_ci		if (!ctlr->ptp_sts_supported) {
154862306a36Sopenharmony_ci			ptp_read_system_postts(xfer->ptp_sts);
154962306a36Sopenharmony_ci			xfer->ptp_sts_word_post = xfer->len;
155062306a36Sopenharmony_ci		}
155162306a36Sopenharmony_ci
155262306a36Sopenharmony_ci		trace_spi_transfer_stop(msg, xfer);
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_ci		if (msg->status != -EINPROGRESS)
155562306a36Sopenharmony_ci			goto out;
155662306a36Sopenharmony_ci
155762306a36Sopenharmony_ci		spi_transfer_delay_exec(xfer);
155862306a36Sopenharmony_ci
155962306a36Sopenharmony_ci		if (xfer->cs_change) {
156062306a36Sopenharmony_ci			if (list_is_last(&xfer->transfer_list,
156162306a36Sopenharmony_ci					 &msg->transfers)) {
156262306a36Sopenharmony_ci				keep_cs = true;
156362306a36Sopenharmony_ci			} else {
156462306a36Sopenharmony_ci				if (!xfer->cs_off)
156562306a36Sopenharmony_ci					spi_set_cs(msg->spi, false, false);
156662306a36Sopenharmony_ci				_spi_transfer_cs_change_delay(msg, xfer);
156762306a36Sopenharmony_ci				if (!list_next_entry(xfer, transfer_list)->cs_off)
156862306a36Sopenharmony_ci					spi_set_cs(msg->spi, true, false);
156962306a36Sopenharmony_ci			}
157062306a36Sopenharmony_ci		} else if (!list_is_last(&xfer->transfer_list, &msg->transfers) &&
157162306a36Sopenharmony_ci			   xfer->cs_off != list_next_entry(xfer, transfer_list)->cs_off) {
157262306a36Sopenharmony_ci			spi_set_cs(msg->spi, xfer->cs_off, false);
157362306a36Sopenharmony_ci		}
157462306a36Sopenharmony_ci
157562306a36Sopenharmony_ci		msg->actual_length += xfer->len;
157662306a36Sopenharmony_ci	}
157762306a36Sopenharmony_ci
157862306a36Sopenharmony_ciout:
157962306a36Sopenharmony_ci	if (ret != 0 || !keep_cs)
158062306a36Sopenharmony_ci		spi_set_cs(msg->spi, false, false);
158162306a36Sopenharmony_ci
158262306a36Sopenharmony_ci	if (msg->status == -EINPROGRESS)
158362306a36Sopenharmony_ci		msg->status = ret;
158462306a36Sopenharmony_ci
158562306a36Sopenharmony_ci	if (msg->status && ctlr->handle_err)
158662306a36Sopenharmony_ci		ctlr->handle_err(ctlr, msg);
158762306a36Sopenharmony_ci
158862306a36Sopenharmony_ci	spi_finalize_current_message(ctlr);
158962306a36Sopenharmony_ci
159062306a36Sopenharmony_ci	return ret;
159162306a36Sopenharmony_ci}
159262306a36Sopenharmony_ci
159362306a36Sopenharmony_ci/**
159462306a36Sopenharmony_ci * spi_finalize_current_transfer - report completion of a transfer
159562306a36Sopenharmony_ci * @ctlr: the controller reporting completion
159662306a36Sopenharmony_ci *
159762306a36Sopenharmony_ci * Called by SPI drivers using the core transfer_one_message()
159862306a36Sopenharmony_ci * implementation to notify it that the current interrupt driven
159962306a36Sopenharmony_ci * transfer has finished and the next one may be scheduled.
160062306a36Sopenharmony_ci */
160162306a36Sopenharmony_civoid spi_finalize_current_transfer(struct spi_controller *ctlr)
160262306a36Sopenharmony_ci{
160362306a36Sopenharmony_ci	complete(&ctlr->xfer_completion);
160462306a36Sopenharmony_ci}
160562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_finalize_current_transfer);
160662306a36Sopenharmony_ci
160762306a36Sopenharmony_cistatic void spi_idle_runtime_pm(struct spi_controller *ctlr)
160862306a36Sopenharmony_ci{
160962306a36Sopenharmony_ci	if (ctlr->auto_runtime_pm) {
161062306a36Sopenharmony_ci		pm_runtime_mark_last_busy(ctlr->dev.parent);
161162306a36Sopenharmony_ci		pm_runtime_put_autosuspend(ctlr->dev.parent);
161262306a36Sopenharmony_ci	}
161362306a36Sopenharmony_ci}
161462306a36Sopenharmony_ci
161562306a36Sopenharmony_cistatic int __spi_pump_transfer_message(struct spi_controller *ctlr,
161662306a36Sopenharmony_ci		struct spi_message *msg, bool was_busy)
161762306a36Sopenharmony_ci{
161862306a36Sopenharmony_ci	struct spi_transfer *xfer;
161962306a36Sopenharmony_ci	int ret;
162062306a36Sopenharmony_ci
162162306a36Sopenharmony_ci	if (!was_busy && ctlr->auto_runtime_pm) {
162262306a36Sopenharmony_ci		ret = pm_runtime_get_sync(ctlr->dev.parent);
162362306a36Sopenharmony_ci		if (ret < 0) {
162462306a36Sopenharmony_ci			pm_runtime_put_noidle(ctlr->dev.parent);
162562306a36Sopenharmony_ci			dev_err(&ctlr->dev, "Failed to power device: %d\n",
162662306a36Sopenharmony_ci				ret);
162762306a36Sopenharmony_ci
162862306a36Sopenharmony_ci			msg->status = ret;
162962306a36Sopenharmony_ci			spi_finalize_current_message(ctlr);
163062306a36Sopenharmony_ci
163162306a36Sopenharmony_ci			return ret;
163262306a36Sopenharmony_ci		}
163362306a36Sopenharmony_ci	}
163462306a36Sopenharmony_ci
163562306a36Sopenharmony_ci	if (!was_busy)
163662306a36Sopenharmony_ci		trace_spi_controller_busy(ctlr);
163762306a36Sopenharmony_ci
163862306a36Sopenharmony_ci	if (!was_busy && ctlr->prepare_transfer_hardware) {
163962306a36Sopenharmony_ci		ret = ctlr->prepare_transfer_hardware(ctlr);
164062306a36Sopenharmony_ci		if (ret) {
164162306a36Sopenharmony_ci			dev_err(&ctlr->dev,
164262306a36Sopenharmony_ci				"failed to prepare transfer hardware: %d\n",
164362306a36Sopenharmony_ci				ret);
164462306a36Sopenharmony_ci
164562306a36Sopenharmony_ci			if (ctlr->auto_runtime_pm)
164662306a36Sopenharmony_ci				pm_runtime_put(ctlr->dev.parent);
164762306a36Sopenharmony_ci
164862306a36Sopenharmony_ci			msg->status = ret;
164962306a36Sopenharmony_ci			spi_finalize_current_message(ctlr);
165062306a36Sopenharmony_ci
165162306a36Sopenharmony_ci			return ret;
165262306a36Sopenharmony_ci		}
165362306a36Sopenharmony_ci	}
165462306a36Sopenharmony_ci
165562306a36Sopenharmony_ci	trace_spi_message_start(msg);
165662306a36Sopenharmony_ci
165762306a36Sopenharmony_ci	ret = spi_split_transfers_maxsize(ctlr, msg,
165862306a36Sopenharmony_ci					  spi_max_transfer_size(msg->spi),
165962306a36Sopenharmony_ci					  GFP_KERNEL | GFP_DMA);
166062306a36Sopenharmony_ci	if (ret) {
166162306a36Sopenharmony_ci		msg->status = ret;
166262306a36Sopenharmony_ci		spi_finalize_current_message(ctlr);
166362306a36Sopenharmony_ci		return ret;
166462306a36Sopenharmony_ci	}
166562306a36Sopenharmony_ci
166662306a36Sopenharmony_ci	if (ctlr->prepare_message) {
166762306a36Sopenharmony_ci		ret = ctlr->prepare_message(ctlr, msg);
166862306a36Sopenharmony_ci		if (ret) {
166962306a36Sopenharmony_ci			dev_err(&ctlr->dev, "failed to prepare message: %d\n",
167062306a36Sopenharmony_ci				ret);
167162306a36Sopenharmony_ci			msg->status = ret;
167262306a36Sopenharmony_ci			spi_finalize_current_message(ctlr);
167362306a36Sopenharmony_ci			return ret;
167462306a36Sopenharmony_ci		}
167562306a36Sopenharmony_ci		msg->prepared = true;
167662306a36Sopenharmony_ci	}
167762306a36Sopenharmony_ci
167862306a36Sopenharmony_ci	ret = spi_map_msg(ctlr, msg);
167962306a36Sopenharmony_ci	if (ret) {
168062306a36Sopenharmony_ci		msg->status = ret;
168162306a36Sopenharmony_ci		spi_finalize_current_message(ctlr);
168262306a36Sopenharmony_ci		return ret;
168362306a36Sopenharmony_ci	}
168462306a36Sopenharmony_ci
168562306a36Sopenharmony_ci	if (!ctlr->ptp_sts_supported && !ctlr->transfer_one) {
168662306a36Sopenharmony_ci		list_for_each_entry(xfer, &msg->transfers, transfer_list) {
168762306a36Sopenharmony_ci			xfer->ptp_sts_word_pre = 0;
168862306a36Sopenharmony_ci			ptp_read_system_prets(xfer->ptp_sts);
168962306a36Sopenharmony_ci		}
169062306a36Sopenharmony_ci	}
169162306a36Sopenharmony_ci
169262306a36Sopenharmony_ci	/*
169362306a36Sopenharmony_ci	 * Drivers implementation of transfer_one_message() must arrange for
169462306a36Sopenharmony_ci	 * spi_finalize_current_message() to get called. Most drivers will do
169562306a36Sopenharmony_ci	 * this in the calling context, but some don't. For those cases, a
169662306a36Sopenharmony_ci	 * completion is used to guarantee that this function does not return
169762306a36Sopenharmony_ci	 * until spi_finalize_current_message() is done accessing
169862306a36Sopenharmony_ci	 * ctlr->cur_msg.
169962306a36Sopenharmony_ci	 * Use of the following two flags enable to opportunistically skip the
170062306a36Sopenharmony_ci	 * use of the completion since its use involves expensive spin locks.
170162306a36Sopenharmony_ci	 * In case of a race with the context that calls
170262306a36Sopenharmony_ci	 * spi_finalize_current_message() the completion will always be used,
170362306a36Sopenharmony_ci	 * due to strict ordering of these flags using barriers.
170462306a36Sopenharmony_ci	 */
170562306a36Sopenharmony_ci	WRITE_ONCE(ctlr->cur_msg_incomplete, true);
170662306a36Sopenharmony_ci	WRITE_ONCE(ctlr->cur_msg_need_completion, false);
170762306a36Sopenharmony_ci	reinit_completion(&ctlr->cur_msg_completion);
170862306a36Sopenharmony_ci	smp_wmb(); /* Make these available to spi_finalize_current_message() */
170962306a36Sopenharmony_ci
171062306a36Sopenharmony_ci	ret = ctlr->transfer_one_message(ctlr, msg);
171162306a36Sopenharmony_ci	if (ret) {
171262306a36Sopenharmony_ci		dev_err(&ctlr->dev,
171362306a36Sopenharmony_ci			"failed to transfer one message from queue\n");
171462306a36Sopenharmony_ci		return ret;
171562306a36Sopenharmony_ci	}
171662306a36Sopenharmony_ci
171762306a36Sopenharmony_ci	WRITE_ONCE(ctlr->cur_msg_need_completion, true);
171862306a36Sopenharmony_ci	smp_mb(); /* See spi_finalize_current_message()... */
171962306a36Sopenharmony_ci	if (READ_ONCE(ctlr->cur_msg_incomplete))
172062306a36Sopenharmony_ci		wait_for_completion(&ctlr->cur_msg_completion);
172162306a36Sopenharmony_ci
172262306a36Sopenharmony_ci	return 0;
172362306a36Sopenharmony_ci}
172462306a36Sopenharmony_ci
172562306a36Sopenharmony_ci/**
172662306a36Sopenharmony_ci * __spi_pump_messages - function which processes SPI message queue
172762306a36Sopenharmony_ci * @ctlr: controller to process queue for
172862306a36Sopenharmony_ci * @in_kthread: true if we are in the context of the message pump thread
172962306a36Sopenharmony_ci *
173062306a36Sopenharmony_ci * This function checks if there is any SPI message in the queue that
173162306a36Sopenharmony_ci * needs processing and if so call out to the driver to initialize hardware
173262306a36Sopenharmony_ci * and transfer each message.
173362306a36Sopenharmony_ci *
173462306a36Sopenharmony_ci * Note that it is called both from the kthread itself and also from
173562306a36Sopenharmony_ci * inside spi_sync(); the queue extraction handling at the top of the
173662306a36Sopenharmony_ci * function should deal with this safely.
173762306a36Sopenharmony_ci */
173862306a36Sopenharmony_cistatic void __spi_pump_messages(struct spi_controller *ctlr, bool in_kthread)
173962306a36Sopenharmony_ci{
174062306a36Sopenharmony_ci	struct spi_message *msg;
174162306a36Sopenharmony_ci	bool was_busy = false;
174262306a36Sopenharmony_ci	unsigned long flags;
174362306a36Sopenharmony_ci	int ret;
174462306a36Sopenharmony_ci
174562306a36Sopenharmony_ci	/* Take the I/O mutex */
174662306a36Sopenharmony_ci	mutex_lock(&ctlr->io_mutex);
174762306a36Sopenharmony_ci
174862306a36Sopenharmony_ci	/* Lock queue */
174962306a36Sopenharmony_ci	spin_lock_irqsave(&ctlr->queue_lock, flags);
175062306a36Sopenharmony_ci
175162306a36Sopenharmony_ci	/* Make sure we are not already running a message */
175262306a36Sopenharmony_ci	if (ctlr->cur_msg)
175362306a36Sopenharmony_ci		goto out_unlock;
175462306a36Sopenharmony_ci
175562306a36Sopenharmony_ci	/* Check if the queue is idle */
175662306a36Sopenharmony_ci	if (list_empty(&ctlr->queue) || !ctlr->running) {
175762306a36Sopenharmony_ci		if (!ctlr->busy)
175862306a36Sopenharmony_ci			goto out_unlock;
175962306a36Sopenharmony_ci
176062306a36Sopenharmony_ci		/* Defer any non-atomic teardown to the thread */
176162306a36Sopenharmony_ci		if (!in_kthread) {
176262306a36Sopenharmony_ci			if (!ctlr->dummy_rx && !ctlr->dummy_tx &&
176362306a36Sopenharmony_ci			    !ctlr->unprepare_transfer_hardware) {
176462306a36Sopenharmony_ci				spi_idle_runtime_pm(ctlr);
176562306a36Sopenharmony_ci				ctlr->busy = false;
176662306a36Sopenharmony_ci				ctlr->queue_empty = true;
176762306a36Sopenharmony_ci				trace_spi_controller_idle(ctlr);
176862306a36Sopenharmony_ci			} else {
176962306a36Sopenharmony_ci				kthread_queue_work(ctlr->kworker,
177062306a36Sopenharmony_ci						   &ctlr->pump_messages);
177162306a36Sopenharmony_ci			}
177262306a36Sopenharmony_ci			goto out_unlock;
177362306a36Sopenharmony_ci		}
177462306a36Sopenharmony_ci
177562306a36Sopenharmony_ci		ctlr->busy = false;
177662306a36Sopenharmony_ci		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
177762306a36Sopenharmony_ci
177862306a36Sopenharmony_ci		kfree(ctlr->dummy_rx);
177962306a36Sopenharmony_ci		ctlr->dummy_rx = NULL;
178062306a36Sopenharmony_ci		kfree(ctlr->dummy_tx);
178162306a36Sopenharmony_ci		ctlr->dummy_tx = NULL;
178262306a36Sopenharmony_ci		if (ctlr->unprepare_transfer_hardware &&
178362306a36Sopenharmony_ci		    ctlr->unprepare_transfer_hardware(ctlr))
178462306a36Sopenharmony_ci			dev_err(&ctlr->dev,
178562306a36Sopenharmony_ci				"failed to unprepare transfer hardware\n");
178662306a36Sopenharmony_ci		spi_idle_runtime_pm(ctlr);
178762306a36Sopenharmony_ci		trace_spi_controller_idle(ctlr);
178862306a36Sopenharmony_ci
178962306a36Sopenharmony_ci		spin_lock_irqsave(&ctlr->queue_lock, flags);
179062306a36Sopenharmony_ci		ctlr->queue_empty = true;
179162306a36Sopenharmony_ci		goto out_unlock;
179262306a36Sopenharmony_ci	}
179362306a36Sopenharmony_ci
179462306a36Sopenharmony_ci	/* Extract head of queue */
179562306a36Sopenharmony_ci	msg = list_first_entry(&ctlr->queue, struct spi_message, queue);
179662306a36Sopenharmony_ci	ctlr->cur_msg = msg;
179762306a36Sopenharmony_ci
179862306a36Sopenharmony_ci	list_del_init(&msg->queue);
179962306a36Sopenharmony_ci	if (ctlr->busy)
180062306a36Sopenharmony_ci		was_busy = true;
180162306a36Sopenharmony_ci	else
180262306a36Sopenharmony_ci		ctlr->busy = true;
180362306a36Sopenharmony_ci	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
180462306a36Sopenharmony_ci
180562306a36Sopenharmony_ci	ret = __spi_pump_transfer_message(ctlr, msg, was_busy);
180662306a36Sopenharmony_ci	kthread_queue_work(ctlr->kworker, &ctlr->pump_messages);
180762306a36Sopenharmony_ci
180862306a36Sopenharmony_ci	ctlr->cur_msg = NULL;
180962306a36Sopenharmony_ci	ctlr->fallback = false;
181062306a36Sopenharmony_ci
181162306a36Sopenharmony_ci	mutex_unlock(&ctlr->io_mutex);
181262306a36Sopenharmony_ci
181362306a36Sopenharmony_ci	/* Prod the scheduler in case transfer_one() was busy waiting */
181462306a36Sopenharmony_ci	if (!ret)
181562306a36Sopenharmony_ci		cond_resched();
181662306a36Sopenharmony_ci	return;
181762306a36Sopenharmony_ci
181862306a36Sopenharmony_ciout_unlock:
181962306a36Sopenharmony_ci	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
182062306a36Sopenharmony_ci	mutex_unlock(&ctlr->io_mutex);
182162306a36Sopenharmony_ci}
182262306a36Sopenharmony_ci
182362306a36Sopenharmony_ci/**
182462306a36Sopenharmony_ci * spi_pump_messages - kthread work function which processes spi message queue
182562306a36Sopenharmony_ci * @work: pointer to kthread work struct contained in the controller struct
182662306a36Sopenharmony_ci */
182762306a36Sopenharmony_cistatic void spi_pump_messages(struct kthread_work *work)
182862306a36Sopenharmony_ci{
182962306a36Sopenharmony_ci	struct spi_controller *ctlr =
183062306a36Sopenharmony_ci		container_of(work, struct spi_controller, pump_messages);
183162306a36Sopenharmony_ci
183262306a36Sopenharmony_ci	__spi_pump_messages(ctlr, true);
183362306a36Sopenharmony_ci}
183462306a36Sopenharmony_ci
183562306a36Sopenharmony_ci/**
183662306a36Sopenharmony_ci * spi_take_timestamp_pre - helper to collect the beginning of the TX timestamp
183762306a36Sopenharmony_ci * @ctlr: Pointer to the spi_controller structure of the driver
183862306a36Sopenharmony_ci * @xfer: Pointer to the transfer being timestamped
183962306a36Sopenharmony_ci * @progress: How many words (not bytes) have been transferred so far
184062306a36Sopenharmony_ci * @irqs_off: If true, will disable IRQs and preemption for the duration of the
184162306a36Sopenharmony_ci *	      transfer, for less jitter in time measurement. Only compatible
184262306a36Sopenharmony_ci *	      with PIO drivers. If true, must follow up with
184362306a36Sopenharmony_ci *	      spi_take_timestamp_post or otherwise system will crash.
184462306a36Sopenharmony_ci *	      WARNING: for fully predictable results, the CPU frequency must
184562306a36Sopenharmony_ci *	      also be under control (governor).
184662306a36Sopenharmony_ci *
184762306a36Sopenharmony_ci * This is a helper for drivers to collect the beginning of the TX timestamp
184862306a36Sopenharmony_ci * for the requested byte from the SPI transfer. The frequency with which this
184962306a36Sopenharmony_ci * function must be called (once per word, once for the whole transfer, once
185062306a36Sopenharmony_ci * per batch of words etc) is arbitrary as long as the @tx buffer offset is
185162306a36Sopenharmony_ci * greater than or equal to the requested byte at the time of the call. The
185262306a36Sopenharmony_ci * timestamp is only taken once, at the first such call. It is assumed that
185362306a36Sopenharmony_ci * the driver advances its @tx buffer pointer monotonically.
185462306a36Sopenharmony_ci */
185562306a36Sopenharmony_civoid spi_take_timestamp_pre(struct spi_controller *ctlr,
185662306a36Sopenharmony_ci			    struct spi_transfer *xfer,
185762306a36Sopenharmony_ci			    size_t progress, bool irqs_off)
185862306a36Sopenharmony_ci{
185962306a36Sopenharmony_ci	if (!xfer->ptp_sts)
186062306a36Sopenharmony_ci		return;
186162306a36Sopenharmony_ci
186262306a36Sopenharmony_ci	if (xfer->timestamped)
186362306a36Sopenharmony_ci		return;
186462306a36Sopenharmony_ci
186562306a36Sopenharmony_ci	if (progress > xfer->ptp_sts_word_pre)
186662306a36Sopenharmony_ci		return;
186762306a36Sopenharmony_ci
186862306a36Sopenharmony_ci	/* Capture the resolution of the timestamp */
186962306a36Sopenharmony_ci	xfer->ptp_sts_word_pre = progress;
187062306a36Sopenharmony_ci
187162306a36Sopenharmony_ci	if (irqs_off) {
187262306a36Sopenharmony_ci		local_irq_save(ctlr->irq_flags);
187362306a36Sopenharmony_ci		preempt_disable();
187462306a36Sopenharmony_ci	}
187562306a36Sopenharmony_ci
187662306a36Sopenharmony_ci	ptp_read_system_prets(xfer->ptp_sts);
187762306a36Sopenharmony_ci}
187862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_take_timestamp_pre);
187962306a36Sopenharmony_ci
188062306a36Sopenharmony_ci/**
188162306a36Sopenharmony_ci * spi_take_timestamp_post - helper to collect the end of the TX timestamp
188262306a36Sopenharmony_ci * @ctlr: Pointer to the spi_controller structure of the driver
188362306a36Sopenharmony_ci * @xfer: Pointer to the transfer being timestamped
188462306a36Sopenharmony_ci * @progress: How many words (not bytes) have been transferred so far
188562306a36Sopenharmony_ci * @irqs_off: If true, will re-enable IRQs and preemption for the local CPU.
188662306a36Sopenharmony_ci *
188762306a36Sopenharmony_ci * This is a helper for drivers to collect the end of the TX timestamp for
188862306a36Sopenharmony_ci * the requested byte from the SPI transfer. Can be called with an arbitrary
188962306a36Sopenharmony_ci * frequency: only the first call where @tx exceeds or is equal to the
189062306a36Sopenharmony_ci * requested word will be timestamped.
189162306a36Sopenharmony_ci */
189262306a36Sopenharmony_civoid spi_take_timestamp_post(struct spi_controller *ctlr,
189362306a36Sopenharmony_ci			     struct spi_transfer *xfer,
189462306a36Sopenharmony_ci			     size_t progress, bool irqs_off)
189562306a36Sopenharmony_ci{
189662306a36Sopenharmony_ci	if (!xfer->ptp_sts)
189762306a36Sopenharmony_ci		return;
189862306a36Sopenharmony_ci
189962306a36Sopenharmony_ci	if (xfer->timestamped)
190062306a36Sopenharmony_ci		return;
190162306a36Sopenharmony_ci
190262306a36Sopenharmony_ci	if (progress < xfer->ptp_sts_word_post)
190362306a36Sopenharmony_ci		return;
190462306a36Sopenharmony_ci
190562306a36Sopenharmony_ci	ptp_read_system_postts(xfer->ptp_sts);
190662306a36Sopenharmony_ci
190762306a36Sopenharmony_ci	if (irqs_off) {
190862306a36Sopenharmony_ci		local_irq_restore(ctlr->irq_flags);
190962306a36Sopenharmony_ci		preempt_enable();
191062306a36Sopenharmony_ci	}
191162306a36Sopenharmony_ci
191262306a36Sopenharmony_ci	/* Capture the resolution of the timestamp */
191362306a36Sopenharmony_ci	xfer->ptp_sts_word_post = progress;
191462306a36Sopenharmony_ci
191562306a36Sopenharmony_ci	xfer->timestamped = 1;
191662306a36Sopenharmony_ci}
191762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_take_timestamp_post);
191862306a36Sopenharmony_ci
191962306a36Sopenharmony_ci/**
192062306a36Sopenharmony_ci * spi_set_thread_rt - set the controller to pump at realtime priority
192162306a36Sopenharmony_ci * @ctlr: controller to boost priority of
192262306a36Sopenharmony_ci *
192362306a36Sopenharmony_ci * This can be called because the controller requested realtime priority
192462306a36Sopenharmony_ci * (by setting the ->rt value before calling spi_register_controller()) or
192562306a36Sopenharmony_ci * because a device on the bus said that its transfers needed realtime
192662306a36Sopenharmony_ci * priority.
192762306a36Sopenharmony_ci *
192862306a36Sopenharmony_ci * NOTE: at the moment if any device on a bus says it needs realtime then
192962306a36Sopenharmony_ci * the thread will be at realtime priority for all transfers on that
193062306a36Sopenharmony_ci * controller.  If this eventually becomes a problem we may see if we can
193162306a36Sopenharmony_ci * find a way to boost the priority only temporarily during relevant
193262306a36Sopenharmony_ci * transfers.
193362306a36Sopenharmony_ci */
193462306a36Sopenharmony_cistatic void spi_set_thread_rt(struct spi_controller *ctlr)
193562306a36Sopenharmony_ci{
193662306a36Sopenharmony_ci	dev_info(&ctlr->dev,
193762306a36Sopenharmony_ci		"will run message pump with realtime priority\n");
193862306a36Sopenharmony_ci	sched_set_fifo(ctlr->kworker->task);
193962306a36Sopenharmony_ci}
194062306a36Sopenharmony_ci
194162306a36Sopenharmony_cistatic int spi_init_queue(struct spi_controller *ctlr)
194262306a36Sopenharmony_ci{
194362306a36Sopenharmony_ci	ctlr->running = false;
194462306a36Sopenharmony_ci	ctlr->busy = false;
194562306a36Sopenharmony_ci	ctlr->queue_empty = true;
194662306a36Sopenharmony_ci
194762306a36Sopenharmony_ci	ctlr->kworker = kthread_create_worker(0, dev_name(&ctlr->dev));
194862306a36Sopenharmony_ci	if (IS_ERR(ctlr->kworker)) {
194962306a36Sopenharmony_ci		dev_err(&ctlr->dev, "failed to create message pump kworker\n");
195062306a36Sopenharmony_ci		return PTR_ERR(ctlr->kworker);
195162306a36Sopenharmony_ci	}
195262306a36Sopenharmony_ci
195362306a36Sopenharmony_ci	kthread_init_work(&ctlr->pump_messages, spi_pump_messages);
195462306a36Sopenharmony_ci
195562306a36Sopenharmony_ci	/*
195662306a36Sopenharmony_ci	 * Controller config will indicate if this controller should run the
195762306a36Sopenharmony_ci	 * message pump with high (realtime) priority to reduce the transfer
195862306a36Sopenharmony_ci	 * latency on the bus by minimising the delay between a transfer
195962306a36Sopenharmony_ci	 * request and the scheduling of the message pump thread. Without this
196062306a36Sopenharmony_ci	 * setting the message pump thread will remain at default priority.
196162306a36Sopenharmony_ci	 */
196262306a36Sopenharmony_ci	if (ctlr->rt)
196362306a36Sopenharmony_ci		spi_set_thread_rt(ctlr);
196462306a36Sopenharmony_ci
196562306a36Sopenharmony_ci	return 0;
196662306a36Sopenharmony_ci}
196762306a36Sopenharmony_ci
196862306a36Sopenharmony_ci/**
196962306a36Sopenharmony_ci * spi_get_next_queued_message() - called by driver to check for queued
197062306a36Sopenharmony_ci * messages
197162306a36Sopenharmony_ci * @ctlr: the controller to check for queued messages
197262306a36Sopenharmony_ci *
197362306a36Sopenharmony_ci * If there are more messages in the queue, the next message is returned from
197462306a36Sopenharmony_ci * this call.
197562306a36Sopenharmony_ci *
197662306a36Sopenharmony_ci * Return: the next message in the queue, else NULL if the queue is empty.
197762306a36Sopenharmony_ci */
197862306a36Sopenharmony_cistruct spi_message *spi_get_next_queued_message(struct spi_controller *ctlr)
197962306a36Sopenharmony_ci{
198062306a36Sopenharmony_ci	struct spi_message *next;
198162306a36Sopenharmony_ci	unsigned long flags;
198262306a36Sopenharmony_ci
198362306a36Sopenharmony_ci	/* Get a pointer to the next message, if any */
198462306a36Sopenharmony_ci	spin_lock_irqsave(&ctlr->queue_lock, flags);
198562306a36Sopenharmony_ci	next = list_first_entry_or_null(&ctlr->queue, struct spi_message,
198662306a36Sopenharmony_ci					queue);
198762306a36Sopenharmony_ci	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
198862306a36Sopenharmony_ci
198962306a36Sopenharmony_ci	return next;
199062306a36Sopenharmony_ci}
199162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_get_next_queued_message);
199262306a36Sopenharmony_ci
199362306a36Sopenharmony_ci/**
199462306a36Sopenharmony_ci * spi_finalize_current_message() - the current message is complete
199562306a36Sopenharmony_ci * @ctlr: the controller to return the message to
199662306a36Sopenharmony_ci *
199762306a36Sopenharmony_ci * Called by the driver to notify the core that the message in the front of the
199862306a36Sopenharmony_ci * queue is complete and can be removed from the queue.
199962306a36Sopenharmony_ci */
200062306a36Sopenharmony_civoid spi_finalize_current_message(struct spi_controller *ctlr)
200162306a36Sopenharmony_ci{
200262306a36Sopenharmony_ci	struct spi_transfer *xfer;
200362306a36Sopenharmony_ci	struct spi_message *mesg;
200462306a36Sopenharmony_ci	int ret;
200562306a36Sopenharmony_ci
200662306a36Sopenharmony_ci	mesg = ctlr->cur_msg;
200762306a36Sopenharmony_ci
200862306a36Sopenharmony_ci	if (!ctlr->ptp_sts_supported && !ctlr->transfer_one) {
200962306a36Sopenharmony_ci		list_for_each_entry(xfer, &mesg->transfers, transfer_list) {
201062306a36Sopenharmony_ci			ptp_read_system_postts(xfer->ptp_sts);
201162306a36Sopenharmony_ci			xfer->ptp_sts_word_post = xfer->len;
201262306a36Sopenharmony_ci		}
201362306a36Sopenharmony_ci	}
201462306a36Sopenharmony_ci
201562306a36Sopenharmony_ci	if (unlikely(ctlr->ptp_sts_supported))
201662306a36Sopenharmony_ci		list_for_each_entry(xfer, &mesg->transfers, transfer_list)
201762306a36Sopenharmony_ci			WARN_ON_ONCE(xfer->ptp_sts && !xfer->timestamped);
201862306a36Sopenharmony_ci
201962306a36Sopenharmony_ci	spi_unmap_msg(ctlr, mesg);
202062306a36Sopenharmony_ci
202162306a36Sopenharmony_ci	/*
202262306a36Sopenharmony_ci	 * In the prepare_messages callback the SPI bus has the opportunity
202362306a36Sopenharmony_ci	 * to split a transfer to smaller chunks.
202462306a36Sopenharmony_ci	 *
202562306a36Sopenharmony_ci	 * Release the split transfers here since spi_map_msg() is done on
202662306a36Sopenharmony_ci	 * the split transfers.
202762306a36Sopenharmony_ci	 */
202862306a36Sopenharmony_ci	spi_res_release(ctlr, mesg);
202962306a36Sopenharmony_ci
203062306a36Sopenharmony_ci	if (mesg->prepared && ctlr->unprepare_message) {
203162306a36Sopenharmony_ci		ret = ctlr->unprepare_message(ctlr, mesg);
203262306a36Sopenharmony_ci		if (ret) {
203362306a36Sopenharmony_ci			dev_err(&ctlr->dev, "failed to unprepare message: %d\n",
203462306a36Sopenharmony_ci				ret);
203562306a36Sopenharmony_ci		}
203662306a36Sopenharmony_ci	}
203762306a36Sopenharmony_ci
203862306a36Sopenharmony_ci	mesg->prepared = false;
203962306a36Sopenharmony_ci
204062306a36Sopenharmony_ci	WRITE_ONCE(ctlr->cur_msg_incomplete, false);
204162306a36Sopenharmony_ci	smp_mb(); /* See __spi_pump_transfer_message()... */
204262306a36Sopenharmony_ci	if (READ_ONCE(ctlr->cur_msg_need_completion))
204362306a36Sopenharmony_ci		complete(&ctlr->cur_msg_completion);
204462306a36Sopenharmony_ci
204562306a36Sopenharmony_ci	trace_spi_message_done(mesg);
204662306a36Sopenharmony_ci
204762306a36Sopenharmony_ci	mesg->state = NULL;
204862306a36Sopenharmony_ci	if (mesg->complete)
204962306a36Sopenharmony_ci		mesg->complete(mesg->context);
205062306a36Sopenharmony_ci}
205162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_finalize_current_message);
205262306a36Sopenharmony_ci
205362306a36Sopenharmony_cistatic int spi_start_queue(struct spi_controller *ctlr)
205462306a36Sopenharmony_ci{
205562306a36Sopenharmony_ci	unsigned long flags;
205662306a36Sopenharmony_ci
205762306a36Sopenharmony_ci	spin_lock_irqsave(&ctlr->queue_lock, flags);
205862306a36Sopenharmony_ci
205962306a36Sopenharmony_ci	if (ctlr->running || ctlr->busy) {
206062306a36Sopenharmony_ci		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
206162306a36Sopenharmony_ci		return -EBUSY;
206262306a36Sopenharmony_ci	}
206362306a36Sopenharmony_ci
206462306a36Sopenharmony_ci	ctlr->running = true;
206562306a36Sopenharmony_ci	ctlr->cur_msg = NULL;
206662306a36Sopenharmony_ci	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
206762306a36Sopenharmony_ci
206862306a36Sopenharmony_ci	kthread_queue_work(ctlr->kworker, &ctlr->pump_messages);
206962306a36Sopenharmony_ci
207062306a36Sopenharmony_ci	return 0;
207162306a36Sopenharmony_ci}
207262306a36Sopenharmony_ci
207362306a36Sopenharmony_cistatic int spi_stop_queue(struct spi_controller *ctlr)
207462306a36Sopenharmony_ci{
207562306a36Sopenharmony_ci	unsigned long flags;
207662306a36Sopenharmony_ci	unsigned limit = 500;
207762306a36Sopenharmony_ci	int ret = 0;
207862306a36Sopenharmony_ci
207962306a36Sopenharmony_ci	spin_lock_irqsave(&ctlr->queue_lock, flags);
208062306a36Sopenharmony_ci
208162306a36Sopenharmony_ci	/*
208262306a36Sopenharmony_ci	 * This is a bit lame, but is optimized for the common execution path.
208362306a36Sopenharmony_ci	 * A wait_queue on the ctlr->busy could be used, but then the common
208462306a36Sopenharmony_ci	 * execution path (pump_messages) would be required to call wake_up or
208562306a36Sopenharmony_ci	 * friends on every SPI message. Do this instead.
208662306a36Sopenharmony_ci	 */
208762306a36Sopenharmony_ci	while ((!list_empty(&ctlr->queue) || ctlr->busy) && limit--) {
208862306a36Sopenharmony_ci		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
208962306a36Sopenharmony_ci		usleep_range(10000, 11000);
209062306a36Sopenharmony_ci		spin_lock_irqsave(&ctlr->queue_lock, flags);
209162306a36Sopenharmony_ci	}
209262306a36Sopenharmony_ci
209362306a36Sopenharmony_ci	if (!list_empty(&ctlr->queue) || ctlr->busy)
209462306a36Sopenharmony_ci		ret = -EBUSY;
209562306a36Sopenharmony_ci	else
209662306a36Sopenharmony_ci		ctlr->running = false;
209762306a36Sopenharmony_ci
209862306a36Sopenharmony_ci	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
209962306a36Sopenharmony_ci
210062306a36Sopenharmony_ci	if (ret) {
210162306a36Sopenharmony_ci		dev_warn(&ctlr->dev, "could not stop message queue\n");
210262306a36Sopenharmony_ci		return ret;
210362306a36Sopenharmony_ci	}
210462306a36Sopenharmony_ci	return ret;
210562306a36Sopenharmony_ci}
210662306a36Sopenharmony_ci
210762306a36Sopenharmony_cistatic int spi_destroy_queue(struct spi_controller *ctlr)
210862306a36Sopenharmony_ci{
210962306a36Sopenharmony_ci	int ret;
211062306a36Sopenharmony_ci
211162306a36Sopenharmony_ci	ret = spi_stop_queue(ctlr);
211262306a36Sopenharmony_ci
211362306a36Sopenharmony_ci	/*
211462306a36Sopenharmony_ci	 * kthread_flush_worker will block until all work is done.
211562306a36Sopenharmony_ci	 * If the reason that stop_queue timed out is that the work will never
211662306a36Sopenharmony_ci	 * finish, then it does no good to call flush/stop thread, so
211762306a36Sopenharmony_ci	 * return anyway.
211862306a36Sopenharmony_ci	 */
211962306a36Sopenharmony_ci	if (ret) {
212062306a36Sopenharmony_ci		dev_err(&ctlr->dev, "problem destroying queue\n");
212162306a36Sopenharmony_ci		return ret;
212262306a36Sopenharmony_ci	}
212362306a36Sopenharmony_ci
212462306a36Sopenharmony_ci	kthread_destroy_worker(ctlr->kworker);
212562306a36Sopenharmony_ci
212662306a36Sopenharmony_ci	return 0;
212762306a36Sopenharmony_ci}
212862306a36Sopenharmony_ci
212962306a36Sopenharmony_cistatic int __spi_queued_transfer(struct spi_device *spi,
213062306a36Sopenharmony_ci				 struct spi_message *msg,
213162306a36Sopenharmony_ci				 bool need_pump)
213262306a36Sopenharmony_ci{
213362306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
213462306a36Sopenharmony_ci	unsigned long flags;
213562306a36Sopenharmony_ci
213662306a36Sopenharmony_ci	spin_lock_irqsave(&ctlr->queue_lock, flags);
213762306a36Sopenharmony_ci
213862306a36Sopenharmony_ci	if (!ctlr->running) {
213962306a36Sopenharmony_ci		spin_unlock_irqrestore(&ctlr->queue_lock, flags);
214062306a36Sopenharmony_ci		return -ESHUTDOWN;
214162306a36Sopenharmony_ci	}
214262306a36Sopenharmony_ci	msg->actual_length = 0;
214362306a36Sopenharmony_ci	msg->status = -EINPROGRESS;
214462306a36Sopenharmony_ci
214562306a36Sopenharmony_ci	list_add_tail(&msg->queue, &ctlr->queue);
214662306a36Sopenharmony_ci	ctlr->queue_empty = false;
214762306a36Sopenharmony_ci	if (!ctlr->busy && need_pump)
214862306a36Sopenharmony_ci		kthread_queue_work(ctlr->kworker, &ctlr->pump_messages);
214962306a36Sopenharmony_ci
215062306a36Sopenharmony_ci	spin_unlock_irqrestore(&ctlr->queue_lock, flags);
215162306a36Sopenharmony_ci	return 0;
215262306a36Sopenharmony_ci}
215362306a36Sopenharmony_ci
215462306a36Sopenharmony_ci/**
215562306a36Sopenharmony_ci * spi_queued_transfer - transfer function for queued transfers
215662306a36Sopenharmony_ci * @spi: SPI device which is requesting transfer
215762306a36Sopenharmony_ci * @msg: SPI message which is to handled is queued to driver queue
215862306a36Sopenharmony_ci *
215962306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
216062306a36Sopenharmony_ci */
216162306a36Sopenharmony_cistatic int spi_queued_transfer(struct spi_device *spi, struct spi_message *msg)
216262306a36Sopenharmony_ci{
216362306a36Sopenharmony_ci	return __spi_queued_transfer(spi, msg, true);
216462306a36Sopenharmony_ci}
216562306a36Sopenharmony_ci
216662306a36Sopenharmony_cistatic int spi_controller_initialize_queue(struct spi_controller *ctlr)
216762306a36Sopenharmony_ci{
216862306a36Sopenharmony_ci	int ret;
216962306a36Sopenharmony_ci
217062306a36Sopenharmony_ci	ctlr->transfer = spi_queued_transfer;
217162306a36Sopenharmony_ci	if (!ctlr->transfer_one_message)
217262306a36Sopenharmony_ci		ctlr->transfer_one_message = spi_transfer_one_message;
217362306a36Sopenharmony_ci
217462306a36Sopenharmony_ci	/* Initialize and start queue */
217562306a36Sopenharmony_ci	ret = spi_init_queue(ctlr);
217662306a36Sopenharmony_ci	if (ret) {
217762306a36Sopenharmony_ci		dev_err(&ctlr->dev, "problem initializing queue\n");
217862306a36Sopenharmony_ci		goto err_init_queue;
217962306a36Sopenharmony_ci	}
218062306a36Sopenharmony_ci	ctlr->queued = true;
218162306a36Sopenharmony_ci	ret = spi_start_queue(ctlr);
218262306a36Sopenharmony_ci	if (ret) {
218362306a36Sopenharmony_ci		dev_err(&ctlr->dev, "problem starting queue\n");
218462306a36Sopenharmony_ci		goto err_start_queue;
218562306a36Sopenharmony_ci	}
218662306a36Sopenharmony_ci
218762306a36Sopenharmony_ci	return 0;
218862306a36Sopenharmony_ci
218962306a36Sopenharmony_cierr_start_queue:
219062306a36Sopenharmony_ci	spi_destroy_queue(ctlr);
219162306a36Sopenharmony_cierr_init_queue:
219262306a36Sopenharmony_ci	return ret;
219362306a36Sopenharmony_ci}
219462306a36Sopenharmony_ci
219562306a36Sopenharmony_ci/**
219662306a36Sopenharmony_ci * spi_flush_queue - Send all pending messages in the queue from the callers'
219762306a36Sopenharmony_ci *		     context
219862306a36Sopenharmony_ci * @ctlr: controller to process queue for
219962306a36Sopenharmony_ci *
220062306a36Sopenharmony_ci * This should be used when one wants to ensure all pending messages have been
220162306a36Sopenharmony_ci * sent before doing something. Is used by the spi-mem code to make sure SPI
220262306a36Sopenharmony_ci * memory operations do not preempt regular SPI transfers that have been queued
220362306a36Sopenharmony_ci * before the spi-mem operation.
220462306a36Sopenharmony_ci */
220562306a36Sopenharmony_civoid spi_flush_queue(struct spi_controller *ctlr)
220662306a36Sopenharmony_ci{
220762306a36Sopenharmony_ci	if (ctlr->transfer == spi_queued_transfer)
220862306a36Sopenharmony_ci		__spi_pump_messages(ctlr, false);
220962306a36Sopenharmony_ci}
221062306a36Sopenharmony_ci
221162306a36Sopenharmony_ci/*-------------------------------------------------------------------------*/
221262306a36Sopenharmony_ci
221362306a36Sopenharmony_ci#if defined(CONFIG_OF)
221462306a36Sopenharmony_cistatic void of_spi_parse_dt_cs_delay(struct device_node *nc,
221562306a36Sopenharmony_ci				     struct spi_delay *delay, const char *prop)
221662306a36Sopenharmony_ci{
221762306a36Sopenharmony_ci	u32 value;
221862306a36Sopenharmony_ci
221962306a36Sopenharmony_ci	if (!of_property_read_u32(nc, prop, &value)) {
222062306a36Sopenharmony_ci		if (value > U16_MAX) {
222162306a36Sopenharmony_ci			delay->value = DIV_ROUND_UP(value, 1000);
222262306a36Sopenharmony_ci			delay->unit = SPI_DELAY_UNIT_USECS;
222362306a36Sopenharmony_ci		} else {
222462306a36Sopenharmony_ci			delay->value = value;
222562306a36Sopenharmony_ci			delay->unit = SPI_DELAY_UNIT_NSECS;
222662306a36Sopenharmony_ci		}
222762306a36Sopenharmony_ci	}
222862306a36Sopenharmony_ci}
222962306a36Sopenharmony_ci
223062306a36Sopenharmony_cistatic int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi,
223162306a36Sopenharmony_ci			   struct device_node *nc)
223262306a36Sopenharmony_ci{
223362306a36Sopenharmony_ci	u32 value;
223462306a36Sopenharmony_ci	int rc;
223562306a36Sopenharmony_ci
223662306a36Sopenharmony_ci	/* Mode (clock phase/polarity/etc.) */
223762306a36Sopenharmony_ci	if (of_property_read_bool(nc, "spi-cpha"))
223862306a36Sopenharmony_ci		spi->mode |= SPI_CPHA;
223962306a36Sopenharmony_ci	if (of_property_read_bool(nc, "spi-cpol"))
224062306a36Sopenharmony_ci		spi->mode |= SPI_CPOL;
224162306a36Sopenharmony_ci	if (of_property_read_bool(nc, "spi-3wire"))
224262306a36Sopenharmony_ci		spi->mode |= SPI_3WIRE;
224362306a36Sopenharmony_ci	if (of_property_read_bool(nc, "spi-lsb-first"))
224462306a36Sopenharmony_ci		spi->mode |= SPI_LSB_FIRST;
224562306a36Sopenharmony_ci	if (of_property_read_bool(nc, "spi-cs-high"))
224662306a36Sopenharmony_ci		spi->mode |= SPI_CS_HIGH;
224762306a36Sopenharmony_ci
224862306a36Sopenharmony_ci	/* Device DUAL/QUAD mode */
224962306a36Sopenharmony_ci	if (!of_property_read_u32(nc, "spi-tx-bus-width", &value)) {
225062306a36Sopenharmony_ci		switch (value) {
225162306a36Sopenharmony_ci		case 0:
225262306a36Sopenharmony_ci			spi->mode |= SPI_NO_TX;
225362306a36Sopenharmony_ci			break;
225462306a36Sopenharmony_ci		case 1:
225562306a36Sopenharmony_ci			break;
225662306a36Sopenharmony_ci		case 2:
225762306a36Sopenharmony_ci			spi->mode |= SPI_TX_DUAL;
225862306a36Sopenharmony_ci			break;
225962306a36Sopenharmony_ci		case 4:
226062306a36Sopenharmony_ci			spi->mode |= SPI_TX_QUAD;
226162306a36Sopenharmony_ci			break;
226262306a36Sopenharmony_ci		case 8:
226362306a36Sopenharmony_ci			spi->mode |= SPI_TX_OCTAL;
226462306a36Sopenharmony_ci			break;
226562306a36Sopenharmony_ci		default:
226662306a36Sopenharmony_ci			dev_warn(&ctlr->dev,
226762306a36Sopenharmony_ci				"spi-tx-bus-width %d not supported\n",
226862306a36Sopenharmony_ci				value);
226962306a36Sopenharmony_ci			break;
227062306a36Sopenharmony_ci		}
227162306a36Sopenharmony_ci	}
227262306a36Sopenharmony_ci
227362306a36Sopenharmony_ci	if (!of_property_read_u32(nc, "spi-rx-bus-width", &value)) {
227462306a36Sopenharmony_ci		switch (value) {
227562306a36Sopenharmony_ci		case 0:
227662306a36Sopenharmony_ci			spi->mode |= SPI_NO_RX;
227762306a36Sopenharmony_ci			break;
227862306a36Sopenharmony_ci		case 1:
227962306a36Sopenharmony_ci			break;
228062306a36Sopenharmony_ci		case 2:
228162306a36Sopenharmony_ci			spi->mode |= SPI_RX_DUAL;
228262306a36Sopenharmony_ci			break;
228362306a36Sopenharmony_ci		case 4:
228462306a36Sopenharmony_ci			spi->mode |= SPI_RX_QUAD;
228562306a36Sopenharmony_ci			break;
228662306a36Sopenharmony_ci		case 8:
228762306a36Sopenharmony_ci			spi->mode |= SPI_RX_OCTAL;
228862306a36Sopenharmony_ci			break;
228962306a36Sopenharmony_ci		default:
229062306a36Sopenharmony_ci			dev_warn(&ctlr->dev,
229162306a36Sopenharmony_ci				"spi-rx-bus-width %d not supported\n",
229262306a36Sopenharmony_ci				value);
229362306a36Sopenharmony_ci			break;
229462306a36Sopenharmony_ci		}
229562306a36Sopenharmony_ci	}
229662306a36Sopenharmony_ci
229762306a36Sopenharmony_ci	if (spi_controller_is_slave(ctlr)) {
229862306a36Sopenharmony_ci		if (!of_node_name_eq(nc, "slave")) {
229962306a36Sopenharmony_ci			dev_err(&ctlr->dev, "%pOF is not called 'slave'\n",
230062306a36Sopenharmony_ci				nc);
230162306a36Sopenharmony_ci			return -EINVAL;
230262306a36Sopenharmony_ci		}
230362306a36Sopenharmony_ci		return 0;
230462306a36Sopenharmony_ci	}
230562306a36Sopenharmony_ci
230662306a36Sopenharmony_ci	/* Device address */
230762306a36Sopenharmony_ci	rc = of_property_read_u32(nc, "reg", &value);
230862306a36Sopenharmony_ci	if (rc) {
230962306a36Sopenharmony_ci		dev_err(&ctlr->dev, "%pOF has no valid 'reg' property (%d)\n",
231062306a36Sopenharmony_ci			nc, rc);
231162306a36Sopenharmony_ci		return rc;
231262306a36Sopenharmony_ci	}
231362306a36Sopenharmony_ci	spi_set_chipselect(spi, 0, value);
231462306a36Sopenharmony_ci
231562306a36Sopenharmony_ci	/* Device speed */
231662306a36Sopenharmony_ci	if (!of_property_read_u32(nc, "spi-max-frequency", &value))
231762306a36Sopenharmony_ci		spi->max_speed_hz = value;
231862306a36Sopenharmony_ci
231962306a36Sopenharmony_ci	/* Device CS delays */
232062306a36Sopenharmony_ci	of_spi_parse_dt_cs_delay(nc, &spi->cs_setup, "spi-cs-setup-delay-ns");
232162306a36Sopenharmony_ci	of_spi_parse_dt_cs_delay(nc, &spi->cs_hold, "spi-cs-hold-delay-ns");
232262306a36Sopenharmony_ci	of_spi_parse_dt_cs_delay(nc, &spi->cs_inactive, "spi-cs-inactive-delay-ns");
232362306a36Sopenharmony_ci
232462306a36Sopenharmony_ci	return 0;
232562306a36Sopenharmony_ci}
232662306a36Sopenharmony_ci
232762306a36Sopenharmony_cistatic struct spi_device *
232862306a36Sopenharmony_ciof_register_spi_device(struct spi_controller *ctlr, struct device_node *nc)
232962306a36Sopenharmony_ci{
233062306a36Sopenharmony_ci	struct spi_device *spi;
233162306a36Sopenharmony_ci	int rc;
233262306a36Sopenharmony_ci
233362306a36Sopenharmony_ci	/* Alloc an spi_device */
233462306a36Sopenharmony_ci	spi = spi_alloc_device(ctlr);
233562306a36Sopenharmony_ci	if (!spi) {
233662306a36Sopenharmony_ci		dev_err(&ctlr->dev, "spi_device alloc error for %pOF\n", nc);
233762306a36Sopenharmony_ci		rc = -ENOMEM;
233862306a36Sopenharmony_ci		goto err_out;
233962306a36Sopenharmony_ci	}
234062306a36Sopenharmony_ci
234162306a36Sopenharmony_ci	/* Select device driver */
234262306a36Sopenharmony_ci	rc = of_alias_from_compatible(nc, spi->modalias,
234362306a36Sopenharmony_ci				      sizeof(spi->modalias));
234462306a36Sopenharmony_ci	if (rc < 0) {
234562306a36Sopenharmony_ci		dev_err(&ctlr->dev, "cannot find modalias for %pOF\n", nc);
234662306a36Sopenharmony_ci		goto err_out;
234762306a36Sopenharmony_ci	}
234862306a36Sopenharmony_ci
234962306a36Sopenharmony_ci	rc = of_spi_parse_dt(ctlr, spi, nc);
235062306a36Sopenharmony_ci	if (rc)
235162306a36Sopenharmony_ci		goto err_out;
235262306a36Sopenharmony_ci
235362306a36Sopenharmony_ci	/* Store a pointer to the node in the device structure */
235462306a36Sopenharmony_ci	of_node_get(nc);
235562306a36Sopenharmony_ci
235662306a36Sopenharmony_ci	device_set_node(&spi->dev, of_fwnode_handle(nc));
235762306a36Sopenharmony_ci
235862306a36Sopenharmony_ci	/* Register the new device */
235962306a36Sopenharmony_ci	rc = spi_add_device(spi);
236062306a36Sopenharmony_ci	if (rc) {
236162306a36Sopenharmony_ci		dev_err(&ctlr->dev, "spi_device register error %pOF\n", nc);
236262306a36Sopenharmony_ci		goto err_of_node_put;
236362306a36Sopenharmony_ci	}
236462306a36Sopenharmony_ci
236562306a36Sopenharmony_ci	return spi;
236662306a36Sopenharmony_ci
236762306a36Sopenharmony_cierr_of_node_put:
236862306a36Sopenharmony_ci	of_node_put(nc);
236962306a36Sopenharmony_cierr_out:
237062306a36Sopenharmony_ci	spi_dev_put(spi);
237162306a36Sopenharmony_ci	return ERR_PTR(rc);
237262306a36Sopenharmony_ci}
237362306a36Sopenharmony_ci
237462306a36Sopenharmony_ci/**
237562306a36Sopenharmony_ci * of_register_spi_devices() - Register child devices onto the SPI bus
237662306a36Sopenharmony_ci * @ctlr:	Pointer to spi_controller device
237762306a36Sopenharmony_ci *
237862306a36Sopenharmony_ci * Registers an spi_device for each child node of controller node which
237962306a36Sopenharmony_ci * represents a valid SPI slave.
238062306a36Sopenharmony_ci */
238162306a36Sopenharmony_cistatic void of_register_spi_devices(struct spi_controller *ctlr)
238262306a36Sopenharmony_ci{
238362306a36Sopenharmony_ci	struct spi_device *spi;
238462306a36Sopenharmony_ci	struct device_node *nc;
238562306a36Sopenharmony_ci
238662306a36Sopenharmony_ci	for_each_available_child_of_node(ctlr->dev.of_node, nc) {
238762306a36Sopenharmony_ci		if (of_node_test_and_set_flag(nc, OF_POPULATED))
238862306a36Sopenharmony_ci			continue;
238962306a36Sopenharmony_ci		spi = of_register_spi_device(ctlr, nc);
239062306a36Sopenharmony_ci		if (IS_ERR(spi)) {
239162306a36Sopenharmony_ci			dev_warn(&ctlr->dev,
239262306a36Sopenharmony_ci				 "Failed to create SPI device for %pOF\n", nc);
239362306a36Sopenharmony_ci			of_node_clear_flag(nc, OF_POPULATED);
239462306a36Sopenharmony_ci		}
239562306a36Sopenharmony_ci	}
239662306a36Sopenharmony_ci}
239762306a36Sopenharmony_ci#else
239862306a36Sopenharmony_cistatic void of_register_spi_devices(struct spi_controller *ctlr) { }
239962306a36Sopenharmony_ci#endif
240062306a36Sopenharmony_ci
240162306a36Sopenharmony_ci/**
240262306a36Sopenharmony_ci * spi_new_ancillary_device() - Register ancillary SPI device
240362306a36Sopenharmony_ci * @spi:         Pointer to the main SPI device registering the ancillary device
240462306a36Sopenharmony_ci * @chip_select: Chip Select of the ancillary device
240562306a36Sopenharmony_ci *
240662306a36Sopenharmony_ci * Register an ancillary SPI device; for example some chips have a chip-select
240762306a36Sopenharmony_ci * for normal device usage and another one for setup/firmware upload.
240862306a36Sopenharmony_ci *
240962306a36Sopenharmony_ci * This may only be called from main SPI device's probe routine.
241062306a36Sopenharmony_ci *
241162306a36Sopenharmony_ci * Return: 0 on success; negative errno on failure
241262306a36Sopenharmony_ci */
241362306a36Sopenharmony_cistruct spi_device *spi_new_ancillary_device(struct spi_device *spi,
241462306a36Sopenharmony_ci					     u8 chip_select)
241562306a36Sopenharmony_ci{
241662306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
241762306a36Sopenharmony_ci	struct spi_device *ancillary;
241862306a36Sopenharmony_ci	int rc = 0;
241962306a36Sopenharmony_ci
242062306a36Sopenharmony_ci	/* Alloc an spi_device */
242162306a36Sopenharmony_ci	ancillary = spi_alloc_device(ctlr);
242262306a36Sopenharmony_ci	if (!ancillary) {
242362306a36Sopenharmony_ci		rc = -ENOMEM;
242462306a36Sopenharmony_ci		goto err_out;
242562306a36Sopenharmony_ci	}
242662306a36Sopenharmony_ci
242762306a36Sopenharmony_ci	strscpy(ancillary->modalias, "dummy", sizeof(ancillary->modalias));
242862306a36Sopenharmony_ci
242962306a36Sopenharmony_ci	/* Use provided chip-select for ancillary device */
243062306a36Sopenharmony_ci	spi_set_chipselect(ancillary, 0, chip_select);
243162306a36Sopenharmony_ci
243262306a36Sopenharmony_ci	/* Take over SPI mode/speed from SPI main device */
243362306a36Sopenharmony_ci	ancillary->max_speed_hz = spi->max_speed_hz;
243462306a36Sopenharmony_ci	ancillary->mode = spi->mode;
243562306a36Sopenharmony_ci
243662306a36Sopenharmony_ci	WARN_ON(!mutex_is_locked(&ctlr->add_lock));
243762306a36Sopenharmony_ci
243862306a36Sopenharmony_ci	/* Register the new device */
243962306a36Sopenharmony_ci	rc = __spi_add_device(ancillary);
244062306a36Sopenharmony_ci	if (rc) {
244162306a36Sopenharmony_ci		dev_err(&spi->dev, "failed to register ancillary device\n");
244262306a36Sopenharmony_ci		goto err_out;
244362306a36Sopenharmony_ci	}
244462306a36Sopenharmony_ci
244562306a36Sopenharmony_ci	return ancillary;
244662306a36Sopenharmony_ci
244762306a36Sopenharmony_cierr_out:
244862306a36Sopenharmony_ci	spi_dev_put(ancillary);
244962306a36Sopenharmony_ci	return ERR_PTR(rc);
245062306a36Sopenharmony_ci}
245162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_new_ancillary_device);
245262306a36Sopenharmony_ci
245362306a36Sopenharmony_ci#ifdef CONFIG_ACPI
245462306a36Sopenharmony_cistruct acpi_spi_lookup {
245562306a36Sopenharmony_ci	struct spi_controller 	*ctlr;
245662306a36Sopenharmony_ci	u32			max_speed_hz;
245762306a36Sopenharmony_ci	u32			mode;
245862306a36Sopenharmony_ci	int			irq;
245962306a36Sopenharmony_ci	u8			bits_per_word;
246062306a36Sopenharmony_ci	u8			chip_select;
246162306a36Sopenharmony_ci	int			n;
246262306a36Sopenharmony_ci	int			index;
246362306a36Sopenharmony_ci};
246462306a36Sopenharmony_ci
246562306a36Sopenharmony_cistatic int acpi_spi_count(struct acpi_resource *ares, void *data)
246662306a36Sopenharmony_ci{
246762306a36Sopenharmony_ci	struct acpi_resource_spi_serialbus *sb;
246862306a36Sopenharmony_ci	int *count = data;
246962306a36Sopenharmony_ci
247062306a36Sopenharmony_ci	if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS)
247162306a36Sopenharmony_ci		return 1;
247262306a36Sopenharmony_ci
247362306a36Sopenharmony_ci	sb = &ares->data.spi_serial_bus;
247462306a36Sopenharmony_ci	if (sb->type != ACPI_RESOURCE_SERIAL_TYPE_SPI)
247562306a36Sopenharmony_ci		return 1;
247662306a36Sopenharmony_ci
247762306a36Sopenharmony_ci	*count = *count + 1;
247862306a36Sopenharmony_ci
247962306a36Sopenharmony_ci	return 1;
248062306a36Sopenharmony_ci}
248162306a36Sopenharmony_ci
248262306a36Sopenharmony_ci/**
248362306a36Sopenharmony_ci * acpi_spi_count_resources - Count the number of SpiSerialBus resources
248462306a36Sopenharmony_ci * @adev:	ACPI device
248562306a36Sopenharmony_ci *
248662306a36Sopenharmony_ci * Return: the number of SpiSerialBus resources in the ACPI-device's
248762306a36Sopenharmony_ci * resource-list; or a negative error code.
248862306a36Sopenharmony_ci */
248962306a36Sopenharmony_ciint acpi_spi_count_resources(struct acpi_device *adev)
249062306a36Sopenharmony_ci{
249162306a36Sopenharmony_ci	LIST_HEAD(r);
249262306a36Sopenharmony_ci	int count = 0;
249362306a36Sopenharmony_ci	int ret;
249462306a36Sopenharmony_ci
249562306a36Sopenharmony_ci	ret = acpi_dev_get_resources(adev, &r, acpi_spi_count, &count);
249662306a36Sopenharmony_ci	if (ret < 0)
249762306a36Sopenharmony_ci		return ret;
249862306a36Sopenharmony_ci
249962306a36Sopenharmony_ci	acpi_dev_free_resource_list(&r);
250062306a36Sopenharmony_ci
250162306a36Sopenharmony_ci	return count;
250262306a36Sopenharmony_ci}
250362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(acpi_spi_count_resources);
250462306a36Sopenharmony_ci
250562306a36Sopenharmony_cistatic void acpi_spi_parse_apple_properties(struct acpi_device *dev,
250662306a36Sopenharmony_ci					    struct acpi_spi_lookup *lookup)
250762306a36Sopenharmony_ci{
250862306a36Sopenharmony_ci	const union acpi_object *obj;
250962306a36Sopenharmony_ci
251062306a36Sopenharmony_ci	if (!x86_apple_machine)
251162306a36Sopenharmony_ci		return;
251262306a36Sopenharmony_ci
251362306a36Sopenharmony_ci	if (!acpi_dev_get_property(dev, "spiSclkPeriod", ACPI_TYPE_BUFFER, &obj)
251462306a36Sopenharmony_ci	    && obj->buffer.length >= 4)
251562306a36Sopenharmony_ci		lookup->max_speed_hz  = NSEC_PER_SEC / *(u32 *)obj->buffer.pointer;
251662306a36Sopenharmony_ci
251762306a36Sopenharmony_ci	if (!acpi_dev_get_property(dev, "spiWordSize", ACPI_TYPE_BUFFER, &obj)
251862306a36Sopenharmony_ci	    && obj->buffer.length == 8)
251962306a36Sopenharmony_ci		lookup->bits_per_word = *(u64 *)obj->buffer.pointer;
252062306a36Sopenharmony_ci
252162306a36Sopenharmony_ci	if (!acpi_dev_get_property(dev, "spiBitOrder", ACPI_TYPE_BUFFER, &obj)
252262306a36Sopenharmony_ci	    && obj->buffer.length == 8 && !*(u64 *)obj->buffer.pointer)
252362306a36Sopenharmony_ci		lookup->mode |= SPI_LSB_FIRST;
252462306a36Sopenharmony_ci
252562306a36Sopenharmony_ci	if (!acpi_dev_get_property(dev, "spiSPO", ACPI_TYPE_BUFFER, &obj)
252662306a36Sopenharmony_ci	    && obj->buffer.length == 8 &&  *(u64 *)obj->buffer.pointer)
252762306a36Sopenharmony_ci		lookup->mode |= SPI_CPOL;
252862306a36Sopenharmony_ci
252962306a36Sopenharmony_ci	if (!acpi_dev_get_property(dev, "spiSPH", ACPI_TYPE_BUFFER, &obj)
253062306a36Sopenharmony_ci	    && obj->buffer.length == 8 &&  *(u64 *)obj->buffer.pointer)
253162306a36Sopenharmony_ci		lookup->mode |= SPI_CPHA;
253262306a36Sopenharmony_ci}
253362306a36Sopenharmony_ci
253462306a36Sopenharmony_cistatic struct spi_controller *acpi_spi_find_controller_by_adev(struct acpi_device *adev);
253562306a36Sopenharmony_ci
253662306a36Sopenharmony_cistatic int acpi_spi_add_resource(struct acpi_resource *ares, void *data)
253762306a36Sopenharmony_ci{
253862306a36Sopenharmony_ci	struct acpi_spi_lookup *lookup = data;
253962306a36Sopenharmony_ci	struct spi_controller *ctlr = lookup->ctlr;
254062306a36Sopenharmony_ci
254162306a36Sopenharmony_ci	if (ares->type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {
254262306a36Sopenharmony_ci		struct acpi_resource_spi_serialbus *sb;
254362306a36Sopenharmony_ci		acpi_handle parent_handle;
254462306a36Sopenharmony_ci		acpi_status status;
254562306a36Sopenharmony_ci
254662306a36Sopenharmony_ci		sb = &ares->data.spi_serial_bus;
254762306a36Sopenharmony_ci		if (sb->type == ACPI_RESOURCE_SERIAL_TYPE_SPI) {
254862306a36Sopenharmony_ci
254962306a36Sopenharmony_ci			if (lookup->index != -1 && lookup->n++ != lookup->index)
255062306a36Sopenharmony_ci				return 1;
255162306a36Sopenharmony_ci
255262306a36Sopenharmony_ci			status = acpi_get_handle(NULL,
255362306a36Sopenharmony_ci						 sb->resource_source.string_ptr,
255462306a36Sopenharmony_ci						 &parent_handle);
255562306a36Sopenharmony_ci
255662306a36Sopenharmony_ci			if (ACPI_FAILURE(status))
255762306a36Sopenharmony_ci				return -ENODEV;
255862306a36Sopenharmony_ci
255962306a36Sopenharmony_ci			if (ctlr) {
256062306a36Sopenharmony_ci				if (ACPI_HANDLE(ctlr->dev.parent) != parent_handle)
256162306a36Sopenharmony_ci					return -ENODEV;
256262306a36Sopenharmony_ci			} else {
256362306a36Sopenharmony_ci				struct acpi_device *adev;
256462306a36Sopenharmony_ci
256562306a36Sopenharmony_ci				adev = acpi_fetch_acpi_dev(parent_handle);
256662306a36Sopenharmony_ci				if (!adev)
256762306a36Sopenharmony_ci					return -ENODEV;
256862306a36Sopenharmony_ci
256962306a36Sopenharmony_ci				ctlr = acpi_spi_find_controller_by_adev(adev);
257062306a36Sopenharmony_ci				if (!ctlr)
257162306a36Sopenharmony_ci					return -EPROBE_DEFER;
257262306a36Sopenharmony_ci
257362306a36Sopenharmony_ci				lookup->ctlr = ctlr;
257462306a36Sopenharmony_ci			}
257562306a36Sopenharmony_ci
257662306a36Sopenharmony_ci			/*
257762306a36Sopenharmony_ci			 * ACPI DeviceSelection numbering is handled by the
257862306a36Sopenharmony_ci			 * host controller driver in Windows and can vary
257962306a36Sopenharmony_ci			 * from driver to driver. In Linux we always expect
258062306a36Sopenharmony_ci			 * 0 .. max - 1 so we need to ask the driver to
258162306a36Sopenharmony_ci			 * translate between the two schemes.
258262306a36Sopenharmony_ci			 */
258362306a36Sopenharmony_ci			if (ctlr->fw_translate_cs) {
258462306a36Sopenharmony_ci				int cs = ctlr->fw_translate_cs(ctlr,
258562306a36Sopenharmony_ci						sb->device_selection);
258662306a36Sopenharmony_ci				if (cs < 0)
258762306a36Sopenharmony_ci					return cs;
258862306a36Sopenharmony_ci				lookup->chip_select = cs;
258962306a36Sopenharmony_ci			} else {
259062306a36Sopenharmony_ci				lookup->chip_select = sb->device_selection;
259162306a36Sopenharmony_ci			}
259262306a36Sopenharmony_ci
259362306a36Sopenharmony_ci			lookup->max_speed_hz = sb->connection_speed;
259462306a36Sopenharmony_ci			lookup->bits_per_word = sb->data_bit_length;
259562306a36Sopenharmony_ci
259662306a36Sopenharmony_ci			if (sb->clock_phase == ACPI_SPI_SECOND_PHASE)
259762306a36Sopenharmony_ci				lookup->mode |= SPI_CPHA;
259862306a36Sopenharmony_ci			if (sb->clock_polarity == ACPI_SPI_START_HIGH)
259962306a36Sopenharmony_ci				lookup->mode |= SPI_CPOL;
260062306a36Sopenharmony_ci			if (sb->device_polarity == ACPI_SPI_ACTIVE_HIGH)
260162306a36Sopenharmony_ci				lookup->mode |= SPI_CS_HIGH;
260262306a36Sopenharmony_ci		}
260362306a36Sopenharmony_ci	} else if (lookup->irq < 0) {
260462306a36Sopenharmony_ci		struct resource r;
260562306a36Sopenharmony_ci
260662306a36Sopenharmony_ci		if (acpi_dev_resource_interrupt(ares, 0, &r))
260762306a36Sopenharmony_ci			lookup->irq = r.start;
260862306a36Sopenharmony_ci	}
260962306a36Sopenharmony_ci
261062306a36Sopenharmony_ci	/* Always tell the ACPI core to skip this resource */
261162306a36Sopenharmony_ci	return 1;
261262306a36Sopenharmony_ci}
261362306a36Sopenharmony_ci
261462306a36Sopenharmony_ci/**
261562306a36Sopenharmony_ci * acpi_spi_device_alloc - Allocate a spi device, and fill it in with ACPI information
261662306a36Sopenharmony_ci * @ctlr: controller to which the spi device belongs
261762306a36Sopenharmony_ci * @adev: ACPI Device for the spi device
261862306a36Sopenharmony_ci * @index: Index of the spi resource inside the ACPI Node
261962306a36Sopenharmony_ci *
262062306a36Sopenharmony_ci * This should be used to allocate a new SPI device from and ACPI Device node.
262162306a36Sopenharmony_ci * The caller is responsible for calling spi_add_device to register the SPI device.
262262306a36Sopenharmony_ci *
262362306a36Sopenharmony_ci * If ctlr is set to NULL, the Controller for the SPI device will be looked up
262462306a36Sopenharmony_ci * using the resource.
262562306a36Sopenharmony_ci * If index is set to -1, index is not used.
262662306a36Sopenharmony_ci * Note: If index is -1, ctlr must be set.
262762306a36Sopenharmony_ci *
262862306a36Sopenharmony_ci * Return: a pointer to the new device, or ERR_PTR on error.
262962306a36Sopenharmony_ci */
263062306a36Sopenharmony_cistruct spi_device *acpi_spi_device_alloc(struct spi_controller *ctlr,
263162306a36Sopenharmony_ci					 struct acpi_device *adev,
263262306a36Sopenharmony_ci					 int index)
263362306a36Sopenharmony_ci{
263462306a36Sopenharmony_ci	acpi_handle parent_handle = NULL;
263562306a36Sopenharmony_ci	struct list_head resource_list;
263662306a36Sopenharmony_ci	struct acpi_spi_lookup lookup = {};
263762306a36Sopenharmony_ci	struct spi_device *spi;
263862306a36Sopenharmony_ci	int ret;
263962306a36Sopenharmony_ci
264062306a36Sopenharmony_ci	if (!ctlr && index == -1)
264162306a36Sopenharmony_ci		return ERR_PTR(-EINVAL);
264262306a36Sopenharmony_ci
264362306a36Sopenharmony_ci	lookup.ctlr		= ctlr;
264462306a36Sopenharmony_ci	lookup.irq		= -1;
264562306a36Sopenharmony_ci	lookup.index		= index;
264662306a36Sopenharmony_ci	lookup.n		= 0;
264762306a36Sopenharmony_ci
264862306a36Sopenharmony_ci	INIT_LIST_HEAD(&resource_list);
264962306a36Sopenharmony_ci	ret = acpi_dev_get_resources(adev, &resource_list,
265062306a36Sopenharmony_ci				     acpi_spi_add_resource, &lookup);
265162306a36Sopenharmony_ci	acpi_dev_free_resource_list(&resource_list);
265262306a36Sopenharmony_ci
265362306a36Sopenharmony_ci	if (ret < 0)
265462306a36Sopenharmony_ci		/* Found SPI in _CRS but it points to another controller */
265562306a36Sopenharmony_ci		return ERR_PTR(ret);
265662306a36Sopenharmony_ci
265762306a36Sopenharmony_ci	if (!lookup.max_speed_hz &&
265862306a36Sopenharmony_ci	    ACPI_SUCCESS(acpi_get_parent(adev->handle, &parent_handle)) &&
265962306a36Sopenharmony_ci	    ACPI_HANDLE(lookup.ctlr->dev.parent) == parent_handle) {
266062306a36Sopenharmony_ci		/* Apple does not use _CRS but nested devices for SPI slaves */
266162306a36Sopenharmony_ci		acpi_spi_parse_apple_properties(adev, &lookup);
266262306a36Sopenharmony_ci	}
266362306a36Sopenharmony_ci
266462306a36Sopenharmony_ci	if (!lookup.max_speed_hz)
266562306a36Sopenharmony_ci		return ERR_PTR(-ENODEV);
266662306a36Sopenharmony_ci
266762306a36Sopenharmony_ci	spi = spi_alloc_device(lookup.ctlr);
266862306a36Sopenharmony_ci	if (!spi) {
266962306a36Sopenharmony_ci		dev_err(&lookup.ctlr->dev, "failed to allocate SPI device for %s\n",
267062306a36Sopenharmony_ci			dev_name(&adev->dev));
267162306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
267262306a36Sopenharmony_ci	}
267362306a36Sopenharmony_ci
267462306a36Sopenharmony_ci	ACPI_COMPANION_SET(&spi->dev, adev);
267562306a36Sopenharmony_ci	spi->max_speed_hz	= lookup.max_speed_hz;
267662306a36Sopenharmony_ci	spi->mode		|= lookup.mode;
267762306a36Sopenharmony_ci	spi->irq		= lookup.irq;
267862306a36Sopenharmony_ci	spi->bits_per_word	= lookup.bits_per_word;
267962306a36Sopenharmony_ci	spi_set_chipselect(spi, 0, lookup.chip_select);
268062306a36Sopenharmony_ci
268162306a36Sopenharmony_ci	return spi;
268262306a36Sopenharmony_ci}
268362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(acpi_spi_device_alloc);
268462306a36Sopenharmony_ci
268562306a36Sopenharmony_cistatic acpi_status acpi_register_spi_device(struct spi_controller *ctlr,
268662306a36Sopenharmony_ci					    struct acpi_device *adev)
268762306a36Sopenharmony_ci{
268862306a36Sopenharmony_ci	struct spi_device *spi;
268962306a36Sopenharmony_ci
269062306a36Sopenharmony_ci	if (acpi_bus_get_status(adev) || !adev->status.present ||
269162306a36Sopenharmony_ci	    acpi_device_enumerated(adev))
269262306a36Sopenharmony_ci		return AE_OK;
269362306a36Sopenharmony_ci
269462306a36Sopenharmony_ci	spi = acpi_spi_device_alloc(ctlr, adev, -1);
269562306a36Sopenharmony_ci	if (IS_ERR(spi)) {
269662306a36Sopenharmony_ci		if (PTR_ERR(spi) == -ENOMEM)
269762306a36Sopenharmony_ci			return AE_NO_MEMORY;
269862306a36Sopenharmony_ci		else
269962306a36Sopenharmony_ci			return AE_OK;
270062306a36Sopenharmony_ci	}
270162306a36Sopenharmony_ci
270262306a36Sopenharmony_ci	acpi_set_modalias(adev, acpi_device_hid(adev), spi->modalias,
270362306a36Sopenharmony_ci			  sizeof(spi->modalias));
270462306a36Sopenharmony_ci
270562306a36Sopenharmony_ci	if (spi->irq < 0)
270662306a36Sopenharmony_ci		spi->irq = acpi_dev_gpio_irq_get(adev, 0);
270762306a36Sopenharmony_ci
270862306a36Sopenharmony_ci	acpi_device_set_enumerated(adev);
270962306a36Sopenharmony_ci
271062306a36Sopenharmony_ci	adev->power.flags.ignore_parent = true;
271162306a36Sopenharmony_ci	if (spi_add_device(spi)) {
271262306a36Sopenharmony_ci		adev->power.flags.ignore_parent = false;
271362306a36Sopenharmony_ci		dev_err(&ctlr->dev, "failed to add SPI device %s from ACPI\n",
271462306a36Sopenharmony_ci			dev_name(&adev->dev));
271562306a36Sopenharmony_ci		spi_dev_put(spi);
271662306a36Sopenharmony_ci	}
271762306a36Sopenharmony_ci
271862306a36Sopenharmony_ci	return AE_OK;
271962306a36Sopenharmony_ci}
272062306a36Sopenharmony_ci
272162306a36Sopenharmony_cistatic acpi_status acpi_spi_add_device(acpi_handle handle, u32 level,
272262306a36Sopenharmony_ci				       void *data, void **return_value)
272362306a36Sopenharmony_ci{
272462306a36Sopenharmony_ci	struct acpi_device *adev = acpi_fetch_acpi_dev(handle);
272562306a36Sopenharmony_ci	struct spi_controller *ctlr = data;
272662306a36Sopenharmony_ci
272762306a36Sopenharmony_ci	if (!adev)
272862306a36Sopenharmony_ci		return AE_OK;
272962306a36Sopenharmony_ci
273062306a36Sopenharmony_ci	return acpi_register_spi_device(ctlr, adev);
273162306a36Sopenharmony_ci}
273262306a36Sopenharmony_ci
273362306a36Sopenharmony_ci#define SPI_ACPI_ENUMERATE_MAX_DEPTH		32
273462306a36Sopenharmony_ci
273562306a36Sopenharmony_cistatic void acpi_register_spi_devices(struct spi_controller *ctlr)
273662306a36Sopenharmony_ci{
273762306a36Sopenharmony_ci	acpi_status status;
273862306a36Sopenharmony_ci	acpi_handle handle;
273962306a36Sopenharmony_ci
274062306a36Sopenharmony_ci	handle = ACPI_HANDLE(ctlr->dev.parent);
274162306a36Sopenharmony_ci	if (!handle)
274262306a36Sopenharmony_ci		return;
274362306a36Sopenharmony_ci
274462306a36Sopenharmony_ci	status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
274562306a36Sopenharmony_ci				     SPI_ACPI_ENUMERATE_MAX_DEPTH,
274662306a36Sopenharmony_ci				     acpi_spi_add_device, NULL, ctlr, NULL);
274762306a36Sopenharmony_ci	if (ACPI_FAILURE(status))
274862306a36Sopenharmony_ci		dev_warn(&ctlr->dev, "failed to enumerate SPI slaves\n");
274962306a36Sopenharmony_ci}
275062306a36Sopenharmony_ci#else
275162306a36Sopenharmony_cistatic inline void acpi_register_spi_devices(struct spi_controller *ctlr) {}
275262306a36Sopenharmony_ci#endif /* CONFIG_ACPI */
275362306a36Sopenharmony_ci
275462306a36Sopenharmony_cistatic void spi_controller_release(struct device *dev)
275562306a36Sopenharmony_ci{
275662306a36Sopenharmony_ci	struct spi_controller *ctlr;
275762306a36Sopenharmony_ci
275862306a36Sopenharmony_ci	ctlr = container_of(dev, struct spi_controller, dev);
275962306a36Sopenharmony_ci	kfree(ctlr);
276062306a36Sopenharmony_ci}
276162306a36Sopenharmony_ci
276262306a36Sopenharmony_cistatic struct class spi_master_class = {
276362306a36Sopenharmony_ci	.name		= "spi_master",
276462306a36Sopenharmony_ci	.dev_release	= spi_controller_release,
276562306a36Sopenharmony_ci	.dev_groups	= spi_master_groups,
276662306a36Sopenharmony_ci};
276762306a36Sopenharmony_ci
276862306a36Sopenharmony_ci#ifdef CONFIG_SPI_SLAVE
276962306a36Sopenharmony_ci/**
277062306a36Sopenharmony_ci * spi_slave_abort - abort the ongoing transfer request on an SPI slave
277162306a36Sopenharmony_ci *		     controller
277262306a36Sopenharmony_ci * @spi: device used for the current transfer
277362306a36Sopenharmony_ci */
277462306a36Sopenharmony_ciint spi_slave_abort(struct spi_device *spi)
277562306a36Sopenharmony_ci{
277662306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
277762306a36Sopenharmony_ci
277862306a36Sopenharmony_ci	if (spi_controller_is_slave(ctlr) && ctlr->slave_abort)
277962306a36Sopenharmony_ci		return ctlr->slave_abort(ctlr);
278062306a36Sopenharmony_ci
278162306a36Sopenharmony_ci	return -ENOTSUPP;
278262306a36Sopenharmony_ci}
278362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_slave_abort);
278462306a36Sopenharmony_ci
278562306a36Sopenharmony_ciint spi_target_abort(struct spi_device *spi)
278662306a36Sopenharmony_ci{
278762306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
278862306a36Sopenharmony_ci
278962306a36Sopenharmony_ci	if (spi_controller_is_target(ctlr) && ctlr->target_abort)
279062306a36Sopenharmony_ci		return ctlr->target_abort(ctlr);
279162306a36Sopenharmony_ci
279262306a36Sopenharmony_ci	return -ENOTSUPP;
279362306a36Sopenharmony_ci}
279462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_target_abort);
279562306a36Sopenharmony_ci
279662306a36Sopenharmony_cistatic ssize_t slave_show(struct device *dev, struct device_attribute *attr,
279762306a36Sopenharmony_ci			  char *buf)
279862306a36Sopenharmony_ci{
279962306a36Sopenharmony_ci	struct spi_controller *ctlr = container_of(dev, struct spi_controller,
280062306a36Sopenharmony_ci						   dev);
280162306a36Sopenharmony_ci	struct device *child;
280262306a36Sopenharmony_ci
280362306a36Sopenharmony_ci	child = device_find_any_child(&ctlr->dev);
280462306a36Sopenharmony_ci	return sysfs_emit(buf, "%s\n", child ? to_spi_device(child)->modalias : NULL);
280562306a36Sopenharmony_ci}
280662306a36Sopenharmony_ci
280762306a36Sopenharmony_cistatic ssize_t slave_store(struct device *dev, struct device_attribute *attr,
280862306a36Sopenharmony_ci			   const char *buf, size_t count)
280962306a36Sopenharmony_ci{
281062306a36Sopenharmony_ci	struct spi_controller *ctlr = container_of(dev, struct spi_controller,
281162306a36Sopenharmony_ci						   dev);
281262306a36Sopenharmony_ci	struct spi_device *spi;
281362306a36Sopenharmony_ci	struct device *child;
281462306a36Sopenharmony_ci	char name[32];
281562306a36Sopenharmony_ci	int rc;
281662306a36Sopenharmony_ci
281762306a36Sopenharmony_ci	rc = sscanf(buf, "%31s", name);
281862306a36Sopenharmony_ci	if (rc != 1 || !name[0])
281962306a36Sopenharmony_ci		return -EINVAL;
282062306a36Sopenharmony_ci
282162306a36Sopenharmony_ci	child = device_find_any_child(&ctlr->dev);
282262306a36Sopenharmony_ci	if (child) {
282362306a36Sopenharmony_ci		/* Remove registered slave */
282462306a36Sopenharmony_ci		device_unregister(child);
282562306a36Sopenharmony_ci		put_device(child);
282662306a36Sopenharmony_ci	}
282762306a36Sopenharmony_ci
282862306a36Sopenharmony_ci	if (strcmp(name, "(null)")) {
282962306a36Sopenharmony_ci		/* Register new slave */
283062306a36Sopenharmony_ci		spi = spi_alloc_device(ctlr);
283162306a36Sopenharmony_ci		if (!spi)
283262306a36Sopenharmony_ci			return -ENOMEM;
283362306a36Sopenharmony_ci
283462306a36Sopenharmony_ci		strscpy(spi->modalias, name, sizeof(spi->modalias));
283562306a36Sopenharmony_ci
283662306a36Sopenharmony_ci		rc = spi_add_device(spi);
283762306a36Sopenharmony_ci		if (rc) {
283862306a36Sopenharmony_ci			spi_dev_put(spi);
283962306a36Sopenharmony_ci			return rc;
284062306a36Sopenharmony_ci		}
284162306a36Sopenharmony_ci	}
284262306a36Sopenharmony_ci
284362306a36Sopenharmony_ci	return count;
284462306a36Sopenharmony_ci}
284562306a36Sopenharmony_ci
284662306a36Sopenharmony_cistatic DEVICE_ATTR_RW(slave);
284762306a36Sopenharmony_ci
284862306a36Sopenharmony_cistatic struct attribute *spi_slave_attrs[] = {
284962306a36Sopenharmony_ci	&dev_attr_slave.attr,
285062306a36Sopenharmony_ci	NULL,
285162306a36Sopenharmony_ci};
285262306a36Sopenharmony_ci
285362306a36Sopenharmony_cistatic const struct attribute_group spi_slave_group = {
285462306a36Sopenharmony_ci	.attrs = spi_slave_attrs,
285562306a36Sopenharmony_ci};
285662306a36Sopenharmony_ci
285762306a36Sopenharmony_cistatic const struct attribute_group *spi_slave_groups[] = {
285862306a36Sopenharmony_ci	&spi_controller_statistics_group,
285962306a36Sopenharmony_ci	&spi_slave_group,
286062306a36Sopenharmony_ci	NULL,
286162306a36Sopenharmony_ci};
286262306a36Sopenharmony_ci
286362306a36Sopenharmony_cistatic struct class spi_slave_class = {
286462306a36Sopenharmony_ci	.name		= "spi_slave",
286562306a36Sopenharmony_ci	.dev_release	= spi_controller_release,
286662306a36Sopenharmony_ci	.dev_groups	= spi_slave_groups,
286762306a36Sopenharmony_ci};
286862306a36Sopenharmony_ci#else
286962306a36Sopenharmony_ciextern struct class spi_slave_class;	/* dummy */
287062306a36Sopenharmony_ci#endif
287162306a36Sopenharmony_ci
287262306a36Sopenharmony_ci/**
287362306a36Sopenharmony_ci * __spi_alloc_controller - allocate an SPI master or slave controller
287462306a36Sopenharmony_ci * @dev: the controller, possibly using the platform_bus
287562306a36Sopenharmony_ci * @size: how much zeroed driver-private data to allocate; the pointer to this
287662306a36Sopenharmony_ci *	memory is in the driver_data field of the returned device, accessible
287762306a36Sopenharmony_ci *	with spi_controller_get_devdata(); the memory is cacheline aligned;
287862306a36Sopenharmony_ci *	drivers granting DMA access to portions of their private data need to
287962306a36Sopenharmony_ci *	round up @size using ALIGN(size, dma_get_cache_alignment()).
288062306a36Sopenharmony_ci * @slave: flag indicating whether to allocate an SPI master (false) or SPI
288162306a36Sopenharmony_ci *	slave (true) controller
288262306a36Sopenharmony_ci * Context: can sleep
288362306a36Sopenharmony_ci *
288462306a36Sopenharmony_ci * This call is used only by SPI controller drivers, which are the
288562306a36Sopenharmony_ci * only ones directly touching chip registers.  It's how they allocate
288662306a36Sopenharmony_ci * an spi_controller structure, prior to calling spi_register_controller().
288762306a36Sopenharmony_ci *
288862306a36Sopenharmony_ci * This must be called from context that can sleep.
288962306a36Sopenharmony_ci *
289062306a36Sopenharmony_ci * The caller is responsible for assigning the bus number and initializing the
289162306a36Sopenharmony_ci * controller's methods before calling spi_register_controller(); and (after
289262306a36Sopenharmony_ci * errors adding the device) calling spi_controller_put() to prevent a memory
289362306a36Sopenharmony_ci * leak.
289462306a36Sopenharmony_ci *
289562306a36Sopenharmony_ci * Return: the SPI controller structure on success, else NULL.
289662306a36Sopenharmony_ci */
289762306a36Sopenharmony_cistruct spi_controller *__spi_alloc_controller(struct device *dev,
289862306a36Sopenharmony_ci					      unsigned int size, bool slave)
289962306a36Sopenharmony_ci{
290062306a36Sopenharmony_ci	struct spi_controller	*ctlr;
290162306a36Sopenharmony_ci	size_t ctlr_size = ALIGN(sizeof(*ctlr), dma_get_cache_alignment());
290262306a36Sopenharmony_ci
290362306a36Sopenharmony_ci	if (!dev)
290462306a36Sopenharmony_ci		return NULL;
290562306a36Sopenharmony_ci
290662306a36Sopenharmony_ci	ctlr = kzalloc(size + ctlr_size, GFP_KERNEL);
290762306a36Sopenharmony_ci	if (!ctlr)
290862306a36Sopenharmony_ci		return NULL;
290962306a36Sopenharmony_ci
291062306a36Sopenharmony_ci	device_initialize(&ctlr->dev);
291162306a36Sopenharmony_ci	INIT_LIST_HEAD(&ctlr->queue);
291262306a36Sopenharmony_ci	spin_lock_init(&ctlr->queue_lock);
291362306a36Sopenharmony_ci	spin_lock_init(&ctlr->bus_lock_spinlock);
291462306a36Sopenharmony_ci	mutex_init(&ctlr->bus_lock_mutex);
291562306a36Sopenharmony_ci	mutex_init(&ctlr->io_mutex);
291662306a36Sopenharmony_ci	mutex_init(&ctlr->add_lock);
291762306a36Sopenharmony_ci	ctlr->bus_num = -1;
291862306a36Sopenharmony_ci	ctlr->num_chipselect = 1;
291962306a36Sopenharmony_ci	ctlr->slave = slave;
292062306a36Sopenharmony_ci	if (IS_ENABLED(CONFIG_SPI_SLAVE) && slave)
292162306a36Sopenharmony_ci		ctlr->dev.class = &spi_slave_class;
292262306a36Sopenharmony_ci	else
292362306a36Sopenharmony_ci		ctlr->dev.class = &spi_master_class;
292462306a36Sopenharmony_ci	ctlr->dev.parent = dev;
292562306a36Sopenharmony_ci	pm_suspend_ignore_children(&ctlr->dev, true);
292662306a36Sopenharmony_ci	spi_controller_set_devdata(ctlr, (void *)ctlr + ctlr_size);
292762306a36Sopenharmony_ci
292862306a36Sopenharmony_ci	return ctlr;
292962306a36Sopenharmony_ci}
293062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(__spi_alloc_controller);
293162306a36Sopenharmony_ci
293262306a36Sopenharmony_cistatic void devm_spi_release_controller(struct device *dev, void *ctlr)
293362306a36Sopenharmony_ci{
293462306a36Sopenharmony_ci	spi_controller_put(*(struct spi_controller **)ctlr);
293562306a36Sopenharmony_ci}
293662306a36Sopenharmony_ci
293762306a36Sopenharmony_ci/**
293862306a36Sopenharmony_ci * __devm_spi_alloc_controller - resource-managed __spi_alloc_controller()
293962306a36Sopenharmony_ci * @dev: physical device of SPI controller
294062306a36Sopenharmony_ci * @size: how much zeroed driver-private data to allocate
294162306a36Sopenharmony_ci * @slave: whether to allocate an SPI master (false) or SPI slave (true)
294262306a36Sopenharmony_ci * Context: can sleep
294362306a36Sopenharmony_ci *
294462306a36Sopenharmony_ci * Allocate an SPI controller and automatically release a reference on it
294562306a36Sopenharmony_ci * when @dev is unbound from its driver.  Drivers are thus relieved from
294662306a36Sopenharmony_ci * having to call spi_controller_put().
294762306a36Sopenharmony_ci *
294862306a36Sopenharmony_ci * The arguments to this function are identical to __spi_alloc_controller().
294962306a36Sopenharmony_ci *
295062306a36Sopenharmony_ci * Return: the SPI controller structure on success, else NULL.
295162306a36Sopenharmony_ci */
295262306a36Sopenharmony_cistruct spi_controller *__devm_spi_alloc_controller(struct device *dev,
295362306a36Sopenharmony_ci						   unsigned int size,
295462306a36Sopenharmony_ci						   bool slave)
295562306a36Sopenharmony_ci{
295662306a36Sopenharmony_ci	struct spi_controller **ptr, *ctlr;
295762306a36Sopenharmony_ci
295862306a36Sopenharmony_ci	ptr = devres_alloc(devm_spi_release_controller, sizeof(*ptr),
295962306a36Sopenharmony_ci			   GFP_KERNEL);
296062306a36Sopenharmony_ci	if (!ptr)
296162306a36Sopenharmony_ci		return NULL;
296262306a36Sopenharmony_ci
296362306a36Sopenharmony_ci	ctlr = __spi_alloc_controller(dev, size, slave);
296462306a36Sopenharmony_ci	if (ctlr) {
296562306a36Sopenharmony_ci		ctlr->devm_allocated = true;
296662306a36Sopenharmony_ci		*ptr = ctlr;
296762306a36Sopenharmony_ci		devres_add(dev, ptr);
296862306a36Sopenharmony_ci	} else {
296962306a36Sopenharmony_ci		devres_free(ptr);
297062306a36Sopenharmony_ci	}
297162306a36Sopenharmony_ci
297262306a36Sopenharmony_ci	return ctlr;
297362306a36Sopenharmony_ci}
297462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(__devm_spi_alloc_controller);
297562306a36Sopenharmony_ci
297662306a36Sopenharmony_ci/**
297762306a36Sopenharmony_ci * spi_get_gpio_descs() - grab chip select GPIOs for the master
297862306a36Sopenharmony_ci * @ctlr: The SPI master to grab GPIO descriptors for
297962306a36Sopenharmony_ci */
298062306a36Sopenharmony_cistatic int spi_get_gpio_descs(struct spi_controller *ctlr)
298162306a36Sopenharmony_ci{
298262306a36Sopenharmony_ci	int nb, i;
298362306a36Sopenharmony_ci	struct gpio_desc **cs;
298462306a36Sopenharmony_ci	struct device *dev = &ctlr->dev;
298562306a36Sopenharmony_ci	unsigned long native_cs_mask = 0;
298662306a36Sopenharmony_ci	unsigned int num_cs_gpios = 0;
298762306a36Sopenharmony_ci
298862306a36Sopenharmony_ci	nb = gpiod_count(dev, "cs");
298962306a36Sopenharmony_ci	if (nb < 0) {
299062306a36Sopenharmony_ci		/* No GPIOs at all is fine, else return the error */
299162306a36Sopenharmony_ci		if (nb == -ENOENT)
299262306a36Sopenharmony_ci			return 0;
299362306a36Sopenharmony_ci		return nb;
299462306a36Sopenharmony_ci	}
299562306a36Sopenharmony_ci
299662306a36Sopenharmony_ci	ctlr->num_chipselect = max_t(int, nb, ctlr->num_chipselect);
299762306a36Sopenharmony_ci
299862306a36Sopenharmony_ci	cs = devm_kcalloc(dev, ctlr->num_chipselect, sizeof(*cs),
299962306a36Sopenharmony_ci			  GFP_KERNEL);
300062306a36Sopenharmony_ci	if (!cs)
300162306a36Sopenharmony_ci		return -ENOMEM;
300262306a36Sopenharmony_ci	ctlr->cs_gpiods = cs;
300362306a36Sopenharmony_ci
300462306a36Sopenharmony_ci	for (i = 0; i < nb; i++) {
300562306a36Sopenharmony_ci		/*
300662306a36Sopenharmony_ci		 * Most chipselects are active low, the inverted
300762306a36Sopenharmony_ci		 * semantics are handled by special quirks in gpiolib,
300862306a36Sopenharmony_ci		 * so initializing them GPIOD_OUT_LOW here means
300962306a36Sopenharmony_ci		 * "unasserted", in most cases this will drive the physical
301062306a36Sopenharmony_ci		 * line high.
301162306a36Sopenharmony_ci		 */
301262306a36Sopenharmony_ci		cs[i] = devm_gpiod_get_index_optional(dev, "cs", i,
301362306a36Sopenharmony_ci						      GPIOD_OUT_LOW);
301462306a36Sopenharmony_ci		if (IS_ERR(cs[i]))
301562306a36Sopenharmony_ci			return PTR_ERR(cs[i]);
301662306a36Sopenharmony_ci
301762306a36Sopenharmony_ci		if (cs[i]) {
301862306a36Sopenharmony_ci			/*
301962306a36Sopenharmony_ci			 * If we find a CS GPIO, name it after the device and
302062306a36Sopenharmony_ci			 * chip select line.
302162306a36Sopenharmony_ci			 */
302262306a36Sopenharmony_ci			char *gpioname;
302362306a36Sopenharmony_ci
302462306a36Sopenharmony_ci			gpioname = devm_kasprintf(dev, GFP_KERNEL, "%s CS%d",
302562306a36Sopenharmony_ci						  dev_name(dev), i);
302662306a36Sopenharmony_ci			if (!gpioname)
302762306a36Sopenharmony_ci				return -ENOMEM;
302862306a36Sopenharmony_ci			gpiod_set_consumer_name(cs[i], gpioname);
302962306a36Sopenharmony_ci			num_cs_gpios++;
303062306a36Sopenharmony_ci			continue;
303162306a36Sopenharmony_ci		}
303262306a36Sopenharmony_ci
303362306a36Sopenharmony_ci		if (ctlr->max_native_cs && i >= ctlr->max_native_cs) {
303462306a36Sopenharmony_ci			dev_err(dev, "Invalid native chip select %d\n", i);
303562306a36Sopenharmony_ci			return -EINVAL;
303662306a36Sopenharmony_ci		}
303762306a36Sopenharmony_ci		native_cs_mask |= BIT(i);
303862306a36Sopenharmony_ci	}
303962306a36Sopenharmony_ci
304062306a36Sopenharmony_ci	ctlr->unused_native_cs = ffs(~native_cs_mask) - 1;
304162306a36Sopenharmony_ci
304262306a36Sopenharmony_ci	if ((ctlr->flags & SPI_CONTROLLER_GPIO_SS) && num_cs_gpios &&
304362306a36Sopenharmony_ci	    ctlr->max_native_cs && ctlr->unused_native_cs >= ctlr->max_native_cs) {
304462306a36Sopenharmony_ci		dev_err(dev, "No unused native chip select available\n");
304562306a36Sopenharmony_ci		return -EINVAL;
304662306a36Sopenharmony_ci	}
304762306a36Sopenharmony_ci
304862306a36Sopenharmony_ci	return 0;
304962306a36Sopenharmony_ci}
305062306a36Sopenharmony_ci
305162306a36Sopenharmony_cistatic int spi_controller_check_ops(struct spi_controller *ctlr)
305262306a36Sopenharmony_ci{
305362306a36Sopenharmony_ci	/*
305462306a36Sopenharmony_ci	 * The controller may implement only the high-level SPI-memory like
305562306a36Sopenharmony_ci	 * operations if it does not support regular SPI transfers, and this is
305662306a36Sopenharmony_ci	 * valid use case.
305762306a36Sopenharmony_ci	 * If ->mem_ops or ->mem_ops->exec_op is NULL, we request that at least
305862306a36Sopenharmony_ci	 * one of the ->transfer_xxx() method be implemented.
305962306a36Sopenharmony_ci	 */
306062306a36Sopenharmony_ci	if (!ctlr->mem_ops || !ctlr->mem_ops->exec_op) {
306162306a36Sopenharmony_ci		if (!ctlr->transfer && !ctlr->transfer_one &&
306262306a36Sopenharmony_ci		   !ctlr->transfer_one_message) {
306362306a36Sopenharmony_ci			return -EINVAL;
306462306a36Sopenharmony_ci		}
306562306a36Sopenharmony_ci	}
306662306a36Sopenharmony_ci
306762306a36Sopenharmony_ci	return 0;
306862306a36Sopenharmony_ci}
306962306a36Sopenharmony_ci
307062306a36Sopenharmony_ci/* Allocate dynamic bus number using Linux idr */
307162306a36Sopenharmony_cistatic int spi_controller_id_alloc(struct spi_controller *ctlr, int start, int end)
307262306a36Sopenharmony_ci{
307362306a36Sopenharmony_ci	int id;
307462306a36Sopenharmony_ci
307562306a36Sopenharmony_ci	mutex_lock(&board_lock);
307662306a36Sopenharmony_ci	id = idr_alloc(&spi_master_idr, ctlr, start, end, GFP_KERNEL);
307762306a36Sopenharmony_ci	mutex_unlock(&board_lock);
307862306a36Sopenharmony_ci	if (WARN(id < 0, "couldn't get idr"))
307962306a36Sopenharmony_ci		return id == -ENOSPC ? -EBUSY : id;
308062306a36Sopenharmony_ci	ctlr->bus_num = id;
308162306a36Sopenharmony_ci	return 0;
308262306a36Sopenharmony_ci}
308362306a36Sopenharmony_ci
308462306a36Sopenharmony_ci/**
308562306a36Sopenharmony_ci * spi_register_controller - register SPI master or slave controller
308662306a36Sopenharmony_ci * @ctlr: initialized master, originally from spi_alloc_master() or
308762306a36Sopenharmony_ci *	spi_alloc_slave()
308862306a36Sopenharmony_ci * Context: can sleep
308962306a36Sopenharmony_ci *
309062306a36Sopenharmony_ci * SPI controllers connect to their drivers using some non-SPI bus,
309162306a36Sopenharmony_ci * such as the platform bus.  The final stage of probe() in that code
309262306a36Sopenharmony_ci * includes calling spi_register_controller() to hook up to this SPI bus glue.
309362306a36Sopenharmony_ci *
309462306a36Sopenharmony_ci * SPI controllers use board specific (often SOC specific) bus numbers,
309562306a36Sopenharmony_ci * and board-specific addressing for SPI devices combines those numbers
309662306a36Sopenharmony_ci * with chip select numbers.  Since SPI does not directly support dynamic
309762306a36Sopenharmony_ci * device identification, boards need configuration tables telling which
309862306a36Sopenharmony_ci * chip is at which address.
309962306a36Sopenharmony_ci *
310062306a36Sopenharmony_ci * This must be called from context that can sleep.  It returns zero on
310162306a36Sopenharmony_ci * success, else a negative error code (dropping the controller's refcount).
310262306a36Sopenharmony_ci * After a successful return, the caller is responsible for calling
310362306a36Sopenharmony_ci * spi_unregister_controller().
310462306a36Sopenharmony_ci *
310562306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
310662306a36Sopenharmony_ci */
310762306a36Sopenharmony_ciint spi_register_controller(struct spi_controller *ctlr)
310862306a36Sopenharmony_ci{
310962306a36Sopenharmony_ci	struct device		*dev = ctlr->dev.parent;
311062306a36Sopenharmony_ci	struct boardinfo	*bi;
311162306a36Sopenharmony_ci	int			first_dynamic;
311262306a36Sopenharmony_ci	int			status;
311362306a36Sopenharmony_ci
311462306a36Sopenharmony_ci	if (!dev)
311562306a36Sopenharmony_ci		return -ENODEV;
311662306a36Sopenharmony_ci
311762306a36Sopenharmony_ci	/*
311862306a36Sopenharmony_ci	 * Make sure all necessary hooks are implemented before registering
311962306a36Sopenharmony_ci	 * the SPI controller.
312062306a36Sopenharmony_ci	 */
312162306a36Sopenharmony_ci	status = spi_controller_check_ops(ctlr);
312262306a36Sopenharmony_ci	if (status)
312362306a36Sopenharmony_ci		return status;
312462306a36Sopenharmony_ci
312562306a36Sopenharmony_ci	if (ctlr->bus_num < 0)
312662306a36Sopenharmony_ci		ctlr->bus_num = of_alias_get_id(ctlr->dev.of_node, "spi");
312762306a36Sopenharmony_ci	if (ctlr->bus_num >= 0) {
312862306a36Sopenharmony_ci		/* Devices with a fixed bus num must check-in with the num */
312962306a36Sopenharmony_ci		status = spi_controller_id_alloc(ctlr, ctlr->bus_num, ctlr->bus_num + 1);
313062306a36Sopenharmony_ci		if (status)
313162306a36Sopenharmony_ci			return status;
313262306a36Sopenharmony_ci	}
313362306a36Sopenharmony_ci	if (ctlr->bus_num < 0) {
313462306a36Sopenharmony_ci		first_dynamic = of_alias_get_highest_id("spi");
313562306a36Sopenharmony_ci		if (first_dynamic < 0)
313662306a36Sopenharmony_ci			first_dynamic = 0;
313762306a36Sopenharmony_ci		else
313862306a36Sopenharmony_ci			first_dynamic++;
313962306a36Sopenharmony_ci
314062306a36Sopenharmony_ci		status = spi_controller_id_alloc(ctlr, first_dynamic, 0);
314162306a36Sopenharmony_ci		if (status)
314262306a36Sopenharmony_ci			return status;
314362306a36Sopenharmony_ci	}
314462306a36Sopenharmony_ci	ctlr->bus_lock_flag = 0;
314562306a36Sopenharmony_ci	init_completion(&ctlr->xfer_completion);
314662306a36Sopenharmony_ci	init_completion(&ctlr->cur_msg_completion);
314762306a36Sopenharmony_ci	if (!ctlr->max_dma_len)
314862306a36Sopenharmony_ci		ctlr->max_dma_len = INT_MAX;
314962306a36Sopenharmony_ci
315062306a36Sopenharmony_ci	/*
315162306a36Sopenharmony_ci	 * Register the device, then userspace will see it.
315262306a36Sopenharmony_ci	 * Registration fails if the bus ID is in use.
315362306a36Sopenharmony_ci	 */
315462306a36Sopenharmony_ci	dev_set_name(&ctlr->dev, "spi%u", ctlr->bus_num);
315562306a36Sopenharmony_ci
315662306a36Sopenharmony_ci	if (!spi_controller_is_slave(ctlr) && ctlr->use_gpio_descriptors) {
315762306a36Sopenharmony_ci		status = spi_get_gpio_descs(ctlr);
315862306a36Sopenharmony_ci		if (status)
315962306a36Sopenharmony_ci			goto free_bus_id;
316062306a36Sopenharmony_ci		/*
316162306a36Sopenharmony_ci		 * A controller using GPIO descriptors always
316262306a36Sopenharmony_ci		 * supports SPI_CS_HIGH if need be.
316362306a36Sopenharmony_ci		 */
316462306a36Sopenharmony_ci		ctlr->mode_bits |= SPI_CS_HIGH;
316562306a36Sopenharmony_ci	}
316662306a36Sopenharmony_ci
316762306a36Sopenharmony_ci	/*
316862306a36Sopenharmony_ci	 * Even if it's just one always-selected device, there must
316962306a36Sopenharmony_ci	 * be at least one chipselect.
317062306a36Sopenharmony_ci	 */
317162306a36Sopenharmony_ci	if (!ctlr->num_chipselect) {
317262306a36Sopenharmony_ci		status = -EINVAL;
317362306a36Sopenharmony_ci		goto free_bus_id;
317462306a36Sopenharmony_ci	}
317562306a36Sopenharmony_ci
317662306a36Sopenharmony_ci	/* Setting last_cs to -1 means no chip selected */
317762306a36Sopenharmony_ci	ctlr->last_cs = -1;
317862306a36Sopenharmony_ci
317962306a36Sopenharmony_ci	status = device_add(&ctlr->dev);
318062306a36Sopenharmony_ci	if (status < 0)
318162306a36Sopenharmony_ci		goto free_bus_id;
318262306a36Sopenharmony_ci	dev_dbg(dev, "registered %s %s\n",
318362306a36Sopenharmony_ci			spi_controller_is_slave(ctlr) ? "slave" : "master",
318462306a36Sopenharmony_ci			dev_name(&ctlr->dev));
318562306a36Sopenharmony_ci
318662306a36Sopenharmony_ci	/*
318762306a36Sopenharmony_ci	 * If we're using a queued driver, start the queue. Note that we don't
318862306a36Sopenharmony_ci	 * need the queueing logic if the driver is only supporting high-level
318962306a36Sopenharmony_ci	 * memory operations.
319062306a36Sopenharmony_ci	 */
319162306a36Sopenharmony_ci	if (ctlr->transfer) {
319262306a36Sopenharmony_ci		dev_info(dev, "controller is unqueued, this is deprecated\n");
319362306a36Sopenharmony_ci	} else if (ctlr->transfer_one || ctlr->transfer_one_message) {
319462306a36Sopenharmony_ci		status = spi_controller_initialize_queue(ctlr);
319562306a36Sopenharmony_ci		if (status) {
319662306a36Sopenharmony_ci			device_del(&ctlr->dev);
319762306a36Sopenharmony_ci			goto free_bus_id;
319862306a36Sopenharmony_ci		}
319962306a36Sopenharmony_ci	}
320062306a36Sopenharmony_ci	/* Add statistics */
320162306a36Sopenharmony_ci	ctlr->pcpu_statistics = spi_alloc_pcpu_stats(dev);
320262306a36Sopenharmony_ci	if (!ctlr->pcpu_statistics) {
320362306a36Sopenharmony_ci		dev_err(dev, "Error allocating per-cpu statistics\n");
320462306a36Sopenharmony_ci		status = -ENOMEM;
320562306a36Sopenharmony_ci		goto destroy_queue;
320662306a36Sopenharmony_ci	}
320762306a36Sopenharmony_ci
320862306a36Sopenharmony_ci	mutex_lock(&board_lock);
320962306a36Sopenharmony_ci	list_add_tail(&ctlr->list, &spi_controller_list);
321062306a36Sopenharmony_ci	list_for_each_entry(bi, &board_list, list)
321162306a36Sopenharmony_ci		spi_match_controller_to_boardinfo(ctlr, &bi->board_info);
321262306a36Sopenharmony_ci	mutex_unlock(&board_lock);
321362306a36Sopenharmony_ci
321462306a36Sopenharmony_ci	/* Register devices from the device tree and ACPI */
321562306a36Sopenharmony_ci	of_register_spi_devices(ctlr);
321662306a36Sopenharmony_ci	acpi_register_spi_devices(ctlr);
321762306a36Sopenharmony_ci	return status;
321862306a36Sopenharmony_ci
321962306a36Sopenharmony_cidestroy_queue:
322062306a36Sopenharmony_ci	spi_destroy_queue(ctlr);
322162306a36Sopenharmony_cifree_bus_id:
322262306a36Sopenharmony_ci	mutex_lock(&board_lock);
322362306a36Sopenharmony_ci	idr_remove(&spi_master_idr, ctlr->bus_num);
322462306a36Sopenharmony_ci	mutex_unlock(&board_lock);
322562306a36Sopenharmony_ci	return status;
322662306a36Sopenharmony_ci}
322762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_register_controller);
322862306a36Sopenharmony_ci
322962306a36Sopenharmony_cistatic void devm_spi_unregister(struct device *dev, void *res)
323062306a36Sopenharmony_ci{
323162306a36Sopenharmony_ci	spi_unregister_controller(*(struct spi_controller **)res);
323262306a36Sopenharmony_ci}
323362306a36Sopenharmony_ci
323462306a36Sopenharmony_ci/**
323562306a36Sopenharmony_ci * devm_spi_register_controller - register managed SPI master or slave
323662306a36Sopenharmony_ci *	controller
323762306a36Sopenharmony_ci * @dev:    device managing SPI controller
323862306a36Sopenharmony_ci * @ctlr: initialized controller, originally from spi_alloc_master() or
323962306a36Sopenharmony_ci *	spi_alloc_slave()
324062306a36Sopenharmony_ci * Context: can sleep
324162306a36Sopenharmony_ci *
324262306a36Sopenharmony_ci * Register a SPI device as with spi_register_controller() which will
324362306a36Sopenharmony_ci * automatically be unregistered and freed.
324462306a36Sopenharmony_ci *
324562306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
324662306a36Sopenharmony_ci */
324762306a36Sopenharmony_ciint devm_spi_register_controller(struct device *dev,
324862306a36Sopenharmony_ci				 struct spi_controller *ctlr)
324962306a36Sopenharmony_ci{
325062306a36Sopenharmony_ci	struct spi_controller **ptr;
325162306a36Sopenharmony_ci	int ret;
325262306a36Sopenharmony_ci
325362306a36Sopenharmony_ci	ptr = devres_alloc(devm_spi_unregister, sizeof(*ptr), GFP_KERNEL);
325462306a36Sopenharmony_ci	if (!ptr)
325562306a36Sopenharmony_ci		return -ENOMEM;
325662306a36Sopenharmony_ci
325762306a36Sopenharmony_ci	ret = spi_register_controller(ctlr);
325862306a36Sopenharmony_ci	if (!ret) {
325962306a36Sopenharmony_ci		*ptr = ctlr;
326062306a36Sopenharmony_ci		devres_add(dev, ptr);
326162306a36Sopenharmony_ci	} else {
326262306a36Sopenharmony_ci		devres_free(ptr);
326362306a36Sopenharmony_ci	}
326462306a36Sopenharmony_ci
326562306a36Sopenharmony_ci	return ret;
326662306a36Sopenharmony_ci}
326762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(devm_spi_register_controller);
326862306a36Sopenharmony_ci
326962306a36Sopenharmony_cistatic int __unregister(struct device *dev, void *null)
327062306a36Sopenharmony_ci{
327162306a36Sopenharmony_ci	spi_unregister_device(to_spi_device(dev));
327262306a36Sopenharmony_ci	return 0;
327362306a36Sopenharmony_ci}
327462306a36Sopenharmony_ci
327562306a36Sopenharmony_ci/**
327662306a36Sopenharmony_ci * spi_unregister_controller - unregister SPI master or slave controller
327762306a36Sopenharmony_ci * @ctlr: the controller being unregistered
327862306a36Sopenharmony_ci * Context: can sleep
327962306a36Sopenharmony_ci *
328062306a36Sopenharmony_ci * This call is used only by SPI controller drivers, which are the
328162306a36Sopenharmony_ci * only ones directly touching chip registers.
328262306a36Sopenharmony_ci *
328362306a36Sopenharmony_ci * This must be called from context that can sleep.
328462306a36Sopenharmony_ci *
328562306a36Sopenharmony_ci * Note that this function also drops a reference to the controller.
328662306a36Sopenharmony_ci */
328762306a36Sopenharmony_civoid spi_unregister_controller(struct spi_controller *ctlr)
328862306a36Sopenharmony_ci{
328962306a36Sopenharmony_ci	struct spi_controller *found;
329062306a36Sopenharmony_ci	int id = ctlr->bus_num;
329162306a36Sopenharmony_ci
329262306a36Sopenharmony_ci	/* Prevent addition of new devices, unregister existing ones */
329362306a36Sopenharmony_ci	if (IS_ENABLED(CONFIG_SPI_DYNAMIC))
329462306a36Sopenharmony_ci		mutex_lock(&ctlr->add_lock);
329562306a36Sopenharmony_ci
329662306a36Sopenharmony_ci	device_for_each_child(&ctlr->dev, NULL, __unregister);
329762306a36Sopenharmony_ci
329862306a36Sopenharmony_ci	/* First make sure that this controller was ever added */
329962306a36Sopenharmony_ci	mutex_lock(&board_lock);
330062306a36Sopenharmony_ci	found = idr_find(&spi_master_idr, id);
330162306a36Sopenharmony_ci	mutex_unlock(&board_lock);
330262306a36Sopenharmony_ci	if (ctlr->queued) {
330362306a36Sopenharmony_ci		if (spi_destroy_queue(ctlr))
330462306a36Sopenharmony_ci			dev_err(&ctlr->dev, "queue remove failed\n");
330562306a36Sopenharmony_ci	}
330662306a36Sopenharmony_ci	mutex_lock(&board_lock);
330762306a36Sopenharmony_ci	list_del(&ctlr->list);
330862306a36Sopenharmony_ci	mutex_unlock(&board_lock);
330962306a36Sopenharmony_ci
331062306a36Sopenharmony_ci	device_del(&ctlr->dev);
331162306a36Sopenharmony_ci
331262306a36Sopenharmony_ci	/* Free bus id */
331362306a36Sopenharmony_ci	mutex_lock(&board_lock);
331462306a36Sopenharmony_ci	if (found == ctlr)
331562306a36Sopenharmony_ci		idr_remove(&spi_master_idr, id);
331662306a36Sopenharmony_ci	mutex_unlock(&board_lock);
331762306a36Sopenharmony_ci
331862306a36Sopenharmony_ci	if (IS_ENABLED(CONFIG_SPI_DYNAMIC))
331962306a36Sopenharmony_ci		mutex_unlock(&ctlr->add_lock);
332062306a36Sopenharmony_ci
332162306a36Sopenharmony_ci	/*
332262306a36Sopenharmony_ci	 * Release the last reference on the controller if its driver
332362306a36Sopenharmony_ci	 * has not yet been converted to devm_spi_alloc_master/slave().
332462306a36Sopenharmony_ci	 */
332562306a36Sopenharmony_ci	if (!ctlr->devm_allocated)
332662306a36Sopenharmony_ci		put_device(&ctlr->dev);
332762306a36Sopenharmony_ci}
332862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_unregister_controller);
332962306a36Sopenharmony_ci
333062306a36Sopenharmony_cistatic inline int __spi_check_suspended(const struct spi_controller *ctlr)
333162306a36Sopenharmony_ci{
333262306a36Sopenharmony_ci	return ctlr->flags & SPI_CONTROLLER_SUSPENDED ? -ESHUTDOWN : 0;
333362306a36Sopenharmony_ci}
333462306a36Sopenharmony_ci
333562306a36Sopenharmony_cistatic inline void __spi_mark_suspended(struct spi_controller *ctlr)
333662306a36Sopenharmony_ci{
333762306a36Sopenharmony_ci	mutex_lock(&ctlr->bus_lock_mutex);
333862306a36Sopenharmony_ci	ctlr->flags |= SPI_CONTROLLER_SUSPENDED;
333962306a36Sopenharmony_ci	mutex_unlock(&ctlr->bus_lock_mutex);
334062306a36Sopenharmony_ci}
334162306a36Sopenharmony_ci
334262306a36Sopenharmony_cistatic inline void __spi_mark_resumed(struct spi_controller *ctlr)
334362306a36Sopenharmony_ci{
334462306a36Sopenharmony_ci	mutex_lock(&ctlr->bus_lock_mutex);
334562306a36Sopenharmony_ci	ctlr->flags &= ~SPI_CONTROLLER_SUSPENDED;
334662306a36Sopenharmony_ci	mutex_unlock(&ctlr->bus_lock_mutex);
334762306a36Sopenharmony_ci}
334862306a36Sopenharmony_ci
334962306a36Sopenharmony_ciint spi_controller_suspend(struct spi_controller *ctlr)
335062306a36Sopenharmony_ci{
335162306a36Sopenharmony_ci	int ret = 0;
335262306a36Sopenharmony_ci
335362306a36Sopenharmony_ci	/* Basically no-ops for non-queued controllers */
335462306a36Sopenharmony_ci	if (ctlr->queued) {
335562306a36Sopenharmony_ci		ret = spi_stop_queue(ctlr);
335662306a36Sopenharmony_ci		if (ret)
335762306a36Sopenharmony_ci			dev_err(&ctlr->dev, "queue stop failed\n");
335862306a36Sopenharmony_ci	}
335962306a36Sopenharmony_ci
336062306a36Sopenharmony_ci	__spi_mark_suspended(ctlr);
336162306a36Sopenharmony_ci	return ret;
336262306a36Sopenharmony_ci}
336362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_controller_suspend);
336462306a36Sopenharmony_ci
336562306a36Sopenharmony_ciint spi_controller_resume(struct spi_controller *ctlr)
336662306a36Sopenharmony_ci{
336762306a36Sopenharmony_ci	int ret = 0;
336862306a36Sopenharmony_ci
336962306a36Sopenharmony_ci	__spi_mark_resumed(ctlr);
337062306a36Sopenharmony_ci
337162306a36Sopenharmony_ci	if (ctlr->queued) {
337262306a36Sopenharmony_ci		ret = spi_start_queue(ctlr);
337362306a36Sopenharmony_ci		if (ret)
337462306a36Sopenharmony_ci			dev_err(&ctlr->dev, "queue restart failed\n");
337562306a36Sopenharmony_ci	}
337662306a36Sopenharmony_ci	return ret;
337762306a36Sopenharmony_ci}
337862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_controller_resume);
337962306a36Sopenharmony_ci
338062306a36Sopenharmony_ci/*-------------------------------------------------------------------------*/
338162306a36Sopenharmony_ci
338262306a36Sopenharmony_ci/* Core methods for spi_message alterations */
338362306a36Sopenharmony_ci
338462306a36Sopenharmony_cistatic void __spi_replace_transfers_release(struct spi_controller *ctlr,
338562306a36Sopenharmony_ci					    struct spi_message *msg,
338662306a36Sopenharmony_ci					    void *res)
338762306a36Sopenharmony_ci{
338862306a36Sopenharmony_ci	struct spi_replaced_transfers *rxfer = res;
338962306a36Sopenharmony_ci	size_t i;
339062306a36Sopenharmony_ci
339162306a36Sopenharmony_ci	/* Call extra callback if requested */
339262306a36Sopenharmony_ci	if (rxfer->release)
339362306a36Sopenharmony_ci		rxfer->release(ctlr, msg, res);
339462306a36Sopenharmony_ci
339562306a36Sopenharmony_ci	/* Insert replaced transfers back into the message */
339662306a36Sopenharmony_ci	list_splice(&rxfer->replaced_transfers, rxfer->replaced_after);
339762306a36Sopenharmony_ci
339862306a36Sopenharmony_ci	/* Remove the formerly inserted entries */
339962306a36Sopenharmony_ci	for (i = 0; i < rxfer->inserted; i++)
340062306a36Sopenharmony_ci		list_del(&rxfer->inserted_transfers[i].transfer_list);
340162306a36Sopenharmony_ci}
340262306a36Sopenharmony_ci
340362306a36Sopenharmony_ci/**
340462306a36Sopenharmony_ci * spi_replace_transfers - replace transfers with several transfers
340562306a36Sopenharmony_ci *                         and register change with spi_message.resources
340662306a36Sopenharmony_ci * @msg:           the spi_message we work upon
340762306a36Sopenharmony_ci * @xfer_first:    the first spi_transfer we want to replace
340862306a36Sopenharmony_ci * @remove:        number of transfers to remove
340962306a36Sopenharmony_ci * @insert:        the number of transfers we want to insert instead
341062306a36Sopenharmony_ci * @release:       extra release code necessary in some circumstances
341162306a36Sopenharmony_ci * @extradatasize: extra data to allocate (with alignment guarantees
341262306a36Sopenharmony_ci *                 of struct @spi_transfer)
341362306a36Sopenharmony_ci * @gfp:           gfp flags
341462306a36Sopenharmony_ci *
341562306a36Sopenharmony_ci * Returns: pointer to @spi_replaced_transfers,
341662306a36Sopenharmony_ci *          PTR_ERR(...) in case of errors.
341762306a36Sopenharmony_ci */
341862306a36Sopenharmony_cistatic struct spi_replaced_transfers *spi_replace_transfers(
341962306a36Sopenharmony_ci	struct spi_message *msg,
342062306a36Sopenharmony_ci	struct spi_transfer *xfer_first,
342162306a36Sopenharmony_ci	size_t remove,
342262306a36Sopenharmony_ci	size_t insert,
342362306a36Sopenharmony_ci	spi_replaced_release_t release,
342462306a36Sopenharmony_ci	size_t extradatasize,
342562306a36Sopenharmony_ci	gfp_t gfp)
342662306a36Sopenharmony_ci{
342762306a36Sopenharmony_ci	struct spi_replaced_transfers *rxfer;
342862306a36Sopenharmony_ci	struct spi_transfer *xfer;
342962306a36Sopenharmony_ci	size_t i;
343062306a36Sopenharmony_ci
343162306a36Sopenharmony_ci	/* Allocate the structure using spi_res */
343262306a36Sopenharmony_ci	rxfer = spi_res_alloc(msg->spi, __spi_replace_transfers_release,
343362306a36Sopenharmony_ci			      struct_size(rxfer, inserted_transfers, insert)
343462306a36Sopenharmony_ci			      + extradatasize,
343562306a36Sopenharmony_ci			      gfp);
343662306a36Sopenharmony_ci	if (!rxfer)
343762306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
343862306a36Sopenharmony_ci
343962306a36Sopenharmony_ci	/* The release code to invoke before running the generic release */
344062306a36Sopenharmony_ci	rxfer->release = release;
344162306a36Sopenharmony_ci
344262306a36Sopenharmony_ci	/* Assign extradata */
344362306a36Sopenharmony_ci	if (extradatasize)
344462306a36Sopenharmony_ci		rxfer->extradata =
344562306a36Sopenharmony_ci			&rxfer->inserted_transfers[insert];
344662306a36Sopenharmony_ci
344762306a36Sopenharmony_ci	/* Init the replaced_transfers list */
344862306a36Sopenharmony_ci	INIT_LIST_HEAD(&rxfer->replaced_transfers);
344962306a36Sopenharmony_ci
345062306a36Sopenharmony_ci	/*
345162306a36Sopenharmony_ci	 * Assign the list_entry after which we should reinsert
345262306a36Sopenharmony_ci	 * the @replaced_transfers - it may be spi_message.messages!
345362306a36Sopenharmony_ci	 */
345462306a36Sopenharmony_ci	rxfer->replaced_after = xfer_first->transfer_list.prev;
345562306a36Sopenharmony_ci
345662306a36Sopenharmony_ci	/* Remove the requested number of transfers */
345762306a36Sopenharmony_ci	for (i = 0; i < remove; i++) {
345862306a36Sopenharmony_ci		/*
345962306a36Sopenharmony_ci		 * If the entry after replaced_after it is msg->transfers
346062306a36Sopenharmony_ci		 * then we have been requested to remove more transfers
346162306a36Sopenharmony_ci		 * than are in the list.
346262306a36Sopenharmony_ci		 */
346362306a36Sopenharmony_ci		if (rxfer->replaced_after->next == &msg->transfers) {
346462306a36Sopenharmony_ci			dev_err(&msg->spi->dev,
346562306a36Sopenharmony_ci				"requested to remove more spi_transfers than are available\n");
346662306a36Sopenharmony_ci			/* Insert replaced transfers back into the message */
346762306a36Sopenharmony_ci			list_splice(&rxfer->replaced_transfers,
346862306a36Sopenharmony_ci				    rxfer->replaced_after);
346962306a36Sopenharmony_ci
347062306a36Sopenharmony_ci			/* Free the spi_replace_transfer structure... */
347162306a36Sopenharmony_ci			spi_res_free(rxfer);
347262306a36Sopenharmony_ci
347362306a36Sopenharmony_ci			/* ...and return with an error */
347462306a36Sopenharmony_ci			return ERR_PTR(-EINVAL);
347562306a36Sopenharmony_ci		}
347662306a36Sopenharmony_ci
347762306a36Sopenharmony_ci		/*
347862306a36Sopenharmony_ci		 * Remove the entry after replaced_after from list of
347962306a36Sopenharmony_ci		 * transfers and add it to list of replaced_transfers.
348062306a36Sopenharmony_ci		 */
348162306a36Sopenharmony_ci		list_move_tail(rxfer->replaced_after->next,
348262306a36Sopenharmony_ci			       &rxfer->replaced_transfers);
348362306a36Sopenharmony_ci	}
348462306a36Sopenharmony_ci
348562306a36Sopenharmony_ci	/*
348662306a36Sopenharmony_ci	 * Create copy of the given xfer with identical settings
348762306a36Sopenharmony_ci	 * based on the first transfer to get removed.
348862306a36Sopenharmony_ci	 */
348962306a36Sopenharmony_ci	for (i = 0; i < insert; i++) {
349062306a36Sopenharmony_ci		/* We need to run in reverse order */
349162306a36Sopenharmony_ci		xfer = &rxfer->inserted_transfers[insert - 1 - i];
349262306a36Sopenharmony_ci
349362306a36Sopenharmony_ci		/* Copy all spi_transfer data */
349462306a36Sopenharmony_ci		memcpy(xfer, xfer_first, sizeof(*xfer));
349562306a36Sopenharmony_ci
349662306a36Sopenharmony_ci		/* Add to list */
349762306a36Sopenharmony_ci		list_add(&xfer->transfer_list, rxfer->replaced_after);
349862306a36Sopenharmony_ci
349962306a36Sopenharmony_ci		/* Clear cs_change and delay for all but the last */
350062306a36Sopenharmony_ci		if (i) {
350162306a36Sopenharmony_ci			xfer->cs_change = false;
350262306a36Sopenharmony_ci			xfer->delay.value = 0;
350362306a36Sopenharmony_ci		}
350462306a36Sopenharmony_ci	}
350562306a36Sopenharmony_ci
350662306a36Sopenharmony_ci	/* Set up inserted... */
350762306a36Sopenharmony_ci	rxfer->inserted = insert;
350862306a36Sopenharmony_ci
350962306a36Sopenharmony_ci	/* ...and register it with spi_res/spi_message */
351062306a36Sopenharmony_ci	spi_res_add(msg, rxfer);
351162306a36Sopenharmony_ci
351262306a36Sopenharmony_ci	return rxfer;
351362306a36Sopenharmony_ci}
351462306a36Sopenharmony_ci
351562306a36Sopenharmony_cistatic int __spi_split_transfer_maxsize(struct spi_controller *ctlr,
351662306a36Sopenharmony_ci					struct spi_message *msg,
351762306a36Sopenharmony_ci					struct spi_transfer **xferp,
351862306a36Sopenharmony_ci					size_t maxsize,
351962306a36Sopenharmony_ci					gfp_t gfp)
352062306a36Sopenharmony_ci{
352162306a36Sopenharmony_ci	struct spi_transfer *xfer = *xferp, *xfers;
352262306a36Sopenharmony_ci	struct spi_replaced_transfers *srt;
352362306a36Sopenharmony_ci	size_t offset;
352462306a36Sopenharmony_ci	size_t count, i;
352562306a36Sopenharmony_ci
352662306a36Sopenharmony_ci	/* Calculate how many we have to replace */
352762306a36Sopenharmony_ci	count = DIV_ROUND_UP(xfer->len, maxsize);
352862306a36Sopenharmony_ci
352962306a36Sopenharmony_ci	/* Create replacement */
353062306a36Sopenharmony_ci	srt = spi_replace_transfers(msg, xfer, 1, count, NULL, 0, gfp);
353162306a36Sopenharmony_ci	if (IS_ERR(srt))
353262306a36Sopenharmony_ci		return PTR_ERR(srt);
353362306a36Sopenharmony_ci	xfers = srt->inserted_transfers;
353462306a36Sopenharmony_ci
353562306a36Sopenharmony_ci	/*
353662306a36Sopenharmony_ci	 * Now handle each of those newly inserted spi_transfers.
353762306a36Sopenharmony_ci	 * Note that the replacements spi_transfers all are preset
353862306a36Sopenharmony_ci	 * to the same values as *xferp, so tx_buf, rx_buf and len
353962306a36Sopenharmony_ci	 * are all identical (as well as most others)
354062306a36Sopenharmony_ci	 * so we just have to fix up len and the pointers.
354162306a36Sopenharmony_ci	 *
354262306a36Sopenharmony_ci	 * This also includes support for the depreciated
354362306a36Sopenharmony_ci	 * spi_message.is_dma_mapped interface.
354462306a36Sopenharmony_ci	 */
354562306a36Sopenharmony_ci
354662306a36Sopenharmony_ci	/*
354762306a36Sopenharmony_ci	 * The first transfer just needs the length modified, so we
354862306a36Sopenharmony_ci	 * run it outside the loop.
354962306a36Sopenharmony_ci	 */
355062306a36Sopenharmony_ci	xfers[0].len = min_t(size_t, maxsize, xfer[0].len);
355162306a36Sopenharmony_ci
355262306a36Sopenharmony_ci	/* All the others need rx_buf/tx_buf also set */
355362306a36Sopenharmony_ci	for (i = 1, offset = maxsize; i < count; offset += maxsize, i++) {
355462306a36Sopenharmony_ci		/* Update rx_buf, tx_buf and DMA */
355562306a36Sopenharmony_ci		if (xfers[i].rx_buf)
355662306a36Sopenharmony_ci			xfers[i].rx_buf += offset;
355762306a36Sopenharmony_ci		if (xfers[i].rx_dma)
355862306a36Sopenharmony_ci			xfers[i].rx_dma += offset;
355962306a36Sopenharmony_ci		if (xfers[i].tx_buf)
356062306a36Sopenharmony_ci			xfers[i].tx_buf += offset;
356162306a36Sopenharmony_ci		if (xfers[i].tx_dma)
356262306a36Sopenharmony_ci			xfers[i].tx_dma += offset;
356362306a36Sopenharmony_ci
356462306a36Sopenharmony_ci		/* Update length */
356562306a36Sopenharmony_ci		xfers[i].len = min(maxsize, xfers[i].len - offset);
356662306a36Sopenharmony_ci	}
356762306a36Sopenharmony_ci
356862306a36Sopenharmony_ci	/*
356962306a36Sopenharmony_ci	 * We set up xferp to the last entry we have inserted,
357062306a36Sopenharmony_ci	 * so that we skip those already split transfers.
357162306a36Sopenharmony_ci	 */
357262306a36Sopenharmony_ci	*xferp = &xfers[count - 1];
357362306a36Sopenharmony_ci
357462306a36Sopenharmony_ci	/* Increment statistics counters */
357562306a36Sopenharmony_ci	SPI_STATISTICS_INCREMENT_FIELD(ctlr->pcpu_statistics,
357662306a36Sopenharmony_ci				       transfers_split_maxsize);
357762306a36Sopenharmony_ci	SPI_STATISTICS_INCREMENT_FIELD(msg->spi->pcpu_statistics,
357862306a36Sopenharmony_ci				       transfers_split_maxsize);
357962306a36Sopenharmony_ci
358062306a36Sopenharmony_ci	return 0;
358162306a36Sopenharmony_ci}
358262306a36Sopenharmony_ci
358362306a36Sopenharmony_ci/**
358462306a36Sopenharmony_ci * spi_split_transfers_maxsize - split spi transfers into multiple transfers
358562306a36Sopenharmony_ci *                               when an individual transfer exceeds a
358662306a36Sopenharmony_ci *                               certain size
358762306a36Sopenharmony_ci * @ctlr:    the @spi_controller for this transfer
358862306a36Sopenharmony_ci * @msg:   the @spi_message to transform
358962306a36Sopenharmony_ci * @maxsize:  the maximum when to apply this
359062306a36Sopenharmony_ci * @gfp: GFP allocation flags
359162306a36Sopenharmony_ci *
359262306a36Sopenharmony_ci * Return: status of transformation
359362306a36Sopenharmony_ci */
359462306a36Sopenharmony_ciint spi_split_transfers_maxsize(struct spi_controller *ctlr,
359562306a36Sopenharmony_ci				struct spi_message *msg,
359662306a36Sopenharmony_ci				size_t maxsize,
359762306a36Sopenharmony_ci				gfp_t gfp)
359862306a36Sopenharmony_ci{
359962306a36Sopenharmony_ci	struct spi_transfer *xfer;
360062306a36Sopenharmony_ci	int ret;
360162306a36Sopenharmony_ci
360262306a36Sopenharmony_ci	/*
360362306a36Sopenharmony_ci	 * Iterate over the transfer_list,
360462306a36Sopenharmony_ci	 * but note that xfer is advanced to the last transfer inserted
360562306a36Sopenharmony_ci	 * to avoid checking sizes again unnecessarily (also xfer does
360662306a36Sopenharmony_ci	 * potentially belong to a different list by the time the
360762306a36Sopenharmony_ci	 * replacement has happened).
360862306a36Sopenharmony_ci	 */
360962306a36Sopenharmony_ci	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
361062306a36Sopenharmony_ci		if (xfer->len > maxsize) {
361162306a36Sopenharmony_ci			ret = __spi_split_transfer_maxsize(ctlr, msg, &xfer,
361262306a36Sopenharmony_ci							   maxsize, gfp);
361362306a36Sopenharmony_ci			if (ret)
361462306a36Sopenharmony_ci				return ret;
361562306a36Sopenharmony_ci		}
361662306a36Sopenharmony_ci	}
361762306a36Sopenharmony_ci
361862306a36Sopenharmony_ci	return 0;
361962306a36Sopenharmony_ci}
362062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_split_transfers_maxsize);
362162306a36Sopenharmony_ci
362262306a36Sopenharmony_ci
362362306a36Sopenharmony_ci/**
362462306a36Sopenharmony_ci * spi_split_transfers_maxwords - split SPI transfers into multiple transfers
362562306a36Sopenharmony_ci *                                when an individual transfer exceeds a
362662306a36Sopenharmony_ci *                                certain number of SPI words
362762306a36Sopenharmony_ci * @ctlr:     the @spi_controller for this transfer
362862306a36Sopenharmony_ci * @msg:      the @spi_message to transform
362962306a36Sopenharmony_ci * @maxwords: the number of words to limit each transfer to
363062306a36Sopenharmony_ci * @gfp:      GFP allocation flags
363162306a36Sopenharmony_ci *
363262306a36Sopenharmony_ci * Return: status of transformation
363362306a36Sopenharmony_ci */
363462306a36Sopenharmony_ciint spi_split_transfers_maxwords(struct spi_controller *ctlr,
363562306a36Sopenharmony_ci				 struct spi_message *msg,
363662306a36Sopenharmony_ci				 size_t maxwords,
363762306a36Sopenharmony_ci				 gfp_t gfp)
363862306a36Sopenharmony_ci{
363962306a36Sopenharmony_ci	struct spi_transfer *xfer;
364062306a36Sopenharmony_ci
364162306a36Sopenharmony_ci	/*
364262306a36Sopenharmony_ci	 * Iterate over the transfer_list,
364362306a36Sopenharmony_ci	 * but note that xfer is advanced to the last transfer inserted
364462306a36Sopenharmony_ci	 * to avoid checking sizes again unnecessarily (also xfer does
364562306a36Sopenharmony_ci	 * potentially belong to a different list by the time the
364662306a36Sopenharmony_ci	 * replacement has happened).
364762306a36Sopenharmony_ci	 */
364862306a36Sopenharmony_ci	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
364962306a36Sopenharmony_ci		size_t maxsize;
365062306a36Sopenharmony_ci		int ret;
365162306a36Sopenharmony_ci
365262306a36Sopenharmony_ci		maxsize = maxwords * roundup_pow_of_two(BITS_TO_BYTES(xfer->bits_per_word));
365362306a36Sopenharmony_ci		if (xfer->len > maxsize) {
365462306a36Sopenharmony_ci			ret = __spi_split_transfer_maxsize(ctlr, msg, &xfer,
365562306a36Sopenharmony_ci							   maxsize, gfp);
365662306a36Sopenharmony_ci			if (ret)
365762306a36Sopenharmony_ci				return ret;
365862306a36Sopenharmony_ci		}
365962306a36Sopenharmony_ci	}
366062306a36Sopenharmony_ci
366162306a36Sopenharmony_ci	return 0;
366262306a36Sopenharmony_ci}
366362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_split_transfers_maxwords);
366462306a36Sopenharmony_ci
366562306a36Sopenharmony_ci/*-------------------------------------------------------------------------*/
366662306a36Sopenharmony_ci
366762306a36Sopenharmony_ci/*
366862306a36Sopenharmony_ci * Core methods for SPI controller protocol drivers. Some of the
366962306a36Sopenharmony_ci * other core methods are currently defined as inline functions.
367062306a36Sopenharmony_ci */
367162306a36Sopenharmony_ci
367262306a36Sopenharmony_cistatic int __spi_validate_bits_per_word(struct spi_controller *ctlr,
367362306a36Sopenharmony_ci					u8 bits_per_word)
367462306a36Sopenharmony_ci{
367562306a36Sopenharmony_ci	if (ctlr->bits_per_word_mask) {
367662306a36Sopenharmony_ci		/* Only 32 bits fit in the mask */
367762306a36Sopenharmony_ci		if (bits_per_word > 32)
367862306a36Sopenharmony_ci			return -EINVAL;
367962306a36Sopenharmony_ci		if (!(ctlr->bits_per_word_mask & SPI_BPW_MASK(bits_per_word)))
368062306a36Sopenharmony_ci			return -EINVAL;
368162306a36Sopenharmony_ci	}
368262306a36Sopenharmony_ci
368362306a36Sopenharmony_ci	return 0;
368462306a36Sopenharmony_ci}
368562306a36Sopenharmony_ci
368662306a36Sopenharmony_ci/**
368762306a36Sopenharmony_ci * spi_set_cs_timing - configure CS setup, hold, and inactive delays
368862306a36Sopenharmony_ci * @spi: the device that requires specific CS timing configuration
368962306a36Sopenharmony_ci *
369062306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
369162306a36Sopenharmony_ci */
369262306a36Sopenharmony_cistatic int spi_set_cs_timing(struct spi_device *spi)
369362306a36Sopenharmony_ci{
369462306a36Sopenharmony_ci	struct device *parent = spi->controller->dev.parent;
369562306a36Sopenharmony_ci	int status = 0;
369662306a36Sopenharmony_ci
369762306a36Sopenharmony_ci	if (spi->controller->set_cs_timing && !spi_get_csgpiod(spi, 0)) {
369862306a36Sopenharmony_ci		if (spi->controller->auto_runtime_pm) {
369962306a36Sopenharmony_ci			status = pm_runtime_get_sync(parent);
370062306a36Sopenharmony_ci			if (status < 0) {
370162306a36Sopenharmony_ci				pm_runtime_put_noidle(parent);
370262306a36Sopenharmony_ci				dev_err(&spi->controller->dev, "Failed to power device: %d\n",
370362306a36Sopenharmony_ci					status);
370462306a36Sopenharmony_ci				return status;
370562306a36Sopenharmony_ci			}
370662306a36Sopenharmony_ci
370762306a36Sopenharmony_ci			status = spi->controller->set_cs_timing(spi);
370862306a36Sopenharmony_ci			pm_runtime_mark_last_busy(parent);
370962306a36Sopenharmony_ci			pm_runtime_put_autosuspend(parent);
371062306a36Sopenharmony_ci		} else {
371162306a36Sopenharmony_ci			status = spi->controller->set_cs_timing(spi);
371262306a36Sopenharmony_ci		}
371362306a36Sopenharmony_ci	}
371462306a36Sopenharmony_ci	return status;
371562306a36Sopenharmony_ci}
371662306a36Sopenharmony_ci
371762306a36Sopenharmony_ci/**
371862306a36Sopenharmony_ci * spi_setup - setup SPI mode and clock rate
371962306a36Sopenharmony_ci * @spi: the device whose settings are being modified
372062306a36Sopenharmony_ci * Context: can sleep, and no requests are queued to the device
372162306a36Sopenharmony_ci *
372262306a36Sopenharmony_ci * SPI protocol drivers may need to update the transfer mode if the
372362306a36Sopenharmony_ci * device doesn't work with its default.  They may likewise need
372462306a36Sopenharmony_ci * to update clock rates or word sizes from initial values.  This function
372562306a36Sopenharmony_ci * changes those settings, and must be called from a context that can sleep.
372662306a36Sopenharmony_ci * Except for SPI_CS_HIGH, which takes effect immediately, the changes take
372762306a36Sopenharmony_ci * effect the next time the device is selected and data is transferred to
372862306a36Sopenharmony_ci * or from it.  When this function returns, the SPI device is deselected.
372962306a36Sopenharmony_ci *
373062306a36Sopenharmony_ci * Note that this call will fail if the protocol driver specifies an option
373162306a36Sopenharmony_ci * that the underlying controller or its driver does not support.  For
373262306a36Sopenharmony_ci * example, not all hardware supports wire transfers using nine bit words,
373362306a36Sopenharmony_ci * LSB-first wire encoding, or active-high chipselects.
373462306a36Sopenharmony_ci *
373562306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
373662306a36Sopenharmony_ci */
373762306a36Sopenharmony_ciint spi_setup(struct spi_device *spi)
373862306a36Sopenharmony_ci{
373962306a36Sopenharmony_ci	unsigned	bad_bits, ugly_bits;
374062306a36Sopenharmony_ci	int		status = 0;
374162306a36Sopenharmony_ci
374262306a36Sopenharmony_ci	/*
374362306a36Sopenharmony_ci	 * Check mode to prevent that any two of DUAL, QUAD and NO_MOSI/MISO
374462306a36Sopenharmony_ci	 * are set at the same time.
374562306a36Sopenharmony_ci	 */
374662306a36Sopenharmony_ci	if ((hweight_long(spi->mode &
374762306a36Sopenharmony_ci		(SPI_TX_DUAL | SPI_TX_QUAD | SPI_NO_TX)) > 1) ||
374862306a36Sopenharmony_ci	    (hweight_long(spi->mode &
374962306a36Sopenharmony_ci		(SPI_RX_DUAL | SPI_RX_QUAD | SPI_NO_RX)) > 1)) {
375062306a36Sopenharmony_ci		dev_err(&spi->dev,
375162306a36Sopenharmony_ci		"setup: can not select any two of dual, quad and no-rx/tx at the same time\n");
375262306a36Sopenharmony_ci		return -EINVAL;
375362306a36Sopenharmony_ci	}
375462306a36Sopenharmony_ci	/* If it is SPI_3WIRE mode, DUAL and QUAD should be forbidden */
375562306a36Sopenharmony_ci	if ((spi->mode & SPI_3WIRE) && (spi->mode &
375662306a36Sopenharmony_ci		(SPI_TX_DUAL | SPI_TX_QUAD | SPI_TX_OCTAL |
375762306a36Sopenharmony_ci		 SPI_RX_DUAL | SPI_RX_QUAD | SPI_RX_OCTAL)))
375862306a36Sopenharmony_ci		return -EINVAL;
375962306a36Sopenharmony_ci	/*
376062306a36Sopenharmony_ci	 * Help drivers fail *cleanly* when they need options
376162306a36Sopenharmony_ci	 * that aren't supported with their current controller.
376262306a36Sopenharmony_ci	 * SPI_CS_WORD has a fallback software implementation,
376362306a36Sopenharmony_ci	 * so it is ignored here.
376462306a36Sopenharmony_ci	 */
376562306a36Sopenharmony_ci	bad_bits = spi->mode & ~(spi->controller->mode_bits | SPI_CS_WORD |
376662306a36Sopenharmony_ci				 SPI_NO_TX | SPI_NO_RX);
376762306a36Sopenharmony_ci	ugly_bits = bad_bits &
376862306a36Sopenharmony_ci		    (SPI_TX_DUAL | SPI_TX_QUAD | SPI_TX_OCTAL |
376962306a36Sopenharmony_ci		     SPI_RX_DUAL | SPI_RX_QUAD | SPI_RX_OCTAL);
377062306a36Sopenharmony_ci	if (ugly_bits) {
377162306a36Sopenharmony_ci		dev_warn(&spi->dev,
377262306a36Sopenharmony_ci			 "setup: ignoring unsupported mode bits %x\n",
377362306a36Sopenharmony_ci			 ugly_bits);
377462306a36Sopenharmony_ci		spi->mode &= ~ugly_bits;
377562306a36Sopenharmony_ci		bad_bits &= ~ugly_bits;
377662306a36Sopenharmony_ci	}
377762306a36Sopenharmony_ci	if (bad_bits) {
377862306a36Sopenharmony_ci		dev_err(&spi->dev, "setup: unsupported mode bits %x\n",
377962306a36Sopenharmony_ci			bad_bits);
378062306a36Sopenharmony_ci		return -EINVAL;
378162306a36Sopenharmony_ci	}
378262306a36Sopenharmony_ci
378362306a36Sopenharmony_ci	if (!spi->bits_per_word) {
378462306a36Sopenharmony_ci		spi->bits_per_word = 8;
378562306a36Sopenharmony_ci	} else {
378662306a36Sopenharmony_ci		/*
378762306a36Sopenharmony_ci		 * Some controllers may not support the default 8 bits-per-word
378862306a36Sopenharmony_ci		 * so only perform the check when this is explicitly provided.
378962306a36Sopenharmony_ci		 */
379062306a36Sopenharmony_ci		status = __spi_validate_bits_per_word(spi->controller,
379162306a36Sopenharmony_ci						      spi->bits_per_word);
379262306a36Sopenharmony_ci		if (status)
379362306a36Sopenharmony_ci			return status;
379462306a36Sopenharmony_ci	}
379562306a36Sopenharmony_ci
379662306a36Sopenharmony_ci	if (spi->controller->max_speed_hz &&
379762306a36Sopenharmony_ci	    (!spi->max_speed_hz ||
379862306a36Sopenharmony_ci	     spi->max_speed_hz > spi->controller->max_speed_hz))
379962306a36Sopenharmony_ci		spi->max_speed_hz = spi->controller->max_speed_hz;
380062306a36Sopenharmony_ci
380162306a36Sopenharmony_ci	mutex_lock(&spi->controller->io_mutex);
380262306a36Sopenharmony_ci
380362306a36Sopenharmony_ci	if (spi->controller->setup) {
380462306a36Sopenharmony_ci		status = spi->controller->setup(spi);
380562306a36Sopenharmony_ci		if (status) {
380662306a36Sopenharmony_ci			mutex_unlock(&spi->controller->io_mutex);
380762306a36Sopenharmony_ci			dev_err(&spi->controller->dev, "Failed to setup device: %d\n",
380862306a36Sopenharmony_ci				status);
380962306a36Sopenharmony_ci			return status;
381062306a36Sopenharmony_ci		}
381162306a36Sopenharmony_ci	}
381262306a36Sopenharmony_ci
381362306a36Sopenharmony_ci	status = spi_set_cs_timing(spi);
381462306a36Sopenharmony_ci	if (status) {
381562306a36Sopenharmony_ci		mutex_unlock(&spi->controller->io_mutex);
381662306a36Sopenharmony_ci		return status;
381762306a36Sopenharmony_ci	}
381862306a36Sopenharmony_ci
381962306a36Sopenharmony_ci	if (spi->controller->auto_runtime_pm && spi->controller->set_cs) {
382062306a36Sopenharmony_ci		status = pm_runtime_resume_and_get(spi->controller->dev.parent);
382162306a36Sopenharmony_ci		if (status < 0) {
382262306a36Sopenharmony_ci			mutex_unlock(&spi->controller->io_mutex);
382362306a36Sopenharmony_ci			dev_err(&spi->controller->dev, "Failed to power device: %d\n",
382462306a36Sopenharmony_ci				status);
382562306a36Sopenharmony_ci			return status;
382662306a36Sopenharmony_ci		}
382762306a36Sopenharmony_ci
382862306a36Sopenharmony_ci		/*
382962306a36Sopenharmony_ci		 * We do not want to return positive value from pm_runtime_get,
383062306a36Sopenharmony_ci		 * there are many instances of devices calling spi_setup() and
383162306a36Sopenharmony_ci		 * checking for a non-zero return value instead of a negative
383262306a36Sopenharmony_ci		 * return value.
383362306a36Sopenharmony_ci		 */
383462306a36Sopenharmony_ci		status = 0;
383562306a36Sopenharmony_ci
383662306a36Sopenharmony_ci		spi_set_cs(spi, false, true);
383762306a36Sopenharmony_ci		pm_runtime_mark_last_busy(spi->controller->dev.parent);
383862306a36Sopenharmony_ci		pm_runtime_put_autosuspend(spi->controller->dev.parent);
383962306a36Sopenharmony_ci	} else {
384062306a36Sopenharmony_ci		spi_set_cs(spi, false, true);
384162306a36Sopenharmony_ci	}
384262306a36Sopenharmony_ci
384362306a36Sopenharmony_ci	mutex_unlock(&spi->controller->io_mutex);
384462306a36Sopenharmony_ci
384562306a36Sopenharmony_ci	if (spi->rt && !spi->controller->rt) {
384662306a36Sopenharmony_ci		spi->controller->rt = true;
384762306a36Sopenharmony_ci		spi_set_thread_rt(spi->controller);
384862306a36Sopenharmony_ci	}
384962306a36Sopenharmony_ci
385062306a36Sopenharmony_ci	trace_spi_setup(spi, status);
385162306a36Sopenharmony_ci
385262306a36Sopenharmony_ci	dev_dbg(&spi->dev, "setup mode %lu, %s%s%s%s%u bits/w, %u Hz max --> %d\n",
385362306a36Sopenharmony_ci			spi->mode & SPI_MODE_X_MASK,
385462306a36Sopenharmony_ci			(spi->mode & SPI_CS_HIGH) ? "cs_high, " : "",
385562306a36Sopenharmony_ci			(spi->mode & SPI_LSB_FIRST) ? "lsb, " : "",
385662306a36Sopenharmony_ci			(spi->mode & SPI_3WIRE) ? "3wire, " : "",
385762306a36Sopenharmony_ci			(spi->mode & SPI_LOOP) ? "loopback, " : "",
385862306a36Sopenharmony_ci			spi->bits_per_word, spi->max_speed_hz,
385962306a36Sopenharmony_ci			status);
386062306a36Sopenharmony_ci
386162306a36Sopenharmony_ci	return status;
386262306a36Sopenharmony_ci}
386362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_setup);
386462306a36Sopenharmony_ci
386562306a36Sopenharmony_cistatic int _spi_xfer_word_delay_update(struct spi_transfer *xfer,
386662306a36Sopenharmony_ci				       struct spi_device *spi)
386762306a36Sopenharmony_ci{
386862306a36Sopenharmony_ci	int delay1, delay2;
386962306a36Sopenharmony_ci
387062306a36Sopenharmony_ci	delay1 = spi_delay_to_ns(&xfer->word_delay, xfer);
387162306a36Sopenharmony_ci	if (delay1 < 0)
387262306a36Sopenharmony_ci		return delay1;
387362306a36Sopenharmony_ci
387462306a36Sopenharmony_ci	delay2 = spi_delay_to_ns(&spi->word_delay, xfer);
387562306a36Sopenharmony_ci	if (delay2 < 0)
387662306a36Sopenharmony_ci		return delay2;
387762306a36Sopenharmony_ci
387862306a36Sopenharmony_ci	if (delay1 < delay2)
387962306a36Sopenharmony_ci		memcpy(&xfer->word_delay, &spi->word_delay,
388062306a36Sopenharmony_ci		       sizeof(xfer->word_delay));
388162306a36Sopenharmony_ci
388262306a36Sopenharmony_ci	return 0;
388362306a36Sopenharmony_ci}
388462306a36Sopenharmony_ci
388562306a36Sopenharmony_cistatic int __spi_validate(struct spi_device *spi, struct spi_message *message)
388662306a36Sopenharmony_ci{
388762306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
388862306a36Sopenharmony_ci	struct spi_transfer *xfer;
388962306a36Sopenharmony_ci	int w_size;
389062306a36Sopenharmony_ci
389162306a36Sopenharmony_ci	if (list_empty(&message->transfers))
389262306a36Sopenharmony_ci		return -EINVAL;
389362306a36Sopenharmony_ci
389462306a36Sopenharmony_ci	/*
389562306a36Sopenharmony_ci	 * If an SPI controller does not support toggling the CS line on each
389662306a36Sopenharmony_ci	 * transfer (indicated by the SPI_CS_WORD flag) or we are using a GPIO
389762306a36Sopenharmony_ci	 * for the CS line, we can emulate the CS-per-word hardware function by
389862306a36Sopenharmony_ci	 * splitting transfers into one-word transfers and ensuring that
389962306a36Sopenharmony_ci	 * cs_change is set for each transfer.
390062306a36Sopenharmony_ci	 */
390162306a36Sopenharmony_ci	if ((spi->mode & SPI_CS_WORD) && (!(ctlr->mode_bits & SPI_CS_WORD) ||
390262306a36Sopenharmony_ci					  spi_get_csgpiod(spi, 0))) {
390362306a36Sopenharmony_ci		size_t maxsize = BITS_TO_BYTES(spi->bits_per_word);
390462306a36Sopenharmony_ci		int ret;
390562306a36Sopenharmony_ci
390662306a36Sopenharmony_ci		/* spi_split_transfers_maxsize() requires message->spi */
390762306a36Sopenharmony_ci		message->spi = spi;
390862306a36Sopenharmony_ci
390962306a36Sopenharmony_ci		ret = spi_split_transfers_maxsize(ctlr, message, maxsize,
391062306a36Sopenharmony_ci						  GFP_KERNEL);
391162306a36Sopenharmony_ci		if (ret)
391262306a36Sopenharmony_ci			return ret;
391362306a36Sopenharmony_ci
391462306a36Sopenharmony_ci		list_for_each_entry(xfer, &message->transfers, transfer_list) {
391562306a36Sopenharmony_ci			/* Don't change cs_change on the last entry in the list */
391662306a36Sopenharmony_ci			if (list_is_last(&xfer->transfer_list, &message->transfers))
391762306a36Sopenharmony_ci				break;
391862306a36Sopenharmony_ci			xfer->cs_change = 1;
391962306a36Sopenharmony_ci		}
392062306a36Sopenharmony_ci	}
392162306a36Sopenharmony_ci
392262306a36Sopenharmony_ci	/*
392362306a36Sopenharmony_ci	 * Half-duplex links include original MicroWire, and ones with
392462306a36Sopenharmony_ci	 * only one data pin like SPI_3WIRE (switches direction) or where
392562306a36Sopenharmony_ci	 * either MOSI or MISO is missing.  They can also be caused by
392662306a36Sopenharmony_ci	 * software limitations.
392762306a36Sopenharmony_ci	 */
392862306a36Sopenharmony_ci	if ((ctlr->flags & SPI_CONTROLLER_HALF_DUPLEX) ||
392962306a36Sopenharmony_ci	    (spi->mode & SPI_3WIRE)) {
393062306a36Sopenharmony_ci		unsigned flags = ctlr->flags;
393162306a36Sopenharmony_ci
393262306a36Sopenharmony_ci		list_for_each_entry(xfer, &message->transfers, transfer_list) {
393362306a36Sopenharmony_ci			if (xfer->rx_buf && xfer->tx_buf)
393462306a36Sopenharmony_ci				return -EINVAL;
393562306a36Sopenharmony_ci			if ((flags & SPI_CONTROLLER_NO_TX) && xfer->tx_buf)
393662306a36Sopenharmony_ci				return -EINVAL;
393762306a36Sopenharmony_ci			if ((flags & SPI_CONTROLLER_NO_RX) && xfer->rx_buf)
393862306a36Sopenharmony_ci				return -EINVAL;
393962306a36Sopenharmony_ci		}
394062306a36Sopenharmony_ci	}
394162306a36Sopenharmony_ci
394262306a36Sopenharmony_ci	/*
394362306a36Sopenharmony_ci	 * Set transfer bits_per_word and max speed as spi device default if
394462306a36Sopenharmony_ci	 * it is not set for this transfer.
394562306a36Sopenharmony_ci	 * Set transfer tx_nbits and rx_nbits as single transfer default
394662306a36Sopenharmony_ci	 * (SPI_NBITS_SINGLE) if it is not set for this transfer.
394762306a36Sopenharmony_ci	 * Ensure transfer word_delay is at least as long as that required by
394862306a36Sopenharmony_ci	 * device itself.
394962306a36Sopenharmony_ci	 */
395062306a36Sopenharmony_ci	message->frame_length = 0;
395162306a36Sopenharmony_ci	list_for_each_entry(xfer, &message->transfers, transfer_list) {
395262306a36Sopenharmony_ci		xfer->effective_speed_hz = 0;
395362306a36Sopenharmony_ci		message->frame_length += xfer->len;
395462306a36Sopenharmony_ci		if (!xfer->bits_per_word)
395562306a36Sopenharmony_ci			xfer->bits_per_word = spi->bits_per_word;
395662306a36Sopenharmony_ci
395762306a36Sopenharmony_ci		if (!xfer->speed_hz)
395862306a36Sopenharmony_ci			xfer->speed_hz = spi->max_speed_hz;
395962306a36Sopenharmony_ci
396062306a36Sopenharmony_ci		if (ctlr->max_speed_hz && xfer->speed_hz > ctlr->max_speed_hz)
396162306a36Sopenharmony_ci			xfer->speed_hz = ctlr->max_speed_hz;
396262306a36Sopenharmony_ci
396362306a36Sopenharmony_ci		if (__spi_validate_bits_per_word(ctlr, xfer->bits_per_word))
396462306a36Sopenharmony_ci			return -EINVAL;
396562306a36Sopenharmony_ci
396662306a36Sopenharmony_ci		/*
396762306a36Sopenharmony_ci		 * SPI transfer length should be multiple of SPI word size
396862306a36Sopenharmony_ci		 * where SPI word size should be power-of-two multiple.
396962306a36Sopenharmony_ci		 */
397062306a36Sopenharmony_ci		if (xfer->bits_per_word <= 8)
397162306a36Sopenharmony_ci			w_size = 1;
397262306a36Sopenharmony_ci		else if (xfer->bits_per_word <= 16)
397362306a36Sopenharmony_ci			w_size = 2;
397462306a36Sopenharmony_ci		else
397562306a36Sopenharmony_ci			w_size = 4;
397662306a36Sopenharmony_ci
397762306a36Sopenharmony_ci		/* No partial transfers accepted */
397862306a36Sopenharmony_ci		if (xfer->len % w_size)
397962306a36Sopenharmony_ci			return -EINVAL;
398062306a36Sopenharmony_ci
398162306a36Sopenharmony_ci		if (xfer->speed_hz && ctlr->min_speed_hz &&
398262306a36Sopenharmony_ci		    xfer->speed_hz < ctlr->min_speed_hz)
398362306a36Sopenharmony_ci			return -EINVAL;
398462306a36Sopenharmony_ci
398562306a36Sopenharmony_ci		if (xfer->tx_buf && !xfer->tx_nbits)
398662306a36Sopenharmony_ci			xfer->tx_nbits = SPI_NBITS_SINGLE;
398762306a36Sopenharmony_ci		if (xfer->rx_buf && !xfer->rx_nbits)
398862306a36Sopenharmony_ci			xfer->rx_nbits = SPI_NBITS_SINGLE;
398962306a36Sopenharmony_ci		/*
399062306a36Sopenharmony_ci		 * Check transfer tx/rx_nbits:
399162306a36Sopenharmony_ci		 * 1. check the value matches one of single, dual and quad
399262306a36Sopenharmony_ci		 * 2. check tx/rx_nbits match the mode in spi_device
399362306a36Sopenharmony_ci		 */
399462306a36Sopenharmony_ci		if (xfer->tx_buf) {
399562306a36Sopenharmony_ci			if (spi->mode & SPI_NO_TX)
399662306a36Sopenharmony_ci				return -EINVAL;
399762306a36Sopenharmony_ci			if (xfer->tx_nbits != SPI_NBITS_SINGLE &&
399862306a36Sopenharmony_ci				xfer->tx_nbits != SPI_NBITS_DUAL &&
399962306a36Sopenharmony_ci				xfer->tx_nbits != SPI_NBITS_QUAD)
400062306a36Sopenharmony_ci				return -EINVAL;
400162306a36Sopenharmony_ci			if ((xfer->tx_nbits == SPI_NBITS_DUAL) &&
400262306a36Sopenharmony_ci				!(spi->mode & (SPI_TX_DUAL | SPI_TX_QUAD)))
400362306a36Sopenharmony_ci				return -EINVAL;
400462306a36Sopenharmony_ci			if ((xfer->tx_nbits == SPI_NBITS_QUAD) &&
400562306a36Sopenharmony_ci				!(spi->mode & SPI_TX_QUAD))
400662306a36Sopenharmony_ci				return -EINVAL;
400762306a36Sopenharmony_ci		}
400862306a36Sopenharmony_ci		/* Check transfer rx_nbits */
400962306a36Sopenharmony_ci		if (xfer->rx_buf) {
401062306a36Sopenharmony_ci			if (spi->mode & SPI_NO_RX)
401162306a36Sopenharmony_ci				return -EINVAL;
401262306a36Sopenharmony_ci			if (xfer->rx_nbits != SPI_NBITS_SINGLE &&
401362306a36Sopenharmony_ci				xfer->rx_nbits != SPI_NBITS_DUAL &&
401462306a36Sopenharmony_ci				xfer->rx_nbits != SPI_NBITS_QUAD)
401562306a36Sopenharmony_ci				return -EINVAL;
401662306a36Sopenharmony_ci			if ((xfer->rx_nbits == SPI_NBITS_DUAL) &&
401762306a36Sopenharmony_ci				!(spi->mode & (SPI_RX_DUAL | SPI_RX_QUAD)))
401862306a36Sopenharmony_ci				return -EINVAL;
401962306a36Sopenharmony_ci			if ((xfer->rx_nbits == SPI_NBITS_QUAD) &&
402062306a36Sopenharmony_ci				!(spi->mode & SPI_RX_QUAD))
402162306a36Sopenharmony_ci				return -EINVAL;
402262306a36Sopenharmony_ci		}
402362306a36Sopenharmony_ci
402462306a36Sopenharmony_ci		if (_spi_xfer_word_delay_update(xfer, spi))
402562306a36Sopenharmony_ci			return -EINVAL;
402662306a36Sopenharmony_ci	}
402762306a36Sopenharmony_ci
402862306a36Sopenharmony_ci	message->status = -EINPROGRESS;
402962306a36Sopenharmony_ci
403062306a36Sopenharmony_ci	return 0;
403162306a36Sopenharmony_ci}
403262306a36Sopenharmony_ci
403362306a36Sopenharmony_cistatic int __spi_async(struct spi_device *spi, struct spi_message *message)
403462306a36Sopenharmony_ci{
403562306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
403662306a36Sopenharmony_ci	struct spi_transfer *xfer;
403762306a36Sopenharmony_ci
403862306a36Sopenharmony_ci	/*
403962306a36Sopenharmony_ci	 * Some controllers do not support doing regular SPI transfers. Return
404062306a36Sopenharmony_ci	 * ENOTSUPP when this is the case.
404162306a36Sopenharmony_ci	 */
404262306a36Sopenharmony_ci	if (!ctlr->transfer)
404362306a36Sopenharmony_ci		return -ENOTSUPP;
404462306a36Sopenharmony_ci
404562306a36Sopenharmony_ci	message->spi = spi;
404662306a36Sopenharmony_ci
404762306a36Sopenharmony_ci	SPI_STATISTICS_INCREMENT_FIELD(ctlr->pcpu_statistics, spi_async);
404862306a36Sopenharmony_ci	SPI_STATISTICS_INCREMENT_FIELD(spi->pcpu_statistics, spi_async);
404962306a36Sopenharmony_ci
405062306a36Sopenharmony_ci	trace_spi_message_submit(message);
405162306a36Sopenharmony_ci
405262306a36Sopenharmony_ci	if (!ctlr->ptp_sts_supported) {
405362306a36Sopenharmony_ci		list_for_each_entry(xfer, &message->transfers, transfer_list) {
405462306a36Sopenharmony_ci			xfer->ptp_sts_word_pre = 0;
405562306a36Sopenharmony_ci			ptp_read_system_prets(xfer->ptp_sts);
405662306a36Sopenharmony_ci		}
405762306a36Sopenharmony_ci	}
405862306a36Sopenharmony_ci
405962306a36Sopenharmony_ci	return ctlr->transfer(spi, message);
406062306a36Sopenharmony_ci}
406162306a36Sopenharmony_ci
406262306a36Sopenharmony_ci/**
406362306a36Sopenharmony_ci * spi_async - asynchronous SPI transfer
406462306a36Sopenharmony_ci * @spi: device with which data will be exchanged
406562306a36Sopenharmony_ci * @message: describes the data transfers, including completion callback
406662306a36Sopenharmony_ci * Context: any (IRQs may be blocked, etc)
406762306a36Sopenharmony_ci *
406862306a36Sopenharmony_ci * This call may be used in_irq and other contexts which can't sleep,
406962306a36Sopenharmony_ci * as well as from task contexts which can sleep.
407062306a36Sopenharmony_ci *
407162306a36Sopenharmony_ci * The completion callback is invoked in a context which can't sleep.
407262306a36Sopenharmony_ci * Before that invocation, the value of message->status is undefined.
407362306a36Sopenharmony_ci * When the callback is issued, message->status holds either zero (to
407462306a36Sopenharmony_ci * indicate complete success) or a negative error code.  After that
407562306a36Sopenharmony_ci * callback returns, the driver which issued the transfer request may
407662306a36Sopenharmony_ci * deallocate the associated memory; it's no longer in use by any SPI
407762306a36Sopenharmony_ci * core or controller driver code.
407862306a36Sopenharmony_ci *
407962306a36Sopenharmony_ci * Note that although all messages to a spi_device are handled in
408062306a36Sopenharmony_ci * FIFO order, messages may go to different devices in other orders.
408162306a36Sopenharmony_ci * Some device might be higher priority, or have various "hard" access
408262306a36Sopenharmony_ci * time requirements, for example.
408362306a36Sopenharmony_ci *
408462306a36Sopenharmony_ci * On detection of any fault during the transfer, processing of
408562306a36Sopenharmony_ci * the entire message is aborted, and the device is deselected.
408662306a36Sopenharmony_ci * Until returning from the associated message completion callback,
408762306a36Sopenharmony_ci * no other spi_message queued to that device will be processed.
408862306a36Sopenharmony_ci * (This rule applies equally to all the synchronous transfer calls,
408962306a36Sopenharmony_ci * which are wrappers around this core asynchronous primitive.)
409062306a36Sopenharmony_ci *
409162306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
409262306a36Sopenharmony_ci */
409362306a36Sopenharmony_ciint spi_async(struct spi_device *spi, struct spi_message *message)
409462306a36Sopenharmony_ci{
409562306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
409662306a36Sopenharmony_ci	int ret;
409762306a36Sopenharmony_ci	unsigned long flags;
409862306a36Sopenharmony_ci
409962306a36Sopenharmony_ci	ret = __spi_validate(spi, message);
410062306a36Sopenharmony_ci	if (ret != 0)
410162306a36Sopenharmony_ci		return ret;
410262306a36Sopenharmony_ci
410362306a36Sopenharmony_ci	spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags);
410462306a36Sopenharmony_ci
410562306a36Sopenharmony_ci	if (ctlr->bus_lock_flag)
410662306a36Sopenharmony_ci		ret = -EBUSY;
410762306a36Sopenharmony_ci	else
410862306a36Sopenharmony_ci		ret = __spi_async(spi, message);
410962306a36Sopenharmony_ci
411062306a36Sopenharmony_ci	spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);
411162306a36Sopenharmony_ci
411262306a36Sopenharmony_ci	return ret;
411362306a36Sopenharmony_ci}
411462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_async);
411562306a36Sopenharmony_ci
411662306a36Sopenharmony_ci/**
411762306a36Sopenharmony_ci * spi_async_locked - version of spi_async with exclusive bus usage
411862306a36Sopenharmony_ci * @spi: device with which data will be exchanged
411962306a36Sopenharmony_ci * @message: describes the data transfers, including completion callback
412062306a36Sopenharmony_ci * Context: any (IRQs may be blocked, etc)
412162306a36Sopenharmony_ci *
412262306a36Sopenharmony_ci * This call may be used in_irq and other contexts which can't sleep,
412362306a36Sopenharmony_ci * as well as from task contexts which can sleep.
412462306a36Sopenharmony_ci *
412562306a36Sopenharmony_ci * The completion callback is invoked in a context which can't sleep.
412662306a36Sopenharmony_ci * Before that invocation, the value of message->status is undefined.
412762306a36Sopenharmony_ci * When the callback is issued, message->status holds either zero (to
412862306a36Sopenharmony_ci * indicate complete success) or a negative error code.  After that
412962306a36Sopenharmony_ci * callback returns, the driver which issued the transfer request may
413062306a36Sopenharmony_ci * deallocate the associated memory; it's no longer in use by any SPI
413162306a36Sopenharmony_ci * core or controller driver code.
413262306a36Sopenharmony_ci *
413362306a36Sopenharmony_ci * Note that although all messages to a spi_device are handled in
413462306a36Sopenharmony_ci * FIFO order, messages may go to different devices in other orders.
413562306a36Sopenharmony_ci * Some device might be higher priority, or have various "hard" access
413662306a36Sopenharmony_ci * time requirements, for example.
413762306a36Sopenharmony_ci *
413862306a36Sopenharmony_ci * On detection of any fault during the transfer, processing of
413962306a36Sopenharmony_ci * the entire message is aborted, and the device is deselected.
414062306a36Sopenharmony_ci * Until returning from the associated message completion callback,
414162306a36Sopenharmony_ci * no other spi_message queued to that device will be processed.
414262306a36Sopenharmony_ci * (This rule applies equally to all the synchronous transfer calls,
414362306a36Sopenharmony_ci * which are wrappers around this core asynchronous primitive.)
414462306a36Sopenharmony_ci *
414562306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
414662306a36Sopenharmony_ci */
414762306a36Sopenharmony_cistatic int spi_async_locked(struct spi_device *spi, struct spi_message *message)
414862306a36Sopenharmony_ci{
414962306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
415062306a36Sopenharmony_ci	int ret;
415162306a36Sopenharmony_ci	unsigned long flags;
415262306a36Sopenharmony_ci
415362306a36Sopenharmony_ci	ret = __spi_validate(spi, message);
415462306a36Sopenharmony_ci	if (ret != 0)
415562306a36Sopenharmony_ci		return ret;
415662306a36Sopenharmony_ci
415762306a36Sopenharmony_ci	spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags);
415862306a36Sopenharmony_ci
415962306a36Sopenharmony_ci	ret = __spi_async(spi, message);
416062306a36Sopenharmony_ci
416162306a36Sopenharmony_ci	spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);
416262306a36Sopenharmony_ci
416362306a36Sopenharmony_ci	return ret;
416462306a36Sopenharmony_ci
416562306a36Sopenharmony_ci}
416662306a36Sopenharmony_ci
416762306a36Sopenharmony_cistatic void __spi_transfer_message_noqueue(struct spi_controller *ctlr, struct spi_message *msg)
416862306a36Sopenharmony_ci{
416962306a36Sopenharmony_ci	bool was_busy;
417062306a36Sopenharmony_ci	int ret;
417162306a36Sopenharmony_ci
417262306a36Sopenharmony_ci	mutex_lock(&ctlr->io_mutex);
417362306a36Sopenharmony_ci
417462306a36Sopenharmony_ci	was_busy = ctlr->busy;
417562306a36Sopenharmony_ci
417662306a36Sopenharmony_ci	ctlr->cur_msg = msg;
417762306a36Sopenharmony_ci	ret = __spi_pump_transfer_message(ctlr, msg, was_busy);
417862306a36Sopenharmony_ci	if (ret)
417962306a36Sopenharmony_ci		dev_err(&ctlr->dev, "noqueue transfer failed\n");
418062306a36Sopenharmony_ci	ctlr->cur_msg = NULL;
418162306a36Sopenharmony_ci	ctlr->fallback = false;
418262306a36Sopenharmony_ci
418362306a36Sopenharmony_ci	if (!was_busy) {
418462306a36Sopenharmony_ci		kfree(ctlr->dummy_rx);
418562306a36Sopenharmony_ci		ctlr->dummy_rx = NULL;
418662306a36Sopenharmony_ci		kfree(ctlr->dummy_tx);
418762306a36Sopenharmony_ci		ctlr->dummy_tx = NULL;
418862306a36Sopenharmony_ci		if (ctlr->unprepare_transfer_hardware &&
418962306a36Sopenharmony_ci		    ctlr->unprepare_transfer_hardware(ctlr))
419062306a36Sopenharmony_ci			dev_err(&ctlr->dev,
419162306a36Sopenharmony_ci				"failed to unprepare transfer hardware\n");
419262306a36Sopenharmony_ci		spi_idle_runtime_pm(ctlr);
419362306a36Sopenharmony_ci	}
419462306a36Sopenharmony_ci
419562306a36Sopenharmony_ci	mutex_unlock(&ctlr->io_mutex);
419662306a36Sopenharmony_ci}
419762306a36Sopenharmony_ci
419862306a36Sopenharmony_ci/*-------------------------------------------------------------------------*/
419962306a36Sopenharmony_ci
420062306a36Sopenharmony_ci/*
420162306a36Sopenharmony_ci * Utility methods for SPI protocol drivers, layered on
420262306a36Sopenharmony_ci * top of the core.  Some other utility methods are defined as
420362306a36Sopenharmony_ci * inline functions.
420462306a36Sopenharmony_ci */
420562306a36Sopenharmony_ci
420662306a36Sopenharmony_cistatic void spi_complete(void *arg)
420762306a36Sopenharmony_ci{
420862306a36Sopenharmony_ci	complete(arg);
420962306a36Sopenharmony_ci}
421062306a36Sopenharmony_ci
421162306a36Sopenharmony_cistatic int __spi_sync(struct spi_device *spi, struct spi_message *message)
421262306a36Sopenharmony_ci{
421362306a36Sopenharmony_ci	DECLARE_COMPLETION_ONSTACK(done);
421462306a36Sopenharmony_ci	int status;
421562306a36Sopenharmony_ci	struct spi_controller *ctlr = spi->controller;
421662306a36Sopenharmony_ci
421762306a36Sopenharmony_ci	if (__spi_check_suspended(ctlr)) {
421862306a36Sopenharmony_ci		dev_warn_once(&spi->dev, "Attempted to sync while suspend\n");
421962306a36Sopenharmony_ci		return -ESHUTDOWN;
422062306a36Sopenharmony_ci	}
422162306a36Sopenharmony_ci
422262306a36Sopenharmony_ci	status = __spi_validate(spi, message);
422362306a36Sopenharmony_ci	if (status != 0)
422462306a36Sopenharmony_ci		return status;
422562306a36Sopenharmony_ci
422662306a36Sopenharmony_ci	message->spi = spi;
422762306a36Sopenharmony_ci
422862306a36Sopenharmony_ci	SPI_STATISTICS_INCREMENT_FIELD(ctlr->pcpu_statistics, spi_sync);
422962306a36Sopenharmony_ci	SPI_STATISTICS_INCREMENT_FIELD(spi->pcpu_statistics, spi_sync);
423062306a36Sopenharmony_ci
423162306a36Sopenharmony_ci	/*
423262306a36Sopenharmony_ci	 * Checking queue_empty here only guarantees async/sync message
423362306a36Sopenharmony_ci	 * ordering when coming from the same context. It does not need to
423462306a36Sopenharmony_ci	 * guard against reentrancy from a different context. The io_mutex
423562306a36Sopenharmony_ci	 * will catch those cases.
423662306a36Sopenharmony_ci	 */
423762306a36Sopenharmony_ci	if (READ_ONCE(ctlr->queue_empty) && !ctlr->must_async) {
423862306a36Sopenharmony_ci		message->actual_length = 0;
423962306a36Sopenharmony_ci		message->status = -EINPROGRESS;
424062306a36Sopenharmony_ci
424162306a36Sopenharmony_ci		trace_spi_message_submit(message);
424262306a36Sopenharmony_ci
424362306a36Sopenharmony_ci		SPI_STATISTICS_INCREMENT_FIELD(ctlr->pcpu_statistics, spi_sync_immediate);
424462306a36Sopenharmony_ci		SPI_STATISTICS_INCREMENT_FIELD(spi->pcpu_statistics, spi_sync_immediate);
424562306a36Sopenharmony_ci
424662306a36Sopenharmony_ci		__spi_transfer_message_noqueue(ctlr, message);
424762306a36Sopenharmony_ci
424862306a36Sopenharmony_ci		return message->status;
424962306a36Sopenharmony_ci	}
425062306a36Sopenharmony_ci
425162306a36Sopenharmony_ci	/*
425262306a36Sopenharmony_ci	 * There are messages in the async queue that could have originated
425362306a36Sopenharmony_ci	 * from the same context, so we need to preserve ordering.
425462306a36Sopenharmony_ci	 * Therefor we send the message to the async queue and wait until they
425562306a36Sopenharmony_ci	 * are completed.
425662306a36Sopenharmony_ci	 */
425762306a36Sopenharmony_ci	message->complete = spi_complete;
425862306a36Sopenharmony_ci	message->context = &done;
425962306a36Sopenharmony_ci	status = spi_async_locked(spi, message);
426062306a36Sopenharmony_ci	if (status == 0) {
426162306a36Sopenharmony_ci		wait_for_completion(&done);
426262306a36Sopenharmony_ci		status = message->status;
426362306a36Sopenharmony_ci	}
426462306a36Sopenharmony_ci	message->context = NULL;
426562306a36Sopenharmony_ci
426662306a36Sopenharmony_ci	return status;
426762306a36Sopenharmony_ci}
426862306a36Sopenharmony_ci
426962306a36Sopenharmony_ci/**
427062306a36Sopenharmony_ci * spi_sync - blocking/synchronous SPI data transfers
427162306a36Sopenharmony_ci * @spi: device with which data will be exchanged
427262306a36Sopenharmony_ci * @message: describes the data transfers
427362306a36Sopenharmony_ci * Context: can sleep
427462306a36Sopenharmony_ci *
427562306a36Sopenharmony_ci * This call may only be used from a context that may sleep.  The sleep
427662306a36Sopenharmony_ci * is non-interruptible, and has no timeout.  Low-overhead controller
427762306a36Sopenharmony_ci * drivers may DMA directly into and out of the message buffers.
427862306a36Sopenharmony_ci *
427962306a36Sopenharmony_ci * Note that the SPI device's chip select is active during the message,
428062306a36Sopenharmony_ci * and then is normally disabled between messages.  Drivers for some
428162306a36Sopenharmony_ci * frequently-used devices may want to minimize costs of selecting a chip,
428262306a36Sopenharmony_ci * by leaving it selected in anticipation that the next message will go
428362306a36Sopenharmony_ci * to the same chip.  (That may increase power usage.)
428462306a36Sopenharmony_ci *
428562306a36Sopenharmony_ci * Also, the caller is guaranteeing that the memory associated with the
428662306a36Sopenharmony_ci * message will not be freed before this call returns.
428762306a36Sopenharmony_ci *
428862306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
428962306a36Sopenharmony_ci */
429062306a36Sopenharmony_ciint spi_sync(struct spi_device *spi, struct spi_message *message)
429162306a36Sopenharmony_ci{
429262306a36Sopenharmony_ci	int ret;
429362306a36Sopenharmony_ci
429462306a36Sopenharmony_ci	mutex_lock(&spi->controller->bus_lock_mutex);
429562306a36Sopenharmony_ci	ret = __spi_sync(spi, message);
429662306a36Sopenharmony_ci	mutex_unlock(&spi->controller->bus_lock_mutex);
429762306a36Sopenharmony_ci
429862306a36Sopenharmony_ci	return ret;
429962306a36Sopenharmony_ci}
430062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_sync);
430162306a36Sopenharmony_ci
430262306a36Sopenharmony_ci/**
430362306a36Sopenharmony_ci * spi_sync_locked - version of spi_sync with exclusive bus usage
430462306a36Sopenharmony_ci * @spi: device with which data will be exchanged
430562306a36Sopenharmony_ci * @message: describes the data transfers
430662306a36Sopenharmony_ci * Context: can sleep
430762306a36Sopenharmony_ci *
430862306a36Sopenharmony_ci * This call may only be used from a context that may sleep.  The sleep
430962306a36Sopenharmony_ci * is non-interruptible, and has no timeout.  Low-overhead controller
431062306a36Sopenharmony_ci * drivers may DMA directly into and out of the message buffers.
431162306a36Sopenharmony_ci *
431262306a36Sopenharmony_ci * This call should be used by drivers that require exclusive access to the
431362306a36Sopenharmony_ci * SPI bus. It has to be preceded by a spi_bus_lock call. The SPI bus must
431462306a36Sopenharmony_ci * be released by a spi_bus_unlock call when the exclusive access is over.
431562306a36Sopenharmony_ci *
431662306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
431762306a36Sopenharmony_ci */
431862306a36Sopenharmony_ciint spi_sync_locked(struct spi_device *spi, struct spi_message *message)
431962306a36Sopenharmony_ci{
432062306a36Sopenharmony_ci	return __spi_sync(spi, message);
432162306a36Sopenharmony_ci}
432262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_sync_locked);
432362306a36Sopenharmony_ci
432462306a36Sopenharmony_ci/**
432562306a36Sopenharmony_ci * spi_bus_lock - obtain a lock for exclusive SPI bus usage
432662306a36Sopenharmony_ci * @ctlr: SPI bus master that should be locked for exclusive bus access
432762306a36Sopenharmony_ci * Context: can sleep
432862306a36Sopenharmony_ci *
432962306a36Sopenharmony_ci * This call may only be used from a context that may sleep.  The sleep
433062306a36Sopenharmony_ci * is non-interruptible, and has no timeout.
433162306a36Sopenharmony_ci *
433262306a36Sopenharmony_ci * This call should be used by drivers that require exclusive access to the
433362306a36Sopenharmony_ci * SPI bus. The SPI bus must be released by a spi_bus_unlock call when the
433462306a36Sopenharmony_ci * exclusive access is over. Data transfer must be done by spi_sync_locked
433562306a36Sopenharmony_ci * and spi_async_locked calls when the SPI bus lock is held.
433662306a36Sopenharmony_ci *
433762306a36Sopenharmony_ci * Return: always zero.
433862306a36Sopenharmony_ci */
433962306a36Sopenharmony_ciint spi_bus_lock(struct spi_controller *ctlr)
434062306a36Sopenharmony_ci{
434162306a36Sopenharmony_ci	unsigned long flags;
434262306a36Sopenharmony_ci
434362306a36Sopenharmony_ci	mutex_lock(&ctlr->bus_lock_mutex);
434462306a36Sopenharmony_ci
434562306a36Sopenharmony_ci	spin_lock_irqsave(&ctlr->bus_lock_spinlock, flags);
434662306a36Sopenharmony_ci	ctlr->bus_lock_flag = 1;
434762306a36Sopenharmony_ci	spin_unlock_irqrestore(&ctlr->bus_lock_spinlock, flags);
434862306a36Sopenharmony_ci
434962306a36Sopenharmony_ci	/* Mutex remains locked until spi_bus_unlock() is called */
435062306a36Sopenharmony_ci
435162306a36Sopenharmony_ci	return 0;
435262306a36Sopenharmony_ci}
435362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_bus_lock);
435462306a36Sopenharmony_ci
435562306a36Sopenharmony_ci/**
435662306a36Sopenharmony_ci * spi_bus_unlock - release the lock for exclusive SPI bus usage
435762306a36Sopenharmony_ci * @ctlr: SPI bus master that was locked for exclusive bus access
435862306a36Sopenharmony_ci * Context: can sleep
435962306a36Sopenharmony_ci *
436062306a36Sopenharmony_ci * This call may only be used from a context that may sleep.  The sleep
436162306a36Sopenharmony_ci * is non-interruptible, and has no timeout.
436262306a36Sopenharmony_ci *
436362306a36Sopenharmony_ci * This call releases an SPI bus lock previously obtained by an spi_bus_lock
436462306a36Sopenharmony_ci * call.
436562306a36Sopenharmony_ci *
436662306a36Sopenharmony_ci * Return: always zero.
436762306a36Sopenharmony_ci */
436862306a36Sopenharmony_ciint spi_bus_unlock(struct spi_controller *ctlr)
436962306a36Sopenharmony_ci{
437062306a36Sopenharmony_ci	ctlr->bus_lock_flag = 0;
437162306a36Sopenharmony_ci
437262306a36Sopenharmony_ci	mutex_unlock(&ctlr->bus_lock_mutex);
437362306a36Sopenharmony_ci
437462306a36Sopenharmony_ci	return 0;
437562306a36Sopenharmony_ci}
437662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_bus_unlock);
437762306a36Sopenharmony_ci
437862306a36Sopenharmony_ci/* Portable code must never pass more than 32 bytes */
437962306a36Sopenharmony_ci#define	SPI_BUFSIZ	max(32, SMP_CACHE_BYTES)
438062306a36Sopenharmony_ci
438162306a36Sopenharmony_cistatic u8	*buf;
438262306a36Sopenharmony_ci
438362306a36Sopenharmony_ci/**
438462306a36Sopenharmony_ci * spi_write_then_read - SPI synchronous write followed by read
438562306a36Sopenharmony_ci * @spi: device with which data will be exchanged
438662306a36Sopenharmony_ci * @txbuf: data to be written (need not be DMA-safe)
438762306a36Sopenharmony_ci * @n_tx: size of txbuf, in bytes
438862306a36Sopenharmony_ci * @rxbuf: buffer into which data will be read (need not be DMA-safe)
438962306a36Sopenharmony_ci * @n_rx: size of rxbuf, in bytes
439062306a36Sopenharmony_ci * Context: can sleep
439162306a36Sopenharmony_ci *
439262306a36Sopenharmony_ci * This performs a half duplex MicroWire style transaction with the
439362306a36Sopenharmony_ci * device, sending txbuf and then reading rxbuf.  The return value
439462306a36Sopenharmony_ci * is zero for success, else a negative errno status code.
439562306a36Sopenharmony_ci * This call may only be used from a context that may sleep.
439662306a36Sopenharmony_ci *
439762306a36Sopenharmony_ci * Parameters to this routine are always copied using a small buffer.
439862306a36Sopenharmony_ci * Performance-sensitive or bulk transfer code should instead use
439962306a36Sopenharmony_ci * spi_{async,sync}() calls with DMA-safe buffers.
440062306a36Sopenharmony_ci *
440162306a36Sopenharmony_ci * Return: zero on success, else a negative error code.
440262306a36Sopenharmony_ci */
440362306a36Sopenharmony_ciint spi_write_then_read(struct spi_device *spi,
440462306a36Sopenharmony_ci		const void *txbuf, unsigned n_tx,
440562306a36Sopenharmony_ci		void *rxbuf, unsigned n_rx)
440662306a36Sopenharmony_ci{
440762306a36Sopenharmony_ci	static DEFINE_MUTEX(lock);
440862306a36Sopenharmony_ci
440962306a36Sopenharmony_ci	int			status;
441062306a36Sopenharmony_ci	struct spi_message	message;
441162306a36Sopenharmony_ci	struct spi_transfer	x[2];
441262306a36Sopenharmony_ci	u8			*local_buf;
441362306a36Sopenharmony_ci
441462306a36Sopenharmony_ci	/*
441562306a36Sopenharmony_ci	 * Use preallocated DMA-safe buffer if we can. We can't avoid
441662306a36Sopenharmony_ci	 * copying here, (as a pure convenience thing), but we can
441762306a36Sopenharmony_ci	 * keep heap costs out of the hot path unless someone else is
441862306a36Sopenharmony_ci	 * using the pre-allocated buffer or the transfer is too large.
441962306a36Sopenharmony_ci	 */
442062306a36Sopenharmony_ci	if ((n_tx + n_rx) > SPI_BUFSIZ || !mutex_trylock(&lock)) {
442162306a36Sopenharmony_ci		local_buf = kmalloc(max((unsigned)SPI_BUFSIZ, n_tx + n_rx),
442262306a36Sopenharmony_ci				    GFP_KERNEL | GFP_DMA);
442362306a36Sopenharmony_ci		if (!local_buf)
442462306a36Sopenharmony_ci			return -ENOMEM;
442562306a36Sopenharmony_ci	} else {
442662306a36Sopenharmony_ci		local_buf = buf;
442762306a36Sopenharmony_ci	}
442862306a36Sopenharmony_ci
442962306a36Sopenharmony_ci	spi_message_init(&message);
443062306a36Sopenharmony_ci	memset(x, 0, sizeof(x));
443162306a36Sopenharmony_ci	if (n_tx) {
443262306a36Sopenharmony_ci		x[0].len = n_tx;
443362306a36Sopenharmony_ci		spi_message_add_tail(&x[0], &message);
443462306a36Sopenharmony_ci	}
443562306a36Sopenharmony_ci	if (n_rx) {
443662306a36Sopenharmony_ci		x[1].len = n_rx;
443762306a36Sopenharmony_ci		spi_message_add_tail(&x[1], &message);
443862306a36Sopenharmony_ci	}
443962306a36Sopenharmony_ci
444062306a36Sopenharmony_ci	memcpy(local_buf, txbuf, n_tx);
444162306a36Sopenharmony_ci	x[0].tx_buf = local_buf;
444262306a36Sopenharmony_ci	x[1].rx_buf = local_buf + n_tx;
444362306a36Sopenharmony_ci
444462306a36Sopenharmony_ci	/* Do the I/O */
444562306a36Sopenharmony_ci	status = spi_sync(spi, &message);
444662306a36Sopenharmony_ci	if (status == 0)
444762306a36Sopenharmony_ci		memcpy(rxbuf, x[1].rx_buf, n_rx);
444862306a36Sopenharmony_ci
444962306a36Sopenharmony_ci	if (x[0].tx_buf == buf)
445062306a36Sopenharmony_ci		mutex_unlock(&lock);
445162306a36Sopenharmony_ci	else
445262306a36Sopenharmony_ci		kfree(local_buf);
445362306a36Sopenharmony_ci
445462306a36Sopenharmony_ci	return status;
445562306a36Sopenharmony_ci}
445662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_write_then_read);
445762306a36Sopenharmony_ci
445862306a36Sopenharmony_ci/*-------------------------------------------------------------------------*/
445962306a36Sopenharmony_ci
446062306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_OF_DYNAMIC)
446162306a36Sopenharmony_ci/* Must call put_device() when done with returned spi_device device */
446262306a36Sopenharmony_cistatic struct spi_device *of_find_spi_device_by_node(struct device_node *node)
446362306a36Sopenharmony_ci{
446462306a36Sopenharmony_ci	struct device *dev = bus_find_device_by_of_node(&spi_bus_type, node);
446562306a36Sopenharmony_ci
446662306a36Sopenharmony_ci	return dev ? to_spi_device(dev) : NULL;
446762306a36Sopenharmony_ci}
446862306a36Sopenharmony_ci
446962306a36Sopenharmony_ci/* The spi controllers are not using spi_bus, so we find it with another way */
447062306a36Sopenharmony_cistatic struct spi_controller *of_find_spi_controller_by_node(struct device_node *node)
447162306a36Sopenharmony_ci{
447262306a36Sopenharmony_ci	struct device *dev;
447362306a36Sopenharmony_ci
447462306a36Sopenharmony_ci	dev = class_find_device_by_of_node(&spi_master_class, node);
447562306a36Sopenharmony_ci	if (!dev && IS_ENABLED(CONFIG_SPI_SLAVE))
447662306a36Sopenharmony_ci		dev = class_find_device_by_of_node(&spi_slave_class, node);
447762306a36Sopenharmony_ci	if (!dev)
447862306a36Sopenharmony_ci		return NULL;
447962306a36Sopenharmony_ci
448062306a36Sopenharmony_ci	/* Reference got in class_find_device */
448162306a36Sopenharmony_ci	return container_of(dev, struct spi_controller, dev);
448262306a36Sopenharmony_ci}
448362306a36Sopenharmony_ci
448462306a36Sopenharmony_cistatic int of_spi_notify(struct notifier_block *nb, unsigned long action,
448562306a36Sopenharmony_ci			 void *arg)
448662306a36Sopenharmony_ci{
448762306a36Sopenharmony_ci	struct of_reconfig_data *rd = arg;
448862306a36Sopenharmony_ci	struct spi_controller *ctlr;
448962306a36Sopenharmony_ci	struct spi_device *spi;
449062306a36Sopenharmony_ci
449162306a36Sopenharmony_ci	switch (of_reconfig_get_state_change(action, arg)) {
449262306a36Sopenharmony_ci	case OF_RECONFIG_CHANGE_ADD:
449362306a36Sopenharmony_ci		ctlr = of_find_spi_controller_by_node(rd->dn->parent);
449462306a36Sopenharmony_ci		if (ctlr == NULL)
449562306a36Sopenharmony_ci			return NOTIFY_OK;	/* Not for us */
449662306a36Sopenharmony_ci
449762306a36Sopenharmony_ci		if (of_node_test_and_set_flag(rd->dn, OF_POPULATED)) {
449862306a36Sopenharmony_ci			put_device(&ctlr->dev);
449962306a36Sopenharmony_ci			return NOTIFY_OK;
450062306a36Sopenharmony_ci		}
450162306a36Sopenharmony_ci
450262306a36Sopenharmony_ci		/*
450362306a36Sopenharmony_ci		 * Clear the flag before adding the device so that fw_devlink
450462306a36Sopenharmony_ci		 * doesn't skip adding consumers to this device.
450562306a36Sopenharmony_ci		 */
450662306a36Sopenharmony_ci		rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE;
450762306a36Sopenharmony_ci		spi = of_register_spi_device(ctlr, rd->dn);
450862306a36Sopenharmony_ci		put_device(&ctlr->dev);
450962306a36Sopenharmony_ci
451062306a36Sopenharmony_ci		if (IS_ERR(spi)) {
451162306a36Sopenharmony_ci			pr_err("%s: failed to create for '%pOF'\n",
451262306a36Sopenharmony_ci					__func__, rd->dn);
451362306a36Sopenharmony_ci			of_node_clear_flag(rd->dn, OF_POPULATED);
451462306a36Sopenharmony_ci			return notifier_from_errno(PTR_ERR(spi));
451562306a36Sopenharmony_ci		}
451662306a36Sopenharmony_ci		break;
451762306a36Sopenharmony_ci
451862306a36Sopenharmony_ci	case OF_RECONFIG_CHANGE_REMOVE:
451962306a36Sopenharmony_ci		/* Already depopulated? */
452062306a36Sopenharmony_ci		if (!of_node_check_flag(rd->dn, OF_POPULATED))
452162306a36Sopenharmony_ci			return NOTIFY_OK;
452262306a36Sopenharmony_ci
452362306a36Sopenharmony_ci		/* Find our device by node */
452462306a36Sopenharmony_ci		spi = of_find_spi_device_by_node(rd->dn);
452562306a36Sopenharmony_ci		if (spi == NULL)
452662306a36Sopenharmony_ci			return NOTIFY_OK;	/* No? not meant for us */
452762306a36Sopenharmony_ci
452862306a36Sopenharmony_ci		/* Unregister takes one ref away */
452962306a36Sopenharmony_ci		spi_unregister_device(spi);
453062306a36Sopenharmony_ci
453162306a36Sopenharmony_ci		/* And put the reference of the find */
453262306a36Sopenharmony_ci		put_device(&spi->dev);
453362306a36Sopenharmony_ci		break;
453462306a36Sopenharmony_ci	}
453562306a36Sopenharmony_ci
453662306a36Sopenharmony_ci	return NOTIFY_OK;
453762306a36Sopenharmony_ci}
453862306a36Sopenharmony_ci
453962306a36Sopenharmony_cistatic struct notifier_block spi_of_notifier = {
454062306a36Sopenharmony_ci	.notifier_call = of_spi_notify,
454162306a36Sopenharmony_ci};
454262306a36Sopenharmony_ci#else /* IS_ENABLED(CONFIG_OF_DYNAMIC) */
454362306a36Sopenharmony_ciextern struct notifier_block spi_of_notifier;
454462306a36Sopenharmony_ci#endif /* IS_ENABLED(CONFIG_OF_DYNAMIC) */
454562306a36Sopenharmony_ci
454662306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_ACPI)
454762306a36Sopenharmony_cistatic int spi_acpi_controller_match(struct device *dev, const void *data)
454862306a36Sopenharmony_ci{
454962306a36Sopenharmony_ci	return ACPI_COMPANION(dev->parent) == data;
455062306a36Sopenharmony_ci}
455162306a36Sopenharmony_ci
455262306a36Sopenharmony_cistatic struct spi_controller *acpi_spi_find_controller_by_adev(struct acpi_device *adev)
455362306a36Sopenharmony_ci{
455462306a36Sopenharmony_ci	struct device *dev;
455562306a36Sopenharmony_ci
455662306a36Sopenharmony_ci	dev = class_find_device(&spi_master_class, NULL, adev,
455762306a36Sopenharmony_ci				spi_acpi_controller_match);
455862306a36Sopenharmony_ci	if (!dev && IS_ENABLED(CONFIG_SPI_SLAVE))
455962306a36Sopenharmony_ci		dev = class_find_device(&spi_slave_class, NULL, adev,
456062306a36Sopenharmony_ci					spi_acpi_controller_match);
456162306a36Sopenharmony_ci	if (!dev)
456262306a36Sopenharmony_ci		return NULL;
456362306a36Sopenharmony_ci
456462306a36Sopenharmony_ci	return container_of(dev, struct spi_controller, dev);
456562306a36Sopenharmony_ci}
456662306a36Sopenharmony_ci
456762306a36Sopenharmony_cistatic struct spi_device *acpi_spi_find_device_by_adev(struct acpi_device *adev)
456862306a36Sopenharmony_ci{
456962306a36Sopenharmony_ci	struct device *dev;
457062306a36Sopenharmony_ci
457162306a36Sopenharmony_ci	dev = bus_find_device_by_acpi_dev(&spi_bus_type, adev);
457262306a36Sopenharmony_ci	return to_spi_device(dev);
457362306a36Sopenharmony_ci}
457462306a36Sopenharmony_ci
457562306a36Sopenharmony_cistatic int acpi_spi_notify(struct notifier_block *nb, unsigned long value,
457662306a36Sopenharmony_ci			   void *arg)
457762306a36Sopenharmony_ci{
457862306a36Sopenharmony_ci	struct acpi_device *adev = arg;
457962306a36Sopenharmony_ci	struct spi_controller *ctlr;
458062306a36Sopenharmony_ci	struct spi_device *spi;
458162306a36Sopenharmony_ci
458262306a36Sopenharmony_ci	switch (value) {
458362306a36Sopenharmony_ci	case ACPI_RECONFIG_DEVICE_ADD:
458462306a36Sopenharmony_ci		ctlr = acpi_spi_find_controller_by_adev(acpi_dev_parent(adev));
458562306a36Sopenharmony_ci		if (!ctlr)
458662306a36Sopenharmony_ci			break;
458762306a36Sopenharmony_ci
458862306a36Sopenharmony_ci		acpi_register_spi_device(ctlr, adev);
458962306a36Sopenharmony_ci		put_device(&ctlr->dev);
459062306a36Sopenharmony_ci		break;
459162306a36Sopenharmony_ci	case ACPI_RECONFIG_DEVICE_REMOVE:
459262306a36Sopenharmony_ci		if (!acpi_device_enumerated(adev))
459362306a36Sopenharmony_ci			break;
459462306a36Sopenharmony_ci
459562306a36Sopenharmony_ci		spi = acpi_spi_find_device_by_adev(adev);
459662306a36Sopenharmony_ci		if (!spi)
459762306a36Sopenharmony_ci			break;
459862306a36Sopenharmony_ci
459962306a36Sopenharmony_ci		spi_unregister_device(spi);
460062306a36Sopenharmony_ci		put_device(&spi->dev);
460162306a36Sopenharmony_ci		break;
460262306a36Sopenharmony_ci	}
460362306a36Sopenharmony_ci
460462306a36Sopenharmony_ci	return NOTIFY_OK;
460562306a36Sopenharmony_ci}
460662306a36Sopenharmony_ci
460762306a36Sopenharmony_cistatic struct notifier_block spi_acpi_notifier = {
460862306a36Sopenharmony_ci	.notifier_call = acpi_spi_notify,
460962306a36Sopenharmony_ci};
461062306a36Sopenharmony_ci#else
461162306a36Sopenharmony_ciextern struct notifier_block spi_acpi_notifier;
461262306a36Sopenharmony_ci#endif
461362306a36Sopenharmony_ci
461462306a36Sopenharmony_cistatic int __init spi_init(void)
461562306a36Sopenharmony_ci{
461662306a36Sopenharmony_ci	int	status;
461762306a36Sopenharmony_ci
461862306a36Sopenharmony_ci	buf = kmalloc(SPI_BUFSIZ, GFP_KERNEL);
461962306a36Sopenharmony_ci	if (!buf) {
462062306a36Sopenharmony_ci		status = -ENOMEM;
462162306a36Sopenharmony_ci		goto err0;
462262306a36Sopenharmony_ci	}
462362306a36Sopenharmony_ci
462462306a36Sopenharmony_ci	status = bus_register(&spi_bus_type);
462562306a36Sopenharmony_ci	if (status < 0)
462662306a36Sopenharmony_ci		goto err1;
462762306a36Sopenharmony_ci
462862306a36Sopenharmony_ci	status = class_register(&spi_master_class);
462962306a36Sopenharmony_ci	if (status < 0)
463062306a36Sopenharmony_ci		goto err2;
463162306a36Sopenharmony_ci
463262306a36Sopenharmony_ci	if (IS_ENABLED(CONFIG_SPI_SLAVE)) {
463362306a36Sopenharmony_ci		status = class_register(&spi_slave_class);
463462306a36Sopenharmony_ci		if (status < 0)
463562306a36Sopenharmony_ci			goto err3;
463662306a36Sopenharmony_ci	}
463762306a36Sopenharmony_ci
463862306a36Sopenharmony_ci	if (IS_ENABLED(CONFIG_OF_DYNAMIC))
463962306a36Sopenharmony_ci		WARN_ON(of_reconfig_notifier_register(&spi_of_notifier));
464062306a36Sopenharmony_ci	if (IS_ENABLED(CONFIG_ACPI))
464162306a36Sopenharmony_ci		WARN_ON(acpi_reconfig_notifier_register(&spi_acpi_notifier));
464262306a36Sopenharmony_ci
464362306a36Sopenharmony_ci	return 0;
464462306a36Sopenharmony_ci
464562306a36Sopenharmony_cierr3:
464662306a36Sopenharmony_ci	class_unregister(&spi_master_class);
464762306a36Sopenharmony_cierr2:
464862306a36Sopenharmony_ci	bus_unregister(&spi_bus_type);
464962306a36Sopenharmony_cierr1:
465062306a36Sopenharmony_ci	kfree(buf);
465162306a36Sopenharmony_ci	buf = NULL;
465262306a36Sopenharmony_cierr0:
465362306a36Sopenharmony_ci	return status;
465462306a36Sopenharmony_ci}
465562306a36Sopenharmony_ci
465662306a36Sopenharmony_ci/*
465762306a36Sopenharmony_ci * A board_info is normally registered in arch_initcall(),
465862306a36Sopenharmony_ci * but even essential drivers wait till later.
465962306a36Sopenharmony_ci *
466062306a36Sopenharmony_ci * REVISIT only boardinfo really needs static linking. The rest (device and
466162306a36Sopenharmony_ci * driver registration) _could_ be dynamically linked (modular) ... Costs
466262306a36Sopenharmony_ci * include needing to have boardinfo data structures be much more public.
466362306a36Sopenharmony_ci */
466462306a36Sopenharmony_cipostcore_initcall(spi_init);
4665