/* * Copyright (c) 2011 The Chromium OS Authors. * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include int spi_set_wordlen(struct spi_slave *slave, unsigned int wordlen) { if (wordlen == 0 || wordlen > 32) { printf("spi: invalid wordlen %d\n", wordlen); return -1; } slave->wordlen = wordlen; return 0; } void *spi_do_alloc_slave(int offset, int size, unsigned int bus, unsigned int cs) { struct spi_slave *slave; void *ptr; ptr = malloc(size); if (ptr) { memset(ptr, '\0', size); slave = (struct spi_slave *)(ptr + offset); slave->bus = bus; slave->cs = cs; slave->wordlen = SPI_DEFAULT_WORDLEN; } return ptr; } #ifdef CONFIG_OF_SPI struct spi_slave *spi_base_setup_slave_fdt(const void *blob, int busnum, int node) { int cs, max_hz, mode = 0; cs = fdtdec_get_int(blob, node, "reg", -1); max_hz = fdtdec_get_int(blob, node, "spi-max-frequency", 100000); if (fdtdec_get_bool(blob, node, "spi-cpol")) mode |= SPI_CPOL; if (fdtdec_get_bool(blob, node, "spi-cpha")) mode |= SPI_CPHA; if (fdtdec_get_bool(blob, node, "spi-cs-high")) mode |= SPI_CS_HIGH; if (fdtdec_get_bool(blob, node, "spi-half-duplex")) mode |= SPI_PREAMBLE; return spi_setup_slave(busnum, cs, max_hz, mode); } #endif