From 6da86df3a4aa6dfbb9af350df4a908a7a9254be0 Mon Sep 17 00:00:00 2001 From: Vaibhav Hiremath Date: Wed, 6 Jan 2016 11:31:20 +0530 Subject: 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 Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/arche-apb-ctrl.c | 14 ++++++++++++++ drivers/staging/greybus/arche-platform.c | 16 ++++++++++++++++ 2 files changed, 30 insertions(+) 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; } -- cgit v1.1