diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2015-10-07 01:01:06 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2015-10-07 01:01:06 +0200 |
commit | 8a83eca779ad6b8861f5a88e32b45a87f37ae7f4 (patch) | |
tree | 3232b6cba1ef1698208ee8fb0621c1d02149fc2e /drivers | |
parent | ddd7031b979390f7872d981accd0d22d85eeee48 (diff) | |
parent | 329db2f586c4125fc0255f1e111dae7602e9845b (diff) | |
download | barebox-8a83eca779ad6b8861f5a88e32b45a87f37ae7f4.tar.gz barebox-8a83eca779ad6b8861f5a88e32b45a87f37ae7f4.tar.xz |
Merge branch 'for-next/mci'
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ata/intf_platform_ide.c | 30 | ||||
-rw-r--r-- | drivers/mci/mci-core.c | 25 |
2 files changed, 48 insertions, 7 deletions
diff --git a/drivers/ata/intf_platform_ide.c b/drivers/ata/intf_platform_ide.c index 0d392d8d4a..d0f7984a2c 100644 --- a/drivers/ata/intf_platform_ide.c +++ b/drivers/ata/intf_platform_ide.c @@ -29,6 +29,7 @@ #include <ata_drive.h> #include <platform_ide.h> #include <linux/err.h> +#include <of.h> /** * Setup the register specific addresses for an ATA like divice @@ -85,8 +86,18 @@ static int platform_ide_probe(struct device_d *dev) void *reg_base, *alt_base = NULL; struct resource *reg, *alt; int mmio = 0; - - if (pdata == NULL) { + struct device_node *dn = dev->device_node; + u32 ioport_shift = 0; + int dataif_be = 0; + void (*reset)(int) = NULL; + + if (pdata) { + ioport_shift = pdata->ioport_shift; + dataif_be = pdata->dataif_be; + reset = pdata->reset; + } else if (dn) { + of_property_read_u32(dn, "reg-shift", &ioport_shift); + } else { dev_err(dev, "No platform data. Cannot continue\n"); return -EINVAL; } @@ -123,9 +134,9 @@ static int platform_ide_probe(struct device_d *dev) ide = xzalloc(sizeof(*ide)); ide->io.mmio = mmio; - platform_ide_setup_port(reg_base, alt_base, &ide->io, pdata->ioport_shift); - ide->io.reset = pdata->reset; - ide->io.dataif_be = pdata->dataif_be; + platform_ide_setup_port(reg_base, alt_base, &ide->io, ioport_shift); + ide->io.reset = reset; + ide->io.dataif_be = dataif_be; rc = ide_port_register(ide); if (rc != 0) { @@ -136,9 +147,18 @@ static int platform_ide_probe(struct device_d *dev) return rc; } +static __maybe_unused struct of_device_id platform_ide_dt_ids[] = { + { + .compatible = "ata-generic", + }, { + /* sentinel */ + } +}; + static struct driver_d platform_ide_driver = { .name = "ide_intf", .probe = platform_ide_probe, + .of_compatible = DRV_OF_COMPAT(platform_ide_dt_ids), }; device_platform_driver(platform_ide_driver); diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c index bd5cae2cea..90001153d7 100644 --- a/drivers/mci/mci-core.c +++ b/drivers/mci/mci-core.c @@ -53,6 +53,8 @@ __res & __mask; \ }) +LIST_HEAD(mci_list); + /** * @file * @brief Memory Card framework @@ -370,7 +372,7 @@ static int mmc_send_op_cond(struct mci *mci) * Note: Only cards newer than Version 1.1 (Physical Layer Spec) support * this command */ -static int mci_send_ext_csd(struct mci *mci, char *ext_csd) +int mci_send_ext_csd(struct mci *mci, char *ext_csd) { struct mci_cmd cmd; struct mci_data data; @@ -394,7 +396,7 @@ static int mci_send_ext_csd(struct mci *mci, char *ext_csd) * @param value FIXME * @return Transaction status (0 on success) */ -static int mci_switch(struct mci *mci, unsigned set, unsigned index, +int mci_switch(struct mci *mci, unsigned set, unsigned index, unsigned value) { struct mci_cmd cmd; @@ -650,6 +652,9 @@ retry_scr: if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000) mci->card_caps |= MMC_CAP_SD_HIGHSPEED; + if (mci_caps(mci) & MMC_CAP_SD_HIGHSPEED) + mci->tran_speed = 50000000; + return 0; } @@ -1787,6 +1792,8 @@ int mci_register(struct mci_host *host) if (IS_ENABLED(CONFIG_MCI_STARTUP)) mci_card_probe(mci); + list_add_tail(&mci->list, &mci_list); + return 0; err_unregister: @@ -1844,3 +1851,17 @@ void mci_of_parse(struct mci_host *host) host->non_removable = of_property_read_bool(np, "non-removable"); } + +struct mci *mci_get_device_by_name(const char *name) +{ + struct mci *mci; + + list_for_each_entry(mci, &mci_list, list) { + if (!mci->cdevname) + continue; + if (!strcmp(mci->cdevname, name)) + return mci; + } + + return NULL; +} |