--- Begin Message ---
Author: erin_yueh
Date: 2007-12-19 10:34:34 +0100 (Wed, 19 Dec 2007)
New Revision: 3684
Modified:
trunk/src/target/gsm/include/libgsmd/misc.h
trunk/src/target/gsm/include/libgsmd/sms.h
trunk/src/target/gsm/src/gsmd/usock.c
trunk/src/target/gsm/src/libgsmd/libgsmd_network.c
trunk/src/target/gsm/src/util/shell.c
Log:
gsmd: set and get Voicemail number (Erin Yueh)
Modified: trunk/src/target/gsm/include/libgsmd/misc.h
===================================================================
--- trunk/src/target/gsm/include/libgsmd/misc.h 2007-12-18 18:18:39 UTC (rev
3683)
+++ trunk/src/target/gsm/include/libgsmd/misc.h 2007-12-19 09:34:34 UTC (rev
3684)
@@ -34,14 +34,6 @@
/* Get Signal Strehngth (Chapter 8.5) */
extern int lgsm_signal_quality(struct lgsm_handle *h);
-/* Set voice mail number */
-extern int lgsm_voicemail_set(struct lgsm_handle *lh,
- struct lgsm_addr *addr);
-
-/* Get currently configured voice mail number */
-extern int lgsm_voicemail_get(struct lgsm_handle *lh,
- struct lgsm_addr *addr);
-
/* Operator Selection, Network Registration */
extern int lgsm_oper_get(struct lgsm_handle *lh);
extern int lgsm_opers_get(struct lgsm_handle *lh);
Modified: trunk/src/target/gsm/include/libgsmd/sms.h
===================================================================
--- trunk/src/target/gsm/include/libgsmd/sms.h 2007-12-18 18:18:39 UTC (rev
3683)
+++ trunk/src/target/gsm/include/libgsmd/sms.h 2007-12-19 09:34:34 UTC (rev
3684)
@@ -79,6 +79,8 @@
extern int lgsm_sms_set_storage(struct lgsm_handle *lh,
enum ts0705_mem_type mem1, enum ts0705_mem_type mem2,
enum ts0705_mem_type mem3);
+extern int lgsm_number2addr(struct gsmd_addr *dst, const char *src,
+ int skipplus);
/* Retrieve current default service centre address */
extern int lgsm_sms_get_smsc(struct lgsm_handle *lh);
Modified: trunk/src/target/gsm/src/gsmd/usock.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/usock.c 2007-12-18 18:18:39 UTC (rev
3683)
+++ trunk/src/target/gsm/src/gsmd/usock.c 2007-12-19 09:34:34 UTC (rev
3684)
@@ -520,55 +520,38 @@
static int network_vmail_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
{
struct gsmd_user *gu = ctx;
- struct gsmd_voicemail *vmail;
- struct gsmd_ucmd *ucmd;
- char *comma;
+ struct gsmd_voicemail vmail;
+ struct gsm_extrsp *er;
+ int rc;
+ int ret = cmd->ret;
- DEBUGP("entering(cmd=%p, gu=%p)\n", cmd, gu);
+ DEBUGP("cmd = '%s', resp: '%s'\n", cmd->buf, resp);
- ucmd = ucmd_alloc(sizeof(*vmail));
- if (!ucmd)
- return -ENOMEM;
-
- /* FIXME: pass error values back somehow */
- ucmd->hdr.version = GSMD_PROTO_VERSION;
- ucmd->hdr.msg_type = GSMD_MSG_NETWORK;
- ucmd->hdr.len = sizeof(*vmail);
- ucmd->hdr.id = cmd->id;
-
if (cmd->buf[7] == '=') {
/* response to set command */
- ucmd->hdr.msg_subtype = GSMD_NETWORK_VMAIL_SET;
- /* FIXME: */
- return 0;
+ rc = gsmd_ucmd_submit(gu, GSMD_MSG_NETWORK,
+ GSMD_NETWORK_VMAIL_SET,cmd->id, sizeof(ret),
&ret);
} else {
/* response to get command */
- char *tok = strtok(resp, ",");
- if (!tok)
- goto out_free_einval;
- ucmd->hdr.msg_subtype = GSMD_NETWORK_VMAIL_GET;
- vmail->enable = atoi(tok);
-
- tok = strtok(NULL, ",");
- if (!tok)
- goto out_free_einval;
- strncpy(vmail->addr.number, tok, GSMD_ADDR_MAXLEN);
- vmail->addr.number[GSMD_ADDR_MAXLEN] = '\0';
-
- tok = strtok(NULL, ",");
- if (!tok)
- goto out_free_einval;
- vmail->addr.type = atoi(tok);
+ if (strncmp(resp, "+CSVM: ", 7))
+ return -EINVAL;
+ resp += 7;
+ er = extrsp_parse(gsmd_tallocs, resp);
+ if(!er)
+ return -ENOMEM;
+ if(er->num_tokens == 3 &&
+ er->tokens[0].type == GSMD_ECMD_RTT_NUMERIC &&
+ er->tokens[1].type == GSMD_ECMD_RTT_STRING &&
+ er->tokens[2].type == GSMD_ECMD_RTT_NUMERIC) {
+ vmail.enable = er->tokens[0].u.numeric;
+ strcpy(vmail.addr.number,
er->tokens[1].u.string);
+ vmail.addr.type = er->tokens[2].u.numeric;
+ }
+ rc = gsmd_ucmd_submit(gu, GSMD_MSG_NETWORK,
GSMD_NETWORK_VMAIL_GET,
+ cmd->id, sizeof(vmail), &vmail);
+ talloc_free(er);
}
-
- usock_cmd_enqueue(ucmd, gu);
-
- return 0;
-
-out_free_einval:
- gsmd_log(GSMD_ERROR, "can't understand voicemail response\n");
- talloc_free(ucmd);
- return -EINVAL;
+ return rc;
}
int gsmd_ucmd_submit(struct gsmd_user *gu, u_int8_t msg_type,
@@ -813,7 +796,9 @@
cmd = atcmd_fill("AT+CSVM?", 8+1, &network_vmail_cb, gu, 0,
NULL);
break;
case GSMD_NETWORK_VMAIL_SET:
- cmd = atcmd_fill("AT+CSVM=", 8+1, &network_vmail_cb, gu, 0,
NULL);
+ cmdlen = sprintf(buffer, "AT+CSVM=1,\"%s\",%d",
+ vmail->addr.number, vmail->addr.type);
+ cmd = atcmd_fill(buffer, cmdlen + 1, &network_vmail_cb, gu, 0,
NULL);
break;
case GSMD_NETWORK_SIGQ_GET:
cmd = atcmd_fill("AT+CSQ", 6+1, &network_sigq_cb, gu, 0, NULL);
Modified: trunk/src/target/gsm/src/libgsmd/libgsmd_network.c
===================================================================
--- trunk/src/target/gsm/src/libgsmd/libgsmd_network.c 2007-12-18 18:18:39 UTC
(rev 3683)
+++ trunk/src/target/gsm/src/libgsmd/libgsmd_network.c 2007-12-19 09:34:34 UTC
(rev 3684)
@@ -26,6 +26,7 @@
#include <libgsmd/libgsmd.h>
#include <libgsmd/misc.h>
+#include <libgsmd/sms.h>
#include <gsmd/usock.h>
#include <gsmd/event.h>
@@ -133,3 +134,36 @@
{
return lgsm_send_simple(lh, GSMD_MSG_NETWORK, GSMD_NETWORK_GET_NUMBER);
}
+
+int lgsm_voicemail_set(struct lgsm_handle *lh, const char *number)
+{
+ struct gsmd_msg_hdr *gmh;
+ struct gsmd_voicemail *vmail;
+ int rc;
+
+ gmh = lgsm_gmh_fill(GSMD_MSG_NETWORK,
+ GSMD_NETWORK_VMAIL_SET, sizeof(*vmail));
+ if (!gmh)
+ return -ENOMEM;
+
+ vmail = (struct gsmd_voicemail *) gmh->data;
+ vmail->enable = 1;
+ if (lgsm_number2addr(&vmail->addr, number, 0)){
+ lgsm_gmh_free(gmh);
+ return -EINVAL;
+ }
+
+ if (lgsm_send(lh, gmh) < gmh->len + sizeof(*gmh)) {
+ lgsm_gmh_free(gmh);
+ return -EIO;
+ }
+
+ lgsm_gmh_free(gmh);
+ return 0;
+}
+
+/* Get currently configured voice mail number */
+int lgsm_voicemail_get(struct lgsm_handle *lh)
+{
+ return lgsm_send_simple(lh, GSMD_MSG_NETWORK, GSMD_NETWORK_VMAIL_GET);
+}
Modified: trunk/src/target/gsm/src/util/shell.c
===================================================================
--- trunk/src/target/gsm/src/util/shell.c 2007-12-18 18:18:39 UTC (rev
3683)
+++ trunk/src/target/gsm/src/util/shell.c 2007-12-19 09:34:34 UTC (rev
3684)
@@ -285,6 +285,9 @@
((void *) gmh + sizeof(*gmh));
const struct gsmd_own_number *num = (struct gsmd_own_number *)
((void *) gmh + sizeof(*gmh));
+ const struct gsmd_voicemail *vmail = (struct gsmd_voicemail *)
+ ((void *) gmh + sizeof(*gmh));
+ int result = *(int *) gmh->data;
static const char *oper_stat[] = {
[GSMD_OPER_UNKNOWN] = "of unknown status",
[GSMD_OPER_AVAILABLE] = "available",
@@ -341,6 +344,18 @@
"" : " services");
pending_responses --;
break;
+ case GSMD_NETWORK_VMAIL_SET:
+ if (result)
+ printf("Set voicemail error %i\n", result);
+ else
+ printf("Set voicemail OK \n");
+ pending_responses --;
+ break;
+ case GSMD_NETWORK_VMAIL_GET:
+ if(vmail->addr.number)
+ printf ("voicemail number is %s \n",vmail->addr.number);
+ pending_responses --;
+ break;
default:
return -EINVAL;
}
@@ -481,6 +496,8 @@
"\tsM\tSMS Set preferred storage (sM=mem1,mem2,mem3)\n"
"\tsc\tSMS Show Service Centre\n"
"\tsC\tSMS Set Service Centre (sC=number)\n"
+ "\tgvm\tGet Voicemail number\n"
+ "\tsvm\tSet Voicemail number(svm=number)\n"
"\tim\tGet imsi\n"
"\tcs\tGet Call status\n"
"\tgp\tGet PIN status\n"
@@ -766,6 +783,18 @@
} else if (!strcmp(buf, "n")) {
lgsm_get_subscriber_num(lgsmh);
pending_responses ++;
+ } else if ( !strncmp(buf, "gvm", 3)) {
+ printf("Get Voicemail Number\n");
+ lgsm_voicemail_get(lgsmh);
+ pending_responses ++;
+ } else if ( !strncmp(buf, "svm", 3)) {
+ printf("Set Voicemail Number\n");
+ ptr = strchr(buf, '=');
+ if (!ptr || strlen(ptr) < 3)
+ printf("No.\n");
+ else
+ lgsm_voicemail_set(lgsmh, ptr + 1);
+ pending_responses ++;
} else if (!strncmp(buf, "im", 2)) {
printf("Get imsi\n");
lgsm_get_imsi(lgsmh);
--- End Message ---
--- Begin Message ---
Author: laforge
Date: 2007-12-19 11:03:34 +0100 (Wed, 19 Dec 2007)
New Revision: 3686
Modified:
branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch
Log:
s3c_mci: major codingstyle cleanup (based on checkpatch.pl)
Modified: branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch
===================================================================
--- branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch 2007-12-19
09:56:49 UTC (rev 3685)
+++ branches/src/target/kernel/2.6.24.x/patches/s3c_mci.patch 2007-12-19
10:03:34 UTC (rev 3686)
@@ -1,5 +1,7 @@
This is the latest S3C MMC/SD driver by Thomas Kleffel
+Signed-off-by: Harald Welte <[EMAIL PROTECTED]>
+
Index: linux-2.6/include/asm-arm/arch-s3c2410/regs-sdi.h
===================================================================
--- linux-2.6.orig/include/asm-arm/arch-s3c2410/regs-sdi.h
@@ -71,85 +73,11 @@
#define S3C2410_SDIFSTA_RFLAST (1<<9)
#define S3C2410_SDIFSTA_RFFULL (1<<8)
#define S3C2410_SDIFSTA_RFHALF (1<<7)
-Index: linux-2.6/drivers/mmc/host/mmc_debug.c
-===================================================================
---- /dev/null
-+++ linux-2.6/drivers/mmc/host/mmc_debug.c
-@@ -0,0 +1,57 @@
-+/*
-+ * linux/drivers/mmc/mmc_debug.c
-+ *
-+ * Copyright (C) 2003 maintech GmbH, Thomas Kleffel <[EMAIL PROTECTED]>
-+ *
-+ * This file contains debug helper functions for the MMC/SD stack
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/mmc/core.h>
-+#include <linux/mmc/mmc.h>
-+#include "mmc_debug.h"
-+
-+char *mmc_cmd2str(int cmd)
-+{
-+ switch(cmd) {
-+ case 0: return "GO_IDLE_STATE";
-+ case 1: return "ALL_SEND_OCR";
-+ case 2: return "ALL_SEND_CID";
-+ case 3: return "ALL_SEND_RELATIVE_ADD";
-+ case 6: return "ACMD: SD_SET_BUSWIDTH";
-+ case 7: return "SEL_DESEL_CARD";
-+ case 9: return "SEND_CSD";
-+ case 10: return "SEND_CID";
-+ case 11: return "READ_UNTIL_STOP";
-+ case 12: return "STOP_TRANSMISSION";
-+ case 13: return "SEND_STATUS";
-+ case 15: return "GO_INACTIVE_STATE";
-+ case 16: return "SET_BLOCKLEN";
-+ case 17: return "READ_SINGLE_BLOCK";
-+ case 18: return "READ_MULTIPLE_BLOCK";
-+ case 24: return "WRITE_SINGLE_BLOCK";
-+ case 25: return "WRITE_MULTIPLE_BLOCK";
-+ case 41: return "ACMD: SD_APP_OP_COND";
-+ case 55: return "APP_CMD";
-+ default: return "UNKNOWN";
-+ }
-+}
-+EXPORT_SYMBOL(mmc_cmd2str);
-+
-+char *mmc_err2str(int err)
-+{
-+ switch(err) {
-+ case 0: return "OK";
-+ case -ETIMEDOUT: return "TIMEOUT";
-+ case -EILSEQ: return "BADCRC";
-+ case -EINVAL: return "EINVAL";
-+ case -ENOMEDIUM: return "NOMEDIUM";
-+ default: return "UNKNOWN";
-+ }
-+}
-+EXPORT_SYMBOL(mmc_err2str);
-Index: linux-2.6/drivers/mmc/host/mmc_debug.h
-===================================================================
---- /dev/null
-+++ linux-2.6/drivers/mmc/host/mmc_debug.h
-@@ -0,0 +1,7 @@
-+#ifndef MMC_DEBUG_H
-+#define MMC_DEBUG_H
-+
-+char *mmc_cmd2str(int err);
-+char *mmc_err2str(int err);
-+
-+#endif /* MMC_DEBUG_H */
Index: linux-2.6/drivers/mmc/host/s3cmci.c
===================================================================
--- /dev/null
+++ linux-2.6/drivers/mmc/host/s3cmci.c
-@@ -0,0 +1,1384 @@
+@@ -0,0 +1,1409 @@
+/*
+ * linux/drivers/mmc/s3cmci.h - Samsung S3C MCI driver
+ *
@@ -177,7 +105,6 @@
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/mci.h>
+
-+#include "mmc_debug.h"
+#include "s3cmci.h"
+
+#define DRIVER_NAME "s3c-mci"
@@ -199,12 +126,14 @@
+static const int dbgmap_debug = dbg_debug;
+
+#define dbg(host, channels, args...) \
++ do { \
+ if (dbgmap_err & channels) \
+ dev_err(&host->pdev->dev, args); \
+ else if (dbgmap_info & channels) \
+ dev_info(&host->pdev->dev, args);\
+ else if (dbgmap_debug & channels) \
-+ dev_dbg(&host->pdev->dev, args);
++ dev_dbg(&host->pdev->dev, args); \
++ } while (0)
+
+#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)
+
@@ -218,6 +147,44 @@
+
+#ifdef CONFIG_MMC_DEBUG
+
++static char *mmc_cmd2str(int cmd)
++{
++ switch (cmd) {
++ case 0: return "GO_IDLE_STATE";
++ case 1: return "ALL_SEND_OCR";
++ case 2: return "ALL_SEND_CID";
++ case 3: return "ALL_SEND_RELATIVE_ADD";
++ case 6: return "ACMD: SD_SET_BUSWIDTH";
++ case 7: return "SEL_DESEL_CARD";
++ case 9: return "SEND_CSD";
++ case 10: return "SEND_CID";
++ case 11: return "READ_UNTIL_STOP";
++ case 12: return "STOP_TRANSMISSION";
++ case 13: return "SEND_STATUS";
++ case 15: return "GO_INACTIVE_STATE";
++ case 16: return "SET_BLOCKLEN";
++ case 17: return "READ_SINGLE_BLOCK";
++ case 18: return "READ_MULTIPLE_BLOCK";
++ case 24: return "WRITE_SINGLE_BLOCK";
++ case 25: return "WRITE_MULTIPLE_BLOCK";
++ case 41: return "ACMD: SD_APP_OP_COND";
++ case 55: return "APP_CMD";
++ default: return "UNKNOWN";
++ }
++}
++
++static char *mmc_err2str(int err)
++{
++ switch (err) {
++ case 0: return "OK";
++ case -ETIMEDOUT: return "TIMEOUT";
++ case -EILSEQ: return "BADCRC";
++ case -EINVAL: return "EINVAL";
++ case -ENOMEDIUM: return "NOMEDIUM";
++ default: return "UNKNOWN";
++ }
++}
++
+static inline void dbg_dumpregs(struct s3cmci_host *host, char *prefix)
+{
+ u32 con, pre, cmdarg, cmdcon, cmdsta, r0, r1, r2, r3, timer, bsize;
@@ -258,7 +225,7 @@
+static void prepare_dbgmsg(struct s3cmci_host *host, struct mmc_command *cmd,
+ int stop)
+{
-+ snprintf(host->dbgmsg_cmd, 300,
++ snprintf(host->dbgmsg_cmd, 300,
+ "#%u%s op:%s(%i) arg:0x%08x flags:0x08%x retries:%u",
+ host->ccnt, (stop?" (STOP)":""), mmc_cmd2str(cmd->opcode),
+ cmd->opcode, cmd->arg, cmd->flags, cmd->retries);
@@ -311,7 +278,7 @@
+ u32 newmask;
+
+ newmask = readl(host->base + host->sdiimsk);
-+ newmask|= imask;
++ newmask |= imask;
+
+ writel(newmask, host->base + host->sdiimsk);
+
@@ -323,7 +290,7 @@
+ u32 newmask;
+
+ newmask = readl(host->base + host->sdiimsk);
-+ newmask&= ~imask;
++ newmask &= ~imask;
+
+ writel(newmask, host->base + host->sdiimsk);
+
@@ -336,7 +303,7 @@
+}
+
+static inline int get_data_buffer(struct s3cmci_host *host,
-+ volatile u32 *words, volatile u32 **pointer)
++ u32 *words, u32 **pointer)
+{
+ struct scatterlist *sg;
+
@@ -353,8 +320,8 @@
+ }
+ sg = &host->mrq->data->sg[host->pio_sgptr];
+
-+ *words = sg->length >> 2;
-+ *pointer= page_address(sg_page(sg)) + sg->offset;
++ *words = sg->length >> 2;
++ *pointer = page_address(sg_page(sg)) + sg->offset;
+
+ host->pio_sgptr++;
+
@@ -364,8 +331,10 @@
+ return 0;
+}
+
-+#define FIFO_FILL(host) ((readl(host->base + S3C2410_SDIFSTA) &
S3C2410_SDIFSTA_COUNTMASK) >> 2)
-+#define FIFO_FREE(host) ((63 - (readl(host->base + S3C2410_SDIFSTA) &
S3C2410_SDIFSTA_COUNTMASK)) >> 2)
++#define FIFO_FILL(host) ((readl(host->base + S3C2410_SDIFSTA) & \
++ S3C2410_SDIFSTA_COUNTMASK) >> 2)
++#define FIFO_FREE(host) ((63 - (readl(host->base + S3C2410_SDIFSTA) \
++ & S3C2410_SDIFSTA_COUNTMASK)) >> 2)
+
+static inline void do_pio_read(struct s3cmci_host *host)
+{
@@ -373,7 +342,7 @@
+ u32 fifo;
+ void __iomem *from_ptr;
+
-+ //write real prescaler to host, it might be set slow to fix
++ /* write real prescaler to host, it might be set slow to fix */
+ writel(host->prescaler, host->base + S3C2410_SDIPRE);
+
+ from_ptr = host->base + host->sdidata;
@@ -387,35 +356,33 @@
+ host->complete_what = COMPLETION_FINALIZE;
+
+ dbg(host, dbg_pio, "pio_read(): "
-+ "complete (no more data).\n");
++ "complete (no more data).\n");
+ return;
+ }
+
-+ dbg(host, dbg_pio, "pio_read(): new target: [EMAIL
PROTECTED]",
-+ host->pio_words, host->pio_ptr);
++ dbg(host, dbg_pio, "pio_read(): new target: "
++ "[EMAIL PROTECTED]", host->pio_words,
host->pio_ptr);
+ }
+
+ dbg(host, dbg_pio, "pio_read(): fifo:[%02i] "
-+ "buffer:[%03i] dcnt:[%08X]\n",
-+ fifo, host->pio_words,
-+ readl(host->base + S3C2410_SDIDCNT));
++ "buffer:[%03i] dcnt:[%08X]\n", fifo, host->pio_words,
++ readl(host->base + S3C2410_SDIDCNT));
+
+ if (fifo > host->pio_words)
+ fifo = host->pio_words;
+
-+ host->pio_words-= fifo;
-+ host->pio_count+= fifo;
++ host->pio_words -= fifo;
++ host->pio_count += fifo;
+
-+ while(fifo--) {
++ while (fifo--)
+ *(host->pio_ptr++) = readl(from_ptr);
-+ }
+ }
+
+ if (!host->pio_words) {
+ res = get_data_buffer(host, &host->pio_words, &host->pio_ptr);
+ if (res) {
+ dbg(host, dbg_pio, "pio_read(): "
-+ "complete (no more buffers).\n");
++ "complete (no more buffers).\n");
+ host->pio_active = XFER_NONE;
+ host->complete_what = COMPLETION_FINALIZE;
+
@@ -423,7 +390,8 @@
+ }
+ }
+
-+ enable_imask(host, S3C2410_SDIIMSK_RXFIFOHALF |
S3C2410_SDIIMSK_RXFIFOLAST);
++ enable_imask(host, S3C2410_SDIIMSK_RXFIFOHALF
++ | S3C2410_SDIIMSK_RXFIFOLAST);
+}
+
+static inline void do_pio_write(struct s3cmci_host *host)
@@ -456,12 +424,11 @@
+ if (fifo > host->pio_words)
+ fifo = host->pio_words;
+
-+ host->pio_words-= fifo;
-+ host->pio_count+= fifo;
++ host->pio_words -= fifo;
++ host->pio_count += fifo;
+
-+ while(fifo--) {
++ while (fifo--)
+ writel(*(host->pio_ptr++), to_ptr);
-+ }
+ }
+
+ enable_imask(host, S3C2410_SDIIMSK_TXFIFOHALF);
@@ -499,7 +466,7 @@
+ * ISR for SDI Interface IRQ
+ * Communication between driver and ISR works as follows:
+ * host->mrq points to current request
-+ * host->complete_what tells the ISR when the request is considered
done
++ * host->complete_what tells ISR when the request is considered done
+ * COMPLETION_CMDSENT when the command was sent
+ * COMPLETION_RSPFIN when a response was received
+ * COMPLETION_XFERFINISH when the data transfer is finished
@@ -575,8 +542,8 @@
+ if ((host->pio_active == XFER_READ) &&
+ (mci_fsta & S3C2410_SDIFSTA_RFDET)) {
+
-+ disable_imask(host,
-+ S3C2410_SDIIMSK_RXFIFOHALF |
S3C2410_SDIIMSK_RXFIFOLAST);
++ disable_imask(host, S3C2410_SDIIMSK_RXFIFOHALF |
++ S3C2410_SDIIMSK_RXFIFOLAST);
+
+ tasklet_schedule(&host->pio_tasklet);
+ host->status = "pio rx";
@@ -670,9 +637,8 @@
+ goto close_transfer;
+ }
+
-+ if (host->complete_what == COMPLETION_XFERFINISH_RSPFIN) {
++ if (host->complete_what == COMPLETION_XFERFINISH_RSPFIN)
+ host->complete_what = COMPLETION_RSPFIN;
-+ }
+
+ mci_dclear |= S3C2410_SDIDSTA_XFERFINISH;
+ }
@@ -798,13 +764,13 @@
+ }
+ }
+
-+ // Read response
++ /* Read response */
+ cmd->resp[0] = readl(host->base + S3C2410_SDIRSP0);
+ cmd->resp[1] = readl(host->base + S3C2410_SDIRSP1);
+ cmd->resp[2] = readl(host->base + S3C2410_SDIRSP2);
+ cmd->resp[3] = readl(host->base + S3C2410_SDIRSP3);
+
-+ // reset clock speed, as it could still be set low for
++ /* reset clock speed, as it could still be set low for */
+ writel(host->prescaler, host->base + S3C2410_SDIPRE);
+
+ if (cmd->error)
@@ -813,12 +779,10 @@
+ if (cmd->data && cmd->data->error)
+ debug_as_failure = 1;
+
-+ //if(cmd->flags & MMC_RSP_MAYFAIL) debug_as_failure = 0;
-+
+#ifdef CONFIG_MMC_DEBUG
+ dbg_dumpcmd(host, cmd, debug_as_failure);
+#endif
-+ //Cleanup controller
++ /* Cleanup controller */
+ writel(0, host->base + S3C2410_SDICMDARG);
+ writel(S3C2410_SDIDCON_STOP, host->base + S3C2410_SDIDCON);
+ writel(0, host->base + S3C2410_SDICMDCON);
@@ -833,36 +797,35 @@
+ return;
+ }
+
-+ // If we have no data transfer we are finished here
++ /* If we have no data transfer we are finished here */
+ if (!mrq->data)
+ goto request_done;
+
-+ // Calulate the amout of bytes transfer, but only if there was
-+ // no error
-+ if (mrq->data->error == 0) {
++ /* Calulate the amout of bytes transfer, but only if there was
++ * no error */
++ if (mrq->data->error == 0)
+ mrq->data->bytes_xfered =
+ (mrq->data->blocks * mrq->data->blksz);
-+ } else {
++ else
+ mrq->data->bytes_xfered = 0;
-+ }
+
-+ // If we had an error while transfering data we flush the
-+ // DMA channel and the fifo to clear out any garbage
++ /* If we had an error while transfering data we flush the
++ * DMA channel and the fifo to clear out any garbage */
+ if (mrq->data->error) {
+ if (host->dodma)
+ s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);
+
+ if (host->is2440) {
-+ //Clear failure register and reset fifo
++ /* Clear failure register and reset fifo */
+ writel(S3C2440_SDIFSTA_FIFORESET |
+ S3C2440_SDIFSTA_FIFOFAIL,
+ host->base + S3C2410_SDIFSTA);
+ } else {
+ u32 mci_con;
+
-+ //reset fifo
++ /* reset fifo */
+ mci_con = readl(host->base + S3C2410_SDICON);
-+ mci_con|= S3C2410_SDICON_FIFORESET;
++ mci_con |= S3C2410_SDICON_FIFORESET;
+
+ writel(mci_con, host->base + S3C2410_SDICON);
+ }
@@ -877,7 +840,7 @@
+
+void s3cmci_dma_setup(struct s3cmci_host *host, enum s3c2410_dmasrc source)
+{
-+ static int setup_ok = 0;
++ static int setup_ok;
+ static enum s3c2410_dmasrc last_source = -1;
+
+ if (last_source == source)
@@ -891,7 +854,8 @@
+ if (!setup_ok) {
+ s3c2410_dma_config(host->dma, 4,
+ (S3C2410_DCON_HWTRIG | S3C2410_DCON_CH0_SDI));
-+ s3c2410_dma_set_buffdone_fn(host->dma,
s3cmci_dma_done_callback);
++ s3c2410_dma_set_buffdone_fn(host->dma,
++ s3cmci_dma_done_callback);
+ s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART);
+ setup_ok = 1;
+ }
@@ -908,31 +872,30 @@
+
+ enable_imask(host, imsk);
+
-+ if (cmd->data) {
++ if (cmd->data)
+ host->complete_what = COMPLETION_XFERFINISH_RSPFIN;
-+ } else if (cmd->flags & MMC_RSP_PRESENT) {
++ else if (cmd->flags & MMC_RSP_PRESENT)
+ host->complete_what = COMPLETION_RSPFIN;
-+ } else {
++ else
+ host->complete_what = COMPLETION_CMDSENT;
-+ }
+
+ writel(cmd->arg, host->base + S3C2410_SDICMDARG);
+
+ ccon = cmd->opcode & S3C2410_SDICMDCON_INDEX;
-+ ccon|= S3C2410_SDICMDCON_SENDERHOST | S3C2410_SDICMDCON_CMDSTART;
++ ccon |= S3C2410_SDICMDCON_SENDERHOST | S3C2410_SDICMDCON_CMDSTART;
+
+ if (cmd->flags & MMC_RSP_PRESENT)
+ ccon |= S3C2410_SDICMDCON_WAITRSP;
+
+ if (cmd->flags & MMC_RSP_136)
-+ ccon|= S3C2410_SDICMDCON_LONGRSP;
++ ccon |= S3C2410_SDICMDCON_LONGRSP;
+
+ writel(ccon, host->base + S3C2410_SDICMDCON);
+}
+
+static int s3cmci_setup_data(struct s3cmci_host *host, struct mmc_data *data)
+{
-+ u32 dcon, imsk, stoptries=3;
++ u32 dcon, imsk, stoptries = 3;
+
+ /* write DCON register */
+
@@ -941,11 +904,11 @@
+ return 0;
+ }
+
-+ while(readl(host->base + S3C2410_SDIDSTA) &
++ while (readl(host->base + S3C2410_SDIDSTA) &
+ (S3C2410_SDIDSTA_TXDATAON | S3C2410_SDIDSTA_RXDATAON)) {
+
+ dbg(host, dbg_err,
-+ "mci_setup_data() transfer stillin progress.\n");
++ "mci_setup_data() transfer stillin progress.\n");
+
+ writel(S3C2410_SDIDCON_STOP, host->base + S3C2410_SDIDCON);
+ s3cmci_reset(host);
@@ -961,17 +924,14 @@
+
+ dcon = data->blocks & S3C2410_SDIDCON_BLKNUM_MASK;
+
-+ if (host->dodma) {
++ if (host->dodma)
+ dcon |= S3C2410_SDIDCON_DMAEN;
-+ }
+
-+ if (host->bus_width == MMC_BUS_WIDTH_4) {
++ if (host->bus_width == MMC_BUS_WIDTH_4)
+ dcon |= S3C2410_SDIDCON_WIDEBUS;
-+ }
+
-+ if (!(data->flags & MMC_DATA_STREAM)) {
++ if (!(data->flags & MMC_DATA_STREAM))
+ dcon |= S3C2410_SDIDCON_BLOCKMODE;
-+ }
+
+ if (data->flags & MMC_DATA_WRITE) {
+ dcon |= S3C2410_SDIDCON_TXAFTERRESP;
@@ -1007,14 +967,11 @@
+ } else {
+ writel(0x0000FFFF, host->base + S3C2410_SDITIMER);
+
-+ //FIX: set slow clock to prevent timeouts on read
-+ if (data->flags & MMC_DATA_READ) {
++ /* FIX: set slow clock to prevent timeouts on read */
++ if (data->flags & MMC_DATA_READ)
+ writel(0xFF, host->base + S3C2410_SDIPRE);
-+ }
+ }
+
-+ //debug_dump_registers(host, "Data setup:");
-+
+ return 0;
+}
+
@@ -1078,7 +1035,7 @@
+ s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);
+ return -EBUSY;
+ }
-+ }
++ }
+
+ s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_START);
+
@@ -1095,8 +1052,8 @@
+#ifdef CONFIG_MMC_DEBUG
+ prepare_dbgmsg(host, cmd, host->cmd_is_stop);
+#endif
-+ //Clear command, data and fifo status registers
-+ //Fifo clear only necessary on 2440, but doesn't hurt on 2410
++ /* clear command, data and fifo status registers;
++ * Fifo clear only necessary on 2440, but doesn't hurt on 2410 */
+ writel(0xFFFFFFFF, host->base + S3C2410_SDICMDSTAT);
+ writel(0xFFFFFFFF, host->base + S3C2410_SDIDSTA);
+ writel(0xFFFFFFFF, host->base + S3C2410_SDIFSTA);
@@ -1116,11 +1073,10 @@
+ }
+
+
-+ if (host->dodma) {
++ if (host->dodma)
+ res = s3cmci_prepare_dma(host, cmd->data);
-+ } else {
++ else
+ res = s3cmci_prepare_pio(host, cmd->data);
-+ }
+
+ if (res) {
+ cmd->error = -EIO;
@@ -1132,16 +1088,13 @@
+
+ }
+
-+ // Send command
+ s3cmci_send_command(host, cmd);
-+
-+ // Enable Interrupt
+ enable_irq(host->irq);
+}
+
+static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
+{
-+ struct s3cmci_host *host = mmc_priv(mmc);
++ struct s3cmci_host *host = mmc_priv(mmc);
+
+ host->cmd_is_stop = 0;
+ host->mrq = mrq;
@@ -1154,70 +1107,71 @@
+ struct s3cmci_host *host = mmc_priv(mmc);
+ u32 mci_psc, mci_con;
+
-+ //Set power
++ /* Set power */
+ mci_con = readl(host->base + S3C2410_SDICON);
-+ switch(ios->power_mode) {
-+ case MMC_POWER_ON:
-+ case MMC_POWER_UP:
-+ s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_SDCLK);
-+ s3c2410_gpio_cfgpin(S3C2410_GPE6, S3C2410_GPE6_SDCMD);
-+ s3c2410_gpio_cfgpin(S3C2410_GPE7, S3C2410_GPE7_SDDAT0);
-+ s3c2410_gpio_cfgpin(S3C2410_GPE8, S3C2410_GPE8_SDDAT1);
-+ s3c2410_gpio_cfgpin(S3C2410_GPE9, S3C2410_GPE9_SDDAT2);
-+ s3c2410_gpio_cfgpin(S3C2410_GPE10,
S3C2410_GPE10_SDDAT3);
++ switch (ios->power_mode) {
++ case MMC_POWER_ON:
++ case MMC_POWER_UP:
++ s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_SDCLK);
++ s3c2410_gpio_cfgpin(S3C2410_GPE6, S3C2410_GPE6_SDCMD);
++ s3c2410_gpio_cfgpin(S3C2410_GPE7, S3C2410_GPE7_SDDAT0);
++ s3c2410_gpio_cfgpin(S3C2410_GPE8, S3C2410_GPE8_SDDAT1);
++ s3c2410_gpio_cfgpin(S3C2410_GPE9, S3C2410_GPE9_SDDAT2);
++ s3c2410_gpio_cfgpin(S3C2410_GPE10, S3C2410_GPE10_SDDAT3);
+
-+ if (host->pdata->set_power)
-+ host->pdata->set_power(ios->power_mode,
ios->vdd);
++ if (host->pdata->set_power)
++ host->pdata->set_power(ios->power_mode, ios->vdd);
+
-+ if (!host->is2440)
-+ mci_con|=S3C2410_SDICON_FIFORESET;
++ if (!host->is2440)
++ mci_con |= S3C2410_SDICON_FIFORESET;
+
-+ break;
++ break;
+
-+ case MMC_POWER_OFF:
-+ default:
-+ s3c2410_gpio_setpin(S3C2410_GPE5, 0);
-+ s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_OUTP);
++ case MMC_POWER_OFF:
++ default:
++ s3c2410_gpio_setpin(S3C2410_GPE5, 0);
++ s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_OUTP);
+
-+ if (host->pdata->set_power)
-+ host->pdata->set_power(ios->power_mode,
ios->vdd);
++ if (host->pdata->set_power)
++ host->pdata->set_power(ios->power_mode, ios->vdd);
+
-+ if (host->is2440)
-+ mci_con|=S3C2440_SDICON_SDRESET;
++ if (host->is2440)
++ mci_con |= S3C2440_SDICON_SDRESET;
+
-+ break;
++ break;
+ }
+
-+ //Set clock
-+ for (mci_psc=0; mci_psc<255; mci_psc++) {
++ /* Set clock */
++ for (mci_psc = 0; mci_psc < 255; mci_psc++) {
+ host->real_rate = host->clk_rate / (host->clk_div*(mci_psc+1));
+
+ if (host->real_rate <= ios->clock)
+ break;
+ }
+
-+ if(mci_psc > 255) mci_psc = 255;
++ if (mci_psc > 255)
++ mci_psc = 255;
+ host->prescaler = mci_psc;
+
+ writel(host->prescaler, host->base + S3C2410_SDIPRE);
+
-+ //If requested clock is 0, real_rate will be 0, too
++ /* If requested clock is 0, real_rate will be 0, too */
+ if (ios->clock == 0)
+ host->real_rate = 0;
+
-+ //Set CLOCK_ENABLE
++ /* Set CLOCK_ENABLE */
+ if (ios->clock)
+ mci_con |= S3C2410_SDICON_CLOCKTYPE;
+ else
-+ mci_con &=~S3C2410_SDICON_CLOCKTYPE;
++ mci_con &= ~S3C2410_SDICON_CLOCKTYPE;
+
+ writel(mci_con, host->base + S3C2410_SDICON);
+
-+ if ((ios->power_mode==MMC_POWER_ON)
-+ || (ios->power_mode==MMC_POWER_UP)) {
++ if ((ios->power_mode == MMC_POWER_ON)
++ || (ios->power_mode == MMC_POWER_UP)) {
+
+ dbg(host, dbg_conf, "running at %lukHz (requested: %ukHz).\n",
-+ host->real_rate/1000, ios->clock/1000);
++ host->real_rate/1000, ios->clock/1000);
+ } else {
+ dbg(host, dbg_conf, "powered down.\n");
+ }
@@ -1370,7 +1324,8 @@
+ goto probe_free_host;
+ }
+
-+ if ((ret = clk_enable(host->clk))) {
++ ret = clk_enable(host->clk);
++ if (ret) {
+ dev_err(&pdev->dev, "failed to enable clock source.\n");
+ goto clk_free;
+ }
@@ -1391,18 +1346,19 @@
+ mmc->max_phys_segs = 128;
+ mmc->max_hw_segs = 128;
+
-+ dbg(host, dbg_debug, "probe: mode:%s mapped mci_base:%p irq:%u
irq_cd:%u dma:%u.\n",
-+ (host->is2440?"2440":""),
-+ host->base, host->irq, host->irq_cd, host->dma);
++ dbg(host, dbg_debug, "probe: mode:%s mapped mci_base:%p irq:%u "
++ "irq_cd:%u dma:%u.\n", (host->is2440?"2440":""),
++ host->base, host->irq, host->irq_cd, host->dma);
+
-+ if ((ret = mmc_add_host(mmc))) {
++ ret = mmc_add_host(mmc);
++ if (ret) {
+ dev_err(&pdev->dev, "failed to add mmc host.\n");
+ goto free_dmabuf;
+ }
+
+ platform_set_drvdata(pdev, mmc);
+
-+ dev_info(&pdev->dev,"initialisation done.\n");
++ dev_info(&pdev->dev, "initialisation done.\n");
+ return 0;
+
+ free_dmabuf:
@@ -1412,10 +1368,10 @@
+ clk_put(host->clk);
+
+ probe_free_irq_cd:
-+ free_irq(host->irq_cd, host);
++ free_irq(host->irq_cd, host);
+
+ probe_free_irq:
-+ free_irq(host->irq, host);
++ free_irq(host->irq, host);
+
+ probe_iounmap:
+ iounmap(host->base);
@@ -1438,8 +1394,8 @@
+ clk_disable(host->clk);
+ clk_put(host->clk);
+ s3c2410_dma_free(S3CMCI_DMA, &s3cmci_dma_client);
-+ free_irq(host->irq_cd, host);
-+ free_irq(host->irq, host);
++ free_irq(host->irq_cd, host);
++ free_irq(host->irq, host);
+ iounmap(host->base);
+ release_mem_region(host->mem->start, RESSIZE(host->mem));
+ mmc_free_host(mmc);
@@ -1484,8 +1440,7 @@
+#endif /* CONFIG_PM */
+
+
-+static struct platform_driver s3cmci_driver_2410 =
-+{
++static struct platform_driver s3cmci_driver_2410 = {
+ .driver.name = "s3c2410-sdi",
+ .probe = s3cmci_probe_2410,
+ .remove = s3cmci_remove,
@@ -1493,8 +1448,7 @@
+ .resume = s3cmci_resume,
+};
+
-+static struct platform_driver s3cmci_driver_2412 =
-+{
++static struct platform_driver s3cmci_driver_2412 = {
+ .driver.name = "s3c2412-sdi",
+ .probe = s3cmci_probe_2412,
+ .remove = s3cmci_remove,
@@ -1502,8 +1456,7 @@
+ .resume = s3cmci_resume,
+};
+
-+static struct platform_driver s3cmci_driver_2440 =
-+{
++static struct platform_driver s3cmci_driver_2440 = {
+ .driver.name = "s3c2440-sdi",
+ .probe = s3cmci_probe_2440,
+ .remove = s3cmci_remove,
@@ -1538,7 +1491,7 @@
===================================================================
--- /dev/null
+++ linux-2.6/drivers/mmc/host/s3cmci.h
-@@ -0,0 +1,72 @@
+@@ -0,0 +1,71 @@
+/*
+ * linux/drivers/mmc/s3cmci.h - Samsung S3C MCI driver
+ *
@@ -1549,7 +1502,7 @@
+ * published by the Free Software Foundation.
+ */
+
-+//FIXME: DMA Resource management ?!
++/* FIXME: DMA Resource management ?! */
+#define S3CMCI_DMA 0
+
+enum s3cmci_waitfor {
@@ -1582,31 +1535,30 @@
+ unsigned sdidata;
+ int dodma;
+
-+ volatile int dmatogo;
++ int dmatogo;
+
+ struct mmc_request *mrq;
+ int cmd_is_stop;
+
+ spinlock_t complete_lock;
-+ volatile enum s3cmci_waitfor
-+ complete_what;
++ enum s3cmci_waitfor complete_what;
+
-+ volatile int dma_complete;
++ int dma_complete;
+
-+ volatile u32 pio_sgptr;
-+ volatile u32 pio_words;
-+ volatile u32 pio_count;
-+ volatile u32 *pio_ptr;
++ u32 pio_sgptr;
++ u32 pio_words;
++ u32 pio_count;
++ u32 *pio_ptr;
+#define XFER_NONE 0
+#define XFER_READ 1
+#define XFER_WRITE 2
-+ volatile u32 pio_active;
++ u32 pio_active;
+
+ int bus_width;
+
+ char dbgmsg_cmd[301];
+ char dbgmsg_dat[301];
-+ volatile char *status;
++ char *status;
+
+ unsigned int ccnt, dcnt;
+ struct tasklet_struct pio_tasklet;
@@ -1634,10 +1586,9 @@
===================================================================
--- linux-2.6.orig/drivers/mmc/host/Makefile
+++ linux-2.6/drivers/mmc/host/Makefile
-@@ -17,4 +17,5 @@
+@@ -17,4 +17,4 @@
obj-$(CONFIG_MMC_AT91) += at91_mci.o
obj-$(CONFIG_MMC_TIFM_SD) += tifm_sd.o
obj-$(CONFIG_MMC_SPI) += mmc_spi.o
-
+obj-$(CONFIG_MMC_S3C) += s3cmci.o
-+obj-$(CONFIG_MMC) += mmc_debug.o
--- End Message ---