From 83ddaaab01c2ababbcaa507a3ecaa80499cf000f Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 11 Aug 2014 17:27:22 +0800 Subject: [PATCH] greybus: Greybus SD/MMC host driver Need to add specifics, but this should be enough to hook up to the mmc framework. --- drivers/staging/greybus/Makefile | 1 + drivers/staging/greybus/sdio-gb.c | 88 +++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 drivers/staging/greybus/sdio-gb.c diff --git a/drivers/staging/greybus/Makefile b/drivers/staging/greybus/Makefile index 432ad4c72863..753436d94f1f 100644 --- a/drivers/staging/greybus/Makefile +++ b/drivers/staging/greybus/Makefile @@ -2,6 +2,7 @@ greybus-y := core.o obj-m += greybus.o obj-m += i2c-gb.o +obj-m += sdio-gb.o KERNELVER ?= $(shell uname -r) KERNELDIR ?= /lib/modules/$(KERNELVER)/build diff --git a/drivers/staging/greybus/sdio-gb.c b/drivers/staging/greybus/sdio-gb.c new file mode 100644 index 000000000000..f92ab1b7438a --- /dev/null +++ b/drivers/staging/greybus/sdio-gb.c @@ -0,0 +1,88 @@ +/* + * SD/MMC Greybus driver. + * + * Copyright 2014 Google Inc. + * + * Released under the GPLv2 only. + */ + +#include +#include +#include +#include +#include "greybus.h" + +struct sd_gb_host { + struct mmc_host *mmc; + struct mmc_request *mrq; + // FIXME - some lock? +}; + +static const struct greybus_device_id id_table[] = { + { GREYBUS_DEVICE(0x43, 0x43) }, /* make shit up */ + { }, /* terminating NULL entry */ +}; + +static void gb_sd_request(struct mmc_host *mmc, struct mmc_request *mrq) +{ + // FIXME - do something here... +} + +static void gb_sd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) +{ + // FIXME - do something here... +} + +static int gb_sd_get_ro(struct mmc_host *mmc) +{ + // FIXME - do something here... + return 0; +} + +static const struct mmc_host_ops gb_sd_ops = { + .request = gb_sd_request, + .set_ios = gb_sd_set_ios, + .get_ro = gb_sd_get_ro, +}; + +static int sd_gb_probe(struct greybus_device *gdev, const struct greybus_device_id *id) +{ + struct mmc_host *mmc; + struct sd_gb_host *host; + + mmc = mmc_alloc_host(sizeof(struct sd_gb_host), &gdev->dev); + if (!mmc) + return -ENOMEM; + + host = mmc_priv(mmc); + host->mmc = mmc; + + mmc->ops = &gb_sd_ops; + // FIXME - set up size limits we can handle. + + greybus_set_drvdata(gdev, host); + return 0; +} + +static void sd_gb_disconnect(struct greybus_device *gdev) +{ + struct mmc_host *mmc; + struct sd_gb_host *host; + + host = greybus_get_drvdata(gdev); + mmc = host->mmc; + + mmc_remove_host(mmc); + mmc_free_host(mmc); +} + +static struct greybus_driver sd_gb_driver = { + .probe = sd_gb_probe, + .disconnect = sd_gb_disconnect, + .id_table = id_table, +}; + +module_greybus_driver(sd_gb_driver); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Greybus SD/MMC Host driver"); +MODULE_AUTHOR("Greg Kroah-Hartman "); -- 2.39.2