MMC: Use the device ID implied from device tree

Signed-off-by: Fan Bin <tombinfan@tencent.com>
This commit is contained in:
Fan Bin 2019-12-03 15:26:22 +08:00 committed by Xiaoming Gao
parent f030ef831c
commit 314bf3d4ba
5 changed files with 108 additions and 0 deletions

View File

@ -58,6 +58,10 @@
static const unsigned freqs[] = { 400000, 300000, 200000, 100000 };
#ifdef CONFIG_ARCH_MXC
static int __mmc_max_reserved_idx = -1;
#endif
/*
* Enabling software CRCs on the data blocks can be a significant (30%)
* performance cost, and for other reasons may not always be desired.
@ -2810,10 +2814,50 @@ void mmc_init_context_info(struct mmc_host *host)
init_waitqueue_head(&host->context_info.wait);
}
#ifdef CONFIG_ARCH_MXC
/*
* mmc_first_nonreserved_index() - get the first index that
* is not reserved
*/
int mmc_first_nonreserved_index(void)
{
return __mmc_max_reserved_idx + 1;
}
EXPORT_SYMBOL(mmc_first_nonreserved_index);
/*
* mmc_get_reserved_index() - get the index reserved for this host
* Return: The index reserved for this host or negative error value
* if no index is reserved for this host
*/
int mmc_get_reserved_index(struct mmc_host *host)
{
return of_alias_get_id(host->parent->of_node, "mmc");
}
EXPORT_SYMBOL(mmc_get_reserved_index);
static void mmc_of_reserve_idx(void)
{
int max;
max = of_alias_max_index("mmc");
if (max < 0)
return;
__mmc_max_reserved_idx = max;
pr_debug("MMC: reserving %d slots for of aliases\n",
__mmc_max_reserved_idx + 1);
}
#endif
static int __init mmc_init(void)
{
int ret;
#ifdef CONFIG_ARCH_MXC
mmc_of_reserve_idx();
#endif
ret = mmc_register_bus();
if (ret)
return ret;

View File

@ -80,6 +80,11 @@ int mmc_attach_mmc(struct mmc_host *host);
int mmc_attach_sd(struct mmc_host *host);
int mmc_attach_sdio(struct mmc_host *host);
#ifdef CONFIG_ARCH_MXC
int mmc_first_nonreserved_index(void);
int mmc_get_reserved_index(struct mmc_host *host);
#endif
/* Module parameters */
extern bool use_spi_crc;

View File

@ -349,6 +349,9 @@ EXPORT_SYMBOL(mmc_of_parse);
struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
{
int err;
#ifdef CONFIG_ARCH_MXC
int alias_id;
#endif
struct mmc_host *host;
host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
@ -357,8 +360,20 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
/* scanning will be enabled when we're ready */
host->rescan_disable = 1;
#ifdef CONFIG_ARCH_MXC
host->parent = dev;
alias_id = mmc_get_reserved_index(host);
if (alias_id >= 0)
err = ida_simple_get(&mmc_host_ida, alias_id,
alias_id + 1, GFP_KERNEL);
else
err = ida_simple_get(&mmc_host_ida,
mmc_first_nonreserved_index(),
0, GFP_KERNEL);
#else
err = ida_simple_get(&mmc_host_ida, 0, 0, GFP_KERNEL);
#endif
if (err < 0) {
kfree(host);
return NULL;
@ -368,7 +383,9 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
dev_set_name(&host->class_dev, "mmc%d", host->index);
#if !defined(CONFIG_ARCH_MXC)
host->parent = dev;
#endif
host->class_dev.parent = dev;
host->class_dev.class = &mmc_host_class;
device_initialize(&host->class_dev);

View File

@ -1666,6 +1666,38 @@ static void of_alias_add(struct alias_prop *ap, struct device_node *np,
ap->alias, ap->stem, ap->id, np);
}
#ifdef CONFIG_ARCH_MXC
/*
* of_alias_max_index() - get the maximum index for a given alias stem
* @stem: The alias stem for which the maximum index is searched for
*
* Given an alias stem (the alias without the number) this function
* returns the maximum number for which an alias exists.
*
* Return: The maximum existing alias index or -ENODEV if no alias
* exists for this stem.
*/
int of_alias_max_index(const char *stem)
{
struct alias_prop *app;
int max = -ENODEV;
mutex_lock(&of_mutex);
list_for_each_entry(app, &aliases_lookup, link) {
if (strcmp(app->stem, stem))
continue;
if (app->id > max)
max = app->id;
}
mutex_unlock(&of_mutex);
return max;
}
EXPORT_SYMBOL_GPL(of_alias_max_index);
#endif
/**
* of_alias_scan - Scan all properties of the 'aliases' node
*

View File

@ -384,6 +384,9 @@ extern int of_phandle_iterator_args(struct of_phandle_iterator *it,
extern void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align));
extern int of_alias_get_id(struct device_node *np, const char *stem);
extern int of_alias_get_highest_id(const char *stem);
#ifdef CONFIG_ARCH_MXC
extern int of_alias_max_index(const char *stem);
#endif
extern int of_machine_is_compatible(const char *compat);
@ -826,6 +829,13 @@ static inline int of_alias_get_highest_id(const char *stem)
return -ENOSYS;
}
#ifdef CONFIG_ARCH_MXC
static inline int of_alias_max_index(const char *stem)
{
return -ENODEV;
}
#endif
static inline int of_machine_is_compatible(const char *compat)
{
return 0;