1 // SPDX-License-Identifier: GPL-2.0-or-later
2 // Copyright (C) IBM Corporation 2018
3 // FSI master driver for AST2600
6 #include <linux/delay.h>
9 #include <linux/mfd/syscon.h>
10 #include <linux/module.h>
11 #include <linux/mutex.h>
13 #include <linux/platform_device.h>
14 #include <linux/regmap.h>
15 #include <linux/slab.h>
16 #include <linux/iopoll.h>
17 #include <linux/gpio/consumer.h>
19 #include "fsi-master.h"
21 struct fsi_master_aspeed
{
22 struct fsi_master master
;
23 struct mutex lock
; /* protect HW access */
27 struct gpio_desc
*cfam_reset_gpio
;
30 #define to_fsi_master_aspeed(m) \
31 container_of(m, struct fsi_master_aspeed, master)
33 /* Control register (size 0x400) */
34 static const u32 ctrl_base
= 0x80000000;
36 static const u32 fsi_base
= 0xa0000000;
38 #define OPB_FSI_VER 0x00
39 #define OPB_TRIGGER 0x04
40 #define OPB_CTRL_BASE 0x08
41 #define OPB_FSI_BASE 0x0c
42 #define OPB_CLK_SYNC 0x3c
43 #define OPB_IRQ_CLEAR 0x40
44 #define OPB_IRQ_MASK 0x44
45 #define OPB_IRQ_STATUS 0x48
47 #define OPB0_SELECT 0x10
49 #define OPB0_XFER_SIZE 0x18
50 #define OPB0_FSI_ADDR 0x1c
51 #define OPB0_FSI_DATA_W 0x20
52 #define OPB0_STATUS 0x80
53 #define OPB0_FSI_DATA_R 0x84
55 #define OPB0_WRITE_ORDER1 0x4c
56 #define OPB0_WRITE_ORDER2 0x50
57 #define OPB1_WRITE_ORDER1 0x54
58 #define OPB1_WRITE_ORDER2 0x58
59 #define OPB0_READ_ORDER1 0x5c
60 #define OPB1_READ_ORDER2 0x60
62 #define OPB_RETRY_COUNTER 0x64
65 #define STATUS_HALFWORD_ACK BIT(0)
66 #define STATUS_FULLWORD_ACK BIT(1)
67 #define STATUS_ERR_ACK BIT(2)
68 #define STATUS_RETRY BIT(3)
69 #define STATUS_TIMEOUT BIT(4)
72 #define OPB1_XFER_ACK_EN BIT(17)
73 #define OPB0_XFER_ACK_EN BIT(16)
76 #define CMD_READ BIT(0)
80 #define XFER_FULLWORD (BIT(1) | BIT(0))
81 #define XFER_HALFWORD (BIT(0))
84 #define CREATE_TRACE_POINTS
85 #include <trace/events/fsi_master_aspeed.h>
87 #define FSI_LINK_ENABLE_SETUP_TIME 10 /* in mS */
89 /* Run the bus at maximum speed by default */
90 #define FSI_DIVISOR_DEFAULT 1
91 #define FSI_DIVISOR_CABLED 2
92 static u16 aspeed_fsi_divisor
= FSI_DIVISOR_DEFAULT
;
93 module_param_named(bus_div
,aspeed_fsi_divisor
, ushort
, 0);
95 #define OPB_POLL_TIMEOUT 10000
97 static int __opb_write(struct fsi_master_aspeed
*aspeed
, u32 addr
,
98 u32 val
, u32 transfer_size
)
100 void __iomem
*base
= aspeed
->base
;
104 writel(CMD_WRITE
, base
+ OPB0_RW
);
105 writel(transfer_size
, base
+ OPB0_XFER_SIZE
);
106 writel(addr
, base
+ OPB0_FSI_ADDR
);
107 writel(val
, base
+ OPB0_FSI_DATA_W
);
108 writel(0x1, base
+ OPB_IRQ_CLEAR
);
109 writel(0x1, base
+ OPB_TRIGGER
);
111 ret
= readl_poll_timeout(base
+ OPB_IRQ_STATUS
, reg
,
112 (reg
& OPB0_XFER_ACK_EN
) != 0,
113 0, OPB_POLL_TIMEOUT
);
115 status
= readl(base
+ OPB0_STATUS
);
117 trace_fsi_master_aspeed_opb_write(addr
, val
, transfer_size
, status
, reg
);
119 /* Return error when poll timed out */
123 /* Command failed, master will reset */
124 if (status
& STATUS_ERR_ACK
)
130 static int opb_writeb(struct fsi_master_aspeed
*aspeed
, u32 addr
, u8 val
)
132 return __opb_write(aspeed
, addr
, val
, XFER_BYTE
);
135 static int opb_writew(struct fsi_master_aspeed
*aspeed
, u32 addr
, __be16 val
)
137 return __opb_write(aspeed
, addr
, (__force u16
)val
, XFER_HALFWORD
);
140 static int opb_writel(struct fsi_master_aspeed
*aspeed
, u32 addr
, __be32 val
)
142 return __opb_write(aspeed
, addr
, (__force u32
)val
, XFER_FULLWORD
);
145 static int __opb_read(struct fsi_master_aspeed
*aspeed
, uint32_t addr
,
146 u32 transfer_size
, void *out
)
148 void __iomem
*base
= aspeed
->base
;
152 writel(CMD_READ
, base
+ OPB0_RW
);
153 writel(transfer_size
, base
+ OPB0_XFER_SIZE
);
154 writel(addr
, base
+ OPB0_FSI_ADDR
);
155 writel(0x1, base
+ OPB_IRQ_CLEAR
);
156 writel(0x1, base
+ OPB_TRIGGER
);
158 ret
= readl_poll_timeout(base
+ OPB_IRQ_STATUS
, reg
,
159 (reg
& OPB0_XFER_ACK_EN
) != 0,
160 0, OPB_POLL_TIMEOUT
);
162 status
= readl(base
+ OPB0_STATUS
);
164 result
= readl(base
+ OPB0_FSI_DATA_R
);
166 trace_fsi_master_aspeed_opb_read(addr
, transfer_size
, result
,
167 readl(base
+ OPB0_STATUS
),
170 /* Return error when poll timed out */
174 /* Command failed, master will reset */
175 if (status
& STATUS_ERR_ACK
)
179 switch (transfer_size
) {
184 *(u16
*)out
= result
;
187 *(u32
*)out
= result
;
198 static int opb_readl(struct fsi_master_aspeed
*aspeed
, uint32_t addr
, __be32
*out
)
200 return __opb_read(aspeed
, addr
, XFER_FULLWORD
, out
);
203 static int opb_readw(struct fsi_master_aspeed
*aspeed
, uint32_t addr
, __be16
*out
)
205 return __opb_read(aspeed
, addr
, XFER_HALFWORD
, (void *)out
);
208 static int opb_readb(struct fsi_master_aspeed
*aspeed
, uint32_t addr
, u8
*out
)
210 return __opb_read(aspeed
, addr
, XFER_BYTE
, (void *)out
);
213 static int check_errors(struct fsi_master_aspeed
*aspeed
, int err
)
217 if (trace_fsi_master_aspeed_opb_error_enabled()) {
218 __be32 mresp0
, mstap0
, mesrb0
;
220 opb_readl(aspeed
, ctrl_base
+ FSI_MRESP0
, &mresp0
);
221 opb_readl(aspeed
, ctrl_base
+ FSI_MSTAP0
, &mstap0
);
222 opb_readl(aspeed
, ctrl_base
+ FSI_MESRB0
, &mesrb0
);
224 trace_fsi_master_aspeed_opb_error(
227 be32_to_cpu(mesrb0
));
231 /* Check MAEB (0x70) ? */
233 /* Then clear errors in master */
234 ret
= opb_writel(aspeed
, ctrl_base
+ FSI_MRESP0
,
235 cpu_to_be32(FSI_MRESP_RST_ALL_MASTER
));
237 /* TODO: log? return different code? */
240 /* TODO: confirm that 0x70 was okay */
243 /* This will pass through timeout errors */
247 static int aspeed_master_read(struct fsi_master
*master
, int link
,
248 uint8_t id
, uint32_t addr
, void *val
, size_t size
)
250 struct fsi_master_aspeed
*aspeed
= to_fsi_master_aspeed(master
);
257 addr
+= link
* FSI_HUB_LINK_SIZE
;
259 mutex_lock(&aspeed
->lock
);
263 ret
= opb_readb(aspeed
, fsi_base
+ addr
, val
);
266 ret
= opb_readw(aspeed
, fsi_base
+ addr
, val
);
269 ret
= opb_readl(aspeed
, fsi_base
+ addr
, val
);
276 ret
= check_errors(aspeed
, ret
);
278 mutex_unlock(&aspeed
->lock
);
282 static int aspeed_master_write(struct fsi_master
*master
, int link
,
283 uint8_t id
, uint32_t addr
, const void *val
, size_t size
)
285 struct fsi_master_aspeed
*aspeed
= to_fsi_master_aspeed(master
);
292 addr
+= link
* FSI_HUB_LINK_SIZE
;
294 mutex_lock(&aspeed
->lock
);
298 ret
= opb_writeb(aspeed
, fsi_base
+ addr
, *(u8
*)val
);
301 ret
= opb_writew(aspeed
, fsi_base
+ addr
, *(__be16
*)val
);
304 ret
= opb_writel(aspeed
, fsi_base
+ addr
, *(__be32
*)val
);
311 ret
= check_errors(aspeed
, ret
);
313 mutex_unlock(&aspeed
->lock
);
317 static int aspeed_master_link_enable(struct fsi_master
*master
, int link
,
320 struct fsi_master_aspeed
*aspeed
= to_fsi_master_aspeed(master
);
327 reg
= cpu_to_be32(0x80000000 >> bit
);
329 mutex_lock(&aspeed
->lock
);
332 ret
= opb_writel(aspeed
, ctrl_base
+ FSI_MCENP0
+ (4 * idx
), reg
);
336 ret
= opb_writel(aspeed
, ctrl_base
+ FSI_MSENP0
+ (4 * idx
), reg
);
340 mdelay(FSI_LINK_ENABLE_SETUP_TIME
);
342 mutex_unlock(&aspeed
->lock
);
346 static int aspeed_master_term(struct fsi_master
*master
, int link
, uint8_t id
)
352 cmd
= cpu_to_be32(0xecc00000);
354 return aspeed_master_write(master
, link
, id
, addr
, &cmd
, 4);
357 static int aspeed_master_break(struct fsi_master
*master
, int link
)
363 cmd
= cpu_to_be32(0xc0de0000);
365 return aspeed_master_write(master
, link
, 0, addr
, &cmd
, 4);
368 static void aspeed_master_release(struct device
*dev
)
370 struct fsi_master_aspeed
*aspeed
=
371 to_fsi_master_aspeed(dev_to_fsi_master(dev
));
377 static inline u32
fsi_mmode_crs0(u32 x
)
379 return (x
& FSI_MMODE_CRS0MASK
) << FSI_MMODE_CRS0SHFT
;
382 static inline u32
fsi_mmode_crs1(u32 x
)
384 return (x
& FSI_MMODE_CRS1MASK
) << FSI_MMODE_CRS1SHFT
;
387 static int aspeed_master_init(struct fsi_master_aspeed
*aspeed
)
391 reg
= cpu_to_be32(FSI_MRESP_RST_ALL_MASTER
| FSI_MRESP_RST_ALL_LINK
392 | FSI_MRESP_RST_MCR
| FSI_MRESP_RST_PYE
);
393 opb_writel(aspeed
, ctrl_base
+ FSI_MRESP0
, reg
);
395 /* Initialize the MFSI (hub master) engine */
396 reg
= cpu_to_be32(FSI_MRESP_RST_ALL_MASTER
| FSI_MRESP_RST_ALL_LINK
397 | FSI_MRESP_RST_MCR
| FSI_MRESP_RST_PYE
);
398 opb_writel(aspeed
, ctrl_base
+ FSI_MRESP0
, reg
);
400 reg
= cpu_to_be32(FSI_MECTRL_EOAE
| FSI_MECTRL_P8_AUTO_TERM
);
401 opb_writel(aspeed
, ctrl_base
+ FSI_MECTRL
, reg
);
403 reg
= cpu_to_be32(FSI_MMODE_ECRC
| FSI_MMODE_EPC
| FSI_MMODE_RELA
404 | fsi_mmode_crs0(aspeed_fsi_divisor
)
405 | fsi_mmode_crs1(aspeed_fsi_divisor
)
406 | FSI_MMODE_P8_TO_LSB
);
407 dev_info(aspeed
->dev
, "mmode set to %08x (divisor %d)\n",
408 be32_to_cpu(reg
), aspeed_fsi_divisor
);
409 opb_writel(aspeed
, ctrl_base
+ FSI_MMODE
, reg
);
411 reg
= cpu_to_be32(0xffff0000);
412 opb_writel(aspeed
, ctrl_base
+ FSI_MDLYR
, reg
);
414 reg
= cpu_to_be32(~0);
415 opb_writel(aspeed
, ctrl_base
+ FSI_MSENP0
, reg
);
417 /* Leave enabled long enough for master logic to set up */
418 mdelay(FSI_LINK_ENABLE_SETUP_TIME
);
420 opb_writel(aspeed
, ctrl_base
+ FSI_MCENP0
, reg
);
422 opb_readl(aspeed
, ctrl_base
+ FSI_MAEB
, NULL
);
424 reg
= cpu_to_be32(FSI_MRESP_RST_ALL_MASTER
| FSI_MRESP_RST_ALL_LINK
);
425 opb_writel(aspeed
, ctrl_base
+ FSI_MRESP0
, reg
);
427 opb_readl(aspeed
, ctrl_base
+ FSI_MLEVP0
, NULL
);
429 /* Reset the master bridge */
430 reg
= cpu_to_be32(FSI_MRESB_RST_GEN
);
431 opb_writel(aspeed
, ctrl_base
+ FSI_MRESB0
, reg
);
433 reg
= cpu_to_be32(FSI_MRESB_RST_ERR
);
434 opb_writel(aspeed
, ctrl_base
+ FSI_MRESB0
, reg
);
439 static ssize_t
cfam_reset_store(struct device
*dev
, struct device_attribute
*attr
,
440 const char *buf
, size_t count
)
442 struct fsi_master_aspeed
*aspeed
= dev_get_drvdata(dev
);
444 mutex_lock(&aspeed
->lock
);
445 gpiod_set_value(aspeed
->cfam_reset_gpio
, 1);
446 usleep_range(900, 1000);
447 gpiod_set_value(aspeed
->cfam_reset_gpio
, 0);
448 mutex_unlock(&aspeed
->lock
);
453 static DEVICE_ATTR(cfam_reset
, 0200, NULL
, cfam_reset_store
);
455 static int setup_cfam_reset(struct fsi_master_aspeed
*aspeed
)
457 struct device
*dev
= aspeed
->dev
;
458 struct gpio_desc
*gpio
;
461 gpio
= devm_gpiod_get_optional(dev
, "cfam-reset", GPIOD_OUT_LOW
);
463 return PTR_ERR(gpio
);
467 aspeed
->cfam_reset_gpio
= gpio
;
469 rc
= device_create_file(dev
, &dev_attr_cfam_reset
);
471 devm_gpiod_put(dev
, gpio
);
478 static int tacoma_cabled_fsi_fixup(struct device
*dev
)
480 struct gpio_desc
*routing_gpio
, *mux_gpio
;
484 * The routing GPIO is a jumper indicating we should mux for the
485 * externally connected FSI cable.
487 routing_gpio
= devm_gpiod_get_optional(dev
, "fsi-routing",
488 GPIOD_IN
| GPIOD_FLAGS_BIT_NONEXCLUSIVE
);
489 if (IS_ERR(routing_gpio
))
490 return PTR_ERR(routing_gpio
);
494 mux_gpio
= devm_gpiod_get_optional(dev
, "fsi-mux", GPIOD_ASIS
);
495 if (IS_ERR(mux_gpio
))
496 return PTR_ERR(mux_gpio
);
500 gpio
= gpiod_get_value(routing_gpio
);
504 /* If the routing GPIO is high we should set the mux to low. */
507 * Cable signal integrity means we should run the bus
508 * slightly slower. Do not override if a kernel param
509 * has already overridden.
511 if (aspeed_fsi_divisor
== FSI_DIVISOR_DEFAULT
)
512 aspeed_fsi_divisor
= FSI_DIVISOR_CABLED
;
514 gpiod_direction_output(mux_gpio
, 0);
515 dev_info(dev
, "FSI configured for external cable\n");
517 gpiod_direction_output(mux_gpio
, 1);
520 devm_gpiod_put(dev
, routing_gpio
);
525 static int fsi_master_aspeed_probe(struct platform_device
*pdev
)
527 struct fsi_master_aspeed
*aspeed
;
528 struct resource
*res
;
532 rc
= tacoma_cabled_fsi_fixup(&pdev
->dev
);
534 dev_err(&pdev
->dev
, "Tacoma FSI cable fixup failed\n");
538 aspeed
= devm_kzalloc(&pdev
->dev
, sizeof(*aspeed
), GFP_KERNEL
);
542 aspeed
->dev
= &pdev
->dev
;
544 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
545 aspeed
->base
= devm_ioremap_resource(&pdev
->dev
, res
);
546 if (IS_ERR(aspeed
->base
))
547 return PTR_ERR(aspeed
->base
);
549 aspeed
->clk
= devm_clk_get(aspeed
->dev
, NULL
);
550 if (IS_ERR(aspeed
->clk
)) {
551 dev_err(aspeed
->dev
, "couldn't get clock\n");
552 return PTR_ERR(aspeed
->clk
);
554 rc
= clk_prepare_enable(aspeed
->clk
);
556 dev_err(aspeed
->dev
, "couldn't enable clock\n");
560 rc
= setup_cfam_reset(aspeed
);
562 dev_err(&pdev
->dev
, "CFAM reset GPIO setup failed\n");
565 writel(0x1, aspeed
->base
+ OPB_CLK_SYNC
);
566 writel(OPB1_XFER_ACK_EN
| OPB0_XFER_ACK_EN
,
567 aspeed
->base
+ OPB_IRQ_MASK
);
569 /* TODO: determine an appropriate value */
570 writel(0x10, aspeed
->base
+ OPB_RETRY_COUNTER
);
572 writel(ctrl_base
, aspeed
->base
+ OPB_CTRL_BASE
);
573 writel(fsi_base
, aspeed
->base
+ OPB_FSI_BASE
);
575 /* Set read data order */
576 writel(0x00030b1b, aspeed
->base
+ OPB0_READ_ORDER1
);
578 /* Set write data order */
579 writel(0x0011101b, aspeed
->base
+ OPB0_WRITE_ORDER1
);
580 writel(0x0c330f3f, aspeed
->base
+ OPB0_WRITE_ORDER2
);
583 * Select OPB0 for all operations.
584 * Will need to be reworked when enabling DMA or anything that uses
587 writel(0x1, aspeed
->base
+ OPB0_SELECT
);
589 rc
= opb_readl(aspeed
, ctrl_base
+ FSI_MVER
, &raw
);
591 dev_err(&pdev
->dev
, "failed to read hub version\n");
595 reg
= be32_to_cpu(raw
);
596 links
= (reg
>> 8) & 0xff;
597 dev_info(&pdev
->dev
, "hub version %08x (%d links)\n", reg
, links
);
599 aspeed
->master
.dev
.parent
= &pdev
->dev
;
600 aspeed
->master
.dev
.release
= aspeed_master_release
;
601 aspeed
->master
.dev
.of_node
= of_node_get(dev_of_node(&pdev
->dev
));
603 aspeed
->master
.n_links
= links
;
604 aspeed
->master
.read
= aspeed_master_read
;
605 aspeed
->master
.write
= aspeed_master_write
;
606 aspeed
->master
.send_break
= aspeed_master_break
;
607 aspeed
->master
.term
= aspeed_master_term
;
608 aspeed
->master
.link_enable
= aspeed_master_link_enable
;
610 dev_set_drvdata(&pdev
->dev
, aspeed
);
612 mutex_init(&aspeed
->lock
);
613 aspeed_master_init(aspeed
);
615 rc
= fsi_master_register(&aspeed
->master
);
619 /* At this point, fsi_master_register performs the device_initialize(),
620 * and holds the sole reference on master.dev. This means the device
621 * will be freed (via ->release) during any subsequent call to
622 * fsi_master_unregister. We add our own reference to it here, so we
623 * can perform cleanup (in _remove()) without it being freed before
626 get_device(&aspeed
->master
.dev
);
630 clk_disable_unprepare(aspeed
->clk
);
634 static int fsi_master_aspeed_remove(struct platform_device
*pdev
)
636 struct fsi_master_aspeed
*aspeed
= platform_get_drvdata(pdev
);
638 fsi_master_unregister(&aspeed
->master
);
639 clk_disable_unprepare(aspeed
->clk
);
644 static const struct of_device_id fsi_master_aspeed_match
[] = {
645 { .compatible
= "aspeed,ast2600-fsi-master" },
649 static struct platform_driver fsi_master_aspeed_driver
= {
651 .name
= "fsi-master-aspeed",
652 .of_match_table
= fsi_master_aspeed_match
,
654 .probe
= fsi_master_aspeed_probe
,
655 .remove
= fsi_master_aspeed_remove
,
658 module_platform_driver(fsi_master_aspeed_driver
);
659 MODULE_LICENSE("GPL");