dts changes for mcan for omaps for v4.19 merge window

These changes configure the mcan clock, interconnect target
 module and mcan device. These changes depend on the ti-sysc
 related driver changes and are based on those.
 
 Notably this is the first new driver that probes with ti-sysc
 driver with no legacy hwmod platform data for the interconnect
 target module.
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCAAvFiEEkgNvrZJU/QSQYIcQG9Q+yVyrpXMFAltGAUURHHRvbnlAYXRv
 bWlkZS5jb20ACgkQG9Q+yVyrpXO1eA//fbUztpM4DFjzFqqsesdkkzyEdgYtcMj/
 FtP/pntzzSyP7hqGPTLUhK7qrDUbsxXvBu7AfGer57XjU3IzcrHTmMF5gKTo5Dju
 bM+qZL7xYgTnFVkNvVxjY0dLz14PUPEPIYJEzrZ3njc17jlMvCXyfOVnEe3pZfFz
 lH2oGmUOJjf05pZCOYqOIxjQM9ggJapHorQ4uM5FHkZSD9T8apoAtmlLlYVTdgkh
 bEQIpO+37iuL0Ds06tkJ84SRO/l5P5/Q/jCl72lx8H20Yx56ZdN5ca+jCPwzjjJ3
 ZuCyTec/8QPRnFS/jOLCtjM+zam37npxkHcuNujV5SghHntifbg7bN1jYBWIttkc
 +q3dRT/eJYCdjQrR2qp54o1megIJpE4RgbvSCfn2/jBAGZKOeNe799HIao9tCm+W
 nc62bHUvObHWpMSeyLX8Hi5ywW3UXX7/gCex8oalzL4t+680pTm9/TGZf3WMdwL6
 GU+zcvG3uf97dR0eRgTRZX3PBfQyTmU0ACCDNhV0GCUh+p0D/G8U64HiU6ORX6Dy
 u9DnSGudOZZTKi99PboN+75A9r3wlzxdq0ko5DPMXYgbgzrj4KzONAaMI2PKaktK
 A7pAqtE8/Dos/e/yonBa0H94Ft1pjccKHR/Z8cRKPb50TbOIViMWWwL/CI2ZkwV0
 hcT+iy+MrE0=
 =v277
 -----END PGP SIGNATURE-----

Merge tag 'omap-for-v4.19/dt-mcan-v2-signed-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/dt

dts changes for mcan for omaps for v4.19 merge window

These changes configure the mcan clock, interconnect target
module and mcan device. These changes depend on the ti-sysc
related driver changes and are based on those.

Notably this is the first new driver that probes with ti-sysc
driver with no legacy hwmod platform data for the interconnect
target module.

* tag 'omap-for-v4.19/dt-mcan-v2-signed-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
  ARM: dts: dra76x: Add MCAN node
  ARM: dts: Add generic interconnect target module node for MCAN
  ARM: dts: dra762: Add MCAN clock support
  bus: ti-sysc: Add support for software reset
  bus: ti-sysc: Add support for using ti-sysc for MCAN on dra76x
  clk: ti: dra7: Add clkctrl clock data for the mcan clocks
  bus: ti-sysc: Use 2-factor allocator arguments

Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
Olof Johansson 2018-07-14 14:20:03 -07:00
commit 8291ca5d2a
8 changed files with 144 additions and 4 deletions

View File

@ -36,6 +36,7 @@ Required standard properties:
"ti,sysc-omap-aes" "ti,sysc-omap-aes"
"ti,sysc-mcasp" "ti,sysc-mcasp"
"ti,sysc-usb-host-fs" "ti,sysc-usb-host-fs"
"ti,sysc-dra7-mcan"
- reg shall have register areas implemented for the interconnect - reg shall have register areas implemented for the interconnect
target module in question such as revision, sysc and syss target module in question such as revision, sysc and syss

View File

