MLK-17621-2 mmc: add feature of setting slot index via devicetree alias
Add feature of setting slot index via devicetree alias, to hard code the mmc/sd root device. The patch requires additional alias_id fix or it won't work. Note: minor device number keep independent with this device alias. Refer to the commit 35928d6c6a76 ("mmc: Allow setting slot index via devicetree alias"). Acked-by: Leonard Crestez <leonard.crestez@nxp.com> Reviewed-by: Dong Aisheng <aisheng.dong@nxp.com> Signed-off-by: Haibo Chen <haibo.chen@nxp.com>pull/10/head
parent
25573e1de5
commit
1fb5c90b78
|
@ -58,6 +58,8 @@
|
|||
|
||||
static const unsigned freqs[] = { 400000, 300000, 200000, 100000 };
|
||||
|
||||
static int __mmc_max_reserved_idx = -1;
|
||||
|
||||
/*
|
||||
* Enabling software CRCs on the data blocks can be a significant (30%)
|
||||
* performance cost, and for other reasons may not always be desired.
|
||||
|
@ -2975,10 +2977,46 @@ void mmc_init_context_info(struct mmc_host *host)
|
|||
init_waitqueue_head(&host->context_info.wait);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
static int __init mmc_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mmc_of_reserve_idx();
|
||||
|
||||
ret = mmc_register_bus();
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
@ -82,6 +82,8 @@ int mmc_attach_mmc(struct mmc_host *host);
|
|||
int mmc_attach_sd(struct mmc_host *host);
|
||||
int mmc_attach_sdio(struct mmc_host *host);
|
||||
|
||||
int mmc_first_nonreserved_index(void);
|
||||
int mmc_get_reserved_index(struct mmc_host *host);
|
||||
/* Module parameters */
|
||||
extern bool use_spi_crc;
|
||||
|
||||
|
|
|
@ -348,6 +348,7 @@ EXPORT_SYMBOL(mmc_of_parse);
|
|||
struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
|
||||
{
|
||||
int err;
|
||||
int alias_id;
|
||||
struct mmc_host *host;
|
||||
|
||||
host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
|
||||
|
@ -356,8 +357,16 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
|
|||
|
||||
/* scanning will be enabled when we're ready */
|
||||
host->rescan_disable = 1;
|
||||
host->parent = dev;
|
||||
|
||||
err = ida_simple_get(&mmc_host_ida, 0, 0, GFP_KERNEL);
|
||||
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);
|
||||
if (err < 0) {
|
||||
kfree(host);
|
||||
return NULL;
|
||||
|
@ -367,7 +376,6 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
|
|||
|
||||
dev_set_name(&host->class_dev, "mmc%d", host->index);
|
||||
|
||||
host->parent = dev;
|
||||
host->class_dev.parent = dev;
|
||||
host->class_dev.class = &mmc_host_class;
|
||||
device_initialize(&host->class_dev);
|
||||
|
|
|
@ -1641,6 +1641,36 @@ static void of_alias_add(struct alias_prop *ap, struct device_node *np,
|
|||
ap->alias, ap->stem, ap->id, np);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* of_alias_scan - Scan all properties of the 'aliases' node
|
||||
*
|
||||
|
|
|
@ -382,6 +382,7 @@ 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);
|
||||
extern int of_alias_max_index(const char *stem);
|
||||
|
||||
extern int of_machine_is_compatible(const char *compat);
|
||||
|
||||
|
@ -818,6 +819,11 @@ static inline int of_alias_get_highest_id(const char *stem)
|
|||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int of_alias_max_index(const char *stem)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int of_machine_is_compatible(const char *compat)
|
||||
{
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue