Skip to content

Commit

Permalink
tifm: hide details of interrupt processing from socket drivers
Browse files Browse the repository at this point in the history
Instead of passing transformed value of adapter interrupt status to
socket drivers, implement two separate callbacks - one for card events
and another for dma events.

Signed-off-by: Alex Dubov <[email protected]>
Signed-off-by: Pierre Ossman <[email protected]>
  • Loading branch information
oakad authored and Pierre Ossman committed May 1, 2007
1 parent 5721dbf commit 4552f0c
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 37 deletions.
22 changes: 14 additions & 8 deletions drivers/misc/tifm_7xx1.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,13 @@
#include <linux/freezer.h>

#define DRIVER_NAME "tifm_7xx1"
#define DRIVER_VERSION "0.7"
#define DRIVER_VERSION "0.8"

#define TIFM_IRQ_ENABLE 0x80000000
#define TIFM_IRQ_SOCKMASK(x) (x)
#define TIFM_IRQ_CARDMASK(x) ((x) << 8)
#define TIFM_IRQ_FIFOMASK(x) ((x) << 16)
#define TIFM_IRQ_SETALL 0xffffffff

static void tifm_7xx1_eject(struct tifm_adapter *fm, struct tifm_dev *sock)
{
Expand All @@ -31,7 +37,7 @@ static irqreturn_t tifm_7xx1_isr(int irq, void *dev_id)
struct tifm_adapter *fm = dev_id;
struct tifm_dev *sock;
unsigned int irq_status;
unsigned int sock_irq_status, cnt;
unsigned int cnt;

spin_lock(&fm->lock);
irq_status = readl(fm->addr + FM_INTERRUPT_STATUS);
Expand All @@ -45,12 +51,12 @@ static irqreturn_t tifm_7xx1_isr(int irq, void *dev_id)

for (cnt = 0; cnt < fm->num_sockets; cnt++) {
sock = fm->sockets[cnt];
sock_irq_status = (irq_status >> cnt)
& (TIFM_IRQ_FIFOMASK(1)
| TIFM_IRQ_CARDMASK(1));

if (sock && sock_irq_status)
sock->signal_irq(sock, sock_irq_status);
if (sock) {
if ((irq_status >> cnt) & TIFM_IRQ_FIFOMASK(1))
sock->data_event(sock);
if ((irq_status >> cnt) & TIFM_IRQ_CARDMASK(1))
sock->card_event(sock);
}
}

fm->socket_change_set |= irq_status
Expand Down
11 changes: 6 additions & 5 deletions drivers/misc/tifm_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#include <linux/idr.h>

#define DRIVER_NAME "tifm_core"
#define DRIVER_VERSION "0.7"
#define DRIVER_VERSION "0.8"

static DEFINE_IDR(tifm_adapter_idr);
static DEFINE_SPINLOCK(tifm_adapter_lock);
Expand Down Expand Up @@ -175,8 +175,7 @@ void tifm_free_device(struct device *dev)
}
EXPORT_SYMBOL(tifm_free_device);

static void tifm_dummy_signal_irq(struct tifm_dev *sock,
unsigned int sock_irq_status)
static void tifm_dummy_event(struct tifm_dev *sock)
{
return;
}
Expand All @@ -191,7 +190,8 @@ struct tifm_dev *tifm_alloc_device(struct tifm_adapter *fm)
dev->dev.parent = fm->dev;
dev->dev.bus = &tifm_bus_type;
dev->dev.release = tifm_free_device;
dev->signal_irq = tifm_dummy_signal_irq;
dev->card_event = tifm_dummy_event;
dev->data_event = tifm_dummy_event;
}
return dev;
}
Expand Down Expand Up @@ -249,7 +249,8 @@ static int tifm_device_remove(struct device *dev)
struct tifm_driver *drv = fm_dev->drv;

