From patchwork Wed Jul 6 14:53:12 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 102039 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp905504qgy; Wed, 6 Jul 2016 07:51:05 -0700 (PDT) X-Received: by 10.98.149.10 with SMTP id p10mr42922765pfd.88.1467816665749; Wed, 06 Jul 2016 07:51:05 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b6si4451697pay.102.2016.07.06.07.51.05; Wed, 06 Jul 2016 07:51:05 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755026AbcGFOux (ORCPT + 30 others); Wed, 6 Jul 2016 10:50:53 -0400 Received: from mout.kundenserver.de ([212.227.126.135]:52793 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754829AbcGFOut (ORCPT ); Wed, 6 Jul 2016 10:50:49 -0400 Received: from wuerfel.lan. ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue004) with ESMTPA (Nemesis) id 0MUjkW-1amnA52tB6-00Y7R1; Wed, 06 Jul 2016 16:50:17 +0200 From: Arnd Bergmann To: Mark Brown Cc: Alexander Shiyan , linux-spi@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Arnd Bergmann , linux-kernel@vger.kernel.org Subject: [PATCH 1/2] spi: clps711x: Driver refactor Date: Wed, 6 Jul 2016 16:53:12 +0200 Message-Id: <20160706145326.2658600-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:AJyzSn0gvVqqORbVgZBJzAM/hqXJC4QXj9XnSHC1QQY5+f5PU3Y wLeacSmZRWarXOWS7aFAt815yHsD6i5EJ6486sxPsl3c3I25vW8+xw2qwnqMyrEyE7ZExvm hVkOmNheCmfuMbvd7c9kbCmNOD6fTZVwiE5/+PS8AiMGS6LWdfw8DIMkYJ+HJe0OEQj6ZWX rOKmsEfkEKV9mXpPL4YkQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:usqvVB+25M4=:0rNA0cDady5Ose4sVcIhbI wcqV64S7Xgr/Ns7Php2vh6SVcmkZa0ciLndsmt+sPds+wj87PT90+ymh4rAZD7gOM2ZJXnMD2 wVEfOrxL/3ooTc4NvoJwXPtSf+7ouaSJdo+hZckLOOzHwxRWITvfG8mh1zNPIXtlUd+IfMJKs 2TQeY0h+i6A7B9ou+5QmO6fH80uAhTurZW5auGmuPY2BoTqU9091z9LwaDKg1YErIuNhUEi8x 2GC39YzE2WunwVjzPGqQET97N1QlM/6vODWnXrbKbXhLhEJfMBcKFcsTuGOiEE/Km1XokSsoS V1ufF5uCdWYbUMDcbVFQ04bNAdxNl4xMay1Tq1e/lmzlDSVqAzjVMs+W1uV9S0dmWgmO3U1+D 1C8SAyFEDxeTG7lPGLXQWxkxMC+581TZk4KKorbjbKT/M+QyY0cEySudxrCA3vmjJMs4Eyj3X QObfU6oxDFDpih65YR/vLs2cxz01O4OL974hFdm7QiqS1SWv5INjZs4E3+MH6TUwaE0QXUchh WqGMyhQFLV9b65mRZmCf5I6rMdVYtcs+l01UwyQA99+xC2CP+9OGmmtrqQeWlce25lHHac+Kw MChSNjf8PTh7tTDPo+UhSV4aPlv8DRZLqrQxkOeF4WApDGr7baEHcPbmGyxtNBlVQCRVO/V/V IgmlrL94hFcwl8t/2pvnaUsT/Z1aRreQl1L/0T/rPMx9I9zONnKeULSS6ToFmLsgHsvY= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexander Shiyan This is a complex patch for refactoring CLPS711X SPI driver. This change adds devicetree support and removes board support. Signed-off-by: Alexander Shiyan Signed-off-by: Arnd Bergmann --- drivers/spi/spi-clps711x.c | 69 +++++++++++++++++----------------------------- 1 file changed, 26 insertions(+), 43 deletions(-) -- 2.9.0 diff --git a/drivers/spi/spi-clps711x.c b/drivers/spi/spi-clps711x.c index 8c30de0315e7..18193df2eba8 100644 --- a/drivers/spi/spi-clps711x.c +++ b/drivers/spi/spi-clps711x.c @@ -1,7 +1,7 @@ /* * CLPS711X SPI bus driver * - * Copyright (C) 2012-2014 Alexander Shiyan + * Copyright (C) 2012-2016 Alexander Shiyan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -20,9 +19,8 @@ #include #include #include -#include -#define DRIVER_NAME "spi-clps711x" +#define DRIVER_NAME "clps711x-spi" #define SYNCIO_FRMLEN(x) ((x) << 8) #define SYNCIO_TXFRMEN (1 << 14) @@ -40,6 +38,17 @@ struct spi_clps711x_data { static int spi_clps711x_setup(struct spi_device *spi) { + if (!spi->controller_state) { + int ret; + + ret = devm_gpio_request(&spi->master->dev, spi->cs_gpio, + dev_name(&spi->master->dev)); + if (ret) + return ret; + + spi->controller_state = spi; + } + /* We are expect that SPI-device is not selected */ gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH)); @@ -104,20 +113,9 @@ static irqreturn_t spi_clps711x_isr(int irq, void *dev_id) static int spi_clps711x_probe(struct platform_device *pdev) { struct spi_clps711x_data *hw; - struct spi_clps711x_pdata *pdata = dev_get_platdata(&pdev->dev); struct spi_master *master; struct resource *res; - int i, irq, ret; - - if (!pdata) { - dev_err(&pdev->dev, "No platform data supplied\n"); - return -EINVAL; - } - - if (pdata->num_chipselect < 1) { - dev_err(&pdev->dev, "At least one CS must be defined\n"); - return -EINVAL; - } + int irq, ret; irq = platform_get_irq(pdev, 0); if (irq < 0) @@ -127,40 +125,24 @@ static int spi_clps711x_probe(struct platform_device *pdev) if (!master) return -ENOMEM; - master->cs_gpios = devm_kzalloc(&pdev->dev, sizeof(int) * - pdata->num_chipselect, GFP_KERNEL); - if (!master->cs_gpios) { - ret = -ENOMEM; - goto err_out; - } - - master->bus_num = pdev->id; + master->bus_num = -1; master->mode_bits = SPI_CPHA | SPI_CS_HIGH; master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 8); - master->num_chipselect = pdata->num_chipselect; + master->dev.of_node = pdev->dev.of_node; master->setup = spi_clps711x_setup; master->prepare_message = spi_clps711x_prepare_message; master->transfer_one = spi_clps711x_transfer_one; hw = spi_master_get_devdata(master); - for (i = 0; i < master->num_chipselect; i++) { - master->cs_gpios[i] = pdata->chipselect[i]; - ret = devm_gpio_request(&pdev->dev, master->cs_gpios[i], - DRIVER_NAME); - if (ret) { - dev_err(&pdev->dev, "Can't get CS GPIO %i\n", i); - goto err_out; - } - } - hw->spi_clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(hw->spi_clk)) { ret = PTR_ERR(hw->spi_clk); goto err_out; } - hw->syscon = syscon_regmap_lookup_by_pdevname("syscon.3"); + hw->syscon = + syscon_regmap_lookup_by_compatible("cirrus,ep7209-syscon3"); if (IS_ERR(hw->syscon)) { ret = PTR_ERR(hw->syscon); goto err_out; @@ -185,14 +167,8 @@ static int spi_clps711x_probe(struct platform_device *pdev) goto err_out; ret = devm_spi_register_master(&pdev->dev, master); - if (!ret) { - dev_info(&pdev->dev, - "SPI bus driver initialized. Master clock %u Hz\n", - master->max_speed_hz); + if (!ret) return 0; - } - - dev_err(&pdev->dev, "Failed to register master\n"); err_out: spi_master_put(master); @@ -200,9 +176,16 @@ err_out: return ret; } +static const struct of_device_id clps711x_spi_dt_ids[] = { + { .compatible = "cirrus,ep7209-spi", }, + { } +}; +MODULE_DEVICE_TABLE(of, clps711x_spi_dt_ids); + static struct platform_driver clps711x_spi_driver = { .driver = { .name = DRIVER_NAME, + .of_match_table = clps711x_spi_dt_ids, }, .probe = spi_clps711x_probe, };