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.
This series indirectly depends on the SPI series because both modify include files and spi & i2c includes are sometimes too close to each other.
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: - introduced dynamic register mapping. With this change I can avoid
accessing the unavailable ISAR register without an #ifdef around it.
- modified the DT part of the pci driver to address latest DT review comments.
The patch series has been created with the -M option so file moves can be easily noticed. The whole series (including the spi rename) is also available at
git://git.linutronix.de/users/bigeasy/soda.git spi-i2c
Sebastian Andrzej Siewior (6):
i2c/pxa: use dynamic register layout
arm/pxa2xx: reorganize I2C files
i2c/pxa2xx: Add PCI support for PXA I2C controller i2c/pxa2xx: add support for shared IRQ handler i2c/pxa2xx: check timeout correctly
i2c/pxa2xx: pass of_node from platform driver to adapter and publish
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-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 | 2 +- arch/arm/mach-pxa/pxa3xx.c | 2 +- arch/arm/mach-pxa/raumfeld.c | 2 +- arch/arm/mach-pxa/saar.c | 2 +- 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/Kconfig | 7 +- drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-pxa-pci.c | 173 ++++++++++++++++++++ drivers/i2c/busses/i2c-pxa.c | 116 ++++++++++--- .../plat/i2c.h => include/linux/i2c/pxa-i2c.h | 0 40 files changed, 304 insertions(+), 72 deletions(-) create mode 100644 drivers/i2c/busses/i2c-pxa-pci.c rename arch/arm/plat-pxa/include/plat/i2c.h => include/linux/i2c/pxa-i2c.h (100%)
Sebastian
PATCH 1/6 i2c/pxa: 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.3.2
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-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 | 2 +- arch/arm/mach-pxa/pxa3xx.c | 2 +- arch/arm/mach-pxa/raumfeld.c | 2 +- arch/arm/mach-pxa/saar.c | 2 +- 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 37 files changed, 36 insertions(+), 45 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
@@ -9,8 +9,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-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 -1
@@ -17,6 +17,7 @@#include <linux/suspend.h> #include <linux/platform_device.h> #include <linux/sysdev.h> +#include <linux/i2c/pxa-i2c.h> #include <mach/hardware.h> #include <asm/irq.h>
@@ -27,7 +28,6 @@#include <mach/ohci.h> #include <mach/pm.h> #include <mach/dma.h> -#include <plat/i2c.h> #include "generic.h" #include "devices.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 <mach/hardware.h> #include <mach/gpio.h>
@@ -30,7 +31,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/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>
@@ -44,8 +45,6 @@#include <mach/spitz.h> #include <mach/sharpsl_pm.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>
@@ -46,7 +47,6 @@#include <mach/mmc.h> #include <mach/irda.h> #include <mach/ohci.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.3.2
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 spot
- 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 | 173 ++++++++++++++++++++++++++++++++++++++ drivers/i2c/busses/i2c-pxa.c | 27 +++++- 4 files changed, 203 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 +173 -0
173 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.3.2
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
Quoted 3 lines · Sebastian Andrzej Siewior
The Sodaville I2C controller is almost the same as found on PXA2xx. The difference:
- the register are at a different spot
maybe 'offset' is a better word than 'spot' here.
Quoted 79 lines
- 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.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 | 173 ++++++++++++++++++++++++++++++++++++++ drivers/i2c/busses/i2c-pxa.c | 27 +++++- 4 files changed, 203 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 +19
-0@@ -0,0 +1,173 @@ +/* +* 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_i2c_device { +struct platform_device pdev; +struct resource res[2 ]; +struct i2c_pxa_platform_data pdata; +};
drivers/i2c/busses/i2c-pxa-pci.c line 29
Quoted 10 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +10
-0+ +struct ce4100_devices { +struct ce4100_i2c_device sd[CE4100_PCI_I2C_DEVS ]; +}; + +static void plat_dev_release (struct device *dev) +{ +struct ce4100_i2c_device *sd =container_of (dev, + struct ce4100_i2c_device, pdev.dev); +
maybe add a little to_ce_dev() and use it?
Quoted 11 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +11
-0+of_device_node_put (&sd->pdev.dev); +} +static int add_i2c_device (struct pci_dev *dev,int bar, +struct ce4100_i2c_device *sd) +{ +struct platform_device *pdev = &sd->pdev; +struct i2c_pxa_platform_data *pdata = &sd->pdata; +struct device_node *child; +int found =0 ; +static int devnum; +
drivers/i2c/busses/i2c-pxa-pci.c line 50
Quoted 10 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +10
-0+ pdev->name ="ce4100-i2c" ; + pdev->dev.release = plat_dev_release; + pdev->dev.parent = &dev->dev; + + pdev->dev.platform_data = pdata; + pdev->resource = sd->res; + + sd->res[0 ].flags =IORESOURCE_MEM ; + sd->res[0 ].start =pci_resource_start (dev, bar); + sd->res[0 ].end =pci_resource_end (dev, bar);
hmm, could you copy the original resource to this?
Quoted 25 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +25
-0+ sd->res[1 ].flags =IORESOURCE_IRQ ; + sd->res[1 ].start = dev->irq; + sd->res[1 ].end = dev->irq; + pdev->num_resources =2 ; + +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 != sd->res[0 ].start) +continue ; +if (r.end != sd->res[0 ].end) +continue ; +if (r.flags != sd->res[0 ].flags) +continue ; + + pdev->dev.of_node = child; + prop =of_get_property (child,"fast-mode" ,NULL ); +if (prop) + pdata->fast_mode =1 ; +
drivers/i2c/busses/i2c-pxa-pci.c line 86
Quoted 10 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +10
-0+ pdev->id = devnum++; + found =1 ; +break ; + } + +if (found) +return platform_device_register (pdev); + +dev_err (&dev->dev,"Missing a DT node at %s for controller bar %d.\n" , + dev->dev.of_node->full_name, bar);
Hmm, do you really need to print dev->dev.of_node->full_name here, or is it missing from the dev_err() print?
drivers/i2c/busses/i2c-pxa-pci.c line 88
Quoted 2 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +2
-0+dev_err (&dev->dev,"Its memory space is 0x%08x - 0x%08x.\n" , + sd->res[0 ].start, sd->res[0 ].end);
No need for Its in this message. Also, why not print IRQ number?
Quoted 75 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +75
-0+return -EINVAL ; +} + +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; + +pci_set_drvdata (dev, sds); + +for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) { + ret =add_i2c_device (dev, i, &sds->sd[i]); +if (ret) { +while (--i >=0 ) +platform_device_unregister (&sds->sd[i].pdev); + goto err_dev_add; + } + } +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->sd); i++) +platform_device_unregister (&sds->sd[i].pdev); + +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);
drivers/i2c/busses/i2c-pxa-pci.c line 173
Quoted 10 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +10
-0+ +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]>" );
looks ok.
Quoted 57 lines
drivers/i2c/busses/i2c-pxa.c +18
-1@@ -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));
drivers/i2c/busses/i2c-pxa.c static int i2c_pxa_probe(struct platform_device *dev) · line 1095
Quoted 6 lines
drivers/i2c/busses/i2c-pxa.c +2
-1@@ -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;
do you really need to bother to checking i2c_type here?
Quoted 17 lines
drivers/i2c/busses/i2c-pxa.c +4
-1i2c->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.3.2
Signature · 3 lines
Ben Dooks, ben at fluff.org, http://www.fluff.org/ben/ Large Hadron Colada: A large Pina Colada that makes the universe disappear.
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
Quoted 6 lines · * Ben Dooks | 2011-01-05 20:21:36 [+0000]:
Quoted 3 lines · Sebastian Andrzej Siewior
The Sodaville I2C controller is almost the same as found on PXA2xx. The difference:
- the register are at a different spotmaybe 'offset' is a better word than 'spot' here.
okay.
Quoted 30 lines
Quoted 30 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +23
-0@@ -0,0 +1,173 @@ +/* +* 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_i2c_device { +struct platform_device pdev; +struct resource res[2 ]; +struct i2c_pxa_platform_data pdata; +}; + +struct ce4100_devices { +struct ce4100_i2c_device sd[CE4100_PCI_I2C_DEVS ]; +};
Quoted 8 lines
drivers/i2c/busses/i2c-pxa-pci.c line 29
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+ +static void plat_dev_release (struct device *dev) +{ +struct ce4100_i2c_device *sd =container_of (dev, + struct ce4100_i2c_device, pdev.dev); +maybe add a little
to_ce_dev()and use it?
Well okay but it will be used only once.
Quoted 15 lines
Quoted 15 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +15
-0+of_device_node_put (&sd->pdev.dev); +} +static int add_i2c_device (struct pci_dev *dev,int bar, +struct ce4100_i2c_device *sd) +{ +struct platform_device *pdev = &sd->pdev; +struct i2c_pxa_platform_data *pdata = &sd->pdata; +struct device_node *child; +int found =0 ; +static int devnum; + + pdev->name ="ce4100-i2c" ; + pdev->dev.release = plat_dev_release; + pdev->dev.parent = &dev->dev; +
Quoted 8 lines
drivers/i2c/busses/i2c-pxa-pci.c line 50
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+ pdev->dev.platform_data = pdata; + pdev->resource = sd->res; + + sd->res[0 ].flags =IORESOURCE_MEM ; + sd->res[0 ].start =pci_resource_start (dev, bar); + sd->res[0 ].end =pci_resource_end (dev, bar);hmm, could you copy the original resource to this?
something like
sd->res = &dev->resource[bar]
? This would work for res[0] but what about[1]? They have to be an array don't they?
Quoted 30 lines
Quoted 30 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +30
-0+ sd->res[1 ].flags =IORESOURCE_IRQ ; + sd->res[1 ].start = dev->irq; + sd->res[1 ].end = dev->irq; + pdev->num_resources =2 ; + +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 != sd->res[0 ].start) +continue ; +if (r.end != sd->res[0 ].end) +continue ; +if (r.flags != sd->res[0 ].flags) +continue ; + + pdev->dev.of_node = child; + prop =of_get_property (child,"fast-mode" ,NULL ); +if (prop) + pdata->fast_mode =1 ; + + pdev->id = devnum++; + found =1 ; +break ; + } +
Quoted 8 lines
drivers/i2c/busses/i2c-pxa-pci.c line 86
Quoted 5 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +5
-0+if (found) +return platform_device_register (pdev); + +dev_err (&dev->dev,"Missing a DT node at %s for controller bar %d.\n" , + dev->dev.of_node->full_name, bar);Hmm, do you really need to print
dev->dev.of_node->full_namehere, or is it missing from thedev_err()print?
dev_err shows the pci addreess while of_node->full_name is something like /soc at 0/pci at 3fc/pci at av/i2c-controller at 15a00,0,0. And this node is missing a child node or its address is wrong somewhere and the translation went wrong and therefore there is no match. I just tried to be accurate here.
Quoted 4 lines
drivers/i2c/busses/i2c-pxa-pci.c line 88
Quoted 2 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +2
-0+dev_err (&dev->dev,"Its memory space is 0x%08x - 0x%08x.\n" , + sd->res[0 ].start, sd->res[0 ].end);No need for Its in this message. Also, why not print IRQ number?
Okay. I don't think that the interrupt number is important here. I print the physical memory address so the user can look it up in his device tree. On the other hand I could be brief here and just mention the bar number and the user would use lspci to lookup the memory address.
Quoted 35 lines
Quoted 35 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +2
-0+return -EINVAL ; +}drivers/i2c/busses/i2c-pxa.c +10
-1@@ -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));
Quoted 11 lines
drivers/i2c/busses/i2c-pxa.c static int i2c_pxa_probe(struct platform_device *dev) · line 1095
Quoted 9 lines
drivers/i2c/busses/i2c-pxa.c +2
-1/* 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;do you really need to bother to checking
i2c_typehere?
What would you prefer? I don't want to assign anything to ->reg_isar on REGS_CE4100 so the NULL pointer can catch any accidental writes / reads. And in i2c_pxa_reset() I'm going to skip writes to it.
Sebastian
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
In reply to Ben Dooks* Ben Dooks | 2011-01-05 20:21:36 [+0000]:
[cut]
I fixed up all your comments (unless I forgot something by accident). Is it possible for this to go in this merge window or do I have to wait for the next one?
Sebastian
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
Quoted 1 line · * Sebastian Andrzej Siewior | 2011-01-14 15:31:07 [+0100]:
* Ben Dooks | 2011-01-05 20:21:36 [+0000]:
Hi Ben,
Quoted 5 lines
[cut]
I fixed up all your comments (unless I forgot something by accident). Is it possible for this to go in this merge window or do I have to wait for the next one?
I've rebased the whole series on top of v2.6.38-rc3. I fixed the conflict and considered three new boards (colibri-evalboard, saarb and pxa95).
The series is available at
git://git.linutronix.de/users/bigeasy/soda.git i2c_v3
Sebastian Andrzej Siewior (6):
i2c-pxa2xx: use dynamic register layout
ARM: pxa2xx: reorganize I2C files
i2c-pxa2xx: Add PCI support for PXA I2C controller
i2c-pxa2xx: add support for shared IRQ handler
i2c-pxa2xx: check timeout correctly
i2c-pxa2xx: pass of_node from platform driver to adapter and publish
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/Kconfig | 7 +- drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-pxa-pci.c | 176 ++++++++++++++++++++ drivers/i2c/busses/i2c-pxa.c | 116 ++++++++++--- .../plat/i2c.h => include/linux/i2c/pxa-i2c.h | 0 43 files changed, 310 insertions(+), 78 deletions(-) create mode 100644 drivers/i2c/busses/i2c-pxa-pci.c rename arch/arm/plat-pxa/include/plat/i2c.h => include/linux/i2c/pxa-i2c.h (100%)
Sebastian
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
Quoted 8 lines · Sebastian Andrzej Siewior
Quoted 1 line · * Sebastian Andrzej Siewior | 2011-01-14 15:31:07 [+0100]:
* Ben Dooks | 2011-01-05 20:21:36 [+0000]:
Hi Ben,
Quoted 2 lines
[cut]
Quoted 7 lines
Quoted 3 lines
I fixed up all your comments (unless I forgot something by accident). Is it possible for this to go in this merge window or do I have to wait for the next one?
I've rebased the whole series on top of v2.6.38-rc3. I fixed the conflict and considered three new boards (colibri-evalboard, saarb and pxa95).
can you repost it then for review please.
Quoted 64 lines
The series is available at
git://git.linutronix.de/users/bigeasy/soda.giti2c_v3Sebastian Andrzej Siewior (6):
i2c-pxa2xx: use dynamic register layout
ARM: pxa2xx: reorganize I2C files
i2c-pxa2xx: Add PCI support for PXA I2C controller
i2c-pxa2xx: add support for shared IRQ handler
i2c-pxa2xx: check timeout correctly
i2c-pxa2xx: passof_nodefrom platform driver to adapter and publisharch/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/Kconfig | 7 +- drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-pxa-pci.c | 176 ++++++++++++++++++++ drivers/i2c/busses/i2c-pxa.c | 116 ++++++++++--- .../plat/i2c.h => include/linux/i2c/pxa-i2c.h | 0 43 files changed, 310 insertions(+), 78 deletions(-) create mode 100644 drivers/i2c/busses/i2c-pxa-pci.c rename arch/arm/plat-pxa/include/plat/i2c.h => include/linux/i2c/pxa-i2c.h (100%)Sebastian
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 3 lines
Ben Dooks, ben at fluff.org, http://www.fluff.org/ben/ Large Hadron Colada: A large Pina Colada that makes the universe disappear.
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
In reply to Sebastian Andrzej SiewiorQuoted 12 lines · Sebastian Andrzej Siewior
drivers/i2c/busses/i2c-pxa-pci.c new file +12
-0+static void plat_dev_release (struct device *dev) +{ +struct ce4100_i2c_device *sd =container_of (dev, + struct ce4100_i2c_device, pdev.dev); + +of_device_node_put (&sd->pdev.dev); +} +static int add_i2c_device (struct pci_dev *dev,int bar, +struct ce4100_i2c_device *sd) +{ +struct platform_device *pdev = &sd->pdev; +struct i2c_pxa_platform_data *pdata = &sd->pdata;
...
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+ pdev->name ="ce4100-i2c" ; + pdev->dev.release = plat_dev_release; + pdev->dev.parent = &dev->dev; + + pdev->dev.platform_data = pdata; + pdev->resource = sd->res;
...
Quoted 14 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +14
-0+static int __devinit ce4100_i2c_probe (struct pci_dev *dev, +const struct pci_device_id *ent) +{ + sds =kzalloc (sizeof (*sds),GFP_KERNEL ); +if (!sds) + goto err_mem; + +pci_set_drvdata (dev, sds); + +for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) { + ret =add_i2c_device (dev, i, &sds->sd[i]); +if (ret) { +while (--i >=0 ) +platform_device_unregister (&sds->sd[i].pdev);
...
Quoted 1 line
+static void
__devexitce4100_i2c_remove(struct pci_dev *dev)
...
drivers/i2c/busses/i2c-pxa-pci.c line 144
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) +platform_device_unregister (&sds->sd[i].pdev); + +pci_disable_device (dev); +kfree (sds); +}
I see we're still repeating the same mistakes with lifetime rules of sysfs objects.
Any struct device which has been registered into the device model can remain indefinitely live after it's been unregistered (by, eg, if userspace holds a reference to it via sysfs.)
Only once the release method has been called is it safe to give up the memory backing it - and that also goes for the code comprising the function implementing the release.
This effectively prevents modules having release functions in them - while you can put module use count manipulation in to prevent unloading, it effectively prevents the module from being unloaded until you've unbound the device.
I think you should be trying to use the platform_device_alloc() interfaces here, rather than trying to reinvent them. The only issue I see with that is the of_device_node_put() call. Maybe OF/DT/device model people can provide some pointers? Adding Greg for the device model maintainer view.
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
Quoted 48 lines · Russell King - ARM Linux
Quoted 12 lines · Sebastian Andrzej Siewior
drivers/i2c/busses/i2c-pxa-pci.c new file +12
-0+static void plat_dev_release (struct device *dev) +{ +struct ce4100_i2c_device *sd =container_of (dev, + struct ce4100_i2c_device, pdev.dev); + +of_device_node_put (&sd->pdev.dev); +} +static int add_i2c_device (struct pci_dev *dev,int bar, +struct ce4100_i2c_device *sd) +{ +struct platform_device *pdev = &sd->pdev; +struct i2c_pxa_platform_data *pdata = &sd->pdata;...
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+ pdev->name ="ce4100-i2c" ; + pdev->dev.release = plat_dev_release; + pdev->dev.parent = &dev->dev; + + pdev->dev.platform_data = pdata; + pdev->resource = sd->res;...
Quoted 14 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +14
-0+static int __devinit ce4100_i2c_probe (struct pci_dev *dev, +const struct pci_device_id *ent) +{ + sds =kzalloc (sizeof (*sds),GFP_KERNEL ); +if (!sds) + goto err_mem; + +pci_set_drvdata (dev, sds); + +for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) { + ret =add_i2c_device (dev, i, &sds->sd[i]); +if (ret) { +while (--i >=0 ) +platform_device_unregister (&sds->sd[i].pdev);...
Quoted 1 line
+static void
__devexitce4100_i2c_remove(struct pci_dev *dev)...
drivers/i2c/busses/i2c-pxa-pci.c line 144
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) +platform_device_unregister (&sds->sd[i].pdev); + +pci_disable_device (dev); +kfree (sds); +}I see we're still repeating the same mistakes with lifetime rules of sysfs objects.
Quoted 3 lines
Any struct device which has been registered into the device model can remain indefinitely live after it's been unregistered (by, eg, if userspace holds a reference to it via sysfs.)
Actually this race is almost not possible these days with the rework that Tejun did on sysfs, so it's not easy to test for this anymore.
Quoted 3 lines
Only once the release method has been called is it safe to give up the memory backing it - and that also goes for the code comprising the function implementing the release.
Yes.
Quoted 10 lines
This effectively prevents modules having release functions in them - while you can put module use count manipulation in to prevent unloading, it effectively prevents the module from being unloaded until you've unbound the device.
I think you should be trying to use the
platform_device_alloc()interfaces here, rather than trying to reinvent them. The only issue I see with that is theof_device_node_put()call. Maybe OF/DT/device model people can provide some pointers? Adding Greg for the device model maintainer view.
Don't reinvent functions that the core already provides, that's not a good idea.
Sebastian, why didn't those functions work for you?
thanks,
greg k-h
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
Quoted 49 lines · Greg KH
Quoted 48 lines · Russell King - ARM Linux
Quoted 12 lines · Sebastian Andrzej Siewior
drivers/i2c/busses/i2c-pxa-pci.c new file +12
-0+static void plat_dev_release (struct device *dev) +{ +struct ce4100_i2c_device *sd =container_of (dev, + struct ce4100_i2c_device, pdev.dev); + +of_device_node_put (&sd->pdev.dev); +} +static int add_i2c_device (struct pci_dev *dev,int bar, +struct ce4100_i2c_device *sd) +{ +struct platform_device *pdev = &sd->pdev; +struct i2c_pxa_platform_data *pdata = &sd->pdata;...
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+ pdev->name ="ce4100-i2c" ; + pdev->dev.release = plat_dev_release; + pdev->dev.parent = &dev->dev; + + pdev->dev.platform_data = pdata; + pdev->resource = sd->res;...
Quoted 14 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +14
-0+static int __devinit ce4100_i2c_probe (struct pci_dev *dev, +const struct pci_device_id *ent) +{ + sds =kzalloc (sizeof (*sds),GFP_KERNEL ); +if (!sds) + goto err_mem; + +pci_set_drvdata (dev, sds); + +for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) { + ret =add_i2c_device (dev, i, &sds->sd[i]); +if (ret) { +while (--i >=0 ) +platform_device_unregister (&sds->sd[i].pdev);...
Quoted 1 line
+static void
__devexitce4100_i2c_remove(struct pci_dev *dev)...
drivers/i2c/busses/i2c-pxa-pci.c line 144
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) +platform_device_unregister (&sds->sd[i].pdev); + +pci_disable_device (dev); +kfree (sds); +}I see we're still repeating the same mistakes with lifetime rules of sysfs objects.
Quoted 6 lines
Quoted 3 lines
Any struct device which has been registered into the device model can remain indefinitely live after it's been unregistered (by, eg, if userspace holds a reference to it via sysfs.)
Actually this race is almost not possible these days with the rework that Tejun did on sysfs, so it's not easy to test for this anymore.
Is it wise to make such a problematical bug harder to trigger without completely preventing it triggering?
A different approach was taken with IRQ handling where people were registering handlers before the driver was ready for it to be called - request_irq() would explicitly call the handler as soon as it was registered to provoke bugs.
Surely for these lifetime violations a similar approach should be taken. Make the kernel more likely to oops should a violation occur before the developer can get the code out the door. One way I can think of doing that is when devices are unregistered but not yet released, place them on a list which is periodically scanned, and not only is the device dereferenced by also the release function.
When the use count drops to zero, don't immediately release, but wait a number of polls.
If either goes away before the device has been released, then we predictably oops, and the developer gets to know about his violation of the rules immediately.
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
Quoted 72 lines · Russell King - ARM Linux
Quoted 49 lines · Greg KH
Quoted 48 lines · Russell King - ARM Linux
Quoted 12 lines · Sebastian Andrzej Siewior
drivers/i2c/busses/i2c-pxa-pci.c new file +12
-0+static void plat_dev_release (struct device *dev) +{ +struct ce4100_i2c_device *sd =container_of (dev, + struct ce4100_i2c_device, pdev.dev); + +of_device_node_put (&sd->pdev.dev); +} +static int add_i2c_device (struct pci_dev *dev,int bar, +struct ce4100_i2c_device *sd) +{ +struct platform_device *pdev = &sd->pdev; +struct i2c_pxa_platform_data *pdata = &sd->pdata;...
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+ pdev->name ="ce4100-i2c" ; + pdev->dev.release = plat_dev_release; + pdev->dev.parent = &dev->dev; + + pdev->dev.platform_data = pdata; + pdev->resource = sd->res;...
Quoted 14 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +14
-0+static int __devinit ce4100_i2c_probe (struct pci_dev *dev, +const struct pci_device_id *ent) +{ + sds =kzalloc (sizeof (*sds),GFP_KERNEL ); +if (!sds) + goto err_mem; + +pci_set_drvdata (dev, sds); + +for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) { + ret =add_i2c_device (dev, i, &sds->sd[i]); +if (ret) { +while (--i >=0 ) +platform_device_unregister (&sds->sd[i].pdev);...
Quoted 1 line
+static void
__devexitce4100_i2c_remove(struct pci_dev *dev)...
drivers/i2c/busses/i2c-pxa-pci.c line 144
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) +platform_device_unregister (&sds->sd[i].pdev); + +pci_disable_device (dev); +kfree (sds); +}I see we're still repeating the same mistakes with lifetime rules of sysfs objects.
Quoted 6 lines
Quoted 3 lines
Any struct device which has been registered into the device model can remain indefinitely live after it's been unregistered (by, eg, if userspace holds a reference to it via sysfs.)
Actually this race is almost not possible these days with the rework that Tejun did on sysfs, so it's not easy to test for this anymore.
Is it wise to make such a problematical bug harder to trigger without completely preventing it triggering?
A different approach was taken with IRQ handling where people were registering handlers before the driver was ready for it to be called -
request_irq()would explicitly call the handler as soon as it was registered to provoke bugs.Surely for these lifetime violations a similar approach should be taken. Make the kernel more likely to oops should a violation occur before the developer can get the code out the door. One way I can think of doing that is when devices are unregistered but not yet released, place them on a list which is periodically scanned, and not only is the device dereferenced by also the release function.
Quoted 6 lines
When the use count drops to zero, don't immediately release, but wait a number of polls.
If either goes away before the device has been released, then we predictably oops, and the developer gets to know about his violation of the rules immediately.
Yes, that would be a good way to resolve this, patches are glady welcome :)
thanks,
greg k-h
PATCH 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.
---
I switched to platform_device_alloc() now so the rece should be gone. I also pushed out the whole series.
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.3.2
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
In reply to Greg KHQuoted 53 lines · * Greg KH | 2011-01-05 15:08:34 [-0800]:
Quoted 38 lines · Russell King - ARM Linux
Quoted 12 lines · Sebastian Andrzej Siewior
drivers/i2c/busses/i2c-pxa-pci.c new file +12
-0+static void plat_dev_release (struct device *dev) +{ +struct ce4100_i2c_device *sd =container_of (dev, + struct ce4100_i2c_device, pdev.dev); + +of_device_node_put (&sd->pdev.dev); +} +static int add_i2c_device (struct pci_dev *dev,int bar, +struct ce4100_i2c_device *sd) +{ +struct platform_device *pdev = &sd->pdev; +struct i2c_pxa_platform_data *pdata = &sd->pdata;...
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+ pdev->name ="ce4100-i2c" ; + pdev->dev.release = plat_dev_release; + pdev->dev.parent = &dev->dev; + + pdev->dev.platform_data = pdata; + pdev->resource = sd->res;...
Quoted 14 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +14
-0+static int __devinit ce4100_i2c_probe (struct pci_dev *dev, +const struct pci_device_id *ent) +{ + sds =kzalloc (sizeof (*sds),GFP_KERNEL ); +if (!sds) + goto err_mem; + +pci_set_drvdata (dev, sds); + +for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) { + ret =add_i2c_device (dev, i, &sds->sd[i]); +if (ret) { +while (--i >=0 ) +platform_device_unregister (&sds->sd[i].pdev);...
Quoted 1 line
+static void
__devexitce4100_i2c_remove(struct pci_dev *dev)...
Quoted 13 lines
drivers/i2c/busses/i2c-pxa-pci.c line 144
Quoted 6 lines
drivers/i2c/busses/i2c-pxa-pci.c new file +6
-0+for (i =0 ; i <ARRAY_SIZE (sds->sd); i++) +platform_device_unregister (&sds->sd[i].pdev); + +pci_disable_device (dev); +kfree (sds); +}I think you should be trying to use the
platform_device_alloc()interfaces here, rather than trying to reinvent them. The only issue I see with that is theof_device_node_put()call. Maybe OF/DT/device model people can provide some pointers? Adding Greg for the device model maintainer view.
Quoted 4 lines
Don't reinvent functions that the core already provides, that's not a good idea.
Sebastian, why didn't those functions work for you?
which functions are you talking about? I allocated one piece of memory which contained a platform device, ressources, platform data. It looked better than allocating multiple small chunks. I registered it with platform_device_register() and platform_device_unregister() complained about a missing ->release function.
So I now I'm going to rework it and use platform_device_alloc() instead.
Quoted 3 lines
thanks,
greg k-h
Sebastian
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
Quoted 5 lines · Sebastian Andrzej Siewior
which functions are you talking about? I allocated one piece of memory which contained a platform device, ressources, platform data. It looked better than allocating multiple small chunks. I registered it with
platform_device_register()andplatform_device_unregister()complained about a missing ->release function.
Please see my email where I described the lifetime rules. Let's say your module is removed. In doing so, you call platform_device_unregister() followed by kfree(). After this, your module is removed from the system and the memory backing the module code is unmapped.
If something holds a reference to the platform device, then that's just waiting for an OOPS to happen. When those references are finally given up, your release function will be called - but the code has been unmapped. That's one source of OOPS. The second source of OOPS is that the platform device will be dereferenced, but as you've already kfree'd it, the memory could be used for some other purpose - in which case this manipulation of what we think is still a platform device is going to corrupt some other user.
If it hasn't been re-used, hopefully it's been poisoned, so you'll get an OOPS from that instead.
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
Quoted 8 lines · * Russell King - ARM Linux | 2011-01-06 11:12:31 [+0000]:
Please see my email where I described the lifetime rules. Let's say your module is removed. In doing so, you call
platform_device_unregister()followed bykfree(). After this, your module is removed from the system and the memory backing the module code is unmapped.If something holds a reference to the platform device, then that's just waiting for an OOPS to happen. When those references are finally given up, your release function will be called - but the code has been unmapped.
I got that. That is why I'm going go to use allready provided functions (platform_device_register_resndata() in this case) so I'm no longer allocating any memory. So I'm only holding a struct which is pointing to the platform_device. Everything else is unmapped by the driver core.
So I just have just to of_device_node_put() myself. Hmmm.
Grant, who is calling of_device_node_put() on nodes assigned in of_register_spi_devices() & of_i2c_register_devices()? I can't find any reference. The spi part is not putting the node or removing the irq mapping in error case so I guess there must be some magic triggered somewhere.
Also adap->dev.of_node and master->dev.of_node has to be non-null for the device assignment to work. Who is putting these nodes back? I see drivers (i2c-cpm & i2c-mpc) taking refs but I fail to find a place where it is put back.
Sebastian
PATCH 3/6 i2c/pxa2xx: Add PCI support for PXA I2C controller
Quoted 16 lines · Sebastian Andrzej Siewior
Quoted 8 lines · * Russell King - ARM Linux | 2011-01-06 11:12:31 [+0000]:
Please see my email where I described the lifetime rules. ?Let's say your module is removed. ?In doing so, you call
platform_device_unregister()followed bykfree(). ?After this, your module is removed from the system and the memory backing the module code is unmapped.If something holds a reference to the platform device, then that's just waiting for an OOPS to happen. ?When those references are finally given up, your release function will be called - but the code has been unmapped.
I got that. That is why I'm going go to use allready provided functions (
platform_device_register_resndata()in this case) so I'm no longer allocating any memory. So I'm only holding a struct which is pointing to theplatform_device. Everything else is unmapped by the driver core.
Quoted 7 lines
So I just have just to
of_device_node_put()myself. Hmmm.Grant, who is calling
of_device_node_put()on nodes assigned inof_register_spi_devices()&of_i2c_register_devices()? I can't find any reference. The spi part is not putting the node or removing the irq mapping in error case so I guess there must be some magic triggered somewhere.
No, it is just a deficiency on the spi and i2c dt support at the moment. It needs to be added. However, since the flattree is currently entirely static (nodes don't get freed) the mismatched reference counting isn't immediately an issue. However, it will become a problem when add-in boards (like xilinx fpgas) start using the dt to describe internal devices.
Quoted 4 lines
Also
adap->dev.of_nodeandmaster->dev.of_nodehas to be non-null for the device assignment to work. Who is putting these nodes back? I see drivers (i2c-cpm & i2c-mpc) taking refs but I fail to find a place where it is put back.
Same issue.
g.
Signature · 2 lines
Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd.
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.3.2
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.3.2
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.3.2
PATCH 6/6 i2c/pxa2xx: pass of_node from platform driver to adapter and publish
Quoted 9 lines · Sebastian Andrzej Siewior
the
of_nodewill auto-publish devices which are added to the device tree.Commit
925bb9c6aka ("of/i2c: Fix module load order issue caused byof_i2c.c) moved theof_i2c_register_devices()function from the i2c core back to the drivers. This patch does the same thing for the pxa driver.Signed-off-by Sebastian Andrzej Siewior <[email protected]>Signed-off-by Dirk Brandewie <[email protected]>
Ben, I'll leave you to pick this one up.
g.
Quoted 43 lines
---
?drivers/i2c/busses/i2c-pxa.c | ? ?5 +++++
?1 files changed, 5 insertions(+), 0 deletions(-)drivers/i2c/busses/i2c-pxa.c +0
-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>drivers/i2c/busses/i2c-pxa.c +4
-1@@ -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); --1.7.3.2
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 2 lines
Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd.
Quoted 35 lines · Sebastian Andrzej Siewior
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.
This series indirectly depends on the SPI series because both modify include files and spi & i2c includes are sometimes too close to each other.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 ininclude/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 usesARRAY_SIZE(). As it turns outpci_select_bars()is not useable.
- the patch which resetted the chip if the i2c bus was not available has been dropped.
v3: - introduced dynamic register mapping. With this change I can avoid
accessing the unavailable ISAR register without an #ifdef around it.
- modified the DT part of the pci driver to address latest DT review comments.The patch series has been created with the -M option so file moves can be easily noticed. The whole series (including the spi rename) is also available at
git://git.linutronix.de/users/bigeasy/soda.gitspi-i2c
Quoted 7 lines
Sebastian Andrzej Siewior (6):
i2c/pxa: use dynamic register layout
arm/pxa2xx: reorganize I2C files
i2c/pxa2xx: Add PCI support for PXA I2C controller i2c/pxa2xx: add support for shared IRQ handler i2c/pxa2xx: check timeout correctly
i2c/pxa2xx: passof_nodefrom platform driver to adapter and publish
please rename these i2c-pxa2xx
and for the ARM, use ARM: pxa2xx as the prefix
Quoted 50 lines
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-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 | 2 +- arch/arm/mach-pxa/pxa3xx.c | 2 +- arch/arm/mach-pxa/raumfeld.c | 2 +- arch/arm/mach-pxa/saar.c | 2 +- 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/Kconfig | 7 +- drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-pxa-pci.c | 173 ++++++++++++++++++++ drivers/i2c/busses/i2c-pxa.c | 116 ++++++++++--- .../plat/i2c.h => include/linux/i2c/pxa-i2c.h | 0 40 files changed, 304 insertions(+), 72 deletions(-) create mode 100644 drivers/i2c/busses/i2c-pxa-pci.c rename arch/arm/plat-pxa/include/plat/i2c.h => include/linux/i2c/pxa-i2c.h (100%)Sebastian
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 3 lines
Ben Dooks, ben at fluff.org, http://www.fluff.org/ben/ Large Hadron Colada: A large Pina Colada that makes the universe disappear.
Quoted 11 lines · * Ben Dooks | 2011-01-05 21:51:59 [+0000]:
Quoted 7 lines
Sebastian Andrzej Siewior (6):
i2c/pxa: use dynamic register layout
arm/pxa2xx: reorganize I2C files
i2c/pxa2xx: Add PCI support for PXA I2C controller i2c/pxa2xx: add support for shared IRQ handler i2c/pxa2xx: check timeout correctly
i2c/pxa2xx: passof_nodefrom platform driver to adapter and publishplease rename these i2c-pxa2xx
and for the ARM, use ARM: pxa2xx as the prefix
Done
Sebastian