perf tools: Don't clone maps from parent when synthesizing forks
[linux/fpc-iii.git] / drivers / spi / spi-at91-usart.c
bloba924657642fa8c27446c402288896ae355b6d272
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // Driver for AT91 USART Controllers as SPI
4 //
5 // Copyright (C) 2018 Microchip Technology Inc.
6 //
7 // Author: Radu Pirea <radu.pirea@microchip.com>
9 #include <linux/clk.h>
10 #include <linux/delay.h>
11 #include <linux/interrupt.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/of_gpio.h>
15 #include <linux/platform_device.h>
17 #include <linux/spi/spi.h>
19 #define US_CR 0x00
20 #define US_MR 0x04
21 #define US_IER 0x08
22 #define US_IDR 0x0C
23 #define US_CSR 0x14
24 #define US_RHR 0x18
25 #define US_THR 0x1C
26 #define US_BRGR 0x20
27 #define US_VERSION 0xFC
29 #define US_CR_RSTRX BIT(2)
30 #define US_CR_RSTTX BIT(3)
31 #define US_CR_RXEN BIT(4)
32 #define US_CR_RXDIS BIT(5)
33 #define US_CR_TXEN BIT(6)
34 #define US_CR_TXDIS BIT(7)
36 #define US_MR_SPI_MASTER 0x0E
37 #define US_MR_CHRL GENMASK(7, 6)
38 #define US_MR_CPHA BIT(8)
39 #define US_MR_CPOL BIT(16)
40 #define US_MR_CLKO BIT(18)
41 #define US_MR_WRDBT BIT(20)
42 #define US_MR_LOOP BIT(15)
44 #define US_IR_RXRDY BIT(0)
45 #define US_IR_TXRDY BIT(1)
46 #define US_IR_OVRE BIT(5)
48 #define US_BRGR_SIZE BIT(16)
50 #define US_MIN_CLK_DIV 0x06
51 #define US_MAX_CLK_DIV BIT(16)
53 #define US_RESET (US_CR_RSTRX | US_CR_RSTTX)
54 #define US_DISABLE (US_CR_RXDIS | US_CR_TXDIS)
55 #define US_ENABLE (US_CR_RXEN | US_CR_TXEN)
56 #define US_OVRE_RXRDY_IRQS (US_IR_OVRE | US_IR_RXRDY)
58 #define US_INIT \
59 (US_MR_SPI_MASTER | US_MR_CHRL | US_MR_CLKO | US_MR_WRDBT)
61 /* Register access macros */
62 #define at91_usart_spi_readl(port, reg) \
63 readl_relaxed((port)->regs + US_##reg)
64 #define at91_usart_spi_writel(port, reg, value) \
65 writel_relaxed((value), (port)->regs + US_##reg)
67 #define at91_usart_spi_readb(port, reg) \
68 readb_relaxed((port)->regs + US_##reg)
69 #define at91_usart_spi_writeb(port, reg, value) \
70 writeb_relaxed((value), (port)->regs + US_##reg)
72 struct at91_usart_spi {
73 struct spi_transfer *current_transfer;
74 void __iomem *regs;
75 struct device *dev;
76 struct clk *clk;
78 /*used in interrupt to protect data reading*/
79 spinlock_t lock;
81 int irq;
82 unsigned int current_tx_remaining_bytes;
83 unsigned int current_rx_remaining_bytes;
85 u32 spi_clk;
86 u32 status;
88 bool xfer_failed;
91 static inline u32 at91_usart_spi_tx_ready(struct at91_usart_spi *aus)
93 return aus->status & US_IR_TXRDY;
96 static inline u32 at91_usart_spi_rx_ready(struct at91_usart_spi *aus)
98 return aus->status & US_IR_RXRDY;
101 static inline u32 at91_usart_spi_check_overrun(struct at91_usart_spi *aus)
103 return aus->status & US_IR_OVRE;
106 static inline u32 at91_usart_spi_read_status(struct at91_usart_spi *aus)
108 aus->status = at91_usart_spi_readl(aus, CSR);
109 return aus->status;
112 static inline void at91_usart_spi_tx(struct at91_usart_spi *aus)
114 unsigned int len = aus->current_transfer->len;
115 unsigned int remaining = aus->current_tx_remaining_bytes;
116 const u8 *tx_buf = aus->current_transfer->tx_buf;
118 if (!remaining)
119 return;
121 if (at91_usart_spi_tx_ready(aus)) {
122 at91_usart_spi_writeb(aus, THR, tx_buf[len - remaining]);
123 aus->current_tx_remaining_bytes--;
127 static inline void at91_usart_spi_rx(struct at91_usart_spi *aus)
129 int len = aus->current_transfer->len;
130 int remaining = aus->current_rx_remaining_bytes;
131 u8 *rx_buf = aus->current_transfer->rx_buf;
133 if (!remaining)
134 return;
136 rx_buf[len - remaining] = at91_usart_spi_readb(aus, RHR);
137 aus->current_rx_remaining_bytes--;
140 static inline void
141 at91_usart_spi_set_xfer_speed(struct at91_usart_spi *aus,
142 struct spi_transfer *xfer)
144 at91_usart_spi_writel(aus, BRGR,
145 DIV_ROUND_UP(aus->spi_clk, xfer->speed_hz));
148 static irqreturn_t at91_usart_spi_interrupt(int irq, void *dev_id)
150 struct spi_controller *controller = dev_id;
151 struct at91_usart_spi *aus = spi_master_get_devdata(controller);
153 spin_lock(&aus->lock);
154 at91_usart_spi_read_status(aus);
156 if (at91_usart_spi_check_overrun(aus)) {
157 aus->xfer_failed = true;
158 at91_usart_spi_writel(aus, IDR, US_IR_OVRE | US_IR_RXRDY);
159 spin_unlock(&aus->lock);
160 return IRQ_HANDLED;
163 if (at91_usart_spi_rx_ready(aus)) {
164 at91_usart_spi_rx(aus);
165 spin_unlock(&aus->lock);
166 return IRQ_HANDLED;
169 spin_unlock(&aus->lock);
171 return IRQ_NONE;
174 static int at91_usart_spi_setup(struct spi_device *spi)
176 struct at91_usart_spi *aus = spi_master_get_devdata(spi->controller);
177 u32 *ausd = spi->controller_state;
178 unsigned int mr = at91_usart_spi_readl(aus, MR);
179 u8 bits = spi->bits_per_word;
181 if (bits != 8) {
182 dev_dbg(&spi->dev, "Only 8 bits per word are supported\n");
183 return -EINVAL;
186 if (spi->mode & SPI_CPOL)
187 mr |= US_MR_CPOL;
188 else
189 mr &= ~US_MR_CPOL;
191 if (spi->mode & SPI_CPHA)
192 mr |= US_MR_CPHA;
193 else
194 mr &= ~US_MR_CPHA;
196 if (spi->mode & SPI_LOOP)
197 mr |= US_MR_LOOP;
198 else
199 mr &= ~US_MR_LOOP;
201 if (!ausd) {
202 ausd = kzalloc(sizeof(*ausd), GFP_KERNEL);
203 if (!ausd)
204 return -ENOMEM;
206 spi->controller_state = ausd;
209 *ausd = mr;
211 dev_dbg(&spi->dev,
212 "setup: bpw %u mode 0x%x -> mr %d %08x\n",
213 bits, spi->mode, spi->chip_select, mr);
215 return 0;
218 static int at91_usart_spi_transfer_one(struct spi_controller *ctlr,
219 struct spi_device *spi,
220 struct spi_transfer *xfer)
222 struct at91_usart_spi *aus = spi_master_get_devdata(ctlr);
224 at91_usart_spi_set_xfer_speed(aus, xfer);
225 aus->xfer_failed = false;
226 aus->current_transfer = xfer;
227 aus->current_tx_remaining_bytes = xfer->len;
228 aus->current_rx_remaining_bytes = xfer->len;
230 while ((aus->current_tx_remaining_bytes ||
231 aus->current_rx_remaining_bytes) && !aus->xfer_failed) {
232 at91_usart_spi_read_status(aus);
233 at91_usart_spi_tx(aus);
234 cpu_relax();
237 if (aus->xfer_failed) {
238 dev_err(aus->dev, "Overrun!\n");
239 return -EIO;
242 return 0;
245 static int at91_usart_spi_prepare_message(struct spi_controller *ctlr,
246 struct spi_message *message)
248 struct at91_usart_spi *aus = spi_master_get_devdata(ctlr);
249 struct spi_device *spi = message->spi;
250 u32 *ausd = spi->controller_state;
252 at91_usart_spi_writel(aus, CR, US_ENABLE);
253 at91_usart_spi_writel(aus, IER, US_OVRE_RXRDY_IRQS);
254 at91_usart_spi_writel(aus, MR, *ausd);
256 return 0;
259 static int at91_usart_spi_unprepare_message(struct spi_controller *ctlr,
260 struct spi_message *message)
262 struct at91_usart_spi *aus = spi_master_get_devdata(ctlr);
264 at91_usart_spi_writel(aus, CR, US_RESET | US_DISABLE);
265 at91_usart_spi_writel(aus, IDR, US_OVRE_RXRDY_IRQS);
267 return 0;
270 static void at91_usart_spi_cleanup(struct spi_device *spi)
272 struct at91_usart_spi_device *ausd = spi->controller_state;
274 spi->controller_state = NULL;
275 kfree(ausd);
278 static void at91_usart_spi_init(struct at91_usart_spi *aus)
280 at91_usart_spi_writel(aus, MR, US_INIT);
281 at91_usart_spi_writel(aus, CR, US_RESET | US_DISABLE);
284 static int at91_usart_gpio_setup(struct platform_device *pdev)
286 struct device_node *np = pdev->dev.parent->of_node;
287 int i;
288 int ret;
289 int nb;
291 if (!np)
292 return -EINVAL;
294 nb = of_gpio_named_count(np, "cs-gpios");
295 for (i = 0; i < nb; i++) {
296 int cs_gpio = of_get_named_gpio(np, "cs-gpios", i);
298 if (cs_gpio < 0)
299 return cs_gpio;
301 if (gpio_is_valid(cs_gpio)) {
302 ret = devm_gpio_request_one(&pdev->dev, cs_gpio,
303 GPIOF_DIR_OUT,
304 dev_name(&pdev->dev));
305 if (ret)
306 return ret;
310 return 0;
313 static int at91_usart_spi_probe(struct platform_device *pdev)
315 struct resource *regs;
316 struct spi_controller *controller;
317 struct at91_usart_spi *aus;
318 struct clk *clk;
319 int irq;
320 int ret;
322 regs = platform_get_resource(to_platform_device(pdev->dev.parent),
323 IORESOURCE_MEM, 0);
324 if (!regs)
325 return -EINVAL;
327 irq = platform_get_irq(to_platform_device(pdev->dev.parent), 0);
328 if (irq < 0)
329 return irq;
331 clk = devm_clk_get(pdev->dev.parent, "usart");
332 if (IS_ERR(clk))
333 return PTR_ERR(clk);
335 ret = -ENOMEM;
336 controller = spi_alloc_master(&pdev->dev, sizeof(*aus));
337 if (!controller)
338 goto at91_usart_spi_probe_fail;
340 ret = at91_usart_gpio_setup(pdev);
341 if (ret)
342 goto at91_usart_spi_probe_fail;
344 controller->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LOOP | SPI_CS_HIGH;
345 controller->dev.of_node = pdev->dev.parent->of_node;
346 controller->bits_per_word_mask = SPI_BPW_MASK(8);
347 controller->setup = at91_usart_spi_setup;
348 controller->flags = SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX;
349 controller->transfer_one = at91_usart_spi_transfer_one;
350 controller->prepare_message = at91_usart_spi_prepare_message;
351 controller->unprepare_message = at91_usart_spi_unprepare_message;
352 controller->cleanup = at91_usart_spi_cleanup;
353 controller->max_speed_hz = DIV_ROUND_UP(clk_get_rate(clk),
354 US_MIN_CLK_DIV);
355 controller->min_speed_hz = DIV_ROUND_UP(clk_get_rate(clk),
356 US_MAX_CLK_DIV);
357 platform_set_drvdata(pdev, controller);
359 aus = spi_master_get_devdata(controller);
361 aus->dev = &pdev->dev;
362 aus->regs = devm_ioremap_resource(&pdev->dev, regs);
363 if (IS_ERR(aus->regs)) {
364 ret = PTR_ERR(aus->regs);
365 goto at91_usart_spi_probe_fail;
368 aus->irq = irq;
369 aus->clk = clk;
371 ret = devm_request_irq(&pdev->dev, irq, at91_usart_spi_interrupt, 0,
372 dev_name(&pdev->dev), controller);
373 if (ret)
374 goto at91_usart_spi_probe_fail;
376 ret = clk_prepare_enable(clk);
377 if (ret)
378 goto at91_usart_spi_probe_fail;
380 aus->spi_clk = clk_get_rate(clk);
381 at91_usart_spi_init(aus);
383 spin_lock_init(&aus->lock);
384 ret = devm_spi_register_master(&pdev->dev, controller);
385 if (ret)
386 goto at91_usart_fail_register_master;
388 dev_info(&pdev->dev,
389 "AT91 USART SPI Controller version 0x%x at %pa (irq %d)\n",
390 at91_usart_spi_readl(aus, VERSION),
391 &regs->start, irq);
393 return 0;
395 at91_usart_fail_register_master:
396 clk_disable_unprepare(clk);
397 at91_usart_spi_probe_fail:
398 spi_master_put(controller);
399 return ret;
402 static int at91_usart_spi_remove(struct platform_device *pdev)
404 struct spi_controller *ctlr = platform_get_drvdata(pdev);
405 struct at91_usart_spi *aus = spi_master_get_devdata(ctlr);
407 clk_disable_unprepare(aus->clk);
409 return 0;
412 static const struct of_device_id at91_usart_spi_dt_ids[] = {
413 { .compatible = "microchip,at91sam9g45-usart-spi"},
414 { /* sentinel */}
417 MODULE_DEVICE_TABLE(of, at91_usart_spi_dt_ids);
419 static struct platform_driver at91_usart_spi_driver = {
420 .driver = {
421 .name = "at91_usart_spi",
423 .probe = at91_usart_spi_probe,
424 .remove = at91_usart_spi_remove,
427 module_platform_driver(at91_usart_spi_driver);
429 MODULE_DESCRIPTION("Microchip AT91 USART SPI Controller driver");
430 MODULE_AUTHOR("Radu Pirea <radu.pirea@microchip.com>");
431 MODULE_LICENSE("GPL v2");
432 MODULE_ALIAS("platform:at91_usart_spi");