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