Lines Matching +full:sata +full:- +full:0
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Cortina Systems Gemini SATA bridge add-on to Faraday FTIDE010
23 * struct sata_gemini - a state container for a Gemini SATA bridge
28 * @sata_bridge: if the device enables the SATA bridge
43 #define GEMINI_GLOBAL_MISC_CTRL 0x30
47 * Bits 26:24 are "IDE IO Select", which decides what SATA
50 * to one SATA adapter each, both acting as master, or one IDE
51 * blocks to two SATA adapters so the IDE block can act in a
55 * pins (not SATA pins) if (and only if) these are muxed in.
57 * 111-100 - Reserved
58 * Mode 0: 000 - ata0 master <-> sata0
59 * ata1 master <-> sata1
61 * Mode 1: 001 - ata0 master <-> sata0
62 * ata1 master <-> sata1
64 * Mode 2: 010 - ata1 master <-> sata1
65 * ata1 slave <-> sata0
68 * Mode 3: 011 - ata0 master <-> sata0
69 * ata1 slave <-> sata1
74 #define GEMINI_IDE_IOMUX_MODE0 (0 << 24)
81 * Registers directly controlling the PATA<->SATA adapters
83 #define GEMINI_SATA_ID 0x00
84 #define GEMINI_SATA_PHY_ID 0x04
85 #define GEMINI_SATA0_STATUS 0x08
86 #define GEMINI_SATA1_STATUS 0x0c
87 #define GEMINI_SATA0_CTRL 0x18
88 #define GEMINI_SATA1_CTRL 0x1c
92 #define GEMINI_SATA_STATUS_PHY_READY BIT(0)
103 #define GEMINI_SATA_CTRL_EN BIT(0)
116 return ERR_PTR(-EPROBE_DEFER); in gemini_sata_bridge_get()
122 if (!sg->sata_bridge) in gemini_sata_bridge_enabled()
126 * actually not connected to any SATA bridge. in gemini_sata_bridge_enabled()
128 if ((sg->muxmode == GEMINI_MUXMODE_2) && in gemini_sata_bridge_enabled()
131 if ((sg->muxmode == GEMINI_MUXMODE_3) && in gemini_sata_bridge_enabled()
141 return sg->muxmode; in gemini_sata_get_muxmode()
152 if (bridge == 0) { in gemini_sata_setup_bridge()
155 if (sg->muxmode == GEMINI_MUXMODE_2) in gemini_sata_setup_bridge()
157 writel(val, sg->base + GEMINI_SATA0_CTRL); in gemini_sata_setup_bridge()
161 if (sg->muxmode == GEMINI_MUXMODE_3) in gemini_sata_setup_bridge()
163 writel(val, sg->base + GEMINI_SATA1_CTRL); in gemini_sata_setup_bridge()
173 if (bridge == 0) in gemini_sata_setup_bridge()
174 val = readl(sg->base + GEMINI_SATA0_STATUS); in gemini_sata_setup_bridge()
176 val = readl(sg->base + GEMINI_SATA1_STATUS); in gemini_sata_setup_bridge()
183 dev_info(sg->dev, "SATA%d PHY %s\n", bridge, in gemini_sata_setup_bridge()
186 return bridge_online ? 0: -ENODEV; in gemini_sata_setup_bridge()
194 if (bridge == 0) in gemini_sata_start_bridge()
195 pclk = sg->sata0_pclk; in gemini_sata_start_bridge()
197 pclk = sg->sata1_pclk; in gemini_sata_start_bridge()
215 if (bridge == 0) in gemini_sata_stop_bridge()
216 clk_disable(sg->sata0_pclk); in gemini_sata_stop_bridge()
218 clk_disable(sg->sata1_pclk); in gemini_sata_stop_bridge()
224 struct device *dev = sg->dev; in gemini_sata_bridge_init()
228 sg->sata0_pclk = devm_clk_get(dev, "SATA0_PCLK"); in gemini_sata_bridge_init()
229 if (IS_ERR(sg->sata0_pclk)) { in gemini_sata_bridge_init()
231 return -ENODEV; in gemini_sata_bridge_init()
233 sg->sata1_pclk = devm_clk_get(dev, "SATA1_PCLK"); in gemini_sata_bridge_init()
234 if (IS_ERR(sg->sata1_pclk)) { in gemini_sata_bridge_init()
236 return -ENODEV; in gemini_sata_bridge_init()
239 ret = clk_prepare_enable(sg->sata0_pclk); in gemini_sata_bridge_init()
244 ret = clk_prepare_enable(sg->sata1_pclk); in gemini_sata_bridge_init()
247 clk_disable_unprepare(sg->sata0_pclk); in gemini_sata_bridge_init()
251 sata_id = readl(sg->base + GEMINI_SATA_ID); in gemini_sata_bridge_init()
252 sata_phy_id = readl(sg->base + GEMINI_SATA_PHY_ID); in gemini_sata_bridge_init()
253 sg->sata_bridge = true; in gemini_sata_bridge_init()
254 clk_disable(sg->sata0_pclk); in gemini_sata_bridge_init()
255 clk_disable(sg->sata1_pclk); in gemini_sata_bridge_init()
257 dev_info(dev, "SATA ID %08x, PHY ID: %08x\n", sata_id, sata_phy_id); in gemini_sata_bridge_init()
259 return 0; in gemini_sata_bridge_init()
282 return 0; in gemini_setup_ide_pins()
287 struct device *dev = &pdev->dev; in gemini_sata_probe()
288 struct device_node *np = dev->of_node; in gemini_sata_probe()
298 return -ENOMEM; in gemini_sata_probe()
299 sg->dev = dev; in gemini_sata_probe()
301 sg->base = devm_platform_ioremap_resource(pdev, 0); in gemini_sata_probe()
302 if (IS_ERR(sg->base)) in gemini_sata_probe()
303 return PTR_ERR(sg->base); in gemini_sata_probe()
311 /* Set up the SATA bridge if need be */ in gemini_sata_probe()
312 if (of_property_read_bool(np, "cortina,gemini-enable-sata-bridge")) { in gemini_sata_probe()
318 if (of_property_read_bool(np, "cortina,gemini-enable-ide-pins")) in gemini_sata_probe()
319 sg->ide_pins = true; in gemini_sata_probe()
321 if (!sg->sata_bridge && !sg->ide_pins) { in gemini_sata_probe()
322 dev_err(dev, "neither SATA bridge or IDE output enabled\n"); in gemini_sata_probe()
323 ret = -EINVAL; in gemini_sata_probe()
327 ret = of_property_read_u32(np, "cortina,gemini-ata-muxmode", &muxmode); in gemini_sata_probe()
334 ret = -EINVAL; in gemini_sata_probe()
337 sg->muxmode = muxmode; in gemini_sata_probe()
344 ret = -ENODEV; in gemini_sata_probe()
353 if (sg->ide_pins) { in gemini_sata_probe()
359 dev_info(dev, "set up the Gemini IDE/SATA nexus\n"); in gemini_sata_probe()
363 return 0; in gemini_sata_probe()
366 if (sg->sata_bridge) { in gemini_sata_probe()
367 clk_unprepare(sg->sata1_pclk); in gemini_sata_probe()
368 clk_unprepare(sg->sata0_pclk); in gemini_sata_probe()
377 if (sg->sata_bridge) { in gemini_sata_remove()
378 clk_unprepare(sg->sata1_pclk); in gemini_sata_remove()
379 clk_unprepare(sg->sata0_pclk); in gemini_sata_remove()
385 { .compatible = "cortina,gemini-sata-bridge", },
400 MODULE_DESCRIPTION("low level driver for Cortina Systems Gemini SATA bridge");