if (drv) {
fm_dev->signal_irq = tifm_dummy_signal_irq;
fm_dev->card_event = tifm_dummy_event;
fm_dev->data_event = tifm_dummy_event;
if (drv->remove)
drv->remove(fm_dev);
fm_dev->drv = NULL;
Expand Down
43 changes: 28 additions & 15 deletions drivers/mmc/tifm_sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#include <asm/io.h>

#define DRIVER_NAME "tifm_sd"
#define DRIVER_VERSION "0.7"
#define DRIVER_VERSION "0.8"

static int no_dma = 0;
static int fixed_timeout = 0;
Expand Down Expand Up @@ -316,24 +316,38 @@ static void tifm_sd_process_cmd(struct tifm_dev *sock, struct tifm_sd *host,
}

/* Called from interrupt handler */
static void tifm_sd_signal_irq(struct tifm_dev *sock,
unsigned int sock_irq_status)
static void tifm_sd_data_event(struct tifm_dev *sock)
{
struct tifm_sd *host;
unsigned int host_status = 0, fifo_status = 0;
int error_code = 0;
unsigned int fifo_status = 0;

spin_lock(&sock->lock);
host = mmc_priv((struct mmc_host*)tifm_get_drvdata(sock));

if (sock_irq_status & FIFO_EVENT) {
fifo_status = readl(sock->addr + SOCK_DMA_FIFO_STATUS);
writel(fifo_status, sock->addr + SOCK_DMA_FIFO_STATUS);
fifo_status = readl(sock->addr + SOCK_DMA_FIFO_STATUS);
writel(fifo_status, sock->addr + SOCK_DMA_FIFO_STATUS);

host->flags |= fifo_status & FIFO_RDY;

if (host->req)
tifm_sd_process_cmd(sock, host, 0);

dev_dbg(&sock->dev, "fifo_status %x\n", fifo_status);
spin_unlock(&sock->lock);

}

/* Called from interrupt handler */
static void tifm_sd_card_event(struct tifm_dev *sock)
{
struct tifm_sd *host;
unsigned int host_status = 0;
int error_code = 0;

spin_lock(&sock->lock);
host = mmc_priv((struct mmc_host*)tifm_get_drvdata(sock));

host->flags |= fifo_status & FIFO_RDY;
}

if (sock_irq_status & CARD_EVENT) {
host_status = readl(sock->addr + SOCK_MMCSD_STATUS);
writel(host_status, sock->addr + SOCK_MMCSD_STATUS);

Expand Down Expand Up @@ -377,13 +391,11 @@ static void tifm_sd_signal_irq(struct tifm_dev *sock,
host->written_blocks++;
host->flags &= ~CARD_BUSY;
}
}

if (host->req)
tifm_sd_process_cmd(sock, host, host_status);
done:
dev_dbg(&sock->dev, "host_status %x, fifo_status %x\n",
host_status, fifo_status);
dev_dbg(&sock->dev, "host_status %x\n", host_status);
spin_unlock(&sock->lock);
}

Expand Down Expand Up @@ -882,7 +894,8 @@ static int tifm_sd_probe(struct tifm_dev *sock)
mmc->max_blk_size = 2048;
mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
mmc->max_seg_size = mmc->max_req_size;
sock->signal_irq = tifm_sd_signal_irq;
sock->card_event = tifm_sd_card_event;
sock->data_event = tifm_sd_data_event;
rc = tifm_sd_initialize_host(host);

if (!rc)
Expand Down
11 changes: 2 additions & 9 deletions include/linux/tifm.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,6 @@ enum {
SOCK_MS_SYSTEM = 0x190,
SOCK_FIFO_ACCESS = 0x200 };


#define TIFM_IRQ_ENABLE 0x80000000
#define TIFM_IRQ_SOCKMASK(x) (x)
#define TIFM_IRQ_CARDMASK(x) ((x) << 8)
#define TIFM_IRQ_FIFOMASK(x) ((x) << 16)
#define TIFM_IRQ_SETALL 0xffffffff

#define TIFM_CTRL_LED 0x00000040
#define TIFM_CTRL_FAST_CLK 0x00000100

Expand All @@ -90,8 +83,8 @@ struct tifm_dev {
tifm_media_id media_id;
unsigned int socket_id;

void (*signal_irq)(struct tifm_dev *sock,
unsigned int sock_irq_status);
void (*card_event)(struct tifm_dev *sock);
void (*data_event)(struct tifm_dev *sock);

struct tifm_driver *drv;
struct device dev;
Expand Down

0 comments on commit 4552f0c

Please sign in to comment.