Re: [PATCH 1/4] mmc: sdhci-s3c: use the sdhci-pltfm for Samsung-SoC
On 02/24/2012 06:53 PM, Thomas Abraham wrote: > Dear Mr. Chung, > > This has been in the todo list for a long time. Thanks for the patch. > With the use of device tree and sdhci-pltfm driver, it should be > possible to avoid dependency with platform code. I'm working for using sdhci-pltfm. And in mmc-next tree, latest your patch is merged. (using device-tree). So i rework this patch. Right. this is the todo list. And need more discussion. Main goal is to use the sdhci-pltfm. > > There are few comments below. > > On 14 February 2012 10:33, Jaehoon Chung wrote: >> This patch is change to use the sdhci-pltfm.c >> >> Signed-off-by: Jaehoon Chung >> signed-off-by: Kyungmin Park >> --- >> drivers/mmc/host/sdhci-s3c.c | 218 >> ++ >> 1 files changed, 71 insertions(+), 147 deletions(-) >> >> diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c >> index 1af756e..a651c1e 100644 >> --- a/drivers/mmc/host/sdhci-s3c.c >> +++ b/drivers/mmc/host/sdhci-s3c.c >> @@ -26,6 +26,7 @@ >> #include >> #include >> >> +#include "sdhci-pltfm.h" >> #include "sdhci.h" >> >> #define MAX_BUS_CLK(4) >> @@ -41,9 +42,7 @@ >> * @clk_bus: The clocks that are available for the SD/MMC bus clock. >> */ >> struct sdhci_s3c { >> - struct sdhci_host *host; >>struct platform_device *pdev; >> - struct resource *ioarea; >>struct s3c_sdhci_platdata *pdata; >>unsigned intcur_clk; > > Would it be possible to remove cur_clk and only use pltfm_host->clk ? Good point, cur_clk can be removed. > >>int ext_cd_irq; >> @@ -53,11 +52,6 @@ struct sdhci_s3c { >>struct clk *clk_bus[MAX_BUS_CLK]; >> }; >> >> -static inline struct sdhci_s3c *to_s3c(struct sdhci_host *host) >> -{ >> - return sdhci_priv(host); >> -} >> - >> /** >> * get_curclk - convert ctrl2 register to clock source number >> * @ctrl2: Control2 register value. >> @@ -72,7 +66,8 @@ static u32 get_curclk(u32 ctrl2) >> >> static void sdhci_s3c_check_sclk(struct sdhci_host *host) >> { >> - struct sdhci_s3c *ourhost = to_s3c(host); >> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); >> + struct sdhci_s3c *ourhost = pltfm_host->priv; >>u32 tmp = readl(host->ioaddr + S3C_SDHCI_CONTROL2); >> >>if (get_curclk(tmp) != ourhost->cur_clk) { >> @@ -92,13 +87,13 @@ static void sdhci_s3c_check_sclk(struct sdhci_host *host) >> */ >> static unsigned int sdhci_s3c_get_max_clk(struct sdhci_host *host) >> { >> - struct sdhci_s3c *ourhost = to_s3c(host); >> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); >> + struct sdhci_s3c *ourhost = pltfm_host->priv; >>struct clk *busclk; >>unsigned int rate, max; >>int clk; >> >>/* note, a reset will reset the clock source */ >> - >>sdhci_s3c_check_sclk(host); >> >>for (max = 0, clk = 0; clk < MAX_BUS_CLK; clk++) { >> @@ -163,7 +158,8 @@ static unsigned int sdhci_s3c_consider_clock(struct >> sdhci_s3c *ourhost, >> */ >> static void sdhci_s3c_set_clock(struct sdhci_host *host, unsigned int clock) >> { >> - struct sdhci_s3c *ourhost = to_s3c(host); >> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); >> + struct sdhci_s3c *ourhost = pltfm_host->priv; >>unsigned int best = UINT_MAX; >>unsigned int delta; >>int best_src = 0; >> @@ -233,7 +229,8 @@ static void sdhci_s3c_set_clock(struct sdhci_host *host, >> unsigned int clock) >> */ >> static unsigned int sdhci_s3c_get_min_clock(struct sdhci_host *host) >> { >> - struct sdhci_s3c *ourhost = to_s3c(host); >> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); >> + struct sdhci_s3c *ourhost = pltfm_host->priv; >>unsigned int delta, min = UINT_MAX; >>int src; >> >> @@ -251,27 +248,27 @@ static unsigned int sdhci_s3c_get_min_clock(struct >> sdhci_host *host) >> /* sdhci_cmu_get_max_clk - callback to get maximum clock frequency.*/ >> static unsigned int sdhci_cmu_get_max_clock(struct sdhci_host *host) >> { >> - struct sdhci_s3c *ourhost = to_s3c(host); >> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); >> >> - return clk_round_rate(ourhost->clk_bus[ourhost->cur_clk], UINT_MAX); >> + return clk_round_rate(pltfm_host->clk, UINT_MAX); >> } >> >> /* sdhci_cmu_get_min_clock - callback to get minimal supported clock value. >> */ >> static unsigned int sdhci_cmu_get_min_clock(struct sdhci_host *host) >> { >> - struct sdhci_s3c *ourhost = to_s3c(host); >> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); >> >>/* >> * initial clock can be in the frequency range of >> * 100KHz-400KHz, so we set it as max value. >> */ >> - return clk_round_rate(ourhost->clk_bus[ourhost->cur_clk], 40); >> + return clk_round_rate(pltfm_hos
Re: [PATCH 1/4] mmc: sdhci-s3c: use the sdhci-pltfm for Samsung-SoC
Dear Mr. Chung, This has been in the todo list for a long time. Thanks for the patch. With the use of device tree and sdhci-pltfm driver, it should be possible to avoid dependency with platform code. There are few comments below. On 14 February 2012 10:33, Jaehoon Chung wrote: > This patch is change to use the sdhci-pltfm.c > > Signed-off-by: Jaehoon Chung > signed-off-by: Kyungmin Park > --- > drivers/mmc/host/sdhci-s3c.c | 218 > ++ > 1 files changed, 71 insertions(+), 147 deletions(-) > > diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c > index 1af756e..a651c1e 100644 > --- a/drivers/mmc/host/sdhci-s3c.c > +++ b/drivers/mmc/host/sdhci-s3c.c > @@ -26,6 +26,7 @@ > #include > #include > > +#include "sdhci-pltfm.h" > #include "sdhci.h" > > #define MAX_BUS_CLK (4) > @@ -41,9 +42,7 @@ > * @clk_bus: The clocks that are available for the SD/MMC bus clock. > */ > struct sdhci_s3c { > - struct sdhci_host *host; > struct platform_device *pdev; > - struct resource *ioarea; > struct s3c_sdhci_platdata *pdata; > unsigned int cur_clk; Would it be possible to remove cur_clk and only use pltfm_host->clk ? > int ext_cd_irq; > @@ -53,11 +52,6 @@ struct sdhci_s3c { > struct clk *clk_bus[MAX_BUS_CLK]; > }; > > -static inline struct sdhci_s3c *to_s3c(struct sdhci_host *host) > -{ > - return sdhci_priv(host); > -} > - > /** > * get_curclk - convert ctrl2 register to clock source number > * @ctrl2: Control2 register value. > @@ -72,7 +66,8 @@ static u32 get_curclk(u32 ctrl2) > > static void sdhci_s3c_check_sclk(struct sdhci_host *host) > { > - struct sdhci_s3c *ourhost = to_s3c(host); > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > + struct sdhci_s3c *ourhost = pltfm_host->priv; > u32 tmp = readl(host->ioaddr + S3C_SDHCI_CONTROL2); > > if (get_curclk(tmp) != ourhost->cur_clk) { > @@ -92,13 +87,13 @@ static void sdhci_s3c_check_sclk(struct sdhci_host *host) > */ > static unsigned int sdhci_s3c_get_max_clk(struct sdhci_host *host) > { > - struct sdhci_s3c *ourhost = to_s3c(host); > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > + struct sdhci_s3c *ourhost = pltfm_host->priv; > struct clk *busclk; > unsigned int rate, max; > int clk; > > /* note, a reset will reset the clock source */ > - > sdhci_s3c_check_sclk(host); > > for (max = 0, clk = 0; clk < MAX_BUS_CLK; clk++) { > @@ -163,7 +158,8 @@ static unsigned int sdhci_s3c_consider_clock(struct > sdhci_s3c *ourhost, > */ > static void sdhci_s3c_set_clock(struct sdhci_host *host, unsigned int clock) > { > - struct sdhci_s3c *ourhost = to_s3c(host); > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > + struct sdhci_s3c *ourhost = pltfm_host->priv; > unsigned int best = UINT_MAX; > unsigned int delta; > int best_src = 0; > @@ -233,7 +229,8 @@ static void sdhci_s3c_set_clock(struct sdhci_host *host, > unsigned int clock) > */ > static unsigned int sdhci_s3c_get_min_clock(struct sdhci_host *host) > { > - struct sdhci_s3c *ourhost = to_s3c(host); > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > + struct sdhci_s3c *ourhost = pltfm_host->priv; > unsigned int delta, min = UINT_MAX; > int src; > > @@ -251,27 +248,27 @@ static unsigned int sdhci_s3c_get_min_clock(struct > sdhci_host *host) > /* sdhci_cmu_get_max_clk - callback to get maximum clock frequency.*/ > static unsigned int sdhci_cmu_get_max_clock(struct sdhci_host *host) > { > - struct sdhci_s3c *ourhost = to_s3c(host); > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > > - return clk_round_rate(ourhost->clk_bus[ourhost->cur_clk], UINT_MAX); > + return clk_round_rate(pltfm_host->clk, UINT_MAX); > } > > /* sdhci_cmu_get_min_clock - callback to get minimal supported clock value. > */ > static unsigned int sdhci_cmu_get_min_clock(struct sdhci_host *host) > { > - struct sdhci_s3c *ourhost = to_s3c(host); > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > > /* > * initial clock can be in the frequency range of > * 100KHz-400KHz, so we set it as max value. > */ > - return clk_round_rate(ourhost->clk_bus[ourhost->cur_clk], 40); > + return clk_round_rate(pltfm_host->clk, 40); > } > > /* sdhci_cmu_set_clock - callback on clock change.*/ > static void sdhci_cmu_set_clock(struct sdhci_host *host, unsigned int clock) > { > - struct sdhci_s3c *ourhost = to_s3c(host); > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > > /* don't bother if the clock is going off */ > if (clock == 0) > @@ -279,7 +276,7 @@ static void sdhci_cmu_set_clock(struct sdhci_host *host, > unsign
[PATCH 1/4] mmc: sdhci-s3c: use the sdhci-pltfm for Samsung-SoC
This patch is change to use the sdhci-pltfm.c Signed-off-by: Jaehoon Chung signed-off-by: Kyungmin Park --- drivers/mmc/host/sdhci-s3c.c | 218 ++ 1 files changed, 71 insertions(+), 147 deletions(-) diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index 1af756e..a651c1e 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c @@ -26,6 +26,7 @@ #include #include +#include "sdhci-pltfm.h" #include "sdhci.h" #define MAX_BUS_CLK(4) @@ -41,9 +42,7 @@ * @clk_bus: The clocks that are available for the SD/MMC bus clock. */ struct sdhci_s3c { - struct sdhci_host *host; struct platform_device *pdev; - struct resource *ioarea; struct s3c_sdhci_platdata *pdata; unsigned intcur_clk; int ext_cd_irq; @@ -53,11 +52,6 @@ struct sdhci_s3c { struct clk *clk_bus[MAX_BUS_CLK]; }; -static inline struct sdhci_s3c *to_s3c(struct sdhci_host *host) -{ - return sdhci_priv(host); -} - /** * get_curclk - convert ctrl2 register to clock source number * @ctrl2: Control2 register value. @@ -72,7 +66,8 @@ static u32 get_curclk(u32 ctrl2) static void sdhci_s3c_check_sclk(struct sdhci_host *host) { - struct sdhci_s3c *ourhost = to_s3c(host); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_s3c *ourhost = pltfm_host->priv; u32 tmp = readl(host->ioaddr + S3C_SDHCI_CONTROL2); if (get_curclk(tmp) != ourhost->cur_clk) { @@ -92,13 +87,13 @@ static void sdhci_s3c_check_sclk(struct sdhci_host *host) */ static unsigned int sdhci_s3c_get_max_clk(struct sdhci_host *host) { - struct sdhci_s3c *ourhost = to_s3c(host); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_s3c *ourhost = pltfm_host->priv; struct clk *busclk; unsigned int rate, max; int clk; /* note, a reset will reset the clock source */ - sdhci_s3c_check_sclk(host); for (max = 0, clk = 0; clk < MAX_BUS_CLK; clk++) { @@ -163,7 +158,8 @@ static unsigned int sdhci_s3c_consider_clock(struct sdhci_s3c *ourhost, */ static void sdhci_s3c_set_clock(struct sdhci_host *host, unsigned int clock) { - struct sdhci_s3c *ourhost = to_s3c(host); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_s3c *ourhost = pltfm_host->priv; unsigned int best = UINT_MAX; unsigned int delta; int best_src = 0; @@ -233,7 +229,8 @@ static void sdhci_s3c_set_clock(struct sdhci_host *host, unsigned int clock) */ static unsigned int sdhci_s3c_get_min_clock(struct sdhci_host *host) { - struct sdhci_s3c *ourhost = to_s3c(host); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_s3c *ourhost = pltfm_host->priv; unsigned int delta, min = UINT_MAX; int src; @@ -251,27 +248,27 @@ static unsigned int sdhci_s3c_get_min_clock(struct sdhci_host *host) /* sdhci_cmu_get_max_clk - callback to get maximum clock frequency.*/ static unsigned int sdhci_cmu_get_max_clock(struct sdhci_host *host) { - struct sdhci_s3c *ourhost = to_s3c(host); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); - return clk_round_rate(ourhost->clk_bus[ourhost->cur_clk], UINT_MAX); + return clk_round_rate(pltfm_host->clk, UINT_MAX); } /* sdhci_cmu_get_min_clock - callback to get minimal supported clock value. */ static unsigned int sdhci_cmu_get_min_clock(struct sdhci_host *host) { - struct sdhci_s3c *ourhost = to_s3c(host); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); /* * initial clock can be in the frequency range of * 100KHz-400KHz, so we set it as max value. */ - return clk_round_rate(ourhost->clk_bus[ourhost->cur_clk], 40); + return clk_round_rate(pltfm_host->clk, 40); } /* sdhci_cmu_set_clock - callback on clock change.*/ static void sdhci_cmu_set_clock(struct sdhci_host *host, unsigned int clock) { - struct sdhci_s3c *ourhost = to_s3c(host); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); /* don't bother if the clock is going off */ if (clock == 0) @@ -279,7 +276,7 @@ static void sdhci_cmu_set_clock(struct sdhci_host *host, unsigned int clock) sdhci_s3c_set_clock(host, clock); - clk_set_rate(ourhost->clk_bus[ourhost->cur_clk], clock); + clk_set_rate(pltfm_host->clk, clock); host->clock = clock; } @@ -382,52 +379,50 @@ static void sdhci_s3c_setup_card_detect_gpio(struct sdhci_s3c *sc) } } +static struct sdhci_pltfm_data sdhci_s3c_pdata = { + .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC | + SDHCI_QUIRK_NO_HISPD_BIT | SDHCI_QUIRK_NO_BUSY_IRQ | + SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 | + SD