xref: /openbmc/linux/drivers/bcma/main.c (revision 161f4089)
1 /*
2  * Broadcom specific AMBA
3  * Bus subsystem
4  *
5  * Licensed under the GNU/GPL. See COPYING for details.
6  */
7 
8 #include "bcma_private.h"
9 #include <linux/module.h>
10 #include <linux/platform_device.h>
11 #include <linux/bcma/bcma.h>
12 #include <linux/slab.h>
13 
14 MODULE_DESCRIPTION("Broadcom's specific AMBA driver");
15 MODULE_LICENSE("GPL");
16 
17 /* contains the number the next bus should get. */
18 static unsigned int bcma_bus_next_num = 0;
19 
20 /* bcma_buses_mutex locks the bcma_bus_next_num */
21 static DEFINE_MUTEX(bcma_buses_mutex);
22 
23 static int bcma_bus_match(struct device *dev, struct device_driver *drv);
24 static int bcma_device_probe(struct device *dev);
25 static int bcma_device_remove(struct device *dev);
26 static int bcma_device_uevent(struct device *dev, struct kobj_uevent_env *env);
27 
28 static ssize_t manuf_show(struct device *dev, struct device_attribute *attr, char *buf)
29 {
30 	struct bcma_device *core = container_of(dev, struct bcma_device, dev);
31 	return sprintf(buf, "0x%03X\n", core->id.manuf);
32 }
33 static DEVICE_ATTR_RO(manuf);
34 
35 static ssize_t id_show(struct device *dev, struct device_attribute *attr, char *buf)
36 {
37 	struct bcma_device *core = container_of(dev, struct bcma_device, dev);
38 	return sprintf(buf, "0x%03X\n", core->id.id);
39 }
40 static DEVICE_ATTR_RO(id);
41 
42 static ssize_t rev_show(struct device *dev, struct device_attribute *attr, char *buf)
43 {
44 	struct bcma_device *core = container_of(dev, struct bcma_device, dev);
45 	return sprintf(buf, "0x%02X\n", core->id.rev);
46 }
47 static DEVICE_ATTR_RO(rev);
48 
49 static ssize_t class_show(struct device *dev, struct device_attribute *attr, char *buf)
50 {
51 	struct bcma_device *core = container_of(dev, struct bcma_device, dev);
52 	return sprintf(buf, "0x%X\n", core->id.class);
53 }
54 static DEVICE_ATTR_RO(class);
55 
56 static struct attribute *bcma_device_attrs[] = {
57 	&dev_attr_manuf.attr,
58 	&dev_attr_id.attr,
59 	&dev_attr_rev.attr,
60 	&dev_attr_class.attr,
61 	NULL,
62 };
63 ATTRIBUTE_GROUPS(bcma_device);
64 
65 static struct bus_type bcma_bus_type = {
66 	.name		= "bcma",
67 	.match		= bcma_bus_match,
68 	.probe		= bcma_device_probe,
69 	.remove		= bcma_device_remove,
70 	.uevent		= bcma_device_uevent,
71 	.dev_groups	= bcma_device_groups,
72 };
73 
74 static u16 bcma_cc_core_id(struct bcma_bus *bus)
75 {
76 	if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4706)
77 		return BCMA_CORE_4706_CHIPCOMMON;
78 	return BCMA_CORE_CHIPCOMMON;
79 }
80 
81 struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid)
82 {
83 	struct bcma_device *core;
84 
85 	list_for_each_entry(core, &bus->cores, list) {
86 		if (core->id.id == coreid)
87 			return core;
88 	}
89 	return NULL;
90 }
91 EXPORT_SYMBOL_GPL(bcma_find_core);
92 
93 struct bcma_device *bcma_find_core_unit(struct bcma_bus *bus, u16 coreid,
94 					u8 unit)
95 {
96 	struct bcma_device *core;
97 
98 	list_for_each_entry(core, &bus->cores, list) {
99 		if (core->id.id == coreid && core->core_unit == unit)
100 			return core;
101 	}
102 	return NULL;
103 }
104 
105 bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value,
106 		     int timeout)
107 {
108 	unsigned long deadline = jiffies + timeout;
109 	u32 val;
110 
111 	do {
112 		val = bcma_read32(core, reg);
113 		if ((val & mask) == value)
114 			return true;
115 		cpu_relax();
116 		udelay(10);
117 	} while (!time_after_eq(jiffies, deadline));
118 
119 	bcma_warn(core->bus, "Timeout waiting for register 0x%04X!\n", reg);
120 
121 	return false;
122 }
123 
124 static void bcma_release_core_dev(struct device *dev)
125 {
126 	struct bcma_device *core = container_of(dev, struct bcma_device, dev);
127 	if (core->io_addr)
128 		iounmap(core->io_addr);
129 	if (core->io_wrap)
130 		iounmap(core->io_wrap);
131 	kfree(core);
132 }
133 
134 static int bcma_register_cores(struct bcma_bus *bus)
135 {
136 	struct bcma_device *core;
137 	int err, dev_id = 0;
138 
139 	list_for_each_entry(core, &bus->cores, list) {
140 		/* We support that cores ourself */
141 		switch (core->id.id) {
142 		case BCMA_CORE_4706_CHIPCOMMON:
143 		case BCMA_CORE_CHIPCOMMON:
144 		case BCMA_CORE_PCI:
145 		case BCMA_CORE_PCIE:
146 		case BCMA_CORE_MIPS_74K:
147 		case BCMA_CORE_4706_MAC_GBIT_COMMON:
148 			continue;
149 		}
150 
151 		/* Only first GMAC core on BCM4706 is connected and working */
152 		if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
153 		    core->core_unit > 0)
154 			continue;
155 
156 		core->dev.release = bcma_release_core_dev;
157 		core->dev.bus = &bcma_bus_type;
158 		dev_set_name(&core->dev, "bcma%d:%d", bus->num, dev_id);
159 
160 		switch (bus->hosttype) {
161 		case BCMA_HOSTTYPE_PCI:
162 			core->dev.parent = &bus->host_pci->dev;
163 			core->dma_dev = &bus->host_pci->dev;
164 			core->irq = bus->host_pci->irq;
165 			break;
166 		case BCMA_HOSTTYPE_SOC:
167 			core->dev.dma_mask = &core->dev.coherent_dma_mask;
168 			core->dma_dev = &core->dev;
169 			break;
170 		case BCMA_HOSTTYPE_SDIO:
171 			break;
172 		}
173 
174 		err = device_register(&core->dev);
175 		if (err) {
176 			bcma_err(bus,
177 				 "Could not register dev for core 0x%03X\n",
178 				 core->id.id);
179 			continue;
180 		}
181 		core->dev_registered = true;
182 		dev_id++;
183 	}
184 
185 #ifdef CONFIG_BCMA_DRIVER_MIPS
186 	if (bus->drv_cc.pflash.present) {
187 		err = platform_device_register(&bcma_pflash_dev);
188 		if (err)
189 			bcma_err(bus, "Error registering parallel flash\n");
190 	}
191 #endif
192 
193 #ifdef CONFIG_BCMA_SFLASH
194 	if (bus->drv_cc.sflash.present) {
195 		err = platform_device_register(&bcma_sflash_dev);
196 		if (err)
197 			bcma_err(bus, "Error registering serial flash\n");
198 	}
199 #endif
200 
201 #ifdef CONFIG_BCMA_NFLASH
202 	if (bus->drv_cc.nflash.present) {
203 		err = platform_device_register(&bcma_nflash_dev);
204 		if (err)
205 			bcma_err(bus, "Error registering NAND flash\n");
206 	}
207 #endif
208 	err = bcma_gpio_init(&bus->drv_cc);
209 	if (err == -ENOTSUPP)
210 		bcma_debug(bus, "GPIO driver not activated\n");
211 	else if (err)
212 		bcma_err(bus, "Error registering GPIO driver: %i\n", err);
213 
214 	if (bus->hosttype == BCMA_HOSTTYPE_SOC) {
215 		err = bcma_chipco_watchdog_register(&bus->drv_cc);
216 		if (err)
217 			bcma_err(bus, "Error registering watchdog driver\n");
218 	}
219 
220 	return 0;
221 }
222 
223 static void bcma_unregister_cores(struct bcma_bus *bus)
224 {
225 	struct bcma_device *core, *tmp;
226 
227 	list_for_each_entry_safe(core, tmp, &bus->cores, list) {
228 		list_del(&core->list);
229 		if (core->dev_registered)
230 			device_unregister(&core->dev);
231 	}
232 	if (bus->hosttype == BCMA_HOSTTYPE_SOC)
233 		platform_device_unregister(bus->drv_cc.watchdog);
234 }
235 
236 int bcma_bus_register(struct bcma_bus *bus)
237 {
238 	int err;
239 	struct bcma_device *core;
240 
241 	mutex_lock(&bcma_buses_mutex);
242 	bus->num = bcma_bus_next_num++;
243 	mutex_unlock(&bcma_buses_mutex);
244 
245 	/* Scan for devices (cores) */
246 	err = bcma_bus_scan(bus);
247 	if (err) {
248 		bcma_err(bus, "Failed to scan: %d\n", err);
249 		return err;
250 	}
251 
252 	/* Early init CC core */
253 	core = bcma_find_core(bus, bcma_cc_core_id(bus));
254 	if (core) {
255 		bus->drv_cc.core = core;
256 		bcma_core_chipcommon_early_init(&bus->drv_cc);
257 	}
258 
259 	/* Try to get SPROM */
260 	err = bcma_sprom_get(bus);
261 	if (err == -ENOENT) {
262 		bcma_err(bus, "No SPROM available\n");
263 	} else if (err)
264 		bcma_err(bus, "Failed to get SPROM: %d\n", err);
265 
266 	/* Init CC core */
267 	core = bcma_find_core(bus, bcma_cc_core_id(bus));
268 	if (core) {
269 		bus->drv_cc.core = core;
270 		bcma_core_chipcommon_init(&bus->drv_cc);
271 	}
272 
273 	/* Init MIPS core */
274 	core = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
275 	if (core) {
276 		bus->drv_mips.core = core;
277 		bcma_core_mips_init(&bus->drv_mips);
278 	}
279 
280 	/* Init PCIE core */
281 	core = bcma_find_core_unit(bus, BCMA_CORE_PCIE, 0);
282 	if (core) {
283 		bus->drv_pci[0].core = core;
284 		bcma_core_pci_init(&bus->drv_pci[0]);
285 	}
286 
287 	/* Init PCIE core */
288 	core = bcma_find_core_unit(bus, BCMA_CORE_PCIE, 1);
289 	if (core) {
290 		bus->drv_pci[1].core = core;
291 		bcma_core_pci_init(&bus->drv_pci[1]);
292 	}
293 
294 	/* Init GBIT MAC COMMON core */
295 	core = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON);
296 	if (core) {
297 		bus->drv_gmac_cmn.core = core;
298 		bcma_core_gmac_cmn_init(&bus->drv_gmac_cmn);
299 	}
300 
301 	/* Register found cores */
302 	bcma_register_cores(bus);
303 
304 	bcma_info(bus, "Bus registered\n");
305 
306 	return 0;
307 }
308 
309 void bcma_bus_unregister(struct bcma_bus *bus)
310 {
311 	struct bcma_device *cores[3];
312 	int err;
313 
314 	err = bcma_gpio_unregister(&bus->drv_cc);
315 	if (err == -EBUSY)
316 		bcma_err(bus, "Some GPIOs are still in use.\n");
317 	else if (err)
318 		bcma_err(bus, "Can not unregister GPIO driver: %i\n", err);
319 
320 	cores[0] = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
321 	cores[1] = bcma_find_core(bus, BCMA_CORE_PCIE);
322 	cores[2] = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON);
323 
324 	bcma_unregister_cores(bus);
325 
326 	kfree(cores[2]);
327 	kfree(cores[1]);
328 	kfree(cores[0]);
329 }
330 
331 int __init bcma_bus_early_register(struct bcma_bus *bus,
332 				   struct bcma_device *core_cc,
333 				   struct bcma_device *core_mips)
334 {
335 	int err;
336 	struct bcma_device *core;
337 	struct bcma_device_id match;
338 
339 	bcma_init_bus(bus);
340 
341 	match.manuf = BCMA_MANUF_BCM;
342 	match.id = bcma_cc_core_id(bus);
343 	match.class = BCMA_CL_SIM;
344 	match.rev = BCMA_ANY_REV;
345 
346 	/* Scan for chip common core */
347 	err = bcma_bus_scan_early(bus, &match, core_cc);
348 	if (err) {
349 		bcma_err(bus, "Failed to scan for common core: %d\n", err);
350 		return -1;
351 	}
352 
353 	match.manuf = BCMA_MANUF_MIPS;
354 	match.id = BCMA_CORE_MIPS_74K;
355 	match.class = BCMA_CL_SIM;
356 	match.rev = BCMA_ANY_REV;
357 
358 	/* Scan for mips core */
359 	err = bcma_bus_scan_early(bus, &match, core_mips);
360 	if (err) {
361 		bcma_err(bus, "Failed to scan for mips core: %d\n", err);
362 		return -1;
363 	}
364 
365 	/* Early init CC core */
366 	core = bcma_find_core(bus, bcma_cc_core_id(bus));
367 	if (core) {
368 		bus->drv_cc.core = core;
369 		bcma_core_chipcommon_early_init(&bus->drv_cc);
370 	}
371 
372 	/* Early init MIPS core */
373 	core = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
374 	if (core) {
375 		bus->drv_mips.core = core;
376 		bcma_core_mips_early_init(&bus->drv_mips);
377 	}
378 
379 	bcma_info(bus, "Early bus registered\n");
380 
381 	return 0;
382 }
383 
384 #ifdef CONFIG_PM
385 int bcma_bus_suspend(struct bcma_bus *bus)
386 {
387 	struct bcma_device *core;
388 
389 	list_for_each_entry(core, &bus->cores, list) {
390 		struct device_driver *drv = core->dev.driver;
391 		if (drv) {
392 			struct bcma_driver *adrv = container_of(drv, struct bcma_driver, drv);
393 			if (adrv->suspend)
394 				adrv->suspend(core);
395 		}
396 	}
397 	return 0;
398 }
399 
400 int bcma_bus_resume(struct bcma_bus *bus)
401 {
402 	struct bcma_device *core;
403 
404 	/* Init CC core */
405 	if (bus->drv_cc.core) {
406 		bus->drv_cc.setup_done = false;
407 		bcma_core_chipcommon_init(&bus->drv_cc);
408 	}
409 
410 	list_for_each_entry(core, &bus->cores, list) {
411 		struct device_driver *drv = core->dev.driver;
412 		if (drv) {
413 			struct bcma_driver *adrv = container_of(drv, struct bcma_driver, drv);
414 			if (adrv->resume)
415 				adrv->resume(core);
416 		}
417 	}
418 
419 	return 0;
420 }
421 #endif
422 
423 int __bcma_driver_register(struct bcma_driver *drv, struct module *owner)
424 {
425 	drv->drv.name = drv->name;
426 	drv->drv.bus = &bcma_bus_type;
427 	drv->drv.owner = owner;
428 
429 	return driver_register(&drv->drv);
430 }
431 EXPORT_SYMBOL_GPL(__bcma_driver_register);
432 
433 void bcma_driver_unregister(struct bcma_driver *drv)
434 {
435 	driver_unregister(&drv->drv);
436 }
437 EXPORT_SYMBOL_GPL(bcma_driver_unregister);
438 
439 static int bcma_bus_match(struct device *dev, struct device_driver *drv)
440 {
441 	struct bcma_device *core = container_of(dev, struct bcma_device, dev);
442 	struct bcma_driver *adrv = container_of(drv, struct bcma_driver, drv);
443 	const struct bcma_device_id *cid = &core->id;
444 	const struct bcma_device_id *did;
445 
446 	for (did = adrv->id_table; did->manuf || did->id || did->rev; did++) {
447 	    if ((did->manuf == cid->manuf || did->manuf == BCMA_ANY_MANUF) &&
448 		(did->id == cid->id || did->id == BCMA_ANY_ID) &&
449 		(did->rev == cid->rev || did->rev == BCMA_ANY_REV) &&
450 		(did->class == cid->class || did->class == BCMA_ANY_CLASS))
451 			return 1;
452 	}
453 	return 0;
454 }
455 
456 static int bcma_device_probe(struct device *dev)
457 {
458 	struct bcma_device *core = container_of(dev, struct bcma_device, dev);
459 	struct bcma_driver *adrv = container_of(dev->driver, struct bcma_driver,
460 					       drv);
461 	int err = 0;
462 
463 	if (adrv->probe)
464 		err = adrv->probe(core);
465 
466 	return err;
467 }
468 
469 static int bcma_device_remove(struct device *dev)
470 {
471 	struct bcma_device *core = container_of(dev, struct bcma_device, dev);
472 	struct bcma_driver *adrv = container_of(dev->driver, struct bcma_driver,
473 					       drv);
474 
475 	if (adrv->remove)
476 		adrv->remove(core);
477 
478 	return 0;
479 }
480 
481 static int bcma_device_uevent(struct device *dev, struct kobj_uevent_env *env)
482 {
483 	struct bcma_device *core = container_of(dev, struct bcma_device, dev);
484 
485 	return add_uevent_var(env,
486 			      "MODALIAS=bcma:m%04Xid%04Xrev%02Xcl%02X",
487 			      core->id.manuf, core->id.id,
488 			      core->id.rev, core->id.class);
489 }
490 
491 static int __init bcma_modinit(void)
492 {
493 	int err;
494 
495 	err = bus_register(&bcma_bus_type);
496 	if (err)
497 		return err;
498 
499 #ifdef CONFIG_BCMA_HOST_PCI
500 	err = bcma_host_pci_init();
501 	if (err) {
502 		pr_err("PCI host initialization failed\n");
503 		err = 0;
504 	}
505 #endif
506 
507 	return err;
508 }
509 fs_initcall(bcma_modinit);
510 
511 static void __exit bcma_modexit(void)
512 {
513 #ifdef CONFIG_BCMA_HOST_PCI
514 	bcma_host_pci_exit();
515 #endif
516 	bus_unregister(&bcma_bus_type);
517 }
518 module_exit(bcma_modexit)
519