2008-08-30 16:03:44 -03:00
/*
* cx18 driver PCI memory mapped IO access routines
*
* Copyright ( C ) 2007 Hans Verkuil < hverkuil @ xs4all . nl >
2010-05-23 18:53:35 -03:00
* Copyright ( C ) 2008 Andy Walls < awalls @ md . metrocast . net >
2008-08-30 16:03:44 -03:00
*
* 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 .
*/
# include "cx18-driver.h"
2008-09-01 00:40:41 -03:00
# include "cx18-io.h"
2008-08-30 16:03:44 -03:00
# include "cx18-irq.h"
void cx18_memset_io ( struct cx18 * cx , void __iomem * addr , int val , size_t count )
{
2008-09-06 14:02:43 -03:00
u8 __iomem * dst = addr ;
2008-09-01 00:40:41 -03:00
u16 val2 = val | ( val < < 8 ) ;
u32 val4 = val2 | ( val2 < < 16 ) ;
/* Align writes on the CX23418's addresses */
2008-09-04 13:16:40 -03:00
if ( ( count > 0 ) & & ( ( unsigned long ) dst & 1 ) ) {
cx18_writeb ( cx , ( u8 ) val , dst ) ;
2008-09-01 00:40:41 -03:00
count - - ;
2008-09-04 13:16:40 -03:00
dst + + ;
2008-09-01 00:40:41 -03:00
}
2008-09-04 13:16:40 -03:00
if ( ( count > 1 ) & & ( ( unsigned long ) dst & 2 ) ) {
cx18_writew ( cx , val2 , dst ) ;
2008-09-01 00:40:41 -03:00
count - = 2 ;
2008-09-04 13:16:40 -03:00
dst + = 2 ;
2008-09-01 00:40:41 -03:00
}
while ( count > 3 ) {
2008-09-04 13:16:40 -03:00
cx18_writel ( cx , val4 , dst ) ;
2008-09-01 00:40:41 -03:00
count - = 4 ;
2008-09-04 13:16:40 -03:00
dst + = 4 ;
2008-09-01 00:40:41 -03:00
}
if ( count > 1 ) {
2008-09-04 13:16:40 -03:00
cx18_writew ( cx , val2 , dst ) ;
2008-09-01 00:40:41 -03:00
count - = 2 ;
2008-09-04 13:16:40 -03:00
dst + = 2 ;
2008-09-01 00:40:41 -03:00
}
if ( count > 0 )
2008-09-04 13:16:40 -03:00
cx18_writeb ( cx , ( u8 ) val , dst ) ;
2008-08-30 16:03:44 -03:00
}
void cx18_sw1_irq_enable ( struct cx18 * cx , u32 val )
{
2008-10-31 20:49:12 -03:00
cx18_write_reg_expect ( cx , val , SW1_INT_STATUS , ~ val , val ) ;
2008-11-17 22:48:46 -03:00
cx - > sw1_irq_mask = cx18_read_reg ( cx , SW1_INT_ENABLE_PCI ) | val ;
cx18_write_reg ( cx , cx - > sw1_irq_mask , SW1_INT_ENABLE_PCI ) ;
2008-08-30 16:03:44 -03:00
}
void cx18_sw1_irq_disable ( struct cx18 * cx , u32 val )
{
2008-11-17 22:48:46 -03:00
cx - > sw1_irq_mask = cx18_read_reg ( cx , SW1_INT_ENABLE_PCI ) & ~ val ;
cx18_write_reg ( cx , cx - > sw1_irq_mask , SW1_INT_ENABLE_PCI ) ;
2008-08-30 16:03:44 -03:00
}
void cx18_sw2_irq_enable ( struct cx18 * cx , u32 val )
{
2008-10-31 20:49:12 -03:00
cx18_write_reg_expect ( cx , val , SW2_INT_STATUS , ~ val , val ) ;
2008-11-17 22:48:46 -03:00
cx - > sw2_irq_mask = cx18_read_reg ( cx , SW2_INT_ENABLE_PCI ) | val ;
cx18_write_reg ( cx , cx - > sw2_irq_mask , SW2_INT_ENABLE_PCI ) ;
2008-08-30 16:03:44 -03:00
}
void cx18_sw2_irq_disable ( struct cx18 * cx , u32 val )
{
2008-11-17 22:48:46 -03:00
cx - > sw2_irq_mask = cx18_read_reg ( cx , SW2_INT_ENABLE_PCI ) & ~ val ;
cx18_write_reg ( cx , cx - > sw2_irq_mask , SW2_INT_ENABLE_PCI ) ;
2008-08-30 16:03:44 -03:00
}
2008-11-09 18:14:07 -03:00
void cx18_sw2_irq_disable_cpu ( struct cx18 * cx , u32 val )
{
u32 r ;
r = cx18_read_reg ( cx , SW2_INT_ENABLE_CPU ) ;
cx18_write_reg ( cx , r & ~ val , SW2_INT_ENABLE_CPU ) ;
}
2008-08-30 16:03:44 -03:00
void cx18_setup_page ( struct cx18 * cx , u32 addr )
{
u32 val ;
val = cx18_read_reg ( cx , 0xD000F8 ) ;
val = ( val & ~ 0x1f00 ) | ( ( addr > > 17 ) & 0x1f00 ) ;
cx18_write_reg ( cx , val , 0xD000F8 ) ;
}