serial: sccnxp: Replace pdata.init/exit with regulator API
authorAlexander Shiyan <shc_work@mail.ru>
Sat, 13 Apr 2013 04:46:58 +0000 (08:46 +0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 15 Apr 2013 18:04:07 +0000 (11:04 -0700)
Typical usage of pdata.init/exit is enable/disable power and/or toggle
reset for the target chip.
This patch replaces these callbacks with regulator API.

Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/sccnxp.c
include/linux/platform_data/serial-sccnxp.h

index b1d04aabd50cd39fe0a072166780d28e79dd0c3f..c77304155410169a1a3c040400cc4f23bf38b788 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/spinlock.h>
 #include <linux/platform_device.h>
 #include <linux/platform_data/serial-sccnxp.h>
+#include <linux/regulator/consumer.h>
 
 #define SCCNXP_NAME                    "uart-sccnxp"
 #define SCCNXP_MAJOR                   204
@@ -131,6 +132,8 @@ struct sccnxp_port {
        struct timer_list       timer;
 
        struct sccnxp_pdata     pdata;
+
+       struct regulator        *regulator;
 };
 
 static inline u8 sccnxp_raw_read(void __iomem *base, u8 reg, u8 shift)
@@ -916,6 +919,16 @@ static int sccnxp_probe(struct platform_device *pdev)
                goto err_out;
        }
 
+       s->regulator = devm_regulator_get(&pdev->dev, "VCC");
+       if (!IS_ERR(s->regulator)) {
+               ret = regulator_enable(s->regulator);
+               if (ret) {
+                       dev_err(&pdev->dev,
+                               "Failed to enable regulator: %i\n", ret);
+                       return ret;
+               }
+       }
+
        membase = devm_ioremap_resource(&pdev->dev, res);
        if (IS_ERR(membase)) {
                ret = PTR_ERR(membase);
@@ -965,10 +978,6 @@ static int sccnxp_probe(struct platform_device *pdev)
        s->imr = 0;
        sccnxp_write(&s->port[0], SCCNXP_IMR_REG, 0);
 
-       /* Board specific configure */
-       if (s->pdata.init)
-               s->pdata.init();
-
        if (!s->poll) {
                ret = devm_request_threaded_irq(&pdev->dev, s->irq, NULL,
                                                sccnxp_ist,
@@ -1009,8 +1018,8 @@ static int sccnxp_remove(struct platform_device *pdev)
        uart_unregister_driver(&s->uart);
        platform_set_drvdata(pdev, NULL);
 
-       if (s->pdata.exit)
-               s->pdata.exit();
+       if (!IS_ERR(s->regulator))
+               return regulator_disable(s->regulator);
 
        return 0;
 }
index 215574d1e81dc090690fd215205c01f81e4be33f..bdc510d032452fc53b03b146c4421bdf4709ab71 100644 (file)
@@ -86,10 +86,6 @@ struct sccnxp_pdata {
        const u32               mctrl_cfg[SCCNXP_MAX_UARTS];
        /* Timer value for polling mode (usecs) */
        const unsigned int      poll_time_us;
-       /* Called during startup */
-       void (*init)(void);
-       /* Called before finish */
-       void (*exit)(void);
 };
 
 #endif