Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 1 | /* |
| 2 | * SD/MMC Greybus driver. |
| 3 | * |
| 4 | * Copyright 2014 Google Inc. |
Alex Elder | a46e967 | 2014-12-12 12:08:42 -0600 | [diff] [blame] | 5 | * Copyright 2014 Linaro Ltd. |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 6 | * |
| 7 | * Released under the GPLv2 only. |
| 8 | */ |
| 9 | |
| 10 | #include <linux/kernel.h> |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 11 | #include <linux/slab.h> |
| 12 | #include <linux/mmc/host.h> |
Alex Elder | e1e9dbd | 2014-10-01 21:54:11 -0500 | [diff] [blame] | 13 | |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 14 | #include "greybus.h" |
| 15 | |
Greg Kroah-Hartman | 199d68d | 2014-08-30 16:20:22 -0700 | [diff] [blame] | 16 | struct gb_sdio_host { |
Greg Kroah-Hartman | a2f4763 | 2014-10-28 10:17:09 +0800 | [diff] [blame] | 17 | struct gb_connection *connection; |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 18 | struct mmc_host *mmc; |
| 19 | struct mmc_request *mrq; |
| 20 | // FIXME - some lock? |
| 21 | }; |
| 22 | |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 23 | static void gb_sd_request(struct mmc_host *mmc, struct mmc_request *mrq) |
| 24 | { |
| 25 | // FIXME - do something here... |
| 26 | } |
| 27 | |
| 28 | static void gb_sd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) |
| 29 | { |
| 30 | // FIXME - do something here... |
| 31 | } |
| 32 | |
| 33 | static int gb_sd_get_ro(struct mmc_host *mmc) |
| 34 | { |
| 35 | // FIXME - do something here... |
| 36 | return 0; |
| 37 | } |
| 38 | |
| 39 | static const struct mmc_host_ops gb_sd_ops = { |
| 40 | .request = gb_sd_request, |
| 41 | .set_ios = gb_sd_set_ios, |
| 42 | .get_ro = gb_sd_get_ro, |
| 43 | }; |
| 44 | |
Greg Kroah-Hartman | a2f4763 | 2014-10-28 10:17:09 +0800 | [diff] [blame] | 45 | static int gb_sdio_connection_init(struct gb_connection *connection) |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 46 | { |
| 47 | struct mmc_host *mmc; |
Greg Kroah-Hartman | 199d68d | 2014-08-30 16:20:22 -0700 | [diff] [blame] | 48 | struct gb_sdio_host *host; |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 49 | |
Viresh Kumar | 64e6929 | 2014-11-19 17:24:58 +0530 | [diff] [blame] | 50 | mmc = mmc_alloc_host(sizeof(*host), &connection->dev); |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 51 | if (!mmc) |
| 52 | return -ENOMEM; |
| 53 | |
| 54 | host = mmc_priv(mmc); |
| 55 | host->mmc = mmc; |
| 56 | |
| 57 | mmc->ops = &gb_sd_ops; |
| 58 | // FIXME - set up size limits we can handle. |
Greg Kroah-Hartman | a2f4763 | 2014-10-28 10:17:09 +0800 | [diff] [blame] | 59 | // FIXME - register the host controller. |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 60 | |
Greg Kroah-Hartman | a2f4763 | 2014-10-28 10:17:09 +0800 | [diff] [blame] | 61 | host->connection = connection; |
| 62 | connection->private = host; |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 63 | return 0; |
| 64 | } |
| 65 | |
Greg Kroah-Hartman | a2f4763 | 2014-10-28 10:17:09 +0800 | [diff] [blame] | 66 | static void gb_sdio_connection_exit(struct gb_connection *connection) |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 67 | { |
| 68 | struct mmc_host *mmc; |
Greg Kroah-Hartman | 199d68d | 2014-08-30 16:20:22 -0700 | [diff] [blame] | 69 | struct gb_sdio_host *host; |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 70 | |
Greg Kroah-Hartman | a2f4763 | 2014-10-28 10:17:09 +0800 | [diff] [blame] | 71 | host = connection->private; |
Alex Elder | 051fb04 | 2014-10-16 06:35:24 -0500 | [diff] [blame] | 72 | if (!host) |
| 73 | return; |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 74 | |
Alex Elder | 051fb04 | 2014-10-16 06:35:24 -0500 | [diff] [blame] | 75 | mmc = host->mmc; |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 76 | mmc_remove_host(mmc); |
| 77 | mmc_free_host(mmc); |
Greg Kroah-Hartman | a2f4763 | 2014-10-28 10:17:09 +0800 | [diff] [blame] | 78 | connection->private = NULL; |
Greg Kroah-Hartman | 83ddaaa | 2014-08-11 17:27:22 +0800 | [diff] [blame] | 79 | } |
| 80 | |
Alex Elder | 19d03de | 2014-11-05 16:12:53 -0600 | [diff] [blame] | 81 | static struct gb_protocol sdio_protocol = { |
Greg Kroah-Hartman | 7422a1e | 2014-12-24 13:01:45 -0800 | [diff] [blame] | 82 | .name = "sdio", |
Alex Elder | 19d03de | 2014-11-05 16:12:53 -0600 | [diff] [blame] | 83 | .id = GREYBUS_PROTOCOL_SDIO, |
| 84 | .major = 0, |
| 85 | .minor = 1, |
Alex Elder | 5d9fd7e | 2014-11-05 16:12:54 -0600 | [diff] [blame] | 86 | .connection_init = gb_sdio_connection_init, |
| 87 | .connection_exit = gb_sdio_connection_exit, |
Alex Elder | f8fb05e | 2014-11-05 16:12:55 -0600 | [diff] [blame] | 88 | .request_recv = NULL, /* no incoming requests */ |
Alex Elder | 19d03de | 2014-11-05 16:12:53 -0600 | [diff] [blame] | 89 | }; |
| 90 | |
Viresh Kumar | bdac599 | 2015-05-20 17:20:10 +0530 | [diff] [blame] | 91 | gb_gpbridge_protocol_driver(sdio_protocol); |