From db6e1fd264ac6716ad9778e9b6cd6bae5a527f5e Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 30 Aug 2014 16:47:26 -0700 Subject: [PATCH] greybus: hook up sdio, gpio, and tty into the greybus core. --- drivers/staging/greybus/Makefile | 5 +---- drivers/staging/greybus/core.c | 41 +++++++++++++++++++++++++++++++++++++++ drivers/staging/greybus/gpio-gb.c | 11 +++++++---- drivers/staging/greybus/greybus.h | 10 +++++++++- drivers/staging/greybus/sdio-gb.c | 11 +++++++---- drivers/staging/greybus/uart-gb.c | 15 ++++++++------ 6 files changed, 74 insertions(+), 19 deletions(-) diff --git a/drivers/staging/greybus/Makefile b/drivers/staging/greybus/Makefile index 2e3212b..74d4124 100644 --- a/drivers/staging/greybus/Makefile +++ b/drivers/staging/greybus/Makefile @@ -1,9 +1,6 @@ -greybus-y := core.o gbuf.o i2c-gb.o +greybus-y := core.o gbuf.o i2c-gb.o gpio-gb.o sdio-gb.o uart-gb.o obj-m += greybus.o -obj-m += sdio-gb.o -obj-m += gpio-gb.o -obj-m += uart-gb.o KERNELVER ?= $(shell uname -r) KERNELDIR ?= /lib/modules/$(KERNELVER)/build diff --git a/drivers/staging/greybus/core.c b/drivers/staging/greybus/core.c index f8332b4d..b1a5b88 100644 --- a/drivers/staging/greybus/core.c +++ b/drivers/staging/greybus/core.c @@ -157,17 +157,58 @@ static int new_device(struct greybus_device *gdev, /* Allocate all of the different "sub device types" for this device */ retval = gb_i2c_probe(gdev, id); + if (retval) + goto error_i2c; + + retval = gb_gpio_probe(gdev, id); + if (retval) + goto error_gpio; + + retval = gb_sdio_probe(gdev, id); + if (retval) + goto error_sdio; + + retval = gb_tty_probe(gdev, id); + if (retval) + goto error_tty; return 0; + +error_tty: + gb_sdio_disconnect(gdev); + +error_sdio: + gb_gpio_disconnect(gdev); + +error_gpio: + gb_i2c_disconnect(gdev); + +error_i2c: + return retval; } +static void remove_device(struct greybus_device *gdev) +{ + /* tear down all of the "sub device types" for this device */ + gb_i2c_disconnect(gdev); + gb_gpio_disconnect(gdev); + gb_sdio_disconnect(gdev); + gb_tty_disconnect(gdev); +} static int __init gb_init(void) { + int retval; + + retval = gb_tty_init(); + if (retval) + return retval; + return 0; } static void __exit gb_exit(void) { + gb_tty_exit(); } module_init(gb_init); diff --git a/drivers/staging/greybus/gpio-gb.c b/drivers/staging/greybus/gpio-gb.c index 990a74d..30b15ed 100644 --- a/drivers/staging/greybus/gpio-gb.c +++ b/drivers/staging/greybus/gpio-gb.c @@ -51,7 +51,8 @@ static void gpio_set(struct gpio_chip *gpio, unsigned nr, int val) return; } -static int gpio_gb_probe(struct greybus_device *gdev, const struct greybus_device_id *id) +int gb_gpio_probe(struct greybus_device *gdev, + const struct greybus_device_id *id) { struct gb_gpio_device *gb_gpio; struct gpio_chip *gpio; @@ -87,7 +88,7 @@ static int gpio_gb_probe(struct greybus_device *gdev, const struct greybus_devic return 0; } -static void gpio_gb_disconnect(struct greybus_device *gdev) +void gb_gpio_disconnect(struct greybus_device *gdev) { struct gb_gpio_device *gb_gpio_dev; @@ -96,9 +97,10 @@ static void gpio_gb_disconnect(struct greybus_device *gdev) gpiochip_remove(&gb_gpio_dev->chip); } +#if 0 static struct greybus_driver gpio_gb_driver = { - .probe = gpio_gb_probe, - .disconnect = gpio_gb_disconnect, + .probe = gb_gpio_probe, + .disconnect = gb_gpio_disconnect, .id_table = id_table, }; @@ -106,3 +108,4 @@ module_greybus_driver(gpio_gb_driver); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Greybus GPIO driver"); MODULE_AUTHOR("Greg Kroah-Hartman "); +#endif diff --git a/drivers/staging/greybus/greybus.h b/drivers/staging/greybus/greybus.h index 3137668..2440342a 100644 --- a/drivers/staging/greybus/greybus.h +++ b/drivers/staging/greybus/greybus.h @@ -109,7 +109,15 @@ struct greybus_device { */ int gb_i2c_probe(struct greybus_device *gdev, const struct greybus_device_id *id); void gb_i2c_disconnect(struct greybus_device *gdev); - +int gb_gpio_probe(struct greybus_device *gdev, const struct greybus_device_id *id); +void gb_gpio_disconnect(struct greybus_device *gdev); +int gb_sdio_probe(struct greybus_device *gdev, const struct greybus_device_id *id); +void gb_sdio_disconnect(struct greybus_device *gdev); +int gb_tty_probe(struct greybus_device *gdev, const struct greybus_device_id *id); +void gb_tty_disconnect(struct greybus_device *gdev); + +int gb_tty_init(void); +void gb_tty_exit(void); struct gbuf *greybus_alloc_gbuf(struct greybus_device *gdev, struct cport *cport, diff --git a/drivers/staging/greybus/sdio-gb.c b/drivers/staging/greybus/sdio-gb.c index 8521b06..9f7b44d 100644 --- a/drivers/staging/greybus/sdio-gb.c +++ b/drivers/staging/greybus/sdio-gb.c @@ -45,7 +45,8 @@ static const struct mmc_host_ops gb_sd_ops = { .get_ro = gb_sd_get_ro, }; -static int sd_gb_probe(struct greybus_device *gdev, const struct greybus_device_id *id) +int gb_sdio_probe(struct greybus_device *gdev, + const struct greybus_device_id *id) { struct mmc_host *mmc; struct gb_sdio_host *host; @@ -64,7 +65,7 @@ static int sd_gb_probe(struct greybus_device *gdev, const struct greybus_device_ return 0; } -static void sd_gb_disconnect(struct greybus_device *gdev) +void gb_sdio_disconnect(struct greybus_device *gdev) { struct mmc_host *mmc; struct gb_sdio_host *host; @@ -76,9 +77,10 @@ static void sd_gb_disconnect(struct greybus_device *gdev) mmc_free_host(mmc); } +#if 0 static struct greybus_driver sd_gb_driver = { - .probe = sd_gb_probe, - .disconnect = sd_gb_disconnect, + .probe = gb_sdio_probe, + .disconnect = gb_sdio_disconnect, .id_table = id_table, }; @@ -86,3 +88,4 @@ module_greybus_driver(sd_gb_driver); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Greybus SD/MMC Host driver"); MODULE_AUTHOR("Greg Kroah-Hartman "); +#endif diff --git a/drivers/staging/greybus/uart-gb.c b/drivers/staging/greybus/uart-gb.c index 839ea2d..cdb4a82 100644 --- a/drivers/staging/greybus/uart-gb.c +++ b/drivers/staging/greybus/uart-gb.c @@ -382,7 +382,8 @@ static const struct tty_operations gb_ops = { }; -static int tty_gb_probe(struct greybus_device *gdev, const struct greybus_device_id *id) +int gb_tty_probe(struct greybus_device *gdev, + const struct greybus_device_id *id) { struct gb_tty *gb_tty; struct device *tty_dev; @@ -427,7 +428,7 @@ error: return retval; } -static void tty_gb_disconnect(struct greybus_device *gdev) +void gb_tty_disconnect(struct greybus_device *gdev) { struct gb_tty *gb_tty = greybus_get_drvdata(gdev); struct tty_struct *tty; @@ -457,13 +458,13 @@ static void tty_gb_disconnect(struct greybus_device *gdev) } static struct greybus_driver tty_gb_driver = { - .probe = tty_gb_probe, - .disconnect = tty_gb_disconnect, + .probe = gb_tty_probe, + .disconnect = gb_tty_disconnect, .id_table = id_table, }; -static int __init gb_tty_init(void) +int __init gb_tty_init(void) { int retval; @@ -496,14 +497,16 @@ static int __init gb_tty_init(void) return retval; } -static void __exit gb_tty_exit(void) +void __exit gb_tty_exit(void) { greybus_deregister(&tty_gb_driver); tty_unregister_driver(gb_tty_driver); put_tty_driver(gb_tty_driver); } +#if 0 module_init(gb_tty_init); module_exit(gb_tty_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Greg Kroah-Hartman "); +#endif -- 2.7.4