From patchwork Wed Jun 20 12:56:43 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 9494 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 5A1EF23E1B for ; Wed, 20 Jun 2012 12:57:14 +0000 (UTC) Received: from mail-yx0-f180.google.com (mail-yx0-f180.google.com [209.85.213.180]) by fiordland.canonical.com (Postfix) with ESMTP id 29983A182F0 for ; Wed, 20 Jun 2012 12:57:14 +0000 (UTC) Received: by mail-yx0-f180.google.com with SMTP id q6so6159139yen.11 for ; Wed, 20 Jun 2012 05:57:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to:cc :subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=2P2ShRPQcAtm5+jfrQBHPlchfke4+UbNTcZj77rPukw=; b=XixTBe4rPW6g83Ask6lOxwDiE0xIt6cs7nz9uJ1cEMRjldF5ZtGtjVXUye+o1FeEh5 lE4R+VdiB8vcO2kkjO+SXN7jXTEuvOsCypuTJ3l6VS/RlrrPJAVtUK/0O8FlzAPlXvO0 HB4HjzkicEVbVZ4+1edhmDZ4H5BZxS26H/JbtALrmlPyIKUg7H3FD3q0uXlcbbOEzCJo XhmS6sVYqfoVvM91ewUwyGItWIphdne8meFfJwIJ9vmAx/SM39+Yzlqr+uoK8Umdhjp3 iSkXp/FHJzlJ+dJlxY5NctKQvt1SeyRw+YFsGlO+9xIyFwWMzQzXPswBEsUXX3WbYWqS NDWA== Received: by 10.50.203.39 with SMTP id kn7mr4310505igc.53.1340197033771; Wed, 20 Jun 2012 05:57:13 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.231.24.148 with SMTP id v20csp178543ibb; Wed, 20 Jun 2012 05:57:12 -0700 (PDT) Received: by 10.216.144.216 with SMTP id n66mr1901480wej.107.1340197032219; Wed, 20 Jun 2012 05:57:12 -0700 (PDT) Received: from mail-wi0-f170.google.com (mail-wi0-f170.google.com [209.85.212.170]) by mx.google.com with ESMTPS id 50si28836495wet.124.2012.06.20.05.57.11 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 20 Jun 2012 05:57:12 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.212.170 is neither permitted nor denied by best guess record for domain of lee.jones@linaro.org) client-ip=209.85.212.170; Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.212.170 is neither permitted nor denied by best guess record for domain of lee.jones@linaro.org) smtp.mail=lee.jones@linaro.org Received: by wibhq12 with SMTP id hq12so930341wib.1 for ; Wed, 20 Jun 2012 05:57:11 -0700 (PDT) Received: by 10.216.213.143 with SMTP id a15mr13605262wep.156.1340197031504; Wed, 20 Jun 2012 05:57:11 -0700 (PDT) Received: from localhost.localdomain (cpc1-aztw13-0-0-cust473.18-1.cable.virginmedia.com. [77.102.241.218]) by mx.google.com with ESMTPS id gc6sm38878374wib.0.2012.06.20.05.57.09 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 20 Jun 2012 05:57:10 -0700 (PDT) From: Lee Jones To: linux-arm-kernel@lists.infradead.org Cc: linus.walleij@stericsson.com, arnd@arndb.de, grant.likely@secretlab.ca, linux@arm.linux.org.uk, broonie@opensource.wolfsonmicro.com, Lee Jones , linux-i2c@vger.kernel.org Subject: [PATCH 07/15] i2c: Add Device Tree support to the Nomadik I2C driver Date: Wed, 20 Jun 2012 13:56:43 +0100 Message-Id: <1340197011-5435-8-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1340197011-5435-1-git-send-email-lee.jones@linaro.org> References: <1340197011-5435-1-git-send-email-lee.jones@linaro.org> X-Gm-Message-State: ALoCoQkTasvMpto/iQnQaSBbEtQbp42Z1WLnz7GUHyu2f2Kx7YqVyQ3Mlypcac+tAQX4Wuoenheb Here we apply the bindings required for successful Device Tree probing of the i2c-nomadik driver. We also apply a fall-back configuration in case either one is not provided, or a required element is missing from the one supplied. Cc: linux-i2c@vger.kernel.org Signed-off-by: Lee Jones --- drivers/i2c/busses/i2c-nomadik.c | 90 +++++++++++++++++++++++++++++++++++--- 1 file changed, 84 insertions(+), 6 deletions(-) diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index a92440d..5611c62 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -333,10 +334,6 @@ static void setup_i2c_controller(struct nmk_i2c_dev *dev) i2c_clk = clk_get_rate(dev->clk); - /* fallback to std. mode if machine has not provided it */ - if (dev->cfg.clk_freq == 0) - dev->cfg.clk_freq = 100000; - /* * The spec says, in case of std. mode the divider is * 2 whereas it is 3 for fast and fastplus mode of @@ -899,15 +896,90 @@ static const struct i2c_algorithm nmk_i2c_algo = { .functionality = nmk_i2c_functionality }; +static struct nmk_i2c_controller u8500_i2c = { + /* + * Slave data setup time; 250ns, 100ns, and 10ns, which + * is 14, 6 and 2 respectively for a 48Mhz i2c clock. + */ + .slsu = 0xe, + .tft = 1, /* Tx FIFO threshold */ + .rft = 8, /* Rx FIFO threshold */ + .clk_freq = 100000, /* std. mode operation */ + .timeout = 200, /* Slave response timeout(ms) */ + .sm = I2C_FREQ_MODE_FAST, +}; + +static int __devinit +nmk_i2c_of_probe(struct device_node *np, struct nmk_i2c_controller *pdata) +{ + of_property_read_u32(np, "clock-frequency", (u32*)&pdata->clk_freq); + if (!pdata->clk_freq) { + pr_warn("%s: Clock frequency not found\n", np->full_name); + return -EINVAL; + } + + of_property_read_u32(np, "stericsson,slsu", (u32*)&pdata->slsu); + if (!pdata->slsu) { + pr_warn("%s: Data line delay not found\n", np->full_name); + return -EINVAL; + } + + of_property_read_u32(np, "stericsson,tft", (u32*)&pdata->tft); + if (!pdata->tft) { + pr_warn("%s: Tx FIFO threshold not found\n", np->full_name); + return -EINVAL; + } + + of_property_read_u32(np, "stericsson,rft", (u32*)&pdata->rft); + if (!pdata->rft) { + pr_warn("%s: Rx FIFO threshold not found\n", np->full_name); + return -EINVAL; + } + + of_property_read_u32(np, "stericsson,timeout", (u32*)&pdata->timeout); + if (!pdata->timeout) { + pr_warn("%s: Timeout not found\n", np->full_name); + return -EINVAL; + } + + /* + * This driver only supports fast and standard frequency + * modes. If anything else is requested fall-back to standard. + */ + if (of_get_property(np, "stericsson,i2c_freq_mode_fast", NULL)) + pdata->sm = I2C_FREQ_MODE_FAST; + else + pdata->sm = I2C_FREQ_MODE_STANDARD; + + return 0; +} + static int __devinit nmk_i2c_probe(struct platform_device *pdev) { int ret = 0; struct resource *res; - struct nmk_i2c_controller *pdata = - pdev->dev.platform_data; + struct nmk_i2c_controller *pdata = pdev->dev.platform_data; + struct device_node *np = pdev->dev.of_node; struct nmk_i2c_dev *dev; struct i2c_adapter *adap; + if (np) { + if (!pdata) { + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + ret = -ENOMEM; + goto err_no_mem; + } + } + ret = nmk_i2c_of_probe(np, pdata); + if (ret) + kfree(pdata); + } + + if (!pdata) + /* No i2c configuration found, using the default. */ + pdata = &u8500_i2c; + dev = kzalloc(sizeof(struct nmk_i2c_dev), GFP_KERNEL); if (!dev) { dev_err(&pdev->dev, "cannot allocate memory\n"); @@ -1038,11 +1110,17 @@ static int __devexit nmk_i2c_remove(struct platform_device *pdev) return 0; } +static const struct of_device_id nmk_gpio_match[] = { + { .compatible = "st,nomadik-i2c", }, + {}, +}; + static struct platform_driver nmk_i2c_driver = { .driver = { .owner = THIS_MODULE, .name = DRIVER_NAME, .pm = &nmk_i2c_pm, + .of_match_table = nmk_gpio_match, }, .probe = nmk_i2c_probe, .remove = __devexit_p(nmk_i2c_remove),