From patchwork Mon Feb 2 04:26:23 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kuninori Morimoto X-Patchwork-Id: 5759001 Return-Path: X-Original-To: patchwork-linux-sh@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id BF0D19F860 for ; Mon, 2 Feb 2015 04:26:33 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 9DF922013A for ; Mon, 2 Feb 2015 04:26:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5CADC2026C for ; Mon, 2 Feb 2015 04:26:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754803AbbBBE03 (ORCPT ); Sun, 1 Feb 2015 23:26:29 -0500 Received: from relmlor3.renesas.com ([210.160.252.173]:60184 "EHLO relmlie2.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754756AbbBBE02 (ORCPT ); Sun, 1 Feb 2015 23:26:28 -0500 Received: from unknown (HELO relmlir2.idc.renesas.com) ([10.200.68.152]) by relmlie2.idc.renesas.com with ESMTP; 02 Feb 2015 13:26:27 +0900 Received: from relmlac3.idc.renesas.com (relmlac3.idc.renesas.com [10.200.69.23]) by relmlir2.idc.renesas.com (Postfix) with ESMTP id 72A7A4E94C; Mon, 2 Feb 2015 13:26:27 +0900 (JST) Received: by relmlac3.idc.renesas.com (Postfix, from userid 0) id 592401806F; Mon, 2 Feb 2015 13:26:27 +0900 (JST) Received: from relmlac3.idc.renesas.com (localhost [127.0.0.1]) by relmlac3.idc.renesas.com (Postfix) with ESMTP id 4B2281800A; Mon, 2 Feb 2015 13:26:27 +0900 (JST) Received: from relmlii2.idc.renesas.com [10.200.68.66] by relmlac3.idc.renesas.com with ESMTP id PAS23760; Mon, 2 Feb 2015 13:26:27 +0900 X-IronPort-AV: E=Sophos;i="5.09,504,1418050800"; d="scan'208";a="180055422" Received: from mail-sg1lp0092.outbound.protection.outlook.com (HELO APAC01-SG1-obe.outbound.protection.outlook.com) ([207.46.51.92]) by relmlii2.idc.renesas.com with ESMTP/TLS/AES256-SHA; 02 Feb 2015 13:26:25 +0900 Received: from remon.renesas.com (211.11.155.132) by HKXPR06MB166.apcprd06.prod.outlook.com (10.242.124.18) with Microsoft SMTP Server (TLS) id 15.1.75.20; Mon, 2 Feb 2015 04:26:23 +0000 Message-ID: <87lhkhey4x.wl%kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto Subject: [PATCH 1/3 v3][RFC] dmaengine: rcar-audmapp: calculate chcr via src/dst addr User-Agent: Wanderlust/2.14.0 Emacs/23.3 Mule/6.0 MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") To: Magnus Damm , Arnd Bergmann , Vinod Koul , Geert Uytterhoeven CC: Simon , Mark Brown , Mark Brown , Linux-SH , Rob Herring , Laurent Pinchart , In-Reply-To: <87mw4xey70.wl%kuninori.morimoto.gx@renesas.com> References: <8761ekokpf.wl%kuninori.morimoto.gx@renesas.com> <5155160.jFIrOp4XSG@avalon> <877fwab63w.wl%kuninori.morimoto.gx@renesas.com> <5977920.SJUic98Q2P@avalon> <87mw4xey70.wl%kuninori.morimoto.gx@renesas.com> Date: Mon, 2 Feb 2015 04:26:23 +0000 X-Originating-IP: [211.11.155.132] X-ClientProxiedBy: HKNPR06CA0034.apcprd06.prod.outlook.com (10.141.16.24) To HKXPR06MB166.apcprd06.prod.outlook.com (10.242.124.18) Authentication-Results: gmail.com; dkim=none (message not signed) header.d=none; X-Microsoft-Antispam: UriScan:; X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:;SRVR:HKXPR06MB166; X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004); SRVR:HKXPR06MB166; X-Forefront-PRVS: 0475418F50 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(40100003)(23726002)(77096005)(53416004)(54356999)(83506001)(2950100001)(50466002)(33646002)(76176999)(77156002)(122386002)(62966003)(92566002)(42186005)(19580405001)(50986999)(87976001)(46406003)(229853001)(19580395003)(36756003)(47776003)(46102003)(86362001)(66066001)(575784001); DIR:OUT; SFP:1102; SCL:1; SRVR:HKXPR06MB166; H:remon.renesas.com; FPR:; SPF:None; MLV:sfv; LANG:en; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:;SRVR:HKXPR06MB166; X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Feb 2015 04:26:23.6946 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HKXPR06MB166 Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Current rcar-audmapp is assuming that CHCR value are specified from platform data or DTS bindings. but, it is possible to calculate CHCR settings from src/dst address. DTS bindings node can be reduced by this patch. For this update, new rcar-audmapp assumes DT has SSIU/DTCP/MLM/SCU register entry. Signed-off-by: Kuninori Morimoto --- v2 -> v3 - it assume DTS has reg-names - tidyup audmapp_addr_to_id() calculate method drivers/dma/sh/rcar-audmapp.c | 149 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 137 insertions(+), 12 deletions(-) diff --git a/drivers/dma/sh/rcar-audmapp.c b/drivers/dma/sh/rcar-audmapp.c index d95bbdd..29fe0c5 100644 --- a/drivers/dma/sh/rcar-audmapp.c +++ b/drivers/dma/sh/rcar-audmapp.c @@ -44,11 +44,22 @@ #define AUDMAPP_SLAVE_NUMBER 256 #define AUDMAPP_LEN_MAX (16 * 1024 * 1024) +struct id_addr_table { + u8 id; + u16 addr; +}; + +struct id_addr_table_entry { + char* name; + resource_size_t base_addr; + const struct id_addr_table *table; + int size; +}; + struct audmapp_chan { struct shdma_chan shdma_chan; void __iomem *base; dma_addr_t slave_addr; - u32 chcr; }; struct audmapp_device { @@ -64,6 +75,81 @@ struct audmapp_desc { dma_addr_t dst; }; +/* + * Gen2 SSIU/DTCP/MLM/SCU + */ +static const struct id_addr_table gen2_ssiu_id_table[] = { + {0x00, 0x0000}, /* SSI00 */ + {0x01, 0x0400}, /* SSI01 */ + {0x02, 0x0800}, /* SSI02 */ + {0x03, 0x0C00}, /* SSI03 */ + {0x04, 0x1000}, /* SSI10 */ + {0x05, 0x1400}, /* SSI11 */ + {0x06, 0x1800}, /* SSI12 */ + {0x07, 0x1C00}, /* SSI13 */ + {0x08, 0x2000}, /* SSI20 */ + {0x09, 0x2400}, /* SSI21 */ + {0x0a, 0x2800}, /* SSI22 */ + {0x0b, 0x2C00}, /* SSI23 */ + {0x0c, 0x3000}, /* SSI3 */ + {0x0d, 0x4000}, /* SSI4 */ + {0x0e, 0x5000}, /* SSI5 */ + {0x0f, 0x6000}, /* SSI6 */ + {0x10, 0x7000}, /* SSI7 */ + {0x11, 0x8000}, /* SSI8 */ + {0x12, 0x9000}, /* SSI90 */ + {0x13, 0x9400}, /* SSI91 */ + {0x14, 0x9800}, /* SSI92 */ + {0x15, 0x9C00}, /* SSI93 */ +}; +static const struct id_addr_table gen2_dtcp_id_tabel[] = { + {0x16, 0x0000}, /* DTCPPP0 */ + {0x17, 0x0400}, /* DTCPPP1 */ + {0x18, 0x4000}, /* DTCPCP0 */ + {0x19, 0x4400}, /* DTCPCP1 */ +}; +static const struct id_addr_table gen2_mlm_id_table[] = { + {0x25, 0x0000}, /* MLM0 */ + {0x26, 0x0400}, /* MLM1 */ + {0x27, 0x0800}, /* MLM2 */ + {0x28, 0x0C00}, /* MLM3 */ + {0x29, 0x1000}, /* MLM4 */ + {0x2a, 0x1400}, /* MLM5 */ + {0x2b, 0x1800}, /* MLM6 */ + {0x2c, 0x1C00}, /* MLM7 */ +}; +static const struct id_addr_table gen2_scu_id_table[] = { + {0x2d, 0x0000}, /* SCU_SRCI0 */ + {0x2e, 0x0400}, /* SCU_SRCI1 */ + {0x2f, 0x0800}, /* SCU_SRCI2 */ + {0x30, 0x0C00}, /* SCU_SRCI3 */ + {0x31, 0x1000}, /* SCU_SRCI4 */ + {0x32, 0x1400}, /* SCU_SRCI5 */ + {0x33, 0x1800}, /* SCU_SRCI6 */ + {0x34, 0x1C00}, /* SCU_SRCI7 */ + {0x35, 0x2000}, /* SCU_SRCI8 */ + {0x36, 0x2400}, /* SCU_SRCI9 */ + + {0x2d, 0x4000}, /* SCU_SRCO0 */ + {0x2e, 0x4400}, /* SCU_SRCO1 */ + {0x2f, 0x4800}, /* SCU_SRCO2 */ + {0x30, 0x4C00}, /* SCU_SRCO3 */ + {0x31, 0x5000}, /* SCU_SRCO4 */ + {0x32, 0x5400}, /* SCU_SRCO5 */ + {0x33, 0x5800}, /* SCU_SRCO6 */ + {0x34, 0x5C00}, /* SCU_SRCO7 */ + {0x35, 0x6000}, /* SCU_SRCO8 */ + {0x36, 0x6400}, /* SCU_SRCO9 */ + {0x37, 0x8000}, /* SCU_CMD0 */ + {0x38, 0x8400}, /* SCU_CMD1 */ +}; +static struct id_addr_table_entry gen2_entry[] = { + { "ssiu", 0, gen2_ssiu_id_table, ARRAY_SIZE(gen2_ssiu_id_table) }, + { "dtcp", 0, gen2_dtcp_id_tabel, ARRAY_SIZE(gen2_dtcp_id_tabel) }, + { "mlm", 0, gen2_mlm_id_table, ARRAY_SIZE(gen2_mlm_id_table) }, + { "scu", 0, gen2_scu_id_table, ARRAY_SIZE(gen2_scu_id_table) }, +}; + #define to_shdma_chan(c) container_of(c, struct shdma_chan, dma_chan) #define to_chan(chan) container_of(chan, struct audmapp_chan, shdma_chan) @@ -100,6 +186,36 @@ static void audmapp_halt(struct shdma_chan *schan) } } +static u32 audmapp_addr_to_id(struct audmapp_device *audev, u32 addr) +{ + struct id_addr_table_entry *entry; + struct device *dev = audev->dev; + int i, j; + + for (i = 0; i < ARRAY_SIZE(gen2_entry); i++) { + entry = gen2_entry + i; + if ((addr & 0xFFFF0000) == entry->base_addr) { + for (j = 0; j < entry->size; j++) { + if (entry->table[j].addr == (addr & 0xFFFF)) + return entry->table[j].id; + } + } + } + + dev_err(dev, "unknown addr (%x)\n", addr); + return 0xFF; +} + +static u32 audmapp_get_chcr(struct audmapp_device *audev, struct audmapp_desc *desc) +{ + u32 src_id, dst_id; + + src_id = audmapp_addr_to_id(audev, desc->src); + dst_id = audmapp_addr_to_id(audev, desc->dst); + + return src_id << 24 | dst_id << 16; +} + static void audmapp_start_xfer(struct shdma_chan *schan, struct shdma_desc *sdesc) { @@ -107,7 +223,7 @@ static void audmapp_start_xfer(struct shdma_chan *schan, struct audmapp_device *audev = to_dev(auchan); struct audmapp_desc *desc = to_desc(sdesc); struct device *dev = audev->dev; - u32 chcr = auchan->chcr | PDMACHCR_DE; + u32 chcr = audmapp_get_chcr(audev, desc) | PDMACHCR_DE; dev_dbg(dev, "src/dst/chcr = %pad/%pad/%08x\n", &desc->src, &desc->dst, chcr); @@ -118,19 +234,17 @@ static void audmapp_start_xfer(struct shdma_chan *schan, } static int audmapp_get_config(struct audmapp_chan *auchan, int slave_id, - u32 *chcr, dma_addr_t *dst) + dma_addr_t *dst) { struct audmapp_device *audev = to_dev(auchan); struct audmapp_pdata *pdata = audev->pdata; struct audmapp_slave_config *cfg; int i; - *chcr = 0; *dst = 0; if (!pdata) { /* DT */ - *chcr = ((u32)slave_id) << 16; - auchan->shdma_chan.slave_id = (slave_id) >> 8; + auchan->shdma_chan.slave_id = slave_id; return 0; } @@ -141,7 +255,6 @@ static int audmapp_get_config(struct audmapp_chan *auchan, int slave_id, for (i = 0, cfg = pdata->slave; i < pdata->slave_num; i++, cfg++) if (cfg->slave_id == slave_id) { - *chcr = cfg->chcr; *dst = cfg->dst; return 0; } @@ -153,18 +266,16 @@ static int audmapp_set_slave(struct shdma_chan *schan, int slave_id, dma_addr_t slave_addr, bool try) { struct audmapp_chan *auchan = to_chan(schan); - u32 chcr; dma_addr_t dst; int ret; - ret = audmapp_get_config(auchan, slave_id, &chcr, &dst); + ret = audmapp_get_config(auchan, slave_id, &dst); if (ret < 0) return ret; if (try) return 0; - auchan->chcr = chcr; auchan->slave_addr = slave_addr ? : dst; return 0; @@ -267,7 +378,7 @@ static struct dma_chan *audmapp_of_xlate(struct of_phandle_args *dma_spec, { dma_cap_mask_t mask; struct dma_chan *chan; - u32 chcr = dma_spec->args[0]; + u32 id = dma_spec->args[0]; if (dma_spec->args_count != 1) return NULL; @@ -277,7 +388,7 @@ static struct dma_chan *audmapp_of_xlate(struct of_phandle_args *dma_spec, chan = dma_request_channel(mask, shdma_chan_filter, NULL); if (chan) - to_shdma_chan(chan)->hw_req = chcr; + to_shdma_chan(chan)->hw_req = id; return chan; } @@ -290,6 +401,7 @@ static int audmapp_probe(struct platform_device *pdev) struct shdma_dev *sdev; struct dma_device *dma_dev; struct resource *res; + struct device *dev = &pdev->dev; int err, i; if (np) @@ -309,6 +421,19 @@ static int audmapp_probe(struct platform_device *pdev) if (IS_ERR(audev->chan_reg)) return PTR_ERR(audev->chan_reg); + for (i = 0; i < ARRAY_SIZE(gen2_entry); i++) { + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, + gen2_entry[i].name); + if (!res) + return -ENODEV; + + if (!devm_request_mem_region(dev, res->start, resource_size(res), + dev_name(dev))) + return -EIO; + + gen2_entry[i].base_addr = res->start; + } + sdev = &audev->shdma_dev; sdev->ops = &audmapp_shdma_ops; sdev->desc_size = sizeof(struct audmapp_desc);