2008-08-30 23:03:44 +04:00
/*
* cx18 driver PCI memory mapped IO access routines
*
* Copyright ( C ) 2007 Hans Verkuil < hverkuil @ xs4all . nl >
* Copyright ( C ) 2008 Andy Walls < awalls @ radix . net >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA
* 02111 - 1307 USA
*/
# ifndef CX18_IO_H
# define CX18_IO_H
# include "cx18-driver.h"
2008-09-29 04:46:02 +04:00
/*
* Readback and retry of MMIO access for reliability :
* The concept was suggested by Steve Toth < stoth @ linuxtv . org > .
* The implmentation is the fault of Andy Walls < awalls @ radix . net > .
2008-11-17 05:33:41 +03:00
*
* * write * functions are implied to retry the mmio unless suffixed with _noretry
* * read * functions never retry the mmio ( it never helps to do so )
2008-09-29 04:46:02 +04:00
*/
2008-09-01 07:40:41 +04:00
/* Non byteswapping memory mapped IO */
2008-11-17 05:33:41 +03:00
static inline u32 cx18_raw_readl ( struct cx18 * cx , const void __iomem * addr )
{
return __raw_readl ( addr ) ;
}
2008-09-29 04:46:02 +04:00
static inline
void cx18_raw_writel_noretry ( struct cx18 * cx , u32 val , void __iomem * addr )
2008-09-01 07:40:41 +04:00
{
__raw_writel ( val , addr ) ;
}
2008-08-30 23:03:44 +04:00
2008-09-29 04:46:02 +04:00
static inline void cx18_raw_writel ( struct cx18 * cx , u32 val , void __iomem * addr )
{
2008-11-17 05:33:41 +03:00
int i ;
for ( i = 0 ; i < CX18_MAX_MMIO_WR_RETRIES ; i + + ) {
2008-09-29 04:46:02 +04:00
cx18_raw_writel_noretry ( cx , val , addr ) ;
2008-11-17 05:33:41 +03:00
if ( val = = cx18_raw_readl ( cx , addr ) )
break ;
}
2008-09-29 04:46:02 +04:00
}
2008-11-17 05:33:41 +03:00
/* Normal memory mapped IO */
static inline u32 cx18_readl ( struct cx18 * cx , const void __iomem * addr )
2008-09-29 04:46:02 +04:00
{
2008-11-17 05:33:41 +03:00
return readl ( addr ) ;
2008-09-29 04:46:02 +04:00
}
static inline
2008-11-17 05:33:41 +03:00
void cx18_writel_noretry ( struct cx18 * cx , u32 val , void __iomem * addr )
2008-09-01 07:40:41 +04:00
{
2008-11-17 05:33:41 +03:00
writel ( val , addr ) ;
2008-09-01 07:40:41 +04:00
}
2008-08-30 23:03:44 +04:00
2008-11-17 05:33:41 +03:00
static inline void cx18_writel ( struct cx18 * cx , u32 val , void __iomem * addr )
2008-09-29 04:46:02 +04:00
{
2008-11-17 05:33:41 +03:00
int i ;
for ( i = 0 ; i < CX18_MAX_MMIO_WR_RETRIES ; i + + ) {
cx18_writel_noretry ( cx , val , addr ) ;
if ( val = = cx18_readl ( cx , addr ) )
break ;
}
2008-09-29 04:46:02 +04:00
}
static inline
2008-11-17 05:33:41 +03:00
void cx18_writel_expect ( struct cx18 * cx , u32 val , void __iomem * addr ,
u32 eval , u32 mask )
2008-09-01 07:40:41 +04:00
{
2008-11-17 05:33:41 +03:00
int i ;
2008-11-30 16:01:21 +03:00
u32 r ;
2008-11-17 05:33:41 +03:00
eval & = mask ;
for ( i = 0 ; i < CX18_MAX_MMIO_WR_RETRIES ; i + + ) {
cx18_writel_noretry ( cx , val , addr ) ;
2008-11-30 16:01:21 +03:00
r = cx18_readl ( cx , addr ) ;
if ( r = = 0xffffffff & & eval ! = 0xffffffff )
continue ;
if ( eval = = ( r & mask ) )
2008-11-17 05:33:41 +03:00
break ;
}
2008-09-01 07:40:41 +04:00
}
2008-08-30 23:03:44 +04:00
2008-11-17 05:33:41 +03:00
static inline u16 cx18_readw ( struct cx18 * cx , const void __iomem * addr )
2008-09-29 04:46:02 +04:00
{
2008-11-17 05:33:41 +03:00
return readw ( addr ) ;
2008-09-29 04:46:02 +04:00
}
static inline
void cx18_writew_noretry ( struct cx18 * cx , u16 val , void __iomem * addr )
2008-09-01 07:40:41 +04:00
{
writew ( val , addr ) ;
}
2008-09-29 04:46:02 +04:00
static inline void cx18_writew ( struct cx18 * cx , u16 val , void __iomem * addr )
{
2008-11-17 05:33:41 +03:00
int i ;
for ( i = 0 ; i < CX18_MAX_MMIO_WR_RETRIES ; i + + ) {
2008-09-29 04:46:02 +04:00
cx18_writew_noretry ( cx , val , addr ) ;
2008-11-17 05:33:41 +03:00
if ( val = = cx18_readw ( cx , addr ) )
break ;
}
2008-09-29 04:46:02 +04:00
}
2008-11-17 05:33:41 +03:00
static inline u8 cx18_readb ( struct cx18 * cx , const void __iomem * addr )
{
return readb ( addr ) ;
}
2008-09-29 04:46:02 +04:00
static inline
void cx18_writeb_noretry ( struct cx18 * cx , u8 val , void __iomem * addr )
2008-09-01 07:40:41 +04:00
{
writeb ( val , addr ) ;
}
2008-09-29 04:46:02 +04:00
static inline void cx18_writeb ( struct cx18 * cx , u8 val , void __iomem * addr )
{
2008-11-17 05:33:41 +03:00
int i ;
for ( i = 0 ; i < CX18_MAX_MMIO_WR_RETRIES ; i + + ) {
2008-09-29 04:46:02 +04:00
cx18_writeb_noretry ( cx , val , addr ) ;
2008-11-17 05:33:41 +03:00
if ( val = = cx18_readb ( cx , addr ) )
break ;
}
2008-09-29 04:46:02 +04:00
}
2008-11-16 07:38:19 +03:00
static inline
2008-08-30 23:03:44 +04:00
void cx18_memcpy_fromio ( struct cx18 * cx , void * to ,
2008-11-16 07:38:19 +03:00
const void __iomem * from , unsigned int len )
{
memcpy_fromio ( to , from , len ) ;
}
2008-08-30 23:03:44 +04:00
void cx18_memset_io ( struct cx18 * cx , void __iomem * addr , int val , size_t count ) ;
2008-09-29 04:46:02 +04:00
2008-09-01 07:40:41 +04:00
/* Access "register" region of CX23418 memory mapped I/O */
2008-09-29 04:46:02 +04:00
static inline void cx18_write_reg_noretry ( struct cx18 * cx , u32 val , u32 reg )
{
cx18_writel_noretry ( cx , val , cx - > reg_mem + reg ) ;
}
2008-09-01 07:40:41 +04:00
static inline void cx18_write_reg ( struct cx18 * cx , u32 val , u32 reg )
{
2008-11-17 05:33:41 +03:00
cx18_writel ( cx , val , cx - > reg_mem + reg ) ;
2008-11-01 02:49:12 +03:00
}
static inline void cx18_write_reg_expect ( struct cx18 * cx , u32 val , u32 reg ,
u32 eval , u32 mask )
{
2008-11-17 05:33:41 +03:00
cx18_writel_expect ( cx , val , cx - > reg_mem + reg , eval , mask ) ;
2008-09-01 07:40:41 +04:00
}
static inline u32 cx18_read_reg ( struct cx18 * cx , u32 reg )
{
2008-11-17 05:33:41 +03:00
return cx18_readl ( cx , cx - > reg_mem + reg ) ;
2008-09-01 07:40:41 +04:00
}
2008-09-29 04:46:02 +04:00
2008-09-01 07:40:41 +04:00
/* Access "encoder memory" region of CX23418 memory mapped I/O */
static inline void cx18_write_enc ( struct cx18 * cx , u32 val , u32 addr )
{
2008-11-17 05:33:41 +03:00
cx18_writel ( cx , val , cx - > enc_mem + addr ) ;
2008-09-01 07:40:41 +04:00
}
static inline u32 cx18_read_enc ( struct cx18 * cx , u32 addr )
{
2008-11-17 05:33:41 +03:00
return cx18_readl ( cx , cx - > enc_mem + addr ) ;
2008-09-29 04:46:02 +04:00
}
2008-09-01 07:40:41 +04:00
2008-08-30 23:03:44 +04:00
void cx18_sw1_irq_enable ( struct cx18 * cx , u32 val ) ;
void cx18_sw1_irq_disable ( struct cx18 * cx , u32 val ) ;
void cx18_sw2_irq_enable ( struct cx18 * cx , u32 val ) ;
void cx18_sw2_irq_disable ( struct cx18 * cx , u32 val ) ;
2008-11-10 00:14:07 +03:00
void cx18_sw2_irq_disable_cpu ( struct cx18 * cx , u32 val ) ;
2008-08-30 23:03:44 +04:00
void cx18_setup_page ( struct cx18 * cx , u32 addr ) ;
# endif /* CX18_IO_H */