@@ -328,11 +328,16 @@ static int venus_probe(struct platform_device *pdev)
if (ret)
return ret;
- for (i = 0; i < res->resets_num; i++) {
- core->resets[i] = devm_reset_control_get_exclusive(dev, res->resets[i]);
- if (IS_ERR(core->resets[i]))
- return PTR_ERR(core->resets[i]);
- }
+ core->resets = devm_kcalloc(dev, res->resets_num, sizeof(*core->resets), GFP_KERNEL);
+ if (res->resets_num && !core->resets)
+ return -ENOMEM;
+
+ for (i = 0; i < res->resets_num; i++)
+ core->resets[i].id = res->resets[i];
+
+ ret = devm_reset_control_bulk_get_exclusive(dev, res->resets_num, core->resets);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to get resets\n");
ret = venus_get_resources(core);
if (ret)
@@ -130,7 +130,7 @@ struct venus_format {
* @pmdomains: a pointer to a list of pmdomains
* @opp_dl_venus: an device-link for device OPP
* @opp_pmdomain: an OPP power-domain
- * @resets: an array of reset signals
+ * @resets: a reset_control_bulk_data array of hardware reset signals
* @vdev_dec: a reference to video device structure for decoder instances
* @vdev_enc: a reference to video device structure for encoder instances
* @v4l2_dev: a holder for v4l2 device structure
@@ -183,7 +183,7 @@ struct venus_core {
struct dev_pm_domain_list *pmdomains;
struct device_link *opp_dl_venus;
struct device *opp_pmdomain;
- struct reset_control *resets[VIDC_RESETS_NUM_MAX];
+ struct reset_control_bulk_data *resets;
struct video_device *vdev_dec;
struct video_device *vdev_enc;
struct v4l2_device v4l2_dev;
@@ -865,21 +865,12 @@ void vcodec_domains_put(struct venus_core *core)
static int core_resets_reset(struct venus_core *core)
{
const struct venus_resources *res = core->res;
- unsigned int i;
int ret;
- for (i = 0; i < res->resets_num; i++) {
- ret = reset_control_assert(core->resets[i]);
- if (ret)
- goto err;
-
- usleep_range(150, 250);
- ret = reset_control_deassert(core->resets[i]);
- if (ret)
- goto err;
- }
+ ret = reset_control_bulk_reset(res->resets_num, core->resets);
+ if (ret)
+ dev_err(core->dev, "Failed to toggle resets: %d\n", ret);
-err:
return ret;
}