2010-08-10 18:01:47 -07: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 12:20:59 +02:00
# include <linux/clk.h>
2011-05-27 23:48:12 +08:00
# include <linux/platform_device.h>
2011-06-02 10:57:50 +08:00
# include "sdhci.h"
2010-08-10 18:01:49 -07:00
2011-05-27 23:48:15 +08:00
struct sdhci_pltfm_data {
2013-03-13 19:26:04 +01:00
const struct sdhci_ops * ops ;
2011-05-27 23:48:15 +08:00
unsigned int quirks ;
2013-05-26 13:59:26 -04:00
unsigned int quirks2 ;
2011-05-27 23:48:15 +08:00
} ;
2010-10-15 12:20:59 +02:00
struct sdhci_pltfm_host {
struct clk * clk ;
2011-03-25 09:18:27 -04:00
void * priv ; /* to handle quirks across io-accessor calls */
2011-07-20 17:13:36 -04:00
/* migrate from sdhci_of_host */
unsigned int clock ;
u16 xfer_mode_shadow ;
2013-05-29 13:50:05 -07:00
unsigned long private [ 0 ] ____cacheline_aligned ;
2010-10-15 12:20:59 +02:00
} ;
2011-05-27 23:48:14 +08:00
# ifdef CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER
2011-06-02 10:57:50 +08: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 23:48:14 +08:00
extern void sdhci_get_of_property ( struct platform_device * pdev ) ;
2011-05-27 23:48:12 +08:00
extern struct sdhci_host * sdhci_pltfm_init ( struct platform_device * pdev ,
2013-05-29 13:50:05 -07:00
const struct sdhci_pltfm_data * pdata ,
size_t priv_size ) ;
2011-05-27 23:48:12 +08:00
extern void sdhci_pltfm_free ( struct platform_device * pdev ) ;
extern int sdhci_pltfm_register ( struct platform_device * pdev ,
2013-05-29 13:50:05 -07:00
const struct sdhci_pltfm_data * pdata ,
size_t priv_size ) ;
2011-05-27 23:48:12 +08:00
extern int sdhci_pltfm_unregister ( struct platform_device * pdev ) ;
2013-01-28 19:27:12 +01:00
extern unsigned int sdhci_pltfm_clk_get_max_clock ( struct sdhci_host * host ) ;
2013-05-29 13:50:05 -07:00
static inline void * sdhci_pltfm_priv ( struct sdhci_pltfm_host * host )
{
return ( void * ) host - > private ;
}
2011-05-27 23:48:12 +08:00
# ifdef CONFIG_PM
2013-11-04 16:38:25 +08:00
extern int sdhci_pltfm_suspend ( struct device * dev ) ;
extern int sdhci_pltfm_resume ( struct device * dev ) ;
2011-11-03 11:09:45 +01:00
extern const struct dev_pm_ops sdhci_pltfm_pmops ;
# define SDHCI_PLTFM_PMOPS (&sdhci_pltfm_pmops)
# else
# define SDHCI_PLTFM_PMOPS NULL
2011-05-27 23:48:12 +08:00
# endif
2010-08-10 18:01:49 -07:00
2010-08-10 18:01:47 -07:00
# endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */