Loading arch/arm/mach-pxa/devices.h +1 −0 Original line number Diff line number Diff line Loading @@ -32,5 +32,6 @@ extern struct platform_device pxa27x_device_pwm0; extern struct platform_device pxa27x_device_pwm1; extern struct platform_device pxa3xx_device_nand; extern struct platform_device pxa3xx_device_i2c_power; void __init pxa_register_device(struct platform_device *dev, void *data); arch/arm/mach-pxa/include/mach/i2c.h +5 −1 Original line number Diff line number Diff line Loading @@ -71,7 +71,11 @@ struct i2c_pxa_platform_data { extern void pxa_set_i2c_info(struct i2c_pxa_platform_data *info); #ifdef CONFIG_PXA27x extern void pxa_set_i2c_power_info(struct i2c_pxa_platform_data *info); extern void pxa27x_set_i2c_power_info(struct i2c_pxa_platform_data *info); #endif #ifdef CONFIG_PXA3xx extern void pxa3xx_set_i2c_power_info(struct i2c_pxa_platform_data *info); #endif #endif arch/arm/mach-pxa/pxa27x.c +1 −1 Original line number Diff line number Diff line Loading @@ -349,7 +349,7 @@ struct platform_device pxa27x_device_i2c_power = { .num_resources = ARRAY_SIZE(i2c_power_resources), }; void __init pxa_set_i2c_power_info(struct i2c_pxa_platform_data *info) void __init pxa27x_set_i2c_power_info(struct i2c_pxa_platform_data *info) { local_irq_disable(); PCFR |= PCFR_PI2CEN; Loading arch/arm/mach-pxa/pxa3xx.c +45 −0 Original line number Diff line number Diff line Loading @@ -203,6 +203,19 @@ static const struct clkops clk_pout_ops = { .disable = clk_pout_disable, }; static void clk_dummy_enable(struct clk *clk) { } static void clk_dummy_disable(struct clk *clk) { } static const struct clkops clk_dummy_ops = { .enable = clk_dummy_enable, .disable = clk_dummy_disable, }; static struct clk pxa3xx_clks[] = { { .name = "CLK_POUT", Loading @@ -211,6 +224,13 @@ static struct clk pxa3xx_clks[] = { .delay = 70, }, /* Power I2C clock is always on */ { .name = "I2CCLK", .ops = &clk_dummy_ops, .dev = &pxa3xx_device_i2c_power.dev, }, PXA3xx_CK("LCDCLK", LCD, &clk_pxa3xx_hsio_ops, &pxa_device_fb.dev), PXA3xx_CK("CAMCLK", CAMERA, &clk_pxa3xx_hsio_ops, NULL), PXA3xx_CK("AC97CLK", AC97, &clk_pxa3xx_ac97_ops, NULL), Loading Loading @@ -509,6 +529,30 @@ void __init pxa3xx_init_irq(void) * device registration specific to PXA3xx. */ static struct resource i2c_power_resources[] = { { .start = 0x40f500c0, .end = 0x40f500d3, .flags = IORESOURCE_MEM, }, { .start = IRQ_PWRI2C, .end = IRQ_PWRI2C, .flags = IORESOURCE_IRQ, }, }; struct platform_device pxa3xx_device_i2c_power = { .name = "pxa2xx-i2c", .id = 1, .resource = i2c_power_resources, .num_resources = ARRAY_SIZE(i2c_power_resources), }; void __init pxa3xx_set_i2c_power_info(struct i2c_pxa_platform_data *info) { pxa3xx_device_i2c_power.dev.platform_data = info; } static struct platform_device *devices[] __initdata = { /* &pxa_device_udc, The UDC driver is PXA25x only */ &pxa_device_ffuart, Loading @@ -522,6 +566,7 @@ static struct platform_device *devices[] __initdata = { &pxa3xx_device_ssp4, &pxa27x_device_pwm0, &pxa27x_device_pwm1, &pxa3xx_device_i2c_power, }; static struct sys_device pxa3xx_sysdev[] = { Loading drivers/i2c/busses/i2c-pxa.c +7 −5 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ struct pxa_i2c { u32 icrlog[32]; void __iomem *reg_base; unsigned int reg_shift; unsigned long iobase; unsigned long iosize; Loading @@ -68,11 +69,11 @@ struct pxa_i2c { int use_pio; }; #define _IBMR(i2c) ((i2c)->reg_base + 0) #define _IDBR(i2c) ((i2c)->reg_base + 8) #define _ICR(i2c) ((i2c)->reg_base + 0x10) #define _ISR(i2c) ((i2c)->reg_base + 0x18) #define _ISAR(i2c) ((i2c)->reg_base + 0x20) #define _IBMR(i2c) ((i2c)->reg_base + (0x0 << (i2c)->reg_shift)) #define _IDBR(i2c) ((i2c)->reg_base + (0x4 << (i2c)->reg_shift)) #define _ICR(i2c) ((i2c)->reg_base + (0x8 << (i2c)->reg_shift)) #define _ISR(i2c) ((i2c)->reg_base + (0xc << (i2c)->reg_shift)) #define _ISAR(i2c) ((i2c)->reg_base + (0x10 << (i2c)->reg_shift)) /* * I2C Slave mode address Loading Loading @@ -993,6 +994,7 @@ static int i2c_pxa_probe(struct platform_device *dev) ret = -EIO; goto eremap; } i2c->reg_shift = (cpu_is_pxa3xx() && (dev->id == 1)) ? 0 : 1; i2c->iobase = res->start; i2c->iosize = res_len(res); Loading Loading
arch/arm/mach-pxa/devices.h +1 −0 Original line number Diff line number Diff line Loading @@ -32,5 +32,6 @@ extern struct platform_device pxa27x_device_pwm0; extern struct platform_device pxa27x_device_pwm1; extern struct platform_device pxa3xx_device_nand; extern struct platform_device pxa3xx_device_i2c_power; void __init pxa_register_device(struct platform_device *dev, void *data);
arch/arm/mach-pxa/include/mach/i2c.h +5 −1 Original line number Diff line number Diff line Loading @@ -71,7 +71,11 @@ struct i2c_pxa_platform_data { extern void pxa_set_i2c_info(struct i2c_pxa_platform_data *info); #ifdef CONFIG_PXA27x extern void pxa_set_i2c_power_info(struct i2c_pxa_platform_data *info); extern void pxa27x_set_i2c_power_info(struct i2c_pxa_platform_data *info); #endif #ifdef CONFIG_PXA3xx extern void pxa3xx_set_i2c_power_info(struct i2c_pxa_platform_data *info); #endif #endif
arch/arm/mach-pxa/pxa27x.c +1 −1 Original line number Diff line number Diff line Loading @@ -349,7 +349,7 @@ struct platform_device pxa27x_device_i2c_power = { .num_resources = ARRAY_SIZE(i2c_power_resources), }; void __init pxa_set_i2c_power_info(struct i2c_pxa_platform_data *info) void __init pxa27x_set_i2c_power_info(struct i2c_pxa_platform_data *info) { local_irq_disable(); PCFR |= PCFR_PI2CEN; Loading
arch/arm/mach-pxa/pxa3xx.c +45 −0 Original line number Diff line number Diff line Loading @@ -203,6 +203,19 @@ static const struct clkops clk_pout_ops = { .disable = clk_pout_disable, }; static void clk_dummy_enable(struct clk *clk) { } static void clk_dummy_disable(struct clk *clk) { } static const struct clkops clk_dummy_ops = { .enable = clk_dummy_enable, .disable = clk_dummy_disable, }; static struct clk pxa3xx_clks[] = { { .name = "CLK_POUT", Loading @@ -211,6 +224,13 @@ static struct clk pxa3xx_clks[] = { .delay = 70, }, /* Power I2C clock is always on */ { .name = "I2CCLK", .ops = &clk_dummy_ops, .dev = &pxa3xx_device_i2c_power.dev, }, PXA3xx_CK("LCDCLK", LCD, &clk_pxa3xx_hsio_ops, &pxa_device_fb.dev), PXA3xx_CK("CAMCLK", CAMERA, &clk_pxa3xx_hsio_ops, NULL), PXA3xx_CK("AC97CLK", AC97, &clk_pxa3xx_ac97_ops, NULL), Loading Loading @@ -509,6 +529,30 @@ void __init pxa3xx_init_irq(void) * device registration specific to PXA3xx. */ static struct resource i2c_power_resources[] = { { .start = 0x40f500c0, .end = 0x40f500d3, .flags = IORESOURCE_MEM, }, { .start = IRQ_PWRI2C, .end = IRQ_PWRI2C, .flags = IORESOURCE_IRQ, }, }; struct platform_device pxa3xx_device_i2c_power = { .name = "pxa2xx-i2c", .id = 1, .resource = i2c_power_resources, .num_resources = ARRAY_SIZE(i2c_power_resources), }; void __init pxa3xx_set_i2c_power_info(struct i2c_pxa_platform_data *info) { pxa3xx_device_i2c_power.dev.platform_data = info; } static struct platform_device *devices[] __initdata = { /* &pxa_device_udc, The UDC driver is PXA25x only */ &pxa_device_ffuart, Loading @@ -522,6 +566,7 @@ static struct platform_device *devices[] __initdata = { &pxa3xx_device_ssp4, &pxa27x_device_pwm0, &pxa27x_device_pwm1, &pxa3xx_device_i2c_power, }; static struct sys_device pxa3xx_sysdev[] = { Loading
drivers/i2c/busses/i2c-pxa.c +7 −5 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ struct pxa_i2c { u32 icrlog[32]; void __iomem *reg_base; unsigned int reg_shift; unsigned long iobase; unsigned long iosize; Loading @@ -68,11 +69,11 @@ struct pxa_i2c { int use_pio; }; #define _IBMR(i2c) ((i2c)->reg_base + 0) #define _IDBR(i2c) ((i2c)->reg_base + 8) #define _ICR(i2c) ((i2c)->reg_base + 0x10) #define _ISR(i2c) ((i2c)->reg_base + 0x18) #define _ISAR(i2c) ((i2c)->reg_base + 0x20) #define _IBMR(i2c) ((i2c)->reg_base + (0x0 << (i2c)->reg_shift)) #define _IDBR(i2c) ((i2c)->reg_base + (0x4 << (i2c)->reg_shift)) #define _ICR(i2c) ((i2c)->reg_base + (0x8 << (i2c)->reg_shift)) #define _ISR(i2c) ((i2c)->reg_base + (0xc << (i2c)->reg_shift)) #define _ISAR(i2c) ((i2c)->reg_base + (0x10 << (i2c)->reg_shift)) /* * I2C Slave mode address Loading Loading @@ -993,6 +994,7 @@ static int i2c_pxa_probe(struct platform_device *dev) ret = -EIO; goto eremap; } i2c->reg_shift = (cpu_is_pxa3xx() && (dev->id == 1)) ? 0 : 1; i2c->iobase = res->start; i2c->iosize = res_len(res); Loading