@ -444,3 +444,9 @@ &extcon_usb1 {
&extcon_usb2 { &extcon_usb2 {
vbus-gpio = <&pcf_lcd 15 GPIO_ACTIVE_HIGH>; vbus-gpio = <&pcf_lcd 15 GPIO_ACTIVE_HIGH>;
}; };
&m_can0 {
can-transceiver {
max-bitrate = <5000000>;
};
};

View File

@ -11,9 +11,73 @@
/ { / {
compatible = "ti,dra762", "ti,dra7"; compatible = "ti,dra762", "ti,dra7";
ocp {
target-module@42c01900 {
compatible = "ti,sysc-dra7-mcan", "ti,sysc";
ranges = <0x0 0x42c00000 0x2000>;
#address-cells = <1>;
#size-cells = <1>;
reg = <0x42c01900 0x4>,
<0x42c01904 0x4>,
<0x42c01908 0x4>;
reg-names = "rev", "sysc", "syss";
ti,sysc-mask = <(SYSC_OMAP4_SOFTRESET |
SYSC_DRA7_MCAN_ENAWAKEUP)>;
ti,syss-mask = <1>;
clocks = <&wkupaon_clkctrl DRA7_ADC_CLKCTRL 0>;
clock-names = "fck";
m_can0: mcan@1a00 {
compatible = "bosch,m_can";
reg = <0x1a00 0x4000>, <0x0 0x18FC>;
reg-names = "m_can", "message_ram";
interrupt-parent = <&gic>;
interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "int0", "int1";
clocks = <&mcan_clk>, <&l3_iclk_div>;
clock-names = "cclk", "hclk";
bosch,mram-cfg = <0x0 0 0 32 0 0 1 1>;
};
};
};
}; };
/* MCAN interrupts are hard-wired to irqs 67, 68 */ /* MCAN interrupts are hard-wired to irqs 67, 68 */
&crossbar_mpu { &crossbar_mpu {
ti,irqs-skip = <10 67 68 133 139 140>; ti,irqs-skip = <10 67 68 133 139 140>;
}; };
&scm_conf_clocks {
dpll_gmac_h14x2_ctrl_ck: dpll_gmac_h14x2_ctrl_ck@3fc {
#clock-cells = <0>;
compatible = "ti,divider-clock";
clocks = <&dpll_gmac_x2_ck>;
ti,max-div = <63>;
reg = <0x03fc>;
ti,bit-shift=<20>;
ti,latch-bit=<26>;
assigned-clocks = <&dpll_gmac_h14x2_ctrl_ck>;
assigned-clock-rates = <80000000>;
};
dpll_gmac_h14x2_ctrl_mux_ck: dpll_gmac_h14x2_ctrl_mux_ck@3fc {
#clock-cells = <0>;
compatible = "ti,mux-clock";
clocks = <&dpll_gmac_ck>, <&dpll_gmac_h14x2_ctrl_ck>;
reg = <0x3fc>;
ti,bit-shift = <29>;
ti,latch-bit=<26>;
assigned-clocks = <&dpll_gmac_h14x2_ctrl_mux_ck>;
assigned-clock-parents = <&dpll_gmac_h14x2_ctrl_ck>;
};
mcan_clk: mcan_clk@3fc {
#clock-cells = <0>;
compatible = "ti,gate-clock";
clocks = <&dpll_gmac_h14x2_ctrl_mux_ck>;
ti,bit-shift = <27>;
reg = <0x3fc>;
};
};

View File

@ -23,11 +23,14 @@
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/iopoll.h>
#include <linux/platform_data/ti-sysc.h> #include <linux/platform_data/ti-sysc.h>
#include <dt-bindings/bus/ti-sysc.h> #include <dt-bindings/bus/ti-sysc.h>
#define MAX_MODULE_SOFTRESET_WAIT 10000
static const char * const reg_names[] = { "rev", "sysc", "syss", }; static const char * const reg_names[] = { "rev", "sysc", "syss", };
enum sysc_clocks { enum sysc_clocks {
@ -88,6 +91,11 @@ struct sysc {
struct delayed_work idle_work; struct delayed_work idle_work;
}; };
void sysc_write(struct sysc *ddata, int offset, u32 value)
{
writel_relaxed(value, ddata->module_va + offset);
}
static u32 sysc_read(struct sysc *ddata, int offset) static u32 sysc_read(struct sysc *ddata, int offset)
{ {
if (ddata->cfg.quirks & SYSC_QUIRK_16BIT) { if (ddata->cfg.quirks & SYSC_QUIRK_16BIT) {
@ -169,9 +177,9 @@ static int sysc_get_clocks(struct sysc *ddata)
const char *name; const char *name;
int nr_fck = 0, nr_ick = 0, i, error = 0; int nr_fck = 0, nr_ick = 0, i, error = 0;
ddata->clock_roles = devm_kzalloc(ddata->dev, ddata->clock_roles = devm_kcalloc(ddata->dev,
sizeof(*ddata->clock_roles) *
SYSC_MAX_CLOCKS, SYSC_MAX_CLOCKS,
sizeof(*ddata->clock_roles),
GFP_KERNEL); GFP_KERNEL);
if (!ddata->clock_roles) if (!ddata->clock_roles)
return -ENOMEM; return -ENOMEM;
@ -200,8 +208,8 @@ static int sysc_get_clocks(struct sysc *ddata)
return -EINVAL; return -EINVAL;
} }
ddata->clocks = devm_kzalloc(ddata->dev, ddata->clocks = devm_kcalloc(ddata->dev,
sizeof(*ddata->clocks) * ddata->nr_clocks, ddata->nr_clocks, sizeof(*ddata->clocks),
GFP_KERNEL); GFP_KERNEL);
if (!ddata->clocks) if (!ddata->clocks)
return -ENOMEM; return -ENOMEM;
@ -943,6 +951,36 @@ static void sysc_init_revision_quirks(struct sysc *ddata)
} }
} }
static int sysc_reset(struct sysc *ddata)
{
int offset = ddata->offsets[SYSC_SYSCONFIG];
int val;
if (ddata->legacy_mode || offset < 0 ||
ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)
return 0;
/*
* Currently only support reset status in sysstatus.
* Warn and return error in all other cases
*/
if (!ddata->cfg.syss_mask) {
dev_err(ddata->dev, "No ti,syss-mask. Reset failed\n");
return -EINVAL;
}
val = sysc_read(ddata, offset);
val |= (0x1 << ddata->cap->regbits->srst_shift);
sysc_write(ddata, offset, val);
/* Poll on reset status */
offset = ddata->offsets[SYSC_SYSSTATUS];
return readl_poll_timeout(ddata->module_va + offset, val,
(val & ddata->cfg.syss_mask) == 0x0,
100, MAX_MODULE_SOFTRESET_WAIT);
}
/* At this point the module is configured enough to read the revision */ /* At this point the module is configured enough to read the revision */
static int sysc_init_module(struct sysc *ddata) static int sysc_init_module(struct sysc *ddata)
{ {
@ -960,6 +998,14 @@ static int sysc_init_module(struct sysc *ddata)
return 0; return 0;
} }
error = sysc_reset(ddata);
if (error) {
dev_err(ddata->dev, "Reset failed with %d\n", error);
pm_runtime_put_sync(ddata->dev);
return error;
}
ddata->revision = sysc_read_revision(ddata); ddata->revision = sysc_read_revision(ddata);
pm_runtime_put_sync(ddata->dev); pm_runtime_put_sync(ddata->dev);
@ -1552,6 +1598,23 @@ static const struct sysc_capabilities sysc_omap4_usb_host_fs = {
.regbits = &sysc_regbits_omap4_usb_host_fs, .regbits = &sysc_regbits_omap4_usb_host_fs,
}; };
static const struct sysc_regbits sysc_regbits_dra7_mcan = {
.dmadisable_shift = -ENODEV,
.midle_shift = -ENODEV,
.sidle_shift = -ENODEV,
.clkact_shift = -ENODEV,
.enwkup_shift = 4,
.srst_shift = 0,
.emufree_shift = -ENODEV,
.autoidle_shift = -ENODEV,
};
static const struct sysc_capabilities sysc_dra7_mcan = {
.type = TI_SYSC_DRA7_MCAN,
.sysc_mask = SYSC_DRA7_MCAN_ENAWAKEUP | SYSC_OMAP4_SOFTRESET,
.regbits = &sysc_regbits_dra7_mcan,
};
static int sysc_init_pdata(struct sysc *ddata) static int sysc_init_pdata(struct sysc *ddata)
{ {
struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev); struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);
@ -1743,6 +1806,7 @@ static const struct of_device_id sysc_match[] = {
{ .compatible = "ti,sysc-mcasp", .data = &sysc_omap4_mcasp, }, { .compatible = "ti,sysc-mcasp", .data = &sysc_omap4_mcasp, },
{ .compatible = "ti,sysc-usb-host-fs", { .compatible = "ti,sysc-usb-host-fs",
.data = &sysc_omap4_usb_host_fs, }, .data = &sysc_omap4_usb_host_fs, },
{ .compatible = "ti,sysc-dra7-mcan", .data = &sysc_dra7_mcan, },
{ }, { },
}; };
MODULE_DEVICE_TABLE(of, sysc_match); MODULE_DEVICE_TABLE(of, sysc_match);

