"Das U-Boot" Source Tree
at master 86 lines 1.8 kB view raw
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright (C) 2017 Microchip Corporation 4 * Wenyou.Yang <wenyou.yang@microchip.com> 5 */ 6 7#include <clk.h> 8#include <dm.h> 9#include <timer.h> 10#include <asm/io.h> 11#include <linux/bitops.h> 12 13#define AT91_PIT_VALUE 0xfffff 14#define AT91_PIT_PITEN BIT(24) /* Timer Enabled */ 15 16struct atmel_pit_regs { 17 u32 mode; 18 u32 status; 19 u32 value; 20 u32 value_image; 21}; 22 23struct atmel_pit_plat { 24 struct atmel_pit_regs *regs; 25}; 26 27static u64 atmel_pit_get_count(struct udevice *dev) 28{ 29 struct atmel_pit_plat *plat = dev_get_plat(dev); 30 struct atmel_pit_regs *const regs = plat->regs; 31 u32 val = readl(&regs->value_image); 32 33 return timer_conv_64(val); 34} 35 36static int atmel_pit_probe(struct udevice *dev) 37{ 38 struct atmel_pit_plat *plat = dev_get_plat(dev); 39 struct atmel_pit_regs *const regs = plat->regs; 40 struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); 41 struct clk clk; 42 ulong clk_rate; 43 int ret; 44 45 ret = clk_get_by_index(dev, 0, &clk); 46 if (ret) 47 return -EINVAL; 48 49 clk_rate = clk_get_rate(&clk); 50 if (!clk_rate) 51 return -EINVAL; 52 53 uc_priv->clock_rate = clk_rate / 16; 54 55 writel(AT91_PIT_VALUE | AT91_PIT_PITEN, &regs->mode); 56 57 return 0; 58} 59 60static int atmel_pit_of_to_plat(struct udevice *dev) 61{ 62 struct atmel_pit_plat *plat = dev_get_plat(dev); 63 64 plat->regs = dev_read_addr_ptr(dev); 65 66 return 0; 67} 68 69static const struct timer_ops atmel_pit_ops = { 70 .get_count = atmel_pit_get_count, 71}; 72 73static const struct udevice_id atmel_pit_ids[] = { 74 { .compatible = "atmel,at91sam9260-pit" }, 75 { } 76}; 77 78U_BOOT_DRIVER(atmel_pit) = { 79 .name = "atmel_pit", 80 .id = UCLASS_TIMER, 81 .of_match = atmel_pit_ids, 82 .of_to_plat = atmel_pit_of_to_plat, 83 .plat_auto = sizeof(struct atmel_pit_plat), 84 .probe = atmel_pit_probe, 85 .ops = &atmel_pit_ops, 86};