static int rt_timer_probe(struct platform_device *pdev) { struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); struct rt_timer *rt; struct clk *clk; rt = devm_kzalloc(&pdev->dev, sizeof(*rt), GFP_KERNEL); if (!rt) { dev_err(&pdev->dev, "failed to allocate memory\n"); return -ENOMEM; } rt->irq = platform_get_irq(pdev, 0); if (!rt->irq) { dev_err(&pdev->dev, "failed to load irq\n"); return -ENOENT; } rt->membase = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(rt->membase)) return PTR_ERR(rt->membase); clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(clk)) { dev_err(&pdev->dev, "failed get clock rate\n"); return PTR_ERR(clk); } rt->timer_freq = clk_get_rate(clk) / TMR0CTL_PRESCALE_DIV; if (!rt->timer_freq) return -EINVAL; rt->dev = &pdev->dev; platform_set_drvdata(pdev, rt); rt_timer_request(rt); rt_timer_config(rt, 2); rt_timer_enable(rt); dev_info(&pdev->dev, "maximum frequency is %luHz\n", rt->timer_freq); return 0; }
static int rt_timer_probe(struct platform_device *pdev) { struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); const __be32 *divisor; struct rt_timer *rt; struct clk *clk; int ret; rt = devm_kzalloc(&pdev->dev, sizeof(*rt), GFP_KERNEL); if (!rt) { dev_err(&pdev->dev, "failed to allocate memory\n"); return -ENOMEM; } rt->irq = platform_get_irq(pdev, 0); if (!rt->irq) { dev_err(&pdev->dev, "failed to load irq\n"); return -ENOENT; } rt->membase = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(rt->membase)) return PTR_ERR(rt->membase); clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(clk)) { dev_err(&pdev->dev, "failed get clock rate\n"); return PTR_ERR(clk); } rt->timer_freq = clk_get_rate(clk) / TMR0CTL_PRESCALE_DIV; if (!rt->timer_freq) return -EINVAL; rt->duty_cycle = 100; rt->dev = &pdev->dev; platform_set_drvdata(pdev, rt); ret = rt_timer_request(rt); if (ret) return ret; divisor = of_get_property(pdev->dev.of_node, "ralink,divisor", NULL); if (divisor) rt_timer_config(rt, be32_to_cpu(*divisor)); else rt_timer_config(rt, 200); rt->led_trigger.name = "pwmtimer", rt->led_trigger.activate = rt_timer_trig_activate, rt->led_trigger.deactivate = rt_timer_trig_deactivate, ret = led_trigger_register(&rt->led_trigger); if (ret) return ret; INIT_LIST_HEAD(&rt->gpios); dev_info(&pdev->dev, "maximum frequncy is %luHz\n", rt->timer_freq); return 0; }