diff options
Diffstat (limited to 'target/linux/ramips/patches-3.18/0066-cevt.patch')
-rw-r--r-- | target/linux/ramips/patches-3.18/0066-cevt.patch | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/target/linux/ramips/patches-3.18/0066-cevt.patch b/target/linux/ramips/patches-3.18/0066-cevt.patch index 01cb588cd9..9eb6cb612b 100644 --- a/target/linux/ramips/patches-3.18/0066-cevt.patch +++ b/target/linux/ramips/patches-3.18/0066-cevt.patch @@ -3,7 +3,7 @@ @@ -45,18 +45,33 @@ static void (*systick_freq_scaling)(stru static void systick_set_clock_mode(enum clock_event_mode mode, struct clock_event_device *evt); - + +static inline unsigned int read_count(struct systick_device *sdev) +{ + return ioread32(sdev->membase + SYSTICK_COUNT); @@ -25,7 +25,7 @@ struct systick_device *sdev; - u32 count; + int res; - + sdev = container_of(evt, struct systick_device, dev); - count = ioread32(sdev->membase + SYSTICK_COUNT); - count = (count + delta) % SYSTICK_FREQ; @@ -33,21 +33,21 @@ + delta += read_count(sdev); + write_compare(sdev, delta); + res = ((int)(read_count(sdev) - delta) >= 0) ? -ETIME : 0; - + - return 0; + return res; } - + static void systick_event_handler(struct clock_event_device *dev) @@ -66,20 +81,25 @@ static void systick_event_handler(struct - + static irqreturn_t systick_interrupt(int irq, void *dev_id) { - struct clock_event_device *dev = (struct clock_event_device *) dev_id; + int ret = 0; + struct clock_event_device *cdev; + struct systick_device *sdev; - + - dev->event_handler(dev); + if (read_c0_cause() & STATUSF_IP7) { + cdev = (struct clock_event_device *) dev_id; @@ -58,11 +58,11 @@ + cdev->event_handler(cdev); + ret = 1; + } - + - return IRQ_HANDLED; + return IRQ_RETVAL(ret); } - + static struct systick_device systick = { .dev = { - /* @@ -76,7 +76,7 @@ @@ -126,13 +146,14 @@ static void systick_set_clock_mode(enum systick_freq_scaling(sdev, 1); break; - + + case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_SHUTDOWN: if (systick_freq_scaling) @@ -88,26 +88,26 @@ - iowrite32(0, systick.membase + SYSTICK_CONFIG); + iowrite32(CFG_CNT_EN, systick.membase + SYSTICK_CONFIG); break; - + default: @@ -142,38 +163,45 @@ static void systick_set_clock_mode(enum } - + static const struct of_device_id systick_match[] = { - { .compatible = "ralink,mt7620-systick", .data = mt7620_freq_scaling}, + { .compatible = "ralink,mt7620a-systick", .data = mt7620_freq_scaling}, {}, }; - + static void __init ralink_systick_init(struct device_node *np) { const struct of_device_id *match; + int rating = 200; - + systick.membase = of_iomap(np, 0); if (!systick.membase) return; - + match = of_match_node(systick_match, np); - if (match) + if (match) { @@ -118,7 +118,7 @@ + */ + rating = 310; + } - + - systick_irqaction.name = np->name; - systick.dev.name = np->name; - clockevents_calc_mult_shift(&systick.dev, SYSTICK_FREQ, 60); |