1 /* 2 * Copyright (c) 2011 The Chromium OS Authors. 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <fdtdec.h> 9 #include <malloc.h> 10 #include <spi.h> 11 12 int spi_set_wordlen(struct spi_slave *slave, unsigned int wordlen) 13 { 14 if (wordlen == 0 || wordlen > 32) { 15 printf("spi: invalid wordlen %d\n", wordlen); 16 return -1; 17 } 18 19 slave->wordlen = wordlen; 20 21 return 0; 22 } 23 24 void *spi_do_alloc_slave(int offset, int size, unsigned int bus, 25 unsigned int cs) 26 { 27 struct spi_slave *slave; 28 void *ptr; 29 30 ptr = malloc(size); 31 if (ptr) { 32 memset(ptr, '\0', size); 33 slave = (struct spi_slave *)(ptr + offset); 34 slave->bus = bus; 35 slave->cs = cs; 36 slave->wordlen = SPI_DEFAULT_WORDLEN; 37 } 38 39 return ptr; 40 } 41 42 #ifdef CONFIG_OF_SPI 43 struct spi_slave *spi_base_setup_slave_fdt(const void *blob, int busnum, 44 int node) 45 { 46 int cs, max_hz, mode = 0; 47 48 cs = fdtdec_get_int(blob, node, "reg", -1); 49 max_hz = fdtdec_get_int(blob, node, "spi-max-frequency", 100000); 50 if (fdtdec_get_bool(blob, node, "spi-cpol")) 51 mode |= SPI_CPOL; 52 if (fdtdec_get_bool(blob, node, "spi-cpha")) 53 mode |= SPI_CPHA; 54 if (fdtdec_get_bool(blob, node, "spi-cs-high")) 55 mode |= SPI_CS_HIGH; 56 if (fdtdec_get_bool(blob, node, "spi-half-duplex")) 57 mode |= SPI_PREAMBLE; 58 return spi_setup_slave(busnum, cs, max_hz, mode); 59 } 60 #endif 61