All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Mamonov <pmamonov@gmail.com>
To: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
Cc: barebox@lists.infradead.org
Subject: Re: [PATCH] ata: new driver to support the internal sata controller on Armada-XP
Date: Thu, 26 Jan 2017 17:30:27 +0300	[thread overview]
Message-ID: <20170126143027.GB21086@berta> (raw)
In-Reply-To: <20170126100159.6036-1-u.kleine-koenig@pengutronix.de>

Hi Uwe,

Our approach for the same problem was to put SATA PHY initialization into the 
board specific code (I guess in your case it is 
arch/arm/boards/marvell-armada-xp-gp/board.c) and bind the generic ATA driver 
(drivers/ata/intf_platform_ide.c) via the device tree.

Regards,
Peter

On Thu, Jan 26, 2017 at 11:01:59AM +0100, Uwe Kleine-König wrote:
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
>  drivers/ata/Kconfig   |   5 ++
>  drivers/ata/Makefile  |   1 +
>  drivers/ata/sata_mv.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 132 insertions(+)
>  create mode 100644 drivers/ata/sata_mv.c
> 
> diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
> index 7850e4a9c967..0234c66c8ec8 100644
> --- a/drivers/ata/Kconfig
> +++ b/drivers/ata/Kconfig
> @@ -42,6 +42,11 @@ config DISK_AHCI_IMX
>  	depends on DISK_AHCI
>  	bool "i.MX AHCI support"
>  
> +config DISK_SATA_MV
> +	depends on ARCH_MVEBU
> +	select DISK_IDE_SFF
> +	bool "Marvell SATA support"
> +
>  comment "interface types"
>  
>  config DISK_INTF_PLATFORM_IDE
> diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
> index c444c4d1962e..6b83ae2ef542 100644
> --- a/drivers/ata/Makefile
> +++ b/drivers/ata/Makefile
> @@ -5,6 +5,7 @@ obj-$(CONFIG_DISK_IDE_SFF) += ide-sff.o
>  obj-$(CONFIG_DISK_ATA) += disk_ata_drive.o
>  obj-$(CONFIG_DISK_AHCI) += ahci.o
>  obj-$(CONFIG_DISK_AHCI_IMX) += sata-imx.o
> +obj-$(CONFIG_DISK_SATA_MV) += sata_mv.o
>  
>  # interface types
>  
> diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
> new file mode 100644
> index 000000000000..22b29d08a579
> --- /dev/null
> +++ b/drivers/ata/sata_mv.c
> @@ -0,0 +1,126 @@
> +#include <common.h>
> +#include <clock.h>
> +#include <driver.h>
> +#include <init.h>
> +#include <ata_drive.h>
> +
> +#include <asm/io.h>
> +
> +/* This can/should be moved to a more generic place */
> +static void ata_ioports_init(struct ata_ioports *io,
> +			     void *base_data, void *base_reg, void *base_alt,
> +			     unsigned stride)
> +{
> +	/* io->cmd_addr is unused */;
> +	io->data_addr = base_data;
> +	io->error_addr = base_reg + 1 * stride;
> +	/* io->feature_addr is unused */
> +	io->nsect_addr = base_reg + 2 * stride;
> +	io->lbal_addr = base_reg + 3 * stride;
> +	io->lbam_addr = base_reg + 4 * stride;
> +	io->lbah_addr = base_reg + 5 * stride;
> +	io->device_addr = base_reg + 6 * stride;
> +	io->status_addr = base_reg + 7 * stride;
> +	io->command_addr = base_reg + 7 * stride;
> +	/* io->altstatus_addr is unused */
> +
> +	if (base_alt)
> +		io->ctl_addr = base_alt;
> +	else
> +		io->ctl_addr = io->status_addr;
> +
> +	/* io->alt_dev_addr is unused */
> +}
> +
> +#define REG_WINDOW_CONTROL(n)	((n) * 0x10 + 0x30)
> +#define REG_WINDOW_BASE(n)	((n) * 0x10 + 0x34)
> +
> +#define REG_EDMA_COMMAND(n)	((n) * 0x2000 + 0x2028)
> +#define REG_EDMA_COMMAND__EATARST	0x00000004
> +
> +#define REG_ATA_BASE		0x2100
> +#define REG_SSTATUS(n)		((n) * 0x2000 + 0x2300)
> +#define REG_SCONTROL(n)		((n) * 0x2000 + 0x2308)
> +#define REG_SCONTROL__DET		0x0000000f
> +#define REG_SCONTROL__DET__INIT		0x00000001
> +#define REG_SCONTROL__DET__PHYOK	0x00000002
> +#define REG_SCONTROL__IPM		0x00000f00
> +#define REG_SCONTROL__IPM__PARTIAL	0x00000100
> +#define REG_SCONTROL__IPM__SLUMBER	0x00000200
> +
> +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;
> +}
> +
> +static const struct of_device_id mv_sata_dt_ids[] = {
> +	{
> +		.compatible = "marvell,armada-370-sata",
> +	}, {
> +		/* sentinel */
> +	}
> +};
> +
> +static struct driver_d mv_sata_driver = {
> +	.name = "mv_sata",
> +	.probe = mv_sata_probe,
> +	.of_compatible = mv_sata_dt_ids,
> +};
> +device_platform_driver(mv_sata_driver);
> -- 
> 2.11.0
> 
> 
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  reply	other threads:[~2017-01-26 14:31 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-26 10:01 [PATCH] ata: new driver to support the internal sata controller on Armada-XP Uwe Kleine-König
2017-01-26 14:30 ` Peter Mamonov [this message]
2017-02-14  8:49   ` Uwe Kleine-König
2017-02-24  7:20 ` Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170126143027.GB21086@berta \
    --to=pmamonov@gmail.com \
    --cc=barebox@lists.infradead.org \
    --cc=u.kleine-koenig@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.