Lines Matching +full:slave +full:- +full:mode
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
26 * @muxmode: the current muxing mode
52 * master/slave configuration.
57 * 111-100 - Reserved
58 * Mode 0: 000 - ata0 master <-> sata0
59 * ata1 master <-> sata1
60 * ata0 slave interface brought out on IDE pads
61 * Mode 1: 001 - ata0 master <-> sata0
62 * ata1 master <-> sata1
63 * ata1 slave interface brought out on IDE pads
64 * Mode 2: 010 - ata1 master <-> sata1
65 * ata1 slave <-> sata0
66 * ata0 master and slave interfaces brought out
68 * Mode 3: 011 - ata0 master <-> sata0
69 * ata1 slave <-> sata1
70 * ata1 master and slave interfaces brought out
81 * Registers directly controlling the PATA<->SATA adapters
116 return ERR_PTR(-EPROBE_DEFER); in gemini_sata_bridge_get()
122 if (!sg->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()
154 /* SATA0 slave mode is only used in muxmode 2 */ 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()
160 /* SATA1 slave mode is only used in muxmode 3 */ 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()
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()
195 pclk = sg->sata0_pclk; in gemini_sata_start_bridge()
197 pclk = sg->sata1_pclk; in gemini_sata_start_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()
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()
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()
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()
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", },