From patchwork Fri Dec 30 14:01:18 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartlomiej Zolnierkiewicz X-Patchwork-Id: 709789 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3tqp7s1FSXz9sXx for ; Sat, 31 Dec 2016 01:02:33 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754258AbcL3OCG (ORCPT ); Fri, 30 Dec 2016 09:02:06 -0500 Received: from mailout3.samsung.com ([203.254.224.33]:32977 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754249AbcL3OCF (ORCPT ); Fri, 30 Dec 2016 09:02:05 -0500 Received: from epcas5p1.samsung.com (unknown [182.195.41.39]) by mailout3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OJ0030OX4B02B00@mailout3.samsung.com>; Fri, 30 Dec 2016 23:01:48 +0900 (KST) Received: from epsmges5p4.samsung.com (unknown [182.195.42.88]) by epcas5p1.samsung.com (KnoxPortal) with ESMTP id 20161230140148epcas5p12fd987b19d173f54836ce5eae58be616~VDYLgvVG33082830828epcas5p1-; Fri, 30 Dec 2016 14:01:48 +0000 (GMT) Received: from epcas5p2.samsung.com ( [182.195.41.40]) by epsmges5p4.samsung.com (EPCPMTA) with SMTP id 25.27.06849.BC866685; Fri, 30 Dec 2016 23:01:48 +0900 (KST) Received: from epcpsbgm2new.samsung.com (u27.gpu120.samsung.co.kr [203.254.230.27]) by epcas5p1.samsung.com (KnoxPortal) with ESMTP id 20161230140147epcas5p1fa7e99f39921a8ee90aabd59ff7b7645~VDYK2QTo91386113861epcas5p1I; Fri, 30 Dec 2016 14:01:47 +0000 (GMT) X-AuditID: b6c32a58-f79726d000001ac1-f4-586668cbfed3 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2new.samsung.com (EPCPMTA) with SMTP id 67.1E.28332.BC866685; Fri, 30 Dec 2016 23:01:47 +0900 (KST) Received: from AMDC3058.DIGITAL.local ([106.120.53.102]) by mmp1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OJ000IUZ4AJRS20@mmp1.samsung.com>; Fri, 30 Dec 2016 23:01:47 +0900 (KST) From: Bartlomiej Zolnierkiewicz To: Tejun Heo Cc: Geert Uytterhoeven , Michael Schmitz , linux-ide@vger.kernel.org, linux-m68k@lists.linux-m68k.org, linux-kernel@vger.kernel.org, b.zolnierkie@samsung.com Subject: [PATCH 3/3] ata: add Atari Falcon PATA controller driver Date: Fri, 30 Dec 2016 15:01:18 +0100 Message-id: <1483106478-1382-4-git-send-email-b.zolnierkie@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1483106478-1382-1-git-send-email-b.zolnierkie@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAAzWRb0gTcRjH/e1ut3Ps4jrFHvwzaZiZ0kpQODQiQ+pCgtir0Zu68twsp2On or1pb5xmGEuraVkqJdIgh8v/qdTELS10/klE+mf5h0JMk6IUI7fTd5/neT7P9+HHj8QYPx5J 5uYXCpZ8Pk9DKPHOwUMJh98ac/RH+1yIbat1ydnF2X4Z6+3+ImMne+sJtmX+GcY+LHMo2I2W IXRCwfXc/6Dg3M4bBOcZrEDccNlvnLvV7kTcult9jjivPJYt5OUWC5Yjxy8qjVbrAGZeTS0Z XWrFrcibVIlCSaBT4HX5U0LiCPB/dAWZoZsRzP2MlbhcBj/+qnb9iul1vBIpt/stCEbsHYRU bCBoGtmQBSyCToPb5U4U4HA6BqbuzaGAhNFjCHy+JnlgEEZnwFBngyLAOH0AHlWOB09T9Gno WZb6QKth2FsT9ENpDmo+eRWBIKA3CegYq9teILeLGHC/xCQ/E+5MPpFLHAbffe07OVGw1TyL JHYg6NoEKec5AucL+46UDoO+8eAyRu+Bqs15mZRPQYWNkRQOVifWdm5lwMpU/87rHyAYrZ7E 7Si6EYU4UYRgFk0GQUw1p2hF3iQW5Ru0lwtMbhT850R9N/pXq/MgmkQaFfWnWNAzcr5YLDV5 EJCYJpzy5uToGSqbL70mWAouWIryBNGDokhcs49qLEnXM7SBLxSuCoJZsOxOZWRopBVdbz3V uaz+Fd9PJdne7eVtW3Zjre6xf3/c3feXFvz66plepiGBLci0gG1IRU9QDlvqCKgxVzzzpi2r 7yxeh+LWrlTJTi4taDWOrG/R4dqeg8lqVULfq8Wu3mivcUU30LjlWlzXpeFfz9yMcKpm6kOU ycrPS1mxKsNAw7QGF418ciJmEfn/JgHCXOMCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrMLMWRmVeSWpSXmKPExsVy+t9jAd3TGWkRBtM+CFlsnLGe1eLZrb1M Fsd2PGKyuLxrDpvF8idrmS3mtk5nt/i1/CijA7vHzll32T02repk8zh0uIPR42TrNxaPvi2r GD0+b5ILYItys8lITUxJLVJIzUvOT8nMS7dVCg1x07VQUshLzE21VYrQ9Q0JUlIoS8wpBfKM DNCAg3OAe7CSvl2CW0ZDwz7mgg+mFeeer2NpYDym3cXIySEhYCLRce0zC4QtJnHh3nq2LkYu DiGBpYwSb95PgHJ+MUrsXf6BFaSKTcBKYmL7KkYQW0RAVuLKtIeMIEXMAueBOl7dYgNJCAs4 ShzdNp8dxGYRUJWY13URLM4r4C6x8w1EXEJATuLksclgQzkFPCQm3z8GFhcCqlm4Ywb7BEbe BYwMqxglUguSC4qT0nON8lLL9YoTc4tL89L1kvNzNzGCA/yZ9A7Gw7vcDzEKcDAq8fD+KEuN EGJNLCuuzD3EKMHBrCTCeywtLUKINyWxsiq1KD++qDQntfgQoynQYROZpUST84HRl1cSb2hi bmJubGBhbmlpYqQkzts4+1m4kEB6YklqdmpqQWoRTB8TB6dUA6NTUrqxzyVPfZbkUDlx4RPH 1s6auuO9duJm7zpPdam6pIZO+YP31/w+NU9h8bu49V/iQw733JKX2HZVey97maCFAPvCc/3z i+JsH5q/Up38fm+Iphr/zyrPaYZsN19HMwReTXk7y/bK8x8JmUKLdhz4XR260ldY4Yv5NtHw Nq2US0dvRa+VdlZiKc5INNRiLipOBAB1xO8shgIAAA== X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20161230140147epcas5p1fa7e99f39921a8ee90aabd59ff7b7645 X-Msg-Generator: CA X-Sender-IP: 203.254.230.27 X-Local-Sender: =?UTF-8?B?QmFydGxvbWllaiBab2xuaWVya2lld2ljehtTUlBPTC1LZXJu?= =?UTF-8?B?ZWwgKFRQKRvsgrzshLHsoITsnpAbU2VuaW9yIFNvZnR3YXJlIEVuZ2luZWVy?= X-Global-Sender: =?UTF-8?B?QmFydGxvbWllaiBab2xuaWVya2lld2ljehtTUlBPTC1LZXJu?= =?UTF-8?B?ZWwgKFRQKRtTYW1zdW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBF?= =?UTF-8?B?bmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 105P X-HopCount: 7 X-CMS-RootMailID: 20161230140147epcas5p1fa7e99f39921a8ee90aabd59ff7b7645 X-RootMTR: 20161230140147epcas5p1fa7e99f39921a8ee90aabd59ff7b7645 References: <1483106478-1382-1-git-send-email-b.zolnierkie@samsung.com> Sender: linux-ide-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org Add Atari Falcon PATA controller driver. The major difference when compared to legacy IDE's falconide host driver is that we are using polled PIO mode and thus avoiding the need for STDMA locking magic altogether. Tested under ARAnyM emulator. Signed-off-by: Bartlomiej Zolnierkiewicz --- drivers/ata/Kconfig | 9 +++ drivers/ata/Makefile | 1 + drivers/ata/pata_falcon.c | 184 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 194 insertions(+) create mode 100644 drivers/ata/pata_falcon.c diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index da19fc9..cbd1019 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig @@ -895,6 +895,15 @@ config PATA_CMD640_PCI If unsure, say N. +config PATA_FALCON + tristate "Atari Falcon PATA support" + depends on M68K && ATARI + help + This option enables support for the on-board IDE + interface on the Atari Falcon. + + If unsure, say N. + config PATA_ISAPNP tristate "ISA Plug and Play PATA support" depends on ISAPNP diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile index a46e6b7..89a0a19 100644 --- a/drivers/ata/Makefile +++ b/drivers/ata/Makefile @@ -93,6 +93,7 @@ obj-$(CONFIG_PATA_WINBOND) += pata_sl82c105.o obj-$(CONFIG_PATA_AT32) += pata_at32.o obj-$(CONFIG_PATA_AT91) += pata_at91.o obj-$(CONFIG_PATA_CMD640_PCI) += pata_cmd640.o +obj-$(CONFIG_PATA_FALCON) += pata_falcon.o obj-$(CONFIG_PATA_ISAPNP) += pata_isapnp.o obj-$(CONFIG_PATA_IXP4XX_CF) += pata_ixp4xx_cf.o obj-$(CONFIG_PATA_MPIIX) += pata_mpiix.o diff --git a/drivers/ata/pata_falcon.c b/drivers/ata/pata_falcon.c new file mode 100644 index 0000000..7826408 --- /dev/null +++ b/drivers/ata/pata_falcon.c @@ -0,0 +1,184 @@ +/* + * Atari Falcon PATA controller driver + * + * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * + * Based on falconide.c: + * + * Created 12 Jul 1997 by Geert Uytterhoeven + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define DRV_NAME "pata_falcon" +#define DRV_VERSION "0.1.0" + +#define ATA_HD_BASE 0xfff00000 +#define ATA_HD_CONTROL 0x39 + +static struct scsi_host_template pata_falcon_sht = { + ATA_PIO_SHT(DRV_NAME), +}; + +static unsigned int pata_falcon_data_xfer(struct ata_queued_cmd *qc, + unsigned char *buf, + unsigned int buflen, int rw) +{ + struct ata_device *dev = qc->dev; + struct ata_port *ap = dev->link->ap; + void __iomem *data_addr = ap->ioaddr.data_addr; + unsigned int words = buflen >> 1; + struct scsi_cmnd *cmd = qc->scsicmd; + bool swap = 1; + + if (dev->class == ATA_DEV_ATA && cmd && cmd->request && + cmd->request->cmd_type == REQ_TYPE_FS) + swap = 0; + + /* Transfer multiple of 2 bytes */ + if (rw == READ) { + if (swap) + raw_insw_swapw((u16 *)data_addr, (u16 *)buf, words); + else + raw_insw((u16 *)data_addr, (u16 *)buf, words); + } else { + if (swap) + raw_outsw_swapw((u16 *)data_addr, (u16 *)buf, words); + else + raw_outsw((u16 *)data_addr, (u16 *)buf, words); + } + + /* Transfer trailing byte, if any. */ + if (unlikely(buflen & 0x01)) { + unsigned char pad[2] = { }; + + /* Point buf to the tail of buffer */ + buf += buflen - 1; + + if (rw == READ) { + if (swap) + raw_insw_swapw((u16 *)data_addr, (u16 *)pad, 1); + else + raw_insw((u16 *)data_addr, (u16 *)pad, 1); + *buf = pad[0]; + } else { + pad[0] = *buf; + if (swap) + raw_outsw_swapw((u16 *)data_addr, (u16 *)pad, 1); + else + raw_outsw((u16 *)data_addr, (u16 *)pad, 1); + } + words++; + } + + return words << 1; +} + +/* + * Provide our own set_mode() as we don't want to change anything that has + * already been configured.. + */ +static int pata_falcon_set_mode(struct ata_link *link, + struct ata_device **unused) +{ + struct ata_device *dev; + + ata_for_each_dev(dev, link, ENABLED) { + /* We don't really care */ + dev->pio_mode = dev->xfer_mode = XFER_PIO_0; + dev->xfer_shift = ATA_SHIFT_PIO; + dev->flags |= ATA_DFLAG_PIO; + ata_dev_info(dev, "configured for PIO\n"); + } + return 0; +} + +static struct ata_port_operations pata_falcon_ops = { + .inherits = &ata_sff_port_ops, + .sff_data_xfer = pata_falcon_data_xfer, + .cable_detect = ata_cable_unknown, + .set_mode = pata_falcon_set_mode, +}; + +static int pata_falcon_init_one(void) +{ + struct ata_host *host; + struct ata_port *ap; + struct platform_device *pdev; + void __iomem *base; + + if (!MACH_IS_ATARI || !ATARIHW_PRESENT(IDE)) + return -ENODEV; + + pr_info(DRV_NAME ": Atari Falcon PATA controller\n"); + + pdev = platform_device_register_simple(DRV_NAME, 0, NULL, 0); + if (IS_ERR(pdev)) + return PTR_ERR(pdev); + + if (!devm_request_mem_region(&pdev->dev, ATA_HD_BASE, 0x40, DRV_NAME)) { + pr_err(DRV_NAME ": resources busy\n"); + return -EBUSY; + } + + /* allocate host */ + host = ata_host_alloc(&pdev->dev, 1); + if (!host) + return -ENOMEM; + ap = host->ports[0]; + + ap->ops = &pata_falcon_ops; + ap->pio_mask = ATA_PIO4; + ap->flags |= ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_IORDY; + ap->flags |= ATA_FLAG_PIO_POLLING; + + base = (void __iomem *)ATA_HD_BASE; + ap->ioaddr.data_addr = base; + ap->ioaddr.error_addr = base + 1 + 1 * 4; + ap->ioaddr.feature_addr = base + 1 + 1 * 4; + ap->ioaddr.nsect_addr = base + 1 + 2 * 4; + ap->ioaddr.lbal_addr = base + 1 + 3 * 4; + ap->ioaddr.lbam_addr = base + 1 + 4 * 4; + ap->ioaddr.lbah_addr = base + 1 + 5 * 4; + ap->ioaddr.device_addr = base + 1 + 6 * 4; + ap->ioaddr.status_addr = base + 1 + 7 * 4; + ap->ioaddr.command_addr = base + 1 + 7 * 4; + + ap->ioaddr.altstatus_addr = base + ATA_HD_CONTROL; + ap->ioaddr.ctl_addr = base + ATA_HD_CONTROL; + + ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx", (unsigned long)base, + (unsigned long)base + ATA_HD_CONTROL); + + /* activate */ + return ata_host_activate(host, 0, NULL, 0, &pata_falcon_sht); +} + +module_init(pata_falcon_init_one); + +MODULE_AUTHOR("Bartlomiej Zolnierkiewicz"); +MODULE_DESCRIPTION("low-level driver for Atari Falcon PATA"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(DRV_VERSION);