Lines Matching +full:spi +full:- +full:lsb +full:- +full:first

1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
3 * SPI core driver for the Ocelot chip family.
6 * SPI to the VSC7511, VSC7512, VSC7513 and VSC7514 chips. The main functions
7 * are to prepare the chip's SPI interface for a specific bus speed, and a host
11 * Copyright 2021-2022 Innovative Advantage Inc.
13 * Author: Colin Foster <colin.foster@in-advantage.com>
24 #include <linux/spi/spi.h>
63 * The SPI address must be big-endian, but we want the payload to match in ocelot_spi_initialize()
68 * 0b00: little-endian, MSB first in ocelot_spi_initialize()
72 * 0b01: big-endian, MSB first in ocelot_spi_initialize()
76 * 0b10: little-endian, LSB first in ocelot_spi_initialize()
80 * 0b11: big-endian, LSB first in ocelot_spi_initialize()
84 err = regmap_write(ddata->cpuorg_regmap, REG_DEV_CPUORG_IF_CTRL, val); in ocelot_spi_initialize()
91 * first payload bit is shifted out too quickly, the read will fail. in ocelot_spi_initialize()
93 val = ddata->spi_padding_bytes; in ocelot_spi_initialize()
94 err = regmap_write(ddata->cpuorg_regmap, REG_DEV_CPUORG_IF_CFGSTAT, val); in ocelot_spi_initialize()
100 * will verify several different things. The first is that the number of in ocelot_spi_initialize()
107 * the SPI bus frequency. in ocelot_spi_initialize()
115 err = regmap_read(ddata->cpuorg_regmap, REG_DEV_CPUORG_IF_CFGSTAT, &val); in ocelot_spi_initialize()
120 return -ENODEV; in ocelot_spi_initialize()
147 struct spi_device *spi; in ocelot_spi_regmap_bus_read() local
152 spi = to_spi_device(dev); in ocelot_spi_regmap_bus_read()
158 if (ddata->spi_padding_bytes) { in ocelot_spi_regmap_bus_read()
159 xfers[index].len = ddata->spi_padding_bytes; in ocelot_spi_regmap_bus_read()
160 xfers[index].tx_buf = ddata->dummy_buf; in ocelot_spi_regmap_bus_read()
171 return spi_sync(spi, &msg); in ocelot_spi_regmap_bus_read()
177 struct spi_device *spi = to_spi_device(dev); in ocelot_spi_regmap_bus_write() local
179 return spi_write(spi, data, count); in ocelot_spi_regmap_bus_write()
193 regmap_config.name = res->name; in ocelot_spi_init_regmap()
194 regmap_config.max_register = resource_size(res) - 1; in ocelot_spi_init_regmap()
195 regmap_config.reg_base = res->start; in ocelot_spi_init_regmap()
201 static int ocelot_spi_probe(struct spi_device *spi) in ocelot_spi_probe() argument
203 struct device *dev = &spi->dev; in ocelot_spi_probe()
210 return -ENOMEM; in ocelot_spi_probe()
212 spi_set_drvdata(spi, ddata); in ocelot_spi_probe()
214 if (spi->max_speed_hz <= 500000) { in ocelot_spi_probe()
215 ddata->spi_padding_bytes = 0; in ocelot_spi_probe()
223 ddata->spi_padding_bytes = 1 + (spi->max_speed_hz / HZ_PER_MHZ + 2) / 8; in ocelot_spi_probe()
225 ddata->dummy_buf = devm_kzalloc(dev, ddata->spi_padding_bytes, GFP_KERNEL); in ocelot_spi_probe()
226 if (!ddata->dummy_buf) in ocelot_spi_probe()
227 return -ENOMEM; in ocelot_spi_probe()
230 spi->bits_per_word = 8; in ocelot_spi_probe()
232 err = spi_setup(spi); in ocelot_spi_probe()
234 return dev_err_probe(&spi->dev, err, "Error performing SPI setup\n"); in ocelot_spi_probe()
240 ddata->cpuorg_regmap = r; in ocelot_spi_probe()
246 ddata->gcb_regmap = r; in ocelot_spi_probe()
249 * The chip must be set up for SPI before it gets initialized and reset. in ocelot_spi_probe()
255 return dev_err_probe(dev, err, "Error initializing SPI bus\n"); in ocelot_spi_probe()
262 * A chip reset will clear the SPI configuration, so it needs to be done in ocelot_spi_probe()
267 return dev_err_probe(dev, err, "Error initializing SPI bus after reset\n"); in ocelot_spi_probe()
280 MODULE_DEVICE_TABLE(spi, ocelot_spi_ids);
290 .name = "ocelot-soc",
298 MODULE_DESCRIPTION("SPI Controlled Ocelot Chip Driver");
299 MODULE_AUTHOR("Colin Foster <colin.foster@in-advantage.com>");