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
151 spi = to_spi_device(dev); in ocelot_spi_regmap_bus_read()
157 if (ddata->spi_padding_bytes) { in ocelot_spi_regmap_bus_read()
158 xfers[index].len = ddata->spi_padding_bytes; in ocelot_spi_regmap_bus_read()
159 xfers[index].tx_buf = ddata->dummy_buf; in ocelot_spi_regmap_bus_read()
168 return spi_sync_transfer(spi, xfers, index); in ocelot_spi_regmap_bus_read()
174 struct spi_device *spi = to_spi_device(dev); in ocelot_spi_regmap_bus_write() local
176 return spi_write(spi, data, count); in ocelot_spi_regmap_bus_write()
190 regmap_config.name = res->name; in ocelot_spi_init_regmap()
191 regmap_config.max_register = resource_size(res) - 1; in ocelot_spi_init_regmap()
192 regmap_config.reg_base = res->start; in ocelot_spi_init_regmap()
198 static int ocelot_spi_probe(struct spi_device *spi) in ocelot_spi_probe() argument
200 struct device *dev = &spi->dev; in ocelot_spi_probe()
207 return -ENOMEM; in ocelot_spi_probe()
209 spi_set_drvdata(spi, ddata); in ocelot_spi_probe()
211 if (spi->max_speed_hz <= 500000) { in ocelot_spi_probe()
212 ddata->spi_padding_bytes = 0; in ocelot_spi_probe()
220 ddata->spi_padding_bytes = 1 + (spi->max_speed_hz / HZ_PER_MHZ + 2) / 8; in ocelot_spi_probe()
222 ddata->dummy_buf = devm_kzalloc(dev, ddata->spi_padding_bytes, GFP_KERNEL); in ocelot_spi_probe()
223 if (!ddata->dummy_buf) in ocelot_spi_probe()
224 return -ENOMEM; in ocelot_spi_probe()
227 spi->bits_per_word = 8; in ocelot_spi_probe()
229 err = spi_setup(spi); in ocelot_spi_probe()
231 return dev_err_probe(&spi->dev, err, "Error performing SPI setup\n"); in ocelot_spi_probe()
237 ddata->cpuorg_regmap = r; in ocelot_spi_probe()
243 ddata->gcb_regmap = r; in ocelot_spi_probe()
246 * The chip must be set up for SPI before it gets initialized and reset. in ocelot_spi_probe()
252 return dev_err_probe(dev, err, "Error initializing SPI bus\n"); in ocelot_spi_probe()
259 * A chip reset will clear the SPI configuration, so it needs to be done in ocelot_spi_probe()
264 return dev_err_probe(dev, err, "Error initializing SPI bus after reset\n"); in ocelot_spi_probe()
277 MODULE_DEVICE_TABLE(spi, ocelot_spi_ids);
287 .name = "ocelot-soc",
295 MODULE_DESCRIPTION("SPI Controlled Ocelot Chip Driver");
296 MODULE_AUTHOR("Colin Foster <colin.foster@in-advantage.com>");