From patchwork Tue Sep 9 13:28:00 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: stigge@antcom.de X-Patchwork-Id: 387333 Return-Path: X-Original-To: incoming-dt@patchwork.ozlabs.org Delivered-To: patchwork-incoming-dt@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 0B7B6140188 for ; Tue, 9 Sep 2014 23:39:10 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756753AbaIINjI (ORCPT ); Tue, 9 Sep 2014 09:39:08 -0400 Received: from mail.work-microwave.de ([62.245.205.51]:63988 "EHLO mail.work-microwave.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756763AbaIINjI (ORCPT ); Tue, 9 Sep 2014 09:39:08 -0400 X-Greylist: delayed 609 seconds by postgrey-1.27 at vger.kernel.org; Tue, 09 Sep 2014 09:39:07 EDT Received: from host137.lan.work-microwave.de ([192.168.8.4]) by mail.work-microwave.de with ESMTP id s89DS23Y018049-s89DS23Z018049; Tue, 9 Sep 2014 14:28:02 +0100 Received: by host137.lan.work-microwave.de (Postfix, from userid 1000) id B35FE6868CE; Tue, 9 Sep 2014 15:28:02 +0200 (CEST) From: Roland Stigge To: robh+dt@kernel.org, riku.voipio@iki.fi, cooloney@gmail.com, rpurdie@rpsys.net, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-leds@vger.kernel.org Cc: Roland Stigge Subject: [PATCH] leds: Add DT support for leds-pca9532 Date: Tue, 9 Sep 2014 15:28:00 +0200 Message-Id: <1410269280-8761-1-git-send-email-stigge@antcom.de> X-Mailer: git-send-email 2.1.0 X-FEAS-SYSTEM-WL: "Roland Stigge" Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org This patch adds DT support for leds-pca9532. Signed-off-by: Roland Stigge --- Applies to v3.17-rc4 Documentation/devicetree/bindings/leds/leds-pca9532.txt | 43 ++++++++++++++ drivers/leds/leds-pca9532.c | 47 ++++++++++++++++ 2 files changed, 90 insertions(+) -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html --- /dev/null +++ linux-2.6/Documentation/devicetree/bindings/leds/leds-pca9532.txt @@ -0,0 +1,43 @@ +NXP PCA9532 LED (incl. GPIO) controller + +Required properties: +- compatible: must be "nxp,pca9532" +- reg: I2C address +- gpio-controller: Marks the device node as a GPIO controller. +- #gpio-cells: Should be 2: + 1) pin number + 2) optional parameters: + - bit 0 specifies polarity (0 for normal, 1 for inverted) +- nxp,typecodes: groups of 2 bits for each of the 16 pins: + 0: None + 1: LED + 2: Beep + 3: GPIO +- nxp,statecodes: groups of 2 bits for each of the 16 pins: + 0: off + 1: on + 2: pwm0 + 3: pwm1 + +Optional properties: +- nxp,psc: array of 2 numbers: PSC values for the two PWM channels (see datasheet) +- nxp,pwm: array of 2 numbers: PWM values for the two PWM channels (see datasheet) + +Example: + + pca9532: pca9532@60 { + compatible = "nxp,pca9532"; + gpio-controller; + #gpio-cells = <2>; + nxp,typecodes = <0xffffffff>; + nxp,statecodes = <0x00000000>; + reg = <0x60>; + }; + + sd@20098000 { + wp-gpios = <&pca9532 5 0>; + cd-gpios = <&pca9532 4 0>; + cd-inverted; + bus-width = <4>; + status = "okay"; + }; --- linux-2.6.orig/drivers/leds/leds-pca9532.c +++ linux-2.6/drivers/leds/leds-pca9532.c @@ -21,6 +21,7 @@ #include #include #include +#include /* m = num_leds*/ #define PCA9532_REG_INPUT(i) ((i) >> 3) @@ -442,6 +443,45 @@ exit: return err; } +#ifdef CONFIG_OF +static struct pca9532_platform_data *pca9532_parse_dt(struct device *dev) +{ + struct device_node *np = dev->of_node; + struct pca9532_platform_data *pca9532_pdata; + u32 typecodes, statecodes; + u32 pwm[2]; + u32 psc[2]; + int i; + + pca9532_pdata = devm_kzalloc(dev, sizeof(*pca9532_pdata), GFP_KERNEL); + if (!pca9532_pdata) + return NULL; + + if (!of_property_read_u32(np, "nxp,typecodes", &typecodes)) { + for (i = 0; i < 16; i++) + pca9532_pdata->leds[i].type = + (typecodes >> (2 * i)) & 0x3; + } + if (!of_property_read_u32(np, "nxp,statecodes", &statecodes)) { + for (i = 0; i < 16; i++) + pca9532_pdata->leds[i].state = + (statecodes >> (2 * i)) & 0x3; + } + if (!of_property_read_u32_array(np, "nxp,pwm", &pwm[0], 2)) { + for (i = 0; i < 2; i++) + pca9532_pdata->pwm[i] = pwm[i]; + } + if (!of_property_read_u32_array(np, "nxp,psc", &psc[0], 2)) { + for (i = 0; i < 2; i++) + pca9532_pdata->psc[i] = psc[i]; + } + + pca9532_pdata->gpio_base = -1; /* dynamically assign gpio base */ + + return pca9532_pdata; +} +#endif + static int pca9532_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -449,6 +489,11 @@ static int pca9532_probe(struct i2c_clie struct pca9532_platform_data *pca9532_pdata = dev_get_platdata(&client->dev); +#ifdef CONFIG_OF + if (!pca9532_pdata && client->dev.of_node) + pca9532_pdata = pca9532_parse_dt(&client->dev); +#endif + if (!pca9532_pdata) return -EIO;