Commit 168cdf9c authored by Bard Liao's avatar Bard Liao Committed by Vinod Koul
Browse files

SoundWire: pass stream to compute_params()

parent 366fd59f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -384,7 +384,7 @@ static u32 amd_sdw_read_ping_status(struct sdw_bus *bus)
	return slave_stat;
}

static int amd_sdw_compute_params(struct sdw_bus *bus)
static int amd_sdw_compute_params(struct sdw_bus *bus, struct sdw_stream_runtime *stream)
{
	struct sdw_transport_data t_data = {0};
	struct sdw_master_runtime *m_rt;
+7 −4
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ static void _sdw_compute_port_params(struct sdw_bus *bus,
}

static int sdw_compute_group_params(struct sdw_bus *bus,
				    struct sdw_stream_runtime *stream,
				    struct sdw_group_params *params,
				    struct sdw_group *group)
{
@@ -319,8 +320,9 @@ static int sdw_get_group_count(struct sdw_bus *bus,
 * sdw_compute_port_params: Compute transport and port parameters
 *
 * @bus: SDW Bus instance
 * @stream: Soundwire stream
 */
static int sdw_compute_port_params(struct sdw_bus *bus)
static int sdw_compute_port_params(struct sdw_bus *bus, struct sdw_stream_runtime *stream)
{
	struct sdw_group_params *params = NULL;
	struct sdw_group group;
@@ -340,7 +342,7 @@ static int sdw_compute_port_params(struct sdw_bus *bus)
	}

	/* Compute transport parameters for grouped streams */
	ret = sdw_compute_group_params(bus, params, &group);
	ret = sdw_compute_group_params(bus, stream, params, &group);
	if (ret < 0)
		goto free_params;

@@ -592,8 +594,9 @@ static int sdw_compute_bus_params(struct sdw_bus *bus)
 * sdw_compute_params: Compute bus, transport and port parameters
 *
 * @bus: SDW Bus instance
 * @stream: Soundwire stream
 */
int sdw_compute_params(struct sdw_bus *bus)
int sdw_compute_params(struct sdw_bus *bus, struct sdw_stream_runtime *stream)
{
	int ret;

@@ -603,7 +606,7 @@ int sdw_compute_params(struct sdw_bus *bus)
		return ret;

	/* Compute transport and port params */
	ret = sdw_compute_port_params(bus);
	ret = sdw_compute_port_params(bus, stream);
	if (ret < 0) {
		dev_err(bus->dev, "Compute transport params failed: %d\n", ret);
		return ret;
+1 −1
Original line number Diff line number Diff line
@@ -1072,7 +1072,7 @@ static const struct sdw_master_ops qcom_swrm_ops = {
	.pre_bank_switch = qcom_swrm_pre_bank_switch,
};

static int qcom_swrm_compute_params(struct sdw_bus *bus)
static int qcom_swrm_compute_params(struct sdw_bus *bus, struct sdw_stream_runtime *stream)
{
	struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus);
	struct sdw_master_runtime *m_rt;
+2 −2
Original line number Diff line number Diff line
@@ -1419,7 +1419,7 @@ static int _sdw_prepare_stream(struct sdw_stream_runtime *stream,

			/* Compute params */
			if (bus->compute_params) {
				ret = bus->compute_params(bus);
				ret = bus->compute_params(bus, stream);
				if (ret < 0) {
					dev_err(bus->dev, "Compute params failed: %d\n",
						ret);
@@ -1721,7 +1721,7 @@ static int _sdw_deprepare_stream(struct sdw_stream_runtime *stream)

		/* Compute params */
		if (bus->compute_params) {
			ret = bus->compute_params(bus);
			ret = bus->compute_params(bus, stream);
			if (ret < 0) {
				dev_err(bus->dev, "Compute params failed: %d\n",
					ret);
+74 −74
Original line number Diff line number Diff line
@@ -855,79 +855,6 @@ struct sdw_master_ops {
					int dev_num);
};

/**
 * struct sdw_bus - SoundWire bus
 * @dev: Shortcut to &bus->md->dev to avoid changing the entire code.
 * @md: Master device
 * @bus_lock_key: bus lock key associated to @bus_lock
 * @bus_lock: bus lock
 * @slaves: list of Slaves on this bus
 * @msg_lock_key: message lock key associated to @msg_lock
 * @msg_lock: message lock
 * @m_rt_list: List of Master instance of all stream(s) running on Bus. This
 * is used to compute and program bus bandwidth, clock, frame shape,
 * transport and port parameters
 * @defer_msg: Defer message
 * @params: Current bus parameters
 * @stream_refcount: number of streams currently using this bus
 * @ops: Master callback ops
 * @port_ops: Master port callback ops
 * @prop: Master properties
 * @vendor_specific_prop: pointer to non-standard properties
 * @hw_sync_min_links: Number of links used by a stream above which
 * hardware-based synchronization is required. This value is only
 * meaningful if multi_link is set. If set to 1, hardware-based
 * synchronization will be used even if a stream only uses a single
 * SoundWire segment.
 * @controller_id: system-unique controller ID. If set to -1, the bus @id will be used.
 * @link_id: Link id number, can be 0 to N, unique for each Controller
 * @id: bus system-wide unique id
 * @compute_params: points to Bus resource management implementation
 * @assigned: Bitmap for Slave device numbers.
 * Bit set implies used number, bit clear implies unused number.
 * @clk_stop_timeout: Clock stop timeout computed
 * @bank_switch_timeout: Bank switch timeout computed
 * @domain: IRQ domain
 * @irq_chip: IRQ chip
 * @debugfs: Bus debugfs (optional)
 * @multi_link: Store bus property that indicates if multi links
 * are supported. This flag is populated by drivers after reading
 * appropriate firmware (ACPI/DT).
 * @lane_used_bandwidth: how much bandwidth in bits per second is used by each lane
 */
struct sdw_bus {
	struct device *dev;
	struct sdw_master_device *md;
	struct lock_class_key bus_lock_key;
	struct mutex bus_lock;
	struct list_head slaves;
	struct lock_class_key msg_lock_key;
	struct mutex msg_lock;
	struct list_head m_rt_list;
	struct sdw_defer defer_msg;
	struct sdw_bus_params params;
	int stream_refcount;
	const struct sdw_master_ops *ops;
	const struct sdw_master_port_ops *port_ops;
	struct sdw_master_prop prop;
	void *vendor_specific_prop;
	int hw_sync_min_links;
	int controller_id;
	unsigned int link_id;
	int id;
	int (*compute_params)(struct sdw_bus *bus);
	DECLARE_BITMAP(assigned, SDW_MAX_DEVICES);
	unsigned int clk_stop_timeout;
	u32 bank_switch_timeout;
	struct irq_chip irq_chip;
	struct irq_domain *domain;
#ifdef CONFIG_DEBUG_FS
	struct dentry *debugfs;
#endif
	bool multi_link;
	unsigned int lane_used_bandwidth[SDW_MAX_LANES];
};

int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent,
		       struct fwnode_handle *fwnode);
void sdw_bus_master_delete(struct sdw_bus *bus);
@@ -1017,10 +944,83 @@ struct sdw_stream_runtime {
	struct list_head master_list;
};

/**
 * struct sdw_bus - SoundWire bus
 * @dev: Shortcut to &bus->md->dev to avoid changing the entire code.
 * @md: Master device
 * @bus_lock_key: bus lock key associated to @bus_lock
 * @bus_lock: bus lock
 * @slaves: list of Slaves on this bus
 * @msg_lock_key: message lock key associated to @msg_lock
 * @msg_lock: message lock
 * @m_rt_list: List of Master instance of all stream(s) running on Bus. This
 * is used to compute and program bus bandwidth, clock, frame shape,
 * transport and port parameters
 * @defer_msg: Defer message
 * @params: Current bus parameters
 * @stream_refcount: number of streams currently using this bus
 * @ops: Master callback ops
 * @port_ops: Master port callback ops
 * @prop: Master properties
 * @vendor_specific_prop: pointer to non-standard properties
 * @hw_sync_min_links: Number of links used by a stream above which
 * hardware-based synchronization is required. This value is only
 * meaningful if multi_link is set. If set to 1, hardware-based
 * synchronization will be used even if a stream only uses a single
 * SoundWire segment.
 * @controller_id: system-unique controller ID. If set to -1, the bus @id will be used.
 * @link_id: Link id number, can be 0 to N, unique for each Controller
 * @id: bus system-wide unique id
 * @compute_params: points to Bus resource management implementation
 * @assigned: Bitmap for Slave device numbers.
 * Bit set implies used number, bit clear implies unused number.
 * @clk_stop_timeout: Clock stop timeout computed
 * @bank_switch_timeout: Bank switch timeout computed
 * @domain: IRQ domain
 * @irq_chip: IRQ chip
 * @debugfs: Bus debugfs (optional)
 * @multi_link: Store bus property that indicates if multi links
 * are supported. This flag is populated by drivers after reading
 * appropriate firmware (ACPI/DT).
 * @lane_used_bandwidth: how much bandwidth in bits per second is used by each lane
 */
struct sdw_bus {
	struct device *dev;
	struct sdw_master_device *md;
	struct lock_class_key bus_lock_key;
	struct mutex bus_lock;
	struct list_head slaves;
	struct lock_class_key msg_lock_key;
	struct mutex msg_lock;
	struct list_head m_rt_list;
	struct sdw_defer defer_msg;
	struct sdw_bus_params params;
	int stream_refcount;
	const struct sdw_master_ops *ops;
	const struct sdw_master_port_ops *port_ops;
	struct sdw_master_prop prop;
	void *vendor_specific_prop;
	int hw_sync_min_links;
	int controller_id;
	unsigned int link_id;
	int id;
	int (*compute_params)(struct sdw_bus *bus, struct sdw_stream_runtime *stream);
	DECLARE_BITMAP(assigned, SDW_MAX_DEVICES);
	unsigned int clk_stop_timeout;
	u32 bank_switch_timeout;
	struct irq_chip irq_chip;
	struct irq_domain *domain;
#ifdef CONFIG_DEBUG_FS
	struct dentry *debugfs;
#endif
	bool multi_link;
	unsigned int lane_used_bandwidth[SDW_MAX_LANES];
};

struct sdw_stream_runtime *sdw_alloc_stream(const char *stream_name);
void sdw_release_stream(struct sdw_stream_runtime *stream);

int sdw_compute_params(struct sdw_bus *bus);
int sdw_compute_params(struct sdw_bus *bus, struct sdw_stream_runtime *stream);

int sdw_stream_add_master(struct sdw_bus *bus,
			  struct sdw_stream_config *stream_config,