#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)
        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;
        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 {
                        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;
 }