drivers/bus/mhi/ep/sm.c

Source file repositories/reference/linux-study-clean/drivers/bus/mhi/ep/sm.c

File Facts

System
Linux kernel
Corpus path
drivers/bus/mhi/ep/sm.c
Extension
.c
Size
3975 bytes
Lines
155
Domain
Driver Families
Bucket
drivers/bus
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (ret) {
			dev_err(dev, "Failed sending AMSS EE event\n");
			goto err_unlock;
		}
	}

err_unlock:
	mutex_unlock(&mhi_cntrl->state_lock);

	return ret;
}

int mhi_ep_set_m3_state(struct mhi_ep_cntrl *mhi_cntrl)
{
	struct device *dev = &mhi_cntrl->mhi_dev->dev;
	int ret;

	mutex_lock(&mhi_cntrl->state_lock);

	ret = mhi_ep_set_mhi_state(mhi_cntrl, MHI_STATE_M3);
	if (ret) {
		mhi_ep_handle_syserr(mhi_cntrl);
		goto err_unlock;
	}

	mhi_ep_suspend_channels(mhi_cntrl);

	/* Signal host that the device moved to M3 */
	ret = mhi_ep_send_state_change_event(mhi_cntrl, MHI_STATE_M3);
	if (ret) {
		dev_err(dev, "Failed sending M3 state change event\n");
		goto err_unlock;
	}

err_unlock:
	mutex_unlock(&mhi_cntrl->state_lock);

	return ret;
}

int mhi_ep_set_ready_state(struct mhi_ep_cntrl *mhi_cntrl)
{
	struct device *dev = &mhi_cntrl->mhi_dev->dev;
	enum mhi_state mhi_state;
	int ret, is_ready;

	mutex_lock(&mhi_cntrl->state_lock);

	/* Ensure that the MHISTATUS is set to RESET by host */
	mhi_state = mhi_ep_mmio_masked_read(mhi_cntrl, EP_MHISTATUS, MHISTATUS_MHISTATE_MASK);
	is_ready = mhi_ep_mmio_masked_read(mhi_cntrl, EP_MHISTATUS, MHISTATUS_READY_MASK);

	if (mhi_state != MHI_STATE_RESET || is_ready) {
		dev_err(dev, "READY state transition failed. MHI host not in RESET state\n");
		ret = -EIO;
		goto err_unlock;
	}

	ret = mhi_ep_set_mhi_state(mhi_cntrl, MHI_STATE_READY);
	if (ret)
		mhi_ep_handle_syserr(mhi_cntrl);

err_unlock:
	mutex_unlock(&mhi_cntrl->state_lock);

	return ret;
}

Annotation

Implementation Notes