static int imx_pata_probe(struct device_d *dev) { struct ide_port *ide; struct clk *clk; void __iomem *base; int ret; const char *devname = NULL; ide = xzalloc(sizeof(*ide)); base = dev_request_mem_region(dev, 0); clk = clk_get(dev, NULL); if (IS_ERR(clk)) { ret = PTR_ERR(clk); goto out_free; } imx_pata_setup_port(base + PATA_IMX_DRIVE_DATA, base + PATA_IMX_DRIVE_CONTROL, &ide->io, 2); /* deassert resets */ writel(PATA_IMX_ATA_CTRL_FIFO_RST_B | PATA_IMX_ATA_CTRL_ATA_RST_B, base + PATA_IMX_ATA_CONTROL); pata_imx_set_bus_timing(base, clk_get_rate(clk), 4); if (IS_ENABLED(CONFIG_OFDEVICE)) { devname = of_alias_get(dev->device_node); if (devname) devname = xstrdup(devname); } ide->port.dev = dev; ide->port.devname = devname; dev->priv = ide; dev->detect = pata_imx_detect; ret = ide_port_register(ide); if (ret) { dev_err(dev, "Cannot register IDE interface: %s\n", strerror(-ret)); goto out_free_clk; } return 0; out_free_clk: clk_put(clk); out_free: free(ide); return ret; }
static int mv_sata_probe(struct device_d *dev) { struct resource *iores; void __iomem *base; struct ide_port *ide; u32 scontrol; int ret, i; iores = dev_request_mem_resource(dev, 0); if (IS_ERR(iores)) { dev_err(dev, "Failed to request mem resources\n"); return PTR_ERR(iores); } base = IOMEM(iores->start); /* disable MBus windows */ for (i = 0; i < 4; ++i) { writel(0, base + REG_WINDOW_CONTROL(i)); writel(0, base + REG_WINDOW_BASE(i)); } /* enable first window */ writel(0x7fff0e01, base + REG_WINDOW_CONTROL(0)); writel(0, base + REG_WINDOW_BASE(0)); writel(REG_EDMA_COMMAND__EATARST, base + REG_EDMA_COMMAND(0)); udelay(25); writel(0x0, base + REG_EDMA_COMMAND(0)); scontrol = readl(base + REG_SCONTROL(0)); scontrol &= ~(REG_SCONTROL__DET | REG_SCONTROL__IPM); /* disable power management */ scontrol |= REG_SCONTROL__IPM__PARTIAL | REG_SCONTROL__IPM__SLUMBER; /* perform interface communication initialization */ writel(scontrol | REG_SCONTROL__DET__INIT, base + REG_SCONTROL(0)); writel(scontrol, base + REG_SCONTROL(0)); ret = wait_on_timeout(10 * MSECOND, (readl(base + REG_SSTATUS(0)) & REG_SCONTROL__DET) == (REG_SCONTROL__DET__INIT | REG_SCONTROL__DET__PHYOK)); if (ret) { dev_err(dev, "Failed to wait for phy (sstatus=0x%08x)\n", readl(base + REG_SSTATUS(0))); return ret; } ide = xzalloc(sizeof(*ide)); ide->port.dev = dev; ata_ioports_init(&ide->io, base + REG_ATA_BASE, base + REG_ATA_BASE, NULL, 4); dev->priv = ide; ret = ide_port_register(ide); if (ret) free(ide); return ret; }