/* CIR_REG register idle threshold */
 #define REG_CIR_ITHR(val)    (((val) << 8) & (GENMASK(15, 8)))
 
-/* Required frequency for IR0 or IR1 clock in CIR mode */
+/* Required frequency for IR0 or IR1 clock in CIR mode (default) */
 #define SUNXI_IR_BASE_CLK     8000000
-/* Frequency after IR internal divider  */
-#define SUNXI_IR_CLK          (SUNXI_IR_BASE_CLK / 64)
-/* Sample period in ns */
-#define SUNXI_IR_SAMPLE       (1000000000ul / SUNXI_IR_CLK)
 /* Noise threshold in samples  */
 #define SUNXI_IR_RXNOISE      1
 /* Idle Threshold in samples */
                        /* for each bit in fifo */
                        dt = readb(ir->base + SUNXI_IR_RXFIFO_REG);
                        rawir.pulse = (dt & 0x80) != 0;
-                       rawir.duration = ((dt & 0x7f) + 1) * SUNXI_IR_SAMPLE;
+                       rawir.duration = ((dt & 0x7f) + 1) *
+                                        ir->rc->rx_resolution;
                        ir_raw_event_store_with_filter(ir->rc, &rawir);
                }
        }
        struct device_node *dn = dev->of_node;
        struct resource *res;
        struct sunxi_ir *ir;
+       u32 b_clk_freq = SUNXI_IR_BASE_CLK;
 
        ir = devm_kzalloc(dev, sizeof(struct sunxi_ir), GFP_KERNEL);
        if (!ir)
                return PTR_ERR(ir->clk);
        }
 
+       /* Base clock frequency (optional) */
+       of_property_read_u32(dn, "clock-frequency", &b_clk_freq);
+
        /* Reset (optional) */
        ir->rst = devm_reset_control_get_optional_exclusive(dev, NULL);
        if (IS_ERR(ir->rst))
        if (ret)
                return ret;
 
-       ret = clk_set_rate(ir->clk, SUNXI_IR_BASE_CLK);
+       ret = clk_set_rate(ir->clk, b_clk_freq);
        if (ret) {
                dev_err(dev, "set ir base clock failed!\n");
                goto exit_reset_assert;
        }
+       dev_dbg(dev, "set base clock frequency to %d Hz.\n", b_clk_freq);
 
        if (clk_prepare_enable(ir->apb_clk)) {
                dev_err(dev, "try to enable apb_ir_clk failed\n");
        ir->rc->map_name = ir->map_name ?: RC_MAP_EMPTY;
        ir->rc->dev.parent = dev;
        ir->rc->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
-       ir->rc->rx_resolution = SUNXI_IR_SAMPLE;
+       /* Frequency after IR internal divider with sample period in ns */
+       ir->rc->rx_resolution = (1000000000ul / (b_clk_freq / 64));
        ir->rc->timeout = MS_TO_NS(SUNXI_IR_TIMEOUT);
        ir->rc->driver_name = SUNXI_IR_DEV;