-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Really basic init sequence for SDIO cards. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
- Loading branch information
Pierre Ossman
committed
Sep 23, 2007
1 parent
1d4de9e
commit 5c4e6f1
Showing
10 changed files
with
304 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
/* | ||
* linux/drivers/mmc/sdio.c | ||
* | ||
* Copyright 2006-2007 Pierre Ossman | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or (at | ||
* your option) any later version. | ||
*/ | ||
|
||
#include <linux/err.h> | ||
|
||
#include <linux/mmc/host.h> | ||
#include <linux/mmc/card.h> | ||
|
||
#include "core.h" | ||
#include "bus.h" | ||
#include "mmc_ops.h" | ||
#include "sd_ops.h" | ||
#include "sdio_ops.h" | ||
|
||
/* | ||
* Host is being removed. Free up the current card. | ||
*/ | ||
static void mmc_sdio_remove(struct mmc_host *host) | ||
{ | ||
BUG_ON(!host); | ||
BUG_ON(!host->card); | ||
|
||
mmc_remove_card(host->card); | ||
host->card = NULL; | ||
} | ||
|
||
/* | ||
* Card detection callback from host. | ||
*/ | ||
static void mmc_sdio_detect(struct mmc_host *host) | ||
{ | ||
int err; | ||
|
||
BUG_ON(!host); | ||
BUG_ON(!host->card); | ||
|
||
mmc_claim_host(host); | ||
|
||
/* | ||
* Just check if our card has been removed. | ||
*/ | ||
err = mmc_select_card(host->card); | ||
|
||
mmc_release_host(host); | ||
|
||
if (err) { | ||
mmc_sdio_remove(host); | ||
|
||
mmc_claim_host(host); | ||
mmc_detach_bus(host); | ||
mmc_release_host(host); | ||
} | ||
} | ||
|
||
|
||
static const struct mmc_bus_ops mmc_sdio_ops = { | ||
.remove = mmc_sdio_remove, | ||
.detect = mmc_sdio_detect, | ||
}; | ||
|
||
|
||
/* | ||
* Starting point for SDIO card init. | ||
*/ | ||
int mmc_attach_sdio(struct mmc_host *host, u32 ocr) | ||
{ | ||
int err; | ||
int funcs; | ||
struct mmc_card *card; | ||
|
||
BUG_ON(!host); | ||
BUG_ON(!host->claimed); | ||
|
||
mmc_attach_bus(host, &mmc_sdio_ops); | ||
|
||
/* | ||
* Sanity check the voltages that the card claims to | ||
* support. | ||
*/ | ||
if (ocr & 0x7F) { | ||
printk(KERN_WARNING "%s: card claims to support voltages " | ||
"below the defined range. These will be ignored.\n", | ||
mmc_hostname(host)); | ||
ocr &= ~0x7F; | ||
} | ||
|
||
if (ocr & MMC_VDD_165_195) { | ||
printk(KERN_WARNING "%s: SDIO card claims to support the " | ||
"incompletely defined 'low voltage range'. This " | ||
"will be ignored.\n", mmc_hostname(host)); | ||
ocr &= ~MMC_VDD_165_195; | ||
} | ||
|
||
host->ocr = mmc_select_voltage(host, ocr); | ||
|
||
/* | ||
* Can we support the voltage(s) of the card(s)? | ||
*/ | ||
if (!host->ocr) { | ||
err = -EINVAL; | ||
goto err; | ||
} | ||
|
||
/* | ||
* Inform the card of the voltage | ||
*/ | ||
err = mmc_send_io_op_cond(host, host->ocr, &ocr); | ||
if (err) | ||
goto err; | ||
|
||
/* | ||
* The number of functions on the card is encoded inside | ||
* the ocr. | ||
*/ | ||
funcs = (ocr & 0x70000000) >> 28; | ||
|
||
/* | ||
* Allocate card structure. | ||
*/ | ||
card = mmc_alloc_card(host); | ||
if (IS_ERR(card)) { | ||
err = PTR_ERR(card); | ||
goto err; | ||
} | ||
|
||
card->type = MMC_TYPE_SDIO; | ||
|
||
/* | ||
* Set card RCA. | ||
*/ | ||
err = mmc_send_relative_addr(host, &card->rca); | ||
if (err) | ||
goto free_card; | ||
|
||
mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL); | ||
|
||
/* | ||
* Select card, as all following commands rely on that. | ||
*/ | ||
err = mmc_select_card(card); | ||
if (err) | ||
goto free_card; | ||
|
||
host->card = card; | ||
|
||
mmc_release_host(host); | ||
|
||
err = mmc_add_card(host->card); | ||
if (err) | ||
goto reclaim_host; | ||
|
||
return 0; | ||
|
||
reclaim_host: | ||
mmc_claim_host(host); | ||
free_card: | ||
mmc_remove_card(card); | ||
host->card = NULL; | ||
err: | ||
mmc_detach_bus(host); | ||
mmc_release_host(host); | ||
|
||
printk(KERN_ERR "%s: error %d whilst initialising SDIO card\n", | ||
mmc_hostname(host), err); | ||
|
||
return err; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
/* | ||
* linux/drivers/mmc/sdio_ops.c | ||
* | ||
* Copyright 2006-2007 Pierre Ossman | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or (at | ||
* your option) any later version. | ||
*/ | ||
|
||
#include <linux/mmc/host.h> | ||
#include <linux/mmc/mmc.h> | ||
#include <linux/mmc/sdio.h> | ||
|
||
#include "core.h" | ||
|
||
int mmc_send_io_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) | ||
{ | ||
struct mmc_command cmd; | ||
int i, err = 0; | ||
|
||
BUG_ON(!host); | ||
|
||
memset(&cmd, 0, sizeof(struct mmc_command)); | ||
|
||
cmd.opcode = SD_IO_SEND_OP_COND; | ||
cmd.arg = ocr; | ||
cmd.flags = MMC_RSP_R4 | MMC_CMD_BCR; | ||
|
||
for (i = 100; i; i--) { | ||
err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES); | ||
if (err) | ||
break; | ||
|
||
if (cmd.resp[0] & MMC_CARD_BUSY || ocr == 0) | ||
break; | ||
|
||
err = -ETIMEDOUT; | ||
|
||
mmc_delay(10); | ||
} | ||
|
||
if (rocr) | ||
*rocr = cmd.resp[0]; | ||
|
||
return err; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
/* | ||
* linux/drivers/mmc/sdio_ops.c | ||
* | ||
* Copyright 2006-2007 Pierre Ossman | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or (at | ||
* your option) any later version. | ||
*/ | ||
|
||
#ifndef _MMC_SDIO_OPS_H | ||
#define _MMC_SDIO_OPS_H | ||
|
||
int mmc_send_io_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr); | ||
|
||
#endif | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/* | ||
* include/linux/mmc/sdio.h | ||
* | ||
* Copyright 2006-2007 Pierre Ossman | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or (at | ||
* your option) any later version. | ||
*/ | ||
|
||
#ifndef MMC_SDIO_H | ||
#define MMC_SDIO_H | ||
|
||
/* SDIO commands type argument response */ | ||
#define SD_IO_SEND_OP_COND 5 /* bcr [23:0] OCR R4 */ | ||
|
||
#endif | ||
|