1f26c8a8eSSimon Glass /* 2f26c8a8eSSimon Glass * Copyright (c) 2015 Google, Inc 3f26c8a8eSSimon Glass * Written by Simon Glass <sjg@chromium.org> 4f26c8a8eSSimon Glass * 5f26c8a8eSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6f26c8a8eSSimon Glass */ 7f26c8a8eSSimon Glass 808d0d6f3SMichal Simek #ifndef _CLK_H_ 908d0d6f3SMichal Simek #define _CLK_H_ 1008d0d6f3SMichal Simek 11*e70cc438SSimon Glass #include <errno.h> 12ad1cf785SMasahiro Yamada #include <linux/types.h> 13ad1cf785SMasahiro Yamada 14ad1cf785SMasahiro Yamada struct udevice; 15ad1cf785SMasahiro Yamada 1608d0d6f3SMichal Simek int soc_clk_dump(void); 1708d0d6f3SMichal Simek 18f26c8a8eSSimon Glass struct clk_ops { 19f26c8a8eSSimon Glass /** 20f26c8a8eSSimon Glass * get_rate() - Get current clock rate 21f26c8a8eSSimon Glass * 22f26c8a8eSSimon Glass * @dev: Device to check (UCLASS_CLK) 23f26c8a8eSSimon Glass * @return clock rate in Hz, or -ve error code 24f26c8a8eSSimon Glass */ 25f26c8a8eSSimon Glass ulong (*get_rate)(struct udevice *dev); 26f26c8a8eSSimon Glass 27f26c8a8eSSimon Glass /** 28f26c8a8eSSimon Glass * set_rate() - Set current clock rate 29f26c8a8eSSimon Glass * 30f26c8a8eSSimon Glass * @dev: Device to adjust 31f26c8a8eSSimon Glass * @rate: New clock rate in Hz 32f26c8a8eSSimon Glass * @return new rate, or -ve error code 33f26c8a8eSSimon Glass */ 34f26c8a8eSSimon Glass ulong (*set_rate)(struct udevice *dev, ulong rate); 35f26c8a8eSSimon Glass 36f26c8a8eSSimon Glass /** 37f0e07516SMasahiro Yamada * enable() - Enable the clock for a peripheral 38f0e07516SMasahiro Yamada * 39f0e07516SMasahiro Yamada * @dev: clock provider 40f0e07516SMasahiro Yamada * @periph: Peripheral ID to enable 41f0e07516SMasahiro Yamada * @return zero on success, or -ve error code 42f0e07516SMasahiro Yamada */ 43f0e07516SMasahiro Yamada int (*enable)(struct udevice *dev, int periph); 44f0e07516SMasahiro Yamada 45f0e07516SMasahiro Yamada /** 468bdf9cfdSMasahiro Yamada * get_periph_rate() - Get clock rate for a peripheral 47f26c8a8eSSimon Glass * 488bdf9cfdSMasahiro Yamada * @dev: Device to check (UCLASS_CLK) 498bdf9cfdSMasahiro Yamada * @periph: Peripheral ID to check 508bdf9cfdSMasahiro Yamada * @return clock rate in Hz, or -ve error code 51f26c8a8eSSimon Glass */ 52f26c8a8eSSimon Glass ulong (*get_periph_rate)(struct udevice *dev, int periph); 53f26c8a8eSSimon Glass 54f26c8a8eSSimon Glass /** 558bdf9cfdSMasahiro Yamada * set_periph_rate() - Set current clock rate for a peripheral 56f26c8a8eSSimon Glass * 57f26c8a8eSSimon Glass * @dev: Device to update (UCLASS_CLK) 588bdf9cfdSMasahiro Yamada * @periph: Peripheral ID to update 59f26c8a8eSSimon Glass * @return new clock rate in Hz, or -ve error code 60f26c8a8eSSimon Glass */ 61f26c8a8eSSimon Glass ulong (*set_periph_rate)(struct udevice *dev, int periph, ulong rate); 62f26c8a8eSSimon Glass }; 63f26c8a8eSSimon Glass 64f26c8a8eSSimon Glass #define clk_get_ops(dev) ((struct clk_ops *)(dev)->driver->ops) 65f26c8a8eSSimon Glass 66f26c8a8eSSimon Glass /** 67f26c8a8eSSimon Glass * clk_get_rate() - Get current clock rate 68f26c8a8eSSimon Glass * 69f26c8a8eSSimon Glass * @dev: Device to check (UCLASS_CLK) 70f26c8a8eSSimon Glass * @return clock rate in Hz, or -ve error code 71f26c8a8eSSimon Glass */ 72f26c8a8eSSimon Glass ulong clk_get_rate(struct udevice *dev); 73f26c8a8eSSimon Glass 74f26c8a8eSSimon Glass /** 758bdf9cfdSMasahiro Yamada * clk_set_rate() - Set current clock rate 76f26c8a8eSSimon Glass * 77f26c8a8eSSimon Glass * @dev: Device to adjust 78f26c8a8eSSimon Glass * @rate: New clock rate in Hz 79f26c8a8eSSimon Glass * @return new rate, or -ve error code 80f26c8a8eSSimon Glass */ 81f26c8a8eSSimon Glass ulong clk_set_rate(struct udevice *dev, ulong rate); 82f26c8a8eSSimon Glass 83f26c8a8eSSimon Glass /** 84f0e07516SMasahiro Yamada * clk_enable() - Enable the clock for a peripheral 85f0e07516SMasahiro Yamada * 86f0e07516SMasahiro Yamada * @dev: clock provider 87f0e07516SMasahiro Yamada * @periph: Peripheral ID to enable 88f0e07516SMasahiro Yamada * @return zero on success, or -ve error code 89f0e07516SMasahiro Yamada */ 90f0e07516SMasahiro Yamada int clk_enable(struct udevice *dev, int periph); 91f0e07516SMasahiro Yamada 92f0e07516SMasahiro Yamada /** 93f26c8a8eSSimon Glass * clk_get_periph_rate() - Get current clock rate for a peripheral 94f26c8a8eSSimon Glass * 95f26c8a8eSSimon Glass * @dev: Device to check (UCLASS_CLK) 96f26c8a8eSSimon Glass * @return clock rate in Hz, -ve error code 97f26c8a8eSSimon Glass */ 98f26c8a8eSSimon Glass ulong clk_get_periph_rate(struct udevice *dev, int periph); 99f26c8a8eSSimon Glass 100f26c8a8eSSimon Glass /** 101f26c8a8eSSimon Glass * clk_set_periph_rate() - Set current clock rate for a peripheral 102f26c8a8eSSimon Glass * 103f26c8a8eSSimon Glass * @dev: Device to update (UCLASS_CLK) 1048bdf9cfdSMasahiro Yamada * @periph: Peripheral ID to update 105f26c8a8eSSimon Glass * @return new clock rate in Hz, or -ve error code 106f26c8a8eSSimon Glass */ 107f26c8a8eSSimon Glass ulong clk_set_periph_rate(struct udevice *dev, int periph, ulong rate); 108f26c8a8eSSimon Glass 109*e70cc438SSimon Glass #if CONFIG_IS_ENABLED(OF_CONTROL) 110*e70cc438SSimon Glass /** 111*e70cc438SSimon Glass * clk_get_by_index() - look up a clock referenced by a device 112*e70cc438SSimon Glass * 113*e70cc438SSimon Glass * Parse a device's 'clocks' list, returning information on the indexed clock, 114*e70cc438SSimon Glass * ensuring that it is activated. 115*e70cc438SSimon Glass * 116*e70cc438SSimon Glass * @dev: Device containing the clock reference 117*e70cc438SSimon Glass * @index: Clock index to return (0 = first) 118*e70cc438SSimon Glass * @clk_devp: Returns clock device 119*e70cc438SSimon Glass * @return: Peripheral ID for the device to control. This is the first 120*e70cc438SSimon Glass * argument after the clock node phandle. If there is no arguemnt, 121*e70cc438SSimon Glass * returns 0. Return -ve error code on any error 122*e70cc438SSimon Glass */ 123*e70cc438SSimon Glass int clk_get_by_index(struct udevice *dev, int index, struct udevice **clk_devp); 124*e70cc438SSimon Glass #else 125*e70cc438SSimon Glass static inline int clk_get_by_index(struct udevice *dev, int index, 126*e70cc438SSimon Glass struct udevice **clk_devp) 127*e70cc438SSimon Glass { 128*e70cc438SSimon Glass return -ENOSYS; 129*e70cc438SSimon Glass } 130*e70cc438SSimon Glass #endif 131*e70cc438SSimon Glass 13208d0d6f3SMichal Simek #endif /* _CLK_H_ */ 133