aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ssb/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ssb/main.c')
-rw-r--r--drivers/ssb/main.c129
1 files changed, 103 insertions, 26 deletions
diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c
index 7892ac163522..f8a13f863217 100644
--- a/drivers/ssb/main.c
+++ b/drivers/ssb/main.c
@@ -20,7 +20,6 @@
20#include <linux/mmc/sdio_func.h> 20#include <linux/mmc/sdio_func.h>
21#include <linux/slab.h> 21#include <linux/slab.h>
22 22
23#include <pcmcia/cs.h>
24#include <pcmcia/cistpl.h> 23#include <pcmcia/cistpl.h>
25#include <pcmcia/ds.h> 24#include <pcmcia/ds.h>
26 25
@@ -384,6 +383,35 @@ static int ssb_device_uevent(struct device *dev, struct kobj_uevent_env *env)
384 ssb_dev->id.revision); 383 ssb_dev->id.revision);
385} 384}
386 385
386#define ssb_config_attr(attrib, field, format_string) \
387static ssize_t \
388attrib##_show(struct device *dev, struct device_attribute *attr, char *buf) \
389{ \
390 return sprintf(buf, format_string, dev_to_ssb_dev(dev)->field); \
391}
392
393ssb_config_attr(core_num, core_index, "%u\n")
394ssb_config_attr(coreid, id.coreid, "0x%04x\n")
395ssb_config_attr(vendor, id.vendor, "0x%04x\n")
396ssb_config_attr(revision, id.revision, "%u\n")
397ssb_config_attr(irq, irq, "%u\n")
398static ssize_t
399name_show(struct device *dev, struct device_attribute *attr, char *buf)
400{
401 return sprintf(buf, "%s\n",
402 ssb_core_name(dev_to_ssb_dev(dev)->id.coreid));
403}
404
405static struct device_attribute ssb_device_attrs[] = {
406 __ATTR_RO(name),
407 __ATTR_RO(core_num),
408 __ATTR_RO(coreid),
409 __ATTR_RO(vendor),
410 __ATTR_RO(revision),
411 __ATTR_RO(irq),
412 __ATTR_NULL,
413};
414
387static struct bus_type ssb_bustype = { 415static struct bus_type ssb_bustype = {
388 .name = "ssb", 416 .name = "ssb",
389 .match = ssb_bus_match, 417 .match = ssb_bus_match,
@@ -393,6 +421,7 @@ static struct bus_type ssb_bustype = {
393 .suspend = ssb_device_suspend, 421 .suspend = ssb_device_suspend,
394 .resume = ssb_device_resume, 422 .resume = ssb_device_resume,
395 .uevent = ssb_device_uevent, 423 .uevent = ssb_device_uevent,
424 .dev_attrs = ssb_device_attrs,
396}; 425};
397 426
398static void ssb_buses_lock(void) 427static void ssb_buses_lock(void)
@@ -1088,23 +1117,22 @@ static u32 ssb_tmslow_reject_bitmask(struct ssb_device *dev)
1088{ 1117{
1089 u32 rev = ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_SSBREV; 1118 u32 rev = ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_SSBREV;
1090 1119
1091 /* The REJECT bit changed position in TMSLOW between 1120 /* The REJECT bit seems to be different for Backplane rev 2.3 */
1092 * Backplane revisions. */
1093 switch (rev) { 1121 switch (rev) {
1094 case SSB_IDLOW_SSBREV_22: 1122 case SSB_IDLOW_SSBREV_22:
1095 return SSB_TMSLOW_REJECT_22; 1123 case SSB_IDLOW_SSBREV_24:
1124 case SSB_IDLOW_SSBREV_26:
1125 return SSB_TMSLOW_REJECT;
1096 case SSB_IDLOW_SSBREV_23: 1126 case SSB_IDLOW_SSBREV_23:
1097 return SSB_TMSLOW_REJECT_23; 1127 return SSB_TMSLOW_REJECT_23;
1098 case SSB_IDLOW_SSBREV_24: /* TODO - find the proper REJECT bits */ 1128 case SSB_IDLOW_SSBREV_25: /* TODO - find the proper REJECT bit */
1099 case SSB_IDLOW_SSBREV_25: /* same here */
1100 case SSB_IDLOW_SSBREV_26: /* same here */
1101 case SSB_IDLOW_SSBREV_27: /* same here */ 1129 case SSB_IDLOW_SSBREV_27: /* same here */
1102 return SSB_TMSLOW_REJECT_23; /* this is a guess */ 1130 return SSB_TMSLOW_REJECT; /* this is a guess */
1103 default: 1131 default:
1104 printk(KERN_INFO "ssb: Backplane Revision 0x%.8X\n", rev); 1132 printk(KERN_INFO "ssb: Backplane Revision 0x%.8X\n", rev);
1105 WARN_ON(1); 1133 WARN_ON(1);
1106 } 1134 }
1107 return (SSB_TMSLOW_REJECT_22 | SSB_TMSLOW_REJECT_23); 1135 return (SSB_TMSLOW_REJECT | SSB_TMSLOW_REJECT_23);
1108} 1136}
1109 1137
1110int ssb_device_is_enabled(struct ssb_device *dev) 1138int ssb_device_is_enabled(struct ssb_device *dev)
@@ -1163,10 +1191,10 @@ void ssb_device_enable(struct ssb_device *dev, u32 core_specific_flags)
1163} 1191}
1164EXPORT_SYMBOL(ssb_device_enable); 1192EXPORT_SYMBOL(ssb_device_enable);
1165 1193
1166/* Wait for a bit in a register to get set or unset. 1194/* Wait for bitmask in a register to get set or cleared.
1167 * timeout is in units of ten-microseconds */ 1195 * timeout is in units of ten-microseconds */
1168static int ssb_wait_bit(struct ssb_device *dev, u16 reg, u32 bitmask, 1196static int ssb_wait_bits(struct ssb_device *dev, u16 reg, u32 bitmask,
1169 int timeout, int set) 1197 int timeout, int set)
1170{ 1198{
1171 int i; 1199 int i;
1172 u32 val; 1200 u32 val;
@@ -1174,7 +1202,7 @@ static int ssb_wait_bit(struct ssb_device *dev, u16 reg, u32 bitmask,
1174 for (i = 0; i < timeout; i++) { 1202 for (i = 0; i < timeout; i++) {
1175 val = ssb_read32(dev, reg); 1203 val = ssb_read32(dev, reg);
1176 if (set) { 1204 if (set) {
1177 if (val & bitmask) 1205 if ((val & bitmask) == bitmask)
1178 return 0; 1206 return 0;
1179 } else { 1207 } else {
1180 if (!(val & bitmask)) 1208 if (!(val & bitmask))
@@ -1191,20 +1219,38 @@ static int ssb_wait_bit(struct ssb_device *dev, u16 reg, u32 bitmask,
1191 1219
1192void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags) 1220void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags)
1193{ 1221{
1194 u32 reject; 1222 u32 reject, val;
1195 1223
1196 if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_RESET) 1224 if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_RESET)
1197 return; 1225 return;
1198 1226
1199 reject = ssb_tmslow_reject_bitmask(dev); 1227 reject = ssb_tmslow_reject_bitmask(dev);
1200 ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK); 1228
1201 ssb_wait_bit(dev, SSB_TMSLOW, reject, 1000, 1); 1229 if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_CLOCK) {
1202 ssb_wait_bit(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0); 1230 ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK);
1203 ssb_write32(dev, SSB_TMSLOW, 1231 ssb_wait_bits(dev, SSB_TMSLOW, reject, 1000, 1);
1204 SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK | 1232 ssb_wait_bits(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0);
1205 reject | SSB_TMSLOW_RESET | 1233
1206 core_specific_flags); 1234 if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
1207 ssb_flush_tmslow(dev); 1235 val = ssb_read32(dev, SSB_IMSTATE);
1236 val |= SSB_IMSTATE_REJECT;
1237 ssb_write32(dev, SSB_IMSTATE, val);
1238 ssb_wait_bits(dev, SSB_IMSTATE, SSB_IMSTATE_BUSY, 1000,
1239 0);
1240 }
1241
1242 ssb_write32(dev, SSB_TMSLOW,
1243 SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK |
1244 reject | SSB_TMSLOW_RESET |
1245 core_specific_flags);
1246 ssb_flush_tmslow(dev);
1247
1248 if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
1249 val = ssb_read32(dev, SSB_IMSTATE);
1250 val &= ~SSB_IMSTATE_REJECT;
1251 ssb_write32(dev, SSB_IMSTATE, val);
1252 }
1253 }
1208 1254
1209 ssb_write32(dev, SSB_TMSLOW, 1255 ssb_write32(dev, SSB_TMSLOW,
1210 reject | SSB_TMSLOW_RESET | 1256 reject | SSB_TMSLOW_RESET |
@@ -1262,20 +1308,20 @@ EXPORT_SYMBOL(ssb_bus_may_powerdown);
1262 1308
1263int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl) 1309int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl)
1264{ 1310{
1265 struct ssb_chipcommon *cc;
1266 int err; 1311 int err;
1267 enum ssb_clkmode mode; 1312 enum ssb_clkmode mode;
1268 1313
1269 err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 1); 1314 err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 1);
1270 if (err) 1315 if (err)
1271 goto error; 1316 goto error;
1272 cc = &bus->chipco;
1273 mode = dynamic_pctl ? SSB_CLKMODE_DYNAMIC : SSB_CLKMODE_FAST;
1274 ssb_chipco_set_clockmode(cc, mode);
1275 1317
1276#ifdef CONFIG_SSB_DEBUG 1318#ifdef CONFIG_SSB_DEBUG
1277 bus->powered_up = 1; 1319 bus->powered_up = 1;
1278#endif 1320#endif
1321
1322 mode = dynamic_pctl ? SSB_CLKMODE_DYNAMIC : SSB_CLKMODE_FAST;
1323 ssb_chipco_set_clockmode(&bus->chipco, mode);
1324
1279 return 0; 1325 return 0;
1280error: 1326error:
1281 ssb_printk(KERN_ERR PFX "Bus powerup failed\n"); 1327 ssb_printk(KERN_ERR PFX "Bus powerup failed\n");
@@ -1283,6 +1329,37 @@ error:
1283} 1329}
1284EXPORT_SYMBOL(ssb_bus_powerup); 1330EXPORT_SYMBOL(ssb_bus_powerup);
1285 1331
1332static void ssb_broadcast_value(struct ssb_device *dev,
1333 u32 address, u32 data)
1334{
1335#ifdef CONFIG_SSB_DRIVER_PCICORE
1336 /* This is used for both, PCI and ChipCommon core, so be careful. */
1337 BUILD_BUG_ON(SSB_PCICORE_BCAST_ADDR != SSB_CHIPCO_BCAST_ADDR);
1338 BUILD_BUG_ON(SSB_PCICORE_BCAST_DATA != SSB_CHIPCO_BCAST_DATA);
1339#endif
1340
1341 ssb_write32(dev, SSB_CHIPCO_BCAST_ADDR, address);
1342 ssb_read32(dev, SSB_CHIPCO_BCAST_ADDR); /* flush */
1343 ssb_write32(dev, SSB_CHIPCO_BCAST_DATA, data);
1344 ssb_read32(dev, SSB_CHIPCO_BCAST_DATA); /* flush */
1345}
1346
1347void ssb_commit_settings(struct ssb_bus *bus)
1348{
1349 struct ssb_device *dev;
1350
1351#ifdef CONFIG_SSB_DRIVER_PCICORE
1352 dev = bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev;
1353#else
1354 dev = bus->chipco.dev;
1355#endif
1356 if (WARN_ON(!dev))
1357 return;
1358 /* This forces an update of the cached registers. */
1359 ssb_broadcast_value(dev, 0xFD8, 0);
1360}
1361EXPORT_SYMBOL(ssb_commit_settings);
1362
1286u32 ssb_admatch_base(u32 adm) 1363u32 ssb_admatch_base(u32 adm)
1287{ 1364{
1288 u32 base = 0; 1365 u32 base = 0;