57
57
58
58
#define MX6_BM_OVER_CUR_DIS BIT(7)
59
59
60
+ #define VF610_OVER_CUR_DIS BIT(7)
61
+
60
62
struct usbmisc_ops {
61
63
/* It's called once when probe a usb device */
62
64
int (* init )(struct imx_usbmisc_data * data );
@@ -71,10 +73,9 @@ struct imx_usbmisc {
71
73
const struct usbmisc_ops * ops ;
72
74
};
73
75
74
- static struct imx_usbmisc * usbmisc ;
75
-
76
76
static int usbmisc_imx25_init (struct imx_usbmisc_data * data )
77
77
{
78
+ struct imx_usbmisc * usbmisc = dev_get_drvdata (data -> dev );
78
79
unsigned long flags ;
79
80
u32 val = 0 ;
80
81
@@ -108,6 +109,7 @@ static int usbmisc_imx25_init(struct imx_usbmisc_data *data)
108
109
109
110
static int usbmisc_imx25_post (struct imx_usbmisc_data * data )
110
111
{
112
+ struct imx_usbmisc * usbmisc = dev_get_drvdata (data -> dev );
111
113
void __iomem * reg ;
112
114
unsigned long flags ;
113
115
u32 val ;
@@ -130,6 +132,7 @@ static int usbmisc_imx25_post(struct imx_usbmisc_data *data)
130
132
131
133
static int usbmisc_imx27_init (struct imx_usbmisc_data * data )
132
134
{
135
+ struct imx_usbmisc * usbmisc = dev_get_drvdata (data -> dev );
133
136
unsigned long flags ;
134
137
u32 val ;
135
138
@@ -160,6 +163,7 @@ static int usbmisc_imx27_init(struct imx_usbmisc_data *data)
160
163
161
164
static int usbmisc_imx53_init (struct imx_usbmisc_data * data )
162
165
{
166
+ struct imx_usbmisc * usbmisc = dev_get_drvdata (data -> dev );
163
167
void __iomem * reg = NULL ;
164
168
unsigned long flags ;
165
169
u32 val = 0 ;
@@ -204,6 +208,7 @@ static int usbmisc_imx53_init(struct imx_usbmisc_data *data)
204
208
205
209
static int usbmisc_imx6q_init (struct imx_usbmisc_data * data )
206
210
{
211
+ struct imx_usbmisc * usbmisc = dev_get_drvdata (data -> dev );
207
212
unsigned long flags ;
208
213
u32 reg ;
209
214
@@ -221,6 +226,26 @@ static int usbmisc_imx6q_init(struct imx_usbmisc_data *data)
221
226
return 0 ;
222
227
}
223
228
229
+ static int usbmisc_vf610_init (struct imx_usbmisc_data * data )
230
+ {
231
+ struct imx_usbmisc * usbmisc = dev_get_drvdata (data -> dev );
232
+ u32 reg ;
233
+
234
+ /*
235
+ * Vybrid only has one misc register set, but in two different
236
+ * areas. These is reflected in two instances of this driver.
237
+ */
238
+ if (data -> index >= 1 )
239
+ return - EINVAL ;
240
+
241
+ if (data -> disable_oc ) {
242
+ reg = readl (usbmisc -> base );
243
+ writel (reg | VF610_OVER_CUR_DIS , usbmisc -> base );
244
+ }
245
+
246
+ return 0 ;
247
+ }
248
+
224
249
static const struct usbmisc_ops imx25_usbmisc_ops = {
225
250
.init = usbmisc_imx25_init ,
226
251
.post = usbmisc_imx25_post ,
@@ -238,10 +263,14 @@ static const struct usbmisc_ops imx6q_usbmisc_ops = {
238
263
.init = usbmisc_imx6q_init ,
239
264
};
240
265
266
+ static const struct usbmisc_ops vf610_usbmisc_ops = {
267
+ .init = usbmisc_vf610_init ,
268
+ };
269
+
241
270
int imx_usbmisc_init (struct imx_usbmisc_data * data )
242
271
{
243
- if (! usbmisc )
244
- return - EPROBE_DEFER ;
272
+ struct imx_usbmisc * usbmisc = dev_get_drvdata ( data -> dev );
273
+
245
274
if (!usbmisc -> ops -> init )
246
275
return 0 ;
247
276
return usbmisc -> ops -> init (data );
@@ -250,8 +279,8 @@ EXPORT_SYMBOL_GPL(imx_usbmisc_init);
250
279
251
280
int imx_usbmisc_init_post (struct imx_usbmisc_data * data )
252
281
{
253
- if (! usbmisc )
254
- return - EPROBE_DEFER ;
282
+ struct imx_usbmisc * usbmisc = dev_get_drvdata ( data -> dev );
283
+
255
284
if (!usbmisc -> ops -> post )
256
285
return 0 ;
257
286
return usbmisc -> ops -> post (data );
@@ -283,6 +312,10 @@ static const struct of_device_id usbmisc_imx_dt_ids[] = {
283
312
.compatible = "fsl,imx6q-usbmisc" ,
284
313
.data = & imx6q_usbmisc_ops ,
285
314
},
315
+ {
316
+ .compatible = "fsl,vf610-usbmisc" ,
317
+ .data = & vf610_usbmisc_ops ,
318
+ },
286
319
{ /* sentinel */ }
287
320
};
288
321
MODULE_DEVICE_TABLE (of , usbmisc_imx_dt_ids );
@@ -294,9 +327,6 @@ static int usbmisc_imx_probe(struct platform_device *pdev)
294
327
int ret ;
295
328
struct of_device_id * tmp_dev ;
296
329
297
- if (usbmisc )
298
- return - EBUSY ;
299
-
300
330
data = devm_kzalloc (& pdev -> dev , sizeof (* data ), GFP_KERNEL );
301
331
if (!data )
302
332
return - ENOMEM ;
@@ -325,15 +355,15 @@ static int usbmisc_imx_probe(struct platform_device *pdev)
325
355
tmp_dev = (struct of_device_id * )
326
356
of_match_device (usbmisc_imx_dt_ids , & pdev -> dev );
327
357
data -> ops = (const struct usbmisc_ops * )tmp_dev -> data ;
328
- usbmisc = data ;
358
+ platform_set_drvdata ( pdev , data ) ;
329
359
330
360
return 0 ;
331
361
}
332
362
333
363
static int usbmisc_imx_remove (struct platform_device * pdev )
334
364
{
365
+ struct imx_usbmisc * usbmisc = dev_get_drvdata (& pdev -> dev );
335
366
clk_disable_unprepare (usbmisc -> clk );
336
- usbmisc = NULL ;
337
367
return 0 ;
338
368
}
339
369
0 commit comments