2 * CE4100 PCI-I2C glue code for PXA's driver
3 * Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
6 * The CE4100's I2C device is more or less the same one as found on PXA.
7 * It does not support slave mode, the register slightly moved. This PCI
8 * device provides three bars, every contains a single I2C controller.
10 #include <linux/init.h>
11 #include <linux/pci.h>
12 #include <linux/platform_device.h>
13 #include <linux/platform_data/i2c-pxa.h>
15 #include <linux/of_device.h>
16 #include <linux/of_address.h>
18 #define CE4100_PCI_I2C_DEVS 3
20 struct ce4100_devices
{
21 struct platform_device
*pdev
[CE4100_PCI_I2C_DEVS
];
24 static struct platform_device
*add_i2c_device(struct pci_dev
*dev
, int bar
)
26 struct platform_device
*pdev
;
27 struct i2c_pxa_platform_data pdata
;
28 struct resource res
[2];
29 struct device_node
*child
;
33 memset(&pdata
, 0, sizeof(struct i2c_pxa_platform_data
));
34 memset(&res
, 0, sizeof(res
));
36 res
[0].flags
= IORESOURCE_MEM
;
37 res
[0].start
= pci_resource_start(dev
, bar
);
38 res
[0].end
= pci_resource_end(dev
, bar
);
40 res
[1].flags
= IORESOURCE_IRQ
;
41 res
[1].start
= dev
->irq
;
42 res
[1].end
= dev
->irq
;
44 for_each_child_of_node(dev
->dev
.of_node
, child
) {
49 ret
= of_address_to_resource(child
, 0, &r
);
52 if (r
.start
!= res
[0].start
)
54 if (r
.end
!= res
[0].end
)
56 if (r
.flags
!= res
[0].flags
)
59 prop
= of_get_property(child
, "fast-mode", NULL
);
67 dev_err(&dev
->dev
, "failed to match a DT node for bar %d.\n",
73 pdev
= platform_device_alloc("ce4100-i2c", devnum
);
79 pdev
->dev
.parent
= &dev
->dev
;
80 pdev
->dev
.of_node
= child
;
82 ret
= platform_device_add_resources(pdev
, res
, ARRAY_SIZE(res
));
86 ret
= platform_device_add_data(pdev
, &pdata
, sizeof(pdata
));
90 ret
= platform_device_add(pdev
);
96 platform_device_put(pdev
);
101 static int ce4100_i2c_probe(struct pci_dev
*dev
,
102 const struct pci_device_id
*ent
)
106 struct ce4100_devices
*sds
;
108 ret
= pci_enable_device_mem(dev
);
112 if (!dev
->dev
.of_node
) {
113 dev_err(&dev
->dev
, "Missing device tree node.\n");
116 sds
= kzalloc(sizeof(*sds
), GFP_KERNEL
);
122 for (i
= 0; i
< ARRAY_SIZE(sds
->pdev
); i
++) {
123 sds
->pdev
[i
] = add_i2c_device(dev
, i
);
124 if (IS_ERR(sds
->pdev
[i
])) {
125 ret
= PTR_ERR(sds
->pdev
[i
]);
127 platform_device_unregister(sds
->pdev
[i
]);
131 pci_set_drvdata(dev
, sds
);
137 pci_disable_device(dev
);
141 static const struct pci_device_id ce4100_i2c_devices
[] = {
142 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, 0x2e68)},
146 static struct pci_driver ce4100_i2c_driver
= {
148 .suppress_bind_attrs
= true,
150 .name
= "ce4100_i2c",
151 .id_table
= ce4100_i2c_devices
,
152 .probe
= ce4100_i2c_probe
,
154 builtin_pci_driver(ce4100_i2c_driver
);