• Home
  • Raw
  • Download

Lines Matching +full:spi +full:- +full:base

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * OMAP7xx SPI 100k controller driver
24 #include <linux/spi/spi.h>
52 #define SPI_CTRL_WORD_SIZE(x) (((x) - 1) << 2)
71 /* Virtual base address of the controller */
72 void __iomem *base; member
76 void __iomem *base; member
85 /* enable SPI */ in spi100k_enable_clock()
86 val = readw(spi100k->base + SPI_SETUP1); in spi100k_enable_clock()
88 writew(val, spi100k->base + SPI_SETUP1); in spi100k_enable_clock()
96 /* disable SPI */ in spi100k_disable_clock()
97 val = readw(spi100k->base + SPI_SETUP1); in spi100k_disable_clock()
99 writew(val, spi100k->base + SPI_SETUP1); in spi100k_disable_clock()
106 /* write 16-bit word, shifting 8-bit data if necessary */ in spi100k_write_data()
113 writew(data , spi100k->base + SPI_TX_MSB); in spi100k_write_data()
118 spi100k->base + SPI_CTRL); in spi100k_write_data()
121 while ((readw(spi100k->base + SPI_STATUS) & SPI_STATUS_WE) != SPI_STATUS_WE) in spi100k_write_data()
141 spi100k->base + SPI_CTRL); in spi100k_read_data()
143 while ((readw(spi100k->base + SPI_STATUS) & SPI_STATUS_RD) != SPI_STATUS_RD) in spi100k_read_data()
147 dataL = readw(spi100k->base + SPI_RX_LSB); in spi100k_read_data()
148 readw(spi100k->base + SPI_RX_MSB); in spi100k_read_data()
156 /* get control of SPI */ in spi100k_open()
161 SPI_SETUP1_CLOCK_DIVISOR(0), spi100k->base + SPI_SETUP1); in spi100k_open()
166 SPI_SETUP2_LEVEL_TRIGGER, spi100k->base + SPI_SETUP2); in spi100k_open()
172 writew(0x05fc, spi100k->base + SPI_CTRL); in omap1_spi100k_force_cs()
174 writew(0x05fd, spi100k->base + SPI_CTRL); in omap1_spi100k_force_cs()
178 omap1_spi100k_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) in omap1_spi100k_txrx_pio() argument
180 struct omap1_spi100k_cs *cs = spi->controller_state; in omap1_spi100k_txrx_pio()
184 count = xfer->len; in omap1_spi100k_txrx_pio()
186 word_len = cs->word_len; in omap1_spi100k_txrx_pio()
192 rx = xfer->rx_buf; in omap1_spi100k_txrx_pio()
193 tx = xfer->tx_buf; in omap1_spi100k_txrx_pio()
195 c -= 1; in omap1_spi100k_txrx_pio()
196 if (xfer->tx_buf != NULL) in omap1_spi100k_txrx_pio()
197 spi100k_write_data(spi->master, word_len, *tx++); in omap1_spi100k_txrx_pio()
198 if (xfer->rx_buf != NULL) in omap1_spi100k_txrx_pio()
199 *rx++ = spi100k_read_data(spi->master, word_len); in omap1_spi100k_txrx_pio()
205 rx = xfer->rx_buf; in omap1_spi100k_txrx_pio()
206 tx = xfer->tx_buf; in omap1_spi100k_txrx_pio()
208 c -= 2; in omap1_spi100k_txrx_pio()
209 if (xfer->tx_buf != NULL) in omap1_spi100k_txrx_pio()
210 spi100k_write_data(spi->master, word_len, *tx++); in omap1_spi100k_txrx_pio()
211 if (xfer->rx_buf != NULL) in omap1_spi100k_txrx_pio()
212 *rx++ = spi100k_read_data(spi->master, word_len); in omap1_spi100k_txrx_pio()
218 rx = xfer->rx_buf; in omap1_spi100k_txrx_pio()
219 tx = xfer->tx_buf; in omap1_spi100k_txrx_pio()
221 c -= 4; in omap1_spi100k_txrx_pio()
222 if (xfer->tx_buf != NULL) in omap1_spi100k_txrx_pio()
223 spi100k_write_data(spi->master, word_len, *tx); in omap1_spi100k_txrx_pio()
224 if (xfer->rx_buf != NULL) in omap1_spi100k_txrx_pio()
225 *rx = spi100k_read_data(spi->master, word_len); in omap1_spi100k_txrx_pio()
228 return count - c; in omap1_spi100k_txrx_pio()
232 static int omap1_spi100k_setup_transfer(struct spi_device *spi, in omap1_spi100k_setup_transfer() argument
235 struct omap1_spi100k *spi100k = spi_master_get_devdata(spi->master); in omap1_spi100k_setup_transfer()
236 struct omap1_spi100k_cs *cs = spi->controller_state; in omap1_spi100k_setup_transfer()
240 word_len = t->bits_per_word; in omap1_spi100k_setup_transfer()
242 word_len = spi->bits_per_word; in omap1_spi100k_setup_transfer()
245 return -EINVAL; in omap1_spi100k_setup_transfer()
246 cs->word_len = word_len; in omap1_spi100k_setup_transfer()
248 /* SPI init before transfer */ in omap1_spi100k_setup_transfer()
249 writew(0x3e , spi100k->base + SPI_SETUP1); in omap1_spi100k_setup_transfer()
250 writew(0x00 , spi100k->base + SPI_STATUS); in omap1_spi100k_setup_transfer()
251 writew(0x3e , spi100k->base + SPI_CTRL); in omap1_spi100k_setup_transfer()
256 /* the spi->mode bits understood by this driver: */
259 static int omap1_spi100k_setup(struct spi_device *spi) in omap1_spi100k_setup() argument
263 struct omap1_spi100k_cs *cs = spi->controller_state; in omap1_spi100k_setup()
265 spi100k = spi_master_get_devdata(spi->master); in omap1_spi100k_setup()
268 cs = devm_kzalloc(&spi->dev, sizeof(*cs), GFP_KERNEL); in omap1_spi100k_setup()
270 return -ENOMEM; in omap1_spi100k_setup()
271 cs->base = spi100k->base + spi->chip_select * 0x14; in omap1_spi100k_setup()
272 spi->controller_state = cs; in omap1_spi100k_setup()
275 spi100k_open(spi->master); in omap1_spi100k_setup()
277 clk_prepare_enable(spi100k->ick); in omap1_spi100k_setup()
278 clk_prepare_enable(spi100k->fck); in omap1_spi100k_setup()
280 ret = omap1_spi100k_setup_transfer(spi, NULL); in omap1_spi100k_setup()
282 clk_disable_unprepare(spi100k->ick); in omap1_spi100k_setup()
283 clk_disable_unprepare(spi100k->fck); in omap1_spi100k_setup()
292 struct spi_device *spi = m->spi; in omap1_spi100k_transfer_one_message() local
297 list_for_each_entry(t, &m->transfers, transfer_list) { in omap1_spi100k_transfer_one_message()
298 if (t->tx_buf == NULL && t->rx_buf == NULL && t->len) { in omap1_spi100k_transfer_one_message()
299 status = -EINVAL; in omap1_spi100k_transfer_one_message()
302 status = omap1_spi100k_setup_transfer(spi, t); in omap1_spi100k_transfer_one_message()
311 if (t->len) { in omap1_spi100k_transfer_one_message()
314 count = omap1_spi100k_txrx_pio(spi, t); in omap1_spi100k_transfer_one_message()
315 m->actual_length += count; in omap1_spi100k_transfer_one_message()
317 if (count != t->len) { in omap1_spi100k_transfer_one_message()
318 status = -EIO; in omap1_spi100k_transfer_one_message()
327 if (t->cs_change) { in omap1_spi100k_transfer_one_message()
333 status = omap1_spi100k_setup_transfer(spi, NULL); in omap1_spi100k_transfer_one_message()
338 m->status = status; in omap1_spi100k_transfer_one_message()
351 if (!pdev->id) in omap1_spi100k_probe()
352 return -EINVAL; in omap1_spi100k_probe()
354 master = spi_alloc_master(&pdev->dev, sizeof(*spi100k)); in omap1_spi100k_probe()
356 dev_dbg(&pdev->dev, "master allocation failed\n"); in omap1_spi100k_probe()
357 return -ENOMEM; in omap1_spi100k_probe()
360 if (pdev->id != -1) in omap1_spi100k_probe()
361 master->bus_num = pdev->id; in omap1_spi100k_probe()
363 master->setup = omap1_spi100k_setup; in omap1_spi100k_probe()
364 master->transfer_one_message = omap1_spi100k_transfer_one_message; in omap1_spi100k_probe()
365 master->num_chipselect = 2; in omap1_spi100k_probe()
366 master->mode_bits = MODEBITS; in omap1_spi100k_probe()
367 master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32); in omap1_spi100k_probe()
368 master->min_speed_hz = OMAP1_SPI100K_MAX_FREQ/(1<<16); in omap1_spi100k_probe()
369 master->max_speed_hz = OMAP1_SPI100K_MAX_FREQ; in omap1_spi100k_probe()
370 master->auto_runtime_pm = true; in omap1_spi100k_probe()
375 * The memory region base address is taken as the platform_data. in omap1_spi100k_probe()
377 * the SPI. in omap1_spi100k_probe()
379 spi100k->base = (void __iomem *)dev_get_platdata(&pdev->dev); in omap1_spi100k_probe()
381 spi100k->ick = devm_clk_get(&pdev->dev, "ick"); in omap1_spi100k_probe()
382 if (IS_ERR(spi100k->ick)) { in omap1_spi100k_probe()
383 dev_dbg(&pdev->dev, "can't get spi100k_ick\n"); in omap1_spi100k_probe()
384 status = PTR_ERR(spi100k->ick); in omap1_spi100k_probe()
388 spi100k->fck = devm_clk_get(&pdev->dev, "fck"); in omap1_spi100k_probe()
389 if (IS_ERR(spi100k->fck)) { in omap1_spi100k_probe()
390 dev_dbg(&pdev->dev, "can't get spi100k_fck\n"); in omap1_spi100k_probe()
391 status = PTR_ERR(spi100k->fck); in omap1_spi100k_probe()
395 status = clk_prepare_enable(spi100k->ick); in omap1_spi100k_probe()
397 dev_err(&pdev->dev, "failed to enable ick: %d\n", status); in omap1_spi100k_probe()
401 status = clk_prepare_enable(spi100k->fck); in omap1_spi100k_probe()
403 dev_err(&pdev->dev, "failed to enable fck: %d\n", status); in omap1_spi100k_probe()
407 pm_runtime_enable(&pdev->dev); in omap1_spi100k_probe()
408 pm_runtime_set_active(&pdev->dev); in omap1_spi100k_probe()
410 status = devm_spi_register_master(&pdev->dev, master); in omap1_spi100k_probe()
417 pm_runtime_disable(&pdev->dev); in omap1_spi100k_probe()
418 clk_disable_unprepare(spi100k->fck); in omap1_spi100k_probe()
420 clk_disable_unprepare(spi100k->ick); in omap1_spi100k_probe()
431 pm_runtime_disable(&pdev->dev); in omap1_spi100k_remove()
433 clk_disable_unprepare(spi100k->fck); in omap1_spi100k_remove()
434 clk_disable_unprepare(spi100k->ick); in omap1_spi100k_remove()
445 clk_disable_unprepare(spi100k->ick); in omap1_spi100k_runtime_suspend()
446 clk_disable_unprepare(spi100k->fck); in omap1_spi100k_runtime_suspend()
457 ret = clk_prepare_enable(spi100k->ick); in omap1_spi100k_runtime_resume()
463 ret = clk_prepare_enable(spi100k->fck); in omap1_spi100k_runtime_resume()
466 clk_disable_unprepare(spi100k->ick); in omap1_spi100k_runtime_resume()
490 MODULE_DESCRIPTION("OMAP7xx SPI 100k controller driver");