@ -64,19 +64,25 @@ static int b53_mmap_read32(struct b53_device *dev, u8 page, u8 reg, u32 *val)
static int b53_mmap_read48 ( struct b53_device * dev , u8 page , u8 reg , u64 * val )
{
u8 __iomem * regs = dev - > priv ;
if ( WARN_ON ( reg % 4 ) )
if ( WARN_ON ( reg % 2 ) )
return - EINVAL ;
if ( dev - > pdata & & dev - > pdata - > big_endian ) {
* val = readl_be ( regs + ( page < < 8 ) + reg ) ;
* val < < = 16 ;
* val | = readw_be ( regs + ( page < < 8 ) + reg + 4 ) ;
if ( reg % 4 ) {
u16 lo ;
u32 hi ;
b53_mmap_read16 ( dev , page , reg , & lo ) ;
b53_mmap_read32 ( dev , page , reg + 2 , & hi ) ;
* val = ( ( u64 ) hi < < 16 ) | lo ;
} else {
* val | = readw ( regs + ( page < < 8 ) + reg + 4 ) ;
* val < < = 32 ;
* val = readl ( regs + ( page < < 8 ) + reg ) ;
u32 lo ;
u16 hi ;
b53_mmap_read32 ( dev , page , reg , & lo ) ;
b53_mmap_read16 ( dev , page , reg + 4 , & hi ) ;
* val = ( ( u64 ) hi < < 32 ) | lo ;
}
return 0 ;
@ -84,19 +90,13 @@ static int b53_mmap_read48(struct b53_device *dev, u8 page, u8 reg, u64 *val)
static int b53_mmap_read64 ( struct b53_device * dev , u8 page , u8 reg , u64 * val )
{
u8 __iomem * regs = dev - > priv ;
u32 hi , lo ;
if ( WARN_ON ( reg % 4 ) )
return - EINVAL ;
if ( dev - > pdata & & dev - > pdata - > big_endian ) {
lo = readl_be ( regs + ( page < < 8 ) + reg ) ;
hi = readl_be ( regs + ( page < < 8 ) + reg + 4 ) ;
} else {
lo = readl ( regs + ( page < < 8 ) + reg ) ;
hi = readl ( regs + ( page < < 8 ) + reg + 4 ) ;
}
b53_mmap_read32 ( dev , page , reg , & lo ) ;
b53_mmap_read32 ( dev , page , reg + 4 , & hi ) ;
* val = ( ( u64 ) hi < < 32 ) | lo ;
@ -147,17 +147,21 @@ static int b53_mmap_write32(struct b53_device *dev, u8 page, u8 reg,
static int b53_mmap_write48 ( struct b53_device * dev , u8 page , u8 reg ,
u64 value )
{
u8 __iomem * regs = dev - > priv ;
if ( WARN_ON ( reg % 4 ) )
if ( WARN_ON ( reg % 2 ) )
return - EINVAL ;
if ( dev - > pdata & & dev - > pdata - > big_endian ) {
writel_be ( ( u32 ) ( value > > 16 ) , regs + ( page < < 8 ) + reg ) ;
writew_be ( ( u16 ) value , regs + ( page < < 8 ) + reg + 4 ) ;
if ( reg % 4 ) {
u32 hi = ( u32 ) ( value > > 16 ) ;
u16 lo = ( u16 ) value ;
b53_mmap_write16 ( dev , page , reg , lo ) ;
b53_mmap_write32 ( dev , page , reg + 2 , hi ) ;
} else {
writel ( ( u32 ) value , regs + ( page < < 8 ) + reg ) ;
writew ( ( u16 ) ( value > > 32 ) , regs + ( page < < 8 ) + reg + 4 ) ;
u16 hi = ( u16 ) ( value > > 32 ) ;
u32 lo = ( u32 ) value ;
b53_mmap_write32 ( dev , page , reg , lo ) ;
b53_mmap_write16 ( dev , page , reg + 4 , hi ) ;
}
return 0 ;
@ -166,18 +170,16 @@ static int b53_mmap_write48(struct b53_device *dev, u8 page, u8 reg,
static int b53_mmap_write64 ( struct b53_device * dev , u8 page , u8 reg ,
u64 value )
{
u8 __iomem * regs = dev - > priv ;
u32 hi , lo ;
hi = ( u32 ) ( value > > 32 ) ;
lo = ( u32 ) value ;
if ( WARN_ON ( reg % 4 ) )
return - EINVAL ;
if ( dev - > pdata & & dev - > pdata - > big_endian ) {
writel_be ( ( u32 ) ( value > > 32 ) , regs + ( page < < 8 ) + reg ) ;
writel_be ( ( u32 ) value , regs + ( page < < 8 ) + reg + 4 ) ;
} else {
writel ( ( u32 ) value , regs + ( page < < 8 ) + reg ) ;
writel ( ( u32 ) ( value > > 32 ) , regs + ( page < < 8 ) + reg + 4 ) ;
}
b53_mmap_write32 ( dev , page , reg , lo ) ;
b53_mmap_write32 ( dev , page , reg + 4 , hi ) ;
return 0 ;
}