|
@@ -2117,6 +2117,7 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host)
|
|
|
struct device_node *np = dev->of_node;
|
|
|
const struct dw_mci_drv_data *drv_data = host->drv_data;
|
|
|
int idx, ret;
|
|
|
+ u32 clock_frequency;
|
|
|
|
|
|
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
|
|
|
if (!pdata) {
|
|
@@ -2143,6 +2144,9 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host)
|
|
|
|
|
|
of_property_read_u32(np, "card-detect-delay", &pdata->detect_delay_ms);
|
|
|
|
|
|
+ if (!of_property_read_u32(np, "clock-frequency", &clock_frequency))
|
|
|
+ pdata->bus_hz = clock_frequency;
|
|
|
+
|
|
|
if (drv_data && drv_data->parse_dt) {
|
|
|
ret = drv_data->parse_dt(host);
|
|
|
if (ret)
|
|
@@ -2200,18 +2204,23 @@ int dw_mci_probe(struct dw_mci *host)
|
|
|
host->ciu_clk = devm_clk_get(host->dev, "ciu");
|
|
|
if (IS_ERR(host->ciu_clk)) {
|
|
|
dev_dbg(host->dev, "ciu clock not available\n");
|
|
|
+ host->bus_hz = host->pdata->bus_hz;
|
|
|
} else {
|
|
|
ret = clk_prepare_enable(host->ciu_clk);
|
|
|
if (ret) {
|
|
|
dev_err(host->dev, "failed to enable ciu clock\n");
|
|
|
goto err_clk_biu;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if (IS_ERR(host->ciu_clk))
|
|
|
- host->bus_hz = host->pdata->bus_hz;
|
|
|
- else
|
|
|
+ if (host->pdata->bus_hz) {
|
|
|
+ ret = clk_set_rate(host->ciu_clk, host->pdata->bus_hz);
|
|
|
+ if (ret)
|
|
|
+ dev_warn(host->dev,
|
|
|
+ "Unable to set bus rate to %ul\n",
|
|
|
+ host->pdata->bus_hz);
|
|
|
+ }
|
|
|
host->bus_hz = clk_get_rate(host->ciu_clk);
|
|
|
+ }
|
|
|
|
|
|
if (drv_data && drv_data->setup_clock) {
|
|
|
ret = drv_data->setup_clock(host);
|