View File

@ -708,6 +708,7 @@ static const struct omap_clkctrl_reg_data dra7_wkupaon_clkctrl_regs[] __initcons
{ DRA7_COUNTER_32K_CLKCTRL, NULL, 0, "wkupaon_iclk_mux" }, { DRA7_COUNTER_32K_CLKCTRL, NULL, 0, "wkupaon_iclk_mux" },
{ DRA7_UART10_CLKCTRL, dra7_uart10_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0060:24" }, { DRA7_UART10_CLKCTRL, dra7_uart10_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0060:24" },
{ DRA7_DCAN1_CLKCTRL, dra7_dcan1_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0068:24" }, { DRA7_DCAN1_CLKCTRL, dra7_dcan1_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0068:24" },
{ DRA7_ADC_CLKCTRL, NULL, CLKF_SW_SUP, "mcan_clk"},
{ 0 }, { 0 },
}; };

View File

@ -15,6 +15,8 @@
/* SmartReflex sysc found on 36xx and later */ /* SmartReflex sysc found on 36xx and later */
#define SYSC_OMAP3_SR_ENAWAKEUP (1 << 26) #define SYSC_OMAP3_SR_ENAWAKEUP (1 << 26)
#define SYSC_DRA7_MCAN_ENAWAKEUP (1 << 4)
/* SYSCONFIG STANDBYMODE/MIDLEMODE/SIDLEMODE supported by hardware */ /* SYSCONFIG STANDBYMODE/MIDLEMODE/SIDLEMODE supported by hardware */
#define SYSC_IDLE_FORCE 0 #define SYSC_IDLE_FORCE 0
#define SYSC_IDLE_NO 1 #define SYSC_IDLE_NO 1

