Commit e6f2f6ac authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'i2c-for-6.2-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:
 "A bunch of driver fixes with a tiny bit of new IDs"

* tag 'i2c-for-6.2-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
  i2c: rk3x: fix a bunch of kernel-doc warnings
  i2c: axxia: use 'struct' for kernel-doc notation
  dt-bindings: i2c: renesas,rzv2m: Fix SoC specific string
  i2c: mxs: suppress probe-deferral error message
  i2c: designware-pci: Add new PCI IDs for AMD NAVI GPU
  i2c: designware: Fix unbalanced suspended flag
  i2c: designware: use casting of u64 in clock multiplication to avoid overflow
parents 37d0be6a 0582d984
...@@ -16,7 +16,7 @@ properties: ...@@ -16,7 +16,7 @@ properties:
compatible: compatible:
items: items:
- enum: - enum:
- renesas,i2c-r9a09g011 # RZ/V2M - renesas,r9a09g011-i2c # RZ/V2M
- const: renesas,rzv2m-i2c - const: renesas,rzv2m-i2c
reg: reg:
...@@ -66,7 +66,7 @@ examples: ...@@ -66,7 +66,7 @@ examples:
#include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/interrupt-controller/arm-gic.h>
i2c0: i2c@a4030000 { i2c0: i2c@a4030000 {
compatible = "renesas,i2c-r9a09g011", "renesas,rzv2m-i2c"; compatible = "renesas,r9a09g011-i2c", "renesas,rzv2m-i2c";
reg = <0xa4030000 0x80>; reg = <0xa4030000 0x80>;
interrupts = <GIC_SPI 232 IRQ_TYPE_EDGE_RISING>, interrupts = <GIC_SPI 232 IRQ_TYPE_EDGE_RISING>,
<GIC_SPI 236 IRQ_TYPE_EDGE_RISING>; <GIC_SPI 236 IRQ_TYPE_EDGE_RISING>;
......
...@@ -118,7 +118,7 @@ ...@@ -118,7 +118,7 @@
#define SDA_HOLD_TIME 0x90 #define SDA_HOLD_TIME 0x90
/** /**
* axxia_i2c_dev - I2C device context * struct axxia_i2c_dev - I2C device context
* @base: pointer to register struct * @base: pointer to register struct
* @msg: pointer to current message * @msg: pointer to current message
* @msg_r: pointer to current read message (sequence transfer) * @msg_r: pointer to current read message (sequence transfer)
......
...@@ -351,7 +351,8 @@ u32 i2c_dw_scl_hcnt(u32 ic_clk, u32 tSYMBOL, u32 tf, int cond, int offset) ...@@ -351,7 +351,8 @@ u32 i2c_dw_scl_hcnt(u32 ic_clk, u32 tSYMBOL, u32 tf, int cond, int offset)
* *
* If your hardware is free from tHD;STA issue, try this one. * If your hardware is free from tHD;STA issue, try this one.
*/ */
return DIV_ROUND_CLOSEST(ic_clk * tSYMBOL, MICRO) - 8 + offset; return DIV_ROUND_CLOSEST_ULL((u64)ic_clk * tSYMBOL, MICRO) -
8 + offset;
else else
/* /*
* Conditional expression: * Conditional expression:
...@@ -367,7 +368,8 @@ u32 i2c_dw_scl_hcnt(u32 ic_clk, u32 tSYMBOL, u32 tf, int cond, int offset) ...@@ -367,7 +368,8 @@ u32 i2c_dw_scl_hcnt(u32 ic_clk, u32 tSYMBOL, u32 tf, int cond, int offset)
* The reason why we need to take into account "tf" here, * The reason why we need to take into account "tf" here,
* is the same as described in i2c_dw_scl_lcnt(). * is the same as described in i2c_dw_scl_lcnt().
*/ */
return DIV_ROUND_CLOSEST(ic_clk * (tSYMBOL + tf), MICRO) - 3 + offset; return DIV_ROUND_CLOSEST_ULL((u64)ic_clk * (tSYMBOL + tf), MICRO) -
3 + offset;
} }
u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset) u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset)
...@@ -383,7 +385,8 @@ u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset) ...@@ -383,7 +385,8 @@ u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset)
* account the fall time of SCL signal (tf). Default tf value * account the fall time of SCL signal (tf). Default tf value
* should be 0.3 us, for safety. * should be 0.3 us, for safety.
*/ */
return DIV_ROUND_CLOSEST(ic_clk * (tLOW + tf), MICRO) - 1 + offset; return DIV_ROUND_CLOSEST_ULL((u64)ic_clk * (tLOW + tf), MICRO) -
1 + offset;
} }
int i2c_dw_set_sda_hold(struct dw_i2c_dev *dev) int i2c_dw_set_sda_hold(struct dw_i2c_dev *dev)
......
...@@ -396,6 +396,8 @@ static const struct pci_device_id i2_designware_pci_ids[] = { ...@@ -396,6 +396,8 @@ static const struct pci_device_id i2_designware_pci_ids[] = {
{ PCI_VDEVICE(ATI, 0x73a4), navi_amd }, { PCI_VDEVICE(ATI, 0x73a4), navi_amd },
{ PCI_VDEVICE(ATI, 0x73e4), navi_amd }, { PCI_VDEVICE(ATI, 0x73e4), navi_amd },
{ PCI_VDEVICE(ATI, 0x73c4), navi_amd }, { PCI_VDEVICE(ATI, 0x73c4), navi_amd },
{ PCI_VDEVICE(ATI, 0x7444), navi_amd },
{ PCI_VDEVICE(ATI, 0x7464), navi_amd },
{ 0,} { 0,}
}; };
MODULE_DEVICE_TABLE(pci, i2_designware_pci_ids); MODULE_DEVICE_TABLE(pci, i2_designware_pci_ids);
......
...@@ -351,13 +351,11 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) ...@@ -351,13 +351,11 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
if (dev->flags & ACCESS_NO_IRQ_SUSPEND) { if (dev->flags & ACCESS_NO_IRQ_SUSPEND) {
dev_pm_set_driver_flags(&pdev->dev, dev_pm_set_driver_flags(&pdev->dev,
DPM_FLAG_SMART_PREPARE | DPM_FLAG_SMART_PREPARE);
DPM_FLAG_MAY_SKIP_RESUME);
} else { } else {
dev_pm_set_driver_flags(&pdev->dev, dev_pm_set_driver_flags(&pdev->dev,
DPM_FLAG_SMART_PREPARE | DPM_FLAG_SMART_PREPARE |
DPM_FLAG_SMART_SUSPEND | DPM_FLAG_SMART_SUSPEND);
DPM_FLAG_MAY_SKIP_RESUME);
} }
device_enable_async_suspend(&pdev->dev); device_enable_async_suspend(&pdev->dev);
...@@ -419,21 +417,8 @@ static int dw_i2c_plat_prepare(struct device *dev) ...@@ -419,21 +417,8 @@ static int dw_i2c_plat_prepare(struct device *dev)
*/ */
return !has_acpi_companion(dev); return !has_acpi_companion(dev);
} }
static void dw_i2c_plat_complete(struct device *dev)
{
/*
* The device can only be in runtime suspend at this point if it has not
* been resumed throughout the ending system suspend/resume cycle, so if
* the platform firmware might mess up with it, request the runtime PM
* framework to resume it.
*/
if (pm_runtime_suspended(dev) && pm_resume_via_firmware())
pm_request_resume(dev);
}
#else #else
#define dw_i2c_plat_prepare NULL #define dw_i2c_plat_prepare NULL
#define dw_i2c_plat_complete NULL
#endif #endif
#ifdef CONFIG_PM #ifdef CONFIG_PM
...@@ -483,7 +468,6 @@ static int __maybe_unused dw_i2c_plat_resume(struct device *dev) ...@@ -483,7 +468,6 @@ static int __maybe_unused dw_i2c_plat_resume(struct device *dev)
static const struct dev_pm_ops dw_i2c_dev_pm_ops = { static const struct dev_pm_ops dw_i2c_dev_pm_ops = {
.prepare = dw_i2c_plat_prepare, .prepare = dw_i2c_plat_prepare,
.complete = dw_i2c_plat_complete,
SET_LATE_SYSTEM_SLEEP_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume) SET_LATE_SYSTEM_SLEEP_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume)
SET_RUNTIME_PM_OPS(dw_i2c_plat_runtime_suspend, dw_i2c_plat_runtime_resume, NULL) SET_RUNTIME_PM_OPS(dw_i2c_plat_runtime_suspend, dw_i2c_plat_runtime_resume, NULL)
}; };
......
...@@ -826,8 +826,8 @@ static int mxs_i2c_probe(struct platform_device *pdev) ...@@ -826,8 +826,8 @@ static int mxs_i2c_probe(struct platform_device *pdev)
/* Setup the DMA */ /* Setup the DMA */
i2c->dmach = dma_request_chan(dev, "rx-tx"); i2c->dmach = dma_request_chan(dev, "rx-tx");
if (IS_ERR(i2c->dmach)) { if (IS_ERR(i2c->dmach)) {
dev_err(dev, "Failed to request dma\n"); return dev_err_probe(dev, PTR_ERR(i2c->dmach),
return PTR_ERR(i2c->dmach); "Failed to request dma\n");
} }
platform_set_drvdata(pdev, i2c); platform_set_drvdata(pdev, i2c);
......
...@@ -80,7 +80,7 @@ enum { ...@@ -80,7 +80,7 @@ enum {
#define DEFAULT_SCL_RATE (100 * 1000) /* Hz */ #define DEFAULT_SCL_RATE (100 * 1000) /* Hz */
/** /**
* struct i2c_spec_values: * struct i2c_spec_values - I2C specification values for various modes
* @min_hold_start_ns: min hold time (repeated) START condition * @min_hold_start_ns: min hold time (repeated) START condition
* @min_low_ns: min LOW period of the SCL clock * @min_low_ns: min LOW period of the SCL clock
* @min_high_ns: min HIGH period of the SCL cloc * @min_high_ns: min HIGH period of the SCL cloc
...@@ -136,7 +136,7 @@ static const struct i2c_spec_values fast_mode_plus_spec = { ...@@ -136,7 +136,7 @@ static const struct i2c_spec_values fast_mode_plus_spec = {
}; };
/** /**
* struct rk3x_i2c_calced_timings: * struct rk3x_i2c_calced_timings - calculated V1 timings
* @div_low: Divider output for low * @div_low: Divider output for low
* @div_high: Divider output for high * @div_high: Divider output for high
* @tuning: Used to adjust setup/hold data time, * @tuning: Used to adjust setup/hold data time,
...@@ -159,7 +159,7 @@ enum rk3x_i2c_state { ...@@ -159,7 +159,7 @@ enum rk3x_i2c_state {
}; };
/** /**
* struct rk3x_i2c_soc_data: * struct rk3x_i2c_soc_data - SOC-specific data
* @grf_offset: offset inside the grf regmap for setting the i2c type * @grf_offset: offset inside the grf regmap for setting the i2c type
* @calc_timings: Callback function for i2c timing information calculated * @calc_timings: Callback function for i2c timing information calculated
*/ */
...@@ -239,7 +239,8 @@ static inline void rk3x_i2c_clean_ipd(struct rk3x_i2c *i2c) ...@@ -239,7 +239,8 @@ static inline void rk3x_i2c_clean_ipd(struct rk3x_i2c *i2c)
} }
/** /**
* Generate a START condition, which triggers a REG_INT_START interrupt. * rk3x_i2c_start - Generate a START condition, which triggers a REG_INT_START interrupt.
* @i2c: target controller data
*/ */
static void rk3x_i2c_start(struct rk3x_i2c *i2c) static void rk3x_i2c_start(struct rk3x_i2c *i2c)
{ {
...@@ -258,8 +259,8 @@ static void rk3x_i2c_start(struct rk3x_i2c *i2c) ...@@ -258,8 +259,8 @@ static void rk3x_i2c_start(struct rk3x_i2c *i2c)
} }
/** /**
* Generate a STOP condition, which triggers a REG_INT_STOP interrupt. * rk3x_i2c_stop - Generate a STOP condition, which triggers a REG_INT_STOP interrupt.
* * @i2c: target controller data
* @error: Error code to return in rk3x_i2c_xfer * @error: Error code to return in rk3x_i2c_xfer
*/ */
static void rk3x_i2c_stop(struct rk3x_i2c *i2c, int error) static void rk3x_i2c_stop(struct rk3x_i2c *i2c, int error)
...@@ -298,7 +299,8 @@ static void rk3x_i2c_stop(struct rk3x_i2c *i2c, int error) ...@@ -298,7 +299,8 @@ static void rk3x_i2c_stop(struct rk3x_i2c *i2c, int error)
} }
/** /**
* Setup a read according to i2c->msg * rk3x_i2c_prepare_read - Setup a read according to i2c->msg
* @i2c: target controller data
*/ */
static void rk3x_i2c_prepare_read(struct rk3x_i2c *i2c) static void rk3x_i2c_prepare_read(struct rk3x_i2c *i2c)
{ {
...@@ -329,7 +331,8 @@ static void rk3x_i2c_prepare_read(struct rk3x_i2c *i2c) ...@@ -329,7 +331,8 @@ static void rk3x_i2c_prepare_read(struct rk3x_i2c *i2c)
} }
/** /**
* Fill the transmit buffer with data from i2c->msg * rk3x_i2c_fill_transmit_buf - Fill the transmit buffer with data from i2c->msg
* @i2c: target controller data
*/ */
static void rk3x_i2c_fill_transmit_buf(struct rk3x_i2c *i2c) static void rk3x_i2c_fill_transmit_buf(struct rk3x_i2c *i2c)
{ {
...@@ -532,11 +535,10 @@ static irqreturn_t rk3x_i2c_irq(int irqno, void *dev_id) ...@@ -532,11 +535,10 @@ static irqreturn_t rk3x_i2c_irq(int irqno, void *dev_id)
} }
/** /**
* Get timing values of I2C specification * rk3x_i2c_get_spec - Get timing values of I2C specification
*
* @speed: Desired SCL frequency * @speed: Desired SCL frequency
* *
* Returns: Matched i2c spec values. * Return: Matched i2c_spec_values.
*/ */
static const struct i2c_spec_values *rk3x_i2c_get_spec(unsigned int speed) static const struct i2c_spec_values *rk3x_i2c_get_spec(unsigned int speed)
{ {
...@@ -549,13 +551,12 @@ static const struct i2c_spec_values *rk3x_i2c_get_spec(unsigned int speed) ...@@ -549,13 +551,12 @@ static const struct i2c_spec_values *rk3x_i2c_get_spec(unsigned int speed)
} }
/** /**
* Calculate divider values for desired SCL frequency * rk3x_i2c_v0_calc_timings - Calculate divider values for desired SCL frequency
*
* @clk_rate: I2C input clock rate * @clk_rate: I2C input clock rate
* @t: Known I2C timing information * @t: Known I2C timing information
* @t_calc: Caculated rk3x private timings that would be written into regs * @t_calc: Caculated rk3x private timings that would be written into regs
* *
* Returns: 0 on success, -EINVAL if the goal SCL rate is too slow. In that case * Return: %0 on success, -%EINVAL if the goal SCL rate is too slow. In that case
* a best-effort divider value is returned in divs. If the target rate is * a best-effort divider value is returned in divs. If the target rate is
* too high, we silently use the highest possible rate. * too high, we silently use the highest possible rate.
*/ */
...@@ -710,13 +711,12 @@ static int rk3x_i2c_v0_calc_timings(unsigned long clk_rate, ...@@ -710,13 +711,12 @@ static int rk3x_i2c_v0_calc_timings(unsigned long clk_rate,
} }
/** /**
* Calculate timing values for desired SCL frequency * rk3x_i2c_v1_calc_timings - Calculate timing values for desired SCL frequency
*
* @clk_rate: I2C input clock rate * @clk_rate: I2C input clock rate
* @t: Known I2C timing information * @t: Known I2C timing information
* @t_calc: Caculated rk3x private timings that would be written into regs * @t_calc: Caculated rk3x private timings that would be written into regs
* *
* Returns: 0 on success, -EINVAL if the goal SCL rate is too slow. In that case * Return: %0 on success, -%EINVAL if the goal SCL rate is too slow. In that case
* a best-effort divider value is returned in divs. If the target rate is * a best-effort divider value is returned in divs. If the target rate is
* too high, we silently use the highest possible rate. * too high, we silently use the highest possible rate.
* The following formulas are v1's method to calculate timings. * The following formulas are v1's method to calculate timings.
...@@ -960,14 +960,14 @@ static int rk3x_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long ...@@ -960,14 +960,14 @@ static int rk3x_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long
} }
/** /**
* Setup I2C registers for an I2C operation specified by msgs, num. * rk3x_i2c_setup - Setup I2C registers for an I2C operation specified by msgs, num.
* * @i2c: target controller data
* Must be called with i2c->lock held.
*
* @msgs: I2C msgs to process * @msgs: I2C msgs to process
* @num: Number of msgs * @num: Number of msgs
* *
* returns: Number of I2C msgs processed or negative in case of error * Must be called with i2c->lock held.
*
* Return: Number of I2C msgs processed or negative in case of error
*/ */
static int rk3x_i2c_setup(struct rk3x_i2c *i2c, struct i2c_msg *msgs, int num) static int rk3x_i2c_setup(struct rk3x_i2c *i2c, struct i2c_msg *msgs, int num)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment