|
@@ -322,6 +322,7 @@ static irqreturn_t xadc_zynq_interrupt_handler(int irq, void *devid)
|
|
|
|
|
|
#define XADC_ZYNQ_TCK_RATE_MAX 50000000
|
|
|
#define XADC_ZYNQ_IGAP_DEFAULT 20
|
|
|
+#define XADC_ZYNQ_PCAP_RATE_MAX 200000000
|
|
|
|
|
|
static int xadc_zynq_setup(struct platform_device *pdev,
|
|
|
struct iio_dev *indio_dev, int irq)
|
|
@@ -332,6 +333,7 @@ static int xadc_zynq_setup(struct platform_device *pdev,
|
|
|
unsigned int div;
|
|
|
unsigned int igap;
|
|
|
unsigned int tck_rate;
|
|
|
+ int ret;
|
|
|
|
|
|
/* TODO: Figure out how to make igap and tck_rate configurable */
|
|
|
igap = XADC_ZYNQ_IGAP_DEFAULT;
|
|
@@ -343,6 +345,13 @@ static int xadc_zynq_setup(struct platform_device *pdev,
|
|
|
if (!pcap_rate)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ if (pcap_rate > XADC_ZYNQ_PCAP_RATE_MAX) {
|
|
|
+ ret = clk_set_rate(xadc->clk,
|
|
|
+ (unsigned long)XADC_ZYNQ_PCAP_RATE_MAX);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
if (tck_rate > pcap_rate / 2) {
|
|
|
div = 2;
|
|
|
} else {
|
|
@@ -368,6 +377,12 @@ static int xadc_zynq_setup(struct platform_device *pdev,
|
|
|
XADC_ZYNQ_CFG_REDGE | XADC_ZYNQ_CFG_WEDGE |
|
|
|
tck_div | XADC_ZYNQ_CFG_IGAP(igap));
|
|
|
|
|
|
+ if (pcap_rate > XADC_ZYNQ_PCAP_RATE_MAX) {
|
|
|
+ ret = clk_set_rate(xadc->clk, pcap_rate);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|