1515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov/*
2515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov * Copyright 2010 MontaVista Software, LLC.
3515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov *
4515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
5515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov *
6515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov * This program is free software; you can redistribute it and/or modify
7515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov * it under the terms of the GNU General Public License version 2 as
8515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov * published by the Free Software Foundation.
9515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov */
10515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov
11515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov#ifndef _DRIVERS_MMC_SDHCI_PLTFM_H
12515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov#define _DRIVERS_MMC_SDHCI_PLTFM_H
13515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov
144b711cb13843f5082e82970dd1e8031383134a65Wolfram Sang#include <linux/clk.h>
1585d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guo#include <linux/platform_device.h>
16f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo#include "sdhci.h"
1720b1597bcf4a76ccab232fa032f5f9ad30069167Anton Vorontsov
1894cc6a86567cb3c2234807081a46ce5400c36b31Shawn Guostruct sdhci_pltfm_data {
1994cc6a86567cb3c2234807081a46ce5400c36b31Shawn Guo	struct sdhci_ops *ops;
2094cc6a86567cb3c2234807081a46ce5400c36b31Shawn Guo	unsigned int quirks;
2194cc6a86567cb3c2234807081a46ce5400c36b31Shawn Guo};
2294cc6a86567cb3c2234807081a46ce5400c36b31Shawn Guo
234b711cb13843f5082e82970dd1e8031383134a65Wolfram Sangstruct sdhci_pltfm_host {
244b711cb13843f5082e82970dd1e8031383134a65Wolfram Sang	struct clk *clk;
25e149860d16d96aef1a8eb7dc1d0b9d4313479e61Richard Zhu	void *priv; /* to handle quirks across io-accessor calls */
26e307148fd4f971cecfaebb516ee28e164948a24bShawn Guo
27e307148fd4f971cecfaebb516ee28e164948a24bShawn Guo	/* migrate from sdhci_of_host */
28e307148fd4f971cecfaebb516ee28e164948a24bShawn Guo	unsigned int clock;
29e307148fd4f971cecfaebb516ee28e164948a24bShawn Guo	u16 xfer_mode_shadow;
304b711cb13843f5082e82970dd1e8031383134a65Wolfram Sang};
314b711cb13843f5082e82970dd1e8031383134a65Wolfram Sang
3238576af1f8cad48446df47dcf404b197c9206dbaShawn Guo#ifdef CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER
33f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo/*
34f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo * These accessors are designed for big endian hosts doing I/O to
35f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo * little endian controllers incorporating a 32-bit hardware byte swapper.
36f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo */
37f0de836923186e1fc0acb65299c2f2089c7992afShawn Guostatic inline u32 sdhci_be32bs_readl(struct sdhci_host *host, int reg)
38f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo{
39f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	return in_be32(host->ioaddr + reg);
40f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo}
41f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo
42f0de836923186e1fc0acb65299c2f2089c7992afShawn Guostatic inline u16 sdhci_be32bs_readw(struct sdhci_host *host, int reg)
43f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo{
44f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	return in_be16(host->ioaddr + (reg ^ 0x2));
45f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo}
46f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo
47f0de836923186e1fc0acb65299c2f2089c7992afShawn Guostatic inline u8 sdhci_be32bs_readb(struct sdhci_host *host, int reg)
48f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo{
49f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	return in_8(host->ioaddr + (reg ^ 0x3));
50f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo}
51f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo
52f0de836923186e1fc0acb65299c2f2089c7992afShawn Guostatic inline void sdhci_be32bs_writel(struct sdhci_host *host,
53f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo				       u32 val, int reg)
54f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo{
55f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	out_be32(host->ioaddr + reg, val);
56f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo}
57f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo
58f0de836923186e1fc0acb65299c2f2089c7992afShawn Guostatic inline void sdhci_be32bs_writew(struct sdhci_host *host,
59f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo				       u16 val, int reg)
60f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo{
61f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
62f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	int base = reg & ~0x3;
63f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	int shift = (reg & 0x2) * 8;
64f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo
65f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	switch (reg) {
66f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	case SDHCI_TRANSFER_MODE:
67f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo		/*
68f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo		 * Postpone this write, we must do it together with a
69f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo		 * command write that is down below.
70f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo		 */
71f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo		pltfm_host->xfer_mode_shadow = val;
72f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo		return;
73f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	case SDHCI_COMMAND:
74f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo		sdhci_be32bs_writel(host,
75f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo				    val << 16 | pltfm_host->xfer_mode_shadow,
76f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo				    SDHCI_TRANSFER_MODE);
77f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo		return;
78f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	}
79f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	clrsetbits_be32(host->ioaddr + base, 0xffff << shift, val << shift);
80f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo}
81f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo
82f0de836923186e1fc0acb65299c2f2089c7992afShawn Guostatic inline void sdhci_be32bs_writeb(struct sdhci_host *host, u8 val, int reg)
83f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo{
84f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	int base = reg & ~0x3;
85f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	int shift = (reg & 0x3) * 8;
86f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo
87f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo	clrsetbits_be32(host->ioaddr + base , 0xff << shift, val << shift);
88f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo}
89f0de836923186e1fc0acb65299c2f2089c7992afShawn Guo#endif /* CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER */
9038576af1f8cad48446df47dcf404b197c9206dbaShawn Guo
9138576af1f8cad48446df47dcf404b197c9206dbaShawn Guoextern void sdhci_get_of_property(struct platform_device *pdev);
9238576af1f8cad48446df47dcf404b197c9206dbaShawn Guo
9385d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guoextern struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev,
9485d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guo					   struct sdhci_pltfm_data *pdata);
9585d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guoextern void sdhci_pltfm_free(struct platform_device *pdev);
9685d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guo
9785d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guoextern int sdhci_pltfm_register(struct platform_device *pdev,
9885d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guo				struct sdhci_pltfm_data *pdata);
9985d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guoextern int sdhci_pltfm_unregister(struct platform_device *pdev);
10085d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guo
10185d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guo#ifdef CONFIG_PM
10229495aa04a30c21565243c5b9c028510446d242cManuel Laussextern const struct dev_pm_ops sdhci_pltfm_pmops;
10329495aa04a30c21565243c5b9c028510446d242cManuel Lauss#define SDHCI_PLTFM_PMOPS (&sdhci_pltfm_pmops)
10429495aa04a30c21565243c5b9c028510446d242cManuel Lauss#else
10529495aa04a30c21565243c5b9c028510446d242cManuel Lauss#define SDHCI_PLTFM_PMOPS NULL
10685d6509dc8ca24b2b652863ef7a75622ddca17d6Shawn Guo#endif
10720b1597bcf4a76ccab232fa032f5f9ad30069167Anton Vorontsov
108515033f97c0b5a1bce13fa93e09704d95b44f376Anton Vorontsov#endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */
109