2008-12-02 15:42:27

by Ben Dooks

[permalink] [raw]
Subject: [patch 1/8] SDHCI: Add timeout hooks

Some controllers do not provide clock information in their
capabilities (in the Samsung case, it is because there are
multiple clock sources available to the controller). Add hooks
to allow the system to supply clock information.

Signed-off-by: Ben Dooks <[email protected]>

Index: linux.git/drivers/mmc/host/sdhci.c
===================================================================
--- linux.git.orig/drivers/mmc/host/sdhci.c 2008-12-01 19:11:54.000000000 +0000
+++ linux.git/drivers/mmc/host/sdhci.c 2008-12-01 19:24:14.000000000 +0000
@@ -1606,18 +1606,26 @@ int sdhci_add_host(struct sdhci_host *ho

host->max_clk =
(caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT;
+ host->max_clk *= 1000000;
if (host->max_clk == 0) {
- printk(KERN_ERR "%s: Hardware doesn't specify base clock "
- "frequency.\n", mmc_hostname(mmc));
+ if (host->ops->get_max_clock)
+ host->max_clk = host->ops->get_max_clock(host);
+ else
+ printk(KERN_ERR
+ "%s: Hardware doesn't specify base clock "
+ "frequency.\n", mmc_hostname(mmc));
return -ENODEV;
}
- host->max_clk *= 1000000;

host->timeout_clk =
(caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT;
if (host->timeout_clk == 0) {
- printk(KERN_ERR "%s: Hardware doesn't specify timeout clock "
- "frequency.\n", mmc_hostname(mmc));
+ if (host->ops->get_timeout_clock)
+ host->timeout_clk = host->ops->get_timeout_clock(host);
+ else
+ printk(KERN_ERR
+ "%s: Hardware doesn't specify timeout clock "
+ "frequency.\n", mmc_hostname(mmc));
return -ENODEV;
}
if (caps & SDHCI_TIMEOUT_CLK_UNIT)
Index: linux.git/drivers/mmc/host/sdhci.h
===================================================================
--- linux.git.orig/drivers/mmc/host/sdhci.h 2008-12-01 19:11:54.000000000 +0000
+++ linux.git/drivers/mmc/host/sdhci.h 2008-12-01 19:17:55.000000000 +0000
@@ -267,6 +267,8 @@ struct sdhci_host {

struct sdhci_ops {
int (*enable_dma)(struct sdhci_host *host);
+ unsigned int (*get_max_clock)(struct sdhci_host *host);
+ unsigned int (*get_timeout_clock)(struct sdhci_host *host);
};



--
Ben ([email protected], http://www.fluff.org/)

'a smiley only costs 4 bytes'


2008-12-02 16:47:28

by smohideen

[permalink] [raw]
Subject: Re: [patch 1/8] SDHCI: Add timeout hooks

On Tue, Dec 02, 2008 at 03:40:19PM +0000, Ben Dooks wrote:
> Some controllers do not provide clock information in their
> capabilities (in the Samsung case, it is because there are
> multiple clock sources available to the controller). Add hooks
> to allow the system to supply clock information.
>
> Signed-off-by: Ben Dooks <[email protected]>
>
> Index: linux.git/drivers/mmc/host/sdhci.c
> ===================================================================
> --- linux.git.orig/drivers/mmc/host/sdhci.c 2008-12-01 19:11:54.000000000 +0000
> +++ linux.git/drivers/mmc/host/sdhci.c 2008-12-01 19:24:14.000000000 +0000
> @@ -1606,18 +1606,26 @@ int sdhci_add_host(struct sdhci_host *ho
>
> host->max_clk =
> (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT;
> + host->max_clk *= 1000000;
> if (host->max_clk == 0) {
> - printk(KERN_ERR "%s: Hardware doesn't specify base clock "
> - "frequency.\n", mmc_hostname(mmc));
> + if (host->ops->get_max_clock)
> + host->max_clk = host->ops->get_max_clock(host);
> + else
> + printk(KERN_ERR
> + "%s: Hardware doesn't specify base clock "
> + "frequency.\n", mmc_hostname(mmc));
> return -ENODEV;
> }
> - host->max_clk *= 1000000;
>
> host->timeout_clk =
> (caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT;
> if (host->timeout_clk == 0) {
> - printk(KERN_ERR "%s: Hardware doesn't specify timeout clock "
> - "frequency.\n", mmc_hostname(mmc));
> + if (host->ops->get_timeout_clock)
> + host->timeout_clk = host->ops->get_timeout_clock(host);
> + else
> + printk(KERN_ERR
> + "%s: Hardware doesn't specify timeout clock "
> + "frequency.\n", mmc_hostname(mmc));
> return -ENODEV;
> }
> if (caps & SDHCI_TIMEOUT_CLK_UNIT)
> Index: linux.git/drivers/mmc/host/sdhci.h
> ===================================================================
> --- linux.git.orig/drivers/mmc/host/sdhci.h 2008-12-01 19:11:54.000000000 +0000
> +++ linux.git/drivers/mmc/host/sdhci.h 2008-12-01 19:17:55.000000000 +0000
> @@ -267,6 +267,8 @@ struct sdhci_host {
>
> struct sdhci_ops {
> int (*enable_dma)(struct sdhci_host *host);
> + unsigned int (*get_max_clock)(struct sdhci_host *host);
> + unsigned int (*get_timeout_clock)(struct sdhci_host *host);
> };
>

Can we cache the multiple dereferences. Here host->ops can be
saved to a local, instead of multiple dereference several time.

2008-12-21 13:17:18

by Pierre Ossman

[permalink] [raw]
Subject: Re: [patch 1/8] SDHCI: Add timeout hooks

On Tue, 2 Dec 2008 22:16:50 +0530
[email protected] wrote:

>
> Can we cache the multiple dereferences. Here host->ops can be
> saved to a local, instead of multiple dereference several time.
>

The ops are used fairly rarely and so far not in any hot-paths, so
there would not be much gain in doing that.

Rgds
--
-- Pierre Ossman

WARNING: This correspondence is being monitored by the
Swedish government. Make sure your server uses encryption
for SMTP traffic and consider using PGP for end-to-end
encryption.


Attachments:
signature.asc (197.00 B)