LKML Archive on lore.kernel.org help / color / mirror / Atom feed
From: Carlos Aguiar <carlos.aguiar@indt.org.br> To: ext Pierre Ossman <drzeus-list@drzeus.cx> Cc: Tony Lindgren <tony@atomide.com>, linux-kernel@vger.kernel.org Subject: [PATCH 09/18] MMC: OMAP: Power functions modified to MMC multislot support Date: Wed, 26 Mar 2008 16:09:22 -0400 [thread overview] Message-ID: <47EAAD72.2020902@indt.org.br> (raw) In-Reply-To: <20080324132631.1e0d2125@mjolnir.drzeus.cx> From: Juha Yrjola <juha.yrjola@solidboot.com> Modifications at power functions to MMC multislot support. This patch also move board-specific code out of MMC OMAP driver. Signed-off-by: Juha Yrjola <juha.yrjola@solidboot.com> Signed-off-by: Carlos Eduardo Aguiar <carlos.aguiar@indt.org.br> Signed-off-by: Tony Lindgren <tony@atomide.com> --- drivers/mmc/host/omap.c | 88 ++++++++++++++++++++--------------------------- 1 files changed, 37 insertions(+), 51 deletions(-) diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index e4e7537..dbf831f 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c @@ -983,52 +983,27 @@ static void mmc_omap_request(struct mmc_host *mmc, struct mmc_request *req) mmc_omap_start_request(host, req); } -static void innovator_fpga_socket_power(int on) +static void mmc_omap_set_power(struct mmc_omap_slot *slot, int power_on, + int vdd) { -#if defined(CONFIG_MACH_OMAP_INNOVATOR) && defined(CONFIG_ARCH_OMAP15XX) - if (on) { - fpga_write(fpga_read(OMAP1510_FPGA_POWER) | (1 << 3), - OMAP1510_FPGA_POWER); - } else { - fpga_write(fpga_read(OMAP1510_FPGA_POWER) & ~(1 << 3), - OMAP1510_FPGA_POWER); - } -#endif -} + struct mmc_omap_host *host; -/* - * Turn the socket power on/off. Innovator uses FPGA, most boards - * probably use GPIO. - */ -static void mmc_omap_power(struct mmc_omap_host *host, int on) -{ - if (on) { - if (machine_is_omap_innovator()) - innovator_fpga_socket_power(1); - else if (machine_is_omap_h2()) - tps65010_set_gpio_out_value(GPIO3, HIGH); - else if (machine_is_omap_h3()) - /* GPIO 4 of TPS65010 sends SD_EN signal */ - tps65010_set_gpio_out_value(GPIO4, HIGH); - else if (cpu_is_omap24xx()) { - u16 reg = OMAP_MMC_READ(host, CON); - OMAP_MMC_WRITE(host, CON, reg | (1 << 11)); - } else - if (host->power_pin >= 0) - omap_set_gpio_dataout(host->power_pin, 1); - } else { - if (machine_is_omap_innovator()) - innovator_fpga_socket_power(0); - else if (machine_is_omap_h2()) - tps65010_set_gpio_out_value(GPIO3, LOW); - else if (machine_is_omap_h3()) - tps65010_set_gpio_out_value(GPIO4, LOW); - else if (cpu_is_omap24xx()) { - u16 reg = OMAP_MMC_READ(host, CON); - OMAP_MMC_WRITE(host, CON, reg & ~(1 << 11)); - } else - if (host->power_pin >= 0) - omap_set_gpio_dataout(host->power_pin, 0); + host = slot->host; + + if (slot->pdata->set_power != NULL) + slot->pdata->set_power(mmc_dev(slot->mmc), slot->id, power_on, + vdd); + + if (cpu_is_omap24xx()) { + u16 w; + + if (power_on) { + w = OMAP_MMC_READ(host, CON); + OMAP_MMC_WRITE(host, CON, w | (1 << 11)); + } else { + w = OMAP_MMC_READ(host, CON); + OMAP_MMC_WRITE(host, CON, w & ~(1 << 11)); + } } } @@ -1067,23 +1042,31 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) int i, dsor; dsor = mmc_omap_calc_divisor(mmc, ios); - host->bus_mode = ios->bus_mode; - host->hw_bus_mode = host->bus_mode; + + mmc_omap_select_slot(slot, 0); + + if (ios->vdd != slot->vdd) + slot->vdd = ios->vdd; switch (ios->power_mode) { case MMC_POWER_OFF: - mmc_omap_power(host, 0); + mmc_omap_set_power(slot, 0, ios->vdd); break; case MMC_POWER_UP: /* Cannot touch dsor yet, just power up MMC */ - mmc_omap_power(host, 1); - return; + mmc_omap_set_power(slot, 1, ios->vdd); + goto exit; case MMC_POWER_ON: dsor |= 1 << 11; break; } - clk_enable(host->fclk); + if (slot->bus_mode != ios->bus_mode) { + if (slot->pdata->set_bus_mode != NULL) + slot->pdata->set_bus_mode(mmc_dev(mmc), slot->id, + ios->bus_mode); + slot->bus_mode = ios->bus_mode; + } /* On insanely high arm_per frequencies something sometimes * goes somehow out of sync, and the POW bit is not being set, @@ -1091,6 +1074,7 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) * Writing to the CON register twice seems to do the trick. */ for (i = 0; i < 2; i++) OMAP_MMC_WRITE(host, CON, dsor); + slot->saved_con = dsor; if (ios->power_mode == MMC_POWER_ON) { /* Send clock cycles, poll completion */ OMAP_MMC_WRITE(host, IE, 0); @@ -1099,7 +1083,9 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) while ((OMAP_MMC_READ(host, STAT) & 1) == 0); OMAP_MMC_WRITE(host, STAT, 1); } - clk_disable(host->fclk); + +exit: + mmc_omap_release_slot(slot); } static const struct mmc_host_ops mmc_omap_ops = { -- 1.5.3.GIT
next prev parent reply other threads:[~2008-03-26 20:16 UTC|newest] Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top 2008-03-14 19:35 [PATCH 00/18] MMC: OMAP: Sync MMC OMAP driver with mainline tree Carlos Aguiar 2008-03-24 12:26 ` Pierre Ossman 2008-03-26 20:08 ` Carlos Aguiar 2008-03-30 16:10 ` Pierre Ossman 2008-03-26 20:08 ` [PATCH 01/18] MMC: OMAP: Remove some opcodes from host driver Carlos Aguiar 2008-03-26 20:08 ` [PATCH 02/18] MMC: OMAP: Remove extra divisor increase Carlos Aguiar 2008-03-26 20:08 ` [PATCH 03/18] MMC: OMAP: Fix the BYTEBLOCK capability removal Carlos Aguiar 2008-03-26 20:08 ` [PATCH 04/18] MMC: OMAP: Remove cover switch handling to allow adding multislot support Carlos Aguiar 2008-03-26 20:08 ` [PATCH 05/18] MMC: OMAP: Introduce new multislot structure and change driver to use it Carlos Aguiar 2008-03-26 20:09 ` [PATCH 06/18] MMC: OMAP: Add back cover switch support Carlos Aguiar 2008-03-26 20:09 ` [PATCH 07/18] MMC: OMAP: New release dma and abort xfer functions Carlos Aguiar 2008-03-26 20:09 ` [PATCH 08/18] MMC: OMAP: Fix timeout calculation for MMC multislot support Carlos Aguiar 2008-03-26 20:09 ` Carlos Aguiar [this message] 2008-03-26 20:09 ` [PATCH 10/18] MMC: OMAP: General cleanup " Carlos Aguiar 2008-03-26 20:09 ` [PATCH 11/18] MMC: OMAP: Abort stuck commands Carlos Aguiar 2008-03-26 20:09 ` [PATCH 12/18] MMC: OMAP: Using setup_timer instead of init_timer Carlos Aguiar 2008-03-26 20:09 ` [PATCH 13/18] MMC: OMAP: Check the get_cover_state function pointer if not set Carlos Aguiar 2008-03-26 20:09 ` [PATCH 14/18] MMC: OMAP: Use tasklet instead of workqueue for cover switch notification Carlos Aguiar 2008-03-26 20:09 ` [PATCH 15/18] MMC: OMAP: Move failing command abortion to workqueue Carlos Aguiar 2008-03-26 20:09 ` [PATCH 16/18] MMC: OMAP: Lazy clock shutdown Carlos Aguiar 2008-03-26 20:09 ` [PATCH 17/18] MMC: OMAP: Start new commands from work queue instead of irq Carlos Aguiar 2008-03-26 20:10 ` [PATCH 18/18] MMC: OMAP: Do not busy wait for end of command for ever Carlos Aguiar -- strict thread matches above, loose matches on Subject: below -- 2008-03-14 19:36 [PATCH 09/18] MMC: OMAP: Power functions modified to MMC multislot support Carlos Aguiar 2008-01-28 19:07 Carlos Aguiar
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=47EAAD72.2020902@indt.org.br \ --to=carlos.aguiar@indt.org.br \ --cc=drzeus-list@drzeus.cx \ --cc=linux-kernel@vger.kernel.org \ --cc=tony@atomide.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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).