2005-04-17 02:20:36 +04:00
/*
2007-07-11 22:04:50 +04:00
* linux / drivers / mmc / host / mmci . h - ARM PrimeCell MMCI PL180 / 1 driver
2005-04-17 02:20:36 +04:00
*
* Copyright ( C ) 2003 Deep Blue Solutions , Ltd , All Rights Reserved .
*
* 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 .
*/
# define MMCIPOWER 0x000
# define MCI_PWR_OFF 0x00
# define MCI_PWR_UP 0x02
# define MCI_PWR_ON 0x03
# define MCI_OD (1 << 6)
# define MCI_ROD (1 << 7)
# define MMCICLOCK 0x004
# define MCI_CLK_ENABLE (1 << 8)
# define MCI_CLK_PWRSAVE (1 << 9)
# define MCI_CLK_BYPASS (1 << 10)
2010-04-08 10:38:52 +04:00
# define MCI_4BIT_BUS (1 << 11)
2011-03-04 16:54:16 +03:00
/*
* 8 bit wide buses , hardware flow contronl , negative edges and clock inversion
* supported in ST Micro U300 and Ux500 versions
*/
2010-04-08 10:38:52 +04:00
# define MCI_ST_8BIT_BUS (1 << 12)
2011-03-04 16:54:16 +03:00
# define MCI_ST_U300_HWFCEN (1 << 13)
# define MCI_ST_UX500_NEG_EDGE (1 << 13)
# define MCI_ST_UX500_HWFCEN (1 << 14)
# define MCI_ST_UX500_CLK_INV (1 << 15)
2013-01-24 17:12:45 +04:00
/* Modified PL180 on Versatile Express platform */
# define MCI_ARM_HWFCEN (1 << 12)
2005-04-17 02:20:36 +04:00
# define MMCIARGUMENT 0x008
# define MMCICOMMAND 0x00c
# define MCI_CPSM_RESPONSE (1 << 6)
# define MCI_CPSM_LONGRSP (1 << 7)
# define MCI_CPSM_INTERRUPT (1 << 8)
# define MCI_CPSM_PENDING (1 << 9)
# define MCI_CPSM_ENABLE (1 << 10)
2009-01-04 17:18:54 +03:00
# define MCI_SDIO_SUSP (1 << 11)
# define MCI_ENCMD_COMPL (1 << 12)
# define MCI_NIEN (1 << 13)
# define MCI_CE_ATACMD (1 << 14)
2005-04-17 02:20:36 +04:00
# define MMCIRESPCMD 0x010
# define MMCIRESPONSE0 0x014
# define MMCIRESPONSE1 0x018
# define MMCIRESPONSE2 0x01c
# define MMCIRESPONSE3 0x020
# define MMCIDATATIMER 0x024
# define MMCIDATALENGTH 0x028
# define MMCIDATACTRL 0x02c
# define MCI_DPSM_ENABLE (1 << 0)
# define MCI_DPSM_DIRECTION (1 << 1)
# define MCI_DPSM_MODE (1 << 2)
# define MCI_DPSM_DMAENABLE (1 << 3)
2009-01-04 17:18:54 +03:00
# define MCI_DPSM_BLOCKSIZE (1 << 4)
2010-10-09 16:43:21 +04:00
/* Control register extensions in the ST Micro U300 and Ux500 versions */
# define MCI_ST_DPSM_RWSTART (1 << 8)
# define MCI_ST_DPSM_RWSTOP (1 << 9)
# define MCI_ST_DPSM_RWMOD (1 << 10)
# define MCI_ST_DPSM_SDIOEN (1 << 11)
/* Control register extensions in the ST Micro Ux500 versions */
# define MCI_ST_DPSM_DMAREQCTL (1 << 12)
# define MCI_ST_DPSM_DBOOTMODEEN (1 << 13)
# define MCI_ST_DPSM_BUSYMODE (1 << 14)
# define MCI_ST_DPSM_DDRMODE (1 << 15)
2005-04-17 02:20:36 +04:00
# define MMCIDATACNT 0x030
# define MMCISTATUS 0x034
# define MCI_CMDCRCFAIL (1 << 0)
# define MCI_DATACRCFAIL (1 << 1)
# define MCI_CMDTIMEOUT (1 << 2)
# define MCI_DATATIMEOUT (1 << 3)
# define MCI_TXUNDERRUN (1 << 4)
# define MCI_RXOVERRUN (1 << 5)
# define MCI_CMDRESPEND (1 << 6)
# define MCI_CMDSENT (1 << 7)
# define MCI_DATAEND (1 << 8)
2011-06-30 18:10:21 +04:00
# define MCI_STARTBITERR (1 << 9)
2005-04-17 02:20:36 +04:00
# define MCI_DATABLOCKEND (1 << 10)
# define MCI_CMDACTIVE (1 << 11)
# define MCI_TXACTIVE (1 << 12)
# define MCI_RXACTIVE (1 << 13)
# define MCI_TXFIFOHALFEMPTY (1 << 14)
# define MCI_RXFIFOHALFFULL (1 << 15)
# define MCI_TXFIFOFULL (1 << 16)
# define MCI_RXFIFOFULL (1 << 17)
# define MCI_TXFIFOEMPTY (1 << 18)
# define MCI_RXFIFOEMPTY (1 << 19)
# define MCI_TXDATAAVLBL (1 << 20)
# define MCI_RXDATAAVLBL (1 << 21)
2011-03-04 16:54:16 +03:00
/* Extended status bits for the ST Micro variants */
# define MCI_ST_SDIOIT (1 << 22)
# define MCI_ST_CEATAEND (1 << 23)
2005-04-17 02:20:36 +04:00
# define MMCICLEAR 0x038
# define MCI_CMDCRCFAILCLR (1 << 0)
# define MCI_DATACRCFAILCLR (1 << 1)
# define MCI_CMDTIMEOUTCLR (1 << 2)
# define MCI_DATATIMEOUTCLR (1 << 3)
# define MCI_TXUNDERRUNCLR (1 << 4)
# define MCI_RXOVERRUNCLR (1 << 5)
# define MCI_CMDRESPENDCLR (1 << 6)
# define MCI_CMDSENTCLR (1 << 7)
# define MCI_DATAENDCLR (1 << 8)
2011-06-30 18:10:21 +04:00
# define MCI_STARTBITERRCLR (1 << 9)
2005-04-17 02:20:36 +04:00
# define MCI_DATABLOCKENDCLR (1 << 10)
2011-03-04 16:54:16 +03:00
/* Extended status bits for the ST Micro variants */
# define MCI_ST_SDIOITC (1 << 22)
# define MCI_ST_CEATAENDC (1 << 23)
2005-04-17 02:20:36 +04:00
# define MMCIMASK0 0x03c
# define MCI_CMDCRCFAILMASK (1 << 0)
# define MCI_DATACRCFAILMASK (1 << 1)
# define MCI_CMDTIMEOUTMASK (1 << 2)
# define MCI_DATATIMEOUTMASK (1 << 3)
# define MCI_TXUNDERRUNMASK (1 << 4)
# define MCI_RXOVERRUNMASK (1 << 5)
# define MCI_CMDRESPENDMASK (1 << 6)
# define MCI_CMDSENTMASK (1 << 7)
# define MCI_DATAENDMASK (1 << 8)
2011-06-30 18:10:21 +04:00
# define MCI_STARTBITERRMASK (1 << 9)
2005-04-17 02:20:36 +04:00
# define MCI_DATABLOCKENDMASK (1 << 10)
# define MCI_CMDACTIVEMASK (1 << 11)
# define MCI_TXACTIVEMASK (1 << 12)
# define MCI_RXACTIVEMASK (1 << 13)
# define MCI_TXFIFOHALFEMPTYMASK (1 << 14)
# define MCI_RXFIFOHALFFULLMASK (1 << 15)
# define MCI_TXFIFOFULLMASK (1 << 16)
# define MCI_RXFIFOFULLMASK (1 << 17)
# define MCI_TXFIFOEMPTYMASK (1 << 18)
# define MCI_RXFIFOEMPTYMASK (1 << 19)
# define MCI_TXDATAAVLBLMASK (1 << 20)
# define MCI_RXDATAAVLBLMASK (1 << 21)
2011-03-04 16:54:16 +03:00
/* Extended status bits for the ST Micro variants */
# define MCI_ST_SDIOITMASK (1 << 22)
# define MCI_ST_CEATAENDMASK (1 << 23)
2005-04-17 02:20:36 +04:00
# define MMCIMASK1 0x040
# define MMCIFIFOCNT 0x048
# define MMCIFIFO 0x080 /* to 0x0bc */
# define MCI_IRQENABLE \
( MCI_CMDCRCFAILMASK | MCI_DATACRCFAILMASK | MCI_CMDTIMEOUTMASK | \
MCI_DATATIMEOUTMASK | MCI_TXUNDERRUNMASK | MCI_RXOVERRUNMASK | \
2011-06-30 18:10:21 +04:00
MCI_CMDRESPENDMASK | MCI_CMDSENTMASK | MCI_STARTBITERRMASK )
2005-04-17 02:20:36 +04:00
2010-10-19 15:39:48 +04:00
/* These interrupts are directed to IRQ1 when two IRQ lines are available */
# define MCI_IRQ1MASK \
( MCI_RXFIFOHALFFULLMASK | MCI_RXDATAAVLBLMASK | \
MCI_TXFIFOHALFEMPTYMASK )
2011-12-13 19:52:00 +04:00
# define NR_SG 128
2005-04-17 02:20:36 +04:00
struct clk ;
2010-07-21 15:54:40 +04:00
struct variant_data ;
ARM: mmci: add dmaengine-based DMA support
Based on a patch from Linus Walleij.
Add dmaengine based support for DMA to the MMCI driver, using the
Primecell DMA engine interface. The changes over Linus' driver are:
- rename txsize_threshold to dmasize_threshold, as this reflects the
purpose more.
- use 'mmci_dma_' as the function prefix rather than 'dma_mmci_'.
- clean up requesting of dma channels.
- don't release a single channel twice when it's shared between tx and rx.
- get rid of 'dma_enable' bool - instead check whether the channel is NULL.
- detect incomplete DMA at the end of a transfer. Some DMA controllers
(eg, PL08x) are unable to be configured for scatter DMA and also listen
to all four DMA request signals [BREQ,SREQ,LBREQ,LSREQ] from the MMCI.
They can do one or other but not both. As MMCI uses LBREQ/LSREQ for the
final burst/words, PL08x does not transfer the last few words.
- map and unmap DMA buffers using the DMA engine struct device, not the
MMCI struct device - the DMA engine is doing the DMA transfer, not us.
- avoid double-unmapping of the DMA buffers on MMCI data errors.
- don't check for negative values from the dmaengine tx submission
function - Dan says this must never fail.
- use new dmaengine helper functions rather than using the ugly function
pointers directly.
- allow DMA code to be fully optimized away using dma_inprogress() which
is defined to constant 0 if DMA engine support is disabled.
- request maximum segment size from the DMA engine struct device and
set this appropriately.
- removed checking of buffer alignment - the DMA engine should deal with
its own restrictions on buffer alignment, not the individual DMA engine
users.
- removed setting DMAREQCTL - this confuses some DMA controllers as it
causes LBREQ to be asserted for the last seven transfers, rather than
six SREQ and one LSREQ.
- removed burst setting - the DMA controller should not burst past the
transfer size required to complete the DMA operation.
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2011-01-11 22:35:53 +03:00
struct dma_chan ;
2005-04-17 02:20:36 +04:00
2011-07-01 20:55:24 +04:00
struct mmci_host_next {
struct dma_async_tx_descriptor * dma_desc ;
struct dma_chan * dma_chan ;
s32 cookie ;
} ;
2005-04-17 02:20:36 +04:00
struct mmci_host {
ARM: mmci: add dmaengine-based DMA support
Based on a patch from Linus Walleij.
Add dmaengine based support for DMA to the MMCI driver, using the
Primecell DMA engine interface. The changes over Linus' driver are:
- rename txsize_threshold to dmasize_threshold, as this reflects the
purpose more.
- use 'mmci_dma_' as the function prefix rather than 'dma_mmci_'.
- clean up requesting of dma channels.
- don't release a single channel twice when it's shared between tx and rx.
- get rid of 'dma_enable' bool - instead check whether the channel is NULL.
- detect incomplete DMA at the end of a transfer. Some DMA controllers
(eg, PL08x) are unable to be configured for scatter DMA and also listen
to all four DMA request signals [BREQ,SREQ,LBREQ,LSREQ] from the MMCI.
They can do one or other but not both. As MMCI uses LBREQ/LSREQ for the
final burst/words, PL08x does not transfer the last few words.
- map and unmap DMA buffers using the DMA engine struct device, not the
MMCI struct device - the DMA engine is doing the DMA transfer, not us.
- avoid double-unmapping of the DMA buffers on MMCI data errors.
- don't check for negative values from the dmaengine tx submission
function - Dan says this must never fail.
- use new dmaengine helper functions rather than using the ugly function
pointers directly.
- allow DMA code to be fully optimized away using dma_inprogress() which
is defined to constant 0 if DMA engine support is disabled.
- request maximum segment size from the DMA engine struct device and
set this appropriately.
- removed checking of buffer alignment - the DMA engine should deal with
its own restrictions on buffer alignment, not the individual DMA engine
users.
- removed setting DMAREQCTL - this confuses some DMA controllers as it
causes LBREQ to be asserted for the last seven transfers, rather than
six SREQ and one LSREQ.
- removed burst setting - the DMA controller should not burst past the
transfer size required to complete the DMA operation.
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2011-01-11 22:35:53 +03:00
phys_addr_t phybase ;
2005-04-17 02:20:36 +04:00
void __iomem * base ;
struct mmc_request * mrq ;
struct mmc_command * cmd ;
struct mmc_data * data ;
struct mmc_host * mmc ;
struct clk * clk ;
2009-07-09 18:16:07 +04:00
int gpio_cd ;
int gpio_wp ;
2010-08-09 15:55:48 +04:00
int gpio_cd_irq ;
2010-10-19 15:39:48 +04:00
bool singleirq ;
2005-04-17 02:20:36 +04:00
spinlock_t lock ;
unsigned int mclk ;
unsigned int cclk ;
2012-01-18 12:17:27 +04:00
u32 pwr_reg ;
u32 clk_reg ;
2013-05-14 16:53:10 +04:00
bool vqmmc_enabled ;
2009-09-22 17:29:36 +04:00
struct mmci_platform_data * plat ;
2010-07-21 15:54:40 +04:00
struct variant_data * variant ;
2005-04-17 02:20:36 +04:00
2009-01-04 17:18:54 +03:00
u8 hw_designer ;
u8 hw_revision : 4 ;
2005-04-17 02:20:36 +04:00
struct timer_list timer ;
unsigned int oldstat ;
/* pio stuff */
2010-07-21 15:44:58 +04:00
struct sg_mapping_iter sg_miter ;
2005-04-17 02:20:36 +04:00
unsigned int size ;
ARM: mmci: add dmaengine-based DMA support
Based on a patch from Linus Walleij.
Add dmaengine based support for DMA to the MMCI driver, using the
Primecell DMA engine interface. The changes over Linus' driver are:
- rename txsize_threshold to dmasize_threshold, as this reflects the
purpose more.
- use 'mmci_dma_' as the function prefix rather than 'dma_mmci_'.
- clean up requesting of dma channels.
- don't release a single channel twice when it's shared between tx and rx.
- get rid of 'dma_enable' bool - instead check whether the channel is NULL.
- detect incomplete DMA at the end of a transfer. Some DMA controllers
(eg, PL08x) are unable to be configured for scatter DMA and also listen
to all four DMA request signals [BREQ,SREQ,LBREQ,LSREQ] from the MMCI.
They can do one or other but not both. As MMCI uses LBREQ/LSREQ for the
final burst/words, PL08x does not transfer the last few words.
- map and unmap DMA buffers using the DMA engine struct device, not the
MMCI struct device - the DMA engine is doing the DMA transfer, not us.
- avoid double-unmapping of the DMA buffers on MMCI data errors.
- don't check for negative values from the dmaengine tx submission
function - Dan says this must never fail.
- use new dmaengine helper functions rather than using the ugly function
pointers directly.
- allow DMA code to be fully optimized away using dma_inprogress() which
is defined to constant 0 if DMA engine support is disabled.
- request maximum segment size from the DMA engine struct device and
set this appropriately.
- removed checking of buffer alignment - the DMA engine should deal with
its own restrictions on buffer alignment, not the individual DMA engine
users.
- removed setting DMAREQCTL - this confuses some DMA controllers as it
causes LBREQ to be asserted for the last seven transfers, rather than
six SREQ and one LSREQ.
- removed burst setting - the DMA controller should not burst past the
transfer size required to complete the DMA operation.
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2011-01-11 22:35:53 +03:00
2012-10-29 17:39:30 +04:00
/* pinctrl handles */
struct pinctrl * pinctrl ;
struct pinctrl_state * pins_default ;
ARM: mmci: add dmaengine-based DMA support
Based on a patch from Linus Walleij.
Add dmaengine based support for DMA to the MMCI driver, using the
Primecell DMA engine interface. The changes over Linus' driver are:
- rename txsize_threshold to dmasize_threshold, as this reflects the
purpose more.
- use 'mmci_dma_' as the function prefix rather than 'dma_mmci_'.
- clean up requesting of dma channels.
- don't release a single channel twice when it's shared between tx and rx.
- get rid of 'dma_enable' bool - instead check whether the channel is NULL.
- detect incomplete DMA at the end of a transfer. Some DMA controllers
(eg, PL08x) are unable to be configured for scatter DMA and also listen
to all four DMA request signals [BREQ,SREQ,LBREQ,LSREQ] from the MMCI.
They can do one or other but not both. As MMCI uses LBREQ/LSREQ for the
final burst/words, PL08x does not transfer the last few words.
- map and unmap DMA buffers using the DMA engine struct device, not the
MMCI struct device - the DMA engine is doing the DMA transfer, not us.
- avoid double-unmapping of the DMA buffers on MMCI data errors.
- don't check for negative values from the dmaengine tx submission
function - Dan says this must never fail.
- use new dmaengine helper functions rather than using the ugly function
pointers directly.
- allow DMA code to be fully optimized away using dma_inprogress() which
is defined to constant 0 if DMA engine support is disabled.
- request maximum segment size from the DMA engine struct device and
set this appropriately.
- removed checking of buffer alignment - the DMA engine should deal with
its own restrictions on buffer alignment, not the individual DMA engine
users.
- removed setting DMAREQCTL - this confuses some DMA controllers as it
causes LBREQ to be asserted for the last seven transfers, rather than
six SREQ and one LSREQ.
- removed burst setting - the DMA controller should not burst past the
transfer size required to complete the DMA operation.
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2011-01-11 22:35:53 +03:00
# ifdef CONFIG_DMA_ENGINE
/* DMA stuff */
struct dma_chan * dma_current ;
struct dma_chan * dma_rx_channel ;
struct dma_chan * dma_tx_channel ;
2011-07-01 20:55:24 +04:00
struct dma_async_tx_descriptor * dma_desc_current ;
struct mmci_host_next next_data ;
ARM: mmci: add dmaengine-based DMA support
Based on a patch from Linus Walleij.
Add dmaengine based support for DMA to the MMCI driver, using the
Primecell DMA engine interface. The changes over Linus' driver are:
- rename txsize_threshold to dmasize_threshold, as this reflects the
purpose more.
- use 'mmci_dma_' as the function prefix rather than 'dma_mmci_'.
- clean up requesting of dma channels.
- don't release a single channel twice when it's shared between tx and rx.
- get rid of 'dma_enable' bool - instead check whether the channel is NULL.
- detect incomplete DMA at the end of a transfer. Some DMA controllers
(eg, PL08x) are unable to be configured for scatter DMA and also listen
to all four DMA request signals [BREQ,SREQ,LBREQ,LSREQ] from the MMCI.
They can do one or other but not both. As MMCI uses LBREQ/LSREQ for the
final burst/words, PL08x does not transfer the last few words.
- map and unmap DMA buffers using the DMA engine struct device, not the
MMCI struct device - the DMA engine is doing the DMA transfer, not us.
- avoid double-unmapping of the DMA buffers on MMCI data errors.
- don't check for negative values from the dmaengine tx submission
function - Dan says this must never fail.
- use new dmaengine helper functions rather than using the ugly function
pointers directly.
- allow DMA code to be fully optimized away using dma_inprogress() which
is defined to constant 0 if DMA engine support is disabled.
- request maximum segment size from the DMA engine struct device and
set this appropriately.
- removed checking of buffer alignment - the DMA engine should deal with
its own restrictions on buffer alignment, not the individual DMA engine
users.
- removed setting DMAREQCTL - this confuses some DMA controllers as it
causes LBREQ to be asserted for the last seven transfers, rather than
six SREQ and one LSREQ.
- removed burst setting - the DMA controller should not burst past the
transfer size required to complete the DMA operation.
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2011-01-11 22:35:53 +03:00
# define dma_inprogress(host) ((host)->dma_current)
# else
# define dma_inprogress(host) (0)
# endif
2005-04-17 02:20:36 +04:00
} ;