hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/spi/cxd2880-spi.c
....@@ -10,6 +10,7 @@
1010 #define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
1111
1212 #include <linux/spi/spi.h>
13
+#include <linux/regulator/consumer.h>
1314 #include <linux/ktime.h>
1415
1516 #include <media/dvb_demux.h>
....@@ -51,6 +52,7 @@
5152 struct mutex spi_mutex; /* For SPI access exclusive control */
5253 int feed_count;
5354 int all_pid_feed_count;
55
+ struct regulator *vcc_supply;
5456 u8 *ts_buf;
5557 struct cxd2880_pid_filter_config filter_config;
5658 };
....@@ -518,6 +520,19 @@
518520 if (!dvb_spi)
519521 return -ENOMEM;
520522
523
+ dvb_spi->vcc_supply = devm_regulator_get_optional(&spi->dev, "vcc");
524
+ if (IS_ERR(dvb_spi->vcc_supply)) {
525
+ if (PTR_ERR(dvb_spi->vcc_supply) == -EPROBE_DEFER) {
526
+ ret = -EPROBE_DEFER;
527
+ goto fail_regulator;
528
+ }
529
+ dvb_spi->vcc_supply = NULL;
530
+ } else {
531
+ ret = regulator_enable(dvb_spi->vcc_supply);
532
+ if (ret)
533
+ goto fail_regulator;
534
+ }
535
+
521536 dvb_spi->spi = spi;
522537 mutex_init(&dvb_spi->spi_mutex);
523538 dev_set_drvdata(&spi->dev, dvb_spi);
....@@ -603,6 +618,9 @@
603618 fail_attach:
604619 dvb_unregister_adapter(&dvb_spi->adapter);
605620 fail_adapter:
621
+ if (dvb_spi->vcc_supply)
622
+ regulator_disable(dvb_spi->vcc_supply);
623
+fail_regulator:
606624 kfree(dvb_spi);
607625 return ret;
608626 }
....@@ -631,6 +649,9 @@
631649 dvb_frontend_detach(&dvb_spi->dvb_fe);
632650 dvb_unregister_adapter(&dvb_spi->adapter);
633651
652
+ if (dvb_spi->vcc_supply)
653
+ regulator_disable(dvb_spi->vcc_supply);
654
+
634655 kfree(dvb_spi);
635656 pr_info("cxd2880_spi remove ok.\n");
636657