blob: ae006b30dd86bdbb3fdeb3367fc66c83847e711d [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 *);
Pierre Ossman4101c162007-05-19 13:39:01 +020021 int (*sysfs_add)(struct mmc_host *, struct mmc_card *card);
22 void (*sysfs_remove)(struct mmc_host *, struct mmc_card *card);
Pierre Ossman6abaa0c2007-05-01 16:00:02 +020023 void (*suspend)(struct mmc_host *);
24 void (*resume)(struct mmc_host *);
Pierre Ossman7ea239d2006-12-31 00:11:32 +010025};
26
27void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops);
28void mmc_detach_bus(struct mmc_host *host);
29
30void __mmc_release_bus(struct mmc_host *host);
31
32static inline void mmc_bus_get(struct mmc_host *host)
33{
34 unsigned long flags;
35
36 spin_lock_irqsave(&host->lock, flags);
37 host->bus_refs++;
38 spin_unlock_irqrestore(&host->lock, flags);
39}
40
41static inline void mmc_bus_put(struct mmc_host *host)
42{
43 unsigned long flags;
44
45 spin_lock_irqsave(&host->lock, flags);
46 host->bus_refs--;
47 if ((host->bus_refs == 0) && host->bus_ops)
48 __mmc_release_bus(host);
49 spin_unlock_irqrestore(&host->lock, flags);
50}
51
Pierre Ossmanda7fbe52006-12-24 22:46:55 +010052void mmc_set_chip_select(struct mmc_host *host, int mode);
Pierre Ossman7ea239d2006-12-31 00:11:32 +010053void mmc_set_clock(struct mmc_host *host, unsigned int hz);
54void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode);
55void mmc_set_bus_width(struct mmc_host *host, unsigned int width);
56u32 mmc_select_voltage(struct mmc_host *host, u32 ocr);
57void mmc_set_timing(struct mmc_host *host, unsigned int timing);
58
Pierre Ossmanda7fbe52006-12-24 22:46:55 +010059static inline void mmc_delay(unsigned int ms)
60{
61 if (ms < 1000 / HZ) {
62 cond_resched();
63 mdelay(ms);
64 } else {
65 msleep(ms);
66 }
67}
68
Pierre Ossmanb93931a2007-05-19 14:06:24 +020069void mmc_rescan(struct work_struct *work);
70void mmc_start_host(struct mmc_host *host);
71void mmc_stop_host(struct mmc_host *host);
72
Linus Torvalds1da177e2005-04-16 15:20:36 -070073#endif
Pierre Ossmanda7fbe52006-12-24 22:46:55 +010074