diff options
author | Vaibhav Hiremath <vaibhav.hiremath@linaro.org> | 2016-01-06 11:31:20 +0530 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@google.com> | 2016-01-06 20:00:35 -0800 |
commit | 6da86df3a4aa6dfbb9af350df4a908a7a9254be0 (patch) | |
tree | 708cec490c4e215c1b844e02de7c7193a5c93a2b /drivers | |
parent | 1f67ee5c04c9690c4c99fc4d31f4add46ea7be73 (diff) | |
download | op-kernel-dev-6da86df3a4aa6dfbb9af350df4a908a7a9254be0.zip op-kernel-dev-6da86df3a4aa6dfbb9af350df4a908a7a9254be0.tar.gz |
greybus: arche-platform: Export gpio (reset & sys_boot) to user
In order to allow user to flash the firmware to,
SVC:
user need to assert the reset first, set sysboot pin and
deassert reset. And then issue a flashing command.
And APB:
User need to assert the reset first, and then issue flashing
command.
So this patch exports the gpio's to user.
Signed-off-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/greybus/arche-apb-ctrl.c | 14 | ||||
-rw-r--r-- | drivers/staging/greybus/arche-platform.c | 16 |
2 files changed, 30 insertions, 0 deletions
diff --git a/drivers/staging/greybus/arche-apb-ctrl.c b/drivers/staging/greybus/arche-apb-ctrl.c index f02b8ad..8046e1e 100644 --- a/drivers/staging/greybus/arche-apb-ctrl.c +++ b/drivers/staging/greybus/arche-apb-ctrl.c @@ -71,6 +71,17 @@ static inline void deassert_gpio(unsigned int gpio) gpio_set_value(gpio, 0); } +/* Export gpio's to user space */ +static void export_gpios(struct arche_apb_ctrl_drvdata *apb) +{ + gpio_export(apb->resetn_gpio, false); +} + +static void unexport_gpios(struct arche_apb_ctrl_drvdata *apb) +{ + gpio_unexport(apb->resetn_gpio); +} + static irqreturn_t apb_ctrl_wake_detect_irq(int irq, void *devid) { struct arche_apb_ctrl_drvdata *apb = devid; @@ -328,6 +339,8 @@ int arche_apb_ctrl_probe(struct platform_device *pdev) assert_gpio(apb->resetn_gpio); + export_gpios(apb); + dev_info(&pdev->dev, "Device registered successfully\n"); return 0; @@ -344,6 +357,7 @@ int arche_apb_ctrl_remove(struct platform_device *pdev) apb_ctrl_cleanup(apb); platform_set_drvdata(pdev, NULL); + unexport_gpios(apb); return 0; } diff --git a/drivers/staging/greybus/arche-platform.c b/drivers/staging/greybus/arche-platform.c index 5069952..e6fe015 100644 --- a/drivers/staging/greybus/arche-platform.c +++ b/drivers/staging/greybus/arche-platform.c @@ -45,6 +45,19 @@ static inline void svc_reset_onoff(unsigned int gpio, bool onoff) gpio_set_value(gpio, onoff); } +/* Export gpio's to user space */ +static void export_gpios(struct arche_platform_drvdata *arche_pdata) +{ + gpio_export(arche_pdata->svc_reset_gpio, false); + gpio_export(arche_pdata->svc_sysboot_gpio, false); +} + +static void unexport_gpios(struct arche_platform_drvdata *arche_pdata) +{ + gpio_unexport(arche_pdata->svc_reset_gpio); + gpio_unexport(arche_pdata->svc_sysboot_gpio); +} + static void arche_platform_cleanup(struct arche_platform_drvdata *arche_pdata) { /* As part of exit, put APB back in reset state */ @@ -141,6 +154,8 @@ static int arche_platform_probe(struct platform_device *pdev) arche_pdata->num_apbs = of_get_child_count(np); dev_dbg(dev, "Number of APB's available - %d\n", arche_pdata->num_apbs); + export_gpios(arche_pdata); + /* probe all childs here */ ret = of_platform_populate(np, NULL, NULL, dev); if (ret) @@ -169,6 +184,7 @@ static int arche_platform_remove(struct platform_device *pdev) arche_platform_cleanup(arche_pdata); platform_set_drvdata(pdev, NULL); + unexport_gpios(arche_pdata); return 0; } |