xref: /OK3568_Linux_fs/kernel/drivers/ssb/main.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Sonics Silicon Backplane
3*4882a593Smuzhiyun  * Subsystem core
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2005, Broadcom Corporation
6*4882a593Smuzhiyun  * Copyright 2006, 2007, Michael Buesch <m@bues.ch>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Licensed under the GNU/GPL. See COPYING for details.
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include "ssb_private.h"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/delay.h>
14*4882a593Smuzhiyun #include <linux/io.h>
15*4882a593Smuzhiyun #include <linux/module.h>
16*4882a593Smuzhiyun #include <linux/platform_device.h>
17*4882a593Smuzhiyun #include <linux/ssb/ssb.h>
18*4882a593Smuzhiyun #include <linux/ssb/ssb_regs.h>
19*4882a593Smuzhiyun #include <linux/ssb/ssb_driver_gige.h>
20*4882a593Smuzhiyun #include <linux/dma-mapping.h>
21*4882a593Smuzhiyun #include <linux/pci.h>
22*4882a593Smuzhiyun #include <linux/mmc/sdio_func.h>
23*4882a593Smuzhiyun #include <linux/slab.h>
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include <pcmcia/cistpl.h>
26*4882a593Smuzhiyun #include <pcmcia/ds.h>
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun MODULE_DESCRIPTION("Sonics Silicon Backplane driver");
30*4882a593Smuzhiyun MODULE_LICENSE("GPL");
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /* Temporary list of yet-to-be-attached buses */
34*4882a593Smuzhiyun static LIST_HEAD(attach_queue);
35*4882a593Smuzhiyun /* List if running buses */
36*4882a593Smuzhiyun static LIST_HEAD(buses);
37*4882a593Smuzhiyun /* Software ID counter */
38*4882a593Smuzhiyun static unsigned int next_busnumber;
39*4882a593Smuzhiyun /* buses_mutes locks the two buslists and the next_busnumber.
40*4882a593Smuzhiyun  * Don't lock this directly, but use ssb_buses_[un]lock() below. */
41*4882a593Smuzhiyun static DEFINE_MUTEX(buses_mutex);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /* There are differences in the codeflow, if the bus is
44*4882a593Smuzhiyun  * initialized from early boot, as various needed services
45*4882a593Smuzhiyun  * are not available early. This is a mechanism to delay
46*4882a593Smuzhiyun  * these initializations to after early boot has finished.
47*4882a593Smuzhiyun  * It's also used to avoid mutex locking, as that's not
48*4882a593Smuzhiyun  * available and needed early. */
49*4882a593Smuzhiyun static bool ssb_is_early_boot = 1;
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun static void ssb_buses_lock(void);
52*4882a593Smuzhiyun static void ssb_buses_unlock(void);
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #ifdef CONFIG_SSB_PCIHOST
ssb_pci_dev_to_bus(struct pci_dev * pdev)56*4882a593Smuzhiyun struct ssb_bus *ssb_pci_dev_to_bus(struct pci_dev *pdev)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun 	struct ssb_bus *bus;
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 	ssb_buses_lock();
61*4882a593Smuzhiyun 	list_for_each_entry(bus, &buses, list) {
62*4882a593Smuzhiyun 		if (bus->bustype == SSB_BUSTYPE_PCI &&
63*4882a593Smuzhiyun 		    bus->host_pci == pdev)
64*4882a593Smuzhiyun 			goto found;
65*4882a593Smuzhiyun 	}
66*4882a593Smuzhiyun 	bus = NULL;
67*4882a593Smuzhiyun found:
68*4882a593Smuzhiyun 	ssb_buses_unlock();
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	return bus;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun #endif /* CONFIG_SSB_PCIHOST */
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #ifdef CONFIG_SSB_PCMCIAHOST
ssb_pcmcia_dev_to_bus(struct pcmcia_device * pdev)75*4882a593Smuzhiyun struct ssb_bus *ssb_pcmcia_dev_to_bus(struct pcmcia_device *pdev)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun 	struct ssb_bus *bus;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	ssb_buses_lock();
80*4882a593Smuzhiyun 	list_for_each_entry(bus, &buses, list) {
81*4882a593Smuzhiyun 		if (bus->bustype == SSB_BUSTYPE_PCMCIA &&
82*4882a593Smuzhiyun 		    bus->host_pcmcia == pdev)
83*4882a593Smuzhiyun 			goto found;
84*4882a593Smuzhiyun 	}
85*4882a593Smuzhiyun 	bus = NULL;
86*4882a593Smuzhiyun found:
87*4882a593Smuzhiyun 	ssb_buses_unlock();
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	return bus;
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun #endif /* CONFIG_SSB_PCMCIAHOST */
92*4882a593Smuzhiyun 
ssb_for_each_bus_call(unsigned long data,int (* func)(struct ssb_bus * bus,unsigned long data))93*4882a593Smuzhiyun int ssb_for_each_bus_call(unsigned long data,
94*4882a593Smuzhiyun 			  int (*func)(struct ssb_bus *bus, unsigned long data))
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	struct ssb_bus *bus;
97*4882a593Smuzhiyun 	int res;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	ssb_buses_lock();
100*4882a593Smuzhiyun 	list_for_each_entry(bus, &buses, list) {
101*4882a593Smuzhiyun 		res = func(bus, data);
102*4882a593Smuzhiyun 		if (res >= 0) {
103*4882a593Smuzhiyun 			ssb_buses_unlock();
104*4882a593Smuzhiyun 			return res;
105*4882a593Smuzhiyun 		}
106*4882a593Smuzhiyun 	}
107*4882a593Smuzhiyun 	ssb_buses_unlock();
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	return -ENODEV;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun 
ssb_device_get(struct ssb_device * dev)112*4882a593Smuzhiyun static struct ssb_device *ssb_device_get(struct ssb_device *dev)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun 	if (dev)
115*4882a593Smuzhiyun 		get_device(dev->dev);
116*4882a593Smuzhiyun 	return dev;
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun 
ssb_device_put(struct ssb_device * dev)119*4882a593Smuzhiyun static void ssb_device_put(struct ssb_device *dev)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun 	if (dev)
122*4882a593Smuzhiyun 		put_device(dev->dev);
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
ssb_device_resume(struct device * dev)125*4882a593Smuzhiyun static int ssb_device_resume(struct device *dev)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun 	struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
128*4882a593Smuzhiyun 	struct ssb_driver *ssb_drv;
129*4882a593Smuzhiyun 	int err = 0;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	if (dev->driver) {
132*4882a593Smuzhiyun 		ssb_drv = drv_to_ssb_drv(dev->driver);
133*4882a593Smuzhiyun 		if (ssb_drv && ssb_drv->resume)
134*4882a593Smuzhiyun 			err = ssb_drv->resume(ssb_dev);
135*4882a593Smuzhiyun 		if (err)
136*4882a593Smuzhiyun 			goto out;
137*4882a593Smuzhiyun 	}
138*4882a593Smuzhiyun out:
139*4882a593Smuzhiyun 	return err;
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun 
ssb_device_suspend(struct device * dev,pm_message_t state)142*4882a593Smuzhiyun static int ssb_device_suspend(struct device *dev, pm_message_t state)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun 	struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
145*4882a593Smuzhiyun 	struct ssb_driver *ssb_drv;
146*4882a593Smuzhiyun 	int err = 0;
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	if (dev->driver) {
149*4882a593Smuzhiyun 		ssb_drv = drv_to_ssb_drv(dev->driver);
150*4882a593Smuzhiyun 		if (ssb_drv && ssb_drv->suspend)
151*4882a593Smuzhiyun 			err = ssb_drv->suspend(ssb_dev, state);
152*4882a593Smuzhiyun 		if (err)
153*4882a593Smuzhiyun 			goto out;
154*4882a593Smuzhiyun 	}
155*4882a593Smuzhiyun out:
156*4882a593Smuzhiyun 	return err;
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun 
ssb_bus_resume(struct ssb_bus * bus)159*4882a593Smuzhiyun int ssb_bus_resume(struct ssb_bus *bus)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun 	int err;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	/* Reset HW state information in memory, so that HW is
164*4882a593Smuzhiyun 	 * completely reinitialized. */
165*4882a593Smuzhiyun 	bus->mapped_device = NULL;
166*4882a593Smuzhiyun #ifdef CONFIG_SSB_DRIVER_PCICORE
167*4882a593Smuzhiyun 	bus->pcicore.setup_done = 0;
168*4882a593Smuzhiyun #endif
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	err = ssb_bus_powerup(bus, 0);
171*4882a593Smuzhiyun 	if (err)
172*4882a593Smuzhiyun 		return err;
173*4882a593Smuzhiyun 	err = ssb_pcmcia_hardware_setup(bus);
174*4882a593Smuzhiyun 	if (err) {
175*4882a593Smuzhiyun 		ssb_bus_may_powerdown(bus);
176*4882a593Smuzhiyun 		return err;
177*4882a593Smuzhiyun 	}
178*4882a593Smuzhiyun 	ssb_chipco_resume(&bus->chipco);
179*4882a593Smuzhiyun 	ssb_bus_may_powerdown(bus);
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	return 0;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_bus_resume);
184*4882a593Smuzhiyun 
ssb_bus_suspend(struct ssb_bus * bus)185*4882a593Smuzhiyun int ssb_bus_suspend(struct ssb_bus *bus)
186*4882a593Smuzhiyun {
187*4882a593Smuzhiyun 	ssb_chipco_suspend(&bus->chipco);
188*4882a593Smuzhiyun 	ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 0);
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	return 0;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_bus_suspend);
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun #ifdef CONFIG_SSB_SPROM
195*4882a593Smuzhiyun /** ssb_devices_freeze - Freeze all devices on the bus.
196*4882a593Smuzhiyun  *
197*4882a593Smuzhiyun  * After freezing no device driver will be handling a device
198*4882a593Smuzhiyun  * on this bus anymore. ssb_devices_thaw() must be called after
199*4882a593Smuzhiyun  * a successful freeze to reactivate the devices.
200*4882a593Smuzhiyun  *
201*4882a593Smuzhiyun  * @bus: The bus.
202*4882a593Smuzhiyun  * @ctx: Context structure. Pass this to ssb_devices_thaw().
203*4882a593Smuzhiyun  */
ssb_devices_freeze(struct ssb_bus * bus,struct ssb_freeze_context * ctx)204*4882a593Smuzhiyun int ssb_devices_freeze(struct ssb_bus *bus, struct ssb_freeze_context *ctx)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun 	struct ssb_device *sdev;
207*4882a593Smuzhiyun 	struct ssb_driver *sdrv;
208*4882a593Smuzhiyun 	unsigned int i;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	memset(ctx, 0, sizeof(*ctx));
211*4882a593Smuzhiyun 	ctx->bus = bus;
212*4882a593Smuzhiyun 	WARN_ON(bus->nr_devices > ARRAY_SIZE(ctx->device_frozen));
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 	for (i = 0; i < bus->nr_devices; i++) {
215*4882a593Smuzhiyun 		sdev = ssb_device_get(&bus->devices[i]);
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 		if (!sdev->dev || !sdev->dev->driver ||
218*4882a593Smuzhiyun 		    !device_is_registered(sdev->dev)) {
219*4882a593Smuzhiyun 			ssb_device_put(sdev);
220*4882a593Smuzhiyun 			continue;
221*4882a593Smuzhiyun 		}
222*4882a593Smuzhiyun 		sdrv = drv_to_ssb_drv(sdev->dev->driver);
223*4882a593Smuzhiyun 		if (WARN_ON(!sdrv->remove))
224*4882a593Smuzhiyun 			continue;
225*4882a593Smuzhiyun 		sdrv->remove(sdev);
226*4882a593Smuzhiyun 		ctx->device_frozen[i] = 1;
227*4882a593Smuzhiyun 	}
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	return 0;
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun /** ssb_devices_thaw - Unfreeze all devices on the bus.
233*4882a593Smuzhiyun  *
234*4882a593Smuzhiyun  * This will re-attach the device drivers and re-init the devices.
235*4882a593Smuzhiyun  *
236*4882a593Smuzhiyun  * @ctx: The context structure from ssb_devices_freeze()
237*4882a593Smuzhiyun  */
ssb_devices_thaw(struct ssb_freeze_context * ctx)238*4882a593Smuzhiyun int ssb_devices_thaw(struct ssb_freeze_context *ctx)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun 	struct ssb_bus *bus = ctx->bus;
241*4882a593Smuzhiyun 	struct ssb_device *sdev;
242*4882a593Smuzhiyun 	struct ssb_driver *sdrv;
243*4882a593Smuzhiyun 	unsigned int i;
244*4882a593Smuzhiyun 	int err, result = 0;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	for (i = 0; i < bus->nr_devices; i++) {
247*4882a593Smuzhiyun 		if (!ctx->device_frozen[i])
248*4882a593Smuzhiyun 			continue;
249*4882a593Smuzhiyun 		sdev = &bus->devices[i];
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 		if (WARN_ON(!sdev->dev || !sdev->dev->driver))
252*4882a593Smuzhiyun 			continue;
253*4882a593Smuzhiyun 		sdrv = drv_to_ssb_drv(sdev->dev->driver);
254*4882a593Smuzhiyun 		if (WARN_ON(!sdrv || !sdrv->probe))
255*4882a593Smuzhiyun 			continue;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 		err = sdrv->probe(sdev, &sdev->id);
258*4882a593Smuzhiyun 		if (err) {
259*4882a593Smuzhiyun 			dev_err(sdev->dev,
260*4882a593Smuzhiyun 				"Failed to thaw device %s\n",
261*4882a593Smuzhiyun 				dev_name(sdev->dev));
262*4882a593Smuzhiyun 			result = err;
263*4882a593Smuzhiyun 		}
264*4882a593Smuzhiyun 		ssb_device_put(sdev);
265*4882a593Smuzhiyun 	}
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	return result;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun #endif /* CONFIG_SSB_SPROM */
270*4882a593Smuzhiyun 
ssb_device_shutdown(struct device * dev)271*4882a593Smuzhiyun static void ssb_device_shutdown(struct device *dev)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun 	struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
274*4882a593Smuzhiyun 	struct ssb_driver *ssb_drv;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	if (!dev->driver)
277*4882a593Smuzhiyun 		return;
278*4882a593Smuzhiyun 	ssb_drv = drv_to_ssb_drv(dev->driver);
279*4882a593Smuzhiyun 	if (ssb_drv && ssb_drv->shutdown)
280*4882a593Smuzhiyun 		ssb_drv->shutdown(ssb_dev);
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun 
ssb_device_remove(struct device * dev)283*4882a593Smuzhiyun static int ssb_device_remove(struct device *dev)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun 	struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
286*4882a593Smuzhiyun 	struct ssb_driver *ssb_drv = drv_to_ssb_drv(dev->driver);
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	if (ssb_drv && ssb_drv->remove)
289*4882a593Smuzhiyun 		ssb_drv->remove(ssb_dev);
290*4882a593Smuzhiyun 	ssb_device_put(ssb_dev);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	return 0;
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun 
ssb_device_probe(struct device * dev)295*4882a593Smuzhiyun static int ssb_device_probe(struct device *dev)
296*4882a593Smuzhiyun {
297*4882a593Smuzhiyun 	struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
298*4882a593Smuzhiyun 	struct ssb_driver *ssb_drv = drv_to_ssb_drv(dev->driver);
299*4882a593Smuzhiyun 	int err = 0;
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 	ssb_device_get(ssb_dev);
302*4882a593Smuzhiyun 	if (ssb_drv && ssb_drv->probe)
303*4882a593Smuzhiyun 		err = ssb_drv->probe(ssb_dev, &ssb_dev->id);
304*4882a593Smuzhiyun 	if (err)
305*4882a593Smuzhiyun 		ssb_device_put(ssb_dev);
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	return err;
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun 
ssb_match_devid(const struct ssb_device_id * tabid,const struct ssb_device_id * devid)310*4882a593Smuzhiyun static int ssb_match_devid(const struct ssb_device_id *tabid,
311*4882a593Smuzhiyun 			   const struct ssb_device_id *devid)
312*4882a593Smuzhiyun {
313*4882a593Smuzhiyun 	if ((tabid->vendor != devid->vendor) &&
314*4882a593Smuzhiyun 	    tabid->vendor != SSB_ANY_VENDOR)
315*4882a593Smuzhiyun 		return 0;
316*4882a593Smuzhiyun 	if ((tabid->coreid != devid->coreid) &&
317*4882a593Smuzhiyun 	    tabid->coreid != SSB_ANY_ID)
318*4882a593Smuzhiyun 		return 0;
319*4882a593Smuzhiyun 	if ((tabid->revision != devid->revision) &&
320*4882a593Smuzhiyun 	    tabid->revision != SSB_ANY_REV)
321*4882a593Smuzhiyun 		return 0;
322*4882a593Smuzhiyun 	return 1;
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun 
ssb_bus_match(struct device * dev,struct device_driver * drv)325*4882a593Smuzhiyun static int ssb_bus_match(struct device *dev, struct device_driver *drv)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun 	struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
328*4882a593Smuzhiyun 	struct ssb_driver *ssb_drv = drv_to_ssb_drv(drv);
329*4882a593Smuzhiyun 	const struct ssb_device_id *id;
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	for (id = ssb_drv->id_table;
332*4882a593Smuzhiyun 	     id->vendor || id->coreid || id->revision;
333*4882a593Smuzhiyun 	     id++) {
334*4882a593Smuzhiyun 		if (ssb_match_devid(id, &ssb_dev->id))
335*4882a593Smuzhiyun 			return 1; /* found */
336*4882a593Smuzhiyun 	}
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	return 0;
339*4882a593Smuzhiyun }
340*4882a593Smuzhiyun 
ssb_device_uevent(struct device * dev,struct kobj_uevent_env * env)341*4882a593Smuzhiyun static int ssb_device_uevent(struct device *dev, struct kobj_uevent_env *env)
342*4882a593Smuzhiyun {
343*4882a593Smuzhiyun 	struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	if (!dev)
346*4882a593Smuzhiyun 		return -ENODEV;
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 	return add_uevent_var(env,
349*4882a593Smuzhiyun 			     "MODALIAS=ssb:v%04Xid%04Xrev%02X",
350*4882a593Smuzhiyun 			     ssb_dev->id.vendor, ssb_dev->id.coreid,
351*4882a593Smuzhiyun 			     ssb_dev->id.revision);
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun #define ssb_config_attr(attrib, field, format_string) \
355*4882a593Smuzhiyun static ssize_t \
356*4882a593Smuzhiyun attrib##_show(struct device *dev, struct device_attribute *attr, char *buf) \
357*4882a593Smuzhiyun { \
358*4882a593Smuzhiyun 	return sprintf(buf, format_string, dev_to_ssb_dev(dev)->field); \
359*4882a593Smuzhiyun } \
360*4882a593Smuzhiyun static DEVICE_ATTR_RO(attrib);
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun ssb_config_attr(core_num, core_index, "%u\n")
363*4882a593Smuzhiyun ssb_config_attr(coreid, id.coreid, "0x%04x\n")
364*4882a593Smuzhiyun ssb_config_attr(vendor, id.vendor, "0x%04x\n")
365*4882a593Smuzhiyun ssb_config_attr(revision, id.revision, "%u\n")
366*4882a593Smuzhiyun ssb_config_attr(irq, irq, "%u\n")
367*4882a593Smuzhiyun static ssize_t
name_show(struct device * dev,struct device_attribute * attr,char * buf)368*4882a593Smuzhiyun name_show(struct device *dev, struct device_attribute *attr, char *buf)
369*4882a593Smuzhiyun {
370*4882a593Smuzhiyun 	return sprintf(buf, "%s\n",
371*4882a593Smuzhiyun 		       ssb_core_name(dev_to_ssb_dev(dev)->id.coreid));
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun static DEVICE_ATTR_RO(name);
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun static struct attribute *ssb_device_attrs[] = {
376*4882a593Smuzhiyun 	&dev_attr_name.attr,
377*4882a593Smuzhiyun 	&dev_attr_core_num.attr,
378*4882a593Smuzhiyun 	&dev_attr_coreid.attr,
379*4882a593Smuzhiyun 	&dev_attr_vendor.attr,
380*4882a593Smuzhiyun 	&dev_attr_revision.attr,
381*4882a593Smuzhiyun 	&dev_attr_irq.attr,
382*4882a593Smuzhiyun 	NULL,
383*4882a593Smuzhiyun };
384*4882a593Smuzhiyun ATTRIBUTE_GROUPS(ssb_device);
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun static struct bus_type ssb_bustype = {
387*4882a593Smuzhiyun 	.name		= "ssb",
388*4882a593Smuzhiyun 	.match		= ssb_bus_match,
389*4882a593Smuzhiyun 	.probe		= ssb_device_probe,
390*4882a593Smuzhiyun 	.remove		= ssb_device_remove,
391*4882a593Smuzhiyun 	.shutdown	= ssb_device_shutdown,
392*4882a593Smuzhiyun 	.suspend	= ssb_device_suspend,
393*4882a593Smuzhiyun 	.resume		= ssb_device_resume,
394*4882a593Smuzhiyun 	.uevent		= ssb_device_uevent,
395*4882a593Smuzhiyun 	.dev_groups	= ssb_device_groups,
396*4882a593Smuzhiyun };
397*4882a593Smuzhiyun 
ssb_buses_lock(void)398*4882a593Smuzhiyun static void ssb_buses_lock(void)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun 	/* See the comment at the ssb_is_early_boot definition */
401*4882a593Smuzhiyun 	if (!ssb_is_early_boot)
402*4882a593Smuzhiyun 		mutex_lock(&buses_mutex);
403*4882a593Smuzhiyun }
404*4882a593Smuzhiyun 
ssb_buses_unlock(void)405*4882a593Smuzhiyun static void ssb_buses_unlock(void)
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun 	/* See the comment at the ssb_is_early_boot definition */
408*4882a593Smuzhiyun 	if (!ssb_is_early_boot)
409*4882a593Smuzhiyun 		mutex_unlock(&buses_mutex);
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun 
ssb_devices_unregister(struct ssb_bus * bus)412*4882a593Smuzhiyun static void ssb_devices_unregister(struct ssb_bus *bus)
413*4882a593Smuzhiyun {
414*4882a593Smuzhiyun 	struct ssb_device *sdev;
415*4882a593Smuzhiyun 	int i;
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 	for (i = bus->nr_devices - 1; i >= 0; i--) {
418*4882a593Smuzhiyun 		sdev = &(bus->devices[i]);
419*4882a593Smuzhiyun 		if (sdev->dev)
420*4882a593Smuzhiyun 			device_unregister(sdev->dev);
421*4882a593Smuzhiyun 	}
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun #ifdef CONFIG_SSB_EMBEDDED
424*4882a593Smuzhiyun 	if (bus->bustype == SSB_BUSTYPE_SSB)
425*4882a593Smuzhiyun 		platform_device_unregister(bus->watchdog);
426*4882a593Smuzhiyun #endif
427*4882a593Smuzhiyun }
428*4882a593Smuzhiyun 
ssb_bus_unregister(struct ssb_bus * bus)429*4882a593Smuzhiyun void ssb_bus_unregister(struct ssb_bus *bus)
430*4882a593Smuzhiyun {
431*4882a593Smuzhiyun 	int err;
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun 	err = ssb_gpio_unregister(bus);
434*4882a593Smuzhiyun 	if (err == -EBUSY)
435*4882a593Smuzhiyun 		pr_debug("Some GPIOs are still in use\n");
436*4882a593Smuzhiyun 	else if (err)
437*4882a593Smuzhiyun 		pr_debug("Can not unregister GPIO driver: %i\n", err);
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	ssb_buses_lock();
440*4882a593Smuzhiyun 	ssb_devices_unregister(bus);
441*4882a593Smuzhiyun 	list_del(&bus->list);
442*4882a593Smuzhiyun 	ssb_buses_unlock();
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun 	ssb_pcmcia_exit(bus);
445*4882a593Smuzhiyun 	ssb_pci_exit(bus);
446*4882a593Smuzhiyun 	ssb_iounmap(bus);
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_bus_unregister);
449*4882a593Smuzhiyun 
ssb_release_dev(struct device * dev)450*4882a593Smuzhiyun static void ssb_release_dev(struct device *dev)
451*4882a593Smuzhiyun {
452*4882a593Smuzhiyun 	struct __ssb_dev_wrapper *devwrap;
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun 	devwrap = container_of(dev, struct __ssb_dev_wrapper, dev);
455*4882a593Smuzhiyun 	kfree(devwrap);
456*4882a593Smuzhiyun }
457*4882a593Smuzhiyun 
ssb_devices_register(struct ssb_bus * bus)458*4882a593Smuzhiyun static int ssb_devices_register(struct ssb_bus *bus)
459*4882a593Smuzhiyun {
460*4882a593Smuzhiyun 	struct ssb_device *sdev;
461*4882a593Smuzhiyun 	struct device *dev;
462*4882a593Smuzhiyun 	struct __ssb_dev_wrapper *devwrap;
463*4882a593Smuzhiyun 	int i, err = 0;
464*4882a593Smuzhiyun 	int dev_idx = 0;
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun 	for (i = 0; i < bus->nr_devices; i++) {
467*4882a593Smuzhiyun 		sdev = &(bus->devices[i]);
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun 		/* We don't register SSB-system devices to the kernel,
470*4882a593Smuzhiyun 		 * as the drivers for them are built into SSB. */
471*4882a593Smuzhiyun 		switch (sdev->id.coreid) {
472*4882a593Smuzhiyun 		case SSB_DEV_CHIPCOMMON:
473*4882a593Smuzhiyun 		case SSB_DEV_PCI:
474*4882a593Smuzhiyun 		case SSB_DEV_PCIE:
475*4882a593Smuzhiyun 		case SSB_DEV_PCMCIA:
476*4882a593Smuzhiyun 		case SSB_DEV_MIPS:
477*4882a593Smuzhiyun 		case SSB_DEV_MIPS_3302:
478*4882a593Smuzhiyun 		case SSB_DEV_EXTIF:
479*4882a593Smuzhiyun 			continue;
480*4882a593Smuzhiyun 		}
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 		devwrap = kzalloc(sizeof(*devwrap), GFP_KERNEL);
483*4882a593Smuzhiyun 		if (!devwrap) {
484*4882a593Smuzhiyun 			err = -ENOMEM;
485*4882a593Smuzhiyun 			goto error;
486*4882a593Smuzhiyun 		}
487*4882a593Smuzhiyun 		dev = &devwrap->dev;
488*4882a593Smuzhiyun 		devwrap->sdev = sdev;
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 		dev->release = ssb_release_dev;
491*4882a593Smuzhiyun 		dev->bus = &ssb_bustype;
492*4882a593Smuzhiyun 		dev_set_name(dev, "ssb%u:%d", bus->busnumber, dev_idx);
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun 		switch (bus->bustype) {
495*4882a593Smuzhiyun 		case SSB_BUSTYPE_PCI:
496*4882a593Smuzhiyun #ifdef CONFIG_SSB_PCIHOST
497*4882a593Smuzhiyun 			sdev->irq = bus->host_pci->irq;
498*4882a593Smuzhiyun 			dev->parent = &bus->host_pci->dev;
499*4882a593Smuzhiyun 			sdev->dma_dev = dev->parent;
500*4882a593Smuzhiyun #endif
501*4882a593Smuzhiyun 			break;
502*4882a593Smuzhiyun 		case SSB_BUSTYPE_PCMCIA:
503*4882a593Smuzhiyun #ifdef CONFIG_SSB_PCMCIAHOST
504*4882a593Smuzhiyun 			sdev->irq = bus->host_pcmcia->irq;
505*4882a593Smuzhiyun 			dev->parent = &bus->host_pcmcia->dev;
506*4882a593Smuzhiyun #endif
507*4882a593Smuzhiyun 			break;
508*4882a593Smuzhiyun 		case SSB_BUSTYPE_SDIO:
509*4882a593Smuzhiyun #ifdef CONFIG_SSB_SDIOHOST
510*4882a593Smuzhiyun 			dev->parent = &bus->host_sdio->dev;
511*4882a593Smuzhiyun #endif
512*4882a593Smuzhiyun 			break;
513*4882a593Smuzhiyun 		case SSB_BUSTYPE_SSB:
514*4882a593Smuzhiyun 			dev->dma_mask = &dev->coherent_dma_mask;
515*4882a593Smuzhiyun 			sdev->dma_dev = dev;
516*4882a593Smuzhiyun 			break;
517*4882a593Smuzhiyun 		}
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun 		sdev->dev = dev;
520*4882a593Smuzhiyun 		err = device_register(dev);
521*4882a593Smuzhiyun 		if (err) {
522*4882a593Smuzhiyun 			pr_err("Could not register %s\n", dev_name(dev));
523*4882a593Smuzhiyun 			/* Set dev to NULL to not unregister
524*4882a593Smuzhiyun 			 * dev on error unwinding. */
525*4882a593Smuzhiyun 			sdev->dev = NULL;
526*4882a593Smuzhiyun 			put_device(dev);
527*4882a593Smuzhiyun 			goto error;
528*4882a593Smuzhiyun 		}
529*4882a593Smuzhiyun 		dev_idx++;
530*4882a593Smuzhiyun 	}
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun #ifdef CONFIG_SSB_DRIVER_MIPS
533*4882a593Smuzhiyun 	if (bus->mipscore.pflash.present) {
534*4882a593Smuzhiyun 		err = platform_device_register(&ssb_pflash_dev);
535*4882a593Smuzhiyun 		if (err)
536*4882a593Smuzhiyun 			pr_err("Error registering parallel flash\n");
537*4882a593Smuzhiyun 	}
538*4882a593Smuzhiyun #endif
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun #ifdef CONFIG_SSB_SFLASH
541*4882a593Smuzhiyun 	if (bus->mipscore.sflash.present) {
542*4882a593Smuzhiyun 		err = platform_device_register(&ssb_sflash_dev);
543*4882a593Smuzhiyun 		if (err)
544*4882a593Smuzhiyun 			pr_err("Error registering serial flash\n");
545*4882a593Smuzhiyun 	}
546*4882a593Smuzhiyun #endif
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 	return 0;
549*4882a593Smuzhiyun error:
550*4882a593Smuzhiyun 	/* Unwind the already registered devices. */
551*4882a593Smuzhiyun 	ssb_devices_unregister(bus);
552*4882a593Smuzhiyun 	return err;
553*4882a593Smuzhiyun }
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun /* Needs ssb_buses_lock() */
ssb_attach_queued_buses(void)556*4882a593Smuzhiyun static int ssb_attach_queued_buses(void)
557*4882a593Smuzhiyun {
558*4882a593Smuzhiyun 	struct ssb_bus *bus, *n;
559*4882a593Smuzhiyun 	int err = 0;
560*4882a593Smuzhiyun 	int drop_them_all = 0;
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun 	list_for_each_entry_safe(bus, n, &attach_queue, list) {
563*4882a593Smuzhiyun 		if (drop_them_all) {
564*4882a593Smuzhiyun 			list_del(&bus->list);
565*4882a593Smuzhiyun 			continue;
566*4882a593Smuzhiyun 		}
567*4882a593Smuzhiyun 		/* Can't init the PCIcore in ssb_bus_register(), as that
568*4882a593Smuzhiyun 		 * is too early in boot for embedded systems
569*4882a593Smuzhiyun 		 * (no udelay() available). So do it here in attach stage.
570*4882a593Smuzhiyun 		 */
571*4882a593Smuzhiyun 		err = ssb_bus_powerup(bus, 0);
572*4882a593Smuzhiyun 		if (err)
573*4882a593Smuzhiyun 			goto error;
574*4882a593Smuzhiyun 		ssb_pcicore_init(&bus->pcicore);
575*4882a593Smuzhiyun 		if (bus->bustype == SSB_BUSTYPE_SSB)
576*4882a593Smuzhiyun 			ssb_watchdog_register(bus);
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun 		err = ssb_gpio_init(bus);
579*4882a593Smuzhiyun 		if (err == -ENOTSUPP)
580*4882a593Smuzhiyun 			pr_debug("GPIO driver not activated\n");
581*4882a593Smuzhiyun 		else if (err)
582*4882a593Smuzhiyun 			pr_debug("Error registering GPIO driver: %i\n", err);
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun 		ssb_bus_may_powerdown(bus);
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun 		err = ssb_devices_register(bus);
587*4882a593Smuzhiyun error:
588*4882a593Smuzhiyun 		if (err) {
589*4882a593Smuzhiyun 			drop_them_all = 1;
590*4882a593Smuzhiyun 			list_del(&bus->list);
591*4882a593Smuzhiyun 			continue;
592*4882a593Smuzhiyun 		}
593*4882a593Smuzhiyun 		list_move_tail(&bus->list, &buses);
594*4882a593Smuzhiyun 	}
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun 	return err;
597*4882a593Smuzhiyun }
598*4882a593Smuzhiyun 
ssb_fetch_invariants(struct ssb_bus * bus,ssb_invariants_func_t get_invariants)599*4882a593Smuzhiyun static int ssb_fetch_invariants(struct ssb_bus *bus,
600*4882a593Smuzhiyun 				ssb_invariants_func_t get_invariants)
601*4882a593Smuzhiyun {
602*4882a593Smuzhiyun 	struct ssb_init_invariants iv;
603*4882a593Smuzhiyun 	int err;
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 	memset(&iv, 0, sizeof(iv));
606*4882a593Smuzhiyun 	err = get_invariants(bus, &iv);
607*4882a593Smuzhiyun 	if (err)
608*4882a593Smuzhiyun 		goto out;
609*4882a593Smuzhiyun 	memcpy(&bus->boardinfo, &iv.boardinfo, sizeof(iv.boardinfo));
610*4882a593Smuzhiyun 	memcpy(&bus->sprom, &iv.sprom, sizeof(iv.sprom));
611*4882a593Smuzhiyun 	bus->has_cardbus_slot = iv.has_cardbus_slot;
612*4882a593Smuzhiyun out:
613*4882a593Smuzhiyun 	return err;
614*4882a593Smuzhiyun }
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun static int __maybe_unused
ssb_bus_register(struct ssb_bus * bus,ssb_invariants_func_t get_invariants,unsigned long baseaddr)617*4882a593Smuzhiyun ssb_bus_register(struct ssb_bus *bus,
618*4882a593Smuzhiyun 		 ssb_invariants_func_t get_invariants,
619*4882a593Smuzhiyun 		 unsigned long baseaddr)
620*4882a593Smuzhiyun {
621*4882a593Smuzhiyun 	int err;
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 	spin_lock_init(&bus->bar_lock);
624*4882a593Smuzhiyun 	INIT_LIST_HEAD(&bus->list);
625*4882a593Smuzhiyun #ifdef CONFIG_SSB_EMBEDDED
626*4882a593Smuzhiyun 	spin_lock_init(&bus->gpio_lock);
627*4882a593Smuzhiyun #endif
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 	/* Powerup the bus */
630*4882a593Smuzhiyun 	err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 1);
631*4882a593Smuzhiyun 	if (err)
632*4882a593Smuzhiyun 		goto out;
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun 	/* Init SDIO-host device (if any), before the scan */
635*4882a593Smuzhiyun 	err = ssb_sdio_init(bus);
636*4882a593Smuzhiyun 	if (err)
637*4882a593Smuzhiyun 		goto err_disable_xtal;
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun 	ssb_buses_lock();
640*4882a593Smuzhiyun 	bus->busnumber = next_busnumber;
641*4882a593Smuzhiyun 	/* Scan for devices (cores) */
642*4882a593Smuzhiyun 	err = ssb_bus_scan(bus, baseaddr);
643*4882a593Smuzhiyun 	if (err)
644*4882a593Smuzhiyun 		goto err_sdio_exit;
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun 	/* Init PCI-host device (if any) */
647*4882a593Smuzhiyun 	err = ssb_pci_init(bus);
648*4882a593Smuzhiyun 	if (err)
649*4882a593Smuzhiyun 		goto err_unmap;
650*4882a593Smuzhiyun 	/* Init PCMCIA-host device (if any) */
651*4882a593Smuzhiyun 	err = ssb_pcmcia_init(bus);
652*4882a593Smuzhiyun 	if (err)
653*4882a593Smuzhiyun 		goto err_pci_exit;
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun 	/* Initialize basic system devices (if available) */
656*4882a593Smuzhiyun 	err = ssb_bus_powerup(bus, 0);
657*4882a593Smuzhiyun 	if (err)
658*4882a593Smuzhiyun 		goto err_pcmcia_exit;
659*4882a593Smuzhiyun 	ssb_chipcommon_init(&bus->chipco);
660*4882a593Smuzhiyun 	ssb_extif_init(&bus->extif);
661*4882a593Smuzhiyun 	ssb_mipscore_init(&bus->mipscore);
662*4882a593Smuzhiyun 	err = ssb_fetch_invariants(bus, get_invariants);
663*4882a593Smuzhiyun 	if (err) {
664*4882a593Smuzhiyun 		ssb_bus_may_powerdown(bus);
665*4882a593Smuzhiyun 		goto err_pcmcia_exit;
666*4882a593Smuzhiyun 	}
667*4882a593Smuzhiyun 	ssb_bus_may_powerdown(bus);
668*4882a593Smuzhiyun 
669*4882a593Smuzhiyun 	/* Queue it for attach.
670*4882a593Smuzhiyun 	 * See the comment at the ssb_is_early_boot definition. */
671*4882a593Smuzhiyun 	list_add_tail(&bus->list, &attach_queue);
672*4882a593Smuzhiyun 	if (!ssb_is_early_boot) {
673*4882a593Smuzhiyun 		/* This is not early boot, so we must attach the bus now */
674*4882a593Smuzhiyun 		err = ssb_attach_queued_buses();
675*4882a593Smuzhiyun 		if (err)
676*4882a593Smuzhiyun 			goto err_dequeue;
677*4882a593Smuzhiyun 	}
678*4882a593Smuzhiyun 	next_busnumber++;
679*4882a593Smuzhiyun 	ssb_buses_unlock();
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun out:
682*4882a593Smuzhiyun 	return err;
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun err_dequeue:
685*4882a593Smuzhiyun 	list_del(&bus->list);
686*4882a593Smuzhiyun err_pcmcia_exit:
687*4882a593Smuzhiyun 	ssb_pcmcia_exit(bus);
688*4882a593Smuzhiyun err_pci_exit:
689*4882a593Smuzhiyun 	ssb_pci_exit(bus);
690*4882a593Smuzhiyun err_unmap:
691*4882a593Smuzhiyun 	ssb_iounmap(bus);
692*4882a593Smuzhiyun err_sdio_exit:
693*4882a593Smuzhiyun 	ssb_sdio_exit(bus);
694*4882a593Smuzhiyun err_disable_xtal:
695*4882a593Smuzhiyun 	ssb_buses_unlock();
696*4882a593Smuzhiyun 	ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 0);
697*4882a593Smuzhiyun 	return err;
698*4882a593Smuzhiyun }
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun #ifdef CONFIG_SSB_PCIHOST
ssb_bus_pcibus_register(struct ssb_bus * bus,struct pci_dev * host_pci)701*4882a593Smuzhiyun int ssb_bus_pcibus_register(struct ssb_bus *bus, struct pci_dev *host_pci)
702*4882a593Smuzhiyun {
703*4882a593Smuzhiyun 	int err;
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun 	bus->bustype = SSB_BUSTYPE_PCI;
706*4882a593Smuzhiyun 	bus->host_pci = host_pci;
707*4882a593Smuzhiyun 	bus->ops = &ssb_pci_ops;
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 	err = ssb_bus_register(bus, ssb_pci_get_invariants, 0);
710*4882a593Smuzhiyun 	if (!err) {
711*4882a593Smuzhiyun 		dev_info(&host_pci->dev,
712*4882a593Smuzhiyun 			 "Sonics Silicon Backplane found on PCI device %s\n",
713*4882a593Smuzhiyun 			 dev_name(&host_pci->dev));
714*4882a593Smuzhiyun 	} else {
715*4882a593Smuzhiyun 		dev_err(&host_pci->dev,
716*4882a593Smuzhiyun 			"Failed to register PCI version of SSB with error %d\n",
717*4882a593Smuzhiyun 			err);
718*4882a593Smuzhiyun 	}
719*4882a593Smuzhiyun 
720*4882a593Smuzhiyun 	return err;
721*4882a593Smuzhiyun }
722*4882a593Smuzhiyun #endif /* CONFIG_SSB_PCIHOST */
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun #ifdef CONFIG_SSB_PCMCIAHOST
ssb_bus_pcmciabus_register(struct ssb_bus * bus,struct pcmcia_device * pcmcia_dev,unsigned long baseaddr)725*4882a593Smuzhiyun int ssb_bus_pcmciabus_register(struct ssb_bus *bus,
726*4882a593Smuzhiyun 			       struct pcmcia_device *pcmcia_dev,
727*4882a593Smuzhiyun 			       unsigned long baseaddr)
728*4882a593Smuzhiyun {
729*4882a593Smuzhiyun 	int err;
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun 	bus->bustype = SSB_BUSTYPE_PCMCIA;
732*4882a593Smuzhiyun 	bus->host_pcmcia = pcmcia_dev;
733*4882a593Smuzhiyun 	bus->ops = &ssb_pcmcia_ops;
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	err = ssb_bus_register(bus, ssb_pcmcia_get_invariants, baseaddr);
736*4882a593Smuzhiyun 	if (!err) {
737*4882a593Smuzhiyun 		dev_info(&pcmcia_dev->dev,
738*4882a593Smuzhiyun 			 "Sonics Silicon Backplane found on PCMCIA device %s\n",
739*4882a593Smuzhiyun 			 pcmcia_dev->devname);
740*4882a593Smuzhiyun 	}
741*4882a593Smuzhiyun 
742*4882a593Smuzhiyun 	return err;
743*4882a593Smuzhiyun }
744*4882a593Smuzhiyun #endif /* CONFIG_SSB_PCMCIAHOST */
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun #ifdef CONFIG_SSB_SDIOHOST
ssb_bus_sdiobus_register(struct ssb_bus * bus,struct sdio_func * func,unsigned int quirks)747*4882a593Smuzhiyun int ssb_bus_sdiobus_register(struct ssb_bus *bus, struct sdio_func *func,
748*4882a593Smuzhiyun 			     unsigned int quirks)
749*4882a593Smuzhiyun {
750*4882a593Smuzhiyun 	int err;
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun 	bus->bustype = SSB_BUSTYPE_SDIO;
753*4882a593Smuzhiyun 	bus->host_sdio = func;
754*4882a593Smuzhiyun 	bus->ops = &ssb_sdio_ops;
755*4882a593Smuzhiyun 	bus->quirks = quirks;
756*4882a593Smuzhiyun 
757*4882a593Smuzhiyun 	err = ssb_bus_register(bus, ssb_sdio_get_invariants, ~0);
758*4882a593Smuzhiyun 	if (!err) {
759*4882a593Smuzhiyun 		dev_info(&func->dev,
760*4882a593Smuzhiyun 			 "Sonics Silicon Backplane found on SDIO device %s\n",
761*4882a593Smuzhiyun 			 sdio_func_id(func));
762*4882a593Smuzhiyun 	}
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun 	return err;
765*4882a593Smuzhiyun }
766*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_bus_sdiobus_register);
767*4882a593Smuzhiyun #endif /* CONFIG_SSB_PCMCIAHOST */
768*4882a593Smuzhiyun 
769*4882a593Smuzhiyun #ifdef CONFIG_SSB_HOST_SOC
ssb_bus_host_soc_register(struct ssb_bus * bus,unsigned long baseaddr)770*4882a593Smuzhiyun int ssb_bus_host_soc_register(struct ssb_bus *bus, unsigned long baseaddr)
771*4882a593Smuzhiyun {
772*4882a593Smuzhiyun 	int err;
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun 	bus->bustype = SSB_BUSTYPE_SSB;
775*4882a593Smuzhiyun 	bus->ops = &ssb_host_soc_ops;
776*4882a593Smuzhiyun 
777*4882a593Smuzhiyun 	err = ssb_bus_register(bus, ssb_host_soc_get_invariants, baseaddr);
778*4882a593Smuzhiyun 	if (!err) {
779*4882a593Smuzhiyun 		pr_info("Sonics Silicon Backplane found at address 0x%08lX\n",
780*4882a593Smuzhiyun 			baseaddr);
781*4882a593Smuzhiyun 	}
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun 	return err;
784*4882a593Smuzhiyun }
785*4882a593Smuzhiyun #endif
786*4882a593Smuzhiyun 
__ssb_driver_register(struct ssb_driver * drv,struct module * owner)787*4882a593Smuzhiyun int __ssb_driver_register(struct ssb_driver *drv, struct module *owner)
788*4882a593Smuzhiyun {
789*4882a593Smuzhiyun 	drv->drv.name = drv->name;
790*4882a593Smuzhiyun 	drv->drv.bus = &ssb_bustype;
791*4882a593Smuzhiyun 	drv->drv.owner = owner;
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun 	return driver_register(&drv->drv);
794*4882a593Smuzhiyun }
795*4882a593Smuzhiyun EXPORT_SYMBOL(__ssb_driver_register);
796*4882a593Smuzhiyun 
ssb_driver_unregister(struct ssb_driver * drv)797*4882a593Smuzhiyun void ssb_driver_unregister(struct ssb_driver *drv)
798*4882a593Smuzhiyun {
799*4882a593Smuzhiyun 	driver_unregister(&drv->drv);
800*4882a593Smuzhiyun }
801*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_driver_unregister);
802*4882a593Smuzhiyun 
ssb_set_devtypedata(struct ssb_device * dev,void * data)803*4882a593Smuzhiyun void ssb_set_devtypedata(struct ssb_device *dev, void *data)
804*4882a593Smuzhiyun {
805*4882a593Smuzhiyun 	struct ssb_bus *bus = dev->bus;
806*4882a593Smuzhiyun 	struct ssb_device *ent;
807*4882a593Smuzhiyun 	int i;
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun 	for (i = 0; i < bus->nr_devices; i++) {
810*4882a593Smuzhiyun 		ent = &(bus->devices[i]);
811*4882a593Smuzhiyun 		if (ent->id.vendor != dev->id.vendor)
812*4882a593Smuzhiyun 			continue;
813*4882a593Smuzhiyun 		if (ent->id.coreid != dev->id.coreid)
814*4882a593Smuzhiyun 			continue;
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun 		ent->devtypedata = data;
817*4882a593Smuzhiyun 	}
818*4882a593Smuzhiyun }
819*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_set_devtypedata);
820*4882a593Smuzhiyun 
clkfactor_f6_resolve(u32 v)821*4882a593Smuzhiyun static u32 clkfactor_f6_resolve(u32 v)
822*4882a593Smuzhiyun {
823*4882a593Smuzhiyun 	/* map the magic values */
824*4882a593Smuzhiyun 	switch (v) {
825*4882a593Smuzhiyun 	case SSB_CHIPCO_CLK_F6_2:
826*4882a593Smuzhiyun 		return 2;
827*4882a593Smuzhiyun 	case SSB_CHIPCO_CLK_F6_3:
828*4882a593Smuzhiyun 		return 3;
829*4882a593Smuzhiyun 	case SSB_CHIPCO_CLK_F6_4:
830*4882a593Smuzhiyun 		return 4;
831*4882a593Smuzhiyun 	case SSB_CHIPCO_CLK_F6_5:
832*4882a593Smuzhiyun 		return 5;
833*4882a593Smuzhiyun 	case SSB_CHIPCO_CLK_F6_6:
834*4882a593Smuzhiyun 		return 6;
835*4882a593Smuzhiyun 	case SSB_CHIPCO_CLK_F6_7:
836*4882a593Smuzhiyun 		return 7;
837*4882a593Smuzhiyun 	}
838*4882a593Smuzhiyun 	return 0;
839*4882a593Smuzhiyun }
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun /* Calculate the speed the backplane would run at a given set of clockcontrol values */
ssb_calc_clock_rate(u32 plltype,u32 n,u32 m)842*4882a593Smuzhiyun u32 ssb_calc_clock_rate(u32 plltype, u32 n, u32 m)
843*4882a593Smuzhiyun {
844*4882a593Smuzhiyun 	u32 n1, n2, clock, m1, m2, m3, mc;
845*4882a593Smuzhiyun 
846*4882a593Smuzhiyun 	n1 = (n & SSB_CHIPCO_CLK_N1);
847*4882a593Smuzhiyun 	n2 = ((n & SSB_CHIPCO_CLK_N2) >> SSB_CHIPCO_CLK_N2_SHIFT);
848*4882a593Smuzhiyun 
849*4882a593Smuzhiyun 	switch (plltype) {
850*4882a593Smuzhiyun 	case SSB_PLLTYPE_6: /* 100/200 or 120/240 only */
851*4882a593Smuzhiyun 		if (m & SSB_CHIPCO_CLK_T6_MMASK)
852*4882a593Smuzhiyun 			return SSB_CHIPCO_CLK_T6_M1;
853*4882a593Smuzhiyun 		return SSB_CHIPCO_CLK_T6_M0;
854*4882a593Smuzhiyun 	case SSB_PLLTYPE_1: /* 48Mhz base, 3 dividers */
855*4882a593Smuzhiyun 	case SSB_PLLTYPE_3: /* 25Mhz, 2 dividers */
856*4882a593Smuzhiyun 	case SSB_PLLTYPE_4: /* 48Mhz, 4 dividers */
857*4882a593Smuzhiyun 	case SSB_PLLTYPE_7: /* 25Mhz, 4 dividers */
858*4882a593Smuzhiyun 		n1 = clkfactor_f6_resolve(n1);
859*4882a593Smuzhiyun 		n2 += SSB_CHIPCO_CLK_F5_BIAS;
860*4882a593Smuzhiyun 		break;
861*4882a593Smuzhiyun 	case SSB_PLLTYPE_2: /* 48Mhz, 4 dividers */
862*4882a593Smuzhiyun 		n1 += SSB_CHIPCO_CLK_T2_BIAS;
863*4882a593Smuzhiyun 		n2 += SSB_CHIPCO_CLK_T2_BIAS;
864*4882a593Smuzhiyun 		WARN_ON(!((n1 >= 2) && (n1 <= 7)));
865*4882a593Smuzhiyun 		WARN_ON(!((n2 >= 5) && (n2 <= 23)));
866*4882a593Smuzhiyun 		break;
867*4882a593Smuzhiyun 	case SSB_PLLTYPE_5: /* 25Mhz, 4 dividers */
868*4882a593Smuzhiyun 		return 100000000;
869*4882a593Smuzhiyun 	default:
870*4882a593Smuzhiyun 		WARN_ON(1);
871*4882a593Smuzhiyun 	}
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun 	switch (plltype) {
874*4882a593Smuzhiyun 	case SSB_PLLTYPE_3: /* 25Mhz, 2 dividers */
875*4882a593Smuzhiyun 	case SSB_PLLTYPE_7: /* 25Mhz, 4 dividers */
876*4882a593Smuzhiyun 		clock = SSB_CHIPCO_CLK_BASE2 * n1 * n2;
877*4882a593Smuzhiyun 		break;
878*4882a593Smuzhiyun 	default:
879*4882a593Smuzhiyun 		clock = SSB_CHIPCO_CLK_BASE1 * n1 * n2;
880*4882a593Smuzhiyun 	}
881*4882a593Smuzhiyun 	if (!clock)
882*4882a593Smuzhiyun 		return 0;
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun 	m1 = (m & SSB_CHIPCO_CLK_M1);
885*4882a593Smuzhiyun 	m2 = ((m & SSB_CHIPCO_CLK_M2) >> SSB_CHIPCO_CLK_M2_SHIFT);
886*4882a593Smuzhiyun 	m3 = ((m & SSB_CHIPCO_CLK_M3) >> SSB_CHIPCO_CLK_M3_SHIFT);
887*4882a593Smuzhiyun 	mc = ((m & SSB_CHIPCO_CLK_MC) >> SSB_CHIPCO_CLK_MC_SHIFT);
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun 	switch (plltype) {
890*4882a593Smuzhiyun 	case SSB_PLLTYPE_1: /* 48Mhz base, 3 dividers */
891*4882a593Smuzhiyun 	case SSB_PLLTYPE_3: /* 25Mhz, 2 dividers */
892*4882a593Smuzhiyun 	case SSB_PLLTYPE_4: /* 48Mhz, 4 dividers */
893*4882a593Smuzhiyun 	case SSB_PLLTYPE_7: /* 25Mhz, 4 dividers */
894*4882a593Smuzhiyun 		m1 = clkfactor_f6_resolve(m1);
895*4882a593Smuzhiyun 		if ((plltype == SSB_PLLTYPE_1) ||
896*4882a593Smuzhiyun 		    (plltype == SSB_PLLTYPE_3))
897*4882a593Smuzhiyun 			m2 += SSB_CHIPCO_CLK_F5_BIAS;
898*4882a593Smuzhiyun 		else
899*4882a593Smuzhiyun 			m2 = clkfactor_f6_resolve(m2);
900*4882a593Smuzhiyun 		m3 = clkfactor_f6_resolve(m3);
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun 		switch (mc) {
903*4882a593Smuzhiyun 		case SSB_CHIPCO_CLK_MC_BYPASS:
904*4882a593Smuzhiyun 			return clock;
905*4882a593Smuzhiyun 		case SSB_CHIPCO_CLK_MC_M1:
906*4882a593Smuzhiyun 			return (clock / m1);
907*4882a593Smuzhiyun 		case SSB_CHIPCO_CLK_MC_M1M2:
908*4882a593Smuzhiyun 			return (clock / (m1 * m2));
909*4882a593Smuzhiyun 		case SSB_CHIPCO_CLK_MC_M1M2M3:
910*4882a593Smuzhiyun 			return (clock / (m1 * m2 * m3));
911*4882a593Smuzhiyun 		case SSB_CHIPCO_CLK_MC_M1M3:
912*4882a593Smuzhiyun 			return (clock / (m1 * m3));
913*4882a593Smuzhiyun 		}
914*4882a593Smuzhiyun 		return 0;
915*4882a593Smuzhiyun 	case SSB_PLLTYPE_2:
916*4882a593Smuzhiyun 		m1 += SSB_CHIPCO_CLK_T2_BIAS;
917*4882a593Smuzhiyun 		m2 += SSB_CHIPCO_CLK_T2M2_BIAS;
918*4882a593Smuzhiyun 		m3 += SSB_CHIPCO_CLK_T2_BIAS;
919*4882a593Smuzhiyun 		WARN_ON(!((m1 >= 2) && (m1 <= 7)));
920*4882a593Smuzhiyun 		WARN_ON(!((m2 >= 3) && (m2 <= 10)));
921*4882a593Smuzhiyun 		WARN_ON(!((m3 >= 2) && (m3 <= 7)));
922*4882a593Smuzhiyun 
923*4882a593Smuzhiyun 		if (!(mc & SSB_CHIPCO_CLK_T2MC_M1BYP))
924*4882a593Smuzhiyun 			clock /= m1;
925*4882a593Smuzhiyun 		if (!(mc & SSB_CHIPCO_CLK_T2MC_M2BYP))
926*4882a593Smuzhiyun 			clock /= m2;
927*4882a593Smuzhiyun 		if (!(mc & SSB_CHIPCO_CLK_T2MC_M3BYP))
928*4882a593Smuzhiyun 			clock /= m3;
929*4882a593Smuzhiyun 		return clock;
930*4882a593Smuzhiyun 	default:
931*4882a593Smuzhiyun 		WARN_ON(1);
932*4882a593Smuzhiyun 	}
933*4882a593Smuzhiyun 	return 0;
934*4882a593Smuzhiyun }
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun /* Get the current speed the backplane is running at */
ssb_clockspeed(struct ssb_bus * bus)937*4882a593Smuzhiyun u32 ssb_clockspeed(struct ssb_bus *bus)
938*4882a593Smuzhiyun {
939*4882a593Smuzhiyun 	u32 rate;
940*4882a593Smuzhiyun 	u32 plltype;
941*4882a593Smuzhiyun 	u32 clkctl_n, clkctl_m;
942*4882a593Smuzhiyun 
943*4882a593Smuzhiyun 	if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU)
944*4882a593Smuzhiyun 		return ssb_pmu_get_controlclock(&bus->chipco);
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun 	if (ssb_extif_available(&bus->extif))
947*4882a593Smuzhiyun 		ssb_extif_get_clockcontrol(&bus->extif, &plltype,
948*4882a593Smuzhiyun 					   &clkctl_n, &clkctl_m);
949*4882a593Smuzhiyun 	else if (bus->chipco.dev)
950*4882a593Smuzhiyun 		ssb_chipco_get_clockcontrol(&bus->chipco, &plltype,
951*4882a593Smuzhiyun 					    &clkctl_n, &clkctl_m);
952*4882a593Smuzhiyun 	else
953*4882a593Smuzhiyun 		return 0;
954*4882a593Smuzhiyun 
955*4882a593Smuzhiyun 	if (bus->chip_id == 0x5365) {
956*4882a593Smuzhiyun 		rate = 100000000;
957*4882a593Smuzhiyun 	} else {
958*4882a593Smuzhiyun 		rate = ssb_calc_clock_rate(plltype, clkctl_n, clkctl_m);
959*4882a593Smuzhiyun 		if (plltype == SSB_PLLTYPE_3) /* 25Mhz, 2 dividers */
960*4882a593Smuzhiyun 			rate /= 2;
961*4882a593Smuzhiyun 	}
962*4882a593Smuzhiyun 
963*4882a593Smuzhiyun 	return rate;
964*4882a593Smuzhiyun }
965*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_clockspeed);
966*4882a593Smuzhiyun 
ssb_tmslow_reject_bitmask(struct ssb_device * dev)967*4882a593Smuzhiyun static u32 ssb_tmslow_reject_bitmask(struct ssb_device *dev)
968*4882a593Smuzhiyun {
969*4882a593Smuzhiyun 	u32 rev = ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_SSBREV;
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 	/* The REJECT bit seems to be different for Backplane rev 2.3 */
972*4882a593Smuzhiyun 	switch (rev) {
973*4882a593Smuzhiyun 	case SSB_IDLOW_SSBREV_22:
974*4882a593Smuzhiyun 	case SSB_IDLOW_SSBREV_24:
975*4882a593Smuzhiyun 	case SSB_IDLOW_SSBREV_26:
976*4882a593Smuzhiyun 		return SSB_TMSLOW_REJECT;
977*4882a593Smuzhiyun 	case SSB_IDLOW_SSBREV_23:
978*4882a593Smuzhiyun 		return SSB_TMSLOW_REJECT_23;
979*4882a593Smuzhiyun 	case SSB_IDLOW_SSBREV_25:     /* TODO - find the proper REJECT bit */
980*4882a593Smuzhiyun 	case SSB_IDLOW_SSBREV_27:     /* same here */
981*4882a593Smuzhiyun 		return SSB_TMSLOW_REJECT;	/* this is a guess */
982*4882a593Smuzhiyun 	case SSB_IDLOW_SSBREV:
983*4882a593Smuzhiyun 		break;
984*4882a593Smuzhiyun 	default:
985*4882a593Smuzhiyun 		WARN(1, KERN_INFO "ssb: Backplane Revision 0x%.8X\n", rev);
986*4882a593Smuzhiyun 	}
987*4882a593Smuzhiyun 	return (SSB_TMSLOW_REJECT | SSB_TMSLOW_REJECT_23);
988*4882a593Smuzhiyun }
989*4882a593Smuzhiyun 
ssb_device_is_enabled(struct ssb_device * dev)990*4882a593Smuzhiyun int ssb_device_is_enabled(struct ssb_device *dev)
991*4882a593Smuzhiyun {
992*4882a593Smuzhiyun 	u32 val;
993*4882a593Smuzhiyun 	u32 reject;
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun 	reject = ssb_tmslow_reject_bitmask(dev);
996*4882a593Smuzhiyun 	val = ssb_read32(dev, SSB_TMSLOW);
997*4882a593Smuzhiyun 	val &= SSB_TMSLOW_CLOCK | SSB_TMSLOW_RESET | reject;
998*4882a593Smuzhiyun 
999*4882a593Smuzhiyun 	return (val == SSB_TMSLOW_CLOCK);
1000*4882a593Smuzhiyun }
1001*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_device_is_enabled);
1002*4882a593Smuzhiyun 
ssb_flush_tmslow(struct ssb_device * dev)1003*4882a593Smuzhiyun static void ssb_flush_tmslow(struct ssb_device *dev)
1004*4882a593Smuzhiyun {
1005*4882a593Smuzhiyun 	/* Make _really_ sure the device has finished the TMSLOW
1006*4882a593Smuzhiyun 	 * register write transaction, as we risk running into
1007*4882a593Smuzhiyun 	 * a machine check exception otherwise.
1008*4882a593Smuzhiyun 	 * Do this by reading the register back to commit the
1009*4882a593Smuzhiyun 	 * PCI write and delay an additional usec for the device
1010*4882a593Smuzhiyun 	 * to react to the change. */
1011*4882a593Smuzhiyun 	ssb_read32(dev, SSB_TMSLOW);
1012*4882a593Smuzhiyun 	udelay(1);
1013*4882a593Smuzhiyun }
1014*4882a593Smuzhiyun 
ssb_device_enable(struct ssb_device * dev,u32 core_specific_flags)1015*4882a593Smuzhiyun void ssb_device_enable(struct ssb_device *dev, u32 core_specific_flags)
1016*4882a593Smuzhiyun {
1017*4882a593Smuzhiyun 	u32 val;
1018*4882a593Smuzhiyun 
1019*4882a593Smuzhiyun 	ssb_device_disable(dev, core_specific_flags);
1020*4882a593Smuzhiyun 	ssb_write32(dev, SSB_TMSLOW,
1021*4882a593Smuzhiyun 		    SSB_TMSLOW_RESET | SSB_TMSLOW_CLOCK |
1022*4882a593Smuzhiyun 		    SSB_TMSLOW_FGC | core_specific_flags);
1023*4882a593Smuzhiyun 	ssb_flush_tmslow(dev);
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun 	/* Clear SERR if set. This is a hw bug workaround. */
1026*4882a593Smuzhiyun 	if (ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_SERR)
1027*4882a593Smuzhiyun 		ssb_write32(dev, SSB_TMSHIGH, 0);
1028*4882a593Smuzhiyun 
1029*4882a593Smuzhiyun 	val = ssb_read32(dev, SSB_IMSTATE);
1030*4882a593Smuzhiyun 	if (val & (SSB_IMSTATE_IBE | SSB_IMSTATE_TO)) {
1031*4882a593Smuzhiyun 		val &= ~(SSB_IMSTATE_IBE | SSB_IMSTATE_TO);
1032*4882a593Smuzhiyun 		ssb_write32(dev, SSB_IMSTATE, val);
1033*4882a593Smuzhiyun 	}
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun 	ssb_write32(dev, SSB_TMSLOW,
1036*4882a593Smuzhiyun 		    SSB_TMSLOW_CLOCK | SSB_TMSLOW_FGC |
1037*4882a593Smuzhiyun 		    core_specific_flags);
1038*4882a593Smuzhiyun 	ssb_flush_tmslow(dev);
1039*4882a593Smuzhiyun 
1040*4882a593Smuzhiyun 	ssb_write32(dev, SSB_TMSLOW, SSB_TMSLOW_CLOCK |
1041*4882a593Smuzhiyun 		    core_specific_flags);
1042*4882a593Smuzhiyun 	ssb_flush_tmslow(dev);
1043*4882a593Smuzhiyun }
1044*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_device_enable);
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun /* Wait for bitmask in a register to get set or cleared.
1047*4882a593Smuzhiyun  * timeout is in units of ten-microseconds */
ssb_wait_bits(struct ssb_device * dev,u16 reg,u32 bitmask,int timeout,int set)1048*4882a593Smuzhiyun static int ssb_wait_bits(struct ssb_device *dev, u16 reg, u32 bitmask,
1049*4882a593Smuzhiyun 			 int timeout, int set)
1050*4882a593Smuzhiyun {
1051*4882a593Smuzhiyun 	int i;
1052*4882a593Smuzhiyun 	u32 val;
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun 	for (i = 0; i < timeout; i++) {
1055*4882a593Smuzhiyun 		val = ssb_read32(dev, reg);
1056*4882a593Smuzhiyun 		if (set) {
1057*4882a593Smuzhiyun 			if ((val & bitmask) == bitmask)
1058*4882a593Smuzhiyun 				return 0;
1059*4882a593Smuzhiyun 		} else {
1060*4882a593Smuzhiyun 			if (!(val & bitmask))
1061*4882a593Smuzhiyun 				return 0;
1062*4882a593Smuzhiyun 		}
1063*4882a593Smuzhiyun 		udelay(10);
1064*4882a593Smuzhiyun 	}
1065*4882a593Smuzhiyun 	dev_err(dev->dev,
1066*4882a593Smuzhiyun 		"Timeout waiting for bitmask %08X on register %04X to %s\n",
1067*4882a593Smuzhiyun 		bitmask, reg, set ? "set" : "clear");
1068*4882a593Smuzhiyun 
1069*4882a593Smuzhiyun 	return -ETIMEDOUT;
1070*4882a593Smuzhiyun }
1071*4882a593Smuzhiyun 
ssb_device_disable(struct ssb_device * dev,u32 core_specific_flags)1072*4882a593Smuzhiyun void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags)
1073*4882a593Smuzhiyun {
1074*4882a593Smuzhiyun 	u32 reject, val;
1075*4882a593Smuzhiyun 
1076*4882a593Smuzhiyun 	if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_RESET)
1077*4882a593Smuzhiyun 		return;
1078*4882a593Smuzhiyun 
1079*4882a593Smuzhiyun 	reject = ssb_tmslow_reject_bitmask(dev);
1080*4882a593Smuzhiyun 
1081*4882a593Smuzhiyun 	if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_CLOCK) {
1082*4882a593Smuzhiyun 		ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK);
1083*4882a593Smuzhiyun 		ssb_wait_bits(dev, SSB_TMSLOW, reject, 1000, 1);
1084*4882a593Smuzhiyun 		ssb_wait_bits(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0);
1085*4882a593Smuzhiyun 
1086*4882a593Smuzhiyun 		if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
1087*4882a593Smuzhiyun 			val = ssb_read32(dev, SSB_IMSTATE);
1088*4882a593Smuzhiyun 			val |= SSB_IMSTATE_REJECT;
1089*4882a593Smuzhiyun 			ssb_write32(dev, SSB_IMSTATE, val);
1090*4882a593Smuzhiyun 			ssb_wait_bits(dev, SSB_IMSTATE, SSB_IMSTATE_BUSY, 1000,
1091*4882a593Smuzhiyun 				      0);
1092*4882a593Smuzhiyun 		}
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun 		ssb_write32(dev, SSB_TMSLOW,
1095*4882a593Smuzhiyun 			SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK |
1096*4882a593Smuzhiyun 			reject | SSB_TMSLOW_RESET |
1097*4882a593Smuzhiyun 			core_specific_flags);
1098*4882a593Smuzhiyun 		ssb_flush_tmslow(dev);
1099*4882a593Smuzhiyun 
1100*4882a593Smuzhiyun 		if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
1101*4882a593Smuzhiyun 			val = ssb_read32(dev, SSB_IMSTATE);
1102*4882a593Smuzhiyun 			val &= ~SSB_IMSTATE_REJECT;
1103*4882a593Smuzhiyun 			ssb_write32(dev, SSB_IMSTATE, val);
1104*4882a593Smuzhiyun 		}
1105*4882a593Smuzhiyun 	}
1106*4882a593Smuzhiyun 
1107*4882a593Smuzhiyun 	ssb_write32(dev, SSB_TMSLOW,
1108*4882a593Smuzhiyun 		    reject | SSB_TMSLOW_RESET |
1109*4882a593Smuzhiyun 		    core_specific_flags);
1110*4882a593Smuzhiyun 	ssb_flush_tmslow(dev);
1111*4882a593Smuzhiyun }
1112*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_device_disable);
1113*4882a593Smuzhiyun 
1114*4882a593Smuzhiyun /* Some chipsets need routing known for PCIe and 64-bit DMA */
ssb_dma_translation_special_bit(struct ssb_device * dev)1115*4882a593Smuzhiyun static bool ssb_dma_translation_special_bit(struct ssb_device *dev)
1116*4882a593Smuzhiyun {
1117*4882a593Smuzhiyun 	u16 chip_id = dev->bus->chip_id;
1118*4882a593Smuzhiyun 
1119*4882a593Smuzhiyun 	if (dev->id.coreid == SSB_DEV_80211) {
1120*4882a593Smuzhiyun 		return (chip_id == 0x4322 || chip_id == 43221 ||
1121*4882a593Smuzhiyun 			chip_id == 43231 || chip_id == 43222);
1122*4882a593Smuzhiyun 	}
1123*4882a593Smuzhiyun 
1124*4882a593Smuzhiyun 	return false;
1125*4882a593Smuzhiyun }
1126*4882a593Smuzhiyun 
ssb_dma_translation(struct ssb_device * dev)1127*4882a593Smuzhiyun u32 ssb_dma_translation(struct ssb_device *dev)
1128*4882a593Smuzhiyun {
1129*4882a593Smuzhiyun 	switch (dev->bus->bustype) {
1130*4882a593Smuzhiyun 	case SSB_BUSTYPE_SSB:
1131*4882a593Smuzhiyun 		return 0;
1132*4882a593Smuzhiyun 	case SSB_BUSTYPE_PCI:
1133*4882a593Smuzhiyun 		if (pci_is_pcie(dev->bus->host_pci) &&
1134*4882a593Smuzhiyun 		    ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64) {
1135*4882a593Smuzhiyun 			return SSB_PCIE_DMA_H32;
1136*4882a593Smuzhiyun 		} else {
1137*4882a593Smuzhiyun 			if (ssb_dma_translation_special_bit(dev))
1138*4882a593Smuzhiyun 				return SSB_PCIE_DMA_H32;
1139*4882a593Smuzhiyun 			else
1140*4882a593Smuzhiyun 				return SSB_PCI_DMA;
1141*4882a593Smuzhiyun 		}
1142*4882a593Smuzhiyun 	default:
1143*4882a593Smuzhiyun 		__ssb_dma_not_implemented(dev);
1144*4882a593Smuzhiyun 	}
1145*4882a593Smuzhiyun 	return 0;
1146*4882a593Smuzhiyun }
1147*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_dma_translation);
1148*4882a593Smuzhiyun 
ssb_bus_may_powerdown(struct ssb_bus * bus)1149*4882a593Smuzhiyun int ssb_bus_may_powerdown(struct ssb_bus *bus)
1150*4882a593Smuzhiyun {
1151*4882a593Smuzhiyun 	struct ssb_chipcommon *cc;
1152*4882a593Smuzhiyun 	int err = 0;
1153*4882a593Smuzhiyun 
1154*4882a593Smuzhiyun 	/* On buses where more than one core may be working
1155*4882a593Smuzhiyun 	 * at a time, we must not powerdown stuff if there are
1156*4882a593Smuzhiyun 	 * still cores that may want to run. */
1157*4882a593Smuzhiyun 	if (bus->bustype == SSB_BUSTYPE_SSB)
1158*4882a593Smuzhiyun 		goto out;
1159*4882a593Smuzhiyun 
1160*4882a593Smuzhiyun 	cc = &bus->chipco;
1161*4882a593Smuzhiyun 
1162*4882a593Smuzhiyun 	if (!cc->dev)
1163*4882a593Smuzhiyun 		goto out;
1164*4882a593Smuzhiyun 	if (cc->dev->id.revision < 5)
1165*4882a593Smuzhiyun 		goto out;
1166*4882a593Smuzhiyun 
1167*4882a593Smuzhiyun 	ssb_chipco_set_clockmode(cc, SSB_CLKMODE_SLOW);
1168*4882a593Smuzhiyun 	err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 0);
1169*4882a593Smuzhiyun 	if (err)
1170*4882a593Smuzhiyun 		goto error;
1171*4882a593Smuzhiyun out:
1172*4882a593Smuzhiyun 	bus->powered_up = 0;
1173*4882a593Smuzhiyun 	return err;
1174*4882a593Smuzhiyun error:
1175*4882a593Smuzhiyun 	pr_err("Bus powerdown failed\n");
1176*4882a593Smuzhiyun 	goto out;
1177*4882a593Smuzhiyun }
1178*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_bus_may_powerdown);
1179*4882a593Smuzhiyun 
ssb_bus_powerup(struct ssb_bus * bus,bool dynamic_pctl)1180*4882a593Smuzhiyun int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl)
1181*4882a593Smuzhiyun {
1182*4882a593Smuzhiyun 	int err;
1183*4882a593Smuzhiyun 	enum ssb_clkmode mode;
1184*4882a593Smuzhiyun 
1185*4882a593Smuzhiyun 	err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 1);
1186*4882a593Smuzhiyun 	if (err)
1187*4882a593Smuzhiyun 		goto error;
1188*4882a593Smuzhiyun 
1189*4882a593Smuzhiyun 	bus->powered_up = 1;
1190*4882a593Smuzhiyun 
1191*4882a593Smuzhiyun 	mode = dynamic_pctl ? SSB_CLKMODE_DYNAMIC : SSB_CLKMODE_FAST;
1192*4882a593Smuzhiyun 	ssb_chipco_set_clockmode(&bus->chipco, mode);
1193*4882a593Smuzhiyun 
1194*4882a593Smuzhiyun 	return 0;
1195*4882a593Smuzhiyun error:
1196*4882a593Smuzhiyun 	pr_err("Bus powerup failed\n");
1197*4882a593Smuzhiyun 	return err;
1198*4882a593Smuzhiyun }
1199*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_bus_powerup);
1200*4882a593Smuzhiyun 
ssb_broadcast_value(struct ssb_device * dev,u32 address,u32 data)1201*4882a593Smuzhiyun static void ssb_broadcast_value(struct ssb_device *dev,
1202*4882a593Smuzhiyun 				u32 address, u32 data)
1203*4882a593Smuzhiyun {
1204*4882a593Smuzhiyun #ifdef CONFIG_SSB_DRIVER_PCICORE
1205*4882a593Smuzhiyun 	/* This is used for both, PCI and ChipCommon core, so be careful. */
1206*4882a593Smuzhiyun 	BUILD_BUG_ON(SSB_PCICORE_BCAST_ADDR != SSB_CHIPCO_BCAST_ADDR);
1207*4882a593Smuzhiyun 	BUILD_BUG_ON(SSB_PCICORE_BCAST_DATA != SSB_CHIPCO_BCAST_DATA);
1208*4882a593Smuzhiyun #endif
1209*4882a593Smuzhiyun 
1210*4882a593Smuzhiyun 	ssb_write32(dev, SSB_CHIPCO_BCAST_ADDR, address);
1211*4882a593Smuzhiyun 	ssb_read32(dev, SSB_CHIPCO_BCAST_ADDR); /* flush */
1212*4882a593Smuzhiyun 	ssb_write32(dev, SSB_CHIPCO_BCAST_DATA, data);
1213*4882a593Smuzhiyun 	ssb_read32(dev, SSB_CHIPCO_BCAST_DATA); /* flush */
1214*4882a593Smuzhiyun }
1215*4882a593Smuzhiyun 
ssb_commit_settings(struct ssb_bus * bus)1216*4882a593Smuzhiyun void ssb_commit_settings(struct ssb_bus *bus)
1217*4882a593Smuzhiyun {
1218*4882a593Smuzhiyun 	struct ssb_device *dev;
1219*4882a593Smuzhiyun 
1220*4882a593Smuzhiyun #ifdef CONFIG_SSB_DRIVER_PCICORE
1221*4882a593Smuzhiyun 	dev = bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev;
1222*4882a593Smuzhiyun #else
1223*4882a593Smuzhiyun 	dev = bus->chipco.dev;
1224*4882a593Smuzhiyun #endif
1225*4882a593Smuzhiyun 	if (WARN_ON(!dev))
1226*4882a593Smuzhiyun 		return;
1227*4882a593Smuzhiyun 	/* This forces an update of the cached registers. */
1228*4882a593Smuzhiyun 	ssb_broadcast_value(dev, 0xFD8, 0);
1229*4882a593Smuzhiyun }
1230*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_commit_settings);
1231*4882a593Smuzhiyun 
ssb_admatch_base(u32 adm)1232*4882a593Smuzhiyun u32 ssb_admatch_base(u32 adm)
1233*4882a593Smuzhiyun {
1234*4882a593Smuzhiyun 	u32 base = 0;
1235*4882a593Smuzhiyun 
1236*4882a593Smuzhiyun 	switch (adm & SSB_ADM_TYPE) {
1237*4882a593Smuzhiyun 	case SSB_ADM_TYPE0:
1238*4882a593Smuzhiyun 		base = (adm & SSB_ADM_BASE0);
1239*4882a593Smuzhiyun 		break;
1240*4882a593Smuzhiyun 	case SSB_ADM_TYPE1:
1241*4882a593Smuzhiyun 		WARN_ON(adm & SSB_ADM_NEG); /* unsupported */
1242*4882a593Smuzhiyun 		base = (adm & SSB_ADM_BASE1);
1243*4882a593Smuzhiyun 		break;
1244*4882a593Smuzhiyun 	case SSB_ADM_TYPE2:
1245*4882a593Smuzhiyun 		WARN_ON(adm & SSB_ADM_NEG); /* unsupported */
1246*4882a593Smuzhiyun 		base = (adm & SSB_ADM_BASE2);
1247*4882a593Smuzhiyun 		break;
1248*4882a593Smuzhiyun 	default:
1249*4882a593Smuzhiyun 		WARN_ON(1);
1250*4882a593Smuzhiyun 	}
1251*4882a593Smuzhiyun 
1252*4882a593Smuzhiyun 	return base;
1253*4882a593Smuzhiyun }
1254*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_admatch_base);
1255*4882a593Smuzhiyun 
ssb_admatch_size(u32 adm)1256*4882a593Smuzhiyun u32 ssb_admatch_size(u32 adm)
1257*4882a593Smuzhiyun {
1258*4882a593Smuzhiyun 	u32 size = 0;
1259*4882a593Smuzhiyun 
1260*4882a593Smuzhiyun 	switch (adm & SSB_ADM_TYPE) {
1261*4882a593Smuzhiyun 	case SSB_ADM_TYPE0:
1262*4882a593Smuzhiyun 		size = ((adm & SSB_ADM_SZ0) >> SSB_ADM_SZ0_SHIFT);
1263*4882a593Smuzhiyun 		break;
1264*4882a593Smuzhiyun 	case SSB_ADM_TYPE1:
1265*4882a593Smuzhiyun 		WARN_ON(adm & SSB_ADM_NEG); /* unsupported */
1266*4882a593Smuzhiyun 		size = ((adm & SSB_ADM_SZ1) >> SSB_ADM_SZ1_SHIFT);
1267*4882a593Smuzhiyun 		break;
1268*4882a593Smuzhiyun 	case SSB_ADM_TYPE2:
1269*4882a593Smuzhiyun 		WARN_ON(adm & SSB_ADM_NEG); /* unsupported */
1270*4882a593Smuzhiyun 		size = ((adm & SSB_ADM_SZ2) >> SSB_ADM_SZ2_SHIFT);
1271*4882a593Smuzhiyun 		break;
1272*4882a593Smuzhiyun 	default:
1273*4882a593Smuzhiyun 		WARN_ON(1);
1274*4882a593Smuzhiyun 	}
1275*4882a593Smuzhiyun 	size = (1 << (size + 1));
1276*4882a593Smuzhiyun 
1277*4882a593Smuzhiyun 	return size;
1278*4882a593Smuzhiyun }
1279*4882a593Smuzhiyun EXPORT_SYMBOL(ssb_admatch_size);
1280*4882a593Smuzhiyun 
ssb_modinit(void)1281*4882a593Smuzhiyun static int __init ssb_modinit(void)
1282*4882a593Smuzhiyun {
1283*4882a593Smuzhiyun 	int err;
1284*4882a593Smuzhiyun 
1285*4882a593Smuzhiyun 	/* See the comment at the ssb_is_early_boot definition */
1286*4882a593Smuzhiyun 	ssb_is_early_boot = 0;
1287*4882a593Smuzhiyun 	err = bus_register(&ssb_bustype);
1288*4882a593Smuzhiyun 	if (err)
1289*4882a593Smuzhiyun 		return err;
1290*4882a593Smuzhiyun 
1291*4882a593Smuzhiyun 	/* Maybe we already registered some buses at early boot.
1292*4882a593Smuzhiyun 	 * Check for this and attach them
1293*4882a593Smuzhiyun 	 */
1294*4882a593Smuzhiyun 	ssb_buses_lock();
1295*4882a593Smuzhiyun 	err = ssb_attach_queued_buses();
1296*4882a593Smuzhiyun 	ssb_buses_unlock();
1297*4882a593Smuzhiyun 	if (err) {
1298*4882a593Smuzhiyun 		bus_unregister(&ssb_bustype);
1299*4882a593Smuzhiyun 		goto out;
1300*4882a593Smuzhiyun 	}
1301*4882a593Smuzhiyun 
1302*4882a593Smuzhiyun 	err = b43_pci_ssb_bridge_init();
1303*4882a593Smuzhiyun 	if (err) {
1304*4882a593Smuzhiyun 		pr_err("Broadcom 43xx PCI-SSB-bridge initialization failed\n");
1305*4882a593Smuzhiyun 		/* don't fail SSB init because of this */
1306*4882a593Smuzhiyun 		err = 0;
1307*4882a593Smuzhiyun 	}
1308*4882a593Smuzhiyun 	err = ssb_host_pcmcia_init();
1309*4882a593Smuzhiyun 	if (err) {
1310*4882a593Smuzhiyun 		pr_err("PCMCIA host initialization failed\n");
1311*4882a593Smuzhiyun 		/* don't fail SSB init because of this */
1312*4882a593Smuzhiyun 		err = 0;
1313*4882a593Smuzhiyun 	}
1314*4882a593Smuzhiyun 	err = ssb_gige_init();
1315*4882a593Smuzhiyun 	if (err) {
1316*4882a593Smuzhiyun 		pr_err("SSB Broadcom Gigabit Ethernet driver initialization failed\n");
1317*4882a593Smuzhiyun 		/* don't fail SSB init because of this */
1318*4882a593Smuzhiyun 		err = 0;
1319*4882a593Smuzhiyun 	}
1320*4882a593Smuzhiyun out:
1321*4882a593Smuzhiyun 	return err;
1322*4882a593Smuzhiyun }
1323*4882a593Smuzhiyun /* ssb must be initialized after PCI but before the ssb drivers.
1324*4882a593Smuzhiyun  * That means we must use some initcall between subsys_initcall
1325*4882a593Smuzhiyun  * and device_initcall. */
1326*4882a593Smuzhiyun fs_initcall(ssb_modinit);
1327*4882a593Smuzhiyun 
ssb_modexit(void)1328*4882a593Smuzhiyun static void __exit ssb_modexit(void)
1329*4882a593Smuzhiyun {
1330*4882a593Smuzhiyun 	ssb_gige_exit();
1331*4882a593Smuzhiyun 	ssb_host_pcmcia_exit();
1332*4882a593Smuzhiyun 	b43_pci_ssb_bridge_exit();
1333*4882a593Smuzhiyun 	bus_unregister(&ssb_bustype);
1334*4882a593Smuzhiyun }
1335*4882a593Smuzhiyun module_exit(ssb_modexit)
1336