All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nicolas Ferre <nicolas.ferre@atmel.com>
To: ludovic.desroches@atmel.com
Cc: linux-mmc@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	plagnioj@jcrosoft.com
Subject: Re: [PATCH 3/3] mmc: atmel-mci: add support for odd clock dividers
Date: Thu, 22 Mar 2012 15:48:48 +0100	[thread overview]
Message-ID: <4F6B3BD0.4060702@atmel.com> (raw)
In-Reply-To: <1332344483-3915-4-git-send-email-ludovic.desroches@atmel.com>

On 03/21/2012 04:41 PM, ludovic.desroches@atmel.com :
> From: Ludovic Desroches <ludovic.desroches@atmel.com>
> 
> Add an odd clock divider capability available from v5xx. It also involves
> changing the clock divider calculation.

Also tell here that you have changed the way that the switch/case
directive has been implemented.

> Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>

Otherwise:
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>


> ---
>  drivers/mmc/host/atmel-mci-regs.h |    1 +
>  drivers/mmc/host/atmel-mci.c      |   48 ++++++++++++++++++++++--------------
>  2 files changed, 30 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/mmc/host/atmel-mci-regs.h b/drivers/mmc/host/atmel-mci-regs.h
> index 000b3ad..787aba1 100644
> --- a/drivers/mmc/host/atmel-mci-regs.h
> +++ b/drivers/mmc/host/atmel-mci-regs.h
> @@ -31,6 +31,7 @@
>  # define ATMCI_MR_PDCFBYTE		(  1 << 13)	/* Force Byte Transfer */
>  # define ATMCI_MR_PDCPADV		(  1 << 14)	/* Padding Value */
>  # define ATMCI_MR_PDCMODE		(  1 << 15)	/* PDC-oriented Mode */
> +# define ATMCI_MR_CLKODD(x)		((x) << 16)	/* LSB of Clock Divider */
>  #define ATMCI_DTOR			0x0008	/* Data Timeout */
>  # define ATMCI_DTOCYC(x)		((x) <<  0)	/* Data Timeout Cycles */
>  # define ATMCI_DTOMUL(x)		((x) <<  4)	/* Data Timeout Multiplier */
> diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
> index 9dcb236..75e28c0 100644
> --- a/drivers/mmc/host/atmel-mci.c
> +++ b/drivers/mmc/host/atmel-mci.c
> @@ -76,6 +76,7 @@ struct atmel_mci_caps {
>  	bool    has_cstor_reg;
>  	bool    has_highspeed;
>  	bool    has_rwproof;
> +	bool	has_odd_clk_div;
>  };
>  
>  struct atmel_mci_dma {
> @@ -1124,16 +1125,27 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
>  		}
>  
>  		/* Calculate clock divider */
> -		clkdiv = DIV_ROUND_UP(host->bus_hz, 2 * clock_min) - 1;
> -		if (clkdiv > 255) {
> -			dev_warn(&mmc->class_dev,
> -				"clock %u too slow; using %lu\n",
> -				clock_min, host->bus_hz / (2 * 256));
> -			clkdiv = 255;
> +		if (host->caps.has_odd_clk_div) {
> +			clkdiv = DIV_ROUND_UP(host->bus_hz, clock_min) - 2;
> +			if (clkdiv > 511) {
> +				dev_warn(&mmc->class_dev,
> +				         "clock %u too slow; using %lu\n",
> +				         clock_min, host->bus_hz / (511 + 2));
> +				clkdiv = 511;
> +			}
> +			host->mode_reg = ATMCI_MR_CLKDIV(clkdiv >> 1)
> +			                 | ATMCI_MR_CLKODD(clkdiv & 1);
> +		} else {
> +			clkdiv = DIV_ROUND_UP(host->bus_hz, 2 * clock_min) - 1;
> +			if (clkdiv > 255) {
> +				dev_warn(&mmc->class_dev,
> +				         "clock %u too slow; using %lu\n",
> +				         clock_min, host->bus_hz / (2 * 256));
> +				clkdiv = 255;
> +			}
> +			host->mode_reg = ATMCI_MR_CLKDIV(clkdiv);
>  		}
>  
> -		host->mode_reg = ATMCI_MR_CLKDIV(clkdiv);
> -
>  		/*
>  		 * WRPROOF and RDPROOF prevent overruns/underruns by
>  		 * stopping the clock when the FIFO is full/empty.
> @@ -2000,37 +2012,35 @@ static void __init atmci_get_cap(struct atmel_mci *host)
>  			"version: 0x%x\n", version);
>  
>  	host->caps.has_dma = 0;
> -	host->caps.has_pdc = 0;
> +	host->caps.has_pdc = 1;
>  	host->caps.has_cfg_reg = 0;
>  	host->caps.has_cstor_reg = 0;
>  	host->caps.has_highspeed = 0;
>  	host->caps.has_rwproof = 0;
> +	host->caps.has_odd_clk_div = 0;
>  
>  	/* keep only major version number */
>  	switch (version & 0xf00) {
> -	case 0x100:
> -		host->caps.has_pdc = 1;
> -		break;
> -	case 0x200:
> -		host->caps.has_pdc = 1;
> -		host->caps.has_rwproof = 1;
> -		break;
> -	case 0x300:
> -	case 0x400:
>  	case 0x500:
> +		host->caps.has_odd_clk_div = 1;
> +	case 0x400:
> +	case 0x300:
>  #ifdef CONFIG_AT_HDMAC
>  		host->caps.has_dma = 1;
>  #else
> -		host->caps.has_dma = 0;
>  		dev_info(&host->pdev->dev,
>  			"has dma capability but dma engine is not selected, then use pio\n");
>  #endif
> +		host->caps.has_pdc = 0;
>  		host->caps.has_cfg_reg = 1;
>  		host->caps.has_cstor_reg = 1;
>  		host->caps.has_highspeed = 1;
> +	case 0x200:
>  		host->caps.has_rwproof = 1;
> +	case 0x100:
>  		break;
>  	default:
> +		host->caps.has_pdc = 0;
>  		dev_warn(&host->pdev->dev,
>  				"Unmanaged mci version, set minimum capabilities\n");
>  		break;


-- 
Nicolas Ferre

WARNING: multiple messages have this Message-ID (diff)
From: nicolas.ferre@atmel.com (Nicolas Ferre)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 3/3] mmc: atmel-mci: add support for odd clock dividers
Date: Thu, 22 Mar 2012 15:48:48 +0100	[thread overview]
Message-ID: <4F6B3BD0.4060702@atmel.com> (raw)
In-Reply-To: <1332344483-3915-4-git-send-email-ludovic.desroches@atmel.com>

On 03/21/2012 04:41 PM, ludovic.desroches at atmel.com :
> From: Ludovic Desroches <ludovic.desroches@atmel.com>
> 
> Add an odd clock divider capability available from v5xx. It also involves
> changing the clock divider calculation.

Also tell here that you have changed the way that the switch/case
directive has been implemented.

> Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>

Otherwise:
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>


> ---
>  drivers/mmc/host/atmel-mci-regs.h |    1 +
>  drivers/mmc/host/atmel-mci.c      |   48 ++++++++++++++++++++++--------------
>  2 files changed, 30 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/mmc/host/atmel-mci-regs.h b/drivers/mmc/host/atmel-mci-regs.h
> index 000b3ad..787aba1 100644
> --- a/drivers/mmc/host/atmel-mci-regs.h
> +++ b/drivers/mmc/host/atmel-mci-regs.h
> @@ -31,6 +31,7 @@
>  # define ATMCI_MR_PDCFBYTE		(  1 << 13)	/* Force Byte Transfer */
>  # define ATMCI_MR_PDCPADV		(  1 << 14)	/* Padding Value */
>  # define ATMCI_MR_PDCMODE		(  1 << 15)	/* PDC-oriented Mode */
> +# define ATMCI_MR_CLKODD(x)		((x) << 16)	/* LSB of Clock Divider */
>  #define ATMCI_DTOR			0x0008	/* Data Timeout */
>  # define ATMCI_DTOCYC(x)		((x) <<  0)	/* Data Timeout Cycles */
>  # define ATMCI_DTOMUL(x)		((x) <<  4)	/* Data Timeout Multiplier */
> diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
> index 9dcb236..75e28c0 100644
> --- a/drivers/mmc/host/atmel-mci.c
> +++ b/drivers/mmc/host/atmel-mci.c
> @@ -76,6 +76,7 @@ struct atmel_mci_caps {
>  	bool    has_cstor_reg;
>  	bool    has_highspeed;
>  	bool    has_rwproof;
> +	bool	has_odd_clk_div;
>  };
>  
>  struct atmel_mci_dma {
> @@ -1124,16 +1125,27 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
>  		}
>  
>  		/* Calculate clock divider */
> -		clkdiv = DIV_ROUND_UP(host->bus_hz, 2 * clock_min) - 1;
> -		if (clkdiv > 255) {
> -			dev_warn(&mmc->class_dev,
> -				"clock %u too slow; using %lu\n",
> -				clock_min, host->bus_hz / (2 * 256));
> -			clkdiv = 255;
> +		if (host->caps.has_odd_clk_div) {
> +			clkdiv = DIV_ROUND_UP(host->bus_hz, clock_min) - 2;
> +			if (clkdiv > 511) {
> +				dev_warn(&mmc->class_dev,
> +				         "clock %u too slow; using %lu\n",
> +				         clock_min, host->bus_hz / (511 + 2));
> +				clkdiv = 511;
> +			}
> +			host->mode_reg = ATMCI_MR_CLKDIV(clkdiv >> 1)
> +			                 | ATMCI_MR_CLKODD(clkdiv & 1);
> +		} else {
> +			clkdiv = DIV_ROUND_UP(host->bus_hz, 2 * clock_min) - 1;
> +			if (clkdiv > 255) {
> +				dev_warn(&mmc->class_dev,
> +				         "clock %u too slow; using %lu\n",
> +				         clock_min, host->bus_hz / (2 * 256));
> +				clkdiv = 255;
> +			}
> +			host->mode_reg = ATMCI_MR_CLKDIV(clkdiv);
>  		}
>  
> -		host->mode_reg = ATMCI_MR_CLKDIV(clkdiv);
> -
>  		/*
>  		 * WRPROOF and RDPROOF prevent overruns/underruns by
>  		 * stopping the clock when the FIFO is full/empty.
> @@ -2000,37 +2012,35 @@ static void __init atmci_get_cap(struct atmel_mci *host)
>  			"version: 0x%x\n", version);
>  
>  	host->caps.has_dma = 0;
> -	host->caps.has_pdc = 0;
> +	host->caps.has_pdc = 1;
>  	host->caps.has_cfg_reg = 0;
>  	host->caps.has_cstor_reg = 0;
>  	host->caps.has_highspeed = 0;
>  	host->caps.has_rwproof = 0;
> +	host->caps.has_odd_clk_div = 0;
>  
>  	/* keep only major version number */
>  	switch (version & 0xf00) {
> -	case 0x100:
> -		host->caps.has_pdc = 1;
> -		break;
> -	case 0x200:
> -		host->caps.has_pdc = 1;
> -		host->caps.has_rwproof = 1;
> -		break;
> -	case 0x300:
> -	case 0x400:
>  	case 0x500:
> +		host->caps.has_odd_clk_div = 1;
> +	case 0x400:
> +	case 0x300:
>  #ifdef CONFIG_AT_HDMAC
>  		host->caps.has_dma = 1;
>  #else
> -		host->caps.has_dma = 0;
>  		dev_info(&host->pdev->dev,
>  			"has dma capability but dma engine is not selected, then use pio\n");
>  #endif
> +		host->caps.has_pdc = 0;
>  		host->caps.has_cfg_reg = 1;
>  		host->caps.has_cstor_reg = 1;
>  		host->caps.has_highspeed = 1;
> +	case 0x200:
>  		host->caps.has_rwproof = 1;
> +	case 0x100:
>  		break;
>  	default:
> +		host->caps.has_pdc = 0;
>  		dev_warn(&host->pdev->dev,
>  				"Unmanaged mci version, set minimum capabilities\n");
>  		break;


-- 
Nicolas Ferre

  reply	other threads:[~2012-03-22 14:48 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-21 15:41 [PATCH 0/3] atmel-mci fixes ludovic.desroches
2012-03-21 15:41 ` ludovic.desroches at atmel.com
2012-03-21 15:41 ` [PATCH 1/3] mmc: atmel-mci: correct data timeout computation ludovic.desroches
2012-03-21 15:41   ` ludovic.desroches at atmel.com
2012-03-21 16:26   ` Sergei Shtylyov
2012-03-21 16:26     ` Sergei Shtylyov
2012-03-22  8:57     ` Ludovic Desroches
2012-03-22  8:57       ` Ludovic Desroches
2012-03-28 10:28   ` [PATCH v2 " ludovic.desroches
2012-03-28 10:28     ` ludovic.desroches at atmel.com
2012-03-28 11:44     ` Nicolas Ferre
2012-03-28 11:44       ` Nicolas Ferre
2012-04-01  3:43       ` Chris Ball
2012-04-01  3:43         ` Chris Ball
2012-03-21 15:41 ` [PATCH 2/3] mmc: atmel-mci: r/w proof capability only available since v2xx ludovic.desroches
2012-03-21 15:41   ` ludovic.desroches at atmel.com
2012-03-22 14:44   ` Nicolas Ferre
2012-03-22 14:44     ` Nicolas Ferre
2012-04-01  3:43     ` Chris Ball
2012-04-01  3:43       ` Chris Ball
2012-03-21 15:41 ` [PATCH 3/3] mmc: atmel-mci: add support for odd clock dividers ludovic.desroches
2012-03-21 15:41   ` ludovic.desroches at atmel.com
2012-03-22 14:48   ` Nicolas Ferre [this message]
2012-03-22 14:48     ` Nicolas Ferre
2012-04-01  3:44     ` Chris Ball
2012-04-01  3:44       ` Chris Ball
2012-04-02  6:52       ` Ludovic Desroches
2012-04-02  6:52         ` Ludovic Desroches

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=4F6B3BD0.4060702@atmel.com \
    --to=nicolas.ferre@atmel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=ludovic.desroches@atmel.com \
    --cc=plagnioj@jcrosoft.com \
    /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.