1*f8ce2547SRussell King /* 2*f8ce2547SRussell King * linux/include/linux/clk.h 3*f8ce2547SRussell King * 4*f8ce2547SRussell King * Copyright (C) 2004 ARM Limited. 5*f8ce2547SRussell King * Written by Deep Blue Solutions Limited. 6*f8ce2547SRussell King * 7*f8ce2547SRussell King * This program is free software; you can redistribute it and/or modify 8*f8ce2547SRussell King * it under the terms of the GNU General Public License version 2 as 9*f8ce2547SRussell King * published by the Free Software Foundation. 10*f8ce2547SRussell King */ 11*f8ce2547SRussell King #ifndef ASMARM_CLOCK_H 12*f8ce2547SRussell King #define ASMARM_CLOCK_H 13*f8ce2547SRussell King 14*f8ce2547SRussell King struct device; 15*f8ce2547SRussell King 16*f8ce2547SRussell King /* 17*f8ce2547SRussell King * The base API. 18*f8ce2547SRussell King */ 19*f8ce2547SRussell King 20*f8ce2547SRussell King 21*f8ce2547SRussell King /* 22*f8ce2547SRussell King * struct clk - an machine class defined object / cookie. 23*f8ce2547SRussell King */ 24*f8ce2547SRussell King struct clk; 25*f8ce2547SRussell King 26*f8ce2547SRussell King /** 27*f8ce2547SRussell King * clk_get - lookup and obtain a reference to a clock producer. 28*f8ce2547SRussell King * @dev: device for clock "consumer" 29*f8ce2547SRussell King * @id: clock comsumer ID 30*f8ce2547SRussell King * 31*f8ce2547SRussell King * Returns a struct clk corresponding to the clock producer, or 32*f8ce2547SRussell King * valid IS_ERR() condition containing errno. The implementation 33*f8ce2547SRussell King * uses @dev and @id to determine the clock consumer, and thereby 34*f8ce2547SRussell King * the clock producer. (IOW, @id may be identical strings, but 35*f8ce2547SRussell King * clk_get may return different clock producers depending on @dev.) 36*f8ce2547SRussell King * 37*f8ce2547SRussell King * Drivers must assume that the clock source is not enabled. 38*f8ce2547SRussell King */ 39*f8ce2547SRussell King struct clk *clk_get(struct device *dev, const char *id); 40*f8ce2547SRussell King 41*f8ce2547SRussell King /** 42*f8ce2547SRussell King * clk_enable - inform the system when the clock source should be running. 43*f8ce2547SRussell King * @clk: clock source 44*f8ce2547SRussell King * 45*f8ce2547SRussell King * If the clock can not be enabled/disabled, this should return success. 46*f8ce2547SRussell King * 47*f8ce2547SRussell King * Returns success (0) or negative errno. 48*f8ce2547SRussell King */ 49*f8ce2547SRussell King int clk_enable(struct clk *clk); 50*f8ce2547SRussell King 51*f8ce2547SRussell King /** 52*f8ce2547SRussell King * clk_disable - inform the system when the clock source is no longer required. 53*f8ce2547SRussell King * @clk: clock source 54*f8ce2547SRussell King * 55*f8ce2547SRussell King * Inform the system that a clock source is no longer required by 56*f8ce2547SRussell King * a driver and may be shut down. 57*f8ce2547SRussell King * 58*f8ce2547SRussell King * Implementation detail: if the clock source is shared between 59*f8ce2547SRussell King * multiple drivers, clk_enable() calls must be balanced by the 60*f8ce2547SRussell King * same number of clk_disable() calls for the clock source to be 61*f8ce2547SRussell King * disabled. 62*f8ce2547SRussell King */ 63*f8ce2547SRussell King void clk_disable(struct clk *clk); 64*f8ce2547SRussell King 65*f8ce2547SRussell King /** 66*f8ce2547SRussell King * clk_get_rate - obtain the current clock rate (in Hz) for a clock source. 67*f8ce2547SRussell King * This is only valid once the clock source has been enabled. 68*f8ce2547SRussell King * @clk: clock source 69*f8ce2547SRussell King */ 70*f8ce2547SRussell King unsigned long clk_get_rate(struct clk *clk); 71*f8ce2547SRussell King 72*f8ce2547SRussell King /** 73*f8ce2547SRussell King * clk_put - "free" the clock source 74*f8ce2547SRussell King * @clk: clock source 75*f8ce2547SRussell King * 76*f8ce2547SRussell King * Note: drivers must ensure that all clk_enable calls made on this 77*f8ce2547SRussell King * clock source are balanced by clk_disable calls prior to calling 78*f8ce2547SRussell King * this function. 79*f8ce2547SRussell King */ 80*f8ce2547SRussell King void clk_put(struct clk *clk); 81*f8ce2547SRussell King 82*f8ce2547SRussell King 83*f8ce2547SRussell King /* 84*f8ce2547SRussell King * The remaining APIs are optional for machine class support. 85*f8ce2547SRussell King */ 86*f8ce2547SRussell King 87*f8ce2547SRussell King 88*f8ce2547SRussell King /** 89*f8ce2547SRussell King * clk_round_rate - adjust a rate to the exact rate a clock can provide 90*f8ce2547SRussell King * @clk: clock source 91*f8ce2547SRussell King * @rate: desired clock rate in Hz 92*f8ce2547SRussell King * 93*f8ce2547SRussell King * Returns rounded clock rate in Hz, or negative errno. 94*f8ce2547SRussell King */ 95*f8ce2547SRussell King long clk_round_rate(struct clk *clk, unsigned long rate); 96*f8ce2547SRussell King 97*f8ce2547SRussell King /** 98*f8ce2547SRussell King * clk_set_rate - set the clock rate for a clock source 99*f8ce2547SRussell King * @clk: clock source 100*f8ce2547SRussell King * @rate: desired clock rate in Hz 101*f8ce2547SRussell King * 102*f8ce2547SRussell King * Returns success (0) or negative errno. 103*f8ce2547SRussell King */ 104*f8ce2547SRussell King int clk_set_rate(struct clk *clk, unsigned long rate); 105*f8ce2547SRussell King 106*f8ce2547SRussell King /** 107*f8ce2547SRussell King * clk_set_parent - set the parent clock source for this clock 108*f8ce2547SRussell King * @clk: clock source 109*f8ce2547SRussell King * @parent: parent clock source 110*f8ce2547SRussell King * 111*f8ce2547SRussell King * Returns success (0) or negative errno. 112*f8ce2547SRussell King */ 113*f8ce2547SRussell King int clk_set_parent(struct clk *clk, struct clk *parent); 114*f8ce2547SRussell King 115*f8ce2547SRussell King /** 116*f8ce2547SRussell King * clk_get_parent - get the parent clock source for this clock 117*f8ce2547SRussell King * @clk: clock source 118*f8ce2547SRussell King * 119*f8ce2547SRussell King * Returns struct clk corresponding to parent clock source, or 120*f8ce2547SRussell King * valid IS_ERR() condition containing errno. 121*f8ce2547SRussell King */ 122*f8ce2547SRussell King struct clk *clk_get_parent(struct clk *clk); 123*f8ce2547SRussell King 124*f8ce2547SRussell King #endif 125