[XPERIA X10 Android Development] biktor_gj:
Maybe this comes handy (extracted from the code). Though I'm not completely sure that if it notifies a system_reboot to the amss the complete chipset will be resetted, but maybe worth a try ;)

/* SEMC: Add functions to communicate with AMSS - start */
void smsm_wait_for_modem(void)
{
uint32_t *smsm = NULL;
unsigned long flags;

printk(KERN_INFO "Waiting for Modem...\n");
for (;;) {
spin_lock_irqsave(&smem_lock, flags);
if (smsm == NULL) {
smsm = smem_alloc(ID_SHARED_STATE,
SMSM_NUM_ENTRIES * sizeof(uint32_t));
} else {
if ((smsm[SMSM_MODEM_STATE] & SMSM_OSENTERED) != 0) {
spin_unlock_irqrestore(&smem_lock, flags);
break;
}
}
spin_unlock_irqrestore(&smem_lock, flags);
schedule();
}

return;
}

/* SEMC:CE: DMS00760180: Linux freezes when the phone crash during smd spin lock - start */
void smsm_notify_apps_crash(void)
{
uint32_t *smsm;
unsigned long flags;
uint32_t old_state;

/* smem_lock is already held and all instances of acquiring
* smem_lock use spin_lock_irqsave, so no need to acquire the
* lock again, as we are not in any critical section ...
*
* Then why do we need the lock ? ...
* Hmm If it is not already held , better to get the lock to
* disable interrupts and prevent any further modificaiton of smsm[]
*
*/
if(!spin_is_locked(&smem_lock)) {
spin_lock_irqsave(&smem_lock, flags);
smsm = smem_alloc(ID_SHARED_STATE,
SMSM_NUM_ENTRIES * sizeof(uint32_t));
if (smsm != NULL) {
old_state = smsm[SMSM_APPS_STATE];
smsm[SMSM_APPS_STATE] |= SMSM_APPS_CRASHDUMP;
notify_other_smsm(SMSM_APPS_STATE, old_state, smsm[SMSM_APPS_STATE]);
}
spin_unlock_irqrestore(&smem_lock, flags);
}
else {
smsm = smem_alloc(ID_SHARED_STATE,
SMSM_NUM_ENTRIES * sizeof(uint32_t));
if (smsm != NULL) {
old_state = smsm[SMSM_APPS_STATE];
smsm[SMSM_APPS_STATE] |= SMSM_APPS_CRASHDUMP;
notify_other_smsm(SMSM_APPS_STATE, old_state, smsm[SMSM_APPS_STATE]);
}
}
return;
}

/* Acknowledge AMMS crash by setting SMSM_APPS_CRASHDUMP*/
void smsm_ack_amss_crash(void)
{
uint32_t *smsm;

smsm = smem_alloc(ID_SHARED_STATE,
SMSM_NUM_ENTRIES * sizeof(uint32_t));
if (smsm != NULL) {
smsm[SMSM_APPS_STATE] |= SMSM_APPS_CRASHDUMP;
}

return;
}
/* SEMC:CE: DMS00760180: Linux freezes when the phone crash during smd spin lock - end */

void smsm_notify_system_reboot(void)
{
uint32_t *smsm;
unsigned long flags;
uint32_t old_state;

/* SEMC:CE: DMS00760180: Linux freezes when the phone crash during smd spin lock - start */
/* smem_lock is already held and all instances of acquiring
* smem_lock use spin_lock_irqsave, so no need to acquire the
* lock again, as we are not in any critical section ...
*
* Then why do we need the lock ? ...
* Hmm If it is not already held , better to get the lock to
* disable interrupts and prevent any further modificaiton of smsm[]
*
*/
if(!spin_is_locked(&smem_lock)) {
spin_lock_irqsave(&smem_lock, flags);
smsm = smem_alloc(ID_SHARED_STATE,
SMSM_NUM_ENTRIES * sizeof(uint32_t));
if (smsm != NULL) {
old_state = smsm[SMSM_APPS_STATE];
smsm[SMSM_APPS_STATE] |= SMSM_SYSTEM_REBOOT;
notify_other_smsm(SMSM_APPS_STATE, old_state, smsm[SMSM_APPS_STATE]);
}
spin_unlock_irqrestore(&smem_lock, flags);
}
else {
smsm = smem_alloc(ID_SHARED_STATE,
SMSM_NUM_ENTRIES * sizeof(uint32_t));
if (smsm != NULL) {
old_state = smsm[SMSM_APPS_STATE];
smsm[SMSM_APPS_STATE] |= SMSM_SYSTEM_REBOOT;
notify_other_smsm(SMSM_APPS_STATE, old_state, smsm[SMSM_APPS_STATE]);
}
}
/* SEMC:CE: DMS00760180: Linux freezes when the phone crash during smd spin lock - end */
return;
}

Regards