Source
134
134
printf("%s: Invalid DPLL parameters\n", __func__);
135
135
return -EINVAL;
136
136
}
137
137
138
138
val = omap_pipe3_readl(pipe3->pll_ctrl_base, PLL_CONFIGURATION1);
139
139
val &= ~PLL_REGN_MASK;
140
140
val |= dpll_params->n << PLL_REGN_SHIFT;
141
141
omap_pipe3_writel(pipe3->pll_ctrl_base, PLL_CONFIGURATION1, val);
142
142
143
143
val = omap_pipe3_readl(pipe3->pll_ctrl_base, PLL_CONFIGURATION2);
144
-
val &= ~PLL_SELFREQDCO_MASK;
144
+
val &= ~(PLL_SELFREQDCO_MASK | PLL_IDLE);
145
145
val |= dpll_params->freq << PLL_SELFREQDCO_SHIFT;
146
146
omap_pipe3_writel(pipe3->pll_ctrl_base, PLL_CONFIGURATION2, val);
147
147
148
148
val = omap_pipe3_readl(pipe3->pll_ctrl_base, PLL_CONFIGURATION1);
149
149
val &= ~PLL_REGM_MASK;
150
150
val |= dpll_params->m << PLL_REGM_SHIFT;
151
151
omap_pipe3_writel(pipe3->pll_ctrl_base, PLL_CONFIGURATION1, val);
152
152
153
153
val = omap_pipe3_readl(pipe3->pll_ctrl_base, PLL_CONFIGURATION4);
154
154
val &= ~PLL_REGM_F_MASK;
258
258
if ((val & PLL_TICOPWDN) && (val & PLL_LDOPWDN))
259
259
break;
260
260
} while (--timeout);
261
261
262
262
if (!(val & PLL_TICOPWDN) || !(val & PLL_LDOPWDN)) {
263
263
pr_err("%s: Failed to power down DPLL: PLL_STATUS 0x%x\n",
264
264
__func__, val);
265
265
return -EBUSY;
266
266
}
267
267
268
-
val = readl(pipe3->pll_reset_reg);
269
-
writel(val | SATA_PLL_SOFT_RESET, pipe3->pll_reset_reg);
270
-
mdelay(1);
271
-
writel(val & ~SATA_PLL_SOFT_RESET, pipe3->pll_reset_reg);
268
+
if (pipe3->pll_reset_reg) {
269
+
val = readl(pipe3->pll_reset_reg);
270
+
writel(val | SATA_PLL_SOFT_RESET, pipe3->pll_reset_reg);
271
+
mdelay(1);
272
+
writel(val & ~SATA_PLL_SOFT_RESET, pipe3->pll_reset_reg);
273
+
}
274
+
272
275
return 0;
273
276
}
274
277
275
278
static void *get_reg(struct udevice *dev, const char *name)
276
279
{
277
280
struct udevice *syscon;
278
281
struct regmap *regmap;
279
282
const fdt32_t *cell;
280
283
int len, err;
281
284
void *base;
324
327
pipe3->pll_ctrl_base = map_physmem(addr, sz, MAP_NOCACHE);
325
328
if (!pipe3->pll_ctrl_base) {
326
329
pr_err("unable to remap pll ctrl\n");
327
330
return -EINVAL;
328
331
}
329
332
330
333
pipe3->power_reg = get_reg(dev, "syscon-phy-power");
331
334
if (!pipe3->power_reg)
332
335
return -EINVAL;
333
336
334
-
pipe3->pll_reset_reg = get_reg(dev, "syscon-pllreset");
335
-
if (!pipe3->pll_reset_reg)
336
-
return -EINVAL;
337
+
if (device_is_compatible(dev, "ti,phy-pipe3-sata")) {
338
+
pipe3->pll_reset_reg = get_reg(dev, "syscon-pllreset");
339
+
if (!pipe3->pll_reset_reg)
340
+
return -EINVAL;
341
+
}
337
342
338
343
pipe3->dpll_map = (struct pipe3_dpll_map *)dev_get_driver_data(dev);
339
344
340
345
return 0;
341
346
}
342
347
343
348
static struct pipe3_dpll_map dpll_map_sata[] = {
344
349
{12000000, {1000, 7, 4, 6, 0} }, /* 12 MHz */
345
350
{16800000, {714, 7, 4, 6, 0} }, /* 16.8 MHz */
346
351
{19200000, {625, 7, 4, 6, 0} }, /* 19.2 MHz */
347
352
{20000000, {600, 7, 4, 6, 0} }, /* 20 MHz */
348
353
{26000000, {461, 7, 4, 6, 0} }, /* 26 MHz */
349
354
{38400000, {312, 7, 4, 6, 0} }, /* 38.4 MHz */
350
355
{ }, /* Terminator */
351
356
};
352
357
358
+
static struct pipe3_dpll_map dpll_map_usb[] = {
359
+
{12000000, {1250, 5, 4, 20, 0} }, /* 12 MHz */
360
+
{16800000, {3125, 20, 4, 20, 0} }, /* 16.8 MHz */
361
+
{19200000, {1172, 8, 4, 20, 65537} }, /* 19.2 MHz */
362
+
{20000000, {1000, 7, 4, 10, 0} }, /* 20 MHz */
363
+
{26000000, {1250, 12, 4, 20, 0} }, /* 26 MHz */
364
+
{38400000, {3125, 47, 4, 20, 92843} }, /* 38.4 MHz */
365
+
{ }, /* Terminator */
366
+
};
367
+
353
368
static const struct udevice_id pipe3_phy_ids[] = {
354
369
{ .compatible = "ti,phy-pipe3-sata", .data = (ulong)&dpll_map_sata },
370
+
{ .compatible = "ti,omap-usb3", .data = (ulong)&dpll_map_usb},
355
371
{ }
356
372
};
357
373
358
374
static struct phy_ops pipe3_phy_ops = {
359
375
.init = pipe3_init,
360
376
.power_on = pipe3_power_on,
361
377
.power_off = pipe3_power_off,
362
378
.exit = pipe3_exit,
363
379
};
364
380