mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
i2c: ocores: support big-endian register layout
This allows using OpenCores I2C controller attached to its host in native-endian mode with bi-endian CPUs. Example of such system is Xtensa XTFPGA platform. Acked-by: Peter Korsgaard <[email protected]> Signed-off-by: Max Filippov <[email protected]> Signed-off-by: Wolfram Sang <[email protected]>
This commit is contained in:
parent
8a5e3d472e
commit
b299167652
2 changed files with 28 additions and 4 deletions
|
|
@ -92,6 +92,16 @@ static void oc_setreg_32(struct ocores_i2c *i2c, int reg, u8 value)
|
|||
iowrite32(value, i2c->base + (reg << i2c->reg_shift));
|
||||
}
|
||||
|
||||
static void oc_setreg_16be(struct ocores_i2c *i2c, int reg, u8 value)
|
||||
{
|
||||
iowrite16be(value, i2c->base + (reg << i2c->reg_shift));
|
||||
}
|
||||
|
||||
static void oc_setreg_32be(struct ocores_i2c *i2c, int reg, u8 value)
|
||||
{
|
||||
iowrite32be(value, i2c->base + (reg << i2c->reg_shift));
|
||||
}
|
||||
|
||||
static inline u8 oc_getreg_8(struct ocores_i2c *i2c, int reg)
|
||||
{
|
||||
return ioread8(i2c->base + (reg << i2c->reg_shift));
|
||||
|
|
@ -107,6 +117,16 @@ static inline u8 oc_getreg_32(struct ocores_i2c *i2c, int reg)
|
|||
return ioread32(i2c->base + (reg << i2c->reg_shift));
|
||||
}
|
||||
|
||||
static inline u8 oc_getreg_16be(struct ocores_i2c *i2c, int reg)
|
||||
{
|
||||
return ioread16be(i2c->base + (reg << i2c->reg_shift));
|
||||
}
|
||||
|
||||
static inline u8 oc_getreg_32be(struct ocores_i2c *i2c, int reg)
|
||||
{
|
||||
return ioread32be(i2c->base + (reg << i2c->reg_shift));
|
||||
}
|
||||
|
||||
static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u8 value)
|
||||
{
|
||||
i2c->setreg(i2c, reg, value);
|
||||
|
|
@ -428,6 +448,9 @@ static int ocores_i2c_probe(struct platform_device *pdev)
|
|||
i2c->reg_io_width = 1; /* Set to default value */
|
||||
|
||||
if (!i2c->setreg || !i2c->getreg) {
|
||||
bool be = pdata ? pdata->big_endian :
|
||||
of_device_is_big_endian(pdev->dev.of_node);
|
||||
|
||||
switch (i2c->reg_io_width) {
|
||||
case 1:
|
||||
i2c->setreg = oc_setreg_8;
|
||||
|
|
@ -435,13 +458,13 @@ static int ocores_i2c_probe(struct platform_device *pdev)
|
|||
break;
|
||||
|
||||
case 2:
|
||||
i2c->setreg = oc_setreg_16;
|
||||
i2c->getreg = oc_getreg_16;
|
||||
i2c->setreg = be ? oc_setreg_16be : oc_setreg_16;
|
||||
i2c->getreg = be ? oc_getreg_16be : oc_getreg_16;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
i2c->setreg = oc_setreg_32;
|
||||
i2c->getreg = oc_getreg_32;
|
||||
i2c->setreg = be ? oc_setreg_32be : oc_setreg_32;
|
||||
i2c->getreg = be ? oc_getreg_32be : oc_getreg_32;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
|||
Loading…
Reference in a new issue