Source
101
101
#define OMAP_USBTLL_REV3 0x00000004 /* OMAP4 */
102
102
#define OMAP_USBTLL_REV4 0x00000006 /* OMAP5 */
103
103
104
104
#define is_ehci_tll_mode(x) (x == OMAP_EHCI_PORT_MODE_TLL)
105
105
106
106
/* only PHY and UNUSED modes don't need TLL */
107
107
#define omap_usb_mode_needs_tll(x) ((x) != OMAP_USBHS_PORT_MODE_UNUSED &&\
108
108
(x) != OMAP_EHCI_PORT_MODE_PHY)
109
109
110
110
struct usbtll_omap {
111
-
int nch; /* num. of channels */
112
-
struct clk **ch_clk;
113
-
void __iomem *base;
111
+
void __iomem *base;
112
+
int nch; /* num. of channels */
113
+
struct clk *ch_clk[0]; /* must be the last member */
114
114
};
115
115
116
116
/*-------------------------------------------------------------------------*/
117
117
118
118
static const char usbtll_driver_name[] = USBTLL_DRIVER_NAME;
119
119
static struct device *tll_dev;
120
120
static DEFINE_SPINLOCK(tll_lock); /* serialize access to tll_dev */
121
121
122
122
/*-------------------------------------------------------------------------*/
123
123
209
209
/**
210
210
* usbtll_omap_probe - initialize TI-based HCDs
211
211
*
212
212
* Allocates basic resources for this USB host controller.
213
213
*/
214
214
static int usbtll_omap_probe(struct platform_device *pdev)
215
215
{
216
216
struct device *dev = &pdev->dev;
217
217
struct resource *res;
218
218
struct usbtll_omap *tll;
219
-
int ret = 0;
220
-
int i, ver;
219
+
void __iomem *base;
220
+
int i, nch, ver;
221
221
222
222
dev_dbg(dev, "starting TI HSUSB TLL Controller\n");
223
223
224
-
tll = devm_kzalloc(dev, sizeof(struct usbtll_omap), GFP_KERNEL);
225
-
if (!tll) {
226
-
dev_err(dev, "Memory allocation failed\n");
227
-
return -ENOMEM;
228
-
}
229
-
230
224
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
231
-
tll->base = devm_ioremap_resource(dev, res);
232
-
if (IS_ERR(tll->base))
233
-
return PTR_ERR(tll->base);
225
+
base = devm_ioremap_resource(dev, res);
226
+
if (IS_ERR(base))
227
+
return PTR_ERR(base);
234
228
235
-
platform_set_drvdata(pdev, tll);
236
229
pm_runtime_enable(dev);
237
230
pm_runtime_get_sync(dev);
238
231
239
-
ver = usbtll_read(tll->base, OMAP_USBTLL_REVISION);
232
+
ver = usbtll_read(base, OMAP_USBTLL_REVISION);
240
233
switch (ver) {
241
234
case OMAP_USBTLL_REV1:
242
235
case OMAP_USBTLL_REV4:
243
-
tll->nch = OMAP_TLL_CHANNEL_COUNT;
236
+
nch = OMAP_TLL_CHANNEL_COUNT;
244
237
break;
245
238
case OMAP_USBTLL_REV2:
246
239
case OMAP_USBTLL_REV3:
247
-
tll->nch = OMAP_REV2_TLL_CHANNEL_COUNT;
240
+
nch = OMAP_REV2_TLL_CHANNEL_COUNT;
248
241
break;
249
242
default:
250
-
tll->nch = OMAP_TLL_CHANNEL_COUNT;
251
-
dev_dbg(dev,
252
-
"USB TLL Rev : 0x%x not recognized, assuming %d channels\n",
253
-
ver, tll->nch);
243
+
nch = OMAP_TLL_CHANNEL_COUNT;
244
+
dev_dbg(dev, "rev 0x%x not recognized, assuming %d channels\n",
245
+
ver, nch);
254
246
break;
255
247
}
256
248
257
-
tll->ch_clk = devm_kzalloc(dev, sizeof(struct clk *) * tll->nch,
258
-
GFP_KERNEL);
259
-
if (!tll->ch_clk) {
260
-
ret = -ENOMEM;
261
-
dev_err(dev, "Couldn't allocate memory for channel clocks\n");
262
-
goto err_clk_alloc;
249
+
tll = devm_kzalloc(dev, sizeof(*tll) + sizeof(tll->ch_clk[nch]),
250
+
GFP_KERNEL);
251
+
if (!tll) {
252
+
pm_runtime_put_sync(dev);
253
+
pm_runtime_disable(dev);
254
+
return -ENOMEM;
263
255
}
264
256
265
-
for (i = 0; i < tll->nch; i++) {
257
+
tll->base = base;
258
+
tll->nch = nch;
259
+
platform_set_drvdata(pdev, tll);
260
+
261
+
for (i = 0; i < nch; i++) {
266
262
char clkname[] = "usb_tll_hs_usb_chx_clk";
267
263
268
264
snprintf(clkname, sizeof(clkname),
269
265
"usb_tll_hs_usb_ch%d_clk", i);
270
266
tll->ch_clk[i] = clk_get(dev, clkname);
271
267
272
268
if (IS_ERR(tll->ch_clk[i]))
273
269
dev_dbg(dev, "can't get clock : %s\n", clkname);
274
270
else
275
271
clk_prepare(tll->ch_clk[i]);
276
272
}
277
273
278
274
pm_runtime_put_sync(dev);
279
275
/* only after this can omap_tll_enable/disable work */
280
276
spin_lock(&tll_lock);
281
277
tll_dev = dev;
282
278
spin_unlock(&tll_lock);
283
279
284
280
return 0;
285
-
286
-
err_clk_alloc:
287
-
pm_runtime_put_sync(dev);
288
-
pm_runtime_disable(dev);
289
-
290
-
return ret;
291
281
}
292
282
293
283
/**
294
284
* usbtll_omap_remove - shutdown processing for UHH & TLL HCDs
295
285
* @pdev: USB Host Controller being removed
296
286
*
297
287
* Reverses the effect of usbtll_omap_probe().
298
288
*/
299
289
static int usbtll_omap_remove(struct platform_device *pdev)
300
290
{