1#ifndef LINUX_SSB_H_
2#define LINUX_SSB_H_
3
4#include <linux/device.h>
5#include <linux/list.h>
6#include <linux/types.h>
7#include <linux/spinlock.h>
8#include <linux/pci.h>
9#include <linux/mod_devicetable.h>
10#include <linux/dma-mapping.h>
11
12#include <linux/ssb/ssb_regs.h>
13
14
15struct pcmcia_device;
16struct ssb_bus;
17struct ssb_driver;
18
19struct ssb_sprom {
20 u8 revision;
21 u8 il0mac[6];
22 u8 et0mac[6];
23 u8 et1mac[6];
24 u8 et0phyaddr;
25 u8 et1phyaddr;
26 u8 et0mdcport;
27 u8 et1mdcport;
28 u8 board_rev;
29 u8 country_code;
30 u8 ant_available_a;
31 u8 ant_available_bg;
32 u16 pa0b0;
33 u16 pa0b1;
34 u16 pa0b2;
35 u16 pa1b0;
36 u16 pa1b1;
37 u16 pa1b2;
38 u16 pa1lob0;
39 u16 pa1lob1;
40 u16 pa1lob2;
41 u16 pa1hib0;
42 u16 pa1hib1;
43 u16 pa1hib2;
44 u8 gpio0;
45 u8 gpio1;
46 u8 gpio2;
47 u8 gpio3;
48 u16 maxpwr_bg;
49 u16 maxpwr_al;
50 u16 maxpwr_a;
51 u16 maxpwr_ah;
52 u8 itssi_a;
53 u8 itssi_bg;
54 u8 tri2g;
55 u8 tri5gl;
56 u8 tri5g;
57 u8 tri5gh;
58 u8 rxpo2g;
59 u8 rxpo5g;
60 u8 rssisav2g;
61 u8 rssismc2g;
62 u8 rssismf2g;
63 u8 bxa2g;
64 u8 rssisav5g;
65 u8 rssismc5g;
66 u8 rssismf5g;
67 u8 bxa5g;
68 u16 cck2gpo;
69 u32 ofdm2gpo;
70 u32 ofdm5glpo;
71 u32 ofdm5gpo;
72 u32 ofdm5ghpo;
73 u16 boardflags_lo;
74 u16 boardflags_hi;
75 u16 boardflags2_lo;
76 u16 boardflags2_hi;
77
78
79
80
81
82 struct {
83 struct {
84 s8 a0, a1, a2, a3;
85 } ghz24;
86 struct {
87 s8 a0, a1, a2, a3;
88 } ghz5;
89 } antenna_gain;
90
91
92};
93
94
95struct ssb_boardinfo {
96 u16 vendor;
97 u16 type;
98 u16 rev;
99};
100
101
102struct ssb_device;
103
104
105struct ssb_bus_ops {
106 u8 (*read8)(struct ssb_device *dev, u16 offset);
107 u16 (*read16)(struct ssb_device *dev, u16 offset);
108 u32 (*read32)(struct ssb_device *dev, u16 offset);
109 void (*write8)(struct ssb_device *dev, u16 offset, u8 value);
110 void (*write16)(struct ssb_device *dev, u16 offset, u16 value);
111 void (*write32)(struct ssb_device *dev, u16 offset, u32 value);
112#ifdef CONFIG_SSB_BLOCKIO
113 void (*block_read)(struct ssb_device *dev, void *buffer,
114 size_t count, u16 offset, u8 reg_width);
115 void (*block_write)(struct ssb_device *dev, const void *buffer,
116 size_t count, u16 offset, u8 reg_width);
117#endif
118};
119
120
121
122#define SSB_DEV_CHIPCOMMON 0x800
123#define SSB_DEV_ILINE20 0x801
124#define SSB_DEV_SDRAM 0x803
125#define SSB_DEV_PCI 0x804
126#define SSB_DEV_MIPS 0x805
127#define SSB_DEV_ETHERNET 0x806
128#define SSB_DEV_V90 0x807
129#define SSB_DEV_USB11_HOSTDEV 0x808
130#define SSB_DEV_ADSL 0x809
131#define SSB_DEV_ILINE100 0x80A
132#define SSB_DEV_IPSEC 0x80B
133#define SSB_DEV_PCMCIA 0x80D
134#define SSB_DEV_INTERNAL_MEM 0x80E
135#define SSB_DEV_MEMC_SDRAM 0x80F
136#define SSB_DEV_EXTIF 0x811
137#define SSB_DEV_80211 0x812
138#define SSB_DEV_MIPS_3302 0x816
139#define SSB_DEV_USB11_HOST 0x817
140#define SSB_DEV_USB11_DEV 0x818
141#define SSB_DEV_USB20_HOST 0x819
142#define SSB_DEV_USB20_DEV 0x81A
143#define SSB_DEV_SDIO_HOST 0x81B
144#define SSB_DEV_ROBOSWITCH 0x81C
145#define SSB_DEV_PARA_ATA 0x81D
146#define SSB_DEV_SATA_XORDMA 0x81E
147#define SSB_DEV_ETHERNET_GBIT 0x81F
148#define SSB_DEV_PCIE 0x820
149#define SSB_DEV_MIMO_PHY 0x821
150#define SSB_DEV_SRAM_CTRLR 0x822
151#define SSB_DEV_MINI_MACPHY 0x823
152#define SSB_DEV_ARM_1176 0x824
153#define SSB_DEV_ARM_7TDMI 0x825
154
155
156#define SSB_VENDOR_BROADCOM 0x4243
157
158
159
160struct __ssb_dev_wrapper {
161 struct device dev;
162 struct ssb_device *sdev;
163};
164
165struct ssb_device {
166
167
168 const struct ssb_bus_ops *ops;
169
170 struct device *dev;
171
172 struct ssb_bus *bus;
173 struct ssb_device_id id;
174
175 u8 core_index;
176 unsigned int irq;
177
178
179 void *drvdata;
180 void *devtypedata;
181};
182
183
184static inline
185struct ssb_device * dev_to_ssb_dev(struct device *dev)
186{
187 struct __ssb_dev_wrapper *wrap;
188 wrap = container_of(dev, struct __ssb_dev_wrapper, dev);
189 return wrap->sdev;
190}
191
192
193static inline
194void ssb_set_drvdata(struct ssb_device *dev, void *data)
195{
196 dev->drvdata = data;
197}
198static inline
199void * ssb_get_drvdata(struct ssb_device *dev)
200{
201 return dev->drvdata;
202}
203
204
205void ssb_set_devtypedata(struct ssb_device *dev, void *data);
206static inline
207void * ssb_get_devtypedata(struct ssb_device *dev)
208{
209 return dev->devtypedata;
210}
211
212
213struct ssb_driver {
214 const char *name;
215 const struct ssb_device_id *id_table;
216
217 int (*probe)(struct ssb_device *dev, const struct ssb_device_id *id);
218 void (*remove)(struct ssb_device *dev);
219 int (*suspend)(struct ssb_device *dev, pm_message_t state);
220 int (*resume)(struct ssb_device *dev);
221 void (*shutdown)(struct ssb_device *dev);
222
223 struct device_driver drv;
224};
225#define drv_to_ssb_drv(_drv) container_of(_drv, struct ssb_driver, drv)
226
227extern int __ssb_driver_register(struct ssb_driver *drv, struct module *owner);
228static inline int ssb_driver_register(struct ssb_driver *drv)
229{
230 return __ssb_driver_register(drv, THIS_MODULE);
231}
232extern void ssb_driver_unregister(struct ssb_driver *drv);
233
234
235
236
237enum ssb_bustype {
238 SSB_BUSTYPE_SSB,
239 SSB_BUSTYPE_PCI,
240 SSB_BUSTYPE_PCMCIA,
241 SSB_BUSTYPE_SDIO,
242};
243
244
245#define SSB_BOARDVENDOR_BCM 0x14E4
246#define SSB_BOARDVENDOR_DELL 0x1028
247#define SSB_BOARDVENDOR_HP 0x0E11
248
249#define SSB_BOARD_BCM94306MP 0x0418
250#define SSB_BOARD_BCM4309G 0x0421
251#define SSB_BOARD_BCM4306CB 0x0417
252#define SSB_BOARD_BCM4309MP 0x040C
253#define SSB_BOARD_MP4318 0x044A
254#define SSB_BOARD_BU4306 0x0416
255#define SSB_BOARD_BU4309 0x040A
256
257#define SSB_CHIPPACK_BCM4712S 1
258#define SSB_CHIPPACK_BCM4712M 2
259#define SSB_CHIPPACK_BCM4712L 0
260
261#include <linux/ssb/ssb_driver_chipcommon.h>
262#include <linux/ssb/ssb_driver_mips.h>
263#include <linux/ssb/ssb_driver_extif.h>
264#include <linux/ssb/ssb_driver_pci.h>
265
266struct ssb_bus {
267
268 void __iomem *mmio;
269
270 const struct ssb_bus_ops *ops;
271
272
273
274 struct ssb_device *mapped_device;
275 union {
276
277 u8 mapped_pcmcia_seg;
278
279 u32 sdio_sbaddr;
280 };
281
282
283 spinlock_t bar_lock;
284
285
286 enum ssb_bustype bustype;
287
288 union {
289
290 struct pci_dev *host_pci;
291
292 struct pcmcia_device *host_pcmcia;
293
294 struct sdio_func *host_sdio;
295 };
296
297
298 unsigned int quirks;
299
300#ifdef CONFIG_SSB_SPROM
301
302 struct mutex sprom_mutex;
303#endif
304
305
306 u16 chip_id;
307 u16 chip_rev;
308 u16 sprom_offset;
309 u16 sprom_size;
310 u8 chip_package;
311
312
313 struct ssb_device devices[SSB_MAX_NR_CORES];
314 u8 nr_devices;
315
316
317 unsigned int busnumber;
318
319
320 struct ssb_chipcommon chipco;
321
322 struct ssb_pcicore pcicore;
323
324 struct ssb_mipscore mipscore;
325
326 struct ssb_extif extif;
327
328
329
330
331
332
333
334 struct ssb_boardinfo boardinfo;
335
336 struct ssb_sprom sprom;
337
338 bool has_cardbus_slot;
339
340#ifdef CONFIG_SSB_EMBEDDED
341
342 spinlock_t gpio_lock;
343#endif
344
345
346 struct list_head list;
347#ifdef CONFIG_SSB_DEBUG
348
349 bool powered_up;
350 int power_warn_count;
351#endif
352};
353
354enum ssb_quirks {
355
356 SSB_QUIRK_SDIO_READ_AFTER_WRITE32 = (1 << 0),
357};
358
359
360struct ssb_init_invariants {
361
362 struct ssb_boardinfo boardinfo;
363
364
365 struct ssb_sprom sprom;
366
367 bool has_cardbus_slot;
368};
369
370typedef int (*ssb_invariants_func_t)(struct ssb_bus *bus,
371 struct ssb_init_invariants *iv);
372
373
374
375
376
377extern int ssb_bus_ssbbus_register(struct ssb_bus *bus,
378 unsigned long baseaddr,
379 ssb_invariants_func_t get_invariants);
380#ifdef CONFIG_SSB_PCIHOST
381extern int ssb_bus_pcibus_register(struct ssb_bus *bus,
382 struct pci_dev *host_pci);
383#endif
384#ifdef CONFIG_SSB_PCMCIAHOST
385extern int ssb_bus_pcmciabus_register(struct ssb_bus *bus,
386 struct pcmcia_device *pcmcia_dev,
387 unsigned long baseaddr);
388#endif
389#ifdef CONFIG_SSB_SDIOHOST
390extern int ssb_bus_sdiobus_register(struct ssb_bus *bus,
391 struct sdio_func *sdio_func,
392 unsigned int quirks);
393#endif
394
395
396extern void ssb_bus_unregister(struct ssb_bus *bus);
397
398
399extern bool ssb_is_sprom_available(struct ssb_bus *bus);
400
401
402
403extern int ssb_arch_set_fallback_sprom(const struct ssb_sprom *sprom);
404
405
406
407extern int ssb_bus_suspend(struct ssb_bus *bus);
408
409
410extern int ssb_bus_resume(struct ssb_bus *bus);
411
412extern u32 ssb_clockspeed(struct ssb_bus *bus);
413
414
415int ssb_device_is_enabled(struct ssb_device *dev);
416
417
418void ssb_device_enable(struct ssb_device *dev, u32 core_specific_flags);
419
420void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags);
421
422
423
424static inline u8 ssb_read8(struct ssb_device *dev, u16 offset)
425{
426 return dev->ops->read8(dev, offset);
427}
428static inline u16 ssb_read16(struct ssb_device *dev, u16 offset)
429{
430 return dev->ops->read16(dev, offset);
431}
432static inline u32 ssb_read32(struct ssb_device *dev, u16 offset)
433{
434 return dev->ops->read32(dev, offset);
435}
436static inline void ssb_write8(struct ssb_device *dev, u16 offset, u8 value)
437{
438 dev->ops->write8(dev, offset, value);
439}
440static inline void ssb_write16(struct ssb_device *dev, u16 offset, u16 value)
441{
442 dev->ops->write16(dev, offset, value);
443}
444static inline void ssb_write32(struct ssb_device *dev, u16 offset, u32 value)
445{
446 dev->ops->write32(dev, offset, value);
447}
448#ifdef CONFIG_SSB_BLOCKIO
449static inline void ssb_block_read(struct ssb_device *dev, void *buffer,
450 size_t count, u16 offset, u8 reg_width)
451{
452 dev->ops->block_read(dev, buffer, count, offset, reg_width);
453}
454
455static inline void ssb_block_write(struct ssb_device *dev, const void *buffer,
456 size_t count, u16 offset, u8 reg_width)
457{
458 dev->ops->block_write(dev, buffer, count, offset, reg_width);
459}
460#endif
461
462
463
464
465
466
467
468
469extern u32 ssb_dma_translation(struct ssb_device *dev);
470#define SSB_DMA_TRANSLATION_MASK 0xC0000000
471#define SSB_DMA_TRANSLATION_SHIFT 30
472
473extern int ssb_dma_set_mask(struct ssb_device *dev, u64 mask);
474
475extern void * ssb_dma_alloc_consistent(struct ssb_device *dev, size_t size,
476 dma_addr_t *dma_handle, gfp_t gfp_flags);
477extern void ssb_dma_free_consistent(struct ssb_device *dev, size_t size,
478 void *vaddr, dma_addr_t dma_handle,
479 gfp_t gfp_flags);
480
481static inline void __cold __ssb_dma_not_implemented(struct ssb_device *dev)
482{
483#ifdef CONFIG_SSB_DEBUG
484 printk(KERN_ERR "SSB: BUG! Calling DMA API for "
485 "unsupported bustype %d\n", dev->bus->bustype);
486#endif
487}
488
489static inline int ssb_dma_mapping_error(struct ssb_device *dev, dma_addr_t addr)
490{
491 switch (dev->bus->bustype) {
492 case SSB_BUSTYPE_PCI:
493#ifdef CONFIG_SSB_PCIHOST
494 return pci_dma_mapping_error(dev->bus->host_pci, addr);
495#endif
496 break;
497 case SSB_BUSTYPE_SSB:
498 return dma_mapping_error(dev->dev, addr);
499 default:
500 break;
501 }
502 __ssb_dma_not_implemented(dev);
503 return -ENOSYS;
504}
505
506static inline dma_addr_t ssb_dma_map_single(struct ssb_device *dev, void *p,
507 size_t size, enum dma_data_direction dir)
508{
509 switch (dev->bus->bustype) {
510 case SSB_BUSTYPE_PCI:
511#ifdef CONFIG_SSB_PCIHOST
512 return pci_map_single(dev->bus->host_pci, p, size, dir);
513#endif
514 break;
515 case SSB_BUSTYPE_SSB:
516 return dma_map_single(dev->dev, p, size, dir);
517 default:
518 break;
519 }
520 __ssb_dma_not_implemented(dev);
521 return 0;
522}
523
524static inline void ssb_dma_unmap_single(struct ssb_device *dev, dma_addr_t dma_addr,
525 size_t size, enum dma_data_direction dir)
526{
527 switch (dev->bus->bustype) {
528 case SSB_BUSTYPE_PCI:
529#ifdef CONFIG_SSB_PCIHOST
530 pci_unmap_single(dev->bus->host_pci, dma_addr, size, dir);
531 return;
532#endif
533 break;
534 case SSB_BUSTYPE_SSB:
535 dma_unmap_single(dev->dev, dma_addr, size, dir);
536 return;
537 default:
538 break;
539 }
540 __ssb_dma_not_implemented(dev);
541}
542
543static inline void ssb_dma_sync_single_for_cpu(struct ssb_device *dev,
544 dma_addr_t dma_addr,
545 size_t size,
546 enum dma_data_direction dir)
547{
548 switch (dev->bus->bustype) {
549 case SSB_BUSTYPE_PCI:
550#ifdef CONFIG_SSB_PCIHOST
551 pci_dma_sync_single_for_cpu(dev->bus->host_pci, dma_addr,
552 size, dir);
553 return;
554#endif
555 break;
556 case SSB_BUSTYPE_SSB:
557 dma_sync_single_for_cpu(dev->dev, dma_addr, size, dir);
558 return;
559 default:
560 break;
561 }
562 __ssb_dma_not_implemented(dev);
563}
564
565static inline void ssb_dma_sync_single_for_device(struct ssb_device *dev,
566 dma_addr_t dma_addr,
567 size_t size,
568 enum dma_data_direction dir)
569{
570 switch (dev->bus->bustype) {
571 case SSB_BUSTYPE_PCI:
572#ifdef CONFIG_SSB_PCIHOST
573 pci_dma_sync_single_for_device(dev->bus->host_pci, dma_addr,
574 size, dir);
575 return;
576#endif
577 break;
578 case SSB_BUSTYPE_SSB:
579 dma_sync_single_for_device(dev->dev, dma_addr, size, dir);
580 return;
581 default:
582 break;
583 }
584 __ssb_dma_not_implemented(dev);
585}
586
587static inline void ssb_dma_sync_single_range_for_cpu(struct ssb_device *dev,
588 dma_addr_t dma_addr,
589 unsigned long offset,
590 size_t size,
591 enum dma_data_direction dir)
592{
593 switch (dev->bus->bustype) {
594 case SSB_BUSTYPE_PCI:
595#ifdef CONFIG_SSB_PCIHOST
596
597 pci_dma_sync_single_for_cpu(dev->bus->host_pci, dma_addr,
598 offset + size, dir);
599 return;
600#endif
601 break;
602 case SSB_BUSTYPE_SSB:
603 dma_sync_single_range_for_cpu(dev->dev, dma_addr, offset,
604 size, dir);
605 return;
606 default:
607 break;
608 }
609 __ssb_dma_not_implemented(dev);
610}
611
612static inline void ssb_dma_sync_single_range_for_device(struct ssb_device *dev,
613 dma_addr_t dma_addr,
614 unsigned long offset,
615 size_t size,
616 enum dma_data_direction dir)
617{
618 switch (dev->bus->bustype) {
619 case SSB_BUSTYPE_PCI:
620#ifdef CONFIG_SSB_PCIHOST
621
622 pci_dma_sync_single_for_device(dev->bus->host_pci, dma_addr,
623 offset + size, dir);
624 return;
625#endif
626 break;
627 case SSB_BUSTYPE_SSB:
628 dma_sync_single_range_for_device(dev->dev, dma_addr, offset,
629 size, dir);
630 return;
631 default:
632 break;
633 }
634 __ssb_dma_not_implemented(dev);
635}
636
637
638#ifdef CONFIG_SSB_PCIHOST
639
640extern int ssb_pcihost_register(struct pci_driver *driver);
641static inline void ssb_pcihost_unregister(struct pci_driver *driver)
642{
643 pci_unregister_driver(driver);
644}
645
646static inline
647void ssb_pcihost_set_power_state(struct ssb_device *sdev, pci_power_t state)
648{
649 if (sdev->bus->bustype == SSB_BUSTYPE_PCI)
650 pci_set_power_state(sdev->bus->host_pci, state);
651}
652#else
653static inline void ssb_pcihost_unregister(struct pci_driver *driver)
654{
655}
656
657static inline
658void ssb_pcihost_set_power_state(struct ssb_device *sdev, pci_power_t state)
659{
660}
661#endif
662
663
664
665
666
667
668extern int ssb_bus_may_powerdown(struct ssb_bus *bus);
669
670
671
672extern int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl);
673
674
675
676extern u32 ssb_admatch_base(u32 adm);
677extern u32 ssb_admatch_size(u32 adm);
678
679
680
681
682#ifdef CONFIG_SSB_EMBEDDED
683int ssb_pcibios_plat_dev_init(struct pci_dev *dev);
684int ssb_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
685#endif
686
687#endif
688