View File

@ -168,5 +168,6 @@
#define DRA7_COUNTER_32K_CLKCTRL DRA7_CLKCTRL_INDEX(0x50) #define DRA7_COUNTER_32K_CLKCTRL DRA7_CLKCTRL_INDEX(0x50)
#define DRA7_UART10_CLKCTRL DRA7_CLKCTRL_INDEX(0x80) #define DRA7_UART10_CLKCTRL DRA7_CLKCTRL_INDEX(0x80)
#define DRA7_DCAN1_CLKCTRL DRA7_CLKCTRL_INDEX(0x88) #define DRA7_DCAN1_CLKCTRL DRA7_CLKCTRL_INDEX(0x88)
#define DRA7_ADC_CLKCTRL DRA7_CLKCTRL_INDEX(0xa0)
#endif #endif

View File

@ -14,6 +14,7 @@ enum ti_sysc_module_type {
TI_SYSC_OMAP4_SR, TI_SYSC_OMAP4_SR,
TI_SYSC_OMAP4_MCASP, TI_SYSC_OMAP4_MCASP,
TI_SYSC_OMAP4_USB_HOST_FS, TI_SYSC_OMAP4_USB_HOST_FS,
TI_SYSC_DRA7_MCAN,
}; };
struct ti_sysc_cookie { struct ti_sysc_cookie {