blob: fad8edc380993c2b1bff5aaa5d15c8be2e480c68 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Pierre Ossmanaaac1b42007-02-28 15:33:10 +01002 * linux/drivers/mmc/core/core.h
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 *
4 * Copyright (C) 2003 Russell King, All Rights Reserved.
Pierre Ossmanda7fbe52006-12-24 22:46:55 +01005 * Copyright 2007 Pierre Ossman
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
Pierre Ossmanda7fbe52006-12-24 22:46:55 +010011#ifndef _MMC_CORE_CORE_H
12#define _MMC_CORE_CORE_H
Russell King00b137c2005-08-19 09:41:24 +010013
Pierre Ossmanda7fbe52006-12-24 22:46:55 +010014#include <linux/delay.h>
Pierre Ossman7104e2d2006-10-04 02:15:41 -070015
Pierre Ossmanda7fbe52006-12-24 22:46:55 +010016#define MMC_CMD_RETRIES 3
17
Pierre Ossman7ea239d2006-12-31 00:11:32 +010018struct mmc_bus_ops {
19 void (*remove)(struct mmc_host *);
20 void (*detect)(struct mmc_host *);
21};
22
23void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops);
24void mmc_detach_bus(struct mmc_host *host);
25
26void __mmc_release_bus(struct mmc_host *host);
27
28static inline void mmc_bus_get(struct mmc_host *host)
29{
30 unsigned long flags;
31
32 spin_lock_irqsave(&host->lock, flags);
33 host->bus_refs++;
34 spin_unlock_irqrestore(&host->lock, flags);
35}
36
37static inline void mmc_bus_put(struct mmc_host *host)
38{
39 unsigned long flags;
40
41 spin_lock_irqsave(&host->lock, flags);
42 host->bus_refs--;
43 if ((host->bus_refs == 0) && host->bus_ops)
44 __mmc_release_bus(host);
45 spin_unlock_irqrestore(&host->lock, flags);
46}
47
Pierre Ossmanda7fbe52006-12-24 22:46:55 +010048void mmc_set_chip_select(struct mmc_host *host, int mode);
Pierre Ossman7ea239d2006-12-31 00:11:32 +010049void mmc_set_clock(struct mmc_host *host, unsigned int hz);
50void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode);
51void mmc_set_bus_width(struct mmc_host *host, unsigned int width);
52u32 mmc_select_voltage(struct mmc_host *host, u32 ocr);
53void mmc_set_timing(struct mmc_host *host, unsigned int timing);
54
55struct mmc_card *mmc_alloc_card(struct mmc_host *host);
Pierre Ossmanda7fbe52006-12-24 22:46:55 +010056
57static inline void mmc_delay(unsigned int ms)
58{
59 if (ms < 1000 / HZ) {
60 cond_resched();
61 mdelay(ms);
62 } else {
63 msleep(ms);
64 }
65}
66
Linus Torvalds1da177e2005-04-16 15:20:36 -070067#endif
Pierre Ossmanda7fbe52006-12-24 22:46:55 +010068