generic: rtl8367: allow to load extif config from OF

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>

SVN-Revision: 36220
lede-17.01
Gabor Juhos 2013-04-06 12:37:36 +00:00
parent 585d19d168
commit 38bd9b4337
1 changed files with 61 additions and 6 deletions

View File

@ -1073,6 +1073,51 @@ static int rtl8367_led_blinkrate_set(struct rtl8366_smi *smi, unsigned int rate)
return 0; return 0;
} }
#ifdef CONFIG_OF
static int rtl8367_extif_init_of(struct rtl8366_smi *smi, int id,
const char *name)
{
struct rtl8367_extif_config *cfg;
const __be32 *prop;
int size;
int err;
prop = of_get_property(smi->parent->of_node, name, &size);
if (!prop)
return rtl8367_extif_init(smi, id, NULL);
if (size != (9 * sizeof(*prop))) {
dev_err(smi->parent, "%s property is invalid\n", name);
return -EINVAL;
}
cfg = kzalloc(sizeof(struct rtl8367_extif_config), GFP_KERNEL);
if (!cfg)
return -ENOMEM;
cfg->txdelay = be32_to_cpup(prop++);
cfg->rxdelay = be32_to_cpup(prop++);
cfg->mode = be32_to_cpup(prop++);
cfg->ability.force_mode = be32_to_cpup(prop++);
cfg->ability.txpause = be32_to_cpup(prop++);
cfg->ability.rxpause = be32_to_cpup(prop++);
cfg->ability.link = be32_to_cpup(prop++);
cfg->ability.duplex = be32_to_cpup(prop++);
cfg->ability.speed = be32_to_cpup(prop++);
err = rtl8367_extif_init(smi, id, cfg);
kfree(cfg);
return err;
}
#else
static int rtl8367_extif_init_of(struct rtl8366_smi *smi, int id,
const char *name)
{
return -EINVAL;
}
#endif
static int rtl8367_setup(struct rtl8366_smi *smi) static int rtl8367_setup(struct rtl8366_smi *smi)
{ {
struct rtl8367_platform_data *pdata; struct rtl8367_platform_data *pdata;
@ -1086,13 +1131,23 @@ static int rtl8367_setup(struct rtl8366_smi *smi)
return err; return err;
/* initialize external interfaces */ /* initialize external interfaces */
err = rtl8367_extif_init(smi, 0, pdata->extif0_cfg); if (smi->parent->of_node) {
if (err) err = rtl8367_extif_init_of(smi, 0, "realtek,extif0");
return err; if (err)
return err;
err = rtl8367_extif_init(smi, 1, pdata->extif1_cfg); err = rtl8367_extif_init_of(smi, 1, "realtek,extif1");
if (err) if (err)
return err; return err;
} else {
err = rtl8367_extif_init(smi, 0, pdata->extif0_cfg);
if (err)
return err;
err = rtl8367_extif_init(smi, 1, pdata->extif1_cfg);
if (err)
return err;
}
/* set maximum packet length to 1536 bytes */ /* set maximum packet length to 1536 bytes */
REG_RMW(smi, RTL8367_SWC0_REG, RTL8367_SWC0_MAX_LENGTH_MASK, REG_RMW(smi, RTL8367_SWC0_REG, RTL8367_SWC0_MAX_LENGTH_MASK,