Re: [PATCH 4/5] i8042: Prepare i8042 driver for DT support

2015-02-03 Thread Dmitry Torokhov
On Tue, Feb 03, 2015 at 12:48:49AM +0300, Roman Volkov wrote:
 Use platform_device_probe() instead of platform_create_bundle() when
 compiled with DT support, since the latter function is not suitable for
 handling the OF device tree.
 
 The order of initialization is changed, since i8042_platform_init() for DT
 requires initialized platform_device structure. To avoid searching of the
 compatible node twice, the platform_device structure pointer must be passed
 to the i8042_platform_init() function right after initialization by
 platform_device_probe().
 
 Signed-off-by: Tony Prisk li...@prisktech.co.nz
 Signed-off-by: Roman Volkov v1...@v1ros.org
 ---
 
 Yes, many of these ifdefs look ugly. Suggestions on how to avoid this are
 welcome (except using of_find_compatible_node() for searching the node twice
 before calling the probe function).

I guess we need to split the dirver into part that create platform
device and the standard driver part. Then your OF code can supply most
of the needed data via resources/platform data. Yes, it is a larger
change, but the current splat of ifdefs makes my eyes water.

Thanks.

-- 
Dmitry
--
To unsubscribe from this list: send the line unsubscribe linux-input in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 4/5] i8042: Prepare i8042 driver for DT support

2015-02-02 Thread Roman Volkov
Use platform_device_probe() instead of platform_create_bundle() when
compiled with DT support, since the latter function is not suitable for
handling the OF device tree.

The order of initialization is changed, since i8042_platform_init() for DT
requires initialized platform_device structure. To avoid searching of the
compatible node twice, the platform_device structure pointer must be passed
to the i8042_platform_init() function right after initialization by
platform_device_probe().

Signed-off-by: Tony Prisk li...@prisktech.co.nz
Signed-off-by: Roman Volkov v1...@v1ros.org
---

Yes, many of these ifdefs look ugly. Suggestions on how to avoid this are
welcome (except using of_find_compatible_node() for searching the node twice
before calling the probe function).

The problem is that platform_device_add() causes parent drivers to be probed
while the i8042 is not ready yet (register addresses point to the sky).

I would suggest to do something like deferred probing of the parent drivers,
but this would be a part of another investigation and patchset.

Regards,
Roman.

 drivers/input/serio/i8042.c | 33 ++---
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
index c53323e..2978b0e 100644
--- a/drivers/input/serio/i8042.c
+++ b/drivers/input/serio/i8042.c
@@ -1407,16 +1407,32 @@ static int __init i8042_probe(struct platform_device 
*dev)
int error;
 
i8042_platform_device = dev;
+#ifdef SERIO_I8042_DT
+   error = i8042_platform_init(dev);
+   if (error)
+   return error;
 
+   error = i8042_controller_check();
+   if (error)
+   goto out_platform_exit;
+#endif
if (i8042_reset) {
error = i8042_controller_selftest();
if (error)
+#ifdef SERIO_I8042_DT
+   goto out_platform_exit;
+#else
return error;
+#endif
}
 
error = i8042_controller_init();
if (error)
+#ifdef SERIO_I8042_DT
+   goto out_platform_exit;
+#else
return error;
+#endif
 
 #ifdef CONFIG_X86
if (i8042_dritek)
@@ -1446,7 +1462,10 @@ static int __init i8042_probe(struct platform_device 
*dev)
i8042_free_irqs();
i8042_controller_reset(false);
i8042_platform_device = NULL;
-
+#ifdef SERIO_I8042_DT
+ out_platform_exit:
+   i8042_platform_exit();
+#endif
return error;
 }
 
@@ -1483,11 +1502,18 @@ static struct platform_driver i8042_driver = {
 
 static int __init i8042_init(void)
 {
+#ifndef SERIO_I8042_DT
struct platform_device *pdev;
+#endif
int err;
 
dbg_init();
 
+#ifdef SERIO_I8042_DT
+   err = platform_driver_probe(i8042_driver, i8042_probe);
+   if (err)
+   return err;
+#else
err = i8042_platform_init();
if (err)
return err;
@@ -1501,14 +1527,15 @@ static int __init i8042_init(void)
err = PTR_ERR(pdev);
goto err_platform_exit;
}
-
+#endif
panic_blink = i8042_panic_blink;
 
return 0;
-
+#ifndef SERIO_I8042_DT
  err_platform_exit:
i8042_platform_exit();
return err;
+#endif
 }
 
 static void __exit i8042_exit(void)
-- 
2.2.2

--
To unsubscribe from this list: send the line unsubscribe linux-input in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html