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