1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * SPI controller driver for the Atheros AR71XX/AR724X/AR913X SoCs
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org>
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * This driver has been based on the spi-gpio.c:
8*4882a593Smuzhiyun * Copyright (C) 2006,2008 David Brownell
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/kernel.h>
12*4882a593Smuzhiyun #include <linux/module.h>
13*4882a593Smuzhiyun #include <linux/delay.h>
14*4882a593Smuzhiyun #include <linux/spinlock.h>
15*4882a593Smuzhiyun #include <linux/platform_device.h>
16*4882a593Smuzhiyun #include <linux/io.h>
17*4882a593Smuzhiyun #include <linux/spi/spi.h>
18*4882a593Smuzhiyun #include <linux/spi/spi_bitbang.h>
19*4882a593Smuzhiyun #include <linux/bitops.h>
20*4882a593Smuzhiyun #include <linux/clk.h>
21*4882a593Smuzhiyun #include <linux/err.h>
22*4882a593Smuzhiyun #include <linux/platform_data/spi-ath79.h>
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #define DRV_NAME "ath79-spi"
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun #define ATH79_SPI_RRW_DELAY_FACTOR 12000
27*4882a593Smuzhiyun #define MHZ (1000 * 1000)
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #define AR71XX_SPI_REG_FS 0x00 /* Function Select */
30*4882a593Smuzhiyun #define AR71XX_SPI_REG_CTRL 0x04 /* SPI Control */
31*4882a593Smuzhiyun #define AR71XX_SPI_REG_IOC 0x08 /* SPI I/O Control */
32*4882a593Smuzhiyun #define AR71XX_SPI_REG_RDS 0x0c /* Read Data Shift */
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #define AR71XX_SPI_FS_GPIO BIT(0) /* Enable GPIO mode */
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #define AR71XX_SPI_IOC_DO BIT(0) /* Data Out pin */
37*4882a593Smuzhiyun #define AR71XX_SPI_IOC_CLK BIT(8) /* CLK pin */
38*4882a593Smuzhiyun #define AR71XX_SPI_IOC_CS(n) BIT(16 + (n))
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun struct ath79_spi {
41*4882a593Smuzhiyun struct spi_bitbang bitbang;
42*4882a593Smuzhiyun u32 ioc_base;
43*4882a593Smuzhiyun u32 reg_ctrl;
44*4882a593Smuzhiyun void __iomem *base;
45*4882a593Smuzhiyun struct clk *clk;
46*4882a593Smuzhiyun unsigned int rrw_delay;
47*4882a593Smuzhiyun };
48*4882a593Smuzhiyun
ath79_spi_rr(struct ath79_spi * sp,unsigned int reg)49*4882a593Smuzhiyun static inline u32 ath79_spi_rr(struct ath79_spi *sp, unsigned int reg)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun return ioread32(sp->base + reg);
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun
ath79_spi_wr(struct ath79_spi * sp,unsigned int reg,u32 val)54*4882a593Smuzhiyun static inline void ath79_spi_wr(struct ath79_spi *sp, unsigned int reg, u32 val)
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun iowrite32(val, sp->base + reg);
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
ath79_spidev_to_sp(struct spi_device * spi)59*4882a593Smuzhiyun static inline struct ath79_spi *ath79_spidev_to_sp(struct spi_device *spi)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun return spi_master_get_devdata(spi->master);
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun
ath79_spi_delay(struct ath79_spi * sp,unsigned int nsecs)64*4882a593Smuzhiyun static inline void ath79_spi_delay(struct ath79_spi *sp, unsigned int nsecs)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun if (nsecs > sp->rrw_delay)
67*4882a593Smuzhiyun ndelay(nsecs - sp->rrw_delay);
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
ath79_spi_chipselect(struct spi_device * spi,int is_active)70*4882a593Smuzhiyun static void ath79_spi_chipselect(struct spi_device *spi, int is_active)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun struct ath79_spi *sp = ath79_spidev_to_sp(spi);
73*4882a593Smuzhiyun int cs_high = (spi->mode & SPI_CS_HIGH) ? is_active : !is_active;
74*4882a593Smuzhiyun u32 cs_bit = AR71XX_SPI_IOC_CS(spi->chip_select);
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun if (cs_high)
77*4882a593Smuzhiyun sp->ioc_base |= cs_bit;
78*4882a593Smuzhiyun else
79*4882a593Smuzhiyun sp->ioc_base &= ~cs_bit;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
ath79_spi_enable(struct ath79_spi * sp)84*4882a593Smuzhiyun static void ath79_spi_enable(struct ath79_spi *sp)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun /* enable GPIO mode */
87*4882a593Smuzhiyun ath79_spi_wr(sp, AR71XX_SPI_REG_FS, AR71XX_SPI_FS_GPIO);
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun /* save CTRL register */
90*4882a593Smuzhiyun sp->reg_ctrl = ath79_spi_rr(sp, AR71XX_SPI_REG_CTRL);
91*4882a593Smuzhiyun sp->ioc_base = ath79_spi_rr(sp, AR71XX_SPI_REG_IOC);
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun /* clear clk and mosi in the base state */
94*4882a593Smuzhiyun sp->ioc_base &= ~(AR71XX_SPI_IOC_DO | AR71XX_SPI_IOC_CLK);
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun /* TODO: setup speed? */
97*4882a593Smuzhiyun ath79_spi_wr(sp, AR71XX_SPI_REG_CTRL, 0x43);
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun
ath79_spi_disable(struct ath79_spi * sp)100*4882a593Smuzhiyun static void ath79_spi_disable(struct ath79_spi *sp)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun /* restore CTRL register */
103*4882a593Smuzhiyun ath79_spi_wr(sp, AR71XX_SPI_REG_CTRL, sp->reg_ctrl);
104*4882a593Smuzhiyun /* disable GPIO mode */
105*4882a593Smuzhiyun ath79_spi_wr(sp, AR71XX_SPI_REG_FS, 0);
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun
ath79_spi_txrx_mode0(struct spi_device * spi,unsigned int nsecs,u32 word,u8 bits,unsigned flags)108*4882a593Smuzhiyun static u32 ath79_spi_txrx_mode0(struct spi_device *spi, unsigned int nsecs,
109*4882a593Smuzhiyun u32 word, u8 bits, unsigned flags)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun struct ath79_spi *sp = ath79_spidev_to_sp(spi);
112*4882a593Smuzhiyun u32 ioc = sp->ioc_base;
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun /* clock starts at inactive polarity */
115*4882a593Smuzhiyun for (word <<= (32 - bits); likely(bits); bits--) {
116*4882a593Smuzhiyun u32 out;
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun if (word & (1 << 31))
119*4882a593Smuzhiyun out = ioc | AR71XX_SPI_IOC_DO;
120*4882a593Smuzhiyun else
121*4882a593Smuzhiyun out = ioc & ~AR71XX_SPI_IOC_DO;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun /* setup MSB (to slave) on trailing edge */
124*4882a593Smuzhiyun ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out);
125*4882a593Smuzhiyun ath79_spi_delay(sp, nsecs);
126*4882a593Smuzhiyun ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out | AR71XX_SPI_IOC_CLK);
127*4882a593Smuzhiyun ath79_spi_delay(sp, nsecs);
128*4882a593Smuzhiyun if (bits == 1)
129*4882a593Smuzhiyun ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out);
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun word <<= 1;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun return ath79_spi_rr(sp, AR71XX_SPI_REG_RDS);
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun
ath79_spi_probe(struct platform_device * pdev)137*4882a593Smuzhiyun static int ath79_spi_probe(struct platform_device *pdev)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun struct spi_master *master;
140*4882a593Smuzhiyun struct ath79_spi *sp;
141*4882a593Smuzhiyun struct ath79_spi_platform_data *pdata;
142*4882a593Smuzhiyun unsigned long rate;
143*4882a593Smuzhiyun int ret;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun master = spi_alloc_master(&pdev->dev, sizeof(*sp));
146*4882a593Smuzhiyun if (master == NULL) {
147*4882a593Smuzhiyun dev_err(&pdev->dev, "failed to allocate spi master\n");
148*4882a593Smuzhiyun return -ENOMEM;
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun sp = spi_master_get_devdata(master);
152*4882a593Smuzhiyun master->dev.of_node = pdev->dev.of_node;
153*4882a593Smuzhiyun platform_set_drvdata(pdev, sp);
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun pdata = dev_get_platdata(&pdev->dev);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun master->use_gpio_descriptors = true;
158*4882a593Smuzhiyun master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32);
159*4882a593Smuzhiyun master->flags = SPI_MASTER_GPIO_SS;
160*4882a593Smuzhiyun if (pdata) {
161*4882a593Smuzhiyun master->bus_num = pdata->bus_num;
162*4882a593Smuzhiyun master->num_chipselect = pdata->num_chipselect;
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun sp->bitbang.master = master;
166*4882a593Smuzhiyun sp->bitbang.chipselect = ath79_spi_chipselect;
167*4882a593Smuzhiyun sp->bitbang.txrx_word[SPI_MODE_0] = ath79_spi_txrx_mode0;
168*4882a593Smuzhiyun sp->bitbang.flags = SPI_CS_HIGH;
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun sp->base = devm_platform_ioremap_resource(pdev, 0);
171*4882a593Smuzhiyun if (IS_ERR(sp->base)) {
172*4882a593Smuzhiyun ret = PTR_ERR(sp->base);
173*4882a593Smuzhiyun goto err_put_master;
174*4882a593Smuzhiyun }
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun sp->clk = devm_clk_get(&pdev->dev, "ahb");
177*4882a593Smuzhiyun if (IS_ERR(sp->clk)) {
178*4882a593Smuzhiyun ret = PTR_ERR(sp->clk);
179*4882a593Smuzhiyun goto err_put_master;
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun ret = clk_prepare_enable(sp->clk);
183*4882a593Smuzhiyun if (ret)
184*4882a593Smuzhiyun goto err_put_master;
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun rate = DIV_ROUND_UP(clk_get_rate(sp->clk), MHZ);
187*4882a593Smuzhiyun if (!rate) {
188*4882a593Smuzhiyun ret = -EINVAL;
189*4882a593Smuzhiyun goto err_clk_disable;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun sp->rrw_delay = ATH79_SPI_RRW_DELAY_FACTOR / rate;
193*4882a593Smuzhiyun dev_dbg(&pdev->dev, "register read/write delay is %u nsecs\n",
194*4882a593Smuzhiyun sp->rrw_delay);
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun ath79_spi_enable(sp);
197*4882a593Smuzhiyun ret = spi_bitbang_start(&sp->bitbang);
198*4882a593Smuzhiyun if (ret)
199*4882a593Smuzhiyun goto err_disable;
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun return 0;
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun err_disable:
204*4882a593Smuzhiyun ath79_spi_disable(sp);
205*4882a593Smuzhiyun err_clk_disable:
206*4882a593Smuzhiyun clk_disable_unprepare(sp->clk);
207*4882a593Smuzhiyun err_put_master:
208*4882a593Smuzhiyun spi_master_put(sp->bitbang.master);
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun return ret;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun
ath79_spi_remove(struct platform_device * pdev)213*4882a593Smuzhiyun static int ath79_spi_remove(struct platform_device *pdev)
214*4882a593Smuzhiyun {
215*4882a593Smuzhiyun struct ath79_spi *sp = platform_get_drvdata(pdev);
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun spi_bitbang_stop(&sp->bitbang);
218*4882a593Smuzhiyun ath79_spi_disable(sp);
219*4882a593Smuzhiyun clk_disable_unprepare(sp->clk);
220*4882a593Smuzhiyun spi_master_put(sp->bitbang.master);
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun return 0;
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
ath79_spi_shutdown(struct platform_device * pdev)225*4882a593Smuzhiyun static void ath79_spi_shutdown(struct platform_device *pdev)
226*4882a593Smuzhiyun {
227*4882a593Smuzhiyun ath79_spi_remove(pdev);
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun static const struct of_device_id ath79_spi_of_match[] = {
231*4882a593Smuzhiyun { .compatible = "qca,ar7100-spi", },
232*4882a593Smuzhiyun { },
233*4882a593Smuzhiyun };
234*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, ath79_spi_of_match);
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun static struct platform_driver ath79_spi_driver = {
237*4882a593Smuzhiyun .probe = ath79_spi_probe,
238*4882a593Smuzhiyun .remove = ath79_spi_remove,
239*4882a593Smuzhiyun .shutdown = ath79_spi_shutdown,
240*4882a593Smuzhiyun .driver = {
241*4882a593Smuzhiyun .name = DRV_NAME,
242*4882a593Smuzhiyun .of_match_table = ath79_spi_of_match,
243*4882a593Smuzhiyun },
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun module_platform_driver(ath79_spi_driver);
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun MODULE_DESCRIPTION("SPI controller driver for Atheros AR71XX/AR724X/AR913X");
248*4882a593Smuzhiyun MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
249*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
250*4882a593Smuzhiyun MODULE_ALIAS("platform:" DRV_NAME);
251