All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Horman <horms@verge.net.au>
To: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Cc: linux-mmc@vger.kernel.org, devicetree-discuss@lists.ozlabs.org,
	linux-sh@vger.kernel.org, Magnus Damm <magnus.damm@gmail.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Markus Pargmann <mpa@pengutronix.de>
Subject: Re: [PATCH v4 03/13] mmc: provide a standard MMC device-tree binding parser centrally
Date: Sat, 16 Feb 2013 06:05:26 +0000	[thread overview]
Message-ID: <20130216060526.GA20785@verge.net.au> (raw)
In-Reply-To: <1360941242-18153-4-git-send-email-g.liakhovetski@gmx.de>

On Fri, Feb 15, 2013 at 04:13:52PM +0100, Guennadi Liakhovetski wrote:
> MMC defines a number of standard DT bindings. Having each driver parse
> them individually adds code redundancy and is error prone. Provide a
> standard function to unify the parsing. After all drivers are converted
> to using it instead of their own parsers, this function can be integrated
> into mmc_alloc_host().
> 
> Cc: Markus Pargmann <mpa@pengutronix.de>
> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
> ---
> 
> v4: make the bus-width property optional to match a recent change to 
> mmc.txt, use of_property_read_bool() to obtain a boolean value of a DT 
> property, add comments.
> 
>  drivers/mmc/core/host.c  |  108 ++++++++++++++++++++++++++++++++++++++++++++++
>  include/linux/mmc/host.h |    1 +
>  2 files changed, 109 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
> index ee2e16b..daa2ed1 100644
> --- a/drivers/mmc/core/host.c
> +++ b/drivers/mmc/core/host.c
> @@ -15,6 +15,8 @@
>  #include <linux/device.h>
>  #include <linux/err.h>
>  #include <linux/idr.h>
> +#include <linux/of.h>
> +#include <linux/of_gpio.h>
>  #include <linux/pagemap.h>
>  #include <linux/export.h>
>  #include <linux/leds.h>
> @@ -23,6 +25,7 @@
>  
>  #include <linux/mmc/host.h>
>  #include <linux/mmc/card.h>
> +#include <linux/mmc/slot-gpio.h>
>  
>  #include "core.h"
>  #include "host.h"
> @@ -295,6 +298,111 @@ static inline void mmc_host_clk_sysfs_init(struct mmc_host *host)
>  #endif
>  
>  /**
> + *	mmc_of_parse() - parse host's device-tree node
> + *	@host: host, whose node should be parsed.
> + *
> + * To keep the rest of the MMC subsystem unaware of the fact, whether DT has
> + * been used to to instantiate and configure this host instance or not, we
> + * parse the properties and set respective generic mmc-host flags and
> + * parameters.
> + */
> +void mmc_of_parse(struct mmc_host *host)
> +{
> +	struct device_node *np;
> +	u32 bus_width;
> +	bool explicit_inv_wp, gpio_inv_wp = false;
> +	enum of_gpio_flags flags;
> +	int len, ret, gpio;
> +
> +	if (!host->parent || !host->parent->of_node)
> +		return;
> +
> +	np = host->parent->of_node;
> +
> +	/* "bus-width" is translated to MMC_CAP_*_BIT_DATA flags */
> +	if (of_property_read_u32_array(np, "bus-width", &bus_width, 1) < 0)
> +		dev_dbg(host->parent,
> +			"\"bus-width\" property is missing, assuming 1 bit.\n");
> +
> +	switch (bus_width) {

kbuild tells me that gcc thinks that bus_width is used without being
initialised here. Assuming that of_property_read_u32_array always
initialises bus_width if it returns zero then perhaps it would be worth
considering using uninitialized_var().

> +	case 8:
> +		host->caps |= MMC_CAP_8_BIT_DATA;
> +		/* Hosts, capable of 8-bit transfers can also do 4 bits */
> +	case 4:
> +		host->caps |= MMC_CAP_4_BIT_DATA;
> +		break;
> +	case 1:
> +		break;
> +	default:
> +		dev_err(host->parent,
> +			"Invalid \"bus-width\" value %ud!\n", bus_width);
> +	}
> +
> +	/* f_max is obtained from the optional "max-frequency" property */
> +	of_property_read_u32_array(np, "max-frequency", &host->f_max, 1);
> +
> +	/*
> +	 * Configure CD and WP pins. They are both by default active low to
> +	 * match the SDHCI spec. If GPIOs are provided for CD and / or WP, the
> +	 * mmc-gpio helpers are used to attach, configure and use them. If
> +	 * polarity inversion is specified in DT, one of MMC_CAP2_CD_ACTIVE_HIGH
> +	 * and MMC_CAP2_RO_ACTIVE_HIGH capability-2 flags is set. If the
> +	 * "broken-cd" property is provided, the MMC_CAP_NEEDS_POLL capability
> +	 * is set. If the "non-removable" property is found, the
> +	 * MMC_CAP_NONREMOVABLE capability is set and no card-detection
> +	 * configuration is performed.
> +	 */
> +
> +	/* Parse Card Detection */
> +	if (of_find_property(np, "non-removable", &len)) {
> +		host->caps |= MMC_CAP_NONREMOVABLE;
> +	} else {
> +		bool explicit_inv_cd, gpio_inv_cd = false;
> +
> +		explicit_inv_cd = of_property_read_bool(np, "cd-inverted");
> +
> +		if (of_find_property(np, "broken-cd", &len))
> +			host->caps |= MMC_CAP_NEEDS_POLL;
> +
> +		gpio = of_get_named_gpio_flags(np, "cd-gpios", 0, &flags);
> +		if (gpio_is_valid(gpio)) {
> +			if (!(flags & OF_GPIO_ACTIVE_LOW))
> +				gpio_inv_cd = true;
> +
> +			ret = mmc_gpio_request_cd(host, gpio);
> +			if (ret < 0)
> +				dev_err(host->parent,
> +					"Failed to request CD GPIO #%d: %d!\n",
> +					gpio, ret);
> +			else
> +				dev_info(host->parent, "Got CD GPIO #%d.\n",
> +					 gpio);
> +		}
> +
> +		if (explicit_inv_cd ^ gpio_inv_cd)
> +			host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
> +	}
> +
> +	/* Parse Write Protection */
> +	explicit_inv_wp = of_property_read_bool(np, "wp-inverted");
> +
> +	gpio = of_get_named_gpio_flags(np, "wp-gpios", 0, &flags);
> +	if (gpio_is_valid(gpio)) {
> +		if (!(flags & OF_GPIO_ACTIVE_LOW))
> +			gpio_inv_wp = true;
> +
> +		ret = mmc_gpio_request_ro(host, gpio);
> +		if (ret < 0)
> +			dev_err(host->parent,
> +				"Failed to request WP GPIO: %d!\n", ret);
> +	}
> +	if (explicit_inv_wp ^ gpio_inv_wp)
> +		host->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
> +}
> +
> +EXPORT_SYMBOL(mmc_of_parse);
> +
> +/**
>   *	mmc_alloc_host - initialise the per-host structure.
>   *	@extra: sizeof private data structure
>   *	@dev: pointer to host device model structure
> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
> index 61a10c1..13c0c8d 100644
> --- a/include/linux/mmc/host.h
> +++ b/include/linux/mmc/host.h
> @@ -345,6 +345,7 @@ extern struct mmc_host *mmc_alloc_host(int extra, struct device *);
>  extern int mmc_add_host(struct mmc_host *);
>  extern void mmc_remove_host(struct mmc_host *);
>  extern void mmc_free_host(struct mmc_host *);
> +void mmc_of_parse(struct mmc_host *host);
>  
>  static inline void *mmc_priv(struct mmc_host *host)
>  {
> -- 
> 1.7.2.5
> 

WARNING: multiple messages have this Message-ID (diff)
From: Simon Horman <horms@verge.net.au>
To: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Cc: linux-mmc@vger.kernel.org, devicetree-discuss@lists.ozlabs.org,
	linux-sh@vger.kernel.org, Magnus Damm <magnus.damm@gmail.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Markus Pargmann <mpa@pengutronix.de>
Subject: Re: [PATCH v4 03/13] mmc: provide a standard MMC device-tree binding parser centrally
Date: Sat, 16 Feb 2013 15:05:26 +0900	[thread overview]
Message-ID: <20130216060526.GA20785@verge.net.au> (raw)
In-Reply-To: <1360941242-18153-4-git-send-email-g.liakhovetski@gmx.de>

On Fri, Feb 15, 2013 at 04:13:52PM +0100, Guennadi Liakhovetski wrote:
> MMC defines a number of standard DT bindings. Having each driver parse
> them individually adds code redundancy and is error prone. Provide a
> standard function to unify the parsing. After all drivers are converted
> to using it instead of their own parsers, this function can be integrated
> into mmc_alloc_host().
> 
> Cc: Markus Pargmann <mpa@pengutronix.de>
> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
> ---
> 
> v4: make the bus-width property optional to match a recent change to 
> mmc.txt, use of_property_read_bool() to obtain a boolean value of a DT 
> property, add comments.
> 
>  drivers/mmc/core/host.c  |  108 ++++++++++++++++++++++++++++++++++++++++++++++
>  include/linux/mmc/host.h |    1 +
>  2 files changed, 109 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
> index ee2e16b..daa2ed1 100644
> --- a/drivers/mmc/core/host.c
> +++ b/drivers/mmc/core/host.c
> @@ -15,6 +15,8 @@
>  #include <linux/device.h>
>  #include <linux/err.h>
>  #include <linux/idr.h>
> +#include <linux/of.h>
> +#include <linux/of_gpio.h>
>  #include <linux/pagemap.h>
>  #include <linux/export.h>
>  #include <linux/leds.h>
> @@ -23,6 +25,7 @@
>  
>  #include <linux/mmc/host.h>
>  #include <linux/mmc/card.h>
> +#include <linux/mmc/slot-gpio.h>
>  
>  #include "core.h"
>  #include "host.h"
> @@ -295,6 +298,111 @@ static inline void mmc_host_clk_sysfs_init(struct mmc_host *host)
>  #endif
>  
>  /**
> + *	mmc_of_parse() - parse host's device-tree node
> + *	@host: host, whose node should be parsed.
> + *
> + * To keep the rest of the MMC subsystem unaware of the fact, whether DT has
> + * been used to to instantiate and configure this host instance or not, we
> + * parse the properties and set respective generic mmc-host flags and
> + * parameters.
> + */
> +void mmc_of_parse(struct mmc_host *host)
> +{
> +	struct device_node *np;
> +	u32 bus_width;
> +	bool explicit_inv_wp, gpio_inv_wp = false;
> +	enum of_gpio_flags flags;
> +	int len, ret, gpio;
> +
> +	if (!host->parent || !host->parent->of_node)
> +		return;
> +
> +	np = host->parent->of_node;
> +
> +	/* "bus-width" is translated to MMC_CAP_*_BIT_DATA flags */
> +	if (of_property_read_u32_array(np, "bus-width", &bus_width, 1) < 0)
> +		dev_dbg(host->parent,
> +			"\"bus-width\" property is missing, assuming 1 bit.\n");
> +
> +	switch (bus_width) {

kbuild tells me that gcc thinks that bus_width is used without being
initialised here. Assuming that of_property_read_u32_array always
initialises bus_width if it returns zero then perhaps it would be worth
considering using uninitialized_var().

> +	case 8:
> +		host->caps |= MMC_CAP_8_BIT_DATA;
> +		/* Hosts, capable of 8-bit transfers can also do 4 bits */
> +	case 4:
> +		host->caps |= MMC_CAP_4_BIT_DATA;
> +		break;
> +	case 1:
> +		break;
> +	default:
> +		dev_err(host->parent,
> +			"Invalid \"bus-width\" value %ud!\n", bus_width);
> +	}
> +
> +	/* f_max is obtained from the optional "max-frequency" property */
> +	of_property_read_u32_array(np, "max-frequency", &host->f_max, 1);
> +
> +	/*
> +	 * Configure CD and WP pins. They are both by default active low to
> +	 * match the SDHCI spec. If GPIOs are provided for CD and / or WP, the
> +	 * mmc-gpio helpers are used to attach, configure and use them. If
> +	 * polarity inversion is specified in DT, one of MMC_CAP2_CD_ACTIVE_HIGH
> +	 * and MMC_CAP2_RO_ACTIVE_HIGH capability-2 flags is set. If the
> +	 * "broken-cd" property is provided, the MMC_CAP_NEEDS_POLL capability
> +	 * is set. If the "non-removable" property is found, the
> +	 * MMC_CAP_NONREMOVABLE capability is set and no card-detection
> +	 * configuration is performed.
> +	 */
> +
> +	/* Parse Card Detection */
> +	if (of_find_property(np, "non-removable", &len)) {
> +		host->caps |= MMC_CAP_NONREMOVABLE;
> +	} else {
> +		bool explicit_inv_cd, gpio_inv_cd = false;
> +
> +		explicit_inv_cd = of_property_read_bool(np, "cd-inverted");
> +
> +		if (of_find_property(np, "broken-cd", &len))
> +			host->caps |= MMC_CAP_NEEDS_POLL;
> +
> +		gpio = of_get_named_gpio_flags(np, "cd-gpios", 0, &flags);
> +		if (gpio_is_valid(gpio)) {
> +			if (!(flags & OF_GPIO_ACTIVE_LOW))
> +				gpio_inv_cd = true;
> +
> +			ret = mmc_gpio_request_cd(host, gpio);
> +			if (ret < 0)
> +				dev_err(host->parent,
> +					"Failed to request CD GPIO #%d: %d!\n",
> +					gpio, ret);
> +			else
> +				dev_info(host->parent, "Got CD GPIO #%d.\n",
> +					 gpio);
> +		}
> +
> +		if (explicit_inv_cd ^ gpio_inv_cd)
> +			host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
> +	}
> +
> +	/* Parse Write Protection */
> +	explicit_inv_wp = of_property_read_bool(np, "wp-inverted");
> +
> +	gpio = of_get_named_gpio_flags(np, "wp-gpios", 0, &flags);
> +	if (gpio_is_valid(gpio)) {
> +		if (!(flags & OF_GPIO_ACTIVE_LOW))
> +			gpio_inv_wp = true;
> +
> +		ret = mmc_gpio_request_ro(host, gpio);
> +		if (ret < 0)
> +			dev_err(host->parent,
> +				"Failed to request WP GPIO: %d!\n", ret);
> +	}
> +	if (explicit_inv_wp ^ gpio_inv_wp)
> +		host->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
> +}
> +
> +EXPORT_SYMBOL(mmc_of_parse);
> +
> +/**
>   *	mmc_alloc_host - initialise the per-host structure.
>   *	@extra: sizeof private data structure
>   *	@dev: pointer to host device model structure
> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
> index 61a10c1..13c0c8d 100644
> --- a/include/linux/mmc/host.h
> +++ b/include/linux/mmc/host.h
> @@ -345,6 +345,7 @@ extern struct mmc_host *mmc_alloc_host(int extra, struct device *);
>  extern int mmc_add_host(struct mmc_host *);
>  extern void mmc_remove_host(struct mmc_host *);
>  extern void mmc_free_host(struct mmc_host *);
> +void mmc_of_parse(struct mmc_host *host);
>  
>  static inline void *mmc_priv(struct mmc_host *host)
>  {
> -- 
> 1.7.2.5
> 

  reply	other threads:[~2013-02-16  6:05 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-02-15 15:13 [PATCH v4 00/13] mmc: core and driver DT and related development Guennadi Liakhovetski
2013-02-15 15:13 ` Guennadi Liakhovetski
2013-02-15 15:13 ` [PATCH v4 01/13] mmc: sdhi, tmio: only check flags in tmio-mmc driver proper Guennadi Liakhovetski
2013-02-15 15:13   ` Guennadi Liakhovetski
2013-02-15 15:13 ` [PATCH v4 02/13] mmc: detailed definition of CD and WP MMC line polarities in DT Guennadi Liakhovetski
2013-02-15 15:13   ` Guennadi Liakhovetski
2013-02-15 15:13 ` [PATCH v4 03/13] mmc: provide a standard MMC device-tree binding parser centrally Guennadi Liakhovetski
2013-02-15 15:13   ` Guennadi Liakhovetski
2013-02-16  6:05   ` Simon Horman [this message]
2013-02-16  6:05     ` Simon Horman
2013-02-16 10:54     ` Arnd Bergmann
2013-02-16 11:41       ` Simon Horman
2013-02-16 11:41         ` Simon Horman
2013-02-16 14:02       ` Guennadi Liakhovetski
2013-02-16 14:02         ` Guennadi Liakhovetski
2013-02-16 15:21   ` [PATCH v5 " Guennadi Liakhovetski
2013-02-16 15:21     ` Guennadi Liakhovetski
2013-02-16 16:58     ` Sascha Hauer
2013-02-16 16:58       ` Sascha Hauer
2013-02-17  7:52       ` Simon Horman
2013-02-17  7:52         ` Simon Horman
2013-02-17  7:58         ` Simon Horman
2013-02-17  7:58           ` Simon Horman
2013-02-18  8:54           ` Guennadi Liakhovetski
2013-02-18  8:54             ` Guennadi Liakhovetski
2013-02-15 15:13 ` [PATCH v4 04/13] mmc: (cosmetic) remove "extern" from function declarations Guennadi Liakhovetski
2013-02-15 15:13   ` Guennadi Liakhovetski
2013-02-15 15:13 ` [PATCH v4 05/13] mmc: sh-mmcif: use mmc_of_parse() to parse standard MMC DT bindings Guennadi Liakhovetski
2013-02-15 15:13   ` Guennadi Liakhovetski
2013-02-15 15:13 ` [PATCH v4 06/13] mmc: tmio-mmc: define device-tree bindings Guennadi Liakhovetski
2013-02-15 15:13   ` Guennadi Liakhovetski
2013-02-15 15:13 ` [PATCH v4 07/13] mmc: tmio-mmc: parse " Guennadi Liakhovetski
2013-02-15 15:13   ` Guennadi Liakhovetski
2013-02-15 15:13 ` [PATCH v4 08/13] mmc: sh_mobile_sdhi: remove unused .pdata field Guennadi Liakhovetski
2013-02-15 15:13   ` Guennadi Liakhovetski
2013-02-15 15:13 ` [PATCH v4 09/13] mmc: sh_mobile_sdhi: use managed resource allocations Guennadi Liakhovetski
2013-02-15 15:13   ` Guennadi Liakhovetski
2013-02-15 15:13 ` [PATCH v4 10/13] mmc: tmio: remove unused and deprecated symbols Guennadi Liakhovetski
2013-02-15 15:13   ` Guennadi Liakhovetski
2013-02-15 15:14 ` [PATCH v4 11/13] mmc: tmio: add support for the VccQ regulator Guennadi Liakhovetski
2013-02-15 15:14   ` Guennadi Liakhovetski
2013-02-15 15:14 ` [PATCH v4 12/13] mmc: add DT bindings for more MMC capability flags Guennadi Liakhovetski
2013-02-15 15:14   ` Guennadi Liakhovetski
2013-02-16 22:58   ` Sergei Shtylyov
2013-02-16 23:58     ` Sergei Shtylyov
     [not found]     ` <51201D32.20006-M4DtvfQ/ZS1MRgGoP+s0PdBPR1lH4CV8@public.gmane.org>
2013-02-18  8:52       ` Guennadi Liakhovetski
2013-02-18  8:52         ` Guennadi Liakhovetski
2013-06-06  1:55   ` Olof Johansson
2013-06-06  1:55     ` Olof Johansson
2013-02-15 15:14 ` [PATCH v4 13/13] mmc: tmio: add barriers to IO operations Guennadi Liakhovetski
2013-02-15 15:14   ` Guennadi Liakhovetski
2013-02-18 15:05   ` Arnd Bergmann
2013-02-18 15:56     ` Guennadi Liakhovetski
2013-02-18 15:56       ` Guennadi Liakhovetski
2013-02-18 16:34       ` Arnd Bergmann
2013-02-18 17:20         ` Guennadi Liakhovetski
2013-02-18 17:20           ` Guennadi Liakhovetski
2013-02-18 22:11           ` Arnd Bergmann
     [not found]             ` <201302182211.46697.arnd-r2nGTMty4D4@public.gmane.org>
2013-02-19 21:59               ` Guennadi Liakhovetski
2013-02-19 21:59                 ` Guennadi Liakhovetski
2013-02-16  2:26 ` [PATCH v4 00/13] mmc: core and driver DT and related development Simon Horman
2013-02-16  2:26   ` Simon Horman
2013-02-18 13:15 ` Chris Ball
2013-02-18 13:15   ` Chris Ball
2013-02-19 21:57   ` Guennadi Liakhovetski
2013-02-19 21:57     ` Guennadi Liakhovetski
2013-02-19 22:00     ` Chris Ball
2013-02-19 22:00       ` Chris Ball
2013-02-18 14:52 ` Arnd Bergmann
2013-02-19 19:20 ` Stephen Warren
2013-02-19 19:20   ` Stephen Warren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130216060526.GA20785@verge.net.au \
    --to=horms@verge.net.au \
    --cc=arnd@arndb.de \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=g.liakhovetski@gmx.de \
    --cc=linux-mmc@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=magnus.damm@gmail.com \
    --cc=mpa@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.