svn commit: r342015 - in head/sys: conf dev/iicbus/twsi
Emmanuel Vadot
manu at FreeBSD.org
Wed Dec 12 22:05:09 UTC 2018
Author: manu
Date: Wed Dec 12 22:05:07 2018
New Revision: 342015
URL: https://svnweb.freebsd.org/changeset/base/342015
Log:
twsi: Clean up marvell part and add support for Marvell 7k/8k
Sponsored by: Rubicon Communications, LLC ("Netgate")
Modified:
head/sys/conf/files.arm64
head/sys/dev/iicbus/twsi/mv_twsi.c
head/sys/dev/iicbus/twsi/twsi.c
head/sys/dev/iicbus/twsi/twsi.h
Modified: head/sys/conf/files.arm64
==============================================================================
--- head/sys/conf/files.arm64 Wed Dec 12 22:04:21 2018 (r342014)
+++ head/sys/conf/files.arm64 Wed Dec 12 22:05:07 2018 (r342015)
@@ -201,6 +201,7 @@ dev/axgbe/xgbe-dev.c optional axgbe
dev/axgbe/xgbe-drv.c optional axgbe
dev/axgbe/xgbe-mdio.c optional axgbe
dev/cpufreq/cpufreq_dt.c optional cpufreq fdt
+dev/iicbus/twsi/mv_twsi.c optional twsi fdt
dev/iicbus/twsi/a10_twsi.c optional twsi fdt
dev/iicbus/twsi/twsi.c optional twsi fdt
dev/hwpmc/hwpmc_arm64.c optional hwpmc
Modified: head/sys/dev/iicbus/twsi/mv_twsi.c
==============================================================================
--- head/sys/dev/iicbus/twsi/mv_twsi.c Wed Dec 12 22:04:21 2018 (r342014)
+++ head/sys/dev/iicbus/twsi/mv_twsi.c Wed Dec 12 22:05:07 2018 (r342015)
@@ -61,6 +61,8 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/extres/clk/clk.h>
+
#include <arm/mv/mvreg.h>
#include <arm/mv/mvvar.h>
#include <dev/iicbus/twsi/twsi.h>
@@ -98,6 +100,7 @@ static int mv_twsi_attach(device_t);
static struct ofw_compat_data compat_data[] = {
{ "mrvl,twsi", true },
{ "marvell,mv64xxx-i2c", true },
+ { "marvell,mv78230-i2c", true },
{ NULL, false }
};
@@ -141,29 +144,27 @@ mv_twsi_probe(device_t dev)
if (!ofw_bus_search_compatible(dev, compat_data)->ocd_data)
return (ENXIO);
- sc->reg_data = TWSI_DATA;
- sc->reg_slave_addr = TWSI_ADDR;
- sc->reg_slave_ext_addr = TWSI_XADDR;
- sc->reg_control = TWSI_CNTR;
- sc->reg_status = TWSI_STAT;
- sc->reg_baud_rate = TWSI_BAUD_RATE;
- sc->reg_soft_reset = TWSI_SRST;
-
device_set_desc(dev, "Marvell Integrated I2C Bus Controller");
return (BUS_PROBE_DEFAULT);
}
#define ABSSUB(a,b) (((a) > (b)) ? (a) - (b) : (b) - (a))
static void
-mv_twsi_cal_baud_rate(const uint32_t target, struct twsi_baud_rate *rate)
+mv_twsi_cal_baud_rate(struct twsi_softc *sc, const uint32_t target,
+ struct twsi_baud_rate *rate)
{
- uint32_t clk, cur, diff, diff0;
+ uint64_t clk;
+ uint32_t cur, diff, diff0;
int m, n, m0, n0;
/* Calculate baud rate. */
m0 = n0 = 4; /* Default values on reset */
diff0 = 0xffffffff;
+#ifdef __aarch64__
+ clk_get_freq(sc->clk_core, &clk);
+#else
clk = get_tclk();
+#endif
for (n = 0; n < 8; n++) {
for (m = 0; m < 16; m++) {
@@ -186,17 +187,37 @@ static int
mv_twsi_attach(device_t dev)
{
struct twsi_softc *sc;
- phandle_t child, iicbusnode;
- device_t childdev;
- struct iicbus_ivar *devi;
- char dname[32]; /* 32 is taken from struct u_device */
- uint32_t paddr;
- int len, error, ret;
+#ifdef __aarch64__
+ int error;
+#endif
sc = device_get_softc(dev);
+ sc->dev = dev;
- mv_twsi_cal_baud_rate(TWSI_BAUD_RATE_SLOW, &sc->baud_rate[IIC_SLOW]);
- mv_twsi_cal_baud_rate(TWSI_BAUD_RATE_FAST, &sc->baud_rate[IIC_FAST]);
+#ifdef __aarch64__
+ /* Activate clock */
+ error = clk_get_by_ofw_index(dev, 0, 0, &sc->clk_core);
+ if (error != 0) {
+ device_printf(dev, "could not find core clock\n");
+ return (error);
+ }
+ error = clk_enable(sc->clk_core);
+ if (error != 0) {
+ device_printf(dev, "could not enable core clock\n");
+ return (error);
+ }
+
+ if (clk_get_by_ofw_index(dev, 0, 1, &sc->clk_reg) == 0) {
+ error = clk_enable(sc->clk_reg);
+ if (error != 0) {
+ device_printf(dev, "could not enable core clock\n");
+ return (error);
+ }
+ }
+#endif
+
+ mv_twsi_cal_baud_rate(sc, TWSI_BAUD_RATE_SLOW, &sc->baud_rate[IIC_SLOW]);
+ mv_twsi_cal_baud_rate(sc, TWSI_BAUD_RATE_FAST, &sc->baud_rate[IIC_FAST]);
if (bootverbose)
device_printf(dev, "calculated baud rates are:\n"
" %" PRIu32 " kHz (M=%d, N=%d) for slow,\n"
@@ -208,56 +229,13 @@ mv_twsi_attach(device_t dev)
sc->baud_rate[IIC_FAST].m,
sc->baud_rate[IIC_FAST].n);
+ sc->reg_data = TWSI_DATA;
+ sc->reg_slave_addr = TWSI_ADDR;
+ sc->reg_slave_ext_addr = TWSI_XADDR;
+ sc->reg_control = TWSI_CNTR;
+ sc->reg_status = TWSI_STAT;
+ sc->reg_baud_rate = TWSI_BAUD_RATE;
+ sc->reg_soft_reset = TWSI_SRST;
- ret = twsi_attach(dev);
- if (ret != 0)
- return (ret);
-
- iicbusnode = 0;
- /* Find iicbus as the child devices in the device tree. */
- for (child = OF_child(ofw_bus_get_node(dev)); child != 0;
- child = OF_peer(child)) {
- len = OF_getproplen(child, "model");
- if (len <= 0 || len > sizeof(dname))
- continue;
- error = OF_getprop(child, "model", &dname, len);
- if (error == -1)
- continue;
- len = strlen(dname);
- if (len == strlen(IICBUS_DEVNAME) &&
- strncasecmp(dname, IICBUS_DEVNAME, len) == 0) {
- iicbusnode = child;
- break;
- }
- }
- if (iicbusnode == 0)
- goto attach_end;
-
- /* Attach child devices onto iicbus. */
- for (child = OF_child(iicbusnode); child != 0; child = OF_peer(child)) {
- /* Get slave address. */
- error = OF_getencprop(child, "i2c-address", &paddr, sizeof(paddr));
- if (error == -1)
- error = OF_getencprop(child, "reg", &paddr, sizeof(paddr));
- if (error == -1)
- continue;
-
- /* Get device driver name. */
- len = OF_getproplen(child, "model");
- if (len <= 0 || len > sizeof(dname))
- continue;
- OF_getprop(child, "model", &dname, len);
-
- if (bootverbose)
- device_printf(dev, "adding a device %s at %d.\n",
- dname, paddr);
- childdev = BUS_ADD_CHILD(sc->iicbus, 0, dname, -1);
- devi = IICBUS_IVAR(childdev);
- devi->addr = paddr;
- }
-
-attach_end:
- bus_generic_attach(sc->iicbus);
-
- return (0);
+ return (twsi_attach(dev));
}
Modified: head/sys/dev/iicbus/twsi/twsi.c
==============================================================================
--- head/sys/dev/iicbus/twsi/twsi.c Wed Dec 12 22:04:21 2018 (r342014)
+++ head/sys/dev/iicbus/twsi/twsi.c Wed Dec 12 22:05:07 2018 (r342015)
@@ -440,6 +440,7 @@ twsi_detach(device_t dev)
int rv;
sc = device_get_softc(dev);
+ debugf("");
if ((rv = bus_generic_detach(dev)) != 0)
return (rv);
Modified: head/sys/dev/iicbus/twsi/twsi.h
==============================================================================
--- head/sys/dev/iicbus/twsi/twsi.h Wed Dec 12 22:04:21 2018 (r342014)
+++ head/sys/dev/iicbus/twsi/twsi.h Wed Dec 12 22:05:07 2018 (r342015)
@@ -34,6 +34,8 @@
#ifndef _TWSI_H_
#define _TWSI_H_
+#include <dev/extres/clk/clk.h>
+
struct twsi_baud_rate {
uint32_t raw;
int param;
@@ -46,6 +48,8 @@ struct twsi_softc {
struct resource *res[1]; /* SYS_RES_MEMORY */
struct mtx mutex;
device_t iicbus;
+ clk_t clk_core;
+ clk_t clk_reg;
bus_size_t reg_data;
bus_size_t reg_slave_addr;
More information about the svn-src-head
mailing list