From patchwork Thu Jan 9 04:59:01 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naveen Krishna Chatradhi X-Patchwork-Id: 3457201 Return-Path: X-Original-To: patchwork-linux-samsung-soc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id ABAB9C02DC for ; Thu, 9 Jan 2014 04:59:01 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id AA2052015B for ; Thu, 9 Jan 2014 04:59:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 90FA220149 for ; Thu, 9 Jan 2014 04:58:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753921AbaAIE6u (ORCPT ); Wed, 8 Jan 2014 23:58:50 -0500 Received: from mailout4.samsung.com ([203.254.224.34]:49235 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753876AbaAIE6p (ORCPT ); Wed, 8 Jan 2014 23:58:45 -0500 Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MZ4003O0B5VOY10@mailout4.samsung.com>; Thu, 09 Jan 2014 13:58:43 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.124]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id F7.C5.10364.38C2EC25; Thu, 09 Jan 2014 13:58:43 +0900 (KST) X-AuditID: cbfee690-b7f266d00000287c-e2-52ce2c83cf47 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 1D.4F.28157.38C2EC25; Thu, 09 Jan 2014 13:58:43 +0900 (KST) Received: from username-ubuntu.sisodomain.com ([107.108.83.161]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MZ400BYBB5QC300@mmp2.samsung.com>; Thu, 09 Jan 2014 13:58:43 +0900 (KST) From: Naveen Krishna Chatradhi To: linux-crypto@vger.kernel.org, linux-samsung-soc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, vzapolskiy@gmail.com, herbert@gondor.apana.org.au, naveenkrishna.ch@gmail.com, cpgs@samsung.com, tomasz.figa@gmail.com, "David S. Miller" Subject: [PATCH 2/6 v2] crypto:s5p-sss: Add device tree support Date: Thu, 09 Jan 2014 10:29:01 +0530 Message-id: <1389243541-13122-1-git-send-email-ch.naveen@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1389095509-14357-3-git-send-email-ch.naveen@samsung.com> References: <1389095509-14357-3-git-send-email-ch.naveen@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrLLMWRmVeSWpSXmKPExsWyRsSkRrdZ51yQwddfOhYvD2lazDnfwmLR /UrG4v69n0wWl3fNYbOYcX4fk8Wibf+ZLVbt+sNocXbOISYHTo8tK28yeeycdZfdY9sBVY++ LasYPT5vkgtgjeKySUnNySxLLdK3S+DKWHLzI2PBAsOKtz8vszUwnlPvYuTkkBAwkXj67CUr hC0mceHeerYuRi4OIYGljBJ9bUcYYYqm3DvLCJGYzihxd9cbZpCEkEA/k8SvN84gNpuAmcTB RavZQWwRAWeJ381rWEEamAWOMkp8nnORCSQhLGAv8e7BObCpLAKqEi8evwdbzSvgKjGt+xiQ zQG0TUFiziQbkDCngJvEj6lvmSB2uUrsvjMNbKaEwDp2iZa7bWwQcwQkvk0+xALRKyux6QAz xNGSEgdX3GCZwCi8gJFhFaNoakFyQXFSepGJXnFibnFpXrpecn7uJkZg0J/+92zCDsZ7B6wP MSYDjZvILCWanA+MmrySeENjMyMLUxNTYyNzSzPShJXEedUeJQUJCaQnlqRmp6YWpBbFF5Xm pBYfYmTi4JRqYAzYLVDNLJp4m9X+hmnKi3dTRD9Ytiz6O3v398rotx9qpHW36//qsUh8zhCh X6Ju2afEsi7O3liXv+lbMYPjHEXtH6tm7cpXUXPkyz0UW7l+w8OkJ91MzsEK1/w3qs/7IdjK 3lUm7C91zmruFxenC7a71W6J+X+pPhLTVHv3E49q5c3+X7dXKLEUZyQaajEXFScCAHaUxq6Q AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrFIsWRmVeSWpSXmKPExsVy+t9jQd1mnXNBBg2rVS1eHtK0mHO+hcWi +5WMxf17P5ksLu+aw2Yx4/w+JotF2/4zW6za9YfR4uycQ0wOnB5bVt5k8tg56y67x7YDqh59 W1YxenzeJBfAGtXAaJORmpiSWqSQmpecn5KZl26r5B0c7xxvamZgqGtoaWGupJCXmJtqq+Ti E6DrlpkDdI6SQlliTilQKCCxuFhJ3w7ThNAQN10LmMYIXd+QILgeIwM0kLCGMWPJzY+MBQsM K97+vMzWwHhOvYuRk0NCwERiyr2zjBC2mMSFe+vZuhi5OIQEpjNK3N31hhkkISTQzyTx640z iM0mYCZxcNFqdhBbRMBZ4nfzGlaQBmaBo4wSn+dcZAJJCAvYS7x7cA5sKouAqsSLx+9ZQWxe AVeJad3HgGwOoG0KEnMm2YCEOQXcJH5MfcsEsctVYvedaawTGHkXMDKsYhRNLUguKE5KzzXS K07MLS7NS9dLzs/dxAiOqWfSOxhXNVgcYhTgYFTi4V1RfDZIiDWxrLgy9xCjBAezkgjvX9Vz QUK8KYmVValF+fFFpTmpxYcYk4GOmsgsJZqcD4z3vJJ4Q2MTc1NjU0sTCxMzS9KElcR5D7Za BwoJpCeWpGanphakFsFsYeLglGpg3Ca3vGDHpU9qN92tJ4lUKTJoLpfpEzK5LLPialz4jdbp k3dziCT9/GuwikXqbrl6pR6DR/y9+kuLWqf3epi+0oveFd34McR4hruddOrrldHb59cLn73N c7hJQmvBVx2ZT6cDjl7o5O5Ye0a4m/XehYLec59+3J52hktJzJBfIVn3hXK6fpCKEktxRqKh FnNRcSIAduKzze0CAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, 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 This patch adds device tree support to the s5p-sss.c crypto driver. Implements a varient struct to address the changes in SSS hardware on various SoCs from Samsung. Also, Documentation under devicetree/bindings added. Signed-off-by: Naveen Krishna Ch CC: Herbert Xu CC: David S. Miller CC: Vladimir Zapolskiy TO: CC: --- Changes since v1: 1. Added description of the SSS module in Documentation 2. Corrected the interrupts description 3. Added varient struct instead of the version variable .../devicetree/bindings/crypto/samsung-sss.txt | 20 +++++ drivers/crypto/s5p-sss.c | 81 ++++++++++++++++++-- 2 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 Documentation/devicetree/bindings/crypto/samsung-sss.txt diff --git a/Documentation/devicetree/bindings/crypto/samsung-sss.txt b/Documentation/devicetree/bindings/crypto/samsung-sss.txt new file mode 100644 index 0000000..0e45b0d --- /dev/null +++ b/Documentation/devicetree/bindings/crypto/samsung-sss.txt @@ -0,0 +1,20 @@ +Samsung SoC SSS (Security SubSystem) module + +The SSS module in S5PV210 SoC supports the following: +-- Feeder (FeedCtrl) +-- Advanced Encryption Standard (AES) +-- Data Encryption Standard (DES)/3DES +-- Public Key Accelerator (PKA) +-- SHA-1/SHA-256/MD5/HMAC (SHA-1/SHA-256/MD5)/PRNG +-- PRNG: Pseudo Random Number Generator + +Required properties: + +- compatible : Should contain entries for this and backward compatible + SSS versions: + - "samsung,s5p-secss" for S5PV210 SoC. +- reg : Offset and length of the register set for the module +- interrupts : the interrupt-specifier for the SSS module. + Two interrupts "feed control and hash" in case of S5PV210 +- clocks : the required gating clock for the SSS module. +- clock-names : the gating clock name to be requested in the SSS driver. diff --git a/drivers/crypto/s5p-sss.c b/drivers/crypto/s5p-sss.c index 93cddeb..78e0c37 100644 --- a/drivers/crypto/s5p-sss.c +++ b/drivers/crypto/s5p-sss.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -145,6 +146,20 @@ #define AES_KEY_LEN 16 #define CRYPTO_QUEUE_LEN 1 +/** + * struct samsung_aes_varient - platform specific SSS driver data + * @has_hash_irq: true if SSS module uses hash interrupt, false otherwise + * @aes_offset: AES register offset from SSS module's base. + * + * Specifies platform specific configuration of SSS module. + * Note: A structure for driver specific platform data is used for future + * expansion of its usage. + */ +struct samsung_aes_varient { + bool has_hash_irq; + unsigned int aes_offset; +}; + struct s5p_aes_reqctx { unsigned long mode; }; @@ -173,10 +188,56 @@ struct s5p_aes_dev { struct crypto_queue queue; bool busy; spinlock_t lock; + + struct samsung_aes_varient *varient; }; static struct s5p_aes_dev *s5p_dev; +static struct samsung_aes_varient s5p_aes_data = { + .has_hash_irq = true, + .aes_offset = 0x4000, +}; + +static const struct platform_device_id s5p_sss_ids[] = { + { + .name = "s5p-secss", + .driver_data = (kernel_ulong_t)&s5p_aes_data, + }, + { }, +}; +MODULE_DEVICE_TABLE(platform, s5p_sss_ids); + +#ifdef CONFIG_OF +static const struct of_device_id s5p_sss_dt_match[] = { + { + .compatible = "samsung,s5p-secss", + .data = (void *)&s5p_aes_data, + }, + { }, +}; +MODULE_DEVICE_TABLE(of, s5p_sss_dt_match); +#else +static struct of_device_id s5p_sss_dt_match[] = { + { }, +}; +#endif + +static inline struct samsung_aes_varient *find_s5p_sss_version + (struct platform_device *pdev) +{ + if (IS_ENABLED(CONFIG_OF)) { + if (pdev->dev.of_node) { + const struct of_device_id *match; + match = of_match_node(s5p_sss_dt_match, + pdev->dev.of_node); + return (struct samsung_aes_varient *)match->data; + } + } + return (struct samsung_aes_varient *) + platform_get_device_id(pdev)->driver_data; +} + static void s5p_set_dma_indata(struct s5p_aes_dev *dev, struct scatterlist *sg) { SSS_WRITE(dev, FCBRDMAS, sg_dma_address(sg)); @@ -564,6 +625,7 @@ static int s5p_aes_probe(struct platform_device *pdev) struct s5p_aes_dev *pdata; struct device *dev = &pdev->dev; struct resource *res; + struct samsung_aes_varient *varient; if (s5p_dev) return -EEXIST; @@ -580,6 +642,8 @@ static int s5p_aes_probe(struct platform_device *pdev) resource_size(res), pdev->name)) return -EBUSY; + varient = find_s5p_sss_version(pdev); + pdata->clk = devm_clk_get(dev, "secss"); if (IS_ERR(pdata->clk)) { dev_err(dev, "failed to find secss clock source\n"); @@ -606,18 +670,21 @@ static int s5p_aes_probe(struct platform_device *pdev) } pdata->irq_hash = platform_get_irq(pdev, 1); - if (pdata->irq_hash < 0) { + if (varient->has_hash_irq && pdata->irq_hash < 0) { err = pdata->irq_hash; dev_warn(dev, "hash interrupt is not available.\n"); goto err_irq; } - err = devm_request_irq(dev, pdata->irq_hash, s5p_aes_interrupt, - IRQF_SHARED, pdev->name, pdev); - if (err < 0) { - dev_warn(dev, "hash interrupt is not available.\n"); - goto err_irq; + if (varient->has_hash_irq) { + err = devm_request_irq(dev, pdata->irq_hash, s5p_aes_interrupt, + IRQF_SHARED, pdev->name, pdev); + if (err < 0) { + dev_warn(dev, "hash interrupt is not available.\n"); + goto err_irq; + } } + pdata->varient = varient; pdata->dev = dev; platform_set_drvdata(pdev, pdata); s5p_dev = pdata; @@ -674,9 +741,11 @@ static int s5p_aes_remove(struct platform_device *pdev) static struct platform_driver s5p_aes_crypto = { .probe = s5p_aes_probe, .remove = s5p_aes_remove, + .id_table = s5p_sss_ids, .driver = { .owner = THIS_MODULE, .name = "s5p-secss", + .of_match_table = s5p_sss_dt_match, }, };