I2C support for CE4100, v3
Subsystems (5)
The I2C core inside CE4100 is very much the same as in PXA25x. I Cc the ARM folks because patch 2 reorganizes some files so that they can be accessed from x86.
The I2C device is behind a PCI bus. The PCI probe code simply creates three platform devices so we don't have much changes to the platform driver. There is no clock framework on x86 and the peripherals don't support changing their clocks or to enable/disable them. So I provided dummy function which keep the driver happy.
History:
v1: Initial post
v2: - ISAR is still touched if not in SLAVE mode except on X86 where it
is not touched at all.
- There are no files created in include/asm
- register defines are in common code
- the PCI controller now requires a device tree. It is used to obtain an id (which is used as device & i2c bus id).
- the PCI part now uses ARRAY_SIZE(). As it turns out pci_select_bars() is not useable.
- the patch which resetted the chip if the i2c bus was not available has been dropped.
v3: - rebased against v2.6.38-rc3, fixed conflicts in ARM tree
- the dependency on SPI is gone.
Sebastian
PATCH 1/6 i2c-pxa2xx: use dynamic register layout
This will prepare the driver to handle register layouts where certain registers are not available at all.
--- drivers/i2c/busses/i2c-pxa.c | 70 ++++++++++++++++++++++++++++++------------ 1 files changed, 50 insertions(+), 20 deletions(-)
drivers/i2c/busses/i2c-pxa.c +50 -20
@@ -38,29 +38,49 @@#include <asm/irq.h> #include <plat/i2c.h> +struct pxa_reg_layout { +u32 ibmr; +u32 idbr; +u32 icr; +u32 isr; +u32 isar; +}; + +enum pxa_i2c_types { +REGS_PXA2XX , +REGS_PXA3XX , +}; +/* -* I2C register offsets will be shifted 0 or 1 bit left, depending on -* different SoCs +* I2C registers definitions */ -#define REG_SHIFT_0 (0 << 0) -#define REG_SHIFT_1 (1 << 0) -#define REG_SHIFT (d) ((d) & 0x1) +static struct pxa_reg_layout pxa_reg_layout[] = { + [REGS_PXA2XX ] = { + .ibmr =0x00 , + .idbr =0x10 , + .icr =0x20 , + .isr =0x30 , + .isar =0x40 , + }, + [REGS_PXA3XX ] = { + .ibmr =0x00 , + .idbr =0x08 , + .icr =0x10 , + .isr =0x18 , + .isar =0x20 , + }, +};static const struct platform_device_id i2c_pxa_id_table[] = { - {"pxa2xx-i2c" ,REG_SHIFT_1 }, - {"pxa3xx-pwri2c" ,REG_SHIFT_0 }, + {"pxa2xx-i2c" ,REGS_PXA2XX }, + {"pxa3xx-pwri2c" ,REGS_PXA3XX }, { }, };MODULE_DEVICE_TABLE (platform, i2c_pxa_id_table);/* -* I2C registers and bit definitions +* I2C bit definitions */ -#define IBMR (0x00) -#define IDBR (0x08) -#define ICR (0x10) -#define ISR (0x18) -#define ISAR (0x20)#define ICR_START (1 << 0)/* start bit */ #define ICR_STOP (1 << 1)/* stop bit */
@@ -111,7 +131,11 @@ struct pxa_i2c {u32 icrlog[32 ];void __iomem *reg_base; -unsigned int reg_shift; +void __iomem *reg_ibmr; +void __iomem *reg_idbr; +void __iomem *reg_icr; +void __iomem *reg_isr; +void __iomem *reg_isar;unsigned long iobase;unsigned long iosize;
@@ -121,11 +145,11 @@ struct pxa_i2c { unsigned int fast_mode :1; }; -#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)) +#define _IBMR (i2c) ((i2c)->reg_ibmr) +#define _IDBR (i2c) ((i2c)->reg_idbr) +#define _ICR (i2c) ((i2c)->reg_icr) +#define _ISR (i2c) ((i2c)->reg_isr) +#define _ISAR (i2c) ((i2c)->reg_isar)/* * I2C Slave mode address
@@ -1001,6 +1025,7 @@ static int i2c_pxa_probe(struct platform_device *dev)struct resource *res;struct i2c_pxa_platform_data *plat = dev->dev.platform_data;const struct platform_device_id *id =platform_get_device_id (dev); +enum pxa_i2c_types i2c_type = id->driver_data;int ret;int irq;
@@ -1044,7 +1069,12 @@ static int i2c_pxa_probe(struct platform_device *dev) ret = -EIO ; goto eremap; } - i2c->reg_shift =REG_SHIFT (id->driver_data); + + i2c->reg_ibmr = i2c->reg_base + pxa_reg_layout[i2c_type].ibmr; + i2c->reg_idbr = i2c->reg_base + pxa_reg_layout[i2c_type].idbr; + i2c->reg_icr = i2c->reg_base + pxa_reg_layout[i2c_type].icr; + i2c->reg_isr = i2c->reg_base + pxa_reg_layout[i2c_type].isr; + i2c->reg_isar = i2c->reg_base + pxa_reg_layout[i2c_type].isar; i2c->iobase = res->start; i2c->iosize =resource_size (res);
Signature · 1 line
1.7.4
PATCH 2/6 ARM: pxa2xx: reorganize I2C files
In reply to Sebastian Andrzej SiewiorThis patch moves the platform data definition from arch/arm/plat-pxa/include/plat/i2c.h to include/linux/i2c/pxa-i2c.h so it can be accessed from x86 the same way as on ARM.
This change should make no functional change to the PXA code. The move is verified by building the following defconfigs:
cm_x2xx_defconfig corgi_defconfig em_x270_defconfig ezx_defconfig imote2_defconfig pxa3xx_defconfig spitz_defconfig zeus_defconfig raumfeld_defconfig magician_defconfig mmp2_defconfig pxa168_defconfig pxa910_defconfig
--- arch/arm/mach-mmp/include/mach/mmp2.h | 2 +- arch/arm/mach-mmp/include/mach/pxa168.h | 2 +- arch/arm/mach-mmp/include/mach/pxa910.h | 2 +- arch/arm/mach-pxa/balloon3.c | 3 +-- arch/arm/mach-pxa/cm-x300.c | 2 +- arch/arm/mach-pxa/colibri-evalboard.c | 3 +-- arch/arm/mach-pxa/colibri-pxa270-income.c | 3 +-- arch/arm/mach-pxa/corgi.c | 2 +- arch/arm/mach-pxa/csb726.c | 2 +- arch/arm/mach-pxa/devices.c | 2 +- arch/arm/mach-pxa/em-x270.c | 2 +- arch/arm/mach-pxa/ezx.c | 2 +- arch/arm/mach-pxa/hx4700.c | 2 +- arch/arm/mach-pxa/littleton.c | 2 +- arch/arm/mach-pxa/magician.c | 2 +- arch/arm/mach-pxa/mainstone.c | 2 +- arch/arm/mach-pxa/mioa701.c | 2 +- arch/arm/mach-pxa/mxm8x10.c | 2 +- arch/arm/mach-pxa/palm27x.c | 3 +-- arch/arm/mach-pxa/pcm990-baseboard.c | 2 +- arch/arm/mach-pxa/poodle.c | 2 +- arch/arm/mach-pxa/pxa27x.c | 3 +-- arch/arm/mach-pxa/pxa3xx.c | 2 +- arch/arm/mach-pxa/pxa95x.c | 2 +- arch/arm/mach-pxa/raumfeld.c | 2 +- arch/arm/mach-pxa/saar.c | 2 +- arch/arm/mach-pxa/saarb.c | 3 +-- arch/arm/mach-pxa/spitz.c | 3 +-- arch/arm/mach-pxa/stargate2.c | 2 +- arch/arm/mach-pxa/tavorevb3.c | 3 +-- arch/arm/mach-pxa/tosa.c | 2 +- arch/arm/mach-pxa/trizeps4.c | 2 +- arch/arm/mach-pxa/viper.c | 2 +- arch/arm/mach-pxa/vpac270.c | 3 +-- arch/arm/mach-pxa/xcep.c | 3 +-- arch/arm/mach-pxa/z2.c | 3 +-- arch/arm/mach-pxa/zeus.c | 3 +-- arch/arm/mach-pxa/zylonite_pxa300.c | 2 +- drivers/i2c/busses/i2c-pxa.c | 2 +- .../plat/i2c.h => include/linux/i2c/pxa-i2c.h | 0 40 files changed, 39 insertions(+), 51 deletions(-) rename arch/arm/plat-pxa/include/plat/i2c.h => include/linux/i2c/pxa-i2c.h (100%)
arch/arm/mach-mmp/include/mach/mmp2.h +1 -1
@@ -11,8 +11,8 @@ extern void __init mmp2_init_irq(void);extern void mmp2_clear_pmic_int (void );#include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <mach/devices.h> -#include <plat/i2c.h> extern struct pxa_device_desc mmp2_device_uart1;extern struct pxa_device_desc mmp2_device_uart2;
arch/arm/mach-mmp/include/mach/pxa168.h +1 -1
@@ -8,8 +8,8 @@ extern void __init pxa168_init_irq(void);extern void pxa168_clear_keypad_wakeup (void );#include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <mach/devices.h> -#include <plat/i2c.h> #include <plat/pxa3xx_nand.h> #include <video/pxa168fb.h> #include <plat/pxa27x_keypad.h>
arch/arm/mach-mmp/include/mach/pxa910.h +1 -1
@@ -7,8 +7,8 @@ extern struct sys_timer pxa910_timer;extern void __init pxa910_init_irq (void );#include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <mach/devices.h> -#include <plat/i2c.h> #include <plat/pxa3xx_nand.h> extern struct pxa_device_desc pxa910_device_uart1;
arch/arm/mach-pxa/balloon3.c +1 -2
@@ -27,6 +27,7 @@#include <linux/mtd/partitions.h> #include <linux/types.h> #include <linux/i2c/pcf857x.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/mtd/nand.h> #include <linux/mtd/physmap.h> #include <linux/regulator/max1586.h>
@@ -51,8 +52,6 @@#include <mach/irda.h> #include <mach/ohci.h> -#include <plat/i2c.h> -#include "generic.h" #include "devices.h"
arch/arm/mach-pxa/cm-x300.c +1 -1
@@ -29,6 +29,7 @@#include <linux/i2c.h> #include <linux/i2c/pca953x.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/mfd/da903x.h> #include <linux/regulator/machine.h>
@@ -48,7 +49,6 @@#include <mach/pxafb.h> #include <mach/mmc.h> #include <mach/ohci.h> -#include <plat/i2c.h> #include <plat/pxa3xx_nand.h> #include <mach/audio.h> #include <mach/pxa3xx-u2d.h>
arch/arm/mach-pxa/colibri-evalboard.c +1 -2
@@ -20,6 +20,7 @@#include <mach/hardware.h> #include <asm/mach/arch.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <mach/pxa27x.h> #include <mach/colibri.h>
@@ -27,8 +28,6 @@#include <mach/ohci.h> #include <mach/pxa27x-udc.h> -#include <plat/i2c.h> -#include "generic.h" #include "devices.h"
arch/arm/mach-pxa/colibri-pxa270-income.c +1 -2
@@ -21,6 +21,7 @@#include <linux/kernel.h> #include <linux/platform_device.h> #include <linux/pwm_backlight.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/sysdev.h> #include <asm/irq.h>
@@ -33,8 +34,6 @@#include <mach/pxa27x-udc.h> #include <mach/pxafb.h> -#include <plat/i2c.h> -#include "devices.h" #include "generic.h"
arch/arm/mach-pxa/corgi.c +1 -1
@@ -24,6 +24,7 @@#include <linux/gpio.h> #include <linux/backlight.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/io.h> #include <linux/spi/spi.h> #include <linux/spi/ads7846.h>
@@ -45,7 +46,6 @@#include <asm/mach/irq.h> #include <mach/pxa25x.h> -#include <plat/i2c.h> #include <mach/irda.h> #include <mach/mmc.h> #include <mach/udc.h>
arch/arm/mach-pxa/csb726.c +1 -1
@@ -17,12 +17,12 @@#include <linux/mtd/partitions.h> #include <linux/sm501.h> #include <linux/smsc911x.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/mach-types.h> #include <asm/mach/arch.h> #include <mach/csb726.h> #include <mach/mfp-pxa27x.h> -#include <plat/i2c.h> #include <mach/mmc.h> #include <mach/ohci.h> #include <mach/pxa2xx-regs.h>
arch/arm/mach-pxa/devices.c +1 -1
@@ -4,6 +4,7 @@#include <linux/platform_device.h> #include <linux/dma-mapping.h> #include <linux/spi/pxa2xx_spi.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/pmu.h> #include <mach/udc.h>
@@ -16,7 +17,6 @@#include <mach/camera.h> #include <mach/audio.h> #include <mach/hardware.h> -#include <plat/i2c.h> #include <plat/pxa3xx_nand.h> #include "devices.h"
arch/arm/mach-pxa/em-x270.c +1 -1
@@ -31,6 +31,7 @@#include <linux/apm-emulation.h> #include <linux/i2c.h> #include <linux/i2c/pca953x.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/regulator/userspace-consumer.h> #include <media/soc_camera.h>
@@ -45,7 +46,6 @@#include <mach/ohci.h> #include <mach/mmc.h> #include <plat/pxa27x_keypad.h> -#include <plat/i2c.h> #include <mach/camera.h> #include "generic.h"
arch/arm/mach-pxa/ezx.c +1 -1
@@ -20,6 +20,7 @@#include <linux/gpio.h> #include <linux/gpio_keys.h> #include <linux/leds-lp3944.h> +#include <linux/i2c/pxa-i2c.h> #include <media/soc_camera.h>
@@ -30,7 +31,6 @@#include <mach/pxa27x.h> #include <mach/pxafb.h> #include <mach/ohci.h> -#include <plat/i2c.h> #include <mach/hardware.h> #include <plat/pxa27x_keypad.h> #include <mach/camera.h>
arch/arm/mach-pxa/hx4700.c +1 -1
@@ -35,6 +35,7 @@#include <linux/spi/spi.h> #include <linux/spi/pxa2xx_spi.h> #include <linux/usb/gpio_vbus.h> +#include <linux/i2c/pxa-i2c.h> #include <mach/hardware.h> #include <asm/mach-types.h>
@@ -42,7 +43,6 @@#include <mach/pxa27x.h> #include <mach/hx4700.h> -#include <plat/i2c.h> #include <mach/irda.h> #include <video/platform_lcd.h>
arch/arm/mach-pxa/littleton.c +1 -1
@@ -28,6 +28,7 @@#include <linux/leds.h> #include <linux/mfd/da903x.h> #include <linux/i2c/max732x.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/types.h> #include <asm/setup.h>
@@ -45,7 +46,6 @@#include <mach/mmc.h> #include <plat/pxa27x_keypad.h> #include <mach/littleton.h> -#include <plat/i2c.h> #include <plat/pxa3xx_nand.h> #include "generic.h"
arch/arm/mach-pxa/magician.c +1 -1
@@ -28,6 +28,7 @@#include <linux/regulator/bq24022.h> #include <linux/regulator/machine.h> #include <linux/usb/gpio_vbus.h> +#include <linux/i2c/pxa-i2c.h> #include <mach/hardware.h> #include <asm/mach-types.h>
@@ -36,7 +37,6 @@#include <mach/pxa27x.h> #include <mach/magician.h> #include <mach/pxafb.h> -#include <plat/i2c.h> #include <mach/mmc.h> #include <mach/irda.h> #include <mach/ohci.h>
arch/arm/mach-pxa/mainstone.c +1 -1
@@ -27,6 +27,7 @@#include <linux/gpio_keys.h> #include <linux/pwm_backlight.h> #include <linux/smc91x.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/types.h> #include <asm/setup.h>
@@ -46,7 +47,6 @@#include <mach/mainstone.h> #include <mach/audio.h> #include <mach/pxafb.h> -#include <plat/i2c.h> #include <mach/mmc.h> #include <mach/irda.h> #include <mach/ohci.h>
arch/arm/mach-pxa/mioa701.c +1 -1
@@ -39,6 +39,7 @@#include <linux/usb/gpio_vbus.h> #include <linux/regulator/max1586.h> #include <linux/slab.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/mach-types.h> #include <asm/mach/arch.h>
@@ -50,7 +51,6 @@#include <mach/mmc.h> #include <mach/udc.h> #include <mach/pxa27x-udc.h> -#include <plat/i2c.h> #include <mach/camera.h> #include <mach/audio.h> #include <media/soc_camera.h>
arch/arm/mach-pxa/mxm8x10.c +1 -1
@@ -22,8 +22,8 @@#include <linux/serial_8250.h> #include <linux/dm9000.h> #include <linux/gpio.h> +#include <linux/i2c/pxa-i2c.h> -#include <plat/i2c.h> #include <plat/pxa3xx_nand.h> #include <mach/pxafb.h>
arch/arm/mach-pxa/palm27x.c +1 -2
@@ -22,6 +22,7 @@#include <linux/power_supply.h> #include <linux/usb/gpio_vbus.h> #include <linux/regulator/max1586.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/mach-types.h> #include <asm/mach/arch.h>
@@ -36,8 +37,6 @@#include <mach/palmasoc.h> #include <mach/palm27x.h> -#include <plat/i2c.h> -#include "generic.h" #include "devices.h"
arch/arm/mach-pxa/pcm990-baseboard.c +1 -1
@@ -23,12 +23,12 @@#include <linux/irq.h> #include <linux/platform_device.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/pwm_backlight.h> #include <media/soc_camera.h> #include <asm/gpio.h> -#include <plat/i2c.h> #include <mach/camera.h> #include <asm/mach/map.h> #include <mach/pxa27x.h>
arch/arm/mach-pxa/poodle.c +1 -1
@@ -23,6 +23,7 @@#include <linux/mtd/physmap.h> #include <linux/gpio.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/spi/spi.h> #include <linux/spi/ads7846.h> #include <linux/spi/pxa2xx_spi.h>
@@ -44,7 +45,6 @@#include <mach/irda.h> #include <mach/poodle.h> #include <mach/pxafb.h> -#include <plat/i2c.h> #include <asm/hardware/scoop.h> #include <asm/hardware/locomo.h>
arch/arm/mach-pxa/pxa27x.c +1 -2
@@ -19,6 +19,7 @@#include <linux/sysdev.h> #include <linux/io.h> #include <linux/irq.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/mach/map.h> #include <mach/hardware.h>
@@ -32,8 +33,6 @@#include <mach/dma.h> #include <mach/smemc.h> -#include <plat/i2c.h> -#include "generic.h" #include "devices.h" #include "clock.h"
arch/arm/mach-pxa/pxa3xx.c +1 -1
@@ -21,6 +21,7 @@#include <linux/irq.h> #include <linux/io.h> #include <linux/sysdev.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/mach/map.h> #include <mach/hardware.h>
@@ -32,7 +33,6 @@#include <mach/dma.h> #include <mach/regs-intc.h> #include <mach/smemc.h> -#include <plat/i2c.h> #include "generic.h" #include "devices.h"
arch/arm/mach-pxa/pxa95x.c +1 -1
@@ -15,6 +15,7 @@#include <linux/init.h> #include <linux/pm.h> #include <linux/platform_device.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/irq.h> #include <linux/io.h> #include <linux/sysdev.h>
@@ -27,7 +28,6 @@#include <mach/pm.h> #include <mach/dma.h> #include <mach/regs-intc.h> -#include <plat/i2c.h> #include "generic.h" #include "devices.h"
arch/arm/mach-pxa/raumfeld.c +1 -1
@@ -32,6 +32,7 @@#include <linux/sched.h> #include <linux/pwm_backlight.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/spi/spi.h> #include <linux/spi/spi_gpio.h> #include <linux/lis3lv02d.h>
@@ -53,7 +54,6 @@#include <mach/ohci.h> #include <mach/pxafb.h> #include <mach/mmc.h> -#include <plat/i2c.h> #include <plat/pxa3xx_nand.h> #include "generic.h"
arch/arm/mach-pxa/saar.c +1 -1
@@ -20,6 +20,7 @@#include <linux/delay.h> #include <linux/fb.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/smc91x.h> #include <linux/mfd/da903x.h> #include <linux/mtd/mtd.h>
@@ -31,7 +32,6 @@#include <asm/mach/flash.h> #include <mach/pxa930.h> -#include <plat/i2c.h> #include <mach/pxafb.h> #include "devices.h"
arch/arm/mach-pxa/saarb.c +1 -2
@@ -13,6 +13,7 @@#include <linux/init.h> #include <linux/kernel.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/mfd/88pm860x.h> #include <asm/mach-types.h>
@@ -24,8 +25,6 @@#include <mach/mfp-pxa930.h> #include <mach/gpio.h> -#include <plat/i2c.h> -#include "generic.h" #define SAARB_NR_IRQS (IRQ_BOARD_START + 40)
arch/arm/mach-pxa/spitz.c +1 -2
@@ -19,6 +19,7 @@#include <linux/gpio.h> #include <linux/leds.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/i2c/pca953x.h> #include <linux/spi/spi.h> #include <linux/spi/ads7846.h>
@@ -47,8 +48,6 @@#include <mach/sharpsl_pm.h> #include <mach/smemc.h> -#include <plat/i2c.h> -#include "generic.h" #include "devices.h"
arch/arm/mach-pxa/stargate2.c +1 -1
@@ -25,6 +25,7 @@#include <linux/mtd/plat-ram.h> #include <linux/mtd/partitions.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/i2c/pcf857x.h> #include <linux/i2c/at24.h> #include <linux/smc91x.h>
@@ -43,7 +44,6 @@#include <asm/mach/flash.h> #include <mach/pxa27x.h> -#include <plat/i2c.h> #include <mach/mmc.h> #include <mach/udc.h> #include <mach/pxa27x-udc.h>
arch/arm/mach-pxa/tavorevb3.c +1 -2
@@ -15,6 +15,7 @@#include <linux/platform_device.h> #include <linux/interrupt.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/gpio.h> #include <linux/mfd/88pm860x.h>
@@ -23,8 +24,6 @@#include <mach/pxa930.h> -#include <plat/i2c.h> -#include "devices.h" #include "generic.h"
arch/arm/mach-pxa/tosa.c +1 -1
@@ -34,6 +34,7 @@#include <linux/spi/spi.h> #include <linux/spi/pxa2xx_spi.h> #include <linux/input/matrix_keypad.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/setup.h> #include <asm/mach-types.h>
@@ -41,7 +42,6 @@#include <mach/pxa25x.h> #include <mach/reset.h> #include <mach/irda.h> -#include <plat/i2c.h> #include <mach/mmc.h> #include <mach/udc.h> #include <mach/tosa_bt.h>
arch/arm/mach-pxa/trizeps4.c +1 -1
@@ -26,6 +26,7 @@#include <linux/dm9000.h> #include <linux/mtd/physmap.h> #include <linux/mtd/partitions.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/types.h> #include <asm/setup.h>
@@ -47,7 +48,6 @@#include <mach/irda.h> #include <mach/ohci.h> #include <mach/smemc.h> -#include <plat/i2c.h> #include "generic.h" #include "devices.h"
arch/arm/mach-pxa/viper.c +1 -1
@@ -36,6 +36,7 @@#include <linux/gpio.h> #include <linux/jiffies.h> #include <linux/i2c-gpio.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/serial_8250.h> #include <linux/smc91x.h> #include <linux/pwm_backlight.h>
@@ -47,7 +48,6 @@#include <mach/pxa25x.h> #include <mach/audio.h> #include <mach/pxafb.h> -#include <plat/i2c.h> #include <mach/regs-uart.h> #include <mach/arcom-pcmcia.h> #include <mach/viper.h>
arch/arm/mach-pxa/vpac270.c +1 -2
@@ -26,6 +26,7 @@#include <linux/ucb1400.h> #include <linux/ata_platform.h> #include <linux/regulator/max1586.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/mach-types.h> #include <asm/mach/arch.h>
@@ -40,8 +41,6 @@#include <mach/udc.h> #include <mach/pata_pxa.h> -#include <plat/i2c.h> -#include "generic.h" #include "devices.h"
arch/arm/mach-pxa/xcep.c +1 -2
@@ -16,6 +16,7 @@#include <linux/platform_device.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/smc91x.h> #include <linux/mtd/mtd.h> #include <linux/mtd/partitions.h>
@@ -26,8 +27,6 @@#include <asm/mach/irq.h> #include <asm/mach/map.h> -#include <plat/i2c.h> -#include <mach/hardware.h> #include <mach/pxa2xx-regs.h> #include <mach/mfp-pxa25x.h>
arch/arm/mach-pxa/z2.c +1 -2
@@ -29,6 +29,7 @@#include <linux/gpio_keys.h> #include <linux/delay.h> #include <linux/regulator/machine.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/mach-types.h> #include <asm/mach/arch.h>
@@ -40,8 +41,6 @@#include <mach/mmc.h> #include <plat/pxa27x_keypad.h> -#include <plat/i2c.h> -#include "generic.h" #include "devices.h"
arch/arm/mach-pxa/zeus.c +1 -2
@@ -25,6 +25,7 @@#include <linux/mtd/partitions.h> #include <linux/mtd/physmap.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/i2c/pca953x.h> #include <linux/apm-emulation.h> #include <linux/can/platform/mcp251x.h>
@@ -33,8 +34,6 @@#include <asm/mach/arch.h> #include <asm/mach/map.h> -#include <plat/i2c.h> -#include <mach/pxa2xx-regs.h> #include <mach/regs-uart.h> #include <mach/ohci.h>
arch/arm/mach-pxa/zylonite_pxa300.c +1 -1
@@ -17,11 +17,11 @@#include <linux/kernel.h> #include <linux/init.h> #include <linux/i2c.h> +#include <linux/i2c/pxa-i2c.h> #include <linux/i2c/pca953x.h> #include <linux/gpio.h> #include <mach/pxa300.h> -#include <plat/i2c.h> #include <mach/zylonite.h> #include "generic.h"
drivers/i2c/busses/i2c-pxa.c +1 -1
@@ -34,9 +34,9 @@#include <linux/clk.h> #include <linux/slab.h> #include <linux/io.h> +#include <linux/i2c/pxa-i2c.h> #include <asm/irq.h> -#include <plat/i2c.h> struct pxa_reg_layout {u32 ibmr;
include/linux/i2c/pxa-i2c.h renamed from arch/arm/plat-pxa/include/plat/i2c.h +0 -0
Signature · 1 line
1.7.4
PATCH 2/6 ARM: pxa2xx: reorganize I2C files
Quoted 11 lines · Sebastian Andrzej Siewior
This patch moves the platform data definition from
arch/arm/plat-pxa/include/plat/i2c.htoinclude/linux/i2c/pxa-i2c.hso it can be accessed from x86 the same way as on ARM.This change should make no functional change to the PXA code. The move is verified by building the following defconfigs:
cm_x2xx_defconfigcorgi_defconfigem_x270_defconfigezx_defconfigimote2_defconfigpxa3xx_defconfigspitz_defconfigzeus_defconfigraumfeld_defconfigmagician_defconfigmmp2_defconfigpxa168_defconfigpxa910_defconfig
Russell/others, you OK with this going through my tree?
PATCH 2/6 ARM: pxa2xx: reorganize I2C files
Quoted 14 lines · Ben Dooks
Quoted 5 lines · Sebastian Andrzej Siewior
This patch moves the platform data definition from
arch/arm/plat-pxa/include/plat/i2c.htoinclude/linux/i2c/pxa-i2c.hso it can be accessed from x86 the same way as on ARM.Quoted 7 lines
This change should make no functional change to the PXA code. The move is verified by building the following defconfigs:
?cm_x2xx_defconfigcorgi_defconfigem_x270_defconfigezx_defconfig?imote2_defconfigpxa3xx_defconfigspitz_defconfigzeus_defconfig?raumfeld_defconfigmagician_defconfigmmp2_defconfigpxa168_defconfig?pxa910_defconfig
Quoted 2 lines
Russell/others, you OK with this going through my tree?
Ben, I'm fine that you take this change. Trivial changes to me, so I expect no significant merge conflicts.
PATCH 3/6 i2c-pxa2xx: Add PCI support for PXA I2C controller
In reply to Sebastian Andrzej SiewiorThe Sodaville I2C controller is almost the same as found on PXA2xx. The difference:
- the register are at a different offset
- no slave support
The PCI probe code adds three platform devices which are probed then by the platform code.
The X86 part also adds dummy clock defines because we don't have HW clock support.
--- drivers/i2c/busses/Kconfig | 7 +- drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-pxa-pci.c | 176 ++++++++++++++++++++++++++++++++++++++ drivers/i2c/busses/i2c-pxa.c | 27 +++++- 4 files changed, 206 insertions(+), 5 deletions(-) create mode 100644 drivers/i2c/busses/i2c-pxa-pci.c
drivers/i2c/busses/Kconfig +5 -2
@@ -525,15 +525,18 @@ config I2C_PNX config I2C_PXA tristate "Intel PXA2XX I2C adapter" - depends on ARCH_PXA || ARCH_MMP + depends on ARCH_PXA || ARCH_MMP || (X86_32 && PCI && OF) help If you have devices in the PXA I2C bus, say yes to this option. This driver can also be built as a module. If so, the module will be called i2c-pxa. +config I2C_PXA_PCI + def_bool I2C_PXA && X86_32 && PCI && OF + config I2C_PXA_SLAVE bool "Intel PXA2XX I2C Slave comms support" - depends on I2C_PXA + depends on I2C_PXA && !X86_32 help Support I2C slave mode communications on the PXA I2C bus. This is necessary for systems where the PXA may be a target on the
drivers/i2c/busses/Makefile +1 -0
@@ -52,6 +52,7 @@ obj-$(CONFIG_I2C_PCA_PLATFORM) += i2c-pca-platform.o obj-$(CONFIG_I2C_PMCMSP) += i2c-pmcmsp.o obj-$(CONFIG_I2C_PNX) += i2c-pnx.o obj-$(CONFIG_I2C_PXA) += i2c-pxa.o +obj-$(CONFIG_I2C_PXA_PCI) += i2c-pxa-pci.o obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o obj-$(CONFIG_I2C_S6000) += i2c-s6000.o obj-$(CONFIG_I2C_SH7760) += i2c-sh7760.o
drivers/i2c/busses/i2c-pxa-pci.c new file +176 -0
176 lines not on this page · raw message
drivers/i2c/busses/i2c-pxa.c +24 -3
@@ -38,6 +38,13 @@#include <asm/irq.h> +#ifdef CONFIG_X86 +#define clk_get (dev, id) NULL +#define clk_put (clk) do { } while (0) +#define clk_disable (clk) do { } while (0) +#define clk_enable (clk) do { } while (0) +#endif +struct pxa_reg_layout {u32 ibmr;u32 idbr;
@@ -49,6 +56,7 @@ struct pxa_reg_layout {enum pxa_i2c_types {REGS_PXA2XX ,REGS_PXA3XX , +REGS_CE4100 , };/*
@@ -69,11 +77,19 @@ static struct pxa_reg_layout pxa_reg_layout[] = { .isr = 0x18, .isar = 0x20, }, + [REGS_CE4100] = { + .ibmr = 0x14, + .idbr = 0x0c, + .icr = 0x00, + .isr = 0x04, + /* no isar register */ + }, };static const struct platform_device_id i2c_pxa_id_table[] = { {"pxa2xx-i2c" ,REGS_PXA2XX }, {"pxa3xx-pwri2c" ,REGS_PXA3XX }, + {"ce4100-i2c" ,REGS_CE4100 }, { }, };MODULE_DEVICE_TABLE (platform, i2c_pxa_id_table);
@@ -442,7 +458,8 @@ static void i2c_pxa_reset(struct pxa_i2c *i2c)writel (I2C_ISR_INIT ,_ISR (i2c));writel (readl (_ICR (i2c)) & ~ICR_UR ,_ICR (i2c)); -writel (i2c->slave_addr,_ISAR (i2c)); +if (i2c->reg_isar) +writel (i2c->slave_addr,_ISAR (i2c));/* set control register values */ writel (I2C_ICR_INIT | (i2c->fast_mode ?ICR_FM :0 ),_ICR (i2c));
@@ -1074,7 +1091,8 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c->reg_idbr = i2c->reg_base + pxa_reg_layout[i2c_type].idbr; i2c->reg_icr = i2c->reg_base + pxa_reg_layout[i2c_type].icr; i2c->reg_isr = i2c->reg_base + pxa_reg_layout[i2c_type].isr; - i2c->reg_isar = i2c->reg_base + pxa_reg_layout[i2c_type].isar; +if (i2c_type !=REGS_CE4100 ) + i2c->reg_isar = i2c->reg_base + pxa_reg_layout[i2c_type].isar; i2c->iobase = res->start; i2c->iosize =resource_size (res);
@@ -1113,7 +1131,10 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c->adap.algo_data = i2c; i2c->adap.dev.parent = &dev->dev; - ret =i2c_add_numbered_adapter (&i2c->adap); +if (i2c_type ==REGS_CE4100 ) + ret =i2c_add_adapter (&i2c->adap); +else + ret =i2c_add_numbered_adapter (&i2c->adap);if (ret <0 ) {printk (KERN_INFO "I2C: Failed to add bus\n" ); goto eadapt;
Signature · 1 line
1.7.4
PATCH 3/6 i2c-pxa2xx: Add PCI support for PXA I2C controller
Quoted 244 lines · Sebastian Andrzej Siewior
The Sodaville I2C controller is almost the same as found on PXA2xx. The difference:
- the register are at a different offset
- no slave supportThe PCI probe code adds three platform devices which are probed then by the platform code.
The X86 part also adds dummy clock defines because we don't have HW clock support.Signed-off-by Sebastian Andrzej Siewior<[email protected]>Signed-off-by Dirk Brandewie<[email protected]>--- drivers/i2c/busses/Kconfig | 7 +- drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-pxa-pci.c | 176 ++++++++++++++++++++++++++++++++++++++ drivers/i2c/busses/i2c-pxa.c | 27 +++++- 4 files changed, 206 insertions(+), 5 deletions(-)create mode 100644
drivers/i2c/busses/i2c-pxa-pci.cdrivers/i2c/busses/Kconfig +5
-2@@ -525,15 +525,18 @@ config I2C_PNX config I2C_PXA tristate "Intel PXA2XX I2C adapter" - depends on ARCH_PXA || ARCH_MMP + depends on ARCH_PXA || ARCH_MMP || (X86_32&& PCI&& OF) help If you have devices in the PXA I2C bus, say yes to this option. This driver can also be built as a module. If so, the module will be called i2c-pxa. +config I2C_PXA_PCI + def_bool I2C_PXA&& X86_32&& PCI&& OF + config I2C_PXA_SLAVE bool "Intel PXA2XX I2C Slave comms support" - depends on I2C_PXA + depends on I2C_PXA&& !X86_32 help Support I2C slave mode communications on the PXA I2C bus. This is necessary for systems where the PXA may be a target on thedrivers/i2c/busses/Makefile +1
-0@@ -52,6 +52,7 @@ obj-$(CONFIG_I2C_PCA_PLATFORM) += i2c-pca-platform.o obj-$(CONFIG_I2C_PMCMSP) += i2c-pmcmsp.o obj-$(CONFIG_I2C_PNX) += i2c-pnx.o obj-$(CONFIG_I2C_PXA) += i2c-pxa.o +obj-$(CONFIG_I2C_PXA_PCI) += i2c-pxa-pci.o obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o obj-$(CONFIG_I2C_S6000) += i2c-s6000.o obj-$(CONFIG_I2C_SH7760) += i2c-sh7760.odrivers/i2c/busses/i2c-pxa-pci.c new file +176
-0@@ -0,0 +1,176 @@ +/* +* The CE4100's I2C device is more or less the same one as found on PXA. +* It does not support slave mode, the register slightly moved. This PCI +* device provides three bars, every contains a single I2C controller. +*/ +#include <linux/pci.h> +#include <linux/platform_device.h> +#include <linux/i2c/pxa-i2c.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/of_address.h> + +#define CE4100_PCI_I2C_DEVS 3 + +struct ce4100_devices { +struct platform_device *pdev[CE4100_PCI_I2C_DEVS ]; +}; + +static struct platform_device *add_i2c_device (struct pci_dev *dev,int bar) +{ +struct platform_device *pdev; +struct i2c_pxa_platform_data pdata; +struct resource res[2 ]; +struct device_node *child; +static int devnum; +int ret; + +memset (&pdata,0 ,sizeof (struct i2c_pxa_platform_data )); +memset (&res,0 ,sizeof (res)); + + res[0 ].flags =IORESOURCE_MEM ; + res[0 ].start =pci_resource_start (dev, bar); + res[0 ].end =pci_resource_end (dev, bar); + + res[1 ].flags =IORESOURCE_IRQ ; + res[1 ].start = dev->irq; + res[1 ].end = dev->irq; + +for_each_child_of_node (dev->dev.of_node, child) { +const void *prop; +struct resource r; +int ret; + + ret =of_address_to_resource (child,0 ,&r); +if (ret<0 ) +continue ; +if (r.start != res[0 ].start) +continue ; +if (r.end != res[0 ].end) +continue ; +if (r.flags != res[0 ].flags) +continue ; + + prop =of_get_property (child,"fast-mode" ,NULL ); +if (prop) + pdata.fast_mode =1 ; + +break ; + } + +if (!child) { +dev_err (&dev->dev,"failed to match a DT node for bar %d.\n" , + bar); + ret = -EINVAL ; + goto out; + } + + pdev =platform_device_alloc ("ce4100-i2c" , devnum); +if (!pdev) { +of_node_put (child); + ret = -ENOMEM ; + goto out; + } + pdev->dev.parent =&dev->dev; + pdev->dev.of_node = child; + + ret =platform_device_add_resources (pdev, res,ARRAY_SIZE (res)); +if (ret) + goto err; + + ret =platform_device_add_data (pdev,&pdata,sizeof (pdata)); +if (ret) + goto err; + + ret =platform_device_add (pdev); +if (ret) + goto err; + devnum++; +return pdev; +err: +platform_device_put (pdev); +out: +return ERR_PTR (ret); +} + +static int __devinit ce4100_i2c_probe (struct pci_dev *dev, +const struct pci_device_id *ent) +{ +int ret; +int i; +struct ce4100_devices *sds; + + ret =pci_enable_device_mem (dev); +if (ret) +return ret; + +if (!dev->dev.of_node) { +dev_err (&dev->dev,"Missing device tree node.\n" ); +return -EINVAL ; + } + sds =kzalloc (sizeof (*sds),GFP_KERNEL ); +if (!sds) + goto err_mem; + +for (i =0 ; i<ARRAY_SIZE (sds->pdev); i++) { + sds->pdev[i] =add_i2c_device (dev, i); +if (IS_ERR (sds->pdev[i])) { +while (--i>=0 ) +platform_device_unregister (sds->pdev[i]); + goto err_dev_add; + } + } +pci_set_drvdata (dev, sds); +return 0 ; + +err_dev_add: +pci_set_drvdata (dev,NULL ); +kfree (sds); +err_mem: +pci_disable_device (dev); +return ret; +} + +static void __devexit ce4100_i2c_remove(struct pci_dev *dev) +{ +struct ce4100_devices *sds; +unsigned int i; + + sds =pci_get_drvdata (dev); +pci_set_drvdata (dev,NULL ); + +for (i =0 ; i<ARRAY_SIZE (sds->pdev); i++) +platform_device_unregister (sds->pdev[i]); + +pci_disable_device (dev); +kfree (sds); +} + +static struct pci_device_id ce4100_i2c_devices[]__devinitdata = { + {PCI_DEVICE (PCI_VENDOR_ID_INTEL ,0x2e68 )}, + { }, +}; +MODULE_DEVICE_TABLE (pci, ce4100_i2c_devices); + +static struct pci_driver ce4100_i2c_driver = { + .name ="ce4100_i2c" , + .id_table = ce4100_i2c_devices, + .probe = ce4100_i2c_probe, + .remove =__devexit_p (ce4100_i2c_remove), +}; + +static int __init ce4100_i2c_init (void ) +{ +return pci_register_driver (&ce4100_i2c_driver); +} +module_init (ce4100_i2c_init); + +static void __exit ce4100_i2c_exit(void) +{ +pci_unregister_driver (&ce4100_i2c_driver); +} +module_exit (ce4100_i2c_exit); + +MODULE_DESCRIPTION ("CE4100 PCI-I2C glue code for PXA's driver" ); +MODULE_LICENSE ("GPL v2" ); +MODULE_AUTHOR ("Sebastian Andrzej Siewior<[email protected]>" );drivers/i2c/busses/i2c-pxa.c +0
-0
drivers/i2c/busses/i2c-pxa.c line 47
Quoted 10 lines
drivers/i2c/busses/i2c-pxa.c +7
-0@@ -38,6 +38,13 @@#include <asm/irq.h> +#ifdef CONFIG_X86 +#define clk_get (dev, id) NULL +#define clk_put (clk) do { } while (0) +#define clk_disable (clk) do { } while (0) +#define clk_enable (clk) do { } while (0) +#endif +
Maybe be better on !CONFIG_HAVE_CLOCK (or whatever it is called)
Quoted 63 lines
drivers/i2c/busses/i2c-pxa.c +17
-3struct pxa_reg_layout {u32 ibmr;u32 idbr;@@ -49,6 +56,7 @@ struct pxa_reg_layout {enum pxa_i2c_types {REGS_PXA2XX ,REGS_PXA3XX , +REGS_CE4100 , };/* @@ -69,11 +77,19 @@ static struct pxa_reg_layout pxa_reg_layout[] = { .isr = 0x18, .isar = 0x20, }, + [REGS_CE4100] = { + .ibmr = 0x14, + .idbr = 0x0c, + .icr = 0x00, + .isr = 0x04, + /* no isar register */ + }, };static const struct platform_device_id i2c_pxa_id_table[] = { {"pxa2xx-i2c" ,REGS_PXA2XX }, {"pxa3xx-pwri2c" ,REGS_PXA3XX }, + {"ce4100-i2c" ,REGS_CE4100 }, { }, };MODULE_DEVICE_TABLE (platform, i2c_pxa_id_table);@@ -442,7 +458,8 @@ static void i2c_pxa_reset(struct pxa_i2c *i2c)writel (I2C_ISR_INIT ,_ISR (i2c));writel (readl (_ICR (i2c))& ~ICR_UR ,_ICR (i2c)); -writel (i2c->slave_addr,_ISAR (i2c)); +if (i2c->reg_isar) +writel (i2c->slave_addr,_ISAR (i2c));/* set control register values */ writel (I2C_ICR_INIT | (i2c->fast_mode ?ICR_FM :0 ),_ICR (i2c));@@ -1074,7 +1091,8 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c->reg_idbr = i2c->reg_base + pxa_reg_layout[i2c_type].idbr; i2c->reg_icr = i2c->reg_base + pxa_reg_layout[i2c_type].icr; i2c->reg_isr = i2c->reg_base + pxa_reg_layout[i2c_type].isr; - i2c->reg_isar = i2c->reg_base + pxa_reg_layout[i2c_type].isar; +if (i2c_type !=REGS_CE4100 ) + i2c->reg_isar = i2c->reg_base + pxa_reg_layout[i2c_type].isar; i2c->iobase = res->start; i2c->iosize =resource_size (res);@@ -1113,7 +1131,10 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c->adap.algo_data = i2c; i2c->adap.dev.parent =&dev->dev; - ret =i2c_add_numbered_adapter (&i2c->adap); +if (i2c_type ==REGS_CE4100 ) + ret =i2c_add_adapter (&i2c->adap); +else + ret =i2c_add_numbered_adapter (&i2c->adap);if (ret<0 ) {printk (KERN_INFO "I2C: Failed to add bus\n" ); goto eadapt;
PATCH v2 1/1 i2c-pxa2xx: Add PCI support for PXA I2C controller
The Sodaville I2C controller is almost the same as found on PXA2xx. The difference:
- the register are at a different offset
- no slave support
The PCI probe code adds three platform devices which are probed then by the platform code.
The X86 part also adds dummy clock defines because we don't have HW clock support.
---
Quoted 8 lines · * Ben Dooks | 2011-03-02 00:51:12 [+0000]:
Quoted 8 lines
drivers/i2c/busses/i2c-pxa.c +0
-0@@ -38,6 +38,13 @@#include <asm/irq.h>
Quoted 9 lines
drivers/i2c/busses/i2c-pxa.c line 47
Quoted 7 lines
drivers/i2c/busses/i2c-pxa.c +7
-0+#ifdef CONFIG_X86 +#define clk_get (dev, id) NULL +#define clk_put (clk) do { } while (0) +#define clk_disable (clk) do { } while (0) +#define clk_enable (clk) do { } while (0) +#endif +Maybe be better on !CONFIG_HAVE_CLOCK (or whatever it is called)
Switched to #ifndef CONFIG_HAVE_CLK
drivers/i2c/busses/Kconfig | 7 +- drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-pxa-pci.c | 176 ++++++++++++++++++++++++++++++++++++++ drivers/i2c/busses/i2c-pxa.c | 27 +++++- 4 files changed, 206 insertions(+), 5 deletions(-) create mode 100644 drivers/i2c/busses/i2c-pxa-pci.c
drivers/i2c/busses/Kconfig +5 -2
@@ -525,15 +525,18 @@ config I2C_PNX config I2C_PXA tristate "Intel PXA2XX I2C adapter" - depends on ARCH_PXA || ARCH_MMP + depends on ARCH_PXA || ARCH_MMP || (X86_32 && PCI && OF) help If you have devices in the PXA I2C bus, say yes to this option. This driver can also be built as a module. If so, the module will be called i2c-pxa. +config I2C_PXA_PCI + def_bool I2C_PXA && X86_32 && PCI && OF + config I2C_PXA_SLAVE bool "Intel PXA2XX I2C Slave comms support" - depends on I2C_PXA + depends on I2C_PXA && !X86_32 help Support I2C slave mode communications on the PXA I2C bus. This is necessary for systems where the PXA may be a target on the
drivers/i2c/busses/Makefile +1 -0
@@ -52,6 +52,7 @@ obj-$(CONFIG_I2C_PCA_PLATFORM) += i2c-pca-platform.o obj-$(CONFIG_I2C_PMCMSP) += i2c-pmcmsp.o obj-$(CONFIG_I2C_PNX) += i2c-pnx.o obj-$(CONFIG_I2C_PXA) += i2c-pxa.o +obj-$(CONFIG_I2C_PXA_PCI) += i2c-pxa-pci.o obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o obj-$(CONFIG_I2C_S6000) += i2c-s6000.o obj-$(CONFIG_I2C_SH7760) += i2c-sh7760.o
drivers/i2c/busses/i2c-pxa-pci.c new file +176 -0
176 lines not on this page · raw message
drivers/i2c/busses/i2c-pxa.c +24 -3
@@ -38,6 +38,13 @@#include <asm/irq.h> +#ifndef CONFIG_HAVE_CLK +#define clk_get (dev, id) NULL +#define clk_put (clk) do { } while (0) +#define clk_disable (clk) do { } while (0) +#define clk_enable (clk) do { } while (0) +#endif +struct pxa_reg_layout {u32 ibmr;u32 idbr;
@@ -49,6 +56,7 @@ struct pxa_reg_layout {enum pxa_i2c_types {REGS_PXA2XX ,REGS_PXA3XX , +REGS_CE4100 , };/*
@@ -69,11 +77,19 @@ static struct pxa_reg_layout pxa_reg_layout[] = { .isr = 0x18, .isar = 0x20, }, + [REGS_CE4100] = { + .ibmr = 0x14, + .idbr = 0x0c, + .icr = 0x00, + .isr = 0x04, + /* no isar register */ + }, };static const struct platform_device_id i2c_pxa_id_table[] = { {"pxa2xx-i2c" ,REGS_PXA2XX }, {"pxa3xx-pwri2c" ,REGS_PXA3XX }, + {"ce4100-i2c" ,REGS_CE4100 }, { }, };MODULE_DEVICE_TABLE (platform, i2c_pxa_id_table);
@@ -442,7 +458,8 @@ static void i2c_pxa_reset(struct pxa_i2c *i2c)writel (I2C_ISR_INIT ,_ISR (i2c));writel (readl (_ICR (i2c)) & ~ICR_UR ,_ICR (i2c)); -writel (i2c->slave_addr,_ISAR (i2c)); +if (i2c->reg_isar) +writel (i2c->slave_addr,_ISAR (i2c));/* set control register values */ writel (I2C_ICR_INIT | (i2c->fast_mode ?ICR_FM :0 ),_ICR (i2c));
@@ -1074,7 +1091,8 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c->reg_idbr = i2c->reg_base + pxa_reg_layout[i2c_type].idbr; i2c->reg_icr = i2c->reg_base + pxa_reg_layout[i2c_type].icr; i2c->reg_isr = i2c->reg_base + pxa_reg_layout[i2c_type].isr; - i2c->reg_isar = i2c->reg_base + pxa_reg_layout[i2c_type].isar; +if (i2c_type !=REGS_CE4100 ) + i2c->reg_isar = i2c->reg_base + pxa_reg_layout[i2c_type].isar; i2c->iobase = res->start; i2c->iosize =resource_size (res);
@@ -1113,7 +1131,10 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c->adap.algo_data = i2c; i2c->adap.dev.parent = &dev->dev; - ret =i2c_add_numbered_adapter (&i2c->adap); +if (i2c_type ==REGS_CE4100 ) + ret =i2c_add_adapter (&i2c->adap); +else + ret =i2c_add_numbered_adapter (&i2c->adap);if (ret <0 ) {printk (KERN_INFO "I2C: Failed to add bus\n" ); goto eadapt;
Signature · 4 lines
1.7.4 Sebastian
PATCH 4/6 i2c-pxa2xx: add support for shared IRQ handler
In reply to Sebastian Andrzej SiewiorSodaville has three of them on a single IRQ. IRQF_DISABLED is removed because it is a NOP allready and scheduled for removal.
--- drivers/i2c/busses/i2c-pxa.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-pxa.c +8 -2
@@ -956,11 +956,17 @@ static void i2c_pxa_irq_rxfull(struct pxa_i2c *i2c, u32 isr)writel (icr,_ICR (i2c)); } +#define VALID_INT_SOURCE (ISR_SSD | ISR_ALD | ISR_ITE | ISR_IRF | \ + ISR_SAD | ISR_BED)static irqreturn_t i2c_pxa_handler (int this_irq,void *dev_id) {struct pxa_i2c *i2c = dev_id;u32 isr =readl (_ISR (i2c)); + isr &=VALID_INT_SOURCE ; +if (!isr) +return IRQ_NONE ; +if (i2c_debug >2 &&0 ) {dev_dbg (&i2c->adap.dev,"%s: ISR=%08x, ICR=%08x, IBMR=%02x\n" , __func__, isr,readl (_ICR (i2c)),readl (_IBMR (i2c)));
@@ -975,7 +981,7 @@ static irqreturn_t i2c_pxa_handler(int this_irq, void *dev_id)/* * Always clear all pending IRQs. */ -writel (isr & (ISR_SSD |ISR_ALD |ISR_ITE |ISR_IRF |ISR_SAD |ISR_BED ),_ISR (i2c)); +writel (isr,_ISR (i2c));if (isr &ISR_SAD )i2c_pxa_slave_start (i2c, isr);
@@ -1120,7 +1126,7 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c->adap.algo = &i2c_pxa_pio_algorithm; }else { i2c->adap.algo = &i2c_pxa_algorithm; - ret =request_irq (irq, i2c_pxa_handler,IRQF_DISABLED , + ret =request_irq (irq, i2c_pxa_handler,IRQF_SHARED , i2c->adap.name, i2c);if (ret) goto ereqirq;
Signature · 1 line
1.7.4
PATCH 5/6 i2c-pxa2xx: check timeout correctly
In reply to Sebastian Andrzej Siewiortimeout here maybe 0 if the event occured and a task with a higher priority stole the cpu and we were sleeping longer than the timeout value we specified.
In case of a real timeout I changed the error code to I2C_RETRY so we retry the transfer.
--- drivers/i2c/busses/i2c-pxa.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
drivers/i2c/busses/i2c-pxa.c +3 -1
@@ -770,8 +770,10 @@ static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num)*/ ret = i2c->msg_idx; -if (timeout ==0 ) +if (!timeout && i2c->msg_num) {i2c_pxa_scream_blue_murder (i2c,"timeout" ); + ret =I2C_RETRY ; + } out:return ret;
Signature · 1 line
1.7.4
PATCH 6/6 i2c-pxa2xx: pass of_node from platform driver to adapter and publish
In reply to Sebastian Andrzej Siewiorthe of_node will auto-publish devices which are added to the device tree.
Commit 925bb9c6 aka ("of/i2c: Fix module load order issue caused by of_i2c.c) moved the of_i2c_register_devices() function from the i2c core back to the drivers. This patch does the same thing for the pxa driver.
--- drivers/i2c/busses/i2c-pxa.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
drivers/i2c/busses/i2c-pxa.c +5 -0
@@ -29,6 +29,7 @@#include <linux/errno.h> #include <linux/interrupt.h> #include <linux/i2c-pxa.h> +#include <linux/of_i2c.h> #include <linux/platform_device.h> #include <linux/err.h> #include <linux/clk.h>
@@ -1138,6 +1139,9 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c->adap.algo_data = i2c; i2c->adap.dev.parent = &dev->dev; +#ifdef CONFIG_OF + i2c->adap.dev.of_node = dev->dev.of_node; +#endif if (i2c_type ==REGS_CE4100 ) ret =i2c_add_adapter (&i2c->adap);
@@ -1147,6 +1151,7 @@ static int i2c_pxa_probe(struct platform_device *dev)printk (KERN_INFO "I2C: Failed to add bus\n" ); goto eadapt; } +of_i2c_register_devices (&i2c->adap);platform_set_drvdata (dev, i2c);
Signature · 1 line
1.7.4