|
@@ -164,9 +164,15 @@ static char *abort_sources[] = {
|
|
|
|
|
|
u32 dw_readl(struct dw_i2c_dev *dev, int offset)
|
|
|
{
|
|
|
- u32 value = readl(dev->base + offset);
|
|
|
+ u32 value;
|
|
|
|
|
|
- if (dev->swab)
|
|
|
+ if (dev->accessor_flags & ACCESS_16BIT)
|
|
|
+ value = readw(dev->base + offset) |
|
|
|
+ (readw(dev->base + offset + 2) << 16);
|
|
|
+ else
|
|
|
+ value = readl(dev->base + offset);
|
|
|
+
|
|
|
+ if (dev->accessor_flags & ACCESS_SWAP)
|
|
|
return swab32(value);
|
|
|
else
|
|
|
return value;
|
|
@@ -174,10 +180,15 @@ u32 dw_readl(struct dw_i2c_dev *dev, int offset)
|
|
|
|
|
|
void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset)
|
|
|
{
|
|
|
- if (dev->swab)
|
|
|
+ if (dev->accessor_flags & ACCESS_SWAP)
|
|
|
b = swab32(b);
|
|
|
|
|
|
- writel(b, dev->base + offset);
|
|
|
+ if (dev->accessor_flags & ACCESS_16BIT) {
|
|
|
+ writew((u16)b, dev->base + offset);
|
|
|
+ writew((u16)(b >> 16), dev->base + offset + 2);
|
|
|
+ } else {
|
|
|
+ writel(b, dev->base + offset);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static u32
|
|
@@ -251,14 +262,14 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
|
|
|
|
|
|
input_clock_khz = dev->get_clk_rate_khz(dev);
|
|
|
|
|
|
- /* Configure register endianess access */
|
|
|
reg = dw_readl(dev, DW_IC_COMP_TYPE);
|
|
|
if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) {
|
|
|
- dev->swab = 1;
|
|
|
- reg = DW_IC_COMP_TYPE_VALUE;
|
|
|
- }
|
|
|
-
|
|
|
- if (reg != DW_IC_COMP_TYPE_VALUE) {
|
|
|
+ /* Configure register endianess access */
|
|
|
+ dev->accessor_flags |= ACCESS_SWAP;
|
|
|
+ } else if (reg == (DW_IC_COMP_TYPE_VALUE & 0x0000ffff)) {
|
|
|
+ /* Configure register access mode 16bit */
|
|
|
+ dev->accessor_flags |= ACCESS_16BIT;
|
|
|
+ } else if (reg != DW_IC_COMP_TYPE_VALUE) {
|
|
|
dev_err(dev->dev, "Unknown Synopsys component type: "
|
|
|
"0x%08x\n", reg);
|
|
|
return -ENODEV;
|