Page MenuHomeFreeBSD

D55909.1794282987.diff
No OneTemporary

Authored By
Unknown
Size
5 KB
Referenced Files
None
Subscribers
None

D55909.1794282987.diff

diff --git a/sys/dev/clk/broadcom/bcm_cprman.h b/sys/dev/clk/broadcom/bcm_clk_stub.h
copy from sys/dev/clk/broadcom/bcm_cprman.h
copy to sys/dev/clk/broadcom/bcm_clk_stub.h
--- a/sys/dev/clk/broadcom/bcm_cprman.h
+++ b/sys/dev/clk/broadcom/bcm_clk_stub.h
@@ -25,42 +25,19 @@
* SUCH DAMAGE.
*/
-#ifndef BCM_CPRMAN_H
-#define BCM_CPRMAN_H
+#ifndef BCM_CLK_STUB_H
+#define BCM_CLK_STUB_H
#include <sys/types.h>
-#include <sys/bus.h>
-#include <sys/mutex.h>
-#include <dev/clk/broadcom/bcm_clk_periph.h>
-#include <dev/clk/broadcom/bcm_clk_pll.h>
-#include <dev/clk/broadcom/bcm_clk_pll_channel.h>
+#include <dev/clk/clk.h>
-struct bcm_cprman_clk_data {
- const struct bcm_clk_periph_def *periph_clks;
- size_t periph_clk_cnt;
-
- const struct bcm_clk_pll_def *pll_clks;
- size_t pll_clk_cnt;
-
- const struct bcm_clk_pll_channel_def *pll_chan_clks;
- size_t pll_chan_clk_cnt;
-};
-
-struct bcm_cprman_softc {
- device_t dev;
- struct resource *res;
- struct clkdom *clkdom;
- struct mtx mtx;
- const struct bcm_cprman_clk_data *clk_data;
+struct bcm_clk_stub_def {
+ struct clknode_init_def clkdef;
+ uint64_t freq;
};
-int bcm_cprman_attach(device_t dev);
-
-/*
- * Base kobj class that provides the clkdev interface (read/write/lock).
- * Chip-specific drivers inherit from this via DEFINE_CLASS_1.
- */
-DECLARE_CLASS(bcm_cprman_driver);
+int bcm_clk_stub_register(struct clkdom *clkdom,
+ const struct bcm_clk_stub_def *clkdef);
-#endif /* BCM_CPRMAN_H */
+#endif /* BCM_CLK_STUB_H */
diff --git a/sys/dev/clk/broadcom/bcm_cprman.h b/sys/dev/clk/broadcom/bcm_clk_stub.c
copy from sys/dev/clk/broadcom/bcm_cprman.h
copy to sys/dev/clk/broadcom/bcm_clk_stub.c
--- a/sys/dev/clk/broadcom/bcm_cprman.h
+++ b/sys/dev/clk/broadcom/bcm_clk_stub.c
@@ -25,42 +25,68 @@
* SUCH DAMAGE.
*/
-#ifndef BCM_CPRMAN_H
-#define BCM_CPRMAN_H
+#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <sys/bus.h>
-#include <sys/mutex.h>
+#include <sys/param.h>
+#include <sys/systm.h>
-#include <dev/clk/broadcom/bcm_clk_periph.h>
-#include <dev/clk/broadcom/bcm_clk_pll.h>
-#include <dev/clk/broadcom/bcm_clk_pll_channel.h>
+#include <dev/clk/broadcom/bcm_clk_stub.h>
-struct bcm_cprman_clk_data {
- const struct bcm_clk_periph_def *periph_clks;
- size_t periph_clk_cnt;
+struct bcm_clk_stub_sc {
+ uint64_t freq;
+};
- const struct bcm_clk_pll_def *pll_clks;
- size_t pll_clk_cnt;
+static int
+bcm_clk_stub_recalc(struct clknode *clk, uint64_t *freq)
+{
+ struct bcm_clk_stub_sc *sc;
- const struct bcm_clk_pll_channel_def *pll_chan_clks;
- size_t pll_chan_clk_cnt;
-};
+ sc = clknode_get_softc(clk);
+ *freq = sc->freq;
+
+ return (0);
+}
+
+static int
+bcm_clk_stub_set_freq(struct clknode *clk, uint64_t fin, uint64_t *fout,
+ int flags, int *stop)
+{
+ struct bcm_clk_stub_sc *sc;
+
+ sc = clknode_get_softc(clk);
+ *stop = 1;
+ if (*fout != sc->freq)
+ return (ERANGE);
-struct bcm_cprman_softc {
- device_t dev;
- struct resource *res;
- struct clkdom *clkdom;
- struct mtx mtx;
- const struct bcm_cprman_clk_data *clk_data;
+ return (0);
+}
+
+static clknode_method_t bcm_clk_stub_clknode_methods[] = {
+ CLKNODEMETHOD(clknode_recalc_freq, bcm_clk_stub_recalc),
+ CLKNODEMETHOD(clknode_set_freq, bcm_clk_stub_set_freq),
+ CLKNODEMETHOD_END
};
-int bcm_cprman_attach(device_t dev);
+DEFINE_CLASS_1(bcm_clk_stub_clknode, bcm_clk_stub_clknode_class,
+ bcm_clk_stub_clknode_methods, sizeof(struct bcm_clk_stub_sc),
+ clknode_class);
-/*
- * Base kobj class that provides the clkdev interface (read/write/lock).
- * Chip-specific drivers inherit from this via DEFINE_CLASS_1.
- */
-DECLARE_CLASS(bcm_cprman_driver);
+int
+bcm_clk_stub_register(struct clkdom *clkdom,
+ const struct bcm_clk_stub_def *clkdef)
+{
+ struct bcm_clk_stub_sc *sc;
+ struct clknode *clk;
+
+ clk = clknode_create(clkdom, &bcm_clk_stub_clknode_class,
+ &clkdef->clkdef);
+ if (clk == NULL)
+ return (ENOMEM);
+
+ sc = clknode_get_softc(clk);
+ sc->freq = clkdef->freq;
+
+ clknode_register(clkdom, clk);
-#endif /* BCM_CPRMAN_H */
+ return (0);
+}
diff --git a/sys/dev/clk/broadcom/bcm_cprman.h b/sys/dev/clk/broadcom/bcm_cprman.h
--- a/sys/dev/clk/broadcom/bcm_cprman.h
+++ b/sys/dev/clk/broadcom/bcm_cprman.h
@@ -35,8 +35,11 @@
#include <dev/clk/broadcom/bcm_clk_periph.h>
#include <dev/clk/broadcom/bcm_clk_pll.h>
#include <dev/clk/broadcom/bcm_clk_pll_channel.h>
+#include <dev/clk/broadcom/bcm_clk_stub.h>
struct bcm_cprman_clk_data {
+ const struct bcm_clk_stub_def *stub_clks;
+ size_t stub_clk_cnt;
const struct bcm_clk_periph_def *periph_clks;
size_t periph_clk_cnt;
diff --git a/sys/dev/clk/broadcom/bcm_cprman.c b/sys/dev/clk/broadcom/bcm_cprman.c
--- a/sys/dev/clk/broadcom/bcm_cprman.c
+++ b/sys/dev/clk/broadcom/bcm_cprman.c
@@ -116,6 +116,22 @@
mtx_unlock_spin(&sc->mtx);
}
+static int
+bcm_cprman_register_stub_clks(struct bcm_cprman_softc *sc)
+{
+ int error;
+ size_t i;
+
+ for (i = 0; i < sc->clk_data->stub_clk_cnt; i++) {
+ error = bcm_clk_stub_register(sc->clkdom,
+ &sc->clk_data->stub_clks[i]);
+ if (error != 0)
+ return (error);
+ }
+
+ return (0);
+}
+
static int
bcm_cprman_register_periph_clks(struct bcm_cprman_softc *sc)
{
@@ -192,6 +208,12 @@
return (ENXIO);
}
+ error = bcm_cprman_register_stub_clks(sc);
+ if (error != 0) {
+ device_printf(dev, "cannot register stub clocks\n");
+ return (ENXIO);
+ }
+
error = bcm_cprman_register_plls(sc);
if (error != 0) {
device_printf(dev, "cannot register PLL clocks\n");

File Metadata

Mime Type
text/plain
Expires
Tue, Nov 10, 3:56 AM (16 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41626545
Default Alt Text
D55909.1794282987.diff (5 KB)

Event Timeline