Lines Matching +full:rs +full:-
1 // SPDX-License-Identifier: GPL-2.0
3 // spi-mt7621.c -- MediaTek MT7621 SPI controller driver
6 // Copyright (C) 2011-2013 Gabor Juhos <juhosg@openwrt.org>
7 // Copyright (C) 2014-2015 Felix Fietkau <nbd@nbd.name>
9 // Some parts are based on spi-orion.c:
11 // Copyright (C) 2007-2008 Marvell Ltd.
21 #define DRIVER_NAME "spi-mt7621"
64 return spi_controller_get_devdata(spi->master); in spidev_to_mt7621_spi()
67 static inline u32 mt7621_spi_read(struct mt7621_spi *rs, u32 reg) in mt7621_spi_read() argument
69 return ioread32(rs->base + reg); in mt7621_spi_read()
72 static inline void mt7621_spi_write(struct mt7621_spi *rs, u32 reg, u32 val) in mt7621_spi_write() argument
74 iowrite32(val, rs->base + reg); in mt7621_spi_write()
79 struct mt7621_spi *rs = spidev_to_mt7621_spi(spi); in mt7621_spi_set_cs() local
80 int cs = spi->chip_select; in mt7621_spi_set_cs()
86 * full-duplex (only half-duplex really works on this chip in mt7621_spi_set_cs()
89 master = mt7621_spi_read(rs, MT7621_SPI_MASTER); in mt7621_spi_set_cs()
92 mt7621_spi_write(rs, MT7621_SPI_MASTER, master); in mt7621_spi_set_cs()
94 rs->pending_write = 0; in mt7621_spi_set_cs()
98 mt7621_spi_write(rs, MT7621_SPI_POLAR, polar); in mt7621_spi_set_cs()
103 struct mt7621_spi *rs = spidev_to_mt7621_spi(spi); in mt7621_spi_prepare() local
107 dev_dbg(&spi->dev, "speed:%u\n", speed); in mt7621_spi_prepare()
109 rate = DIV_ROUND_UP(rs->sys_freq, speed); in mt7621_spi_prepare()
110 dev_dbg(&spi->dev, "rate-1:%u\n", rate); in mt7621_spi_prepare()
113 return -EINVAL; in mt7621_spi_prepare()
118 reg = mt7621_spi_read(rs, MT7621_SPI_MASTER); in mt7621_spi_prepare()
120 reg |= (rate - 2) << MASTER_RS_CLK_SEL_SHIFT; in mt7621_spi_prepare()
121 rs->speed = speed; in mt7621_spi_prepare()
124 if (spi->mode & SPI_LSB_FIRST) in mt7621_spi_prepare()
134 mt7621_spi_write(rs, MT7621_SPI_MASTER, reg); in mt7621_spi_prepare()
139 static inline int mt7621_spi_wait_till_ready(struct mt7621_spi *rs) in mt7621_spi_wait_till_ready() argument
146 status = mt7621_spi_read(rs, MT7621_SPI_TRANS); in mt7621_spi_wait_till_ready()
153 return -ETIMEDOUT; in mt7621_spi_wait_till_ready()
156 static void mt7621_spi_read_half_duplex(struct mt7621_spi *rs, in mt7621_spi_read_half_duplex() argument
162 * Combine with any pending write, and perform one or more half-duplex in mt7621_spi_read_half_duplex()
166 tx_len = rs->pending_write; in mt7621_spi_read_half_duplex()
167 rs->pending_write = 0; in mt7621_spi_read_half_duplex()
175 val |= (tx_len - 4) * 8; in mt7621_spi_read_half_duplex()
177 mt7621_spi_write(rs, MT7621_SPI_MOREBUF, val); in mt7621_spi_read_half_duplex()
181 val = mt7621_spi_read(rs, MT7621_SPI_TRANS); in mt7621_spi_read_half_duplex()
183 mt7621_spi_write(rs, MT7621_SPI_TRANS, val); in mt7621_spi_read_half_duplex()
185 mt7621_spi_wait_till_ready(rs); in mt7621_spi_read_half_duplex()
189 val = mt7621_spi_read(rs, MT7621_SPI_DATA0 + i); in mt7621_spi_read_half_duplex()
194 rx_len -= i; in mt7621_spi_read_half_duplex()
198 static inline void mt7621_spi_flush(struct mt7621_spi *rs) in mt7621_spi_flush() argument
200 mt7621_spi_read_half_duplex(rs, 0, NULL); in mt7621_spi_flush()
203 static void mt7621_spi_write_half_duplex(struct mt7621_spi *rs, in mt7621_spi_write_half_duplex() argument
206 int len = rs->pending_write; in mt7621_spi_write_half_duplex()
210 val = mt7621_spi_read(rs, MT7621_SPI_OPCODE + (len & ~3)); in mt7621_spi_write_half_duplex()
212 val <<= (4 - len) * 8; in mt7621_spi_write_half_duplex()
219 rs->pending_write = len; in mt7621_spi_write_half_duplex()
220 mt7621_spi_flush(rs); in mt7621_spi_write_half_duplex()
228 /* The byte-order of the opcode is weird! */ in mt7621_spi_write_half_duplex()
230 mt7621_spi_write(rs, MT7621_SPI_OPCODE + len - 4, val); in mt7621_spi_write_half_duplex()
233 tx_len -= 1; in mt7621_spi_write_half_duplex()
239 val >>= (4 - len) * 8; in mt7621_spi_write_half_duplex()
241 mt7621_spi_write(rs, MT7621_SPI_OPCODE + (len & ~3), val); in mt7621_spi_write_half_duplex()
244 rs->pending_write = len; in mt7621_spi_write_half_duplex()
250 struct mt7621_spi *rs = spi_controller_get_devdata(master); in mt7621_spi_transfer_one_message() local
251 struct spi_device *spi = m->spi; in mt7621_spi_transfer_one_message()
252 unsigned int speed = spi->max_speed_hz; in mt7621_spi_transfer_one_message()
256 mt7621_spi_wait_till_ready(rs); in mt7621_spi_transfer_one_message()
258 list_for_each_entry(t, &m->transfers, transfer_list) in mt7621_spi_transfer_one_message()
259 if (t->speed_hz < speed) in mt7621_spi_transfer_one_message()
260 speed = t->speed_hz; in mt7621_spi_transfer_one_message()
263 status = -EIO; in mt7621_spi_transfer_one_message()
270 m->actual_length = 0; in mt7621_spi_transfer_one_message()
271 list_for_each_entry(t, &m->transfers, transfer_list) { in mt7621_spi_transfer_one_message()
272 if ((t->rx_buf) && (t->tx_buf)) { in mt7621_spi_transfer_one_message()
276 * (cmd_bit_cnt == 0). So the claimed full-duplex in mt7621_spi_transfer_one_message()
280 status = -EIO; in mt7621_spi_transfer_one_message()
282 } else if (t->rx_buf) { in mt7621_spi_transfer_one_message()
283 mt7621_spi_read_half_duplex(rs, t->len, t->rx_buf); in mt7621_spi_transfer_one_message()
284 } else if (t->tx_buf) { in mt7621_spi_transfer_one_message()
285 mt7621_spi_write_half_duplex(rs, t->len, t->tx_buf); in mt7621_spi_transfer_one_message()
287 m->actual_length += t->len; in mt7621_spi_transfer_one_message()
291 mt7621_spi_flush(rs); in mt7621_spi_transfer_one_message()
295 m->status = status; in mt7621_spi_transfer_one_message()
303 struct mt7621_spi *rs = spidev_to_mt7621_spi(spi); in mt7621_spi_setup() local
305 if ((spi->max_speed_hz == 0) || in mt7621_spi_setup()
306 (spi->max_speed_hz > (rs->sys_freq / 2))) in mt7621_spi_setup()
307 spi->max_speed_hz = rs->sys_freq / 2; in mt7621_spi_setup()
309 if (spi->max_speed_hz < (rs->sys_freq / 4097)) { in mt7621_spi_setup()
310 dev_err(&spi->dev, "setup: requested speed is too low %d Hz\n", in mt7621_spi_setup()
311 spi->max_speed_hz); in mt7621_spi_setup()
312 return -EINVAL; in mt7621_spi_setup()
319 { .compatible = "ralink,mt7621-spi" },
328 struct mt7621_spi *rs; in mt7621_spi_probe() local
334 match = of_match_device(mt7621_spi_match, &pdev->dev); in mt7621_spi_probe()
336 return -EINVAL; in mt7621_spi_probe()
342 clk = devm_clk_get(&pdev->dev, NULL); in mt7621_spi_probe()
344 dev_err(&pdev->dev, "unable to get SYS clock, err=%d\n", in mt7621_spi_probe()
353 master = devm_spi_alloc_master(&pdev->dev, sizeof(*rs)); in mt7621_spi_probe()
355 dev_info(&pdev->dev, "master allocation failed\n"); in mt7621_spi_probe()
357 return -ENOMEM; in mt7621_spi_probe()
360 master->mode_bits = SPI_LSB_FIRST; in mt7621_spi_probe()
361 master->flags = SPI_CONTROLLER_HALF_DUPLEX; in mt7621_spi_probe()
362 master->setup = mt7621_spi_setup; in mt7621_spi_probe()
363 master->transfer_one_message = mt7621_spi_transfer_one_message; in mt7621_spi_probe()
364 master->bits_per_word_mask = SPI_BPW_MASK(8); in mt7621_spi_probe()
365 master->dev.of_node = pdev->dev.of_node; in mt7621_spi_probe()
366 master->num_chipselect = 2; in mt7621_spi_probe()
368 dev_set_drvdata(&pdev->dev, master); in mt7621_spi_probe()
370 rs = spi_controller_get_devdata(master); in mt7621_spi_probe()
371 rs->base = base; in mt7621_spi_probe()
372 rs->clk = clk; in mt7621_spi_probe()
373 rs->master = master; in mt7621_spi_probe()
374 rs->sys_freq = clk_get_rate(rs->clk); in mt7621_spi_probe()
375 rs->pending_write = 0; in mt7621_spi_probe()
376 dev_info(&pdev->dev, "sys_freq: %u\n", rs->sys_freq); in mt7621_spi_probe()
378 ret = device_reset(&pdev->dev); in mt7621_spi_probe()
380 dev_err(&pdev->dev, "SPI reset failed!\n"); in mt7621_spi_probe()
395 struct mt7621_spi *rs; in mt7621_spi_remove() local
397 master = dev_get_drvdata(&pdev->dev); in mt7621_spi_remove()
398 rs = spi_controller_get_devdata(master); in mt7621_spi_remove()
401 clk_disable_unprepare(rs->clk); in mt7621_spi_remove()