static void astribank_release(struct device *dev) { xbus_t *xbus; BUG_ON(!dev); xbus = dev_to_xbus(dev); if (XBUS_FLAGS(xbus, CONNECTED)) { XBUS_ERR(xbus, "Try to release CONNECTED device.\n"); BUG(); } if (!XBUS_IS(xbus, IDLE) && !XBUS_IS(xbus, FAIL) && !XBUS_IS(xbus, DEACTIVATED)) { XBUS_ERR(xbus, "Try to release in state %s\n", xbus_statename(XBUS_STATE(xbus))); BUG(); } XBUS_INFO(xbus, "[%s] Astribank Release\n", xbus->label); xbus_free(xbus); }
int xbus_sysfs_create(xbus_t *xbus) { struct device *astribank; int ret = 0; BUG_ON(!xbus); astribank = &xbus->astribank; BUG_ON(!astribank); XBUS_DBG(GENERAL, xbus, "\n"); device_initialize(astribank); astribank->bus = &xpp_bus_type; astribank->parent = &xpp_bus; snprintf(astribank->bus_id, BUS_ID_SIZE, "xbus-%02d", xbus->num); astribank->driver_data = NULL; /* override below */ astribank->release = xpp_dev_release; ret = device_register(astribank); if(ret) { XBUS_ERR(xbus, "%s: device_add failed: %d\n", __FUNCTION__, ret); goto out; } ret = device_create_file(astribank, &dev_attr_connector); if(ret) { XBUS_ERR(xbus, "%s: device_create_file failed: %d\n", __FUNCTION__, ret); goto out; } ret = device_create_file(astribank, &dev_attr_label); if(ret) { XBUS_ERR(xbus, "%s: device_create_file failed: %d\n", __FUNCTION__, ret); goto out; } ret = device_create_file(astribank, &dev_attr_status); if(ret) { XBUS_ERR(xbus, "%s: device_create_file failed: %d\n", __FUNCTION__, ret); goto out; } ret = device_create_file(astribank, &dev_attr_timing); if(ret) { XBUS_ERR(xbus, "%s: device_create_file failed: %d\n", __FUNCTION__, ret); goto out; } ret = device_create_file(astribank, &dev_attr_cls); if(ret) { XBUS_ERR(xbus, "%s: device_create_file failed: %d\n", __FUNCTION__, ret); goto out; } #ifdef SAMPLE_TICKS ret = device_create_file(astribank, &dev_attr_samples); if(ret) { XBUS_ERR(xbus, "%s: device_create_file failed: %d\n", __FUNCTION__, ret); goto out; } #endif astribank->driver_data = xbus; /* Everything is good */ out: return ret; }
/* * Called when the Astribank replies to a sync change request */ void got_new_syncer(xbus_t *xbus, enum sync_mode mode, int drift) { unsigned long flags; XBUS_DBG(SYNC, xbus, "Mode %s (%d), drift=%d (pcm_rx_counter=%d)\n", sync_mode_name(mode), mode, drift, atomic_read(&xbus->pcm_rx_counter)); spin_lock_irqsave(&xbus->lock, flags); xbus->sync_adjustment = (signed char)drift; if(xbus->sync_mode == mode) { XBUS_DBG(SYNC, xbus, "Already in mode '%s'. Ignored\n", sync_mode_name(mode)); goto out; } switch(mode) { case SYNC_MODE_AB: xbus->sync_mode = mode; xbus_set_command_timer(xbus, 0); xbus->self_ticking = 1; xpp_set_syncer(xbus, 1); global_ticker = xbus; break; case SYNC_MODE_PLL: xbus->sync_mode = mode; xbus_set_command_timer(xbus, 0); xbus->self_ticking = 1; xpp_set_syncer(xbus, 0); global_ticker = xbus; break; case SYNC_MODE_NONE: /* lost sync source */ xbus->sync_mode = mode; xbus_set_command_timer(xbus, 1); xbus->self_ticking = 0; xpp_set_syncer(xbus, 0); break; case SYNC_MODE_QUERY: /* ignore */ break; default: XBUS_ERR(xbus, "%s: unknown mode=0x%X\n", __FUNCTION__, mode); } out: spin_unlock_irqrestore(&xbus->lock, flags); }