2010-08-11 05:01:47 +04:00
/*
* Copyright 2010 MontaVista Software , LLC .
*
* Author : Anton Vorontsov < avorontsov @ ru . mvista . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef _DRIVERS_MMC_SDHCI_PLTFM_H
# define _DRIVERS_MMC_SDHCI_PLTFM_H
2010-10-15 14:20:59 +04:00
# include <linux/clk.h>
2011-05-27 19:48:12 +04:00
# include <linux/platform_device.h>
2011-06-02 06:57:50 +04:00
# include "sdhci.h"
2010-08-11 05:01:49 +04:00
2011-05-27 19:48:15 +04:00
struct sdhci_pltfm_data {
2013-03-13 22:26:04 +04:00
const struct sdhci_ops * ops ;
2011-05-27 19:48:15 +04:00
unsigned int quirks ;
2013-05-26 21:59:26 +04:00
unsigned int quirks2 ;
2011-05-27 19:48:15 +04:00
} ;
2010-10-15 14:20:59 +04:00
struct sdhci_pltfm_host {
struct clk * clk ;
2011-07-21 01:13:36 +04:00
/* migrate from sdhci_of_host */
unsigned int clock ;
u16 xfer_mode_shadow ;
2013-05-30 00:50:05 +04:00
unsigned long private [ 0 ] ____cacheline_aligned ;
2010-10-15 14:20:59 +04:00
} ;
2011-05-27 19:48:14 +04:00
# ifdef CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER
2011-06-02 06:57:50 +04:00
/*
* These accessors are designed for big endian hosts doing I / O to
* little endian controllers incorporating a 32 - bit hardware byte swapper .
*/
static inline u32 sdhci_be32bs_readl ( struct sdhci_host * host , int reg )
{
return in_be32 ( host - > ioaddr + reg ) ;
}
static inline u16 sdhci_be32bs_readw ( struct sdhci_host * host , int reg )
{
return in_be16 ( host - > ioaddr + ( reg ^ 0x2 ) ) ;
}
static inline u8 sdhci_be32bs_readb ( struct sdhci_host * host , int reg )
{
return in_8 ( host - > ioaddr + ( reg ^ 0x3 ) ) ;
}
static inline void sdhci_be32bs_writel ( struct sdhci_host * host ,
u32 val , int reg )
{
out_be32 ( host - > ioaddr + reg , val ) ;
}
static inline void sdhci_be32bs_writew ( struct sdhci_host * host ,
u16 val , int reg )
{
struct sdhci_pltfm_host * pltfm_host = sdhci_priv ( host ) ;
int base = reg & ~ 0x3 ;
int shift = ( reg & 0x2 ) * 8 ;
switch ( reg ) {
case SDHCI_TRANSFER_MODE :
/*
* Postpone this write , we must do it together with a
* command write that is down below .
*/
pltfm_host - > xfer_mode_shadow = val ;
return ;
case SDHCI_COMMAND :
sdhci_be32bs_writel ( host ,
val < < 16 | pltfm_host - > xfer_mode_shadow ,
SDHCI_TRANSFER_MODE ) ;
return ;
}
clrsetbits_be32 ( host - > ioaddr + base , 0xffff < < shift , val < < shift ) ;
}
static inline void sdhci_be32bs_writeb ( struct sdhci_host * host , u8 val , int reg )
{
int base = reg & ~ 0x3 ;
int shift = ( reg & 0x3 ) * 8 ;
clrsetbits_be32 ( host - > ioaddr + base , 0xff < < shift , val < < shift ) ;
}
# endif /* CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER */
2011-05-27 19:48:14 +04:00
extern void sdhci_get_of_property ( struct platform_device * pdev ) ;
2011-05-27 19:48:12 +04:00
extern struct sdhci_host * sdhci_pltfm_init ( struct platform_device * pdev ,
2013-05-30 00:50:05 +04:00
const struct sdhci_pltfm_data * pdata ,
size_t priv_size ) ;
2011-05-27 19:48:12 +04:00
extern void sdhci_pltfm_free ( struct platform_device * pdev ) ;
extern int sdhci_pltfm_register ( struct platform_device * pdev ,
2013-05-30 00:50:05 +04:00
const struct sdhci_pltfm_data * pdata ,
size_t priv_size ) ;
2011-05-27 19:48:12 +04:00
extern int sdhci_pltfm_unregister ( struct platform_device * pdev ) ;
2013-01-28 22:27:12 +04:00
extern unsigned int sdhci_pltfm_clk_get_max_clock ( struct sdhci_host * host ) ;
2013-05-30 00:50:05 +04:00
static inline void * sdhci_pltfm_priv ( struct sdhci_pltfm_host * host )
{
2016-11-10 16:22:17 +03:00
return host - > private ;
2013-05-30 00:50:05 +04:00
}
2017-08-23 07:15:03 +03:00
int sdhci_pltfm_suspend ( struct device * dev ) ;
int sdhci_pltfm_resume ( struct device * dev ) ;
2011-11-03 14:09:45 +04:00
extern const struct dev_pm_ops sdhci_pltfm_pmops ;
2010-08-11 05:01:49 +04:00
2010-08-11 05:01:47 +04:00
